Design System

Token ArchitectureToken Architecture

Design tokens são organizados em duas camadas (desde 0.7.0). Cada camada tem um papel específico — Semantic referencia Foundation, nunca o contrário.Design tokens are organized in two layers (since 0.7.0). Each layer has a specific role — Semantic references Foundation, never the other way around.

Camadas e cadeia de aliasLayers and alias chain

Duas camadas, uma direção: Foundation guarda valores brutos; Semantic aliasa Foundation com nomes de intenção. Componentes consomem só Semantic. Component foi eliminada em 0.7.0.Two layers, one direction: Foundation holds raw values; Semantic aliases Foundation with intent names. Components only consume Semantic. Component was eliminated in 0.7.0.

01Foundation

236 tokens · 9 categorias · hidden from publishing236 tokens · 9 categories · hidden from publishing

Valores brutos com naming numérico. A única camada com hex, rem ou px. Não é consumida diretamente pelos componentes.Raw values with numeric naming. The only layer with hex, rem or px. Never consumed directly by components.

color.blue.600=#2563EB
spacing.16=1rem
radius.8=8px

02Semantic

171 tokens × 2 modos · publicada pra Figma171 tokens × 2 modes · published to Figma

Intenção e significado, com naming t-shirt (sm/md/lg). Referencia Foundation via aliases. Light e dark sobrescrevem só esta camada.Intent and meaning, with t-shirt naming (sm/md/lg). References Foundation via aliases. Light and dark only override this layer.

primary.background.default{color.blue.600}
content.default{color.neutral.900}light
content.default{color.neutral.50}dark

A cadeia é sempre componente → Semantic → Foundation. Trocar a cor primária é mudar o alias de primary.background.default pra outro Foundation (color.cyan.600, color.emerald.600) — o componente não muda. Aliases resolvem em :root; [data-mode="dark"] sobrescreve só Semantic.The chain is always component → Semantic → Foundation. Changing the primary color means re-aliasing primary.background.default to another Foundation entry (color.cyan.600, color.emerald.600) — the component never changes. Aliases resolve at :root; [data-mode="dark"] overrides Semantic only.

Naming ConventionNaming convention

Padrão canônico: {layer}.{category}.{type}.{variant}.{state}Canonical pattern: {layer}.{category}.{type}.{variant}.{state}

FormatoFormatExemploExampleOndeWhere
Caminho JSONJSON pathfoundation.color.blue.500Arquivos fonte (tokens/)Source files (tokens/)
CSS custom propertyCSS custom property--ds-color-blue-500Gerado pelo Style DictionaryGenerated by Style Dictionary
Variável FigmaFigma variablecolor/blue/500Painel de Variáveis do FigmaFigma Variables panel
A regra do sufixo -defaultThe -default suffix rule
Todo token terminado em .default gera -default no CSS. Sem exceções, sem colapsar. semantic.primary.background.default vira --ds-primary-background-default, não --ds-color-primary.Every token ending in .default generates -default in CSS. No exceptions, no collapsing. semantic.primary.background.default becomes --ds-primary-background-default, not --ds-color-primary.

Modo light/darkLight/dark mode

Tokens semânticos têm as mesmas chaves em ambos os modos mas valores diferentes. Tokens de foundation e componente são invariantes de modo.Semantic tokens have the same keys in both modes but different values. Foundation and component tokens are mode-invariant.

TokenValor lightLight valueValor darkDark value
background.defaultneutral-50neutral-950
content.defaultneutral-900neutral-50
primary.background.defaultblue-600blue-400
primary.bg-hoverblue-700blue-300
overlay.subtleoverlay-black-5overlay-white-5
primary.content-defaultwhiteneutral-900

Tokens invariantes de modo (iguais em ambos): todos os space.*, radius.*, border.width.*, focus.ring.width, focus.ring.offset.Mode-invariant tokens (same in both modes): all space.*, radius.*, border.width.*, focus.ring.width, focus.ring.offset.

RegrasRules

#RegraRule
1Consumidores finais (CSS de componente, base, bindings Figma) só consomem Semantic — nunca Foundation direto.Final consumers (component CSS, base CSS, Figma bindings) only consume Semantic — never Foundation directly.
2Tokens semânticos referenciam foundation, nunca hardcoded. Nenhum hex ou rgba bruto na camada semântica (exceto rgba documentados em ADR).Semantic tokens reference foundation, never hardcoded. No raw hex or rgba in the semantic layer (except rgba documented in ADR).
3Foundation é a única camada com valores absolutos. Naming numérico (radius-8, spacing-16) — não t-shirt.Foundation is the only layer with absolute values. Numeric naming (radius-8, spacing-16) — not t-shirt.
4Semantic usa naming t-shirt (radius-md, space-sm) — distinto de Foundation pra evitar redundância.Semantic uses t-shirt naming (radius-md, space-sm) — distinct from Foundation to avoid redundancy.
5Todo token tem $type conforme spec DTCG.Every token has $type per DTCG spec.
6Tokens não óbvios requerem $description.Non-obvious tokens require $description.
7light.json e dark.json devem ter exatamente o mesmo conjunto de chaves.light.json and dark.json must have exactly the same key set.
8Novas categorias ou quebras de hierarquia requerem um ADR.New categories or hierarchy breaks require an ADR.

Mapeamento entre formatosCross-format mapping

JSON (fonte da verdade)JSON (source of truth)CSS (gerado)CSS (generated)Variáveis FigmaFigma Variables
foundation.color.blue.500--ds-color-blue-500color/blue/500 (Foundation)
foundation.spacing.16--ds-dimension-16spacing/16 (Foundation)
semantic.primary.background.default--ds-primary-background-defaultprimary/background/default (Semantic)
semantic.space.md--ds-space-mdspace/md (Semantic)
semantic.size.avatar.md--ds-size-xlsize/avatar/md (Semantic)

A geração de CSS é feita pelo Style Dictionary: caminho direto → nome, sem transforms customizados.CSS generation is handled by Style Dictionary: direct path → name, no custom transforms.

Contagem atual de tokensCurrent token counts

CamadaLayerTokensArquivosFilesStatus
Foundation2369 arquivos JSON (colors, typography, spacing, radius, shadows, opacity, motion, stroke, z-index)9 JSON files (colors, typography, spacing, radius, shadows, opacity, motion, stroke, z-index)JSON + Figma vars (hidden)
Semantic171 × 2 modos171 × 2 modeslight.json + dark.jsonJSON + Figma vars