Frontends com Vibecoding · Capítulo 7 de 35 · 56 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.
Ao fim, você sabe pedir que cor, fonte e espaçamento da marca fiquem guardados num arquivo só, com nome, e consegue conferir sozinho se o contraste entre texto e fundo passa na regra de acessibilidade. Tempo de leitura: cerca de 56 minutos, e o teste de contraste nas cores da sua marca, mais dez.
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.
Ver como texto
Esquema em três partes. No alto, uma escala de onze tons da mesma cor, do 50 ao 950, em que só a luminosidade muda. No meio, o antes: oito matizes com quatro estados cada somam 32 valores escritos à mão; o depois: oito tokens e uma função. Embaixo, o token da marca passa por color-mix com 88 por cento da marca e gera o tom de passar o mouse sem hexadecimal novo.
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.
A edição 2025.10 foi publicada em 28 de outubro de 2025 como relatório final do Community Group do W3C. Ela não é uma W3C Recommendation. Fixe a edição usada pelo projeto. Cada token tem um valor em $value e precisa de um tipo determinável: $type pode estar no próprio token ou ser herdado do grupo. $description é opcional, e uma referência como {cor.marca.primaria} reaproveita outro token. Confira se as ferramentas escolhidas suportam essa edição.
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.
Ver como texto
Antes e depois do token de cor: com o azul escrito em cada arquivo, trocar a marca são trinta edições; com um token lido por todos, é uma só
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.
Ver como texto
Dois caminhos até o CSS de produção. Em cima, a classe montada em tempo de execução, bg-cor-500 com a variável no meio, nunca aparece escrita no código; o compilador do Tailwind, que só lê texto, não a encontra, e o botão chega sem cor. Embaixo, um mapa de classes completas escritas por inteiro, escolhidas por chave; o compilador encontra cada uma e o botão chega pintado.
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.
A skill frontend-design chama atenção para três tratamentos recorrentes: destacar uma palavra do título, usar rótulos em caixa alta e acrescentar rótulos desnecessários acima do conteúdo. Revise cada escolha contra o briefing. Um destaque que comunica hierarquia pode ficar; um enfeite sem função pode sair. Esses sinais não demonstram quem criou a página.
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.
Ver como texto
Esquema em duas partes. Em cima, de seis a doze arquivos estáticos de fonte, um por peso, são substituídos por um único arquivo variável que desenha do traço fino ao grosso. Embaixo, o caminho da fonte: servida pelo próprio site com o Fontsource e só os caracteres usados, o pedido fica entre o visitante e o seu servidor; buscada no Google Fonts, o endereço IP do visitante sai para outra empresa.
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.
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.
Ver como texto
Linha do tempo do Baseline em três estados. Limited Availability: o recurso ainda falta em algum navegador do conjunto. Newly Available: acabou de fechar o conjunto de Safari, Firefox, Chrome e Edge. Depois de 30 meses de estabilidade, Widely Available. O exemplo é o subgrid, que chegou a Widely Available em 15 de março de 2026, 30 meses depois do Chrome 117.
O @layer organiza a prioridade das regras antes da comparação dos seletores. Entre declarações normais da mesma origem, a camada declarada por último tem prioridade; uma regra normal fora das camadas tem prioridade sobre as que estão nelas. Com !important, a ordem se inverte: a primeira camada tem prioridade, e declarações importantes em camadas vencem as importantes fora delas. Leia o exemplo abaixo como uma disputa entre regras normais em camadas. 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.
Ver como texto
Exemplo de declarações normais da mesma origem, sem !important. Pilha das cinco camadas declaradas numa linha com @layer: reset, tokens, base, componentes e utilitarios, da mais fraca para a mais forte. Na camada base, a regra .btn.btn tem seletor mais forte; na camada componentes, a regra .btn tem seletor simples. O botão fica com a cor da camada componentes, porque ela foi declarada depois: a ordem das camadas decide antes da força do seletor.
: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.
| 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 |
12 de 26 linhas
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.
Ver como texto
Anatomia de um arquivo DESIGN.md em duas camadas. Em cima, o bloco de tokens com o valor: primary em hexadecimal, raio sm de 4 pixels e o botão principal apontando para colors.primary. Embaixo, a prosa com o porquê: visão geral e a lista de faça e não faça, como usar a cor só no botão de orçamento. O agente lê as duas camadas antes de desenhar a tela: o valor ele já tinha, o critério é o que faltava.
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.
| 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
- Encontra a regra de rounded.sm no card e pode conferir se a tela a respeitou
- 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.
Ver como texto
Fluxograma de decisão. Uma correção aceita numa tela gerada pergunta que tipo de regra ela é. Se é julgamento, vira prosa no design.md. Se é mecânica repetível, vira CSS. Se dá para checar por máquina, vira teste. Cada correção vai para o lugar mais estreito que a sustenta.
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 do trabalho. 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 do exemplo
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.
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 central: 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 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
| 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 do exemplo
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 do exemplo
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
Token é a decisão de marca com nome e endereço
A documentação do Tailwind chama cor, tipografia e espaçamento de *design tokens* e os guarda em variáveis de tema. Para quem aprova, a consequência é prática: trocar a cor da marca vira uma edição, e não trinta. Pergunte ao fornecedor onde ficam os tokens e peça para ver o arquivo.

Ver como texto
Página Theme variables da documentação do Tailwind CSS v4.3, na seção Core concepts. O texto diz que tipografia, cores, sombras e pontos de quebra são decisões de design chamadas design tokens e que, no Tailwind, ficam em variáveis de tema definidas com a diretiva @theme; um sumário à direita lista tópicos como Customizing your theme e Sharing across projects.

Ver como texto
Post do blog do Tailwind CSS de 08/05/2026, de Adam Wathan e Robin Malfait, chamado Tailwind CSS v4.3: Scrollbars, new colors, and more. O texto lista o que chegou na v4.2: as paletas mauve, olive, mist e taupe, um plugin para webpack, mais utilitários de propriedades lógicas e o utilitário font-features.

Ver como texto
Post do web.dev de 02/10/2026, de Rachel Andrew, chamado New to the web platform in September. O texto diz que setembro de 2026 foi o primeiro mês de lançamentos quinzenais do Chrome e do Firefox, com Chrome 153 e 154, Firefox 155, 156 e 157 e Safari 27 estáveis, e que muitos recursos chegaram a Baseline Newly available.
| Data | Fato | Consequência para quem aprova |
|---|---|---|
| 09/09/2026 | Tailwind Labs anuncia a entrada na Shopify | A ferramenta segue aberta; acompanhe o blog oficial antes de qualquer migração |
| Setembro de 2026 | Chrome e Firefox passam a lançar versões a cada duas semanas | Peça que o time confira o suporte de cada recurso novo antes de usar |
| Setembro de 2026 | A função alpha(), que ajusta a transparência de uma cor, vira Baseline Newly available | Variações de cor da marca podem ser derivadas do token, sem cor solta |
Fonte: Tailwind CSS Blog (09/09/2026); web.dev, New to the web platform in September (02/10/2026).
Faça agora: confira o contraste das cores da sua marca
Passo 1: Pegue no manual da marca o código da cor principal e da cor de fundo do site, no formato #RRGGBB.
Deu certo quando: Dois códigos anotados, como #1A4FD6 e #FFFFFF.
Passo 2: Abra o verificador de contraste da WebAIM (webaim.org/resources/contrastchecker) e cole as duas cores.
Deu certo quando: A ferramenta mostra a razão de contraste, como 6,1:1.
Passo 3: Confira a linha WCAG AA para texto normal.
Deu certo quando: Aparece Pass; abaixo de 4,5:1 aparece Fail.
Erro comum: Testar só a cor sobre branco e esquecer o tema escuro.
Passo 4: Repita com as cores do tema escuro, se o site tiver um.
Deu certo quando: Os dois temas têm o resultado anotado.
No fim você tem: Uma tabela de contraste da marca nos dois temas, que entra no DESIGN.md e vira critério de aceite de toda tela nova.
Aplicar os recursos ao projeto
Ver como texto
Uma decisão visual chega a várias peças
Um token de destaque alimenta o contorno de um campo, o fundo de um botão e o traço de um ícone. A forma dos elementos permanece diferente.
Ver como texto
Receita de botão em cenário ilustrativo. A base guarda o que todo botão tem: raio, fonte e foco. As variantes listam as opções permitidas: intenção principal ou secundária e tamanho pequeno ou grande. O componente escolhe uma combinação, a receita devolve a classe e o compilador gera o CSS de cada variante usada.

Ver como texto
Ilustração de duas lojas vizinhas: uma genérica em cinza e azul padrão e outra reconhecível pela repetição de coral, azul profundo e formas arredondadas no toldo, nas embalagens, na sacola e na tela do tablet, sem logotipo.
Ver como texto
Classes curtas compõem propriedades do controle
Um botão ilustrativo recebe indicações de espaço, cantos e peso do texto. Os nomes px-4, rounded e font-medium exemplificam classes utilitárias; o desenho não mede seus valores.
Ver como texto
Texto e espaço crescem com regra
Duas composições usam título, linhas de texto e intervalos identificáveis. A mudança de espaço preserva hierarquia; ela não exige ampliar todos os elementos na mesma proporção.
Ver como texto
Um token precisa de nome, tipo e valor
Um registro de token contém nome, tipo e valor. Transformações adaptam essa informação ao código e à ferramenta de design; o formato comum não substitui conferir a correspondência entre saídas.
Ver como texto
Anatomia de um token em três camadas. O primitivo guarda o valor cru, com $type color e $value. O semântico, ação principal, aponta para o primitivo entre chaves. O de componente, fundo do botão, aponta para o semântico. O botão lê só a última camada; trocar a cor da marca é editar o primitivo, e a troca desce pela cadeia.
| 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.
Ver como texto
Esteira de tokens. A ferramenta de desenho, Figma, Penpot ou Tokens Studio, exporta para um arquivo de tokens guardado no repositório, que é a fonte da verdade. Style Dictionary ou Terrazzo transformam esse arquivo em variáveis CSS pela linha de comando, e o site, o aplicativo e a documentação leem as mesmas variáveis.
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: do zero à prática
- CursoSíntese e didática com IAsugerido pelo grafoDepois de escolher a informação essencial e desenhar hierarquia, gráficos e fluxos compreensíveis, o aluno pode aplicar esses critérios às interfaces do curso de frontend. A ponte conecta clareza da mensagem, acessibilidade e decisões de apresentação.
- CursoNode.js: JavaScript no Servidorsugerido pelo grafo9 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Node.js: JavaScript no Servidor”.
- CursoSkills e delegação com IAsugerido pelo grafo9 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Skills e delegação com IA”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Astra profundoConstruir uma amostra de tipografia e corExaminar conexões de Construir uma amostra de tipografia e cor
- Síntese e didática com IATabela, gráfico ou fluxograma: escolha pela relação a mostrarExaminar conexões de Tabela, gráfico ou fluxograma: escolha pela relação a mostrar
- Escrever bem com IAPedir tabela, passos ou fluxo conforme a dificuldade do leitorExaminar conexões de Pedir tabela, passos ou fluxo conforme a dificuldade do leitor
Terminou a leitura?
Você está aqui: capítulo 7 de 35
0 de 35 concluídos
- Próximo · Capítulo 8 de 35 · 53 minConstruir componentes, usar o registro e publicar o catálogoLer o capítulo 8 sem concluir
Marque como concluído para o capítulo contar no seu painel e no certificado.
- Anterior · Capítulo 6 de 35 · 28 minInvestigar uma stack e priorizar atualizaçõesVoltar para o capítulo 6
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ãoechartsApache ECharts
Painel grande com visões coordenadas
Clique num canal para filtrar todas as visões, troque a densidade entre 6, 9 e 12 visões, alterne tema e movimento e abra a tela cheia.
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
- 05Escolher a stack e projetar suas dependências
- 06Investigar uma stack e priorizar atualizações
- 07Construir a identidade com tokens, CSS moderno e DESIGN.md
- 08Construir componentes, usar o registro e publicar o catálogo
- 09Projetar uma linguagem de ícones e ilustração