KDS
Semantic

Colors

Mapeamento intenção → primitivo para os quatro temas KDS, em light e dark mode.

Tokens semânticos são intençõesprimary, foreground, border. Cada tema preenche essas intenções com primitivos diferentes, e cada modo (light / dark) traz seu próprio mapeamento. Esta página é a tabela de verdade para os quatro temas embarcados.

Como ler as tabelas

  • A coluna Light mostra a swatch resolvida do primitivo referenciado no estado claro.
  • A coluna Dark mostra a swatch resolvida no estado escuro.
  • As colunas Primitivo trazem o nome do primitivo apontado via var(--color-<token>).

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

As swatches das colunas Light e Dark abaixo só renderizam com fidelidade quando você visualiza no modo correspondente. Se estiver em light mode, as swatches Dark mostram o primitivo como ele aparece na sua janela atual — útil para auditar, não para inspecionar o tema dark de fato.

Default (Neutral)

Tema base, espelha o `npx shadcn init` com `baseColor: neutral`. Ponto de partida quando o produto ainda não tem voz cromática.

--radius: 0.625rem · selector [data-theme="default"]

LightDarkTokenPrimitivo (light)Primitivo (dark)
--backgroundwhiteneutral-950
--foregroundneutral-950neutral-50
--cardwhiteneutral-900
--card-foregroundneutral-950neutral-50
--popoverwhiteneutral-900
--popover-foregroundneutral-950neutral-50
--primaryneutral-900neutral-50
--primary-foregroundneutral-50neutral-900
--secondaryneutral-100neutral-800
--secondary-foregroundneutral-900neutral-50
--mutedneutral-100neutral-800
--muted-foregroundneutral-500neutral-400
--accentneutral-100neutral-800
--accent-foregroundneutral-900neutral-50
--destructivered-600red-700
--destructive-foregroundneutral-50neutral-50
--borderneutral-200neutral-700
--inputneutral-200neutral-700
--ringneutral-400neutral-500
--sidebarneutral-50neutral-900
--sidebar-foregroundneutral-950neutral-50
--sidebar-primaryneutral-900neutral-50
--sidebar-primary-foregroundneutral-50neutral-900
--sidebar-accentneutral-100neutral-800
--sidebar-accent-foregroundneutral-900neutral-50
--sidebar-borderneutral-200neutral-700
--sidebar-ringneutral-400neutral-500

Amber Minimal

Importado do tweakcn. Brand amber sobre neutros frios — funciona para produtos warm-tech, fitness, criativo. Toque institucional sem perder personalidade.

--radius: 0.375rem · selector [data-theme="amber-minimal"]

LightDarkTokenPrimitivo (light)Primitivo (dark)
--backgroundwhiteneutral-900
--foregroundneutral-800neutral-200
--cardwhiteneutral-800
--card-foregroundneutral-800neutral-200
--popoverwhiteneutral-800
--popover-foregroundneutral-800neutral-200
--primaryamber-500amber-500
--primary-foregroundblackblack
--secondarygray-100neutral-800
--secondary-foregroundgray-600neutral-200
--mutedgray-50olive-900
--muted-foregroundgray-500neutral-400
--accentamber-50amber-800
--accent-foregroundamber-800amber-200
--destructivered-500red-500
--destructive-foregroundwhitewhite
--bordergray-200neutral-700
--inputgray-200neutral-700
--ringamber-500amber-500
--sidebargray-50olive-950
--sidebar-foregroundneutral-800neutral-200
--sidebar-primaryamber-500amber-500
--sidebar-primary-foregroundwhitewhite
--sidebar-accentamber-50amber-800
--sidebar-accent-foregroundamber-800amber-200
--sidebar-bordergray-200neutral-700
--sidebar-ringamber-500amber-500

Amethyst Haze

Lavanda dessaturada sobre mauve. Personalidade etérea — aproxima de produtos editoriais, contemplativos, AI-first. O brand aqui é discreto: o tom do produto vem mais do espaçamento e da tipografia.

--radius: 0.5rem · selector [data-theme="amethyst-haze"]

LightDarkTokenPrimitivo (light)Primitivo (dark)
--backgroundslate-50mauve-900
--foregroundgray-700zinc-200
--cardwhitemauve-800
--card-foregroundgray-700zinc-200
--popoverwhitemauve-800
--popover-foregroundgray-700zinc-200
--primaryslate-500slate-400
--primary-foregroundslate-50mauve-900
--secondaryviolet-200slate-600
--secondary-foregroundgray-700zinc-200
--mutedgray-300mauve-800
--muted-foregroundmauve-500zinc-400
--accentrose-300mauve-700
--accent-foregroundmauve-700red-200
--destructivered-400red-400
--destructive-foregroundslate-50mauve-900
--bordermauve-300slate-800
--inputgray-200gray-800
--ringslate-500slate-400
--sidebarmauve-100mauve-900
--sidebar-foregroundgray-700zinc-200
--sidebar-primaryslate-500slate-400
--sidebar-primary-foregroundslate-50mauve-900
--sidebar-accentrose-300mauve-700
--sidebar-accent-foregroundmauve-700red-200
--sidebar-bordermauve-300gray-800
--sidebar-ringslate-500slate-400

Claude

Stone, taupe, olive e amber. Pegada terrosa, editorial, próxima de papel. Funciona para AI consumer-facing, conteúdo longo-form, marcas com personalidade humana.

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

LightDarkTokenPrimitivo (light)Primitivo (dark)
--backgroundstone-50neutral-800
--foregroundtaupe-700taupe-300
--cardstone-50neutral-800
--card-foregroundneutral-900stone-50
--popoverwhiteolive-800
--popover-foregroundtaupe-800stone-200
--primaryamber-700amber-600
--primary-foregroundwhitewhite
--secondaryolive-200stone-50
--secondary-foregroundstone-600olive-800
--mutedolive-200stone-900
--muted-foregroundolive-500olive-400
--accentolive-200stone-900
--accent-foregroundtaupe-800olive-100
--destructiveneutral-900red-500
--destructive-foregroundwhitewhite
--borderolive-300neutral-700
--inputolive-400stone-600
--ringamber-700amber-600
--sidebarstone-50neutral-800
--sidebar-foregroundtaupe-700taupe-300
--sidebar-primaryamber-700amber-600
--sidebar-primary-foregroundwhitewhite
--sidebar-accentolive-200stone-900
--sidebar-accent-foregroundtaupe-800olive-100
--sidebar-borderolive-300neutral-700
--sidebar-ringamber-700amber-600

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.

Editando ou adicionando temas

A receita curta:

  1. Crie um novo arquivo em packages/kds/src/styles/tokens/semantic/colors-<id>.css.
  2. Defina os dois selectors:
    [data-theme="<id>"] { /* light */ }
    [data-theme="<id>"].dark { /* dark */ }
  3. Preencha todas as 27 intenções da tabela acima — light e dark — referenciando primitivos via var(--color-<token>).
  4. Importe o arquivo no entry CSS principal do KDS.
  5. Audite rodando o tema na app e comparando com os componentes principais.

Não é trabalho pequeno — preencher 54 valores (27 × 2) sem que nada quebre exige rodar componentes em todos os estados. Por isso a KDS embarca apenas quatro temas curados.

Não digite OKLCH ou hex em arquivos de tema. Se o primitivo certo não existe, adicione-o primeiro em tokens/primitive/colors.css. Hardcoded values em temas quebram a cascata.

On this page