SW Core
SW Core / JavaScript / Tema dia/noite

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. 1

    Coloque o SW Core na página. O CSS no <head>, o JS no fim do <body>. O arquivo compl é 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. 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. 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.

Só ícone, estilo fantasma <button sw-day sw-btn="ghost" aria-label="Alternar tema"><i class="sw-daytg-ico"></i></button>
Só ícone, redondo com contorno <button sw-day sw-btn="out rnd" aria-label="Alternar tema"><i class="sw-daytg-ico"></i></button>
Com texto (sem ícone automático) <button sw-day sw-btn="out p">Trocar tema</button>
Ícone + texto <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.

Logo do SW Core
sw-day-img — imagem diferente (logo clara / escura) <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">
Promoção da semana
sw-day-bg — fundo diferente <div class="p-m r-m bd t-ct" sw-day-bg-light="#fef3c7" sw-day-bg-dark="#1e1b4b">Promoção da semana</div>
Frete grátis hoje
sw-day-color — cor do texto diferente <strong sw-day-color-light="#b45309" sw-day-color-dark="#fcd34d">Frete grátis hoje</strong>
Bom dia! ☀️
sw-day-text — o próprio texto muda <span sw-day-text-light="Bom dia! ☀️" sw-day-text-dark="Boa noite! 🌙">Bom dia! ☀️</span>
Horário de atendimento
sw-day-font — fonte diferente <span sw-day-font-light="var(--sw-f-san)" sw-day-font-dark="var(--sw-f-mon)">Horário de atendimento</span>
Só muda no escuro
Só um dos temas (o outro fica com o CSS normal) <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).

Seu conteúdo
sw-bg — fundo da página <div class="sw-bg p-m r-m bd t-ct">Seu conteúdo</div>
Seu conteúdo
sw-bg- — 1 nível acima <div class="sw-bg- p-m r-m bd t-ct">Seu conteúdo</div>
Seu conteúdo
sw-bg-- — 2 níveis acima <div class="sw-bg-- p-m r-m bd t-ct">Seu conteúdo</div>
Seu conteúdo
sw-bg--- — 3 níveis acima <div class="sw-bg--- p-m r-m bd t-ct">Seu conteúdo</div>
Seu conteúdo
sw-bg_ — oposto, suave <div class="sw-bg_ p-m r-m bd t-ct">Seu conteúdo</div>
Seu conteúdo
sw-bg__ — oposto, forte <div class="sw-bg__ p-m r-m bd t-ct">Seu conteúdo</div>
Seu conteúdo
sw-bg___ — oposto total (preto ou branco) <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).

Tsw-colorTsw-color-Tsw-color--Tsw-color---Tsw-color_Tsw-color__Tsw-color___
Tsw-color — tons de texto
<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: _ __ ___ -->
Tsw-link e Tsw-hover <a href="/cardapio" class="Tsw-link">Ver cardápio</a>
Tsw-link- e Tsw-link-- (mais escuros) <a href="/trocas" class="Tsw-link--">Política de troca</a>
Borda suave
sw-bl — borda suave <div class="bd sw-bl p-m r-m">Borda suave</div>
Borda marcada
sw-border- — borda mais marcada <div class="bd sw-border- p-m r-m">Borda marcada</div>
Cartão
sw-shadow — sombra leve <div class="bg-sur sw-shadow p-m r-m">Cartão</div>
Cartão em destaque
sw-shadow--- — sombra forte <div class="bg-sur sw-shadow--- p-m r-m">Cartão em destaque</div>

Tabela de opções

PalavraO que fazExemplo
O botão
sw-dayNum <button>: vira o botão que alterna claro/escuro. Pode ter quantos quiser na página.<button sw-day>
.sw-daytg-icoClasse 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-fabClasse 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-demoMarca 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-themeOnde 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-defaultTema da primeira visita (no lugar do tema do aparelho). Depois vale o que a pessoa escolher.<html sw-day-default="dark">
sw-day-lockTrava o site num tema. Os botões sw-day somem e o atalho deixa de funcionar.<html sw-day-lock="dark">
sw-day-no-fabNã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.

Botão de tema no menu do site Ao vivo
<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>
Logo que troca com o tema (cabeçalho) Ao vivo
SW Core Bom dia, visitante
<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>
Site todo escuro, sem opção de trocar Referência
<!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>
Seu CSS reagindo ao tema Referência
<style>
  .banner { background-image: url('/img/banner-dia.webp'); }
  html[sw-theme="dark"] .banner { background-image: url('/img/banner-noite.webp'); }
</style>
Trocar o tema pelo seu próprio código Ao vivo
<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:change
Disparado no document sempre que o tema muda. e.detail.theme traz "light" ou "dark".

API (JavaScript)

SW.Day.set('light' | 'dark')
Muda o tema e salva a escolha. Devolve false se o valor for inválido ou o tema estiver travado.
SW.Day.toggle()
Alterna para o outro tema.
SW.Day.theme
Lê o tema atual ("light" ou "dark").
SW.config({ theme: 'dark' })
Mesmo efeito do SW.Day.set, junto com as outras configurações do SW Core.

Precisa de quê

  • swcore.min.css e swcore.min.js — o tema e o botão.
  • swcore.compl.min.css — só para o ícone de sol/lua (.sw-daytg-ico) e outros ícones swi-*.

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 use sw-day-color-{tema}.
  • Na imagem, mantenha também o src normal: ele é o que aparece enquanto o JavaScript ainda não rodou (e para buscadores).
  • Botão só com ícone precisa de aria-label para quem usa leitor de tela.
  • Com sw-day-lock no <html>, SW.Day.set() para o outro tema não faz nada — não é defeito, é a trava.
  • As classes sw-bl e sw-border só dão a cor da borda: junte com uma classe que desenha a borda, como bd.

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.