# 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.
```ts title="frontend/src/app/theme.ts"
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 ``). 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
```tsx title="frontend/src/app/app.tsx"
export const app = defineOonApp({
// ...
themes: [claro, escuro],
defaultThemeId: claro.id,
});
```
```tsx title="frontend/src/components/ThemeToggle.tsx"
import { useOonTheme } from "@oondemand/oon-core-front/theme";
export function ThemeToggle() {
const { themes, currentThemeId, setTheme } = useOonTheme();
return (
);
}
```
A preferência fica local ao navegador (`localStorage`, chave `oon:theme:`). Registre o seletor no slot `topbarEnd` para colocá-lo no cabeçalho do Core.
> [!TIP]
> Este site usa exatamente esse mecanismo: dois temas (`site-dark` e `site-light`) registrados em `themes`, alternados por `useOonTheme().setTheme`.
Fonte: https://sdk.oonapps.com/docs/frontend/temas