Temas
createOonTheme, tokens semânticos, densidade, contraste e troca de tema em runtime com useOonTheme.
A identidade visual padrão das Centrais — azul operacional, superfícies claras, tipografia Poppins e alta densidade — está em oonDefaultTheme. Cada App pode estendê-la com tokens do Chakra UI v3, sem CSS remoto.
import { createOonTheme, oonDefaultTheme } from "@oondemand/oon-core-front/theme";
export const theme = createOonTheme({
id: "minha-central",
label: "Minha Central",
extends: oonDefaultTheme,
density: "comfortable", // "compact" | "comfortable"
contrast: "standard", // "standard" | "high"
config: {
theme: {
tokens: {
colors: { brand: { 500: { value: "#176B87" }, 600: { value: "#10536A" } } },
},
},
},
});
| Propriedade | Descrição |
|---|---|
id |
Obrigatório. Minúsculas, números e hífen |
label |
Nome exibido em seletores |
extends |
Tema base (não pode estender a si mesmo) |
density |
compact reduz fonte e altura de controles |
contrast |
high reforça texto e bordas |
config |
Configuração pública do Chakra (theme.tokens, semanticTokens, globalCss) |
Tokens semânticos
| Grupo | Tokens |
|---|---|
brand |
solid, contrast, fg, muted, subtle, emphasized, focusRing (+ escala brand.25…900) |
surface |
canvas, panel, elevated, hover (0.7.35) |
text |
primary, muted, inverse |
border |
default, strong |
status |
success, warning, danger, info |
Desde a 0.7.35 os tokens semânticos do tema padrão têm valor escuro (_dark) e o shell — menu lateral, cabeçalho e tela de carregamento — usa apenas tokens semânticos, acompanhando um tema escuro (classe dark no <html>). Apps que já definem esses tokens mantêm os seus.
Use-os nos seus componentes Chakra: color="text.muted", bg="surface.panel", borderColor="border.default".
Vários temas e troca em runtime
export const app = defineOonApp({
// ...
themes: [claro, escuro],
defaultThemeId: claro.id,
});
import { useOonTheme } from "@oondemand/oon-core-front/theme";
export function ThemeToggle() {
const { themes, currentThemeId, setTheme } = useOonTheme();
return (
<select value={currentThemeId} onChange={(e) => setTheme(e.target.value)} aria-label="Tema">
{themes.map((t) => <option key={t.id} value={t.id}>{t.label ?? t.id}</option>)}
</select>
);
}
A preferência fica local ao navegador (localStorage, chave oon:theme:<app.id>). Registre o seletor no slot topbarEnd para colocá-lo no cabeçalho do Core.