Pular para o conteúdo

ThemeProvider

Provedor de contexto para gerenciamento de temas. Habilita controle programático do tema, detecção de preferências do sistema, persistência em localStorage e sincronização entre abas.

import { ThemeProvider, useTheme } from 'asterui'

Envolva seu aplicativo com ThemeProvider para habilitar o controle do tema:

main.tsx
import { ThemeProvider } from 'asterui'
createRoot(document.getElementById('root')!).render(
<ThemeProvider defaultTheme="system">
<App />
</ThemeProvider>
)

Use o hook useTheme para controlar o tema:

function ThemeSwitcher() {
const { theme, setTheme, resolvedTheme, isDark } = useTheme()
return (
<div>
<p>Selecionado: {theme}</p>
<p>Aplicado: {resolvedTheme}</p>
<p>Modo: {isDark ? 'Escuro' : 'Claro'}</p>
<button onClick={() => setTheme('light')}>Claro</button>
<button onClick={() => setTheme('dark')}>Escuro</button>
<button onClick={() => setTheme('system')}>Sistema</button>
</div>
)
}

Use qualquer tema DaisyUI configurando-o diretamente:

function ThemeSelector() {
const { setTheme, resolvedTheme } = useTheme()
const themes = ['light', 'dark', 'cupcake', 'cyberpunk', 'retro', 'valentine']
return (
<select value={resolvedTheme} onChange={(e) => setTheme(e.target.value)}>
{themes.map(t => <option key={t} value={t}>{t}</option>)}
</select>
)
}

Defina storageKey como false para desabilitar a persistência em localStorage:

<ThemeProvider defaultTheme="dark" storageKey={false}>
<App />
</ThemeProvider>

Para temas personalizados, forneça uma função isDarkTheme:

<ThemeProvider
defaultTheme="system"
isDarkTheme={(theme) => ['dark', 'night', 'dracula', 'synthwave'].includes(theme)}
>
<App />
</ThemeProvider>
PropriedadeTipoPadrãoDescrição
defaultThemestring'system'Tema inicial. Use 'system' para seguir a preferência do navegador.
storageKeystring | false'asterui-theme'Chave do localStorage para persistência. Defina como false para desabilitar.
lightThemestring'light'Tema a usar quando a preferência do sistema é clara.
darkThemestring'dark'Tema a usar quando a preferência do sistema é escura.
isDarkTheme(theme: string) => boolean-Função personalizada para determinar se um tema é escuro.
childrenReact.ReactNode-Componentes filhos.
PropriedadeTipoDescrição
themestring | undefinedO tema selecionado (ex., 'system', 'light', 'dark').
resolvedThemestring | undefinedO tema aplicado real após resolver 'system'.
isDarkbooleantrue se o modo escuro está ativo.
setTheme(theme: string) => voidFunção para mudar o tema.
colorsThemeColorsCores do tema calculadas como valores hex.
systemTheme'light' | 'dark' | undefinedA preferência do sistema detectada.

Veja useTheme para documentação completa do hook incluindo uso autônomo e ThemeColors.

  • Detecção de Preferência do Sistema: Detecta automaticamente prefers-color-scheme: dark
  • Persistência: Salva a preferência do usuário no localStorage (configurável)
  • Sincronização Entre Abas: Mudanças de tema sincronizam entre abas do navegador
  • Qualquer Tema DaisyUI: Funciona com todos os mais de 30 temas integrados do DaisyUI
  • Atualizações Reativas: Atualiza automaticamente quando o tema ou preferência do sistema muda
  • Suporte a Canvas: Fornece cores hex para contextos canvas/WebGL através da propriedade colors
  • Respeita a preferência do sistema do usuário quando defaultTheme="system"
  • A preferência de tema persiste entre sessões
  • Funciona com preferências de movimento reduzido (sem animações de transição de tema por padrão)