@ceres_design_system/design-tokens
v0.2.0
Published
Base de Design Tokens agnostica organizada no fluxo `primitives > brand > semantics > theme`, pronta para ser processada pelo Style Dictionary e consumida por qualquer stack. O projeto agora expõe uma API pública clara para frontend, recipes de composição
Downloads
22
Readme
Ceres Design Tokens
Base de Design Tokens agnostica organizada no fluxo primitives > brand > semantics > theme, pronta para ser processada pelo Style Dictionary e consumida por qualquer stack. O projeto agora expõe uma API pública clara para frontend, recipes de composição por componente e um exemplo oficial de integração com Tailwind v4.
Publicação
O pacote esta preparado para publicação no npm público como @ceres_design_system/design-tokens.
Princípios de distribuição:
- publica apenas artefatos de consumo
- nao publica
tokens/,scripts/,examples/nem configuracao de build - continua agnostico de framework, mesmo tendo Next.js + Tailwind v4 + Framer Motion como cenarios de consumo alvo
Scripts de release:
npm run prepack: executa a cadeia oficial antes do empacotamentonpm run pack:check: inspeciona o tarball final comnpm pack --dry-run
Release Automatizada
O repositório inclui workflow de publish em GitHub Actions em .github/workflows/publish.yml.
Como configurar:
- gere um
Granular Access Tokenno npm com permissao deRead and write - habilite
Bypass 2FAno token, se a org exigir isso para publish - salve esse token como secret
NPM_TOKENemGitHub > Settings > Secrets and variables > Actions - o workflow publica automaticamente quando uma tag no formato
v*e enviada - o workflow tambem pode ser executado manualmente em
Actions > Publish Package - o workflow usa
NODE_AUTH_TOKENa partir do secretNPM_TOKEN
Fluxo recomendado de release:
npm version patch
git push origin main --follow-tagsRegra de seguranca do workflow:
- se a tag for
v0.1.1, opackage.jsonprecisa estar com"version": "0.1.1" - se os valores divergirem, o publish falha antes de enviar qualquer pacote
- se o npm da org exigir 2FA para publish, o token precisa ter
Bypass 2FA
Arquitetura
tokens/primitives: foundations brutas do sistema, como paletas base, spacing, radius, fontSize, fontWeight, lineHeight, fontStyle, opacity, blur, motion, material, layout, layer e escalas dimensionais auxiliares.tokens/brand/<brand>: camada de branding. Aqui entram a escalacolor.brand.*etypography.fontFamily.*.tokens/semantics: tokens com contexto de uso. Tipografia, size, effect, motion, layout e layer vivem aqui como contrato compartilhado.tokens/themes/dark: camada de override de modo. A cor semantica base representa o light default, e o dark sobrescreve apenas os tokens que realmente mudam.
API Publica
Os artefatos oficiais do sistema sao:
dist/<brand>/<mode>/theme.cssdist/<brand>/<mode>/tokens.jsondist/<brand>/<mode>/index.jsdist/manifest.jsondist/manifest.jsdocs/output-manifest.jsondocs/public-contract.mddocs/agent-guide.md
Politica oficial de contrato:
tokens/semantics/**= contrato publico basetokens/themes/dark/**= override publico de modotokens/primitives/**etokens/brand/**= internos
O source of truth continua semantico. A abreviacao de nomes acontece apenas na exportacao para DX com Tailwind.
Subpaths públicos de consumo:
@ceres_design_system/design-tokens/ceres/light@ceres_design_system/design-tokens/ceres/light.css@ceres_design_system/design-tokens/ceres/light.json- equivalentes para
ceres/dark,eris/light,eris/dark,pluto/light,pluto/dark @ceres_design_system/design-tokens/manifest@ceres_design_system/design-tokens/manifest.json@ceres_design_system/design-tokens/contract@ceres_design_system/design-tokens/agent-guide@ceres_design_system/design-tokens/recipes/<component>@ceres_design_system/design-tokens/recipes/<component>.json
Build e Distribuicao
- O projeto usa
style-dictionaryna linha atualv5. - Nao usa
@tokens-studio/sd-transforms; o source of truth e o JSON nativo do proprio repositório. - Dependencia necessaria neste repositório:
npm install -D style-dictionary- O consumidor do CSS e que deve ter
tailwindcssv4 no projeto de aplicacao; este repositório de tokens nao instala Tailwind. - O build gera duas saídas por
brand/mode:dist/<brand>/<mode>/theme.cssdist/<brand>/<mode>/tokens.json
- O build gera tambem um manifesto simples de outputs:
dist/manifest.jsondocs/output-manifest.json
- O CSS e gerado em formato misto:
@theme { ... }para namespaces compatíveis com o Tailwind v4:root { ... }para custom properties públicas sem namespace nativo em@theme
Regras
- O projeto privilegia o uso de tokens semanticos e de branding, mas isso e recomendacao de arquitetura, nao uma restricao dura.
- Usar foundations de
primitivesdireto no componente nao e o ideal para contexto e manutencao, mas nao e proibido. radiusnao varia por marca: o valor bruto vive apenas emtokens/primitives/radius.json.fontFamilyusa os papeisprimary,secondaryemono.primarye recomendado para titulos, subtitulos e destaques.secondarye recomendado para corpo de texto e demais usos correntes.shadowvive emtokens/semantics/effectcomoeffect.shadow.*, mantendo o contrato de efeito consistente com blur e opacity.opacityeblurvivem emprimitivescomo escala bruta e sobem parasemantics/effectapenas quando existe contexto real de uso.motionvive emprimitivescomo escala bruta de duration e easing, e sobe parasemantics/motionquando vira contrato de uso, como hover, dialog e page transition.color.material.*e a camada publica de composicao visual para glass, superficies translúcidas e bordas com highlight sem quebrar a separacao entre papel semantico e foundation interna.effect.blur.level.*eeffect.opacity.level.*expoem a escala composicional completa de blur e transparencia para qualquer componente, sem pedir acesso direto aprimitives.motion.duration.*,motion.easing.*emotion.transition.*agora cobrem tanto presets de componente quanto timing mais livre para composicoes maiores.layout,layer,borderWidth,componentHeighteicon-sizeseguem a mesma logica: escala bruta emprimitivese contratos de uso emsemantics.overlayestate-layerentram emsemantics/colore podem ser sobrescritos por modo nodarkquando a leitura visual pedir outro comportamento.- O contrato publico do build vem apenas de
tokens/semantics/**etokens/themes/dark/**. primitivesebrandentram na composicao do tema, mas nao sao exportados como API publica final.
Brands
ceres: marca padrao, com escalacolor.brand.*baseada emcolor.blue.*efontFamily.primary/secondaryem Inter.eris: marca com escalacolor.brand.*baseada emcolor.orange.*.pluto: marca com escalacolor.brand.*baseada emcolor.rose.*.
Integração com Tailwind v4
Instalacao esperada no app consumidor:
npm install @ceres_design_system/design-tokensUso em app/globals.css de um projeto Next.js:
@import "tailwindcss";
@import "@ceres_design_system/design-tokens/ceres/light.css";O build usa mapeamento automático com base nos paths públicos reais dos tokens:
color.background.surface.default->--color-surface->bg-surfacecolor.background.brand.default->--color-brand->bg-brandcolor.content.primary->--color-content-primary->text-content-primarycolor.foreground.default->--color-icon->fill-iconoutext-iconcolor.action.primary.background->--color-action-primary->bg-action-primarycolor.feedback.success.foreground->--color-on-success->text-on-successcolor.material.glass.surface->--color-material-glass-surface->bg-material-glass-surfacecolor.border.subtle->--color-line-subtle->border-line-subtletypography.*.fontFamily->--font-*typography.*.size*->--text-*typography.*.letterSpacing->--tracking-*typography.*.lineHeight->--leading-*size.spacing.*->--spacing-*size.radius.*->--radius-*effect.shadow.*->--shadow-*effect.blur.*->--blur-*motion.easing.*->--ease-*layout.breakpoint.*->--breakpoint-*layout.container.*->--container-*
Grupos sem namespace oficial em @theme continuam no mesmo theme.css como custom properties publicas comuns:
effect.opacity.*layer.zIndex.*motion.duration.*motion.transition.*layout.grid.*size.borderWidth.*size.componentHeight.*size.icon.*
Exemplo minimo oficial:
examples/tailwind-v4/app.cssexamples/tailwind-v4/index.htmlexamples/tailwind-v4/README.md
Consumo em TypeScript e Framer Motion
O pacote tambem expõe wrappers JS leves para evitar atrito com import de JSON em runtime:
import tokens from "@ceres_design_system/design-tokens/ceres/light";
import manifest from "@ceres_design_system/design-tokens/manifest";Exemplo de uso com motion no app consumidor:
import tokens from "@ceres_design_system/design-tokens/ceres/light";
const transition = {
duration: Number.parseFloat(tokens.motion.duration.fast) / 1000,
ease: tokens.motion.transition.hover.easing
};Exemplo de composicao glass no app consumidor:
.glass-button {
background:
linear-gradient(var(--color-material-glass-surface), var(--color-material-glass-surface)) padding-box,
linear-gradient(135deg, var(--color-material-glass-highlight), transparent 75%) border-box;
border: 1px solid transparent;
backdrop-filter: blur(var(--blur-surface-soft));
box-shadow: var(--shadow-sm);
transition:
transform var(--motion-transition-press-duration) var(--motion-transition-press-easing),
box-shadow var(--motion-transition-hover-duration) var(--motion-transition-hover-easing);
}O repositório nao instala nem depende de Framer Motion; ele apenas expõe os valores de motion de forma segura para consumo.
Recipes de Componentes
Recipes de composicao vivem fora de tokens/ e usam apenas paths publicos do contrato:
docs/recipes/button.jsondocs/recipes/input.jsondocs/recipes/card.jsondocs/recipes/modal.jsondocs/recipes/badge.jsondocs/recipes/toast.json
Esses arquivos respondem “quais tokens usar em um componente real?” sem transformar recipes em foundations do sistema.
Subpaths equivalentes para runtime:
@ceres_design_system/design-tokens/recipes/button@ceres_design_system/design-tokens/recipes/input@ceres_design_system/design-tokens/recipes/card@ceres_design_system/design-tokens/recipes/modal@ceres_design_system/design-tokens/recipes/badge@ceres_design_system/design-tokens/recipes/toast
Uso Pratico de Tokens
- Use
content.*para texto eforeground.*para icones, affordances e sinais graficos. - Use
action.*quando o componente realmente muda a superficie de fundo por variante ou estado. - Use
stateLayer.*quando o componente mantem a superficie base e recebe uma camada de interacao por cima. - Use
overlay.subtlepara foco leve em background eoverlay.scrimpara bloqueio mais forte em modais e drawers. - Para
focus, combinestateLayer.focus.*comborder.brand.defaultouline-brandno consumidor. - Para
disabled, prefira os tokens explicitos deaction.disabled,content.disabledeforeground.disabled. - Para
selected, prefirastateLayer.selected.*somado a border ou content de maior contraste quando necessario.
Scripts e Qualidade
npm run validate: valida JSON, referencias existentes e contratos compartilhados entre brands, alem da consistencia estrutural dos arquivos de override de modo quando existirem.npm run build: gera saidas CSS e JSON por marca/modo emdist/e atualiza os manifestos de output.npm run contract: geradocs/public-contract.mdcom o inventario do contrato publico derivado desemanticse dos overrides dedark.npm run smoke: executa smoke tests sobre os artefatos, manifestos e recipes.npm run check: executa validacao, build, contrato publico e smoke tests.npm run pack:check: verifica o shape final do pacote publicado sem publicar.
Governanca
- A validacao trata
themescomo override do contrato publico, nao como uma segunda fonte independente de paths. - Se
darktentar sobrescrever um token que nao existe emsemantics, a validacao falha. - Se
themessobrescrever algo fora decolor.*ou usar valor bruto, a validacao apenas alerta; isso continua como recomendacao arquitetural, nao como bloqueio duro. - O contrato publico pode ser materializado em
docs/public-contract.md, o que ajuda revisao, versionamento e consumo por outras equipes. - O manifesto de output formaliza quais combinacoes de brand/mode existem e onde seus artefatos publicos estao.
Saida gerada
Cada composicao final e exportada em:
dist/<brand>/<mode>/theme.cssdist/<brand>/<mode>/tokens.jsondist/<brand>/<mode>/index.jsdist/manifest.jsondist/manifest.jsdocs/output-manifest.json
O CSS usa @theme para os grupos compatíveis com o Tailwind v4 e custom properties normais para o restante do contrato publico. Isso evita gerar um tailwind.config.js e mantém o contrato dos tokens desacoplado do framework.
Na saida final, o contrato publico e exportado a partir de semantics + themes, sem expor automaticamente toda a camada primitives ou brand. O light usa diretamente a semantica como base, e o dark entra apenas como override.
Exemplo Real
Token público:
{
"color": {
"background": {
"brand": {
"default": {
"value": "{color.brand.500}"
}
}
}
}
}Saída no theme.css:
@theme {
--color-brand: #3b82f6;
}Uso previsto no Tailwind v4:
<div class="bg-brand"></div>Observacao: o source of truth continua semantico. O encurtamento acontece apenas na exportacao para Tailwind, preservando os paths internos do repositório.
Composicao de build
Cada tema final combina:
tokens/primitives/**/*.jsontokens/brand/<brand>/**/*.jsontokens/semantics/**/*.jsontokens/themes/dark/**/*.json
Exemplo:
ceres + light:primitives + brand + semanticsceres + dark:primitives + brand + semantics + themes/darkeris + light:primitives + brand + semanticseris + dark:primitives + brand + semantics + themes/darkpluto + light:primitives + brand + semanticspluto + dark:primitives + brand + semantics + themes/dark
