Alterna claro/escuro, lembra a escolha e não pisca (flash) no carregamento.
O botão flutuante de troca de tema, mais o mecanismo por trás: salva a escolha e aplica ANTES do CSS renderizar, pra nunca aparecer um flash da cor errada.
Um script mínimo, inline, roda antes de qualquer CSS carregar e já crava o atributo sw-theme no <html> lendo o localStorage — por isso não pisca.
<button sw-day sw-btn="ghost" aria-label="Alternar tema">
<i class="sw-daytg-ico swi-moon"></i>
</button>
<!-- se você NÃO puser nenhum botão, ele injeta um flutuante sozinho.
Pra não injetar: <html sw-day-no-fab> -->
<img src="/logo-claro.svg"
sw-day-img-light="/logo-claro.svg"
sw-day-img-dark="/logo-escuro.svg" alt="">
<!-- serve pra logo, ilustração, print de tela… -->
<div sw-day-bg-light="#eef2ff" sw-day-bg-dark="#1e1b4b">…</div>
<div sw-day-color-light="#4338ca" sw-day-color-dark="#a5b4fc">…</div>
<!-- aceita token do framework também -->
<div sw-day-bg-dark="var(--sw-sur)">…</div>
<!-- existem ainda: sw-day-text-{tema} e sw-day-font-{tema} -->
Esses dois vão no <html>, porque valem pra página inteira — por isso não têm demonstração aqui dentro.
sw-day-default define só o primeiro acesso: depois disso vale o que o visitante escolheu. sw-day-lock é diferente — trava mesmo, e o botão some.
<!-- primeira visita começa no escuro (depois vale a escolha do visitante) -->
<html sw-day-default="dark">
<!-- trava o tema: ninguém troca -->
<html sw-day-lock="dark">
<!-- não injetar o botão flutuante automático -->
<html sw-day-no-fab>
Se o tema fosse aplicado só depois do CSS carregar, o visitante veria um flash branco antes de ficar escuro. O truque é um script minúsculo, inline, antes de qualquer CSS: ele lê a escolha salva e já crava o sw-theme no <html>.
Esta página faz exatamente isso — é por isso que ela não pisca ao recarregar no tema escuro.
<head>
<!-- ANTES de qualquer <link rel="stylesheet"> -->
<script>
try {
var t = localStorage.getItem('sw-theme');
if (t) document.documentElement.setAttribute('sw-theme', t);
} catch (e) {}
</script>
<link rel="stylesheet" href="dist/swcore.min.css">
</head>
<script>
SW.Day.set('dark');
SW.Day.toggle();
document.addEventListener('sw:theme:change', (e) => console.log(e.detail));
</script>
sw-daysw-day-defaultsw-day-locksw-day-no-fabsw-day-img-{tema}src naquele temasw-day-bg-{tema}sw-day-color-{tema}sw-day-text-{tema}sw-day-font-{tema}{tema} = light \| darksw-day-bg-dark(nenhum botão na página)sw-day-no-fabsw-theme no <html>[sw-theme="dark"]sw:theme:changeSW.Day.set('light' \| 'dark')SW.Day.toggle()Nenhuma.
localStorage daquele navegador — em outro aparelho, começa de novo pelo sw-day-default.[sw-theme="dark"].