CommunityImagegithub.com

phido0410/svg-design

Pipeline SVG – Satori (HTML/JSX + CSS → SVG, puis PNG via resvg ou sharp) pour cartes titres, miniatures, images OG, arrêts sur image ; et SVGO v4 (optimiser/minifier les SVG, CLI + config) sans casser les SVG qui seront animés. À utiliser lors de la génération d'images à partir de balisage, de la création de miniatures/arrêts sur image de vidéos, ou du nettoyage de SVG avant de les animer avec GSAP / Anime.js / Remotion.

Qu'est-ce que svg-design ?

Cette compétence définit un pipeline complet pour la conception et l'optimisation de SVG à destination des agents IA et des développeurs, couvrant deux outils majeurs : Satori et SVGO. Satori convertit du HTML/JSX (avec CSS inline) en SVG, puis en PNG via `resvg-js` ou sharp, ce qui est idéal pour générer des cartes titres, des miniatures YouTube, des images Open Graph ou tout visuel statique à partir de code. La compétence détaille la configuration des polices, les contraintes de layout en Flexbox/Grid et les alternatives sans JSX, ainsi que l'ajout d'emoji. Le second volet présente SVGO v4, l'optimiseur de SVG, avec des conseils précis pour ne pas briser les animations ultérieures (GSAP, Anime.js, Remotion) en désactivant certains plugins par défaut (cleanupIds, collapseGroups, mergePaths, convertShapeToPath). Le SKILL.md fournit des exemples concrets en CLI et en Node.js, ainsi que les différences de configuration entre SVGO v3 et v4. L'ensemble est compatible avec Claude Code, Cursor, Codex et d'autres agents similaires, et fonctionne sur tout système supportant Node.js.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/phido0410/claude-video-skills/tree/HEAD/skills/svg-design

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Conception SVG : Satori + SVGO

Vérifié 2026-10 : satori 0.63, @resvg/resvg-js 2.6, svgo 4.1.

Satori — balisage → SVG

npm i satori @resvg/resvg-js
import satori from 'satori'
import { Resvg } from '@resvg/resvg-js'
import { readFile, writeFile } from 'node:fs/promises'

const font = await readFile('./Inter-Bold.ttf')            // TTF, OTF, WOFF ou WOFF2
const svg = await satori(
  <div style={{ display: 'flex', width: '100%', height: '100%', alignItems: 'center',
                justifyContent: 'center', background: '#0b1020', color: 'white', fontSize: 96 }}>
    Đủ 20/20
  </div>,
  { width: 1920, height: 1080, fonts: [{ name: 'Inter', data: font, weight: 700, style: 'normal' }] },
)
const png = new Resvg(svg, { fitTo: { mode: 'width', value: 1920 } }).render().asPng()
await writeFile('title.png', png)
  • Sans JSX/React, passez des objets simples : { type: 'div', props: { style: {...}, children: '...' } }.
  • Les polices sont obligatoires dès qu'il y a du texte ; le vietnamien nécessite une police possédant les glyphes (Inter, Be Vietnam Pro, Noto Sans).
  • Disposition : Flexbox, Grid (pas de subgrid/masonry) et block. C'est un sous-ensemble CSS — pas de JS, pas d'animations, pas de feuilles de style externes, tout en ligne.
  • Images : <img src> avec une URL absolue ou une data URI, plus width/height explicites.
  • Le texte devient <path> par défaut (portable, non sélectionnable) ; embedFont: false conserve <text>.
  • Emoji : graphemeImages ou loadAdditionalAsset pour fournir des images/polices pour les segments manquants.
  • Alternative PNG : sharp(Buffer.from(svg)).png().

SVGO v4 — optimiser

npx svgo in.svg -o out.svg
npx svgo -f ./icons -o ./icons-min
// svgo.config.mjs
export default {
  multipass: true,
  plugins: [
    { name: 'preset-default', params: { overrides: {
      // conserver ces éléments lorsque le SVG sera animé ou stylé par id/class :
      cleanupIds: false,          // renommerait/supprimerait les ids ciblés par votre code
      collapseGroups: false,      // aplatirait le <g> que vous animez comme unité
      mergePaths: false,          // fusionnerait les chemins que vous animez séparément
      convertShapeToPath: false,  // transformerait <circle>/<rect> en <path> (plus de r, cx, width)
    } } },
    'prefixIds',                  // ids uniques lorsque plusieurs SVG sont intégrés dans une même page
  ],
}
  • Changements v4 : removeViewBox et removeTitle ne sont plus dans preset-default (ajoutez-les par leur nom si souhaité ; conservez le viewBox pour le redimensionnement). removeScriptElement → removeScripts. Exports nommés uniquement : import { optimize } from 'svgo' ; la version navigateur est svgo/browser.
  • API Node : const { data } = optimize(svgString, { multipass: true, plugins: [...] }).
  • Pour des icônes statiques, le simple preset-default suffit ; les surcharges ci-dessus ne sont utiles que pour les SVG animés ou scripés.
  • Après avoir optimisé un SVG pour l'animation, vérifiez que chaque sélecteur utilisé par le code d'animation existe toujours dans la sortie.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Skills associés