A mesmice é herdada, não inventada
É tentador descrever isso como um problema de gosto — o modelo viu um bilhão de landing pages e regride para a média. Isso faz parte, mas não é o mecanismo, e leva as pessoas à solução errada (prompts melhores). O mecanismo é mais tedioso e muito mais acionável: um agente de código solicitado a construir uma UI recorre a uma biblioteca de componentes, e essa biblioteca entrega padrões. Esses padrões foram projetados para serem inofensivos, que é exatamente o que os torna universais.
Peça a cinco ferramentas diferentes — Claude Code, Cursor, v0, Lovable, Bolt — um dashboard, sem nenhuma outra instrução. Você receberá cinco layouts e uma única identidade visual. Elas não estão copiando umas às outras. Cada uma está, independentemente, fazendo a coisa sensata com o mesmo material de partida.
Os quatro sinais e de onde cada um vem
1. A rampa neutra
O tema padrão do shadcn/ui é construído sobre a escala zinc do Tailwind, com slate e gray como substituições comuns. É um cinza frio, levemente azulado. Uma vez que você nota, não consegue parar de notar: é o fundo da maioria dos produtos feitos por IA lançados nos últimos dois anos. É um neutro genuinamente bom, e esse é o problema — é bom o suficiente para que ninguém o substitua.
A entrega não é o cinza em si, mas sua *uniformidade*. Uma interface projetada geralmente inclina seus neutros levemente para a cor da marca, para que os cinzas pareçam relacionados ao destaque. Uma interface padrão tem uma rampa pura ao lado de um destaque não relacionado, e os dois nunca parecem pertencer um ao outro.
2. Inter, ou algo indistinguível dela
A Inter é uma tipografia de UI excelente, e é por isso que está em todo lugar e por que agora parece um padrão, e não uma decisão. Onde não é literalmente Inter, é a stack de sistema font-sans, que resulta em uma grotesque quase idêntica na maioria das máquinas. De qualquer forma, a página tem uma única família fazendo todo o trabalho: títulos, corpo, labels, números.
O fato de haver apenas uma família é o sinal real, mais do que qual família seja. Um design system quase sempre faz pares — uma fonte de display com personalidade para títulos contra uma fonte de trabalho para o corpo, ou, no mínimo, um contraste deliberado de peso e largura dentro de uma mesma superfamília. Páginas de família única parecem planas, mesmo quando todas as outras decisões são sólidas.
3. `0.5rem` em tudo
O --radius padrão do shadcn é 0.5rem, e ele se propaga para botões, inputs, cards, dialogs e popovers da mesma forma. Raio uniforme em todos os tamanhos de elemento não é como design systems se comportam: um botão de 44px e um card de 400px com o mesmo raio de canto fazem o card parecer suave demais e o botão parecer uma 'bolha', porque o raio é percebido em relação ao elemento em que está.
:root {
/* The line most AI-built projects never touch */
--radius: 0.5rem;
}4. O grid de três cards
Hero, depois três cards iguais, depois uma faixa de depoimentos, depois um CTA. Este é genuinamente fruto da gravidade dos dados de treinamento, e não de um padrão de configuração — é a estrutura de página de marketing mais comum na web, então é a forma que um modelo produz quando o briefing não sugere outra. Não está errado. É simplesmente o layout que não transmite nenhuma informação sobre o seu produto.
Por que prompts melhores param de funcionar
A resposta comum é escrever um prompt mais longo: *use uma paleta quente, combine uma display serif com um corpo grotesque, varie o raio.* Isso funciona. Funciona para uma tela, e geralmente funciona para a segunda e a terceira.
Então a qualidade cai, e cai de uma forma específica. O agente não está ignorando sua instrução — ele está mantendo uma conversa cada vez mais longa na qual seu parágrafo de estilização está competindo com tudo o que veio depois. Na quinta tela, ele lembra do *quente* e perdeu os valores hex, então ele aproxima. A aproximação é um quente ligeiramente diferente. A sexta tela aproxima a aproximação.
O desvio não é o agente esquecendo sua instrução. É o agente lembrando dela aproximadamente, seis vezes seguidas.
Quem está no meio desse processo chama isso de *design drift*, e é a razão pela qual um app feito via 'vibe' que parecia nítido na sexta-feira parece ter sido montado por um comitê na segunda. A instrução vivia na conversa, e conversas se degradam.
O teste que separa os dois modos de falha: abra a tela um e a tela oito lado a lado. Se elas divergem no espaçamento e na cor, mas cada uma é internamente consistente, isso é drift. Se ambas são internamente inconsistentes, o sistema nunca foi especificado.
A solução é um arquivo que o agente relê, não um parágrafo que ele lembra
Um design system interrompe o drift pela mesma razão que o interrompe em equipes humanas: os valores vivem em algum lugar durável e são consultados, em vez de serem carregados na cabeça de alguém. Para um agente de código, esse lugar é um DESIGN.md mais um conjunto de tokens no repo. Ambos são relidos no início de cada sessão, então a tela vinte resolve o mesmo --primary que a tela um — e não um similar.
| No prompt | Em tokens + DESIGN.md | |
|---|---|---|
| Sobrevive a uma nova sessão | Não — o contexto é resetado | Sim — é relido do repositório |
| Precisão após 10 telas | Aproximado ('meio quente') | Hex exato, sempre |
| Revisável via PR | Não | Sim — é um arquivo que gera diff |
| Funciona entre ferramentas | Reescrever para cada ferramenta | Mesmo arquivo para Claude Code, Cursor, v0 |
Este é todo o argumento para dar a um agente um sistema real em vez de apenas uma descrição melhor de um. A camada de tokens semânticos importa mais do que a paleta: --primary e --muted-foreground sobrevivem a um redesign, enquanto blue-600 espalhado pelo markup não.
Token specimen · real values
Terrain Vivant
Live renderTerrain Vivant's actual tokens — the same values its exports use.
Color tokens
Terrain Vivant
Core
background
H 131 · C79, 0, 64, 38
foreground
H 120 · C100, 0, 100, 92
card
H 235 · C68, 62, 0, 47
muted
H 130 · C83, 0, 69, 47
border
H 134 · C89, 0, 69, 56
Brand
primary
H 235 · C68, 62, 0, 47
primary-fg
H 0 · C0, 0, 0, 0
secondary
H 215 · C81, 47, 0, 45
accent
H 209 · C95, 46, 0, 33
ring
H 235 · C68, 62, 0, 47
Semantic
destructive
H 0 · C0, 85, 85, 27
destructive-fg
H 0 · C0, 0, 0, 0
success
H 132 · C100, 0, 79, 70
warning
H 23 · C0, 56, 90, 43
muted-fg
H 0 · C0, 0, 0, 100
Charts
chart-1
H 235 · C68, 62, 0, 47
chart-2
H 209 · C95, 46, 0, 33
chart-3
H 210 · C92, 46, 0, 39
chart-4
H 120 · C100, 0, 100, 92
chart-5
H 235 · C57, 51, 0, 46
Typography
Terrain Vivant
Scale: perfect-fourth
Density: balanced
Heading · Space Mono · 3rem
Sample headline
Subheading · Space Mono · 2.25rem
A bold two-color institutional editorial system built on vivid green and cobalt blue full-screen surfaces, with monospace type throughout and zero-radius geometry.
Body · Space Mono · 1rem
A resolutely flat two-color surface system. Vivid grass-green (#229f39) and deep cobalt-blue (#2b3386) are sovereign peers: either can fill an entire screen or section, with no neutral intermediary. All text is set in Space Mono at every scale from hero display down to captions, making the monospace grid the primary typographic voice rather than a code aesthetic. All shapes are sharp 90-degree rectangles, and section breaks use stacked parallel horizontal lines as a graphic band.
Mono · Space Mono · 0.75rem
npx shadcn add terrainvivant.json
Aa
Space Mono · Heading
Aa
Space Mono · Body
ABCDEFGHIJKLM NOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 & @ # % →
As pessoas que documentam isso realmente conseguem escapar dos padrões?
Na maioria das vezes, não, e essa é a descoberta mais desconfortável. Analisamos 299 arquivos DESIGN.md públicos no GitHub — o arquivo cuja única função é evitar isso — e medimos o que havia neles.
Dos 72 que descrevem um design system visual, 21% especificam uma escala de radius e 26% especificam elevação. Esses são dois dos quatro sinais mencionados acima, deixados nos padrões por três quartos das pessoas que se dedicaram especificamente a escrever um contrato de design. 69% omitem completamente o dark mode, deixando todo o segundo tema para o agente inventar. E 86% nomeiam cores por matiz ou listam hexes puros em vez de usar papéis semânticos, o que significa que o arquivo não pode ser aplicado a nenhum componente que não tenha sido explicitamente descrito.
Os padrões sobrevivem à tentativa de substituí-los
A tipografia é abordada em 83% dos arquivos e a cor em 67%, porque essas são as duas coisas que as pessoas associam a 'design'. Radius, elevação e dark mode são os que permanecem silenciosamente genéricos. Os quatro sinais persistem não porque ninguém tentou, mas porque a maioria das tentativas cobre apenas a metade visível.
Existe uma versão de segunda ordem do mesmo problema: 54% dos arquivos contêm pelo menos um adjetivo vago substituindo um valor, liderados por *clean* (39%) e *modern* (36%). Um adjetivo não substitui um padrão. Ele pede para o agente escolher um.
Uma auditoria de cinco minutos
- 1
Amostre o background
Pegue o hex do background da sua página. Se for
#09090b,#18181b,#0f172aou#020617, você está usando uma rampa de zinc ou slate intocada. - 2
Conte as famílias tipográficas
Abra os estilos computados de um H1 e de um parágrafo de corpo. A mesma
font-familyem ambos significa que uma única família está fazendo todo o trabalho. - 3
Compare dois radii
Meça o radius do canto de um botão e do seu maior card. Valores idênticos significam que ninguém escalou o radius de acordo com o tamanho do elemento.
- 4
Compare sua primeira e última tela
Coloque a primeira tela que você criou ao lado da mais recente. Liste cada valor que diverge — essa lista é o seu drift.
- 5
Decida onde a resposta reside
Para cada divergência, pergunte se o valor correto existe em algum lugar durável. Se a resposta honesta for 'no prompt que escrevi em março', isso é o que precisa ser corrigido.
Pule completamente os quatro padrões
Cada kit do Identity Forge vem com um conjunto completo de tokens — neutros ajustados ao destaque, um pairing de fontes real, radius escalado por elemento — além do DESIGN.md que seu agente lê antes de escrever o markup. Kits gratuitos não exigem conta.
Isso é um problema do modelo ou das ferramentas ao redor dele?
Principalmente das ferramentas. O mesmo modelo produz UIs distintas quando recebe um conjunto de tokens e um brief, e UIs genéricas quando não recebe nenhum dos dois. O que varia é o material de partida, não a capacidade.
Mudar a cor de destaque resolve o problema?
Não, e esse é o desperdício de tarde mais comum. Trocar a cor de destaque mantendo os neutros padrão, a família tipográfica única e o raio uniforme produz a mesma página em um tom diferente. A tipografia e a estrutura carregam mais da identidade do que a cor de destaque.
Posso apenas dizer ao agente para evitar Inter e zinc?
Para uma única sessão, sim. A instrução reside no contexto, portanto, ela se degrada conforme a conversa cresce e desaparece completamente quando você abre uma nova. Um arquivo no repositório não tem essa característica.
O shadcn/ui é o problema?
Não. O shadcn entrega padrões sensatos justamente para que você possa começar sem precisar decidir tudo, e sua camada de temas é o que torna a correção simples. O problema é que os padrões são tratados como finalizados, em vez de serem vistos como um ponto de partida.
Quantas telas são necessárias para que o drift se torne visível?
Em nossos próprios testes, isso aparece por volta da quinta ou sexta tela de uma sessão contínua, e muito antes se você trocar de ferramenta no meio do caminho. Não há um número fixo — isso acompanha a extensão da conversa, não a contagem de telas.