Skip to main content
Gremorie
Semantic

Visão geral

Tokens semânticos traduzem primitivos em intenção. É aqui que o Gremorie suporta múltiplos temas e modo escuro sem que componentes saibam disso.

Se primitivos são "que cores existem", os tokens semânticos são "o que essas cores significam". Em vez de pintar um botão como bg-gray-900, você pinta como bg-primary, e o significado de "primary" muda quando o tema muda.

Esta é a camada 2 de 3: ela consome primitivos e é consumida pelos componentes e pela camada de chart. O desenho completo está no modelo de três camadas.

A intenção como interface

Toda a chrome dos componentes Gremorie conversa com a camada semântica. Ela define um conjunto fixo de intenções, background, foreground, primary, border, ring, etc, que qualquer tema precisa preencher.

IntençãoO que representa
background / foregroundSuperfície base e texto sobre ela
card / popoverVariações de superfície com elevação
primaryA ação principal - botão protagonista
secondaryAção secundária, baixo contraste
mutedTexto e superfícies em segundo plano
accentHover, seleção, destaque sutil
destructiveAções irreversíveis, erro
border / input / ringForms e estado de foco
chart-1 ... chart-5Séries categóricas para charts
sidebar-*Variantes para a chrome de navegação

Seis temas, dois modos

O Gremorie embarca seis temas. O tema Default é a própria camada base; os outros cinco espelham a voz visual dos principais produtos de AI:

Default

A camada base em gray neutro. Conservador, profissional, sem identidade de marca.

Claude

Clay quente (terracota coral) sobre superfícies creme, apoio em taupe, display serifado.

ChatGPT

Acento emerald sobre superfície grafite flat, de sombras suaves.

Gemini

Azul Google com rampa de chart azul-para-roxo e o radius mais arredondado.

Perplexity

Turquesa verdadeiro sobre offblack. Sóbrio, compacto, o menor radius.

Mistral

Laranja flame com primary preto-sobre-laranja, direto da marca.

Cada tema entrega light e dark independentemente. O switch é uma única troca de atributo:

<html data-theme="claude">
  <!-- Claude, light -->
</html>
<html data-theme="gemini" class="dark">
  <!-- Gemini, dark -->
</html>

Componentes não sabem qual tema está ativo. Eles pedem bg-primary, e o navegador resolve o var(--primary) no contexto certo.

Como os tokens são definidos

A camada semântica base vive em packages/tokens/styles/theme.css (:root para light, .dark para dark). Cada tema nomeado é um arquivo de override em packages/tokens/styles/themes/<id>.css que remapeia só o que difere, referenciando primitivos via var(--color-<token>):

:root[data-theme='mistral'] {
  --primary: var(--color-orange-600);
  --primary-foreground: var(--color-gray-950);
  --accent: var(--color-orange-100);
  /* ... */
}

A consequência: ajuste o --color-orange-600 na camada primitive e o tema Mistral, junto com qualquer outro que referencie orange-600, atualiza automaticamente. Edite uma vez, cascateia. Tokens que um tema não sobrescreve resolvem para a camada base, então um tema de acento como o Mistral cabe em uma dúzia de linhas enquanto um tema de superfície completa como o Claude remapeia quase tudo.

Para a tabela completa

A página Colors tem o mapeamento intenção → valor (light e dark) para os seis temas. Use-a para entender por que um botão fica clay em um tema e emerald em outro, e para auditar se o seu próprio tema customizado está preenchendo as intenções com valores consistentes.

A regra de bolso: referencie primitivos via var(--color-<token>) sempre que um servir, para manter a cascata íntegra. Os temas embarcados só hardcodam OKLCH em superfícies espelhadas de produto sem primitivo equivalente.

On this page