Design System · documentação de método

Como eu estruturo um Design System.

Uma documentação real do meu método, construída do zero: tokens com tema, componentes documentados com código e o handoff para engenharia. Sem nenhum dado de cliente, é o processo, não o projeto. Troque o tema no menu: só a camada semântica dos tokens muda, os componentes não sabem que existe dark mode.

Tokens, docs e handoff acelerados com Claude Code + agentes

Princípios · o que guia cada decisão.

Antes de tokens e componentes, as regras que não se negociam. Elas resolvem discussão de gosto e mantêm o sistema coerente quando muita gente contribui.

01

Acessível por padrão

Contraste, foco e área de toque nascem no componente. Ninguém precisa "lembrar" de ser acessível.
02

Consistência > criatividade individual

O sistema serve ao produto, não ao ego. Divergir tem que ter motivo, não estilo.
03

Token antes de valor

Nada de cor ou espaçamento hardcoded. Se não é token, não escala nem vira tema.
04

Adoção é a métrica

Um DS existe para ser usado. Se não é adotado, é custo. Governança serve à adoção.

Arquitetura & stack · como o sistema é montado.

Um DS maduro tem metodologia e stack, não é um arquivo de Figma solto. Método claro pra escalar, e a ferramenta certa em cada camada, do visual ao código.

Metodologia · Atomic Design

ÁtomoButton · Input · Badgemenor bloco funcional
MoléculaFormField · Cardátomos combinados
OrganismoHeader · Formseções completas
TemplateLayout de páginaestrutura, sem conteúdo

Pipeline de tokens · do Figma ao código

Figma Variablesfonte visual
Tokens Studioexporta JSON
tokens.jsonsingle source
Style Dictionarybuild
CSS · iOS · Androidplataformas

Uma mudança no Figma propaga pro CSS, iOS e Android sem retrabalho manual. É o que dá consistência multiplataforma de verdade.

Stack por camada

Design & componente
Figma · Auto Layout · Variables · Component Properties · Variants · biblioteca publicada
Tokens & código
Tokens Studio · Style Dictionary · CSS (Grid, Flexbox, Custom Properties) · Web Components / React
Doc & governança
Storybook · Zeroheight · Git / GitHub · plugins de contraste WCAG

Cor · tokens em 3 camadas.

O valor bruto nunca toca a tela. Ele passa pelo semântico, que é o que troca no dark mode. O componente só enxerga a camada de componente. É essa cadeia que dá theming e escala sem redesenhar nada.

1Primitivovalor bruto, sem significado, nunca muda
iris-500
#6B5BFF
iris-400
#8B7CFF
gray-900
#161616
ink-950
#0E0E10
red-500
#E5484D
gray-050
#FAFAFA
↓ referencia ↓
2Semânticoo significado · é o que troca por tema
action-primary
→ iris
text-default
→ ink/gray
surface-page
→ fundo
action-danger
→ red-500
border-default
→ linha
text-muted
→ apoio
↓ referencia ↓
3Componenteo que o botão realmente usa
button-primary-bg
→ action-primary
button-primary-hover
→ action-primary-hover
button-primary-label
→ on-action

Tipografia · uma escala, não fontes soltas.

Geist para interface, escala definida por token. Cada estilo tem um propósito. Hierarquia é decisão, não acaso.

display · 40/1.04Clareza em escala
heading · 28/600Componente de produto
body · 15/1.6O texto que carrega a maior parte da interface e da leitura.
label · 14/600Rótulo de ação
caption · 12/monotoken · anotação técnica

Espaçamento & raio · ritmo previsível.

Base 4px. Todo padding, gap e margem sai dessa escala, nunca de um número mágico. Raio idem. É o que faz telas de squads diferentes parecerem o mesmo produto.

Espaçamento (px)

2xs · 4
xs · 8
sm · 12
md · 16
lg · 24
xl · 32
2xl · 48

Raio (px)

sm · 6
md · 8
lg · 10
xl · 12

Button · documentado com código.

Um componente, um propósito. Variantes cobrem intenção; estados cobrem interação; tamanhos cobrem contexto. Tudo apontando pros tokens.

Variantes

<!-- intenção define a variante -->
<button class="btn btn-primary">Confirmar</button>
<button class="btn btn-secondary">Cancelar</button>
<button class="btn btn-ghost">Saiba mais</button>
<button class="btn btn-danger">Excluir</button>

Estados · primary

default
hover
active
focus
loading
disabled

Tamanhos

Anatomia

  • 1 Container · altura por tamanho (34/44/52), raio-lg, padding-sp4
  • 2 Label · Geist 14/600, token button-primary-label
  • 3 Ícone opcional · gap-sp2, alinhado ao texto
  • 4 Foco · anel 3px, token focus-ring, nunca removido

Acessibilidade

Contraste≥ 4.5:1 label/fundo (AA), validado nos dois temas
Focoanel visível em :focus-visible, nunca suprimido
Toque≥ 44×44px no mobile, mesmo no sm
Só íconearia-label obrigatório
Disabledaria-disabled, não some da leitura
Do
  • Um primário por bloco de decisão.
  • Label com verbo + objeto: "Confirmar pagamento".
  • Loading em ação assíncrona, evita duplo clique.
Don't
  • Dois primários competindo.
  • Label vago: "Clique aqui", "OK".
  • Remover o anel de foco por estética.

Input · o mesmo rigor, outro componente.

Prova de que o sistema escala: mesmos tokens de cor, foco, raio e espaçamento, aplicados a um segundo componente. Consistência não é sorte, é a mesma fonte.

E-mail inválido.
<div class="field">
  <label>E-mail</label>
  <input class="inp" placeholder="seu@email.com">
  <!-- .err adiciona borda + hint de erro -->
</div>

Card · onde os átomos viram sistema.

Button e Input são átomos. O Card os combina em algo maior, sem nenhum valor novo: reusa os mesmos tokens de surface, borda, espaçamento e os componentes Badge e Button. É isso que separa uma biblioteca de peças de um sistema de verdade.

Transferência● Concluída
R$ 1.240,00
para Ana Souza · hoje, 14:32
Pagamento● Agendado
R$ 320,00
boleto · vence em 3 dias
<!-- só composição: nenhum token ou cor novo -->
<div class="ds-card">
  <div class="top">
    <span class="title">Transferência</span>
    <span class="badge badge-success">Concluída</span>
  </div>
  <div class="amount">R$ 1.240,00</div>
  <div class="foot">
    <button class="btn btn-primary btn-sm">Repetir</button>
    <button class="btn btn-ghost btn-sm">Ver detalhes</button>
  </div>
</div>

Reusa: surface-raised, border-default, escala de espaçamento, Badge e Button. Troque o tema no menu: o Card acompanha, porque nada nele é fixo.

Governança & operação · o que mantém o sistema vivo.

Componente bonito qualquer um faz. DS maduro é o processo: quem decide, como um componente entra, como versiona e como se mede adoção. É aqui que ele deixa de ser biblioteca e vira sistema.

Modelo · híbrido

Core team cura, mantém a coerência e é dono dos tokens e dos padrões base.
Squads contribuem com componentes novos, por um processo claro, sem recriar o que já existe.
Por quê híbrido: o centralizado vira gargalo, o federado vira bagunça. O híbrido escala sem perder consistência.

Intake · o filtro que vem antes de tudo

Pergunta única: vai ser usado por mais de 1 time ou tela?
Não → é feature local, fica com a squad, fora do DS. O sistema não incha com o que não se repete.
Sim → entra no backlog do DS: rascunho, review, produção e release versionado.

Como um componente entra · contribuição

Proposta Review do core Critérios Aprovação Documentação Publicação

Critérios de entrada: é reutilizável? já existe algo parecido? atende acessibilidade? Sem esse filtro, o DS vira cemitério de componentes.

Versionamento

Semvermajor.minor.patch. Major é breaking change.
Deprecationmarca antes de remover, com caminho de migração. Nunca some do nada.
Changelogo que mudou a cada versão, pro time atualizar com segurança.

Adoção · a métrica que importa

Coverage% do produto usando o DS vs. elementos soltos.
Detach ratequanto foi descolado do componente. Detach alto = evoluir o componente.

DS sem adoção é custo, não ativo. É onde eu mais agrego: fazer o sistema ser usado.

Changelog · exemplo

  • v2.1.0addedComponente Card com variantes de status (concluída, agendada).
  • v2.0.0changedButton migrado para tokens semânticos e dark mode. Breaking.
  • v1.4.0deprecatedbutton-legacy · migrar para button-primary até a v3.
  • v1.3.2addedEstado de loading no Button, bloqueando re-clique.

Handoff · do token à variável de código.

Single source of truth: o token do Figma é o mesmo que chega no código, sem tradução manual. E um checklist do que entra, pro dev implementar sem adivinhar.

tokens.json · fonte
// gerado e auditado por agente
{
  "button-primary-bg": "{action.primary}",
  "button-primary-hover": "{action.primary.hover}",
  "button-radius": "10px",
  "button-height-md": "44px"
}
saída · variáveis CSS
/* build automático · code parity */
:root {
  --button-primary-bg: #6B5BFF;
  --button-primary-hover: #574AE0;
  --button-radius: 10px;
  --button-height-md: 44px;
}

Checklist de handoff · Button

  • 4 variantes: primary, secondary, ghost, danger
  • 6 estados: default, hover, active, focus, loading, disabled
  • 3 tamanhos com altura fixa (34/44/52)
  • Tokens mapeados para variáveis CSS
  • Raio, padding e gap por token
  • Loading bloqueia re-clique
  • Contraste AA nos dois temas
  • Foco visível obrigatório
  • Toque 44px mínimo no mobile
  • Fora do escopo: ícone animado, botão full-width (pattern à parte)

Estrutura do repositório

src/ ├─ tokens/ │ ├─ primitives.json │ └─ semantic.json └─ components/ ├─ atoms/ Button · Input · Badge ├─ molecules/ FormField · Card └─ organisms/ Header · Form

Cada componente carrega seu .html, .css e .stories.js (Storybook), versionado no Git. O designer entende o repositório; o dev entende o design. Sem tradução perdida no meio.

O diferencial

IA · não é acabamento, é o que muda a escala.

Design System sempre foi caro em tempo: auditar tokens, documentar componente a componente, checar acessibilidade tela a tela. A IA não faz "o mesmo, mais rápido". Ela faz o que antes não cabia no orçamento de tempo do time. É aqui que eu opero diferente da maioria.

Etapa do DSComo era, na mãoCom IA e agentes · o que muda
Tokensauditar e versionar centenas de tokens à mão, horas de trabalho repetitivoagente gera, audita e versiona o JSON. Minutos, sem inconsistência.
Documentaçãoescrever anatomia, do/don't e props de cada componente, diasskill gera e mantém a doc no padrão. A doc para de ficar desatualizada.
Acessibilidadechecar contraste e foco tela a tela, sempre por amostraagente varre o sistema inteiro contra WCAG. Cobertura total, não amostra.
Códigotraduzir token em variável na mão, com divergência entre design e devbuild automático (Style Dictionary) + IA. Code parity garantido.
Governançarevisar cada contribuição manualmenteagente pré-valida contra os critérios antes do humano. Core team foca no que importa.
O que mexe o ponteiro

Design Ops assistido por IA.

Setup e manutenção de um DS deixam de exigir um time grande. Um designer operando com IA entrega a operação de Design System que antes precisava de vários. Resultado pro negócio: mais consistência, cobertura de acessibilidade total e o time de produto escalando sem o DS virar gargalo. Conecto o Figma ao contexto via MCP, encapsulo cada rotina numa skill reutilizável e opero tudo com Claude Code e agentes. IA como multiplicador da operação, não como enfeite de rodapé.

Por que documentei isto · o processo, não a promessa.

Não é um projeto de cliente, é o método que eu uso no dia a dia, do token ao handoff. Mostro o processo aberto porque é assim que eu estruturo um Design System em qualquer time. Prefiro mostrar o processo a prometer o resultado.