CommunityImagemgithub.com

svg-design: Satori + SVGO

Pipeline de ativos SVG — Satori (HTML/JSX + CSS → SVG, depois PNG via resvg ou sharp) para cartões de título, miniaturas, imagens OG, stills; e SVGO v4 (otimizar/minificar SVGs, CLI + config) sem quebrar SVGs que serão animados. Use ao gerar imagens a partir de marcação, criar miniaturas/stills de vídeo ou limpar SVGs antes de animá-los com GSAP / Anime.js / Remotion.

O que é svg-design: Satori + SVGO?

Este skill fornece um pipeline completo de geração e otimização de SVG para desenvolvedores que precisam criar imagens dinâmicas a partir de marcação ou preparar SVGs para animação. A primeira parte, Satori, converte HTML/JSX + CSS inline em SVG, sendo ideal para gerar cartões de título, miniaturas de vídeo e imagens Open Graph em lote. Ele suporta layouts Flexbox e Grid (CSS subset), requer fontes explícitas para texto (incluindo suporte a vietnamita) e oferece saída PNG opcional via resvg ou sharp. A segunda parte, SVGO v4, otimiza e minifica SVGs via CLI ou API Node.js, com configurações cuidadosas para preservar IDs, grupos e caminhos necessários para animações futuras (GSAP, Anime.js, Remotion). O skill é compatível com qualquer plataforma que execute JavaScript (Node.js, navegadores) e útil tanto para geração de assets estáticos quanto para pipelines de animação. Dicas práticas incluem como evitar que a otimização remova seletores usados por código de animação e como configurar plugins específicos para cenários de múltiplos SVGs inline.

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

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

SVG design: Satori + SVGO

Verificado em 2026-10: satori 0.63, @resvg/resvg-js 2.6, svgo 4.1.

Satori — marcação → 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)
  • Sem JSX/React, passe objetos simples: { type: 'div', props: { style: {...}, children: '...' } }.
  • Fontes são obrigatórias sempre que houver texto; vietnamita precisa de uma fonte que tenha os glifos (Inter, Be Vietnam Pro, Noto Sans).
  • Layout: Flexbox, Grid (sem subgrid/masonry) e block. É um subconjunto de CSS — sem JS, sem animações, sem folhas de estilo externas; estilo inline.
  • Imagens: <img src> com URL absoluta ou data URI, mais width/height explícitos.
  • Texto vira <path> por padrão (portátil, não selecionável); embedFont: false mantém <text>.
  • Emoji: graphemeImages ou loadAdditionalAsset para fornecer imagens/fontes para segmentos ausentes.
  • Alternativa PNG: sharp(Buffer.from(svg)).png().

SVGO v4 — otimizar

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: {
      // mantenha estes quando o SVG for animado ou estilizado por id/class:
      cleanupIds: false,          // renomearia/removeria ids que seu código alvo
      collapseGroups: false,      // achataria <g> que você anima como uma unidade
      mergePaths: false,          // mesclaria caminhos que você anima separadamente
      convertShapeToPath: false,  // transformaria <circle>/<rect> em <path> (sem mais r, cx, width)
    } } },
    'prefixIds',                  // ids únicos quando vários SVGs são inline em uma página
  ],
}
  • Mudanças v4: removeViewBox e removeTitle não estão mais no preset-default (adicione-os pelo nome se quiser; mantenha o viewBox para redimensionamento). removeScriptElement → removeScripts. Apenas exports nomeados: import { optimize } from 'svgo'; build para navegador é svgo/browser.
  • API Node: const { data } = optimize(svgString, { multipass: true, plugins: [...] }).
  • Para ícones estáticos, preset-default simples é suficiente; as substituições acima só importam para SVGs animados ou com script.
  • Após otimizar um SVG para animação, verifique se cada seletor que o código de animação usa ainda existe na saída.

Individual skills in this repo

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

Habilidades Relacionadas