Skip to content

Alternador de tema claro/escuro (claro como padrão) - #12

Merged
DRoqueProgrammer merged 1 commit into
mainfrom
claude/dark-light-mode-toggle-g30trs
Aug 28, 2026
Merged

DRoqueProgrammer merged 1 commit into
mainfrom
claude/dark-light-mode-toggle-g30trs

Conversation

@DRoqueProgrammer

Copy link
Copy Markdown
Owner

Adiciona um botão para alternar entre tema claro e escuro. O tema claro é o padrão para quem acessa — inclusive quem tem o sistema operacional no escuro.

O que muda

  • O gatilho do dark mode deixa de ser @media (prefers-color-scheme: dark) e passa a ser o atributo data-theme="dark" no <html>. Sem escolha salva, nenhum atributo é posto e o ramo claro do :root vale — o escuro é opt-in pelo botão. A ADR 0011 já previa isto: "é só sobrescrever as variáveis num [data-theme]".
  • A escolha persiste em localStorage['maa-tema'] e é reaplicada por um script inline no <head> antes da pintura, sem flash (FOUC). O <html> recebe suppressHydrationWarning porque o script muta o atributo antes da hidratação.
  • Como o dark mode por CSS variables já estava pronto (PR Implementa sugestões do parecer do Conselho do Mirante #11 / ADR 0011), esta mudança não toca nas ~40 telas nem nas cores já verificadas de contraste — só troca o gatilho.

Onde fica o botão

Ícone de lua (tema claro → vira escuro) / sol (tema escuro → vira claro):

  • App: sidebar (desktop) e folha de Conta (mobile)
  • Landing e páginas legais (Termos/Privacidade), no cabeçalho
  • Telas de login / cadastro / recuperação de senha: botão fixo no canto (não têm cabeçalho próprio)

Acessibilidade

  • Alvo de toque ≥ 44px, aria-label/title descrevendo a ação, foco visível no padrão do app.
  • O ícone troca por CSS via [data-theme] (não por estado do React), então acompanha o tema sem piscar nem descasar na hidratação.

Arquivos

  • components/theme-toggle.tsx (novo) — o alternador
  • app/(auth)/layout.tsx (novo) — chrome das telas de auth com o botão no canto
  • app/globals.css, app/layout.tsx, components/nav.tsx, components/conta-sheet.tsx, app/page.tsx, app/(legal)/layout.tsx
  • docs/adr/0011-dark-mode-tema.md — seção de atualização

Verificação

npm run typecheck ✓ · npm run lint (apenas o aviso pré-existente da fonte Poppins) ✓ · npm test → 57 testes passando ✓ · npm run build ✓ — /login e /nova-senha pré-renderizam como estáticas, confirmando que não há mismatch de hidratação.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LRB4q3trRe3bYwbRrXninV


Generated by Claude Code

Adiciona um botão para trocar entre tema claro e escuro. O padrão passa a
ser claro para todos que acessam — inclusive quem tem o sistema no escuro:
o dark deixa de seguir `prefers-color-scheme` e passa a valer só quando
escolhido, pelo atributo `data-theme="dark"` no <html> (como a ADR 0011
já previa).

- globals.css: gatilho do dark vira `:root[data-theme="dark"]`; classes de
  ícone (lua/sol) trocadas por CSS, acompanhando o tema sem piscar.
- components/theme-toggle.tsx: alternador (2 estados) que grava a escolha em
  localStorage['maa-tema'] e liga/desliga o data-theme.
- layout raiz: script inline reaplica o tema antes da pintura (sem flash) e
  suppressHydrationWarning no <html>.
- Botão na sidebar (desktop) e folha de conta (mobile) do app, no cabeçalho
  da landing e das páginas legais, e fixo no canto das telas de auth.
- Atualiza a ADR 0011.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRB4q3trRe3bYwbRrXninV
@vercel

vercel Bot commented Aug 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
meajudaai Ready Ready Preview Aug 28, 2026 4:43pm

@DRoqueProgrammer
DRoqueProgrammer merged commit d7e9e96 into main Aug 28, 2026
3 checks passed

This branch was successfully deployed

1 active deployment
Preview — 3fb7064a Deployed Aug 28, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants