{"_id":"@ceres_design_system/design-tokens","_rev":"2-f79ca4f4725392858b4410af77bbfea9","name":"@ceres_design_system/design-tokens","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@ceres_design_system/design-tokens","version":"0.1.0","license":"MIT","_id":"@ceres_design_system/design-tokens@0.1.0","maintainers":[{"name":"kayroalex","email":"kayroalex@gmail.com"}],"homepage":"https://github.com/kayroalexandre/ceres","bugs":{"url":"https://github.com/kayroalexandre/ceres/issues"},"dist":{"shasum":"f9cc6dd0ff9e378480631cf8400b15f84083030e","tarball":"https://registry.npmjs.org/@ceres_design_system/design-tokens/-/design-tokens-0.1.0.tgz","fileCount":50,"integrity":"sha512-raIzFzMHHfDRmPwStcQa122evh1jMSiRkKTSqtA7ZRdXTaoZNeGKEH69+nOFOwk1XKbIzEXdTr0yvHrOhzhKVA==","signatures":[{"sig":"MEYCIQCthpoAvvfbm2O7ZfvLRneoiHackkkff/0mmK6A3pz8kAIhALp1C9Cyak+FRqPvCA9NxaxlNax51lXbDLP666T9TxUZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214056},"type":"module","exports":{"./contract":"./docs/public-contract.md","./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js"},"./eris/dark":{"types":"./dist/eris/dark/index.d.ts","import":"./dist/eris/dark/index.js"},"./ceres/dark":{"types":"./dist/ceres/dark/index.d.ts","import":"./dist/ceres/dark/index.js"},"./eris/light":{"types":"./dist/eris/light/index.d.ts","import":"./dist/eris/light/index.js"},"./pluto/dark":{"types":"./dist/pluto/dark/index.d.ts","import":"./dist/pluto/dark/index.js"},"./ceres/light":{"types":"./dist/ceres/light/index.d.ts","import":"./dist/ceres/light/index.js"},"./contract.md":"./docs/public-contract.md","./pluto/light":{"types":"./dist/pluto/light/index.d.ts","import":"./dist/pluto/light/index.js"},"./package.json":"./package.json","./recipes/card":{"types":"./dist/recipes/card.d.ts","import":"./dist/recipes/card.js"},"./eris/dark.css":"./dist/eris/dark/theme.css","./manifest.json":"./dist/manifest.json","./recipes/badge":{"types":"./dist/recipes/badge.d.ts","import":"./dist/recipes/badge.js"},"./recipes/input":{"types":"./dist/recipes/input.d.ts","import":"./dist/recipes/input.js"},"./recipes/modal":{"types":"./dist/recipes/modal.d.ts","import":"./dist/recipes/modal.js"},"./recipes/toast":{"types":"./dist/recipes/toast.d.ts","import":"./dist/recipes/toast.js"},"./ceres/dark.css":"./dist/ceres/dark/theme.css","./eris/dark.json":"./dist/eris/dark/tokens.json","./eris/light.css":"./dist/eris/light/theme.css","./pluto/dark.css":"./dist/pluto/dark/theme.css","./recipes/button":{"types":"./dist/recipes/button.d.ts","import":"./dist/recipes/button.js"},"./ceres/dark.json":"./dist/ceres/dark/tokens.json","./ceres/light.css":"./dist/ceres/light/theme.css","./eris/light.json":"./dist/eris/light/tokens.json","./pluto/dark.json":"./dist/pluto/dark/tokens.json","./pluto/light.css":"./dist/pluto/light/theme.css","./ceres/light.json":"./dist/ceres/light/tokens.json","./pluto/light.json":"./dist/pluto/light/tokens.json","./recipes/card.json":"./docs/recipes/card.json","./recipes/badge.json":"./docs/recipes/badge.json","./recipes/input.json":"./docs/recipes/input.json","./recipes/modal.json":"./docs/recipes/modal.json","./recipes/toast.json":"./docs/recipes/toast.json","./recipes/button.json":"./docs/recipes/button.json"},"gitHead":"0dab779f11ced5c34cb1485baf7957650622ec8a","private":false,"scripts":{"build":"node scripts/build-tokens.mjs","check":"npm run validate && npm run build && npm run contract && npm run smoke","smoke":"node scripts/smoke-test.mjs","prepack":"npm run check","contract":"node scripts/generate-public-contract.mjs","validate":"node scripts/validate-tokens.mjs","pack:check":"env npm_config_cache=/tmp/ceres-npm-cache npm pack --dry-run"},"_npmUser":{"name":"kayroalex","email":"kayroalex@gmail.com"},"repository":{"url":"git+https://github.com/kayroalexandre/ceres.git","type":"git"},"_npmVersion":"11.11.0","description":"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","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"25.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"style-dictionary":"5.1.1"},"_npmOperationalInternal":{"tmp":"tmp/design-tokens_0.1.0_1773745143377_0.9990740890947929","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ceres_design_system/design-tokens","version":"0.2.0","private":false,"type":"module","license":"MIT","homepage":"https://github.com/kayroalexandre/ceres","repository":{"type":"git","url":"git+https://github.com/kayroalexandre/ceres.git"},"bugs":{"url":"https://github.com/kayroalexandre/ceres/issues"},"publishConfig":{"access":"public"},"sideEffects":["**/*.css"],"exports":{"./package.json":"./package.json","./manifest":{"import":"./dist/manifest.js","types":"./dist/manifest.d.ts"},"./manifest.json":"./dist/manifest.json","./contract":"./docs/public-contract.md","./contract.md":"./docs/public-contract.md","./agent-guide":"./docs/agent-guide.md","./agent-guide.md":"./docs/agent-guide.md","./recipes/button":{"import":"./dist/recipes/button.js","types":"./dist/recipes/button.d.ts"},"./recipes/button.json":"./docs/recipes/button.json","./recipes/input":{"import":"./dist/recipes/input.js","types":"./dist/recipes/input.d.ts"},"./recipes/input.json":"./docs/recipes/input.json","./recipes/card":{"import":"./dist/recipes/card.js","types":"./dist/recipes/card.d.ts"},"./recipes/card.json":"./docs/recipes/card.json","./recipes/modal":{"import":"./dist/recipes/modal.js","types":"./dist/recipes/modal.d.ts"},"./recipes/modal.json":"./docs/recipes/modal.json","./recipes/badge":{"import":"./dist/recipes/badge.js","types":"./dist/recipes/badge.d.ts"},"./recipes/badge.json":"./docs/recipes/badge.json","./recipes/toast":{"import":"./dist/recipes/toast.js","types":"./dist/recipes/toast.d.ts"},"./recipes/toast.json":"./docs/recipes/toast.json","./ceres/light":{"import":"./dist/ceres/light/index.js","types":"./dist/ceres/light/index.d.ts"},"./ceres/light.css":"./dist/ceres/light/theme.css","./ceres/light.json":"./dist/ceres/light/tokens.json","./ceres/dark":{"import":"./dist/ceres/dark/index.js","types":"./dist/ceres/dark/index.d.ts"},"./ceres/dark.css":"./dist/ceres/dark/theme.css","./ceres/dark.json":"./dist/ceres/dark/tokens.json","./eris/light":{"import":"./dist/eris/light/index.js","types":"./dist/eris/light/index.d.ts"},"./eris/light.css":"./dist/eris/light/theme.css","./eris/light.json":"./dist/eris/light/tokens.json","./eris/dark":{"import":"./dist/eris/dark/index.js","types":"./dist/eris/dark/index.d.ts"},"./eris/dark.css":"./dist/eris/dark/theme.css","./eris/dark.json":"./dist/eris/dark/tokens.json","./pluto/light":{"import":"./dist/pluto/light/index.js","types":"./dist/pluto/light/index.d.ts"},"./pluto/light.css":"./dist/pluto/light/theme.css","./pluto/light.json":"./dist/pluto/light/tokens.json","./pluto/dark":{"import":"./dist/pluto/dark/index.js","types":"./dist/pluto/dark/index.d.ts"},"./pluto/dark.css":"./dist/pluto/dark/theme.css","./pluto/dark.json":"./dist/pluto/dark/tokens.json"},"scripts":{"build":"node scripts/build-tokens.mjs","validate":"node scripts/validate-tokens.mjs","contract":"node scripts/generate-public-contract.mjs","smoke":"node scripts/smoke-test.mjs","check":"npm run validate && npm run build && npm run contract && npm run smoke","prepack":"npm run check","pack:check":"env npm_config_cache=/tmp/ceres-npm-cache npm pack --dry-run"},"devDependencies":{"style-dictionary":"5.1.1"},"gitHead":"611f2cf9402a9f02aea11d2e85782a71d5c4ee19","_id":"@ceres_design_system/design-tokens@0.2.0","description":"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","_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-dauDR6/a1vMHRzxFvyTawLlQLaeH6c1W70NwMEQK/6S8SplWU8hNOrw/juvuwsXDXeo77/BCQtRpHbc2HFvxyg==","shasum":"d71ede1448652b0fe4b6431482f294c10958868f","tarball":"https://registry.npmjs.org/@ceres_design_system/design-tokens/-/design-tokens-0.2.0.tgz","fileCount":51,"unpackedSize":259313,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCWspCoOQqoMMUDtAoGkL48ycW6SYOnOFy6Zi96SecrOAIhAJdHlkp0cnpkIlne32sBgk2iQAOuqR1NppZqOQU0q0hr"}]},"_npmUser":{"name":"kayroalex","email":"kayroalex@gmail.com"},"directories":{},"maintainers":[{"name":"kayroalex","email":"kayroalex@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/design-tokens_0.2.0_1773771724119_0.027025805418931848"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-17T10:59:03.291Z","modified":"2026-03-17T18:22:04.422Z","0.1.0":"2026-03-17T10:59:03.518Z","0.2.0":"2026-03-17T18:22:04.270Z"},"bugs":{"url":"https://github.com/kayroalexandre/ceres/issues"},"license":"MIT","homepage":"https://github.com/kayroalexandre/ceres","repository":{"type":"git","url":"git+https://github.com/kayroalexandre/ceres.git"},"description":"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","maintainers":[{"name":"kayroalex","email":"kayroalex@gmail.com"}],"readme":"# Ceres Design Tokens\n\nBase 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.\n\n## Publicação\n\nO pacote esta preparado para publicação no npm público como `@ceres_design_system/design-tokens`.\n\nPrincípios de distribuição:\n\n- publica apenas artefatos de consumo\n- nao publica `tokens/`, `scripts/`, `examples/` nem configuracao de build\n- continua agnostico de framework, mesmo tendo Next.js + Tailwind v4 + Framer Motion como cenarios de consumo alvo\n\nScripts de release:\n\n- `npm run prepack`: executa a cadeia oficial antes do empacotamento\n- `npm run pack:check`: inspeciona o tarball final com `npm pack --dry-run`\n\n## Release Automatizada\n\nO repositório inclui workflow de publish em GitHub Actions em `.github/workflows/publish.yml`.\n\nComo configurar:\n\n- gere um `Granular Access Token` no npm com permissao de `Read and write`\n- habilite `Bypass 2FA` no token, se a org exigir isso para publish\n- salve esse token como secret `NPM_TOKEN` em `GitHub > Settings > Secrets and variables > Actions`\n- o workflow publica automaticamente quando uma tag no formato `v*` e enviada\n- o workflow tambem pode ser executado manualmente em `Actions > Publish Package`\n- o workflow usa `NODE_AUTH_TOKEN` a partir do secret `NPM_TOKEN`\n\nFluxo recomendado de release:\n\n```bash\nnpm version patch\ngit push origin main --follow-tags\n```\n\nRegra de seguranca do workflow:\n\n- se a tag for `v0.1.1`, o `package.json` precisa estar com `\"version\": \"0.1.1\"`\n- se os valores divergirem, o publish falha antes de enviar qualquer pacote\n- se o npm da org exigir 2FA para publish, o token precisa ter `Bypass 2FA`\n\n## Arquitetura\n\n- `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.\n- `tokens/brand/<brand>`: camada de branding. Aqui entram a escala `color.brand.*` e `typography.fontFamily.*`.\n- `tokens/semantics`: tokens com contexto de uso. Tipografia, size, effect, motion, layout e layer vivem aqui como contrato compartilhado.\n- `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.\n\n## API Publica\n\nOs artefatos oficiais do sistema sao:\n\n- `dist/<brand>/<mode>/theme.css`\n- `dist/<brand>/<mode>/tokens.json`\n- `dist/<brand>/<mode>/index.js`\n- `dist/manifest.json`\n- `dist/manifest.js`\n- `docs/output-manifest.json`\n- `docs/public-contract.md`\n- `docs/agent-guide.md`\n\nPolitica oficial de contrato:\n\n- `tokens/semantics/**` = contrato publico base\n- `tokens/themes/dark/**` = override publico de modo\n- `tokens/primitives/**` e `tokens/brand/**` = internos\n\nO source of truth continua semantico. A abreviacao de nomes acontece apenas na exportacao para DX com Tailwind.\n\nSubpaths públicos de consumo:\n\n- `@ceres_design_system/design-tokens/ceres/light`\n- `@ceres_design_system/design-tokens/ceres/light.css`\n- `@ceres_design_system/design-tokens/ceres/light.json`\n- equivalentes para `ceres/dark`, `eris/light`, `eris/dark`, `pluto/light`, `pluto/dark`\n- `@ceres_design_system/design-tokens/manifest`\n- `@ceres_design_system/design-tokens/manifest.json`\n- `@ceres_design_system/design-tokens/contract`\n- `@ceres_design_system/design-tokens/agent-guide`\n- `@ceres_design_system/design-tokens/recipes/<component>`\n- `@ceres_design_system/design-tokens/recipes/<component>.json`\n\n## Build e Distribuicao\n\n- O projeto usa `style-dictionary` na linha atual `v5`.\n- Nao usa `@tokens-studio/sd-transforms`; o source of truth e o JSON nativo do proprio repositório.\n- Dependencia necessaria neste repositório:\n\n```bash\nnpm install -D style-dictionary\n```\n\n- O consumidor do CSS e que deve ter `tailwindcss` v4 no projeto de aplicacao; este repositório de tokens nao instala Tailwind.\n- O build gera duas saídas por `brand/mode`:\n  - `dist/<brand>/<mode>/theme.css`\n  - `dist/<brand>/<mode>/tokens.json`\n- O build gera tambem um manifesto simples de outputs:\n  - `dist/manifest.json`\n  - `docs/output-manifest.json`\n- O CSS e gerado em formato misto:\n  - `@theme { ... }` para namespaces compatíveis com o Tailwind v4\n  - `:root { ... }` para custom properties públicas sem namespace nativo em `@theme`\n\n## Regras\n\n- O projeto privilegia o uso de tokens semanticos e de branding, mas isso e recomendacao de arquitetura, nao uma restricao dura.\n- Usar foundations de `primitives` direto no componente nao e o ideal para contexto e manutencao, mas nao e proibido.\n- `radius` nao varia por marca: o valor bruto vive apenas em `tokens/primitives/radius.json`.\n- `fontFamily` usa os papeis `primary`, `secondary` e `mono`.\n- `primary` e recomendado para titulos, subtitulos e destaques.\n- `secondary` e recomendado para corpo de texto e demais usos correntes.\n- `shadow` vive em `tokens/semantics/effect` como `effect.shadow.*`, mantendo o contrato de efeito consistente com blur e opacity.\n- `opacity` e `blur` vivem em `primitives` como escala bruta e sobem para `semantics/effect` apenas quando existe contexto real de uso.\n- `motion` vive em `primitives` como escala bruta de duration e easing, e sobe para `semantics/motion` quando vira contrato de uso, como hover, dialog e page transition.\n- `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.\n- `effect.blur.level.*` e `effect.opacity.level.*` expoem a escala composicional completa de blur e transparencia para qualquer componente, sem pedir acesso direto a `primitives`.\n- `motion.duration.*`, `motion.easing.*` e `motion.transition.*` agora cobrem tanto presets de componente quanto timing mais livre para composicoes maiores.\n- `layout`, `layer`, `borderWidth`, `componentHeight` e `icon-size` seguem a mesma logica: escala bruta em `primitives` e contratos de uso em `semantics`.\n- `overlay` e `state-layer` entram em `semantics/color` e podem ser sobrescritos por modo no `dark` quando a leitura visual pedir outro comportamento.\n- O contrato publico do build vem apenas de `tokens/semantics/**` e `tokens/themes/dark/**`.\n- `primitives` e `brand` entram na composicao do tema, mas nao sao exportados como API publica final.\n\n## Brands\n\n- `ceres`: marca padrao, com escala `color.brand.*` baseada em `color.blue.*` e `fontFamily.primary/secondary` em Inter.\n- `eris`: marca com escala `color.brand.*` baseada em `color.orange.*`.\n- `pluto`: marca com escala `color.brand.*` baseada em `color.rose.*`.\n\n## Integração com Tailwind v4\n\nInstalacao esperada no app consumidor:\n\n```bash\nnpm install @ceres_design_system/design-tokens\n```\n\nUso em `app/globals.css` de um projeto Next.js:\n\n```css\n@import \"tailwindcss\";\n@import \"@ceres_design_system/design-tokens/ceres/light.css\";\n```\n\nO build usa mapeamento automático com base nos paths públicos reais dos tokens:\n\n- `color.background.surface.default` -> `--color-surface` -> `bg-surface`\n- `color.background.brand.default` -> `--color-brand` -> `bg-brand`\n- `color.content.primary` -> `--color-content-primary` -> `text-content-primary`\n- `color.foreground.default` -> `--color-icon` -> `fill-icon` ou `text-icon`\n- `color.action.primary.background` -> `--color-action-primary` -> `bg-action-primary`\n- `color.feedback.success.foreground` -> `--color-on-success` -> `text-on-success`\n- `color.material.glass.surface` -> `--color-material-glass-surface` -> `bg-material-glass-surface`\n- `color.border.subtle` -> `--color-line-subtle` -> `border-line-subtle`\n- `typography.*.fontFamily` -> `--font-*`\n- `typography.*.size*` -> `--text-*`\n- `typography.*.letterSpacing` -> `--tracking-*`\n- `typography.*.lineHeight` -> `--leading-*`\n- `size.spacing.*` -> `--spacing-*`\n- `size.radius.*` -> `--radius-*`\n- `effect.shadow.*` -> `--shadow-*`\n- `effect.blur.*` -> `--blur-*`\n- `motion.easing.*` -> `--ease-*`\n- `layout.breakpoint.*` -> `--breakpoint-*`\n- `layout.container.*` -> `--container-*`\n\nGrupos sem namespace oficial em `@theme` continuam no mesmo `theme.css` como custom properties publicas comuns:\n\n- `effect.opacity.*`\n- `layer.zIndex.*`\n- `motion.duration.*`\n- `motion.transition.*`\n- `layout.grid.*`\n- `size.borderWidth.*`\n- `size.componentHeight.*`\n- `size.icon.*`\n\nExemplo minimo oficial:\n\n- `examples/tailwind-v4/app.css`\n- `examples/tailwind-v4/index.html`\n- `examples/tailwind-v4/README.md`\n\n## Consumo em TypeScript e Framer Motion\n\nO pacote tambem expõe wrappers JS leves para evitar atrito com import de JSON em runtime:\n\n```ts\nimport tokens from \"@ceres_design_system/design-tokens/ceres/light\";\nimport manifest from \"@ceres_design_system/design-tokens/manifest\";\n```\n\nExemplo de uso com motion no app consumidor:\n\n```ts\nimport tokens from \"@ceres_design_system/design-tokens/ceres/light\";\n\nconst transition = {\n  duration: Number.parseFloat(tokens.motion.duration.fast) / 1000,\n  ease: tokens.motion.transition.hover.easing\n};\n```\n\nExemplo de composicao glass no app consumidor:\n\n```css\n.glass-button {\n  background:\n    linear-gradient(var(--color-material-glass-surface), var(--color-material-glass-surface)) padding-box,\n    linear-gradient(135deg, var(--color-material-glass-highlight), transparent 75%) border-box;\n  border: 1px solid transparent;\n  backdrop-filter: blur(var(--blur-surface-soft));\n  box-shadow: var(--shadow-sm);\n  transition:\n    transform var(--motion-transition-press-duration) var(--motion-transition-press-easing),\n    box-shadow var(--motion-transition-hover-duration) var(--motion-transition-hover-easing);\n}\n```\n\nO repositório nao instala nem depende de Framer Motion; ele apenas expõe os valores de motion de forma segura para consumo.\n\n## Recipes de Componentes\n\nRecipes de composicao vivem fora de `tokens/` e usam apenas paths publicos do contrato:\n\n- `docs/recipes/button.json`\n- `docs/recipes/input.json`\n- `docs/recipes/card.json`\n- `docs/recipes/modal.json`\n- `docs/recipes/badge.json`\n- `docs/recipes/toast.json`\n\nEsses arquivos respondem “quais tokens usar em um componente real?” sem transformar recipes em foundations do sistema.\n\nSubpaths equivalentes para runtime:\n\n- `@ceres_design_system/design-tokens/recipes/button`\n- `@ceres_design_system/design-tokens/recipes/input`\n- `@ceres_design_system/design-tokens/recipes/card`\n- `@ceres_design_system/design-tokens/recipes/modal`\n- `@ceres_design_system/design-tokens/recipes/badge`\n- `@ceres_design_system/design-tokens/recipes/toast`\n\n## Uso Pratico de Tokens\n\n- Use `content.*` para texto e `foreground.*` para icones, affordances e sinais graficos.\n- Use `action.*` quando o componente realmente muda a superficie de fundo por variante ou estado.\n- Use `stateLayer.*` quando o componente mantem a superficie base e recebe uma camada de interacao por cima.\n- Use `overlay.subtle` para foco leve em background e `overlay.scrim` para bloqueio mais forte em modais e drawers.\n- Para `focus`, combine `stateLayer.focus.*` com `border.brand.default` ou `line-brand` no consumidor.\n- Para `disabled`, prefira os tokens explicitos de `action.disabled`, `content.disabled` e `foreground.disabled`.\n- Para `selected`, prefira `stateLayer.selected.*` somado a border ou content de maior contraste quando necessario.\n\n## Scripts e Qualidade\n\n- `npm run validate`: valida JSON, referencias existentes e contratos compartilhados entre brands, alem da consistencia estrutural dos arquivos de override de modo quando existirem.\n- `npm run build`: gera saidas CSS e JSON por marca/modo em `dist/` e atualiza os manifestos de output.\n- `npm run contract`: gera `docs/public-contract.md` com o inventario do contrato publico derivado de `semantics` e dos overrides de `dark`.\n- `npm run smoke`: executa smoke tests sobre os artefatos, manifestos e recipes.\n- `npm run check`: executa validacao, build, contrato publico e smoke tests.\n- `npm run pack:check`: verifica o shape final do pacote publicado sem publicar.\n\n## Governanca\n\n- A validacao trata `themes` como override do contrato publico, nao como uma segunda fonte independente de paths.\n- Se `dark` tentar sobrescrever um token que nao existe em `semantics`, a validacao falha.\n- Se `themes` sobrescrever algo fora de `color.*` ou usar valor bruto, a validacao apenas alerta; isso continua como recomendacao arquitetural, nao como bloqueio duro.\n- O contrato publico pode ser materializado em `docs/public-contract.md`, o que ajuda revisao, versionamento e consumo por outras equipes.\n- O manifesto de output formaliza quais combinacoes de brand/mode existem e onde seus artefatos publicos estao.\n\n## Saida gerada\n\nCada composicao final e exportada em:\n\n- `dist/<brand>/<mode>/theme.css`\n- `dist/<brand>/<mode>/tokens.json`\n- `dist/<brand>/<mode>/index.js`\n- `dist/manifest.json`\n- `dist/manifest.js`\n- `docs/output-manifest.json`\n\nO 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.\n\nNa 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.\n\n### Exemplo Real\n\nToken público:\n\n```json\n{\n  \"color\": {\n    \"background\": {\n      \"brand\": {\n        \"default\": {\n          \"value\": \"{color.brand.500}\"\n        }\n      }\n    }\n  }\n}\n```\n\nSaída no `theme.css`:\n\n```css\n@theme {\n  --color-brand: #3b82f6;\n}\n```\n\nUso previsto no Tailwind v4:\n\n```html\n<div class=\"bg-brand\"></div>\n```\n\nObservacao: o source of truth continua semantico. O encurtamento acontece apenas na exportacao para Tailwind, preservando os paths internos do repositório.\n\n## Composicao de build\n\nCada tema final combina:\n\n- `tokens/primitives/**/*.json`\n- `tokens/brand/<brand>/**/*.json`\n- `tokens/semantics/**/*.json`\n- `tokens/themes/dark/**/*.json`\n\nExemplo:\n\n- `ceres + light`: `primitives + brand + semantics`\n- `ceres + dark`: `primitives + brand + semantics + themes/dark`\n- `eris + light`: `primitives + brand + semantics`\n- `eris + dark`: `primitives + brand + semantics + themes/dark`\n- `pluto + light`: `primitives + brand + semantics`\n- `pluto + dark`: `primitives + brand + semantics + themes/dark`\n","readmeFilename":"README.md"}