Tema dia/noite JavaScript
Claro e escuro com um clique: o botão troca o tema, a escolha fica salva e imagem, cor, fundo, fonte e até o texto podem mudar junto.
O que é
É o "modo escuro" do site. Você coloca sw-day num botão e ele passa a alternar a página entre claro e escuro. O SW Core lembra a escolha da pessoa (na próxima visita ela já volta no tema que escolheu) e, se ninguém escolheu ainda, segue o tema do celular/computador dela. Além do botão, você pode pedir que uma imagem, um fundo, uma cor, uma fonte ou um texto sejam diferentes em cada tema — por exemplo, a logo clara no escuro e a logo escura no claro.
O tema fica escrito no <html> como sw-theme="light" ou sw-theme="dark", e todas as cores do SW Core mudam sozinhas a partir disso. Se a sua página não tiver nenhum botão sw-day, o SW Core coloca um botão pequeno preso na borda direita da tela. O atalho Ctrl+Shift+D também troca o tema. Tudo isso vem no arquivo principal — não precisa do pacote de animação.
Quando usar
- Todo site com textos longos (blog, painel, loja): muita gente lê à noite e prefere o escuro.
- Logo que não aparece num dos temas: troque a imagem por tema com
sw-day-img-light/sw-day-img-dark. - Marca que só existe num tema (site todo escuro, por exemplo): trave com
<html sw-day-lock="dark">— o botão some. - Quer que a primeira visita já comece escura, mas deixar a pessoa trocar depois:
<html sw-day-default="dark">.
Comece aqui
-
1
Coloque o SW Core na página. O CSS no
<head>, o JS no fim do<body>. O arquivocomplé só para os ícones de sol e lua do botão.<link rel="stylesheet" href="swcore/swcore.min.css"> <link rel="stylesheet" href="swcore/swcore.compl.min.css"> <!-- fim do <body> --> <script src="swcore/swcore.min.js"></script> -
2
Coloque o botão onde quiser (no menu, no rodapé). Clique nele: esta página inteira troca de tema, porque é o mesmo SW Core rodando aqui.
<button sw-day sw-btn="ghost" aria-label="Alternar tema"><i class="sw-daytg-ico"></i></button> -
3
Para a página não "piscar" branca antes de ficar escura, cole este script bem no começo do
<head>, antes do CSS. Ele aplica o tema salvo antes de a página aparecer.<script> try { var t = localStorage.getItem('sw-theme'); if (t === 'light' || t === 'dark') document.documentElement.setAttribute('sw-theme', t); } catch (e) {} </script>
Todas as variações
Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.
1. O botão
Qualquer <button> com sw-day vira o botão de tema. Se ele estiver vazio (só com <i class="sw-daytg-ico"> ou sem nada), o SW Core mostra a lua no claro e o sol no escuro. Clique em qualquer um: a documentação inteira troca de tema.
<button sw-day sw-btn="ghost" aria-label="Alternar tema"><i class="sw-daytg-ico"></i></button>
<button sw-day sw-btn="out rnd" aria-label="Alternar tema"><i class="sw-daytg-ico"></i></button>
<button sw-day sw-btn="out p">Trocar tema</button>
<button sw-day sw-btn="pri p"><i class="sw-daytg-ico"></i> Modo claro/escuro</button>
2. Coisas que mudam com o tema
Escreva o valor de cada tema direto no elemento: sw-day-…-light vale no claro e sw-day-…-dark vale no escuro. Troque o tema e veja estes quadros mudarem.

<img src="/img/logo-dia.webp"
sw-day-img-light="/img/logo-dia.webp"
sw-day-img-dark="/img/logo-noite.webp"
width="80" height="80" alt="Logo da empresa">
<div class="p-m r-m bd t-ct" sw-day-bg-light="#fef3c7" sw-day-bg-dark="#1e1b4b">Promoção da semana</div>
<strong sw-day-color-light="#b45309" sw-day-color-dark="#fcd34d">Frete grátis hoje</strong>
<span sw-day-text-light="Bom dia! ☀️" sw-day-text-dark="Boa noite! 🌙">Bom dia! ☀️</span>
<span sw-day-font-light="var(--sw-f-san)" sw-day-font-dark="var(--sw-f-mon)">Horário de atendimento</span>
<div class="p-m r-m bd t-ct" sw-day-bg-dark="#052e16">Só muda no escuro</div>
3. Fundos que acompanham o tema (classes prontas)
Classes do CSS que já trocam sozinhas: no escuro são tons escuros, no claro são tons claros, e o texto ajusta o contraste. Os traços (-) vão clareando a partir do fundo; os sublinhados (_) são o tom oposto (claro no escuro, escuro no claro).
<div class="sw-bg p-m r-m bd t-ct">Seu conteúdo</div>
<div class="sw-bg- p-m r-m bd t-ct">Seu conteúdo</div>
<div class="sw-bg-- p-m r-m bd t-ct">Seu conteúdo</div>
<div class="sw-bg--- p-m r-m bd t-ct">Seu conteúdo</div>
<div class="sw-bg_ p-m r-m bd t-ct">Seu conteúdo</div>
<div class="sw-bg__ p-m r-m bd t-ct">Seu conteúdo</div>
<div class="sw-bg___ p-m r-m bd t-ct">Seu conteúdo</div>
4. Textos, bordas, links e sombras que acompanham o tema
A mesma ideia para texto (Tsw-color), link (Tsw-link, com a cor de passar o mouse Tsw-hover), bordas (sw-bl suave e sw-border estrutural) e sombras (sw-shadow).
<span class="Tsw-color">…</span> <!-- mais forte -->
<span class="Tsw-color-">…</span>
<span class="Tsw-color--">…</span>
<span class="Tsw-color---">…</span> <!-- mais apagado -->
<span class="Tsw-color_">…</span> <!-- tons opostos: _ __ ___ -->
<a href="/cardapio" class="Tsw-link">Ver cardápio</a>
<a href="/trocas" class="Tsw-link--">Política de troca</a>
<div class="bd sw-bl p-m r-m">Borda suave</div>
<div class="bd sw-border- p-m r-m">Borda marcada</div>
<div class="bg-sur sw-shadow p-m r-m">Cartão</div>
<div class="bg-sur sw-shadow--- p-m r-m">Cartão em destaque</div>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| O botão | ||
sw-day | Num <button>: vira o botão que alterna claro/escuro. Pode ter quantos quiser na página. | <button sw-day> |
.sw-daytg-ico | Classe do <i> dentro do botão: o SW Core coloca a lua (no claro) ou o sol (no escuro). Precisa do swcore.compl.min.css. | <i class="sw-daytg-ico"></i> |
.sw-day-fab | Classe que dá ao botão o visual de aba presa na borda direita da tela (é o botão que aparece sozinho quando a página não tem nenhum). | <button sw-day class="sw-day-fab"> |
sw-day-demo | Marca um botão como "só exemplo": ele funciona, mas não impede o botão automático da borda de aparecer. | <button sw-day sw-day-demo> |
| No <html> (vale para o site inteiro) | ||
sw-theme | Onde o tema fica escrito: light ou dark. O SW Core escreve sozinho; o seu CSS pode reagir a ele. | html[sw-theme="dark"] .banner { … } |
sw-day-default | Tema da primeira visita (no lugar do tema do aparelho). Depois vale o que a pessoa escolher. | <html sw-day-default="dark"> |
sw-day-lock | Trava o site num tema. Os botões sw-day somem e o atalho deixa de funcionar. | <html sw-day-lock="dark"> |
sw-day-no-fab | Não coloca o botão automático da borda direita (quando a página não tem botão próprio). | <html sw-day-no-fab> |
| Em qualquer elemento ({tema} = light ou dark) | ||
sw-day-img-{tema} | Numa <img>: troca o endereço da imagem naquele tema. | sw-day-img-dark="/logo-branca.webp" |
sw-day-bg-{tema} | Troca o fundo. Aceita cor, degradê, url(…) ou var(--sw-…). | sw-day-bg-dark="#1e1b4b" |
sw-day-color-{tema} | Troca a cor do texto. | sw-day-color-dark="#fcd34d" |
sw-day-text-{tema} | Troca o texto do elemento (não a cor). | sw-day-text-dark="Boa noite!" |
sw-day-font-{tema} | Troca a fonte. | sw-day-font-dark="var(--sw-f-mon)" |
| Classes que acompanham o tema (só CSS) | ||
sw-bg · sw-bg- · sw-bg-- · sw-bg--- | Fundo da página e 3 níveis acima dele (com texto em contraste). | class="sw-bg-" |
sw-bg_ · sw-bg__ · sw-bg___ | Fundo no tom oposto ao tema (texto invertido junto). | class="sw-bg__" |
Tsw-color · - · -- · --- · _ · __ · ___ | Tons de texto, do mais forte ao mais apagado, e os opostos. | class="Tsw-color--" |
Tsw-link · Tsw-link- · Tsw-link-- · Tsw-link_ | Cor de link. Tsw-link muda para a cor de hover ao passar o mouse. | class="Tsw-link" |
Tsw-hover · - · -- · _ | A cor de "passar o mouse", para usar direto. | class="Tsw-hover" |
sw-bl · - · -- · --- · _ · __ · ___ | Cor de borda suave (use junto com uma classe que desenha a borda, como bd). | class="bd sw-bl" |
sw-border · sw-border- · sw-border-- · sw-border_ | Cor de borda estrutural, mais marcada. | class="bd sw-border-" |
sw-shadow · - · -- · --- · _ | Sombra, da mais leve à mais forte. | class="sw-shadow--" |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<nav class="flx alc j-sb gap-4 p-m bd r-m f-wr">
<strong>Padaria Pão Quente</strong>
<div class="flx alc gap-3">
<a href="/cardapio" class="Tsw-link">Cardápio</a>
<a href="/encomendas" class="Tsw-link">Encomendas</a>
<button sw-day sw-btn="ghost rnd" aria-label="Alternar tema"><i class="sw-daytg-ico"></i></button>
</div>
</nav>
<header class="flx alc gap-4 p-m bd r-m">
<img src="/img/logo-dia.webp"
sw-day-img-light="/img/logo-dia.webp"
sw-day-img-dark="/img/logo-noite.webp"
width="48" height="48" alt="Minha empresa">
<strong sw-day-text-light="Bom dia, visitante"
sw-day-text-dark="Boa noite, visitante">Bom dia, visitante</strong>
</header>
<!doctype html>
<html lang="pt-BR" sw-day-lock="dark">
…
<!-- os botões sw-day somem sozinhos e o atalho Ctrl+Shift+D para de trocar -->
</html>
<style>
.banner { background-image: url('/img/banner-dia.webp'); }
html[sw-theme="dark"] .banner { background-image: url('/img/banner-noite.webp'); }
</style>
<button type="button" sw-btn="out p" onclick="SW.Day.set('light')"><i class="swi-sun"></i> Claro</button>
<button type="button" sw-btn="out p" onclick="SW.Day.set('dark')"><i class="swi-moon"></i> Escuro</button>
<script>
// avisar o seu código quando o tema mudar (ex.: trocar as cores de um gráfico)
document.addEventListener('sw:theme:change', (e) => {
console.log('tema agora é', e.detail.theme);
});
</script>
Eventos
sw:theme:changedocument sempre que o tema muda. e.detail.theme traz "light" ou "dark".API (JavaScript)
SW.Day.set('light' | 'dark')false se o valor for inválido ou o tema estiver travado.SW.Day.toggle()SW.Day.theme"light" ou "dark").SW.config({ theme: 'dark' })SW.Day.set, junto com as outras configurações do SW Core.Precisa de quê
swcore.min.csseswcore.min.js— o tema e o botão.swcore.compl.min.css— só para o ícone de sol/lua (.sw-daytg-ico) e outros íconesswi-*.
Cuidados — erros comuns
- Sem o script do passo 3 no
<head>, quem escolheu o escuro vê um clarão branco de meio segundo ao abrir cada página. sw-day-text-{tema}troca o texto, não a cor. Para cor usesw-day-color-{tema}.- Na imagem, mantenha também o
srcnormal: ele é o que aparece enquanto o JavaScript ainda não rodou (e para buscadores). - Botão só com ícone precisa de
aria-labelpara quem usa leitor de tela. - Com
sw-day-lockno<html>,SW.Day.set()para o outro tema não faz nada — não é defeito, é a trava. - As classes
sw-blesw-bordersó dão a cor da borda: junte com uma classe que desenha a borda, comobd.
O que ele não faz
- A escolha fica salva no navegador daquele aparelho. Em outro celular/computador, a pessoa começa de novo pelo tema do aparelho (ou pelo
sw-day-default). - Cada elemento aceita um valor por tipo e por tema (uma imagem, um fundo, uma cor, uma fonte, um texto). Para mudanças maiores, escreva CSS em cima de
html[sw-theme="dark"]. - Na primeira visita sem
sw-day-default, o tema segue o do aparelho e já fica salvo; se a pessoa mudar o tema do aparelho depois, o site continua no que foi salvo até ela clicar no botão.

