ThemeSwitch
Um controle segmentado de três estados (sistema / claro / escuro) ligado à API de temas do ranui. Clicar num segmento chama setTheme(), guarda a escolha na chave de localStorage ran-theme e mantém sincronizadas todas as instâncias da página (e de outras abas).
Use quando precisar de um controle segmentado sistema/claro/escuro já ligado à API de temas do ranui. O
<r-theme-switch>cuida da persistência, do acompanhamento do sistema e da sincronização entre abas, então você não precisa montar um alternador na mão.
Início rápido
Uso básico
<r-theme-switch></r-theme-switch>import 'ranui'; // ou a entrada independente:
import 'ranui/theme-switch';💡 Neste site de documentação o tema é comandado pelo alternador global do cabeçalho, que reescreve
data-ran-themepor conta própria, então o site pode reiniciar a demonstração acima. No seu aplicativo, o<r-theme-switch>é a fonte da verdade.
Chame initTheme() uma vez no carregamento da página para que a escolha salva seja restaurada antes de o controle ser desenhado:
import { initTheme } from 'ranui';
initTheme();Referência da API
Propriedades
| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
value | 'system' | 'light' | 'dark' | 'system' | Seleção atual, lida da API de temas (getTheme()). Atribuí-la aplica e persiste o tema. |
sheet | string | '' | CSS injetado no shadow DOM do componente. |
Atributos de localização
Os três botões são só ícone, então cada um carrega um aria-label. Sobrescreva-os para traduzir:
| Atributo | Padrão | Descrição |
|---|---|---|
label | 'Theme' | aria-label do grupo de controle. |
label-system | 'System theme' | aria-label do botão de sistema. |
label-light | 'Light theme' | aria-label do botão claro. |
label-dark | 'Dark theme' | aria-label do botão escuro. |
<r-theme-switch
label="Tema"
label-system="Tema do sistema"
label-light="Tema claro"
label-dark="Tema escuro"
></r-theme-switch>Eventos
| Evento | Detail | Descrição |
|---|---|---|
change | { theme: 'system' | 'light' | 'dark' } | Disparado quando o usuário escolhe um tema. Borbulha e cruza o shadow DOM. |
const themeSwitch = document.createElement('r-theme-switch');
themeSwitch.addEventListener('change', (e) => {
console.log('theme is now', e.detail.theme);
});
toolbar.append(themeSwitch);Comportamento
- Persistência: as seleções passam por
setTheme(), então são salvas no localStorage (ran-theme) e restauradas porinitTheme()na próxima visita. - Sincronização entre instâncias: coloque um controle no cabeçalho e outro no rodapé; escolher um tema em qualquer um atualiza os dois.
- Sincronização entre abas: um tema trocado em outra aba atualiza este controle pelo evento
storage. - Cromo do navegador: forçar claro ou escuro atualiza
<meta name="theme-color">para o fundo de página resolvido, de modo que o cromo do navegador ou do PWA combine; escolhersystemrestaura o conteúdo original de cada meta (que pode ter condição de mídia).
Partes CSS
| Parte | Descrição |
|---|---|
switch | A pílula segmentada externa. |
button | Cada botão de escolha (cada um expõe também seu nome de escolha como parte). |
system / light / dark | Os botões de escolha individuais. |
r-theme-switch::part(switch) {
border-color: var(--line);
}
r-theme-switch::part(dark) {
color: rebeccapurple;
}Estas variáveis CSS podem ser sobrescritas: --ran-theme-switch-display, --ran-theme-switch-gap, --ran-theme-switch-padding, --ran-theme-switch-border-color, --ran-theme-switch-radius, --ran-theme-switch-background, --ran-theme-switch-button-size, --ran-theme-switch-icon-size, --ran-theme-switch-button-color, --ran-theme-switch-button-hover-color, --ran-theme-switch-button-active-background, --ran-theme-switch-button-active-color, --ran-theme-switch-button-focus-outline.
r-theme-switch {
--ran-theme-switch-button-size: 32px;
--ran-theme-switch-icon-size: 18px;
}Boas práticas
- Uma única fonte da verdade: use o
<r-theme-switch>em vez de montar um alternador na mão; ele já cuida da persistência, do acompanhamento do sistema, da sincronização entre instâncias e das metastheme-color. - Restaure cedo: chame
initTheme()o mais cedo possível (idealmente inline, antes da primeira pintura) para evitar um lampejo de claro para escuro. - Traduza: os botões são só ícone; defina
labelelabel-*para interfaces que não estejam em inglês.