Pular para o conteúdo principal

Formatos de Output

Premissa

O Aplica Tokens Theme Engine gera os mesmos tokens em múltiplos formatos para atender consumidores com necessidades distintas. Cada formato tem suas unidades, convenções de naming e casos de uso específicos. A escolha certa do formato poupa trabalho de integração.


Onde os arquivos são gerados

dist/
├── json/ ← JSON estruturado (Figma, Tokens Studio)
│ ├── aplica_joy-light-positive-semantic.json
│ ├── aplica_joy-light-positive-foundation.json
│ ├── aplica_joy-dark-positive-semantic.json
│ └── ... (1 arquivo por combinação brand × mode × surface × tipo)
├── css/ ← CSS custom properties (Web)
│ ├── aplica_joy-light-positive.css
│ └── ...
│ └── foundation/ ← Classes CSS de Foundation Styles
│ └── {brand}/
│ ├── typography.css ← Classes compostas de tipografia
│ └── elevation.css ← Classes compostas de elevação
├── esm/ ← ES Modules (JavaScript moderno)
│ ├── aplica_joy-light-positive-semantic.mjs
│ └── ...
├── js/ ← CommonJS (Node.js, bundlers legados)
│ ├── aplica_joy-light-positive-semantic.js
│ └── ...
└── dts/ ← TypeScript declarations
├── aplica_joy-light-positive-semantic.d.ts
└── ...

O nome de cada arquivo de tokens segue o padrão: {brand}-{mode}-{surface}-{tipo}.{ext}

Foundation Styles seguem: dist/css/foundation/{brand}/typography.css e elevation.css


Formato JSON — para Figma e Tokens Studio

Unidade: px em todos os valores dimensionais
Uso: Consumo direto pelo Figma via Tokens Studio, sistemas que precisam de valores numéricos

{
"semantic": {
"color": {
"interface": {
"function": {
"primary": {
"normal": {
"background": { "$value": "#C40145", "$type": "color" },
"txtOn": { "$value": "#ffffff", "$type": "color" },
"border": { "$value": "#9c0136", "$type": "color" },
"txt": { "$value": "#7a0128", "$type": "color" }
}
}
}
}
},
"dimension": {
"spacing": {
"medium": { "$value": "32px", "$type": "spacing" }
}
}
}
}

O JSON mantém a estrutura hierárquica completa (semantic.color.interface...). Foundation é um arquivo separado com aliases que apontam para o Semantic:

{
"foundation": {
"bg": {
"primary": { "$value": "{semantic.color.interface.function.primary.normal.background}", "$type": "color" }
}
}
}

Output JSON tipado — jsonTyped (desde 3.7.0)

Uso: Tooling que precisa de metadata estruturada por token além do valor resolvido — geração AI-assistida de componentes, code generators, design linters

jsonTyped é a primeira plataforma de output com metadata configurável. Onde o json padrão emite { "$value": ..., "$type": ... }, o jsonTyped emite objetos com campos nomeados que você controla: type, value, description e path.

Estrutura do output

{
"semantic": {
"color": {
"interface": {
"function": {
"primary": {
"normal": {
"background": {
"type": "color",
"value": "#C40145",
"description": "Primary action background — normal intensity",
"path": "semantic.color.interface.function.primary.normal.background"
}
}
}
}
}
}
}
}

Como ativar

Adicione jsonTyped à lista platforms da camada e inclua formatOptions.jsonTyped em transformers.config.mjs:

export default defineTransformersConfig({
layers: {
semantic: { enabled: true, platforms: ['json', 'jsonTyped', 'css', 'esm'] },
// ...
},
formatOptions: {
jsonTyped: {
type: 'type',
value: 'value',
description: 'description', // omitir esta chave exclui description do output
path: 'path',
}
}
});

json vs jsonTyped

jsonjsonTyped
Campo de valor$valueconfigurável (padrão: value)
Campo de tipo$typeconfigurável (padrão: type)
Descriçãonão emitidoconfigurável (omitir chave para excluir)
Caminhonão emitidoconfigurável (padrão: path)
Backward compatiblesim — contrato json existente não muda

jsonTyped é aditivo: consumidores json existentes não são afetados. Habilite ambas as plataformas na mesma camada se precisar das duas.

Veja formatOptions.jsonTyped para a referência completa de campos.


Formato CSS — para Web

Unidade: rem em tokens dimensionais (tamanhos, espaçamentos, raios, tipografia)
Exceções em px: tokens com $type: "number" (ex.: semantic.depth.spread)
Uso: Aplicação web via CSS custom properties

Conversão px → rem

rem = px / baseFontSize (padrão: 16)
Token semânticoValor fonte (px)CSS output (rem)
dimension.spacing.medium32px2rem
dimension.spacing.nano4px0.25rem
typography.fontSizes.medium16px1rem
border.radius.medium8px0.5rem
depth.spread.level_two-2-2 (permanece número)

Por que rem? Dimensões em rem respeitam a preferência de tamanho de fonte do usuário no navegador. Se o usuário configurar o root para 20px, todos os espaçamentos e tamanhos escalam proporcionalmente — acessibilidade por construção.

Estrutura das variáveis CSS

/* aplica_joy-light-positive.css */
:root,
[data-theme="aplica_joy-light-positive"] {

/* Semantic — cores */
--semantic-color-interface-function-primary-normal-background: #C40145;
--semantic-color-interface-function-primary-normal-txt-on: #ffffff;
--semantic-color-interface-feedback-success-default-background: #D7F6CB;

/* Semantic — dimensões (rem) */
--semantic-dimension-spacing-medium: 2rem;
--semantic-dimension-spacing-small: 1.5rem;
--semantic-typography-font-sizes-medium: 1rem;
--semantic-border-radius-medium: 0.5rem;

/* Semantic — elevação (px, não converte) */
--semantic-depth-spread-level-two: -2;

/* Foundation — aliases */
--foundation-bg-primary: var(--semantic-color-interface-function-primary-normal-background);
--foundation-text-body: var(--semantic-color-text-body-default);
--foundation-spacing-medium: var(--semantic-dimension-spacing-medium);
}

Troca de tema em runtime

A troca de tema via CSS é feita por seletor de atributo:

<!-- Tema padrão: aplica_joy light positive -->
<html data-theme="aplica_joy-light-positive">

<!-- Trocar para dark -->
<html data-theme="aplica_joy-dark-positive">
document.documentElement.setAttribute('data-theme', 'aplica_joy-dark-positive');

Nenhum JavaScript adicional é necessário — a mudança de atributo ativa o CSS correspondente.


Formato ESM — para JavaScript moderno

Unidade: px (valores numéricos, sem conversão)
Uso: Aplicações React, Vue, bundlers modernos (Vite, esbuild, Rollup)

// aplica_joy-light-positive-semantic.mjs
export const semantic = {
color: {
interface: {
function: {
primary: {
normal: {
background: '#C40145',
txtOn: '#ffffff',
border: '#9c0136'
}
}
}
}
},
dimension: {
spacing: {
medium: '32px',
small: '24px'
}
}
};

Modo aliases vs modo raw:

  • Aliases (padrão): Foundation expõe referências ao Semantic (foundation.bg.primary{semantic.color.*})
  • Raw: Todos os tokens resolvidos para valores finais — útil para consumidores que não suportam referências W3C

O engine gera tokens alias por padrão. A resolução de valores finais acontece durante o build do Style Dictionary (tokens:build:all), então o output ESM que você consome em dist/ sempre contém valores resolvidos.


Formato CJS — para Node.js e bundlers legados

Unidade: px
Diretório: dist/js/
Uso: Node.js, Webpack, projetos que não suportam ESM nativo

// aplica_joy-light-positive-semantic.js
const semantic = {
color: { /* ... mesma estrutura do ESM */ }
};

module.exports = { semantic };

Formato TypeScript — para type-safety

Uso: Projetos TypeScript que querem autocompletar e checagem de tipos ao acessar tokens

// aplica_joy-light-positive-semantic.d.ts
export declare const semantic: {
color: {
interface: {
function: {
primary: {
normal: {
background: string;
txtOn: string;
border: string;
};
};
};
};
};
dimension: {
spacing: {
medium: string;
small: string;
// ...
};
};
};

Uso com autocompletar:

import { semantic } from './dist/esm/aplica_joy-light-positive-semantic.mjs';

const color = semantic.color.interface.function.primary.normal.background; // #C40145

Regra de consumo: qual camada usar

CenárioCamada recomendadaExemplo
Estilizar qualquer componenteSemanticvar(--semantic-color-interface-function-primary-normal-background)
Alias simples já existeFoundation (quando disponível)var(--foundation-bg-primary)
Cálculo em JavaScriptESM/CJS com Semantictokens.semantic.dimension.spacing.medium
Configurar tokens no FigmaJSON via Tokens Studioarquivo *-semantic.json
Nunca usar diretamentebrand.*, mode.*, surface.*Camadas internas — não fazem parte do contrato

A Foundation é um atalho para o Semantic — não o substitui como fonte de verdade. Se um alias Foundation não existe para o caso de uso, use o Semantic diretamente.


Naming das variáveis CSS

O ponto (.) dos caminhos de token é convertido para hífen (-) no CSS:

semantic.color.interface.function.primary.normal.background

--semantic-color-interface-function-primary-normal-background
foundation.bg.primary

--foundation-bg-primary

Tabela de comparação por formato

FormatoUnidadeEstruturaReferênciasUso principal
JSONpxNested com $value/$typeMantidas ({semantic.*})Figma, Tokens Studio
jsonTypedpxNested objects com campos nomeadosResolvidasTooling, geração AI-assistida
CSSrem (dimensões)Flat --var-name: valueResolvidasWeb — :root ou [data-theme]
ESMpxNested JS objectAliases (padrão) ou rawReact, Vue, Vite
CJSpxNested JS objectAliases (padrão) ou rawNode.js, Webpack
TypeScriptDeclarações de tipoAutocompletar, checagem de tipos

Configuração de unidades

Para reverter o CSS para px (ex.: ambientes sem suporte a rem):

// theme-engine/config/global/themes.config.json
{
"global": {
"dimension": {
"outputUnit": {
"css": "px",
"default": "px"
}
}
}
}

Para usar uma base diferente de 16px (ex.: estratégia 62.5% com 10px root):

{
"global": {
"dimension": {
"baseFontSize": 10
}
}
}

Foundation Styles — output de classes CSS compostas

Além das CSS custom properties por token, o engine gera arquivos de classes CSS compostas em dist/css/foundation/{brand}/. Esses arquivos são gerados a partir dos dados de Foundation Styles (data/foundation/{brand}/styles/typography_styles.json e elevation_styles.json) durante o step foundations:generate.

Classes de tipografia

/* dist/css/foundation/engine/typography.css */
.typography-engine-heading-title_1 {
font-family: var(--semantic-typography-fontFamilies-main);
font-weight: var(--semantic-typography-fontWeights-main-semibold-normal);
font-size: var(--semantic-typography-fontSizes-medium);
line-height: var(--semantic-typography-lineHeights-close-medium);
letter-spacing: var(--semantic-typography-letterSpacings-regular);
text-transform: var(--semantic-typography-textCase-uppercase);
text-decoration: var(--semantic-typography-textDecoration-default);
}

.typography-engine-action-strong-tight-medium { ... }
.typography-engine-body-regular-loose-medium { ... }

Classes de elevação

/* dist/css/foundation/engine/elevation.css */
.elevation-level_zero { box-shadow: ... }
.elevation-level_one { box-shadow: ... }
.elevation-level_two { box-shadow: ... }
.elevation-level_three { box-shadow: ... }
.elevation-level_four { box-shadow: ... }
.elevation-level_five { box-shadow: ... }

Cada classe compõe tokens semânticos de depth, spread e opacidade. Os valores resolvem a partir do tema ativo em runtime — a troca de tema os atualiza automaticamente.

Ordem de carregamento

<!-- Arquivo de tema deve carregar primeiro (fornece as --semantic-* custom properties) -->
<link rel="stylesheet" href="/dist/css/aplica_joy-light-positive.css" />

<!-- Foundation Styles consomem as custom properties definidas acima -->
<link rel="stylesheet" href="/dist/css/foundation/engine/typography.css" />
<link rel="stylesheet" href="/dist/css/foundation/engine/elevation.css" />

Veja 06-foundation-styles.md para o guia completo sobre Foundation Styles.


Referências