Setup de tema
Como ligar CmThemeProvider, CmThemeScript e CmThemeToggle.
Provider no App Router
Os componentes que leem tema precisam estar dentro de CmThemeProvider. CmThemeScript aplica os tokens antes da interação do usuário.
import { CmThemeProvider, CmThemeScript } from "cosmemilton-ui";
export function AppProviders({ children }) {
return (
<>
<CmThemeScript />
<CmThemeProvider>{children}</CmThemeProvider>
</>
);
}Troca de tema
Use CmThemeToggle quando quiser expor todos os temas cadastrados na biblioteca. Em headers apertados, prefira presentation="compact" com labelVisibility="desktop" e align="end" para preservar espaço horizontal.
import { CmThemeToggle } from "cosmemilton-ui";
export function Header() {
return <CmThemeToggle presentation="compact" labelVisibility="desktop" align="end" />;
}Tema customizado
Para adicionar identidade própria no app consumidor, crie um ThemeConfig. Em Next/SSR, passe o mesmo registro para CmThemeScript e CmThemeProvider para evitar troca visual tardia. Em React puro, Vite ou CRA, registre customThemes apenas no CmThemeProvider.
import {
CmThemeProvider,
CmThemeScript,
type ThemeConfig
} from "cosmemilton-ui";
const acmeTheme: ThemeConfig = {
name: "acme",
colors: {
background: "#fbfaf7",
foreground: "#20201d",
muted: "#ede7dc",
mutedForeground: "#6f675d",
card: "#ffffff",
cardForeground: "#20201d",
popover: "#ffffff",
popoverForeground: "#20201d",
primary: "#2f4f46",
primaryForeground: "#ffffff",
secondary: "#d9cbb8",
secondaryForeground: "#20201d",
accent: "#b85c38",
accentForeground: "#ffffff",
success: "#2f855a",
successForeground: "#ffffff",
warning: "#b7791f",
warningForeground: "#20201d",
danger: "#c2413a",
dangerForeground: "#ffffff",
info: "#2563a8",
infoForeground: "#ffffff",
border: "#ddd5c8",
input: "#d1c7b8",
ring: "#2f4f46",
selection: "#dbe8df",
selectionForeground: "#20201d",
overlay: "rgba(32, 32, 29, 0.48)"
},
typography: {
fontFamily: '"Avenir Next", "Segoe UI", sans-serif',
monospaceFamily: '"JetBrains Mono", monospace',
baseSize: "16px",
scaleRatio: 1.2
},
radii: {
xs: "0.125rem",
sm: "0.25rem",
md: "0.5rem",
lg: "0.75rem",
xl: "1rem",
full: "9999px"
},
shadows: {
xs: "0 1px 2px 0 rgba(32, 32, 29, 0.06)",
sm: "0 1px 3px 0 rgba(32, 32, 29, 0.10)",
md: "0 12px 30px -20px rgba(47, 79, 70, 0.34)",
lg: "0 24px 56px -32px rgba(47, 79, 70, 0.38)",
xl: "0 36px 84px -42px rgba(47, 79, 70, 0.42)"
}
};
const customThemes = [acmeTheme];
export function AppProviders({ children }) {
return (
<>
<CmThemeScript
customThemes={customThemes}
defaultThemeName="acme"
/>
<CmThemeProvider
customThemes={customThemes}
defaultThemeName="acme"
>
{children}
</CmThemeProvider>
</>
);
}Tema customizado em Vite ou CRA
Apps sem SSR não precisam de CmThemeScript. Importe o CSS uma vez no entrypoint e passe customThemes direto no CmThemeProvider.
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "cosmemilton-ui/styles.css";
import {
CmThemeProvider,
themes,
type ThemeConfig
} from "cosmemilton-ui";
import { App } from "./App";
const baseTheme = themes["cm-neutral"];
const customThemes: ThemeConfig[] = [
{
...baseTheme,
name: "cm-brand",
colors: {
...baseTheme.colors,
background: "#f8fafc",
foreground: "#172033",
card: "#ffffff",
cardForeground: "#172033",
primary: "#006b5f",
primaryForeground: "#ffffff",
secondary: "#395b64",
secondaryForeground: "#ffffff",
border: "#d7dee7",
ring: "#006b5f"
}
}
];
createRoot(document.getElementById("root")!).render(
<StrictMode>
<CmThemeProvider customThemes={customThemes} defaultThemeName="cm-brand">
<App />
</CmThemeProvider>
</StrictMode>,
);