/* DEA Rollout — tokens de cor. FONTE ÚNICA.
 *
 * Nenhum hex vive fora deste arquivo. Se você está prestes a escrever `#` num
 * seletor, o que falta é um token aqui. `tests/test_tokens_de_cor.py` faz valer
 * a regra: um hex no `<style>` do `index.html` reprova a suíte.
 *
 * Tema persistido em localStorage sob a chave "rollout-theme"; o tema claro
 * é o escuro com as sobrescritas do segundo bloco.
 *
 * A tipografia (`--f-*`) continua no `index.html`: este arquivo é cor.
 *
 * Por que ele existe assim (Fase 3.8)
 * -----------------------------------
 * Até aqui este arquivo se declarava fonte única e **não era carregado por
 * ninguém** — nenhum `<link>`, nenhuma referência em `.py`, `.md` ou `.yml`. A
 * SPA servia um bloco `:root` inline que havia divergido em `--input`,
 * `--accent`, `--text2`, `--text3` e em dois tokens de borda que este arquivo
 * nem conhecia. As regras documentadas aqui descreviam uma paleta que o produto
 * não entregava. Agora o `index.html` carrega este arquivo e não declara cor
 * nenhuma, e o teste confere as duas pontas.
 *
 * As duas regras de uso, e o que mudou
 * ------------------------------------
 * `--text3` **carrega informação** (`.badge.dim`, `.stepper .st.future`) e por
 * isso passou a valer AA em corpo pequeno — 4.65:1 (--text3 sobre --card2,
 * escuro). A regra antiga, "--text3 nunca carrega informação", descrevia um
 * valor (#3A352C, 1.58:1) que a SPA nunca aplicou.
 *
 * O acento é um só nos dois temas — Duda, 13/10/2026 (F7a)
 * --------------------------------------------------------
 * `--accent` é **#ff0050 nos dois temas**. Até 13/10 ele era um par por tema:
 * a decisão de marca de 30/07/2026 punha #39D51F no claro, com #16660D como
 * cor de primeiro plano. A Duda a reverteu na F7 por uma medida: no claro, o
 * verde de primeiro plano (#16660D) e o verde de "ok" (`--green`, #146B0A)
 * ficavam a ΔE00 1.7, abaixo da diferença mínima perceptível, e na Emissão o
 * estado atual da revisão saía no mesmo verde dos estados já cumpridos.
 * `test_o_acento_de_primeiro_plano_nao_se_confunde_com_o_ok` guarda o motivo.
 *
 * O acento continua com duas metades, porque no claro o preenchimento não lê:
 * #ff0050 mede 3.04:1 (--accent sobre --card, claro).
 *
 *   `--accent`       preenche (`.btn`, a página selecionada do mapa do AP),
 *                    pinta o indeterminado (`.prog`) e é o `accent-color` do
 *                    checkbox. Nunca é cor de primeiro plano (`color`, borda,
 *                    contorno).
 *   `--badge-accent` é o acento quando ele é PRIMEIRO PLANO — a marca, a aba
 *                    ativa, os links de ação, `.badge.accent`, a barra da
 *                    variante pressionada. Passa AA nos dois temas:
 *                    4.90:1 (--badge-accent sobre --card, escuro) e
 *                    5.53:1 (--badge-accent sobre --card, claro).
 *                    No claro é #B20038: o matiz do #ff0050 com a luminosidade
 *                    baixada até 4.95:1 (--badge-accent sobre --bg, claro).
 *
 * No escuro as duas metades são a mesma cor (#ff0050 lê e preenche), e é por
 * isso que a divisão não aparece lá. Ela existe para o claro, e vale na folha
 * inteira porque o `<style>` da SPA é um só para os dois temas: não há como
 * escrever "só no escuro" em CSS sem duplicar a folha.
 * `test_no_claro_o_acento_nunca_e_cor_de_primeiro_plano` é o que faz a regra
 * valer — sem ele, "preenchimento" e "primeiro plano" seriam duas palavras
 * neste comentário.
 *
 * Consequência que não é óbvia: `.btn` é preenchimento PURO, e #ff0050 dá
 * 2.72:1 (--accent sobre --bg, claro), abaixo dos 3:1 da 1.4.11. Por isso
 * `.btn` tem `border:1px solid var(--border-strong)` — o limite vem da borda, a
 * marca continua no preenchimento. (A borda nasceu com o verde de 30/07, que
 * dava 1.36:1.)
 *
 * Badges são **contorno**, não preenchimento: cor do sinal no texto e na borda,
 * fundo do card. Por isso todo sinal (`--green`, `--red`, `--warning`,
 * `--badge-accent`) é conferido como TEXTO — a fonte do badge é 11px bold, que
 * não alcança o limiar de texto grande, então o mínimo é 4.5:1 e não 3:1.
 *
 * Duas famílias de borda, e a separação é por PAPEL
 * -------------------------------------------------
 * `--border` é **decoração**: divisória e contorno de contêiner (linha de
 * tabela, card, fieldset, aba, `.repet`). Ele **não** entra no CONTRATO, e a
 * ausência é deliberada — a WCAG 1.4.11 exige 3:1 de "informação visual
 * necessária para identificar componentes de interface e seus estados", e uma
 * linha entre duas linhas de tabela não identifica componente nenhum. O card
 * tem fundo próprio; a aba ativa é marcada por cor de texto e por uma barra em
 * `--badge-accent`. Nada disso depende da divisória para ser lido.
 *
 * `--border-strong` é o **limite de componente interativo** (campo, botão
 * secundário, badge, diálogo, toast, passo do stepper). É esse que a norma
 * alcança, e é esse que o CONTRATO cobra — em ~4.5:1, folgado sobre o piso de
 * 3:1, para a hierarquia entre as duas famílias continuar legível.
 *
 * `tests/test_tokens_de_cor.py` faz a separação valer nas duas direções: cobra
 * o mínimo de `--border-strong` **e** recusa `--border` na borda de qualquer
 * componente interativo. Sem a segunda metade, "decorativo" seria só uma
 * palavra no comentário, e o primeiro `input` que usasse o token errado passaria
 * batido — com o teste do primeiro verde, afirmando conformidade.
 *
 * Os valores de `--border-strong` foram escolhidos com **folga deliberada**
 * sobre o mínimo (~+0.15), e não no primeiro número que passa. Um contrato cuja
 * margem é 0.01 quebra no próximo ajuste de superfície, e quem for consertá-lo
 * às pressas vai baixar a exigência em vez do token — que é como um piso vira
 * uma sugestão.
 *
 * Foi aqui que estava o achado M1. Antes da correção, `--border-strong` media
 * 2.78:1 sobre o card no escuro — abaixo do mínimo, no token que delimita todos
 * os campos do formulário — e o comentário logo acima dele afirmava que os
 * valores tinham sido escolhidos para ≥3:1. Esse era o defeito real, e ele está
 * corrigido.
 *
 * `--border` **também** foi levado a 3:1 numa primeira passada da Fase 3.8, por
 * leitura literal do achado. No produto, no navegador, ficou errado: a tabela de
 * conferência virou uma grade de planilha e o contorno do card passou a
 * competir com o conteúdo, num tema quase preto onde a divisória tem de recuar.
 * O recuo certo não foi baixar a exigência — foi **separar o papel** e deixar a
 * decoração fora dela. O número que se mede é o do token que a norma cobra.
 *
 * Hover: quem manda é o RÓTULO, não o tema
 * ----------------------------------------
 * `--accent-h` e `--red-h` escureciam sobre um rótulo já escuro (`--accent-fg`,
 * `--danger-fg`), e o hover derrubava o contraste do rótulo para 3.43:1 e
 * 3.79:1 — o botão primário e o destrutivo ficavam fora de norma exatamente
 * enquanto o ponteiro estava neles.
 *
 * A regra foi escrita como "no escuro clareia, no claro escurece", o que
 * descrevia o caso e não o motivo. O motivo é o rótulo: **rótulo escuro exige
 * que o hover clareie**, senão o contraste cai justamente no estado ativo. O
 * rótulo do acento é escuro nos DOIS temas, então `--accent-h` clareia nos
 * dois — desde 13/10 é o mesmo #FF4D83. `--red-h` segue escurecendo no claro,
 * porque lá o `--danger-fg` continua branco — mesma regra, rótulo diferente.
 *
 * CONTRATO
 * --------
 * Cada par abaixo é calculado por `tests/test_tokens_de_cor.py`. Sem sufixo, o
 * par vale nos DOIS temas; `(escuro)` restringe a um. O sufixo existe por causa
 * do acento: no escuro `--accent` é também a cor de primeiro plano e deve 4.5:1
 * às superfícies, no claro ele só preenche e a régua que cabe é outra
 * (`--accent-fg × --accent`, exigida nos dois).
 *
 * Os valores à direita são a medida atual (escuro · claro), não a exigência.
 *
 *   --border-strong × --bg >= 3.0                4.88 ·   4.51
 *   --border-strong × --card >= 3.0              4.72 ·   5.04
 *   --border-strong × --card2 >= 3.0             4.54 ·   5.32
 *   --border-strong × --input >= 3.0             4.65 ·   5.71
 *   --text × --bg >= 4.5                        16.22 ·  12.41
 *   --text × --card >= 4.5                      15.71 ·  13.86
 *   --text × --card2 >= 4.5                     15.10 ·  14.64
 *   --text × --input >= 4.5                     15.47 ·  15.71
 *   --text × --nav-act >= 4.5                   14.26 ·  11.01
 *   --text2 × --bg >= 4.5                        7.31 ·   6.35
 *   --text2 × --card >= 4.5                      7.08 ·   7.09
 *   --text2 × --card2 >= 4.5                     6.80 ·   7.49
 *   --text3 × --bg >= 4.5                        5.00 ·   4.65
 *   --text3 × --card >= 4.5                      4.84 ·   5.20
 *   --text3 × --card2 >= 4.5                     4.65 ·   5.49
 *   --accent × --bg >= 4.5 (escuro)              5.06
 *   --accent × --card >= 4.5 (escuro)            4.90
 *   --accent × --card2 >= 4.5 (escuro)           4.71
 *   --badge-accent × --bg >= 4.5                 5.06 ·   4.95
 *   --badge-accent × --card >= 4.5               4.90 ·   5.53
 *   --badge-accent × --card2 >= 4.5              4.71 ·   5.84
 *   --green × --bg >= 4.5                       11.79 ·   4.65
 *   --green × --card >= 4.5                     11.42 ·   5.20
 *   --green × --card2 >= 4.5                    10.98 ·   5.49
 *   --red × --bg >= 4.5                          7.13 ·   5.20
 *   --red × --card >= 4.5                        6.91 ·   5.81
 *   --red × --card2 >= 4.5                       6.64 ·   6.13
 *   --warning × --bg >= 4.5                     10.17 ·   4.65
 *   --warning × --card >= 4.5                    9.85 ·   5.20
 *   --warning × --card2 >= 4.5                   9.47 ·   5.49
 *   --accent-fg × --accent >= 4.5                5.06 ·   5.06
 *   --accent-fg × --accent-h >= 4.5              6.26 ·   6.26
 *   --danger-fg × --red >= 4.5                   7.13 ·   7.48
 *   --danger-fg × --red-h >= 4.5                 9.35 ·   9.32
 *   --focus × --bg >= 3.0                       10.94 ·   5.41
 *   --focus × --card >= 3.0                     10.60 ·   6.05
 *   --focus × --input >= 3.0                    10.44 ·   6.85
 *   --preview-erro × --preview >= 4.5            7.55 ·   7.55
 *   --preview-texto × --preview >= 4.5           7.40 ·   7.40
 */

:root {
  /* Superfícies */
  /* Os valores do redesenho (`PLANO_INTERFACE.md` §3, 09/10/2026): o cabeçalho
     é a mesma superfície da página (`--sidebar` = `--bg`), e a divisória recua
     para #1A1A1A, com uma forte (#2A2A2A) para o que separa grupos. */
  --bg:#0A0A0A; --sidebar:#0A0A0A; --card:#0F0F0F; --card2:#141414;
  --input:#111111; --nav-act:#1A1A1A;
  /* Limites: contêiner (divisória e divisória forte) e componente interativo.
     `--border-mid` é decoração como `--border` (ver o cabeçalho): separa grupos
     de linhas, nunca delimita controle. */
  --border:#1A1A1A; --border-mid:#2A2A2A; --border-strong:#7E7E7E;
  /* Acento (ver cabeçalho). No escuro as duas metades são a mesma cor:
     #ff0050 preenche E lê (4.90:1 sobre --card). Hover CLAREIA, porque o
     rótulo é escuro. */
  --accent:#ff0050; --accent-h:#FF4D83; --accent-fg:#0A0A0A;
  --badge-accent:#ff0050;
  /* Texto */
  --text:#EDE8DF; --text2:#A79C88; --text3:#8B7E6D;
  /* Sinais — usados como texto em badge de contorno, logo AA em corpo pequeno */
  --green:#3CE600; --red:#FF6B6B; --red-h:#FF9494; --warning:#E3B341;
  /* Rótulo sobre o preenchimento destrutivo. Existe pelo mesmo motivo que
     `--accent-fg`: no escuro o `--red` é claro, e branco sobre ele dava 2.78:1
     num botão que apaga coisas. */
  --danger-fg:#0A0A0A;
  /* Indicador de foco — 1.4.11 alcança o foco tanto quanto o limite */
  --focus:#7FC8FF;
  /* Fundo neutro claro das placas na conferência (decisão de projeto, item 8):
     a percepção de cor da placa não pode depender do tema da UI, então estes
     dois NÃO são sobrescritos no tema claro. */
  --preview:#EAE7E1; --preview-erro:#8A1B1B;
  /* O texto que a SPA escreve dentro da caixa da prévia ("Desenhando a
     prévia…"). Herdava `--text2`, e o fundo fixo com texto do tema dava
     2.19:1 no escuro (F7a). Fixo pelo mesmo motivo do fundo. */
  --preview-texto:#4E4740;
  /* Véu: cor por cima de outra coisa, não sobre uma superfície. Entrou como
     `rgba()` literal no index.html e por isso não tinha tema nenhum — o
     backdrop do diálogo escurecia igual nos dois. Não tem par de contraste no
     CONTRATO porque não carrega informação: separa camadas. (A listra da caixa
     reservada, o outro véu, saiu com a caixa na F6.) */
  --scrim:rgba(0,0,0,.6);
  /* Os controles nativos (lista aberta do select, botão do campo de arquivo,
     barras de rolagem) seguem o tema só se ele for declarado (F7a). */
  color-scheme:dark;
}

:root[data-theme="light"] {
  --bg:#DED6CC; --sidebar:#DED6CC; --card:#E8E2D9; --card2:#EDE8E0;
  --input:#F4F0E9; --nav-act:#D3CABD;
  /* A divisória é a `light-border` do DESIGN-DEA.md; a forte é a divisória de
     antes da F7a (Duda, 13/10). Pesam 1.25:1 e 1.67:1 contra o fundo, perto
     do que as duas pesam no escuro (1.14 e 1.38); a divisória de antes pesava
     1.67 e a forte, 2.16. */
  --border:#C8C0B4; --border-mid:#B0A695; --border-strong:#655D51;
  /* O acento é o mesmo do escuro (ver cabeçalho): #ff0050 preenche, #B20038
     lê. Os três primeiros nem precisariam estar aqui; ficam para o claro se
     ler inteiro neste bloco. */
  --accent:#ff0050; --accent-h:#FF4D83; --accent-fg:#0A0A0A;
  --badge-accent:#B20038;
  --text:#1A1714; --text2:#4E4740; --text3:#625B52;
  --green:#146B0A; --red:#A32222; --red-h:#8A1B1B; --warning:#765705;
  --danger-fg:#FFFFFF;
  --focus:#0B4FA8;
  /* No claro o véu escurece menos (o fundo já é claro, e .6 de preto sobre
     #DED6CC apaga a página). */
  --scrim:rgba(0,0,0,.45);
  color-scheme:light;
}
