Pular para o conteúdo principal

Consumindo Tokens de dist/

Público

Este artigo é para desenvolvedores que recebem uma pasta dist/ — seja de um colega que rodou o engine, de um artefato de CI/CD ou de um pacote npm publicado — e precisam integrar esses tokens em uma aplicação. Você não precisa instalar @aplica/aplica-theme-engine nem executar nenhum comando do engine.


O que você recebe

A pasta dist/ contém os mesmos tokens em múltiplos formatos, todos referenciando os mesmos valores subjacentes:

dist/
├── json/ ← JSON com valores em px (Figma, Tokens Studio, uso universal)
├── css/ ← CSS custom properties com rem (Web)
├── esm/ ← ES Modules com px (React, Vue, bundlers modernos)
├── js/ ← CommonJS com px (Node.js, bundlers legados)
└── dts/ ← TypeScript declarations (type safety)

Cada arquivo tem o nome de uma variante de tema: {brand}-{mode}-{surface}.{ext}

Exemplos:

  • aplica_joy-light-positive.css — brand Aplica Joy, modo light, surface positiva
  • aplica_joy-dark-positive-semantic.json — mesma brand, modo dark, camada semântica

Escolha o formato que corresponde à sua plataforma e importe apenas a variante que precisar.


Duas camadas de token

Todo dist/ contém duas camadas. Use Foundation para o trabalho de produto do dia-a-dia; use Semantic quando Foundation não tiver o que você precisa.

CamadaNamespaceNomes de tokenQuando usar
Foundationfoundation.*Aliases curtos: foundation.bg.primary, foundation.txt.bodyMaioria dos componentes de produto
Semanticsemantic.*Nomes completos: semantic.color.interface.function.primary.normal.backgroundQuando não existe alias Foundation

Nunca use brand.*, mode.* ou surface.* — essas são camadas internas do pipeline, não fazem parte do contrato público.


CSS (Web)

Importar o stylesheet do tema

<!-- Opção 1: tag link -->
<link rel="stylesheet" href="./dist/css/aplica_joy-light-positive.css">
// Opção 2: import via bundler (Vite, Webpack, etc.)
import './dist/css/aplica_joy-light-positive.css';

Usar as variáveis CSS

.button-primary {
background-color: var(--foundation-bg-primary);
color: var(--foundation-txt-on-primary);
padding: var(--foundation-spacing-medium);
border-radius: var(--foundation-radius-medium);
}

/* Ou com Semantic quando Foundation não cobre o caso */
.custom-element {
border-color: var(--semantic-color-interface-function-primary-normal-border);
}

Troca de tema em runtime

Os temas CSS são ativados por um atributo data-theme — nenhum JavaScript adicional é necessário além de definir o atributo:

// Trocar para dark mode
document.documentElement.setAttribute('data-theme', 'aplica_joy-dark-positive');

// Trocar de brand
document.documentElement.setAttribute('data-theme', 'minha_marca-light-positive');

Carregue todos os stylesheets de tema que o app suporta e troque entre eles mudando o atributo:

<link rel="stylesheet" href="./dist/css/aplica_joy-light-positive.css">
<link rel="stylesheet" href="./dist/css/aplica_joy-dark-positive.css">
<link rel="stylesheet" href="./dist/css/minha_marca-light-positive.css">

ESM — React, Vue, Vite

Importar tokens como objetos JavaScript

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

// Camada Foundation
import { foundation } from './dist/esm/foundation/engine/foundation.mjs';

Exemplo de componente React

import { foundation } from '../dist/esm/foundation/engine/foundation.mjs';

export function Button({ children }) {
return (
<button
style={{
backgroundColor: foundation.bg.primary,
color: foundation.txt.onPrimary,
padding: foundation.spacing.medium,
borderRadius: foundation.radius.medium,
}}
>
{children}
</button>
);
}

TypeScript com autocompletar

import type { Foundation } from './dist/dts/foundation/engine/foundation.d.ts';
import { foundation } from './dist/esm/foundation/engine/foundation.mjs';

const bg: string = foundation.bg.primary;

Next.js

Estilos globais (App Router)

// app/layout.tsx
import '../dist/css/aplica_joy-light-positive.css';

export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="pt-BR" data-theme="aplica_joy-light-positive">
<body>{children}</body>
</html>
);
}

Server components

Variáveis CSS funcionam em server components — não é necessário JavaScript no client para estilizar.

Troca dinâmica de tema (client component)

'use client';
import { useState } from 'react';

export function ThemeSwitcher() {
const [mode, setMode] = useState<'light' | 'dark'>('light');

const toggle = () => {
const next = mode === 'light' ? 'dark' : 'light';
document.documentElement.setAttribute('data-theme', `aplica_joy-${next}-positive`);
setMode(next);
};

return <button onClick={toggle}>Alternar para {mode === 'light' ? 'Dark' : 'Light'}</button>;
}

React Native

O React Native não suporta CSS custom properties. Use o formato JSON ou ESM e aplique os valores via StyleSheet.create:

import { foundation } from '../dist/esm/foundation/engine/foundation.mjs';
import { StyleSheet } from 'react-native';

const styles = StyleSheet.create({
button: {
backgroundColor: foundation.bg.primary,
paddingHorizontal: parseInt(foundation.spacing.medium, 10),
borderRadius: parseInt(foundation.radius.medium, 10),
},
buttonText: {
color: foundation.txt.onPrimary,
},
});

Nota sobre unidades: Valores ESM incluem o sufixo px ('32px'). Use parseInt(value, 10) ou parseFloat(value) ao passar para props de estilo do React Native que esperam números.


Flutter / Dart

Use o formato JSON para carregar tokens no Flutter:

import 'dart:convert';
import 'package:flutter/services.dart';

Future<Map<String, dynamic>> loadTokens() async {
final jsonStr = await rootBundle.loadString(
'assets/tokens/aplica_joy-light-positive-foundation.json'
);
return json.decode(jsonStr) as Map<String, dynamic>;
}

Adicione o arquivo JSON nos assets do pubspec.yaml:

flutter:
assets:
- assets/tokens/aplica_joy-light-positive-foundation.json

CSS puro (sem bundler)

Vincule o CSS diretamente. Todas as variáveis têm escopo em :root e [data-theme]:

<!DOCTYPE html>
<html data-theme="aplica_joy-light-positive">
<head>
<link rel="stylesheet" href="dist/css/aplica_joy-light-positive.css">
<style>
body {
background: var(--foundation-bg-page);
color: var(--foundation-txt-body);
font-family: var(--foundation-font-main);
}
</style>
</head>
</html>

Catálogo de tokens Foundation

A camada Foundation fornece os aliases que a maioria dos componentes de produto precisa. Tokens comuns:

TokenPropósito
foundation.bg.primaryBackground de ação primária
foundation.bg.secondaryBackground de ação secundária
foundation.bg.pageBackground de página/canvas
foundation.bg.surfaceSuperfície de card/painel
foundation.txt.bodyCor de texto de corpo
foundation.txt.headingCor de texto de título
foundation.txt.onPrimaryTexto sobre background primário
foundation.txt.mutedTexto secundário/apagado
foundation.txt.linkCor de link
foundation.spacing.nanoEquivalente a 4px
foundation.spacing.smallEquivalente a 12–16px
foundation.spacing.mediumEquivalente a 24–32px
foundation.spacing.largeEquivalente a 48px
foundation.radius.smallBorder radius pequeno
foundation.radius.mediumBorder radius padrão
foundation.radius.pillRadius pill/arredondado
foundation.font.mainFamília de fonte principal
foundation.font.displayFonte de display/título

Quando não existir um alias Foundation para o seu caso, use Semantic diretamente: semantic.color.interface.function.primary.normal.background.


Referências