Skip to main content
Gremorie
Semantic

Colors

Mapeamento intenção → valor para os seis temas Gremorie, em light e dark mode.

Tokens semânticos são intenções: primary, foreground, border. Cada tema preenche essas intenções com valores diferentes, e cada modo (light / dark) traz seu próprio mapeamento. Esta página é a tabela de verdade para os seis temas embarcados: Default, Claude, ChatGPT, Gemini, Perplexity e Mistral.

Como ler as tabelas

  • As colunas Light e Dark renderizam o valor exato declarado como um chip sobre o próprio background light ou dark do tema, então as duas são fiéis independente do modo em que você está lendo.
  • As colunas Valor mostram o que o tema declara: um nome de primitivo (consumido via var(--color-<token>)) ou, onde o tema espelha uma superfície de produto sem primitivo equivalente, um valor OKLCH literal.
  • O badge base indica que o tema não sobrescreve aquele token; ele herda o valor da camada base em theme.css. Essa herança é o comportamento que embarca, não uma omissão.

Se você está auditando um componente que parece "errado" em algum tema, comece por aqui. Comparar a intenção (e.g. --primary) com o valor resolvido em cada tema diz se a inconsistência é da chrome do componente ou do mapeamento do tema.

Default

A propria camada semantica base, sobre a rampa gray neutralizada. Conservador e sem marca; todos os outros temas sao camadas de override por cima dele.

--radius-base: 0.625rem · selector :root

LightDarkTokenValor (light)Valor (dark)
--backgroundgray-50basegray-950base
--foregroundgray-950basegray-50base
--cardgray-0basegray-900base
--card-foregroundgray-950basegray-50base
--popovergray-0basegray-900base
--popover-foregroundgray-950basegray-50base
--primarygray-900basegray-100base
--primary-foregroundgray-50basegray-900base
--secondarygray-100basegray-800base
--secondary-foregroundgray-900basegray-50base
--mutedgray-100basegray-800base
--muted-foregroundgray-500basegray-400base
--accentgray-100basegray-800base
--accent-foregroundgray-900basegray-50base
--destructivered-600basered-400base
--destructive-foregroundgray-50basegray-50base
--bordergray-200baseoklch(1 0 0 / 10%)base
--inputgray-200baseoklch(1 0 0 / 15%)base
--ringgray-400basegray-500base
--chart-1oklch(0.646 0.222 41.116)baseoklch(0.488 0.243 264.376)base
--chart-2oklch(0.6 0.118 184.704)baseoklch(0.696 0.17 162.48)base
--chart-3oklch(0.398 0.07 227.392)baseoklch(0.769 0.188 70.08)base
--chart-4oklch(0.828 0.189 84.429)baseoklch(0.627 0.265 303.9)base
--chart-5oklch(0.769 0.188 70.08)baseoklch(0.645 0.246 16.439)base
--sidebargray-50basegray-900base
--sidebar-foregroundgray-950basegray-50base
--sidebar-primarygray-900basegray-100base
--sidebar-primary-foregroundgray-50basegray-900base
--sidebar-accentgray-100basegray-800base
--sidebar-accent-foregroundgray-900basegray-50base
--sidebar-bordergray-200baseoklch(1 0 0 / 10%)base
--sidebar-ringgray-400basegray-500base

Claude

Clay quente (terracota coral) sobre superficies creme, apoio em taupe, display serifado. O dark mode usa o carvao quente do produto real.

--radius-base: 0.5rem · selector [data-theme='claude']

LightDarkTokenValor (light)Valor (dark)
--backgroundoklch(0.965 0.011 92)oklch(0.235 0.006 100)
--foregroundgray-950gray-50
--cardoklch(0.985 0.008 92)oklch(0.268 0.005 100)
--card-foregroundgray-950gray-50
--popoveroklch(0.985 0.008 92)oklch(0.268 0.005 100)
--popover-foregroundgray-950gray-50
--primaryclay-500clay-400
--primary-foregroundgray-50gray-950
--secondaryoklch(0.95 0.012 80)oklch(0.28 0.012 58)
--secondary-foregroundclay-900gray-50
--mutedoklch(0.95 0.012 80)oklch(0.28 0.012 58)
--muted-foregroundtaupe-600taupe-300
--accentclay-100clay-900
--accent-foregroundclay-900clay-50
--destructivered-600basered-400base
--destructive-foregroundgray-50basegray-50base
--borderoklch(0.9 0.014 78)oklch(1 0 0 / 10%)
--inputoklch(0.9 0.014 78)oklch(1 0 0 / 15%)
--ringclay-500clay-400
--chart-1clay-500clay-400
--chart-2clay-300clay-200
--chart-3clay-700clay-600
--chart-4taupe-400taupe-400
--chart-5amber-400amber-400
--sidebaroklch(0.97 0.01 84)oklch(0.24 0.012 60)
--sidebar-foregroundgray-950gray-50
--sidebar-primaryclay-600clay-400
--sidebar-primary-foregroundgray-50gray-950
--sidebar-accentclay-100oklch(0.28 0.012 58)
--sidebar-accent-foregroundclay-900gray-50
--sidebar-borderoklch(0.9 0.014 78)oklch(1 0 0 / 10%)
--sidebar-ringclay-500clay-400

ChatGPT

Acento emerald sobre superficie flat de sombras suaves. O dark mode usa o grafite flat do produto real; as demais superficies herdam a base neutra.

--radius-base: 0.75rem · selector [data-theme='chatgpt']

LightDarkTokenValor (light)Valor (dark)
--backgroundgray-50baseoklch(0.248 0 0)
--foregroundgray-950basegray-50base
--cardgray-0baseoklch(0.278 0 0)
--card-foregroundgray-950basegray-50base
--popovergray-0baseoklch(0.278 0 0)
--popover-foregroundgray-950basegray-50base
--primaryemerald-700emerald-400
--primary-foregroundgray-50gray-950
--secondarygray-100basegray-800base
--secondary-foregroundgray-900basegray-50base
--mutedgray-100basegray-800base
--muted-foregroundgray-500basegray-400base
--accentemerald-100emerald-900
--accent-foregroundemerald-900emerald-50
--destructivered-600basered-400base
--destructive-foregroundgray-50basegray-50base
--bordergray-200baseoklch(1 0 0 / 10%)base
--inputgray-200baseoklch(1 0 0 / 15%)base
--ringemerald-500emerald-400
--chart-1emerald-500emerald-400
--chart-2emerald-300emerald-200
--chart-3teal-600teal-400
--chart-4green-400green-400
--chart-5cyan-400cyan-400
--sidebargray-50basegray-900base
--sidebar-foregroundgray-950basegray-50base
--sidebar-primaryemerald-700emerald-400
--sidebar-primary-foregroundgray-50gray-950
--sidebar-accentgray-100basegray-800base
--sidebar-accent-foregroundgray-900basegray-50base
--sidebar-bordergray-200baseoklch(1 0 0 / 10%)base
--sidebar-ringemerald-500emerald-400

Gemini

Azul Google com rampa de chart azul-para-roxo e o radius mais arredondado do conjunto. O dark mode usa o grafite frio do produto real.

--radius-base: 1rem · selector [data-theme='gemini']

LightDarkTokenValor (light)Valor (dark)
--backgroundgray-50baseoklch(0.239 0.002 248)
--foregroundgray-950basegray-50base
--cardgray-0baseoklch(0.274 0.002 248)
--card-foregroundgray-950basegray-50base
--popovergray-0baseoklch(0.274 0.002 248)
--popover-foregroundgray-950basegray-50base
--primaryoklch(0.55 0.19 258)oklch(0.75 0.11 258)
--primary-foregroundgray-50gray-950
--secondarygray-100basegray-800base
--secondary-foregroundgray-900basegray-50base
--mutedgray-100basegray-800base
--muted-foregroundgray-500basegray-400base
--accentindigo-100indigo-900
--accent-foregroundindigo-900indigo-50
--destructivered-600basered-400base
--destructive-foregroundgray-50basegray-50base
--bordergray-200baseoklch(1 0 0 / 10%)base
--inputgray-200baseoklch(1 0 0 / 15%)base
--ringoklch(0.63 0.18 260)oklch(0.75 0.11 258)
--chart-1oklch(0.63 0.18 260)oklch(0.75 0.11 258)
--chart-2oklch(0.78 0.11 258)oklch(0.85 0.07 255)
--chart-3oklch(0.629 0.136 304)oklch(0.72 0.12 304)
--chart-4oklch(0.78 0.09 304)oklch(0.84 0.06 300)
--chart-5oklch(0.53 0.2 276)oklch(0.68 0.14 276)
--sidebargray-50basegray-900base
--sidebar-foregroundgray-950basegray-50base
--sidebar-primaryoklch(0.55 0.19 258)oklch(0.75 0.11 258)
--sidebar-primary-foregroundgray-50gray-950
--sidebar-accentgray-100basegray-800base
--sidebar-accent-foregroundgray-900basegray-50base
--sidebar-bordergray-200baseoklch(1 0 0 / 10%)base
--sidebar-ringoklch(0.63 0.18 260)oklch(0.75 0.11 258)

Perplexity

Turquesa verdadeiro sobre offblack, sobrio e compacto, com o menor radius do conjunto. O primary claro e o turquesa de marca #20808D.

--radius-base: 0.375rem · selector [data-theme='perplexity']

LightDarkTokenValor (light)Valor (dark)
--backgroundgray-50baseoklch(0.192 0.02 195.6)
--foregroundgray-950basegray-50base
--cardgray-0baseoklch(0.225 0.018 196)
--card-foregroundgray-950basegray-50base
--popovergray-0baseoklch(0.225 0.018 196)
--popover-foregroundgray-950basegray-50base
--primaryoklch(0.553 0.086 208.5)oklch(0.72 0.11 205)
--primary-foregroundgray-0gray-950
--secondarygray-100basegray-800base
--secondary-foregroundgray-900basegray-50base
--mutedgray-100basegray-800base
--muted-foregroundgray-500basegray-400base
--accentteal-100teal-900
--accent-foregroundteal-900teal-50
--destructivered-600basered-400base
--destructive-foregroundgray-50basegray-50base
--bordergray-200baseoklch(1 0 0 / 10%)base
--inputgray-200baseoklch(1 0 0 / 15%)base
--ringoklch(0.553 0.086 208.5)oklch(0.72 0.11 205)
--chart-1teal-600teal-400
--chart-2teal-300teal-200
--chart-3cyan-600cyan-400
--chart-4sky-400sky-400
--chart-5emerald-400emerald-400
--sidebargray-50basegray-900base
--sidebar-foregroundgray-950basegray-50base
--sidebar-primaryoklch(0.553 0.086 208.5)oklch(0.72 0.11 205)
--sidebar-primary-foregroundgray-0gray-950
--sidebar-accentgray-100basegray-800base
--sidebar-accent-foregroundgray-900basegray-50base
--sidebar-bordergray-200baseoklch(1 0 0 / 10%)base
--sidebar-ringoklch(0.553 0.086 208.5)oklch(0.72 0.11 205)

Mistral

Laranja flame com primary preto-sobre-laranja, espelhando o uso de marca da Mistral. As superficies herdam a base neutra nos dois modos.

--radius-base: 0.5rem · selector [data-theme='mistral']

LightDarkTokenValor (light)Valor (dark)
--backgroundgray-50basegray-950base
--foregroundgray-950basegray-50base
--cardgray-0basegray-900base
--card-foregroundgray-950basegray-50base
--popovergray-0basegray-900base
--popover-foregroundgray-950basegray-50base
--primaryorange-600orange-400
--primary-foregroundgray-950gray-950
--secondarygray-100basegray-800base
--secondary-foregroundgray-900basegray-50base
--mutedgray-100basegray-800base
--muted-foregroundgray-500basegray-400base
--accentorange-100orange-900
--accent-foregroundorange-900orange-50
--destructivered-600basered-400base
--destructive-foregroundgray-50basegray-50base
--bordergray-200baseoklch(1 0 0 / 10%)base
--inputgray-200baseoklch(1 0 0 / 15%)base
--ringorange-500orange-400
--chart-1orange-500orange-400
--chart-2orange-300orange-200
--chart-3orange-700orange-600
--chart-4amber-400amber-400
--chart-5red-400red-400
--sidebargray-50basegray-900base
--sidebar-foregroundgray-950basegray-50base
--sidebar-primaryorange-600orange-400
--sidebar-primary-foregroundgray-950gray-950
--sidebar-accentgray-100basegray-800base
--sidebar-accent-foregroundgray-900basegray-50base
--sidebar-bordergray-200baseoklch(1 0 0 / 10%)base
--sidebar-ringorange-500orange-400

Sobre os tokens de sidebar

Os --sidebar-* são uma família paralela que cobre a chrome de navegação lateral. Eles existem porque sidebars são surfaces muitas vezes pintadas distintas do background (mais escuras, mais claras, contrastantes). Manter intenções dedicadas evita o truque de "background com tint" que se quebra ao mudar de tema.

Sobre os tokens de chart

--chart-1 a --chart-5 são as cores de série categóricas consumidas pelos componentes de chart. Todo tema redefine o conjunto completo nos dois modos: o bloco dark precisa re-declarar cada série porque o bloco light do tema vence o seletor .dark da base em especificidade, então um override dark faltante vazaria o valor light para o dark mode.

Editando ou adicionando temas

Temas são camadas de override sobre a camada semântica base em packages/tokens/styles/theme.css. A receita curta:

  1. Crie um novo arquivo em packages/tokens/styles/themes/<id>.css.

  2. Defina os dois selectors:

    :root[data-theme='<id>'] {
      /* overrides do light */
    }
    :root[data-theme='<id>'].dark {
      /* overrides do dark */
    }
  3. Sobrescreva apenas o que difere da base. Um tema de acento como o Mistral toca uma dúzia de tokens; um tema de superfície completa como o Claude remapeia quase tudo. O que o bloco light declarar, o bloco dark precisa re-declarar (veja a nota de chart acima), porque :root[data-theme] vence .dark.

  4. Importe o arquivo no topo de packages/tokens/styles/theme.css.

  5. Audite rodando o tema no workbench e checando contraste: pares primary/primary-foreground precisam passar WCAG AA para texto (4.5:1) e as séries de chart precisam de 3:1 sobre o background do tema.

Prefira primitivos. Referencie as rampas via var(--color-<token>) para que um ajuste de primitivo cascateie em todos os temas. Os temas embarcados só hardcodam OKLCH onde espelham uma superfície de produto sem primitivo equivalente (e.g. o creme do Claude ou o grafite do Gemini). Se o seu valor é reutilizável, adicione-o como primitivo.

On this page