Saltar al contenido
Alea0.1
Pro
  1. Alea
  2. Componentes
  3. Extras
  4. ThemeProvider e interruptor

Extras

ThemeProvider e interruptor

Oscuro, claro o del sistema, recordado, con un interruptor en dos estilos.

import { ThemeProvider, ThemeToggle, useTheme } from '@alea/ui';

Ejemplos

Interruptor de tema

Un botón de ícono que cambia entre oscuro y claro, o un control segmentado con system.

Picked: dark · showing: dark

Provider

Envuelve la app una vez. scope="element" aplica el tema a un área en lugar de la página.

Always light

This area has its own provider.

Props

ThemeProvider props

Pone los tokens de Alea en modo oscuro, claro o del sistema y comparte la elección.

PropTipoPor defectoDescripción
brandBrandTheme-Cambios de marca: color de acento, radio, densidad, fuentes.
classNamestring-Clases para el contenedor (scope="element").
contrast"normal" | "system" | "more"'system'system (por defecto) sube el contraste cuando el dispositivo lo pide; more siempre lo sube a WCAG AAA (texto a 7:1, bordes más fuertes); normal nunca lo hace.
defaultTheme"dark" | "light" | "system"'dark'Tema al inicio cuando no hay nada guardado. Por defecto oscuro.
localestring-Un locale BCP 47 ("es-ES", "pt-BR"): las fechas, números, calendarios y etiquetas incluidas lo siguen. Por defecto el del navegador.
motionMotionConfig-Movimiento para todo lo de abajo: mode (expressive, productive, reduced, off), reduced (system, always, never), speed, intensity, y valores por defecto por componente.
navigate((path: string, options?: any) => void)-La función navigate de tu router (useNavigate() de React Router, router.push de Next): los enlaces del kit navegan sin recargar.
onThemeChange((theme: "dark" | "light" | "system") => void)-Se llama con el nuevo tema cuando cambia.
preset"default" | "graphite"'default'Un estilo sobre los tokens: "graphite" es monocromo (casi negro y blanco, superficies grises, títulos sans), pensado para diseños bento.
scope"document" | "element"'document'Dónde va data-theme: la raíz del documento (por defecto) o un div contenedor.
storageKeystring | null'alea-theme'Clave de localStorage para recordar la elección; pasa null para no guardarla.
stringsPartial<AleaStrings>-Cambia cualquier texto que escribe el kit (etiquetas, placeholders, anuncios), sobre el paquete del idioma (incluye inglés y español).
surface"glass" | "solid"'solid'"glass" convierte las superficies flotantes (navbar, popovers, menús, diálogos, toasts, drawers) en vidrio esmerilado.
theme"dark" | "light" | "system"-Tema controlado.
useHref((href: string) => string)-El useHref de tu router, para routers con una ruta base.

ThemeToggle props

Cambia el tema (necesita ThemeProvider para system y para guardarlo).

PropTipoPor defectoDescripción
appearance"icon" | "segmented"'icon'icon: un botón que alterna oscuro/claro; segmented: oscuro, claro, sistema.
classNamestring-Clases extra.

Especificaciones

Generado desde el código: las variantes de los tipos, los estados y tokens del CSS, y los patrones de motion que aplican. Las grillas muestran el componente real en ambos temas; los números se miden en la página.

ThemeProvider

Variantes
contrastnormalsystemmore
defaultThemedarklightsystem
presetdefaultgraphite
scopedocumentelement
surfaceglasssolid
themedarklightsystem
Motion
Acepta una prop motion para su entrada y salida.
Oscuro y claro
Cada color viene de tokens del tema, así que sigue a data-theme (y a presets como Graphite) en la página o en cualquier contenedor. El contraste se revisa en ambos temas.
Clases para estilos
.alea-theme

ThemeToggle

Variantes
appearanceiconsegmented
Motion
glidepress
Oscuro y claro
Cada color viene de tokens del tema, así que sigue a data-theme (y a presets como Graphite) en la página o en cualquier contenedor. El contraste se revisa en ambos temas.
Clases para estilos
.alea-theme-toggle.alea-segmented.alea-segmented-item

Accesibilidad

  • ThemeToggle es un botón nombrado con el tema al que cambia; el aspecto segmentado es un grupo de radios con el tema actual marcado.
  • Ambos temas cumplen el contraste AA, y el modo de alto contraste sigue la configuración del sistema.
  • La elección se recuerda, así quien necesita un tema lo conserva.

Teclado

TeclaAcción
Enter o EspacioCambia el tema

Qué hacer y qué evitar

Hacer

  • Pon ThemeProvider una sola vez cerca de la raíz.
  • Respeta system como valor por defecto.

Evitar

  • No pongas colores fijos: usa los tokens para que ambos temas funcionen.
  • No escondas el interruptor en móvil.
Probado con axe, teclado y roles de lector de pantalla