02.12 — Arquitetura CSS
CAMADAS DO SISTEMA.
O CSS do sistema Dark n' Black está organizado em camadas com responsabilidades claras. Cada arquivo tem um escopo definido — entender essa hierarquia evita conflitos, duplicação e override acidental.
Stack: Next.js App Router · CSS custom properties · CSS Modules · Zero CSS-in-JS · Zero Tailwind
Hierarquia de Camadas
01
tokens.css
Custom properties :root — única fonte de verdade
02
globals.css
@import tokens.css · reset · body · utilitários globais
03
components.module.css
Classes de componentes · CSS Modules · importado em UI.tsx
04
layout.tsx
import '@/styles/globals.css' · ponto de entrada único
FLUXO DE DEPENDÊNCIA → tokens.css ← globals.css ← layout.tsx | components.module.css ← UI.tsx ← páginas
Descrição de Cada Camada
Ordem de Importação
src/app/layout.tsx — único ponto de entrada
// 1. Importação global — UMA VEZ, no root layout import '@/styles/globals.css' // globals.css já importa tokens.css internamente // 2. NÃO importe globals.css em páginas individuais // 3. NÃO importe tokens.css separadamente (globals já faz isso) // Para componentes individuais, use CSS Modules: // import styles from '@/styles/components.module.css'
src/styles/globals.css — importação interna
/* Sempre primeiro — tokens devem existir antes de serem usados */
@import './tokens.css';
/* Depois vêm os estilos que consomem os tokens */
body {
background: var(--black-rich);
color: var(--white);
}Como Estender o Sistema
Adicionando tokens novos — em tokens.css
:root {
/* Adicione APÓS os tokens existentes, nunca sobrescrevendo */
--meu-token-novo: #valor;
/* Nomeie seguindo a convenção: --categoria-variante */
--client-accent: #ff5500; /* acento de um cliente específico */
}Adicionando um componente — em components.module.css
/* Siga o padrão existente: nome em camelCase, modificadores compostos */
.meuComponente {
background: var(--black-card);
border: 1px solid var(--border);
padding: var(--space-md);
font-family: var(--font-body);
}
.meuComponenteDestaque {
border-left: 3px solid var(--gold);
}
/* NUNCA coloque valores hardcoded — sempre var(--token) */Adicionando estilo de página — inline no .tsx
// Em páginas do App Router, estilos inline são a prática padrão
// Eles também usam var(--token) — nunca valores hardcoded
export default function MinhaPage() {
return (
<div>
<h1 style={{
fontFamily: 'var(--font-display)', // não 'Bebas Neue'
fontSize: 64, // ou var(--text-hero)
color: 'var(--white)', // não #f0ece4
}}>
TÍTULO
</h1>
</div>
)
}Convenções de Nomenclatura
Adicione, nunca sobrescreva. Se precisar mudar um valor de token para um projeto específico, declare um token novo com nome próprio. Sobrescrever --gold quebra todos os componentes que dependem dele.
Sem valores fora de tokens. Nenhum #c8a44e ou 16px hardcoded em nenhum arquivo CSS ou style prop. Se o token não existe, crie-o primeiro em tokens.css.
