Skip to content

fix(overlay): contraste WCAG AA no modo escuro do card - #67

Open
caioross wants to merge 1 commit into
mainfrom
auto/issue-54-dark-contrast
Open

fix(overlay): contraste WCAG AA no modo escuro do card#67
caioross wants to merge 1 commit into
mainfrom
auto/issue-54-dark-contrast

Conversation

@caioross

@caioross caioross commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Contexto

overlay.css:107 é o único bloco de modo escuro. Ele trocava fundos (.pm-card, .pm-model, .pm-src, .pm-menu, .pm-mitem) e os textos fortes (.pm-cost-val, .pm-metric b, .pm-foot b), mas nenhuma cor de texto secundário — as cores calibradas para fundo branco continuavam valendo sobre o card escuro.

Modo escuro é o padrão de facto nos quatro sites suportados, então isso atinge a maioria dos usuários. O pior par é o chip de origem (.pm-src-user, 2.03:1), que é exatamente o indicador que separa custo confiável (modelo detectado) de custo chutado (modelo escolhido à mão).

O que mudou

Só cor, só dentro do @media (prefers-color-scheme: dark) (7 linhas adicionadas, 1 alterada; nenhum outro arquivo):

  • Secundários (.pm-caret, .pm-src base, .pm-metric-label, .pm-brl, .pm-foot — este último cobre também .pm-resp por herança) → #94a3b8, token que já existe na paleta (usado por .pm-x, .pm-menu-group, .pm-mprice), o que evita introduzir cor nova.
  • Chips de origem.pm-src-detected #67e8f9 (cyan-300) e .pm-src-user #c4b5fd (violet-300): contrapartes escuras diretas do cyan-700/violet-700 do modo claro. A semântica de matiz é preservada — ciano = detectado, violeta = você —, só clareada.
  • .pm-menu-title#cbd5e1, mais claro que o #94a3b8 do .pm-menu-group, mantendo a mesma hierarquia visual do modo claro (título > grupo).

Contrastes medidos (WCAG 2.1, luminância relativa)

Cores alteradas — antes → depois:

Seletor Fundo Antes Depois AA
.pm-src-user #232a36 #6d28d9 2.03:1 #c4b5fd 7.81:1
.pm-menu-title #181c24 #475569 2.25:1 #cbd5e1 11.50:1
.pm-src-detected #232a36 #0e7490 2.69:1 #67e8f9 9.95:1
.pm-src (base) #232a36 #64748b 3.03:1 #94a3b8 5.63:1
.pm-caret #232a36 #64748b 3.03:1 #94a3b8 5.63:1
.pm-metric-label #181c24 #64748b 3.59:1 #94a3b8 6.66:1
.pm-brl #181c24 #64748b 3.59:1 #94a3b8 6.66:1
.pm-foot / .pm-resp #181c24 #64748b 3.59:1 #94a3b8 6.66:1

Correção de duas linhas da tabela da issue: .pm-caret e o .pm-src base ficam sobre #232a36 (dentro de .pm-model / do próprio chip), não sobre #181c24 — logo o valor real era 3.03:1, não 3.59:1, e são 8 pares reprovando, não 6 (o .pm-src sem sufixo não constava). Todos os 8 estão corrigidos.

Varri todos os 24 pares texto/fundo do card no escuro (incluindo estados :hover e .pm-sel do menu): os 16 restantes já passavam e seguem passando — .pm-x 6.66, .pm-menu-group 6.66, .pm-mprice 6.66/5.63/5.71, .pm-menu-foot 6.66, .pm-est 7.95/6.72/6.82, .pm-mitem 14.51/12.45, .pm-model 12.26/10.82, .pm-cost-val+.pm-foot b 15.58, .pm-card 14.51, .pm-x:hover 12.73. Nenhum par reprova.

Pior caso composto: .pm-card é rgba(24,28,36,.92), então o fundo real depende da página. Compus os dois extremos: sobre página preta → #161a21 (contraste sobe), sobre página branca → #2a2e36 (pior caso). Mesmo no pior caso #94a3b8 rende 5.31:1 e #cbd5e1 9.17:1 — margem preservada.

Conferência feita com um script de contraste zero-dependência, fora do repo (a issue sugere versioná-lo em scripts/ num PR posterior, não aqui).

Critérios de aceitação

  • Todos os pares texto/fundo do card no modo escuro ≥ 4.5:1 (todo texto do card é < 18px — o limiar 3:1 de texto grande não se aplica)
  • Nenhuma cor do modo claro alterada (escopo do Overlay: preço/rodapé do menu de modelos falham contraste WCAG AA no modo claro (#94a3b8 ~2.6:1) #9) — o diff toca apenas o bloco @media da linha 107
  • Fundos escuros inalterados (.pm-card, .pm-src, .pm-menu, .pm-mitem): a correção é de cor de texto, não de tema
  • Tabela de contrastes antes → depois acima
  • node scripts/gate.mjs verde

Resultado real do gate

GATE VERDE — 32/32 checagens passaram.
  [OK] suíte node:test passou (4 arquivos, 52 testes)

Riscos

Baixo. Mudança puramente cosmética em CSS: sem JS, sem markup, sem rede, sem permissão, sem dependência (zero-build preservado). Ordem de cascata conferida — .pm-src-detected/.pm-src-user vêm depois da regra de grupo (mesma especificidade 0,1,0), e .pm-foot b (0,1,1) segue vencendo .pm-foot (0,1,0), então os valores em negrito continuam #f1f5f9.

Teste manual (mudança visual do overlay): com o SO/navegador em tema escuro, abrir ChatGPT (ou Claude/Gemini/Perplexity), digitar um prompt e conferir no card: (1) o chip de origem legível em ciano quando o modelo é detectado e em violeta ao escolher outro modelo no menu; (2) os rótulos "tokens"/"custo de entrada", o rodapé "resposta"/"sessão" e o sufixo em R$ legíveis; (3) abrir o menu de modelos e conferir o título "Escolha o modelo cobrado". Em tema claro, nada deve ter mudado.

Classificação HANDBOOK §7.3 (Normal): a11y/CSS do overlay; overlay.css não consta da lista de quórum §7.2.

Closes #54

O bloco @media (prefers-color-scheme: dark) trocava fundos e os textos
fortes, mas nenhuma cor de texto secundário: cores calibradas para fundo
branco (#64748b, #475569, #0e7490, #6d28d9) seguiam valendo sobre o card
escuro. Oito pares texto/fundo reprovavam o AA (4.5:1), o pior sendo o
chip "você" a 2.03:1 — justamente o indicador que diz se o modelo foi
detectado ou escolhido pelo usuário.

Só cor, só dentro do @media dark: os fundos escuros e o tema claro
(escopo do #9) ficam intactos. A distinção de matiz dos chips é
preservada (ciano = detectado, violeta = você), apenas clareada.

Refs #54
@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

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.

Overlay a11y: no modo escuro 6 textos do card falham WCAG AA (chip "você" a 2.03:1) — o bloco @media dark não reescreve as cores secundárias

1 participant