Frontends com Vibecoding · Capítulo 5 de 33 · 51 min
Construir a identidade com tokens, CSS moderno e DESIGN.md
Cor, tipografia e espaçamento viram tokens em formato aberto, com o contraste medido nos dois temas e um DESIGN.md que o agente lê antes de desenhar qualquer tela.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding.
Um azul reescrito em dez telas por engano custa um dia de revisão. Token de design (o valor de estilo guardado com nome, como a etiqueta na lata de tinta) corrige a cor com uma edição só. Quem aprova ou constrói o site da empresa ganha cor, espaço e tipografia num arquivo aberto, lido por Figma e por código.
Comece por três famílias, nesta ordem: cor, espaçamento e tipografia. Cor concentra a maior parte da inconsistência visível; espaçamento numa escala de quatro pixels resolve o desalinhamento; três tamanhos de fonte resolvem a hierarquia entre título e corpo.
Gere a cor em OKLCH, a forma de descrever cor por luminosidade, croma e matiz, como brilho, saturação e tom de uma TV. Mexer só na luminosidade muda o brilho de forma previsível. A escala de 50 a 950 nasce com contraste linear em toda a faixa, e o 500 de qualquer matiz tem o mesmo peso visual.
O uso é seguro em base ampla. As funções modernas de cor, oklch(), color() e color-mix() entre elas, estão em Baseline Widely Available desde 9 de novembro de 2025. O rótulo significa mais de 30 meses de estabilidade nos navegadores que o critério cobre.
Dessa escala derivam os estados sem hexadecimal novo. color-mix(in oklch, var(--marca) 88%, white) calcula o tom de passar o mouse com um valor só. Oito matizes com quatro estados passam de 32 valores para oito e uma função.
O light-dark() devolve um valor no tema claro e outro no escuro, desde que color-scheme esteja declarado. Ele ainda não chegou a todo navegador em uso. Por isso escreva a cor de reserva na declaração anterior, que o navegador sem a função aproveita.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Contraste é requisito medido: o piso é 4,5:1 no texto normal e 3:1 no texto grande, nos dois temas. Cor gerada por cálculo pode cair abaixo do piso num tom que ninguém escolheu, e a medição no painel do navegador leva um minuto.
Peça os tokens na primeira sessão do projeto, antes da primeira tela. Sem eles, cada tela que o agente (a ferramenta de IA que escreve o código) gera inventa um azul próprio. A inconsistência chega em lote, em vez de chegar aos poucos.
Tokens merecem um formato que sobreviva à troca de ferramenta. O DTCG é um arquivo neutro, como a receita que qualquer cozinha lê, e Figma, Penpot, Tokens Studio, Style Dictionary e Terrazzo leem e escrevem o formato.
Ele é mantido por um Community Group do W3C e não tem status de Recommendation. A diferença muda a decisão de quem escolhe arquitetura pelo texto: cite o rascunho de editor com a data da leitura, porque ele ainda pode mudar. Cada token guarda $value e $type obrigatórios, aceita $description e cita outro token entre chaves, como {cor.marca.primaria}.
Tailwind, a coleção de classes prontas que você escreve direto no elemento, como etiquetas coladas na peça, lê esses tokens no código. Da versão 4.0 em diante, a cor e a medida vivem num bloco @theme dentro do próprio CSS, e a paleta padrão passou a ser OKLCH. Um botão então vira bg-marca text-white.
Use em projeto React, Astro ou Vue. Deixe fora de e-mail HTML e de relatório de arquivo único, sem passo de build.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A armadilha que mais derruba tela gerada por agente é a classe montada em tempo de execução, como bg-$cor-500. O compilador do Tailwind varre o texto do código procurando classes escritas por inteiro. A concatenada nunca aparece escrita, some no build e o botão chega sem cor em produção. A saída é um mapa de classes completas, escolhido por chave.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
As ferramentas de design de 2026 leem esse arquivo. O Figma, na Config 2026, ganhou AI Agent, o Make, o Sites com CMS e uma camada de código. O v0 da Vercel integrou Git, com editor completo e preço por token. O Penpot, open source, ganhou servidor MCP (o protocolo que deixa o agente ler o desenho) em julho.
A escolha segue o time: Figma quando o design já vive nele, v0 quando o protótipo nasce em código, Penpot quando o desenho precisa ficar em servidor seu.
Tipografia carrega a personalidade da página, e o agente entrega a mesma família de sempre quando você não escolhe. Use uma família, ou duas claramente distintas entre título e corpo. Defina uma escala de tamanhos com peso e espaçamento intencionais. Mantenha a linha abaixo de 80 caracteres, com entrelinha um pouco maior quando a fonte tem serifa.
Três tiques denunciam página gerada, e a skill frontend-design manda evitar os três. Uma palavra do título em cor ou itálico, rótulo em caixa alta e um rótulo desnecessário acima do conteúdo. Cada um aparece por padrão em tela gerada sem instrução, e sai com uma linha no pedido.
Fonte variável é o piso: um arquivo produz todos os pesos e substitui de seis a 12 arquivos estáticos, com suporte em todo navegador. Inter, Geist, Roboto Flex, Source Serif e Fraunces são as referências.
Sirva a fonte do próprio site com o Fontsource e com subsetting, só os caracteres que o site usa, nunca por chamada ao Google Fonts. A sentença de Munique tratou o IP enviado ao Google como dado pessoal, e o endereço do visitante sai para outra empresa sem ele saber.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Três refinos fecham o token de tipografia. A escala fluida por clamp() faz o texto crescer junto com a tela, sem regra extra. E font-variant-numeric: tabular-nums dá a mesma largura a todos os dígitos, então a tabela de preços para de dançar a cada atualização.
O terceiro pede cuidado com o estado de suporte. O text-wrap: balance está em Baseline Newly Available e serve a título e trecho curto, com o Chromium balanceando até seis linhas e o Firefox até dez. O pretty do corpo segue em Limited Availability, sem o Firefox, então ele entra como melhoria progressiva: o texto precisa ficar legível sem ele.
Um tom escolhido de cabeça vira três tons diferentes em três telas. O ateliê de cerâmica tinha uma terracota no catálogo, outra no carrinho e uma terceira no e-mail. Ele passou a guardar a cor num token em OKLCH, dentro do arquivo DTCG. Agora o ajuste feito no Figma vale também para o CSS regerado, sem ninguém reescrever hex.
Antes de aprovar a tela, exija tokens em OKLCH no bloco @theme, um mapa de classes completas em vez de concatenação e a fonte servida pelo Fontsource. Meça o contraste nos dois temas: abaixo de 4,5:1, ajuste a luminosidade antes de seguir.
Recuse uma biblioteca quando o navegador já resolve
Com os tokens guardados em formato aberto, a pergunta seguinte é quanto do CSS nativo já entrega sozinho o que antes pedia uma biblioteca inteira.
Uma biblioteca a mais custa peso no pacote e mais uma dependência para manter. O CSS, a linguagem que dá aparência à página, já ordena estilos, fecha regras numa região e faz o cartão reagir ao conteúdo sozinho.
Quem revisa o que o agente (a ferramenta de IA que escreve o código) entrega ganha o mapa do consolidado e um laboratório com cinco recursos rodando.
Dois estados separam a lista. Consolidado roda em Chrome, Firefox e Safari atuais e admite um plano B trivial. Em chegada falta em pelo menos um navegador. Esse recurso entra atrás de @supports, a pergunta ao navegador se ele conhece a regra, como testar a tomada antes de ligar o aparelho.
Laboratório ao vivo: CSS nativo de 2026
1. Camadas com @layer e aninhamento
Pintado pela camada componente (base perdeu)A regra da camada base vem depois no arquivo e usa seletor três vezes mais forte. Perde mesmo assim: a ordem das camadas decide antes da especificidade.
Suporte: @layer e aninhamento nativo consolidados nos navegadores atuais. Sem @layer, as duas regras são descartadas e a etiqueta fica com o texto e o fundo da página.
2. O mesmo link em dois escopos
Ficha do prato: ver alergênicos
Rodapé: política de reservas
O seletor é o mesmo nos dois blocos, só o link. O escopo da ficha pinta de acento, o do rodapé pontilha, e a fronteira to() deixa o comentário de fora dos dois.
Suporte: @scope em Chrome, Firefox e Safari atuais. Sem ele, o bloco é descartado e todos os links ficam no estilo base, sublinhados e legíveis.
3. Cartão que reage por :has()
Moqueca de peixe, R$ 68
Na sua lista de favoritos
cenário ilustrativo
Suporte: :has() consolidado nos navegadores atuais. Sem ele, a caixa marca e desmarca normalmente, só sem a borda nova e o aviso do cartão.
4. Espaço fantasma e text-box-trim
sem corte
Reserva
com text-box-trim
Reserva
O fundo revela a métrica da fonte: sem o corte, sobra uma faixa acima e abaixo das letras, e o título nunca encosta na borda.
Suporte: Chrome e Edge 133, Safari 18.2; Firefox ainda sem. Sem suporte, os dois títulos ficam iguais, com a faixa sobrando.
5. Cartões alinhados por subgrid
Feijoada completa de sábado
Serve duas pessoas, com couve e laranja
R$ 89
Salada
Folhas do dia
R$ 32
cenário ilustrativo
Suporte: subgrid consolidado nos navegadores atuais. Sem ele, cada cartão mede as próprias linhas e o preço do menor sobe.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Esses dois rótulos têm um equivalente público, e usá-lo evita discussão. O Baseline, mantido pelo WebDX Community Group, classifica cada recurso em Widely Available, Newly Available e Limited Availability, sempre com data.
Widely Available exige 30 meses de estabilidade interoperável num conjunto fixo de navegadores. Esse conjunto reúne Safari de macOS e iOS, Firefox de computador e Android, Chrome de computador e Android e Edge de computador. Newly Available é o recurso que acabou de fechar esse conjunto, e Limited Availability é o que ainda falta em algum deles.
Dizer "é Baseline" sem a qualificação é o erro que quebra em produção. O Interop 2026 é o acordo anual entre os navegadores sobre o que cada um vai entregar. Ele lista 19 áreas de foco, 11 delas de CSS, e o que está lá chega a todos dentro do ano.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A ordem das camadas vence a força do seletor. O @layer declara as camadas numa linha. A camada declarada por último vence, mesmo quando a regra da anterior tem seletor mais forte ou aparece depois no arquivo. O aninhamento nativo escreve o estado do botão dentro da própria regra e dispensa o Sass (o pré-processador que fazia isso).
O @scope limita uma regra a uma região, com fronteira inferior. O mesmo seletor de link ganha um estilo dentro da ficha do prato e outro dentro do rodapé. A fronteira to() deixa o link do comentário aninhado fora dos dois. Sem ele, a regra do cartão vaza para tudo o que está dentro dele.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
:has() deixa o pai reagir ao filho: o cartão muda de borda quando o checkbox dentro dele está marcado, sem script. Ele chegou a Widely Available em junho de 2026, e o subgrid, em 15 de março de 2026, pelos 30 meses corridos desde o Chrome 117.
O subgrid alinha as linhas de dois cartões vizinhos pela grade do pai, e o preço para de flutuar quando um título ocupa duas linhas.
Já o text-box-trim corta o espaço fantasma que a métrica da fonte deixa acima e abaixo do título, e o título passa a encostar onde o desenho manda. Chegou ao Chrome e Edge 133 e ao Safari 18.2; o Firefox ainda não o tem.
Da lista em chegada, três merecem pedido explícito atrás de @supports. shape() desenha recorte complexo em clip-path e entrou em Chromium e WebKit em fevereiro de 2026. if() e @function trazem condicional e função ao CSS puro, só em Chromium. ::scroll-marker monta carrossel nativo com indicadores, com cerca de 69% de cobertura.
O select estilizável nativo, o customizable select, ainda está em desenvolvimento no grupo que define o CSS. Até lá o agente reimplementa a lista de opções à mão, e é dali que nasce a maior parte do script de menu.
Os outros recursos da lista aparecem rodando em outras aulas, e a tabela remete a cada uma. O critério de adoção cabe numa frase. Use o recurso nativo atrás de @supports quando o desenho de reserva já resolve o caso, e segure a biblioteca só enquanto esse desenho quebra a página.
O CSS de 2026 pelo estado Baseline, e onde cada recurso aparece rodando no curso
| Recurso | Estado em setembro de 2026 | Onde ver no curso |
|---|---|---|
| Container queries de tamanho | Widely Available desde 14 ago. 2025 | Na aula sobre layout pelo espaço |
| Container style queries | Newly Available desde 19 maio 2026; antes do Firefox 151, reserva por classe ou atributo | Na aula sobre layout pelo espaço |
| :has() | Widely Available desde junho de 2026 | Laboratório desta aula e aula sobre menu sem script |
| Subgrid | Widely Available desde 15 mar. 2026 | Laboratório desta aula |
| Aninhamento nativo, @layer e @scope | Consolidado | Laboratório desta aula |
| OKLCH, color() e color-mix() | Widely Available desde 9 nov. 2025 | Na aula sobre tokens |
| light-dark() | Newly Available; Widely previsto para 13 nov. 2026; exige color-scheme | Na aula sobre tokens |
| View Transitions no mesmo documento | Newly Available desde 14 out. 2025; Firefox 144 fechou o conjunto | Na aula sobre animação nativa |
| Scroll-driven animations | Limited Availability: Chrome 115 e Safari 26, sem Firefox; use @supports e respeite prefers-reduced-motion | Na aula sobre animação nativa |
| Popover API | Newly Available desde 27 jan. 2025; Widely só a partir de 27 jul. 2027 pela regra dos 30 meses | Na aula sobre menu sem script |
| Elemento dialog | Widely Available desde 14 set. 2024, com show(), showModal(), close() e ::backdrop | Na aula sobre menu sem script |
| text-wrap: balance | Newly Available; Chromium balanceia até seis linhas e o Firefox até dez | Na aula sobre layout pelo espaço |
| text-wrap: pretty | Limited Availability: Chrome e Safari sim, Firefox não; melhoria progressiva | Na aula sobre layout pelo espaço |
| field-sizing | Newly Available desde 16 jun. 2026; navegador antigo mantém o tamanho convencional | Na aula sobre formulários |
| Anchor positioning | Newly Available desde 13 jan. 2026; Firefox 147 fechou o conjunto; mantenha posição funcional sem ele | Na aula sobre menu sem script |
| contrast-color() | Newly Available desde abril de 2026 (Chrome 147, Firefox 146, Safari 26); não substitui medir 4,5:1 | Na aula sobre contraste |
| grid-lanes (alvenaria) | Em chegada: Safari 26; Chrome e Firefox em opção experimental | Na aula sobre layout pelo espaço |
| calc-size() e interpolate-size | Em chegada: Chrome e Edge 129; foco do Interop 2026 | Na aula sobre layout pelo espaço |
| reading-flow | Em chegada: Chrome 137 | Na aula sobre layout pelo espaço |
| text-box-trim | Em chegada: Chrome e Edge 133, Safari 18.2; sem Firefox | Laboratório desta aula |
| ::scroll-marker | Em chegada: perto de 69% de cobertura | Peça atrás de @supports, com botões de navegação como reserva |
| if() e @function | Em chegada: só Chromium, Chrome 137 e 139 | Só em experimento |
| shape() | Em chegada: Chromium e WebKit desde fevereiro de 2026 | polygon() como reserva |
| View Transitions entre documentos | Limited Availability: Chrome 126 ou posterior e Safari 18.2 ou posterior; o Firefox bloqueia o status | Na aula sobre animação nativa |
| dialog closedby | Sem suporte no Safari em agosto de 2026; avaliado à parte do elemento base | Na aula sobre menu sem script |
| Customizable select | Em desenvolvimento no CSSWG | Na aula sobre menu sem script |
O que está em Widely Available entra no pedido sem ressalva; Newly Available e Limited Availability entram atrás de @supports, com o desenho de reserva descrito na mesma linha do pedido.
Fonte: Estado Baseline pelo WebDX Community Group e pelos registros do web.dev, consultados em 8 de setembro de 2026; manual de referência Recursos de frontend moderno, edição setembro de 2026, seção 2.
/* A ordem das camadas, declarada uma vez no topo do arquivo */
@layer reset, tokens, base, componentes, utilitarios;
@layer base {
.btn.btn { background: var(--cinza-100); color: var(--texto); }
}
@layer componentes {
.btn {
background: var(--marca);
color: var(--marca-contraste);
border-radius: var(--raio-2);
/* aninhamento nativo: o estado mora dentro do próprio botão */
&:hover { background: color-mix(in oklch, var(--marca) 88%, white); }
&:focus-visible { outline: 2px solid var(--marca); outline-offset: 2px; }
& .icone { inline-size: 1em; }
}
}
/* A regra de base tem seletor mais forte e aparece antes no arquivo.
Perde mesmo assim: a camada componentes foi declarada depois. */Num restaurante com cardápio online, o cartão do prato ganha borda quando o filtro "sem glúten" está marcado, por :has(). Os preços de dois pratos vizinhos ficam alinhados por subgrid mesmo quando um nome ocupa duas linhas. Nenhuma biblioteca entra, e atualizar o cardápio segue sendo editar um arquivo de CSS.
Peça o CSS de 2026 num pedido só: camadas em @layer, aninhamento nativo, @scope na região que vaza e :has() com subgrid atrás de @supports. Antes de pedir um recurso ainda em chegada, confira no painel de visitas a fatia de Firefox e Safari antigos. Só aceite o recurso quando a reserva já entrega a mesma tela.
Escreva as regras visuais que o agente lê antes de desenhar
Decisão de token e de recurso nativo só sobrevive ao próximo pedido quando está escrita num arquivo que o agente lê antes de desenhar a tela.
Cinco telas geradas com DESIGN.md saíram com os hex exatos da marca; sem ele, o Cursor errou o raio do card em uma das cinco. O arquivo de tokens diz ao agente qual cor usar. O porquê de cada escolha, que só o DESIGN.md guarda, é o que decide o caso que nenhum token previu.
Esse arquivo é o sistema de design da casa, o manual de regras visuais que todo mundo segue. Quem já tem cores com nome ganha toda tela com a cara da marca, porque o agente lê o manual antes de qualquer mudança.
O DESIGN.md é uma especificação do Google Labs, nascida no Google Stitch, em versão alpha com licença Apache 2.0. É um arquivo Markdown (texto simples com marcas de título) em duas camadas. Em cima, os tokens (os valores de cor, espaço e letra guardados com nome, como a etiqueta na lata de tinta). Embaixo, a prosa com o porquê.
Quem lê as duas camadas é o agente, a ferramenta de IA que escreve o código. O valor ele já tinha; o critério é o que faltava.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A prosa tem oito seções em ordem fixa: visão geral, cores, tipografia, layout, elevação e profundidade, formas, componentes e faça e não faça. Uma seção pode faltar, mas as presentes mantêm a ordem, e um título repetido invalida o arquivo. Um token cita outro entre chaves: {colors.primary}.
Um componente, a peça repetida da tela como o botão, aceita fundo, cor de texto, tipografia, raio, preenchimento, tamanho, altura e largura. O estado de passar o mouse é uma entrada separada.
A cor entra só em hex sRGB. OKLCH e P3, que o rascunho do formato DTCG já aceita, ficam para depois. É a diferença que mais surpreende quem chega de um arquivo de tokens moderno.
As oito seções do DESIGN.md, com uma linha de exemplo para um escritório de arquitetura
| Seção | O que carrega | Exemplo de linha |
|---|---|---|
| Visão geral | Nome, ramo e uma frase de personalidade | Concreto, linha e vazio; a cor aparece uma vez por tela |
| Cores | Cada cor com nome, hex e papel | Laranja de obra #C2521F só no botão de orçamento |
| Tipografia | Família, tamanhos e entrelinha | Corpo em 17 px; título de projeto em 40 px sem negrito |
| Layout | Largura, colunas e ritmo de espaçamento | Uma coluna de 72 caracteres; seções separadas por 64 px |
| Elevação e profundidade | Sombra e borda entre planos | Sem sombra; plano separado por linha de 1 px |
| Formas | Raios e recortes | Raio de 4 px em tudo; foto de obra sem arredondar |
| Componentes | Fundo, texto, raio e estados de cada peça | button-primary com fundo {colors.primary} e texto branco |
| Faça e não faça | Regras negativas tiradas de correções reais | Não use sombra em card; não introduza outra cor de acento |
Preencha as oito na ordem; o lint reprova seção fora de lugar e título repetido.
Fonte: Especificação DESIGN.md do Google Labs (google-labs-code/design.md, versão alpha), lida em 8 de setembro de 2026; exemplos do autor.
Na linha de comando, npx @google/design.md faz três coisas. O lint confere nove regras do arquivo. Entre elas estão a referência quebrada, o par de fundo e texto abaixo de 4,5:1 e o token que ninguém usa. Entram também a seção fora de ordem e a chave com erro de digitação.
O diff compara duas versões e o export gera o arquivo do Tailwind, as classes prontas de estilo, e o formato DTCG. Coleções públicas já trazem arquivos inspirados em Stripe, Linear e Vercel: leia-os como forma, porque o conteúdo é da sua marca.
Guarde o arquivo na raiz do repositório, a pasta do projeto com histórico. O CLAUDE.md ou o .cursorrules ganha uma linha: leia DESIGN.md antes de qualquer mudança de interface.
A WaveSpeed testou em 14 de maio de 2026 com cinco telas. O Claude Code usou os hex exatos em cinco de cinco, e o Cursor acertou quatro, porque trocou o raio pequeno pelo médio. Uma linha no faça e não faça, "card usa rounded.sm, nunca rounded.md", corrigiu o Cursor na rodada seguinte.
O token diz o valor, a prosa decide o caso ambíguo e a regra negativa pesa mais que as duas.
O que o agente faz com cada arquivo quando a tela pede uma decisão
Arquivo de tokens só com valores
Valor sem critério
- Sabe que primary é #C2521F e usa a cor onde quiser
- Escolhe o raio médio no card, como na maioria do treino
- Sem regra de sombra, aplica a sombra cinza padrão em todo plano
- A correção de hoje some na próxima tela
DESIGN.md com valor e porquê
Valor com critério
- Lê que primary é o laranja de obra e aparece só no botão de orçamento
- Lê que card usa rounded.sm, nunca rounded.md, e acerta na primeira rodada
- Lê que plano se separa por linha de 1 px e dispensa a sombra
- Cada correção aceita vira uma linha no faça e não faça
A Vercel contou em 31 de agosto de 2026 como os agentes dela montam páginas com a cara da casa. Há um design.md público numa URL e uma folha de estilo com classes e tokens documentados; o agente usa os nomes e nunca lê o CSS. Sete cenários fixos rodam em Claude Opus 4.8 e em Codex com GPT-5.5.
O arquivo nomeia os padrões de página gerada que a empresa nunca quer ver; o nome faz o agente evitá-los. Cada correção aceita vai para o lugar mais estreito: julgamento vira prosa, mecânica repetível vira CSS e o que dá para checar vira teste.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Quem parte do zero começa de um sistema extraído. O Refero Styles, em beta, reúne mais de 2 mil sistemas lidos de sites reais. Cada um traz frase de personalidade, paleta com papel, escala tipográfica, raios e regras de faça e não faça, e sai como DESIGN.md.
O sistema da Apple España mostra o detalhe que vale imitar na forma. O azul #0071e3 fica reservado ao botão de ação e o #0066cc só ao link. Os cards têm raio de 28 px e os botões são pílulas sem sombra. A precisão do papel de cada cor é o que faz o arquivo funcionar.
Time com pipeline maduro de Figma e Style Dictionary (a ferramenta que gera tokens para cada plataforma) trata o DESIGN.md como subconjunto para o agente. Para o negócio pequeno, o DESIGN.md é a fonte e cabe em uma tarde. Abaixo, o mínimo que passa no lint.
---
name: Traço Reto Arquitetura
colors:
primary: "#C2521F" # laranja de obra: só o botão de orçamento
surface: "#EDE9E3" # cinza-quente do concreto: fundo das seções
text: "#2B2A28" # grafite: texto corrido
typography:
body: { fontFamily: "Archivo", fontSize: "17px", lineHeight: "1.5" }
rounded:
sm: "4px"
components:
button-primary:
backgroundColor: "{colors.primary}"
textColor: "#FFFFFF"
rounded: "{rounded.sm}"
---
## Overview
Escritório de arquitetura. Concreto, linha e vazio; a cor aparece uma vez por tela.
## Do's and Don'ts
- Use {colors.primary} só no botão de orçamento.
- Separe blocos com linha de 1px, nunca com sombra.
- Não introduza outra cor de acento.A regra negativa nasce da correção que se repetiu. No escritório de arquitetura do exemplo acima, o agente pôs sombra nos cards duas vezes seguidas. A terceira sombra não veio, porque a linha "sem sombra, só linha de 1 px" já estava no faça e não faça.
Escreva o DESIGN.md com cor só em hex, nunca em OKLCH, que o lint reprova. Rode npx @google/design.md lint DESIGN.md até zerar as nove regras. Depois aponte o CLAUDE.md para o arquivo, antes de pedir a próxima tela: sem essa linha, o agente nem abre o DESIGN.md.
Guia prático: partir de um DESIGN.md de referência e chegar ao da sua marca
Escrever o primeiro DESIGN.md do zero é a parte mais lenta deste capítulo. Um arquivo de referência bem feito mostra quanto detalhe o agente aproveita, e você troca o conteúdo pelo seu. O catálogo getdesign.md, mantido pela equipe do VoltAgent, publica análises no formato do Google para dezenas de sites conhecidos, de Stripe e Linear a Notion e Nike. O repositório de origem tem licença MIT e passava de 119 mil estrelas em 06/10/2026.
Um comando baixa o arquivo para a raiz do projeto. O de Stripe tem 24 kB: vinte cores nomeadas pelo papel que cumprem, uma escala tipográfica com peso, entrelinha e espaçamento entre letras, e as oito seções de regras, seguidas de comportamento responsivo e um guia de iteração. Ler um arquivo desses ensina mais sobre o formato do que a especificação.
O arquivo descreve a identidade de outra empresa. Cada página do catálogo avisa que a análise é independente e que a marca pertence ao dono. O de Stripe cita uma fonte proprietária, que você não tem licença para usar. Serve como molde de estrutura e como ponto de partida de estudo; a página que você publica leva as suas cores, a sua fonte e o seu nome.
# Baixa o DESIGN.md de referência para a raiz do projeto
npx getdesign@latest add stripe
# Confere o arquivo depois de trocar os valores pelos da sua marca
npx @google/design.md lint DESIGN.md
# Pedido ao agente, com o arquivo já no projeto
# "Leia DESIGN.md. Mantenha a estrutura de tokens e de seções.
# Troque cores, fontes e nome pelos da marca descrita em PRODUCT.md.
# Liste cada valor trocado e o motivo antes de gravar."Fundadora de uma consultoria de contabilidade para médicos, que constrói o site da empresa com um agente de código
Serviços profissionais, captação por agendamento
Dor
Ela sabia dizer que queria um site sóbrio e preciso, como o de uma ferramenta que admirava, e o agente devolvia telas genéricas a cada tentativa. Faltava vocabulário para descrever o que via.
Solução
Baixou o DESIGN.md de referência daquela ferramenta, leu as seções com o agente e pediu a troca dos valores pela sua marca: o verde da logomarca, uma fonte aberta e os termos do seu serviço. Rodou o lint até zerar.
Resultado
O arquivo final manteve a estrutura de papéis de cor e a escala tipográfica do molde, com valores próprios. As três telas seguintes saíram com a mesma identidade sem que ela repetisse instruções.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Do molde ao arquivo da sua marca
Seis passos. O molde encurta o caminho; o conteúdo final é seu.
Passo 1: Escolha a referência pela tarefa da tela
Procure no catálogo um site cujo trabalho se parece com o seu: painel denso, página de vendas, documentação. A semelhança de uso importa mais que o gosto pela cor.
Deu certo quando: Você sabe dizer em uma frase por que aquela referência serve ao seu caso.
Erro comum: Escolher pelo prestígio da marca e herdar um sistema feito para outro tipo de tela.
Passo 2: Baixe e leia antes de pedir qualquer tela
Rode npx getdesign@latest add com o nome do site. Leia os tokens do topo e a seção de regras do que fazer e do que evitar; é ali que a referência explica as próprias escolhas.
Deu certo quando: DESIGN.md está na raiz do projeto e você consegue apontar três decisões que não teria tomado sozinho.
Erro comum: Mandar o agente construir direto com o arquivo de outra empresa.
Passo 3: Troque as cores mantendo os papéis
O molde nomeia a cor pela função: principal, tinta, tela, linha fina. Preencha cada papel com a sua paleta, em hex, e confira o contraste de cada par de texto e fundo.
Deu certo quando: Nenhuma cor da referência sobrou no arquivo e todo par de texto e fundo passa de 4,5 para 1.
Erro comum: Trocar só a cor principal e publicar com os tons secundários de outra marca.
Passo 4: Troque a fonte por uma que você pode usar
Fonte proprietária citada no molde sai. Escolha uma família aberta de desenho parecido e ajuste peso e espaçamento entre letras, que raramente servem de uma fonte para outra.
Deu certo quando: O arquivo cita só famílias que o projeto carrega de verdade.
Erro comum: Deixar o nome da fonte paga e ver o navegador cair na fonte do sistema.
Passo 5: Reescreva as regras com as palavras do seu produto
As seções de visão geral e de regras falam da outra empresa. Reescreva com o seu público e a sua tarefa, e apague o que não se aplica em vez de adaptar à força.
Deu certo quando: Quem lê o arquivo não encontra o nome nem o setor da referência.
Erro comum: Manter frases sobre pagamentos ou código num site de clínica.
Passo 6: Valide e aponte o agente para o arquivo
Rode o lint do Google até zerar e mantenha no CLAUDE.md a linha que manda ler DESIGN.md antes de qualquer decisão visual, como este capítulo ensina.
Deu certo quando: O lint passa sem erro e a próxima tela pedida usa os tokens novos.
Erro comum: Guardar o arquivo no projeto e esquecer de dizer ao agente que ele existe.
No fim você tem: Um DESIGN.md da sua marca, com a estrutura de um arquivo maduro, validado pelo lint e lido pelo agente a cada pedido.
O levantamento que o próprio catálogo publicou em 2026, com as respostas de quem baixou os arquivos, ajuda a dimensionar o problema: 59,4% queriam melhorar a aparência de uma interface que já existia, 23,6% queriam chegar perto de um design que admiravam e 17% buscavam consistência de marca. É uma amostra de usuários do catálogo, e não do mercado. Mesmo assim confirma o ponto deste capítulo: gerar o código ficou fácil, e a dificuldade passou a ser manter a mesma identidade de uma tela para a outra.
Guia prático: um JSON de marca que muda a identidade da página inteira
Trocar a cor da marca não deveria exigir abrir componente. No curso de edição estudado em 07/10/2026, a identidade de cada vídeo cabe num arquivo JSON pequeno: cinco cores com papel definido (destaque, texto, fundo, apoio e legenda) e duas fontes. Um script transforma esse arquivo em variáveis no :root, e todo o CSS só consome variáveis. Os tons intermediários, como a borda suave e o fundo do cartão, saem de color-mix a partir das cores base.
O teste é a troca. A mesma composição saiu em terracota (#C8552E) e depois em laranja (#F97316) trocando só o JSON, sem tocar em nenhum componente. E uma cor ficou reservada a um sentido: o vermelho só aparece para o que é negativo. Papel definido é o que permite ao agente usar a cor certa sem perguntar.
O guia anterior deste capítulo mostrou um DESIGN.md de referência completo. Os 51 templates estudados mostram o que costuma faltar num DESIGN.md real:
| Item | Templates com o item |
|---|---|
| Lista de cores | 47, todas sem papel (de 0 a 14 hex soltos) |
| Nomes de fontes | 39 |
| Escala tipográfica | 0 |
| Espaçamento | 0 |
| Raios de borda | 0 |
Com uma lista de hex sem papel, o agente não sabe qual é fundo, qual é texto e qual é destaque, e escolhe a cada tela. O JSON com papel resolve as cores; a escala de tipo, o espaçamento e os raios você acrescenta ao DESIGN.md como tokens, extraídos dos valores que o CSS já usa.
// marca.json -> variáveis no :root. Trocar de marca é trocar o JSON.
// { "cores": { "destaque": "#C8552E", "texto": "#1F1A17", "fundo": "#FAF6F0",
// "apoio": "#6B5E55", "negativo": "#C62828" },
// "fontes": { "titulo": "[Fonte do título]", "corpo": "[Fonte do corpo]" } }
import marca from "./marca.json";
export function cssDaMarca(m = marca): string {
const vars = Object.entries(m.cores).map(([papel, hex]) => ` --${papel}: ${hex};`);
return `:root {
${vars.join("\n")}
--destaque-suave: color-mix(in oklab, var(--destaque) 14%, var(--fundo));
--destaque-forte: color-mix(in oklab, var(--destaque) 82%, black);
--borda: color-mix(in oklab, var(--texto) 12%, transparent);
--texto-secundario: color-mix(in oklab, var(--texto) 70%, var(--fundo));
--fonte-titulo: "${m.fontes.titulo}", serif;
--fonte-corpo: "${m.fontes.corpo}", sans-serif;
}`;
}Da paleta solta ao JSON de marca com papel
Cinco passos para deixar a identidade num arquivo só.
Passo 1: Dê um papel a cada cor
Pegue a lista de hex do projeto e escreva ao lado de cada um para que serve: fundo, texto, destaque, apoio, negativo. Cor sem papel sai da lista ou vira tom derivado.
Deu certo quando: Cada cor do JSON tem um nome de papel e nenhuma fica sem uso.
Erro comum: Nomear pela aparência (azul-claro, bege) e ter de renomear tudo na próxima troca de marca.
Passo 2: Derive os tons com color-mix
Borda, fundo de cartão, texto secundário e estado de foco saem da mistura das cores base, como no bloco acima. Assim, trocar o destaque troca também todos os tons ligados a ele.
Deu certo quando: Nenhum hex fixo no CSS além das cores base.
Erro comum: Escrever o tom derivado como hex fixo e ver ele ficar da cor antiga depois da troca.
Passo 3: Peça a troca para só consumir variáveis
Peça ao agente para varrer o CSS e os componentes e trocar todo hex escrito direto pela variável do papel correspondente, listando os casos em que ficou em dúvida.
Deu certo quando: A busca por # seguido de seis caracteres hexadecimais nos componentes volta vazia.
Erro comum: Aceitar a troca sem a lista de dúvidas e descobrir um cinza fixo no rodapé.
Passo 4: Complete o DESIGN.md com o que falta
Extraia do CSS a escala tipográfica (título, subtítulo, corpo, legenda, com tamanho, peso e entrelinha), os passos de espaçamento e os raios de borda, e registre como tokens.
Deu certo quando: O DESIGN.md tem cores com papel, escala de tipo, espaçamento e raios.
Erro comum: Inventar uma escala nova em vez de extrair a que a página já usa.
Passo 5: Prove com uma segunda marca
Gere uma cópia da página trocando só o JSON por outra paleta. Abra as duas lado a lado e confira contraste do texto sobre o fundo e do botão.
Deu certo quando: A segunda versão saiu sem editar componente e passa no contraste mínimo.
Erro comum: Trocar o destaque por uma cor clara e deixar o texto branco do botão ilegível.
No fim você tem: Uma identidade que mora num arquivo com papéis definidos, tons derivados automaticamente e um DESIGN.md que o agente consegue seguir.
Guia prático: do DESIGN.md à classe do Tailwind, e da classe a outro projeto pelo registro
A aula guarda cor, espaço e letra em tokens e escreve o DESIGN.md. Falta ligar as pontas: o valor do DESIGN.md precisa chegar à classe que o agente usa, e a identidade precisa sair do projeto para a próxima campanha sem cópia à mão. Em 2026, o @theme do Tailwind v4 faz a primeira ligação; o registro do shadcn em repositório do GitHub, desde junho, faz a segunda. Você sai daqui com a cadeia DESIGN.md, variável, classe e registro funcionando.
Funções, casos de uso e aplicações
Funções
O que mudou em tokens, Tailwind e componentes de maio a outubro
| Função ou recurso | O que faz | Quando usar | Desde |
|---|---|---|---|
| Barra de rolagem e @container-size (Tailwind 4.3) | scrollbar-thin, scrollbar-thumb-*, scrollbar-gutter-stable pintam a barra pelo token; @container-size libera as unidades cqb e cqh | Painel, tabela e menu lateral com rolagem própria; bloco que mede altura do contêiner | 08/05/2026 |
| @variant composto e --default() (Tailwind 4.3) | Um bloco serve a hover e focus ao mesmo tempo; utilitária própria aceita valor padrão | Estados do botão da marca escritos uma vez só | 08/05/2026 |
| Registro do shadcn em repositório do GitHub | Qualquer repositório com registry.json na raiz vira registro: shadcn add dono/repo/item instala componente, tokens ou AGENTS.md | Levar a identidade da marca para cada projeto novo de campanha | junho de 2026 |
| Base UI como padrão do shadcn init | Projeto novo nasce com Base UI; init -b radix mantém o Radix, que segue aceito | Projeto novo: aceite o padrão; projeto antigo: migre peça a peça, se quiser | julho de 2026 |
| Registro privado e pacote cn | O CLI instala de repositório privado com o login do GitHub CLI ou GH_TOKEN; os componentes importam cn do pacote cn | Kit interno da agência; migrate cn tira clsx e tailwind-merge do projeto | agosto e setembro de 2026 |
| Tailwind Labs na Shopify | O Tailwind CSS segue com licença MIT e mantido pela mesma equipe; o Tailwind Plus fechou para clientes novos | Nada muda no projeto; kit pago novo sai do plano | 09/09/2026 |
| alpha() e light-dark() com imagem | alpha() muda só a transparência de um token; light-dark() troca imagem e degradê entre os temas claro e escuro | Fundo translúcido e ilustração por tema sem duplicar token; viraram Baseline Newly com o Safari 27 | 17/09/2026 |
Casos de uso
Diretora de arte de uma agência de performance em Goiânia que sobe uma landing nova por semana
Marketing digital
Dor
Cada landing nascia de uma cópia da anterior, e a cor do botão e o raio do cartão iam mudando um pouco a cada cópia.
Solução
Criou um repositório privado com registry.json e três itens: os tokens em CSS com @theme, o DESIGN.md e o botão da marca. Toda landing nova começa com shadcn add agencia/marca/tokens.
Resultado
O que observar: nas próximas quatro landings, quantos hex escritos direto aparecem nos componentes (a busca deve voltar vazia) e quanto tempo leva do repositório vazio à primeira tela com a marca.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Analista de produto de uma plataforma de cursos online em Recife
Educação
Dor
O painel do aluno tinha tema escuro, mas as ilustrações de fundo continuavam claras e a barra de rolagem cinza do sistema destoava da marca.
Solução
Pediu ao agente light-dark() com as duas versões da ilustração, atrás de @supports, e as utilitárias de barra de rolagem do Tailwind 4.3 pintadas com os tokens do tema.
Resultado
O que observar: abrir o painel nos dois temas, no Chrome e no Safari 27, e conferir o contraste do texto sobre a ilustração; no navegador sem suporte, a ilustração clara continua aparecendo.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
No painel /admin deste portal, a cadeia tem três elos. O contrato está em docs/admin/DESIGN.md, com os tokens no cabeçalho YAML e a frase "Fonte dos valores em src/app/admin/admin-tokens.css". Esse arquivo declara as variáveis --adm-* nos três estados de tema. O terceiro elo, src/app/globals.css, registra as variáveis no @theme inline do Tailwind v4. O inline faz a classe ler a variável na hora: bg-adm-surface vira background-color: var(--adm-surface) e troca sozinha quando o tema muda. O agente usa a classe e nunca precisa saber o valor.
/* Tokens do painel /admin como utilitárias do Tailwind (onda 1, 06/10/2026).
`inline` faz a classe ler a variável em tempo de execução: `bg-adm-surface`
vira `background-color: var(--adm-surface)`, que muda com o tema do painel.
Os valores moram em src/app/admin/admin-tokens.css; o contrato está em
docs/admin/DESIGN.md. */
@theme inline {
--color-adm-bg: var(--adm-bg);
--color-adm-surface: var(--adm-surface);
--color-adm-text: var(--adm-text);
--color-adm-text-muted: var(--adm-text-muted);
--color-adm-accent: var(--adm-accent);
--color-adm-danger: var(--adm-danger);
/* ... */
}A identidade em quatro elos, do arquivo ao projeto seguinte
Passo 1: DESIGN.md como contrato
O arquivo diz o nome e o papel de cada token e aponta o arquivo CSS que guarda o valor.
Deu certo quando: Quem lê o DESIGN.md sabe onde mudar a cor.
Erro comum: Valor diferente no DESIGN.md e no CSS: o agente lê um e o navegador pinta o outro.
Passo 2: Variáveis por tema num arquivo só
Claro, escuro escolhido e escuro do sistema no mesmo arquivo, como o admin-tokens.css do portal.
Deu certo quando: Trocar o tema muda as variáveis e deixa as classes como estão.
Erro comum: Declarar o mesmo token em dois arquivos e ver o que carrega depois vencer.
Passo 3: @theme inline para gerar a classe
Cada variável vira uma cor do Tailwind que lê var() na hora, e o agente passa a escrever bg-marca-superficie.
Deu certo quando: A busca por hex nos componentes volta vazia.
Erro comum: Usar @theme sem inline e congelar o valor do tema claro na classe.
Passo 4: Registro para o próximo projeto
registry.json no repositório da marca, com tokens, DESIGN.md e componentes como itens instaláveis.
Deu certo quando: Projeto novo recebe a marca com um comando.
Erro comum: Copiar a pasta à mão e perder a atualização do token no projeto antigo.
No fim você tem: Uma identidade que mora num lugar, aparece como classe para o agente e viaja para o projeto seguinte por comando.
Armadilhas
Tokens que viajam contra tokens que se perdem na cópia
Evite
Coluna a evitar
- @theme com o valor escrito direto, que congela um tema na classe
- Instalar item de registro de terceiros sem abrir o registry.json e os arquivos
- Migrar todos os componentes do Radix para o Base UI de uma vez
- Contar com kit pago novo do Tailwind Plus: fechou para clientes novos
Prefira
Coluna recomendada
- @theme inline lendo var(), como no painel do portal
- Registro próprio da marca, privado se for interno, com versão por commit
- Migração peça a peça, com o relatório que o shadcn gera para cada componente
- Tailwind CSS aberto, sob licença MIT, e componentes que você mantém no repositório
Aplicar os recursos ao projeto
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
CSS nativo já resolve a distribuição, a adaptação e os estados visuais sem você instalar nada. Propriedades personalizadas guardam cor e espaço num lugar só, como um painel de ajustes. Grid organiza linhas e colunas; Flexbox alinha num eixo. A escolha vem da relação entre os elementos.
Para o catálogo da sua loja, declare --espaco: 1rem em :root, o apelido que guarda o espaçamento. Use gap: var(--espaco) na lista e display: grid com grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr)) para os cartões se reorganizarem sozinhos. Guarde as cores do tema escuro em [data-theme='dark'].
Encolha a janela, dê zoom e ponha um título comprido num cartão. Nenhum deles pode empurrar a página para o lado. Meça o contraste do texto e do contorno de foco nos dois temas, claro e escuro, com o conta-gotas do navegador.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Panda CSS deixa você escrever estilo em código e gera o arquivo CSS ao compilar. Uma receita é o cardápio fechado do componente: tamanho pequeno ou grande, ação principal ou secundária. Vale quando o time quer travar as combinações; o custo é depender do compilador.
Defina a receita do botão com cva: em base entram o que todo botão tem, e em variants entram as opções permitidas. A variante de intenção separa a ação principal da secundária. No componente, escolha uma opção e aplique a classe que a receita devolveu.
Compile para produção e procure no CSS gerado cada variante usada. A armadilha é montar o nome da classe juntando pedaços: o compilador lê o código sem executar, não enxerga o nome e o estilo some. Teste foco e botão desabilitado em cada combinação.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Bootstrap é o kit de obra antigo da web: grade, utilitários de espaço e componentes que rodam em HTML puro. Ele levanta um site institucional rápido, sem React. Em troca, a página nasce com cara conhecida e precisa de JavaScript para abrir e fechar.
Na página de serviços, use container para segurar a largura e organize as ofertas com row e col, linha e coluna da grade. Para recolher uma seção, ligue o botão ao identificador do bloco pelo atributo data-bs-toggle. Guarde os arquivos CSS e JavaScript na entrega.
Abrir a página e ver estilo bonito engana: sem JavaScript carregado, menu e sanfona ficam mudos. Clique neles antes de aprovar. Estreite a janela até a largura de celular, passe pelo teclado e confira o contraste dos botões depois de trocar as cores padrão.
Open Props é uma caixa de valores prontos em variáveis CSS para espaço, cor, canto, sombra e movimento. Funciona como um vocabulário inicial, sem trazer componente nem framework. Use quando você quer parar de chutar números; o custo é que a aparência final continua na sua mão.
No catálogo, dê ao cartão um espaçamento interno da escala pronta, como var(--size-3), um valor guardado com nome. Depois crie uma variável sua, apontando para ela, com o nome do que aquilo significa. Mudar a regra do projeto passa a atualizar todos os cartões de uma vez.
Guarde as definições no projeto e abra a página com a rede desligada. Se você escrever o nome errado da variável, a linha inteira é descartada em silêncio e o espaço some. Meça o contraste de texto e fundo, porque escala de cor pronta não garante leitura.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Tailwind escreve o estilo no HTML, uma classe por decisão: esta margem, este alinhamento, esta cor. A folha final sai só com o que a página usa. Serve a quem valoriza velocidade e padrão; o preço é marcação carregada e um passo de compilação obrigatório.
Na linha v4, declare a cor da marca dentro de @theme, o bloco das decisões do projeto, com o nome --color-brand. Use bg-brand no botão e escolha a cor do texto. Para trocar de estado, guarde um mapa com os nomes de classe escritos por inteiro.
Olhe a página depois da compilação de produção, porque classe que o gerador não enxergou não existe no CSS. Nome montado por concatenação some assim. A entrega offline recebe o CSS pronto. Meça contraste e foco: quantidade de classe não diz nada sobre acessibilidade.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Utopia calcula escadas de tamanho que crescem junto: letra, título e espaço acompanham a largura da tela sem pulos. Isso evita texto que salta de miúdo para gigante num piscar. Escolha em página de leitura longa; o custo é aceitar valores calculados que você não escolhe.
Num manual, escolha no gerador a largura mínima e a máxima e os tamanhos de leitura nas duas pontas. Copie as variáveis CSS geradas e aplique uma ao corpo e outra ao título. Cada valor sai com clamp, que fixa um piso, uma faixa e um teto.
Olhe a página em larguras do meio, não só no celular e no monitor grande. Aumente a fonte do navegador para 200%: fórmula presa à janela às vezes ignora esse aumento e o texto não cresce. Confira ainda títulos que quebram em muitas linhas estreitas.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O formato do Design Tokens Community Group guarda decisões visuais em dados que andam entre ferramentas. Um token é etiqueta com nome, tipo e valor, como a cor da ação. Use quando desenho e código precisam da mesma língua; o texto é relatório de comunidade.
Declare uma cor básica com $type e $value, os dois campos que dizem o que aquilo é e quanto vale. Depois crie um token de significado, como ação principal, apontando para essa cor. A ferramenta resolve o apontamento e escreve a variável CSS que o botão usa.
Exporte um punhado de tokens e importe na outra ferramenta antes de mover a marca inteira. Compare os dados dos dois lados. Dizer que aceita tokens não quer dizer que aceita a mesma versão do formato, e valores compostos como sombra são os primeiros a se perder.
Style Dictionary é o moinho que pega o arquivo de decisões e moe em vários formatos, como variáveis CSS. Ele mora na preparação e mata a cópia manual de cor e medida. Vale quando site, aplicativo e documentação bebem da mesma fonte; exige configuração cuidada.
Aponte os arquivos de origem e uma saída para CSS, escolha o destino e rode a transformação junto da compilação. O site importa esse arquivo e chama os nomes por função: texto, superfície, ação. A configuração de autoria fica fora do navegador, longe do que o visitante baixa.
Mude um token de teste e veja no controle de versão quais arquivos se mexeram. Se nenhum mexeu, a origem não é a que você pensa. A moagem renomeia e troca unidade, então leia o resultado antes de confiar, e fixe a versão do gerador na entrega.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Tokens Studio organiza as decisões visuais na ferramenta de desenho e manda esses dados para o código. Ele aproxima quem desenha de quem programa, com os mesmos nomes dos dois lados. Adote quando há gente suficiente para brigar por cor; antes disso, defina quem muda a fonte oficial.
No arquivo do Figma, crie um conjunto de cores cruas e outro de cores com significado, como texto e superfície. Faça o segundo apontar para o primeiro e aplique só o segundo nos componentes. Exporte os dados para a mesma esteira que gera o CSS do site.
Compare os valores exportados com o que aparece desenhado, nos modos claro e escuro. Divergência aqui costuma ser apontamento perdido. Guarde uma exportação versionada no repositório antes de depender do serviço: plano, limite e sincronia mudam, e o seu site não pode parar por causa disso.
Fontsource empacota fontes para morarem no seu servidor, sem buscar nada em serviço de terceiro enquanto a pessoa lê. Isso ajuda privacidade e entrega offline. Escolha quando a página precisa rodar sem internet; a contrapartida é cuidar de pesos, arquivos e licença por sua conta.
Num guia em português, instale o pacote da família e importe só os pesos do corpo e do título. Declare font-family com uma fonte do sistema como reserva, para o texto aparecer enquanto a sua carrega. A compilação precisa copiar os arquivos para a pasta entregue.
Desligue a rede e leia uma frase com acento, cedilha e número. Se o recorte de caracteres estiver errado, o navegador mistura duas fontes no mesmo parágrafo e a palavra acentuada fica torta. Observe o salto de layout enquanto a fonte chega, e confira a licença.
O desenho e o código precisam compartilhar decisões
| Artefato | Carrega | Conferir |
|---|---|---|
| Arquivo de design | Composição e estados | Correspondência com a tela |
| Tokens | Valores com nomes | Transformação sem perdas |
| Componentes | Regras e variantes | Mesmos estados e nomes |
Penpot, Figma e ferramentas de tokens ocupam etapas diferentes; exportar um desenho não conclui a implementação nem sua verificação.
Penpot é uma prancheta de desenho aberta que fala a mesma língua do navegador: caixas flexíveis e grade, como o CSS entende. Isso encurta a conversa entre desenho e código. Escolha quando você quer o arquivo sob seu controle; a colaboração exige servidor de alguém.
Monte a prancha do formulário de orçamento e organize os campos num arranjo flexível. Transforme o botão em componente e crie as versões de envio e erro. Exporte os ícones e anote as distâncias que o programador vai reproduzir, em vez de deixar no olho.
Abra o protótipo estreito e troque o texto de mentira por frases reais de cliente. Desenho aprovado não entrega HTML com sentido, teclado nem validação; isso nasce no código. Guarde uma cópia editável do arquivo e confira a licença de cada ícone que você exportou.
Figma é a prancheta onde a tela é combinada antes de existir, com peças reaproveitáveis e protótipo clicável. Serve para alinhar as pessoas antes de gastar hora de programação. Use quando o time é grande ou o cliente precisa ver; o arquivo mora num serviço pago.
No formulário de orçamento, arrume campos e botão com Auto Layout, o arranjo que reacomoda tudo sozinho quando o conteúdo cresce. Faça um componente do campo, com a versão de erro. Use estilos compartilhados de cor e tipo, e preencha o protótipo com texto do tamanho real.
Troque um rótulo curto por uma frase comprida e veja o desenho se ajeitar ou quebrar. Aprovação visual não testa teclado, leitor de tela nem semântica do HTML. Anote medidas e estados junto do arquivo, e confira a licença dos ícones que você exportou.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Terrazzo é outra esteira para transformar tokens em código, partindo de uma origem organizada. Ela cabe quando você quer gerar CSS por linha de comando e manter tudo versionado. Compare os formatos aceitos antes de trocar a esteira que já roda, porque a migração cobra tempo e atenção.
Comece com poucos tokens: cor de ação, de superfície e de texto, no formato que a versão instalada aceita. Configure a saída, rode a ferramenta pelo terminal e importe o resultado no projeto. Deixe o arquivo de origem no repositório, porque ele passa a ser a fonte da verdade do projeto.
Depois de gerar e importar, confira nomes, unidades e apontamentos um a um. Planeje a entrega pelo que a ferramenta faz hoje, nunca por recurso anunciado como futuro. Anote no projeto qual versão você avaliou, para o time saber exatamente o que foi testado.
Um token muda várias partes da interface
Altere o espaçamento e o raio. A mesma referência atualiza a lista, os campos e o botão da prévia.
16px--espaco-controleMesmo valor da referênciaA prévia usa 16 px entre os elementos e raio de 12 px. Os controles desta demonstração preservam seu tamanho de toque.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- Frontend vs Backendsugerido pelo grafoApresenta o conceito “Frontend”, usado em “Construir a identidade com tokens, CSS moderno e DESIGN.md”.
- CursoVídeo com IA: Claude Code, Codex e ElevenLabssugerido pelo grafo20 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoNode.js: JavaScript no Servidorsugerido pelo grafo20 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Node.js: JavaScript no Servidor”.
Depois, siga para
- Montar o plano de 90 dias com dono e prazosugerido pelo grafoApresenta o conceito “CSS”, usado em “Montar o plano de 90 dias com dono e prazo”.
- Fazer a automação sobreviver à segunda-feira sem duplicar registrosugerido pelo grafoApresenta o conceito “CSS”, usado em “Fazer a automação sobreviver à segunda-feira sem duplicar registro”.
- Ver uma página dar ordens ao seu agente sem você sabersugerido pelo grafoApresenta o conceito “CSS”, usado em “Ver uma página dar ordens ao seu agente sem você saber”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Vibecoding para SEOO Manifesto Vibecoding: Programe sem ProgramarExaminar conexões de O Manifesto Vibecoding: Programe sem Programar
- SEO ProgramáticoTestar o template no pior caso e achar o tetoExaminar conexões de Testar o template no pior caso e achar o teto
- Bastidores: Como Este Portal Foi ConstruídoO motor de cursos: conteúdo como códigoExaminar conexões de O motor de cursos: conteúdo como código
- Meta Ads 2027Montar imagens, carrosséis e coleções com um conceito comercial comumExaminar conexões de Montar imagens, carrosséis e coleções com um conceito comercial comum
Voltar ao capítulo anterior: Investigar uma stack e priorizar atualizações
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
Base UI
Prenda o foco num diálogo sem escrever o comportamento
Abra a janela Agendar visita, percorra os campos com Tab, feche com Esc e acompanhe no painel onde o foco está e para onde ele volta.
Pacote
Abrir no capítuloConstruir componentes, usar o registro e publicar o catálogo@base-ui/reactLucide e Iconify
Mantenha uma família de ícones coerente e nomeie cada botão
Mude tamanho, traço e cor da barra, veja o símbolo do Iconify acompanhar o Lucide e rode a auditoria de nomes acessíveis.
Pacote
Abrir no capítuloProjetar uma linguagem de ícones e ilustraçãolucide-react, @iconify/reactMotion
Testar os três sinais que autorizam o terceiro degrau
Reproduza a entrada em sequência, aperte o botão com mola e arraste o cartão; ajuste rigidez e amortecimento e veja o que muda.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagemmotionVidstack
Ver o que separa um player de um vídeo cru
Dê o play, troque a velocidade e ligue a legenda; o painel ao lado mostra o estado que o player publica e que a etiqueta crua esconde.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagem@vidstack/reactcmdk
Achar um destino entre quarenta digitando três letras
Abra a paleta, digite fat e escolha um item só pelo teclado; o painel embaixo conta o que o filtro deixou passar e quanto tempo levou.
Pacote
Abrir no capítuloConstruir formulários e estados de interaçãocmdknumber-flow
Animar indicadores que mudam ao vivo com formato pt-BR
Veja três indicadores fictícios rolarem a cada troca e compare com o número em texto puro. Pause, reinicie e observe o separador de milhar.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisão@number-flow/reactApache ECharts
Medir o custo de desenhar 200 mil pontos com o ECharts
Troque o tipo de gráfico e o volume de pontos, leia o tempo de desenho e alterne o eixo em zero. Mude o tema do site e veja as cores refazerem.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisãoechartssharp e svgo
Escolher a variante certa da imagem e conferir o teto de 150 KB
Arraste a largura da tela simulada, troque a densidade entre 1x e 2x e veja qual arquivo o navegador escolhe, quanto ele pesa e se cabe no orçamento.
Pacote
Abrir no capítuloValidar desempenho, autenticação e segurançasharp, svgoReact Flow (xyflow)
Disparar um pedido e ver o orquestrador distribuir, conferir e responder
Alterne paralelo e sequencial, ligue e desligue a verificação e use a medição real; observe o tempo de parede em cada combinação.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robô@xyflow/reactGSAP, Web Workers e number-flow
Dividir mil tarefas entre trabalhadores reais e correr três ritmos de geração
Execute com um trabalhador, depois com quatro e oito, e compare o tempo; em seguida percorra a corrida e separe a espera inicial do ritmo.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôgsap, @number-flow/reactThree.js com React Three Fiber, drei, Rapier e XR
Carregar o braço robótico, ver a física trabalhar e entrar na cena com o visor
Carregue a cena pelo botão, inicie o ciclo, mostre os ângulos das juntas, troque a câmera e a velocidade; com visor, entre em realidade virtual.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôthree, @react-three/fiber, @react-three/drei, @react-three/rapier, @react-three/xrMotion
Ver quatro agentes em raias trocando mensagens e a revisão devolvendo um trecho
Reproduza os 60 s de modelo, percorra o tempo pelo controle e esconda as mensagens para comparar a leitura; repare no tempo de parede contra a soma.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinamotionMediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Medir o quadro da cena e gravar seis segundos dela em vídeo
Suba as partículas, force um bloqueio de 300 ms e leia o medidor; depois grave seis segundos, veja o codec escolhido e baixe o arquivo.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinasem pacotesigma.js, graphology com ForceAtlas2 e cosmos.gl
Ver o grafo real do curso e um grafo de milhares de nós se organizarem em aglomerados
Rode o layout no grafo real, passe o mouse pelos nós e busque uma entidade; troque para 20 mil nós e leia o medidor; depois carregue o modo massivo na placa de vídeo.
Pacote
Abrir no capítuloAnimar um grafo de conhecimento amplo em movimentosigma, graphology, graphology-layout-forceatlas2, graphology-generators, @cosmos.gl/graph
Capítulos vizinhos em Frontends com Vibecoding
- 03Escolher a stack e projetar suas dependências
- 04Investigar uma stack e priorizar atualizações
- 05Construir a identidade com tokens, CSS moderno e DESIGN.md
- 06Construir componentes, usar o registro e publicar o catálogo
- 07Projetar uma linguagem de ícones e ilustração