/* ===========================================================================
   A PALETA — o único lugar deste arquivo onde cor hexadecimal pode aparecer.

   São QUATRO temas (decisão do usuário, 2026-08-06): claro institucional,
   papel, escuro e escuro de alto contraste. Cada um define o MESMO conjunto de
   variáveis; nenhuma regra de layout muda entre eles. Trocar de tema é trocar
   valor de variável, e é só por isso que quatro temas são sustentáveis.

   O tema mora no atributo `data-tema` do <html> (antes era a classe `escuro`,
   que só sabia dizer ligado/desligado). Sem atributo = claro institucional.

   REGRA: fora deste bloco, cor vem de `var(--…)`. `tests/teste_visual.py`
   reprova quem cravar hexadecimal numa regra. As exceções são poucas, estão
   marcadas no próprio arquivo e listadas lá.

   NOMES HISTÓRICOS: `--azul`, `--azul-claro`, `--azul-fraco` e `--realce` são
   usados por ~30 templates. Renomeá-los agora seria mexer em arquivo de outras
   frentes e colher conflito de merge sem ganho. Então eles viraram APELIDOS de
   `--acao*`: código novo usa `--acao`, código antigo continua funcionando, e a
   migração pode acontecer depois, tela por tela. No tema papel `--azul` guarda
   um verde — o nome mente, o apelido é a dívida assumida, e está dito aqui.
   =========================================================================== */

/* ---------- 1. CLARO INSTITUCIONAL (o de sempre; é o padrão) ---------- */
:root {
  --fundo: #eef2f7;          /* fundo geral, cinza-azulado bem claro */
  --painel: #ffffff;         /* cartões, barra lateral, topo */
  --painel-2: #f1f5fa;       /* realce sutil (linhas, campos) */
  --texto: #1f2a37;          /* texto principal, azul-ardósia escuro */
  --texto-suave: #5f6b7a;    /* texto secundário */

  --acao: #0d5aa7;           /* cor primária de ação — azul institucional PGE/MS */
  --acao-hover: #1671c6;     /* hover e cor de link — o valor histórico, intocado */
  --acao-fraco: #e7f0fa;     /* fundo de item ativo/hover na lateral */
  /* Texto SOBRE esse realce fraco. Papel distinto do de `--acao`, que é
     pensada para fundo claro: no tema escuro o azul de ação media 4,25:1
     sobre o próprio realce e reprovava. Nos outros três o valor coincide
     com `--acao` — a variável existe porque UM tema precisa divergir. */
  --acao-ativo: #0d5aa7;
  --acao-texto: #ffffff;     /* o que se lê DENTRO do botão primário */

  --verde: #178a54;          /* verde institucional MS */
  --ok: #178a54;
  --erro: #c23b3b;
  --alerta: #b7791f;
  --sobre-ok: #ffffff;       /* texto sobre um fundo --ok sólido (o aviso flutuante) */

  /* Pastéis semânticos. Existem como PAR (fundo + texto) porque é o par que
     garante o contraste: quem mexer num precisa refazer a conta do outro. Um
     trio só serve às etiquetas, aos avisos e ao banner de férias — antes eram
     as mesmas cores repetidas em quatro lugares da folha. */
  --ok-bg: #e9f6ef;      --ok-tx: #0f6b40;
  --erro-bg: #fbecec;    --erro-tx: #a02d2d;
  --alerta-bg: #fdf3e3;  --alerta-tx: #8a5a12;
  /* Um QUARTO par, laranja, para a etiqueta de "recurso pendente" da Guia
     (2026-08-07). Existe porque o amarelo do alerta já é a etiqueta de
     "repercussão reconhecida", e as duas aparecem lado a lado no mesmo item:
     sem um tom próprio, o leitor veria duas etiquetas iguais dizendo coisas
     diferentes. */
  --pendente-bg: #fdeadb;  --pendente-tx: #8a4b12;

  /* DUAS bordas, e a diferença é normativa, não estética: a borda de um campo
     é "informação necessária para identificar um componente de interface" e a
     norma pede 3:1 para ela; um filete que só separa linhas de tabela é
     decorativo e isento. Enquanto houve uma variável só, o campo ficou com a
     cor do filete e mediu 1,30:1 — invisível. */
  --borda: #dbe3ec;          /* CONTORNO do bloco: cartão, moldura */
  /* O filete que separa LINHA de tabela dentro de um bloco. Papel diferente
     do contorno: são dezenas deles numa tela, e é a soma que pesa. Nos três
     temas claros coincide com `--borda`; no alto contraste precisa ser bem
     mais calmo (direção do usuário: "menos contraste dentro dos cartões"). */
  --filete-linha: #dbe3ec;
  --borda-campo: #74849b;    /* onde se digita: 3,81:1 sobre o painel, 3,39 sobre o fundo */

  /* Superfície dos blocos DENSOS dentro de um cartão — o dia do calendário é
     o caso: dezenas de quadradinhos lado a lado. Nos temas claros ela é a
     mesma do cartão (o ladrilho se distingue pela borda e pelo vão); no alto
     contraste ela precisa ser OUTRA, porque ali nada se distingue por tom. */
  --ladrilho: #ffffff;
  --switch-thumb: #ffffff;   /* a bolinha do interruptor */
  --edicao-bg: #fffbe9;      /* realce do modo de edição de textos e da célula da Equipe */
  --balao-bg: #fdf3e3;       /* balão de aviso do Início */
  --balao-borda: #f0dcae;
  --fds-dia: #e8edf3;        /* dia de fim de semana no calendário da chefia/equipe */
  --fds-faixa: #f4f7fb;      /* a faixa de fundo do mesmo fim de semana */
  --reservada-bg: #fbf7ee;   /* linha de conta reservada, em Usuários */
  --pisca-bg: #ffe6b0;       /* item "Mural" piscando com publicação sem ciência */
  --pisca-tx: #8a5a12;
  --opacidade-herdada: .8;   /* permissão que vem da categoria do cargo */

  --filete-a: #0d5aa7;       /* a faixa no topo da barra lateral */
  --filete-b: #178a54;

  /* FORMA por tema (direção do usuário, 2026-08-06): a serifa no título, a
     faixa no cartão e o botão de canto reto valem SÓ no papel e no alto
     contraste. O claro institucional e o escuro voltaram à forma original.
     É a primeira vez que os temas divergem em algo que não é cor — o custo
     disso está dito no PLANO-visual.md, seção 12. */
  /* `0px`, e não `0`: desde 2026-08-08 a folga do topo do cartão é
     `calc(--card-pad + --faixa-cartao)`, e somar um número SEM unidade a um
     comprimento é inválido em CSS — a declaração inteira cai e o cartão fica com
     folga zero. Foi o que aconteceu, e foi visto na medição. Como tamanho de
     fundo (o outro uso desta variável) `0` e `0px` são a mesma coisa. */
  --faixa-cartao: 0px;
  /* ÍCONES: aqui a tela mostra o CARACTERE de sempre (emoji). Os ícones de traço
     valem só no papel e no alto contraste — direção do usuário, 2026-08-06, e é
     a mesma regra que já governa a serifa do título, a faixa do cartão e o botão
     de canto reto. A página traz as duas formas; estas variáveis escolhem. */
  --ico-orig: inline;
  --ico-traco: none;
  --ico-tam: 17px;
  --ico-larg: 20px;
  --marca-tam: 22px;
  --ico-btn: 17px;
  --botao-raio: var(--raio);
  --botao-sec-bg: #ffffff;
  --raio: 10px;
  --lateral-larg: 240px;
  --lateral-larg-recolhida: 62px;
  --sombra: 0 1px 3px rgba(16, 42, 67, .06), 0 1px 2px rgba(16, 42, 67, .04);
  /* diz ao navegador em que tom desenhar os controles NATIVOS (caixa de seleção,
     barra de rolagem, seletor de data) — sem isto eles ficariam brancos no meio
     da tela escura, e nenhuma folha de estilo os alcança */
  color-scheme: light;
}

/* Apelidos dos nomes históricos. Ficam FORA do bloco de tema, apontando para as
   variáveis novas, então valem nos quatro temas sem repetição. */
:root {
  --azul: var(--acao);
  --azul-claro: var(--acao-hover);
  --azul-fraco: var(--acao-fraco);
  --realce: var(--acao);
  --realce-2: var(--acao-hover);
  /* Texto sobre uma cor VIVA vinda do dado, não do tema: o pino da agenda e a
     barra do calendário recebem a cor da categoria por atributo `style`. Branco
     é a leitura certa sobre qualquer uma delas, nos quatro temas — então este é
     o único valor que não varia por tema. */
  --sobre-vivido: #ffffff;
  /* ESCOLHA B do usuário (2026-08-06): serifa no título, sans no corpo. A
     serifa entra onde há poucas palavras e nenhum número para conferir; o
     corpo, a tabela e o prazo seguem em sans, que é o que se lê melhor em
     tela densa. Fontes já instaladas no Windows — nada baixado de fora, o
     que manteria o site dependente de servidor de terceiros e quebraria
     offline. Igual nos quatro temas: tipografia é identidade, não tema. */
  --fonte-titulo: inherit;   /* claro e escuro: título na fonte do corpo */
}

/* A CAIXA do ícone — quanto ele OCUPA — separada do DESENHO, que é quanto ele
   mede (2026-08-09, direção do usuário: *"os modos papel e alto contraste não
   alteram o espaçamento entre ícones; o espaçamento adequado é o dos modos claro
   e escuro"*).

   O que estava acontecendo, medido na tela antes da correção: a altura da caixa
   do ícone era a sua própria altura de linha (tamanho × `--esc-linha`), e era ela
   — e não o rótulo, que mede menos — quem mandava na altura da linha do menu.
   Como o papel e o alto contraste desenham o ícone MAIOR de propósito (21px de
   traço contra 17px de emoji, decisão de 2026-08-06: desenho vazado pesa menos
   que mancha cheia), cada item do menu crescia 5,6px e o menu inteiro ficava
   89,5px mais alto do que no claro. O tema mudava o ESPAÇAMENTO, que não é
   assunto dele.

   A separação resolve os dois pedidos de uma vez: o ícone continua sendo
   desenhado maior nos temas autorais (`--ico-tam`, `--marca-tam`, que seguem
   sendo do tema), e a caixa que ele ocupa passa a ser a mesma nos quatro
   (`--ico-caixa`, `--marca-caixa`) — a do claro e do escuro, que é a aprovada.
   Cabe com folga: em `conforto` a caixa dá 26,35px e o traço maior mede 21px.

   ⚠️ Estas duas NÃO podem ser redefinidas dentro de um bloco de tema — é
   exatamente isso que reintroduziria o defeito. Não é pedido de atenção: o
   `teste_eixos_ortogonais` já reprova variável de tamanho em bloco de tema fora
   da lista de cruzamentos, e elas ficam de fora dessa lista de propósito.
   Multiplicam por `--esc-ico` porque a ESCALA continua podendo encolher tudo na
   mesma proporção — é o outro eixo, e esse sim mexe em tamanho. */
:root {
  --ico-caixa: 17px;     /* a caixa do ícone do menu = a do claro/escuro */
  --marca-caixa: 22px;   /* a caixa do ícone da marca = a do claro/escuro */
}

/* ---------- 2. PAPEL — escritório clássico, página de livro antigo ----------
   Os tons saíram de MEDIÇÃO das fotos do gabinete (static/imagens/): a cor
   dominante delas é mogno escuro, que daria um tema escuro; o que serve é a
   faixa CLARA — papel de livro, latão, o âmbar do pôr do sol. O verde é o das
   plantas de `fundo-mesa.jpg`.

   A restrição do usuário rege este tema: *"a página não deve ficar muito pesada
   visualmente; evitar aspecto retrógrado; é clássico chique"*. Em regra: madeira
   e latão entram como TRAÇO (filete, borda), nunca como massa — nenhum painel
   tingido, nenhum gradiente marrom de fundo, nenhuma textura. O que domina a
   tela é o papel claro e o espaço vazio.

   Aqui `--acao` guarda um verde, e o apelido `--azul` aponta para ele. Ver a
   nota sobre nomes históricos no topo do arquivo. */
:root[data-tema="papel"] {
  color-scheme: light;
  --fundo: #ece3d2;
  --painel: #faf5e9;
  --painel-2: #f3ebd9;
  --texto: #2b2118;
  --texto-suave: #5c4b3a;
  --acao: #2f6b3d;
  --acao-hover: #255630;     /* no tema claro o realce ESCURECE: clarear mede 4,03 e reprova */
  --acao-fraco: #e6eee2;
  --acao-ativo: #2f6b3d;
  --acao-texto: #ffffff;
  --verde: #2f6b3d;
  --ok: #2f6b3d;
  --erro: #9c3328;
  --alerta: #7d5f10;
  --sobre-ok: #ffffff;
  --ok-bg: #e6efe3;      --ok-tx: #245530;
  --erro-bg: #f7e6e2;    --erro-tx: #8a2c22;
  --alerta-bg: #f6edd7;  --alerta-tx: #6b5210;
  --pendente-bg: #f3e2d0;  --pendente-tx: #7a4413;
  --borda: #ded2b8;          /* filete pálido: é o que deixa a tela leve */
  --filete-linha: #ded2b8;
  --borda-campo: #8f7a5c;    /* 3,78:1 sobre a página — o piso da norma */
  --faixa-cartao: 2px;
  /* ÍCONES DE TRAÇO — só neste tema e no outro autoral. MAIORES que o caractere
     que substituem (21 contra 17): desenho vazado pesa menos que mancha colorida
     cheia, então o mesmo tamanho parece menor. O encaixe alarga junto, senão o
     ícone encosta no rótulo. */
  --ico-orig: none;
  --ico-traco: inline-flex;
  --ico-tam: 21px;
  --ico-larg: 26px;
  --marca-tam: 27px;
  --ico-btn: 20px;
  --botao-raio: 2px;
  --botao-sec-bg: #faf5e9;
  --fonte-titulo: Cambria, Georgia, "Times New Roman", serif;
  --ladrilho: #faf5e9;
  --switch-thumb: #faf5e9;
  --edicao-bg: #f6edd7;
  --balao-bg: #f6edd7;
  --balao-borda: #e0cfa4;
  --fds-dia: #ece3d2;
  --fds-faixa: #f3ebd9;
  --reservada-bg: #f6edd7;
  --pisca-bg: #f6edd7;   --pisca-tx: #6b5210;
  --opacidade-herdada: .8;
  --filete-a: #6b4423;       /* madeira → latão, onde no claro é azul → verde */
  --filete-b: #8a6b12;
  --sombra: 0 1px 3px rgba(80, 56, 32, .10), 0 1px 2px rgba(80, 56, 32, .07);
}

/* ---------- 3. ESCURO (o de sempre) ----------
   Sobre os azuis: `--acao` é usado das duas formas — como FUNDO de botão com
   texto por cima e como COR DE TEXTO sobre o painel. No claro isso convive; no
   escuro, um azul escuro o bastante para o texto branco some contra o fundo. A
   saída foi um azul médio (bom como texto sobre o painel escuro) e texto ESCURO
   dentro do botão primário (`--acao-texto`). */
:root[data-tema="escuro"] {
  color-scheme: dark;
  --fundo: #10161e;
  --painel: #1a2330;
  --painel-2: #232f3f;
  --texto: #e7edf4;
  --texto-suave: #a7b4c4;
  --acao: #4a90d9;
  --acao-hover: #6fb0ec;
  --acao-fraco: #1c2c3d;
  --acao-ativo: #6fb0ec;   /* 6,16:1 — o azul de ação daria 4,25 */
  --acao-texto: #08121c;
  --verde: #2f9e70;
  --ok: #46b98a;
  --erro: #e07a7a;
  --alerta: #d9a441;
  /* texto ESCURO sobre o verde claro do aviso flutuante. Antes era branco
     cravado, o que dava contraste ruim: --ok no escuro é um verde claro. */
  --sobre-ok: #08121c;
  --ok-bg: #123024;      --ok-tx: #a8e6c8;
  --erro-bg: #3a1d1d;    --erro-tx: #f0b4b4;
  --alerta-bg: #3a2f16;  --alerta-tx: #f0d59a;
  --pendente-bg: #3a2412;  --pendente-tx: #f0b47a;
  --borda: #2b3949;
  --filete-linha: #2b3949;
  --borda-campo: #67788d;    /* 3,50:1 sobre o painel; o filete sozinho dava 1,34 */
  /* `0px`, e não `0`: desde 2026-08-08 a folga do topo do cartão é
     `calc(--card-pad + --faixa-cartao)`, e somar um número SEM unidade a um
     comprimento é inválido em CSS — a declaração inteira cai e o cartão fica com
     folga zero. Foi o que aconteceu, e foi visto na medição. Como tamanho de
     fundo (o outro uso desta variável) `0` e `0px` são a mesma coisa. */
  --faixa-cartao: 0px;
  /* ÍCONES: aqui a tela mostra o CARACTERE de sempre (emoji). Os ícones de traço
     valem só no papel e no alto contraste — direção do usuário, 2026-08-06, e é
     a mesma regra que já governa a serifa do título, a faixa do cartão e o botão
     de canto reto. A página traz as duas formas; estas variáveis escolhem. */
  --ico-orig: inline;
  --ico-traco: none;
  --ico-tam: 17px;
  --ico-larg: 20px;
  --marca-tam: 22px;
  --ico-btn: 17px;
  --botao-raio: var(--raio);
  --botao-sec-bg: #232f3f;
  --ladrilho: #1a2330;
  --switch-thumb: #e7edf4;
  --edicao-bg: #2e2a18;
  --balao-bg: #2e2716;
  --balao-borda: #4a3f1e;
  --fds-dia: #232f3f;
  --fds-faixa: #16202c;
  --reservada-bg: #2a2519;
  --pisca-bg: #3a2f16;   --pisca-tx: #f0d59a;
  --opacidade-herdada: .95;  /* .8 some no fundo escuro */
  --filete-a: #4a90d9;
  --filete-b: #2f9e70;
  --sombra: 0 1px 3px rgba(0, 0, 0, .5), 0 1px 2px rgba(0, 0, 0, .4);
}

/* ---------- 4. ESCURO DE ALTO CONTRASTE ----------
   Alvo AAA (7:1), não AA. E a diferença para o escuro comum NÃO é letra mais
   clara: medido, o escuro comum já dá 13,4:1 no texto, que é AAA. O que falta
   nele é o resto — as superfícies se distinguem por TOM, e tom é justamente o
   que menos se enxerga com baixa visão. Então aqui: borda visível em tudo,
   nenhuma transparência, nenhuma sombra, e nada de texto apagado
   (`--opacidade-herdada: 1`, porque apagar texto é o oposto do que este tema
   existe para fazer). */
:root[data-tema="alto"] {
  color-scheme: dark;
  --fundo: #000000;
  --painel: #141414;         /* era #0d0d0d: contra o preto o cartão sumia */
  --painel-2: #2e2e2e;       /* era #1c1c1c: agora o realce interno se enxerga */
  /* Branco PURO sobre quase-preto brilha (halação) e cansa em area grande —
     direção do usuário: o ajuste do ladrilho bastou nos quadradinhos de
     férias, mas o cartão grande continuava duro. #dedede mede 13,69:1 no
     cartão: continua AAA com folga (que pede 7), e a glare sai. "Alto
     contraste" é cumprir AAA e delimitar bem, não maximizar cada par. */
  --texto: #dedede;
  --texto-suave: #c4c4c4;
  --acao: #6ee7a0;
  --acao-hover: #9df3c0;
  --acao-fraco: #2e2e2e;
  --acao-ativo: #6ee7a0;
  --acao-texto: #000000;
  --verde: #6ee7a0;
  --ok: #6ee7a0;
  --erro: #ff9e9e;
  --alerta: #f0cf6a;
  --sobre-ok: #000000;
  /* sem pastel: o fundo continua preto e a cor fica na letra e na borda —
     pastel é contraste baixo por definição */
  --ok-bg: #000000;      --ok-tx: #6ee7a0;
  --erro-bg: #000000;    --erro-tx: #ff9e9e;
  --alerta-bg: #000000;  --alerta-tx: #f0cf6a;
  --pendente-bg: #000000;  --pendente-tx: #ffb877;
  /* O CONTORNO segue forte: é ele que vira a faixa de 4px do cartão, e é a
     faixa que delimita quando o preenchimento não delimita (1,14:1 entre
     página e cartão). Já o filete de LINHA cai para #4a4a4a: numa tabela de
     vinte linhas, vinte traços a 5,48:1 é o que fazia a grade gritar. */
  --borda: #8c8c8c;
  --filete-linha: #4a4a4a;
  /* Era #ffffff (13,6:1 contra o ladrilho). Branco puro em CADA borda de
     campo e em cada dia do calendário virava uma parede de linhas — direção
     do usuário: "reduzir um pouco o contraste dentro dos cartões". Este
     cinza claro mede 5,71:1 sobre o ladrilho e 8,83 sobre o fundo, bem acima
     dos 3:1 da norma: a exigência continua cumprida, a dureza sai. */
  --borda-campo: #a8a8a8;
  --switch-thumb: #ffffff;
  --faixa-cartao: 2px;
  /* ÍCONES DE TRAÇO — só neste tema e no outro autoral. MAIORES que o caractere
     que substituem (21 contra 17): desenho vazado pesa menos que mancha colorida
     cheia, então o mesmo tamanho parece menor. O encaixe alarga junto, senão o
     ícone encosta no rótulo. */
  --ico-orig: none;
  --ico-traco: inline-flex;
  --ico-tam: 21px;
  --ico-larg: 26px;
  --marca-tam: 27px;
  --ico-btn: 20px;
  --botao-raio: 2px;
  --botao-sec-bg: #0d0d0d;
  --fonte-titulo: Cambria, Georgia, "Times New Roman", serif;
  --ladrilho: #2e2e2e;
  --edicao-bg: #2e2e2e;
  --balao-bg: #2e2e2e;
  --balao-borda: #8c8c8c;
  --fds-dia: #2e2e2e;
  --fds-faixa: #141414;
  --reservada-bg: #2e2e2e;
  --pisca-bg: #2e2e2e;   --pisca-tx: #f0cf6a;
  --opacidade-herdada: 1;
  --filete-a: #ffffff;
  --filete-b: #6ee7a0;
  --sombra: none;
}
/* AQUI HAVIA um bloco de ~25 regras `:root.escuro .x` que corrigia, uma a uma,
   as cores que os templates cravavam: as etiquetas, os avisos, o balão do
   Início, o fim de semana do calendário, a célula em edição da Equipe. Ele saiu
   inteiro nesta mudança.

   O motivo é aritmético. Aquele bloco era a SEGUNDA cópia de cada cor — a
   primeira estava no `<style>` do template. Com dois temas isso custava duas
   cópias; com quatro custaria quatro, e cada tela nova nasceria devendo três
   correções que ninguém lembra de escrever. Agora o template pede
   `var(--alerta-bg)` e cada tema responde a sua — uma cópia por tema, no bloco
   de paleta, que é onde se olha quando se quer mudar cor.

   O que restou como regra de tema está logo abaixo, e é só o que NÃO é cor. */

/* ===========================================================================
   A ESCALA — o SEGUNDO eixo, independente do tema (2026-08-08).

   O tema responde "de que cor". A escala responde "de que tamanho": corpo da
   letra, altura de linha, tamanho de título, folga dentro do cartão, altura da
   célula de tabela, tamanho do botão, largura da barra lateral, raio de canto.
   São dois eixos que se cruzam — qualquer um dos quatro temas com qualquer uma
   das quatro escalas —, e é por isso que nenhuma variável de cor aparece daqui
   para baixo, nem nenhuma variável de tema é redefinida. Trocar de escala não
   troca o tema, e trocar de tema não troca a escala.

   Por que um eixo novo em vez de simplesmente encolher os valores de sempre:
   o motivo é o relato do usuário — a tela atual lê bem quando tem pouca coisa e
   fica poluída quando a aba traz tabela longa e muitos cartões. Isso não é um
   valor errado, são DOIS usos diferentes da mesma tela; um valor só não atende
   os dois, e a escolha é de quem olha.

   O eixo mora no atributo `data-escala` do <html>, escrito antes da primeira
   pintura pelo script do <head> (mesmo caminho do tema). Sem atributo, ou com
   valor desconhecido, vale `conforto` — que reproduz EXATAMENTE a tela de hoje.

   NO AR VÃO DUAS, e as outras ficam GUARDADAS — decisão do usuário em
   2026-08-08: *"no ar, irão apenas dois, os demais ficam guardados; se o
   dia-a-dia incomodar, recuperamos os guardados como alternativas"*. No menu
   aparecem `conforto` e `meio`; `esbelta` e `delicada` continuam existindo por
   inteiro e alcançam-se por `?escala=esbelta` no endereço. É de propósito que
   guardar signifique "fora do menu" e não "fora do arquivo": uma alternativa que
   se recupera com um endereço custa 36 linhas; uma que se recupera do histórico
   do git custa uma sessão. A `compacta` foi DESCARTADA (não guardada) por
   tamanho de leitura, e no lugar dela ficou só a nota do porquê.

   ⚠️ Estes blocos precisam vir DEPOIS dos blocos de tema. `:root[data-tema=…]` e
   `:root[data-escala=…]` têm a MESMA especificidade, então quem ganha nas duas
   variáveis que os dois eixos disputam (`--raio`, `--lateral-larg`) é a última
   declaração do arquivo. É proposital: tamanho é assunto da escala.

   ⚠️ O que estes blocos AINDA não alcançam: as telas que trazem `<style>` próprio
   com medida cravada — a agenda e o calendário da chefia, a tabela da Equipe, o
   detalhe do processo judicial. Elas encolhem no que herdam (letra do corpo,
   cartão, botão, tabela padrão) e ficam no tamanho de hoje no que é delas. Se uma
   escala for escolhida, a segunda passada é converter essas medidas — está dito
   aqui para não parecer feito.
   =========================================================================== */

/* ---------- ESCALA PADRÃO: `conforto` — a tela como ela é hoje ----------
   Todo valor abaixo é o número que já estava cravado na regra correspondente.
   Enquanto ninguém escolher escala, a tela não muda um pixel — que é a condição
   para oferecer alternativas sem arriscar o que já foi aprovado. */
:root {
  --esc-corpo: 15px;         /* corpo do texto */
  --esc-linha: 1.55;         /* altura de linha */
  --esc-h1: 2em;             /* os três títulos: eram o padrão do navegador, */
  --esc-h2: 1.5em;           /* que agora fica explícito para poder variar */
  --esc-h3: 1.17em;
  --titulo-vao: .6em;        /* espaço abaixo do título */
  --titulo-peso: 700;        /* o negrito padrão de h1/h2/h3 */
  --fonte-peq: 13px;         /* rótulo de formulário, cabeçalho de tabela */
  --fonte-mini: 12px;        /* etiqueta */
  --fonte-nano: 11px;        /* título de seção do menu */
  --fonte-topo: 17px;        /* título da barra superior */
  --fonte-usuario: 14px;     /* nome do usuário no canto */
  /* texto de apoio (resumo de notícia, legenda de gráfico, descrição): o degrau
     entre o corpo e o --fonte-peq. Nasceu em 2026-08-09, na passada do lote da
     frente celular: 13 medidas de 14px não tinham variável e ficavam fixas
     quando a escala mudava. O valor de cada escala é o ponto médio entre o
     corpo e o peq dela — derivação, não invenção; o Conforto fica idêntico. */
  --fonte-apoio: 14px;

  /* Multiplicador dos ícones, e não um tamanho fixo: o tamanho base é decisão do
     TEMA (17px nos temas de emoji, 21px nos de traço, porque desenho vazado pesa
     menos que mancha cheia). A escala reduz na mesma proporção sem desfazer essa
     decisão — é o que mantém os dois eixos independentes. */
  --esc-ico: 1;

  --card-pad: 18px;          /* folga interna do cartão */
  --card-vao: 18px;          /* espaço entre um cartão e o seguinte */
  --sombra-card: var(--sombra);  /* variável PRÓPRIA: `--sombra` é do tema e
                                    continua valendo para menu e barra flutuante */
  --conteudo-pad: 22px;      /* margem da área de trabalho */
  --conteudo-larg: 1200px;   /* largura máxima do texto */
  --topo-y: 12px;
  --celula-y: 8px;  --celula-x: 10px;   /* célula de tabela */
  --botao-y: 8px;   --botao-x: 16px;
  --campo-y: 9px;   --campo-x: 10px;    /* onde se digita */
  --etiqueta-y: 2px; --etiqueta-x: 10px;
  --flash-y: 10px;  --flash-x: 14px;
  --nav-y: 9px;     --nav-vao: 11px;    /* item do menu lateral */
  --grade-min: 280px; --grade-vao: 16px; /* grade de cartões */
  --cal-min: 300px;                      /* mês do calendário anual */
  --btn-quad: 34px;                      /* botão quadrado (recolher a lateral) */
  --raio-peq: 6px;
}

/* ---------- 1. MEIO-TERMO — a que vai ao ar ----------
   Não é uma média das outras duas: cada valor abaixo saiu de uma coisa que o
   usuário disse ter percebido numa aba, em 2026-08-08, e as cinco observações
   estão anotadas onde cada uma decidiu. Onde ele não se manifestou, vale a
   esbelta — que era a base que ele já preferia.

   As duas escolhas que NÃO são da esbelta, e por que:

   (a) `--celula-x: 8px` (da delicada). Observação: *"em equipe, gosto da delicada
       porque a tabela cabe na largura da tela, sem comprimir colunas e exigir
       barra de rolagem horizontal"*. Medido em tela de 1440px: a tabela da Equipe
       tem 13 colunas, então **cada 1px de folga lateral da célula custa 26px de
       tabela**. Com 9px (esbelta) ela mede 1211 e estoura 33px; com 8px cabe. É a
       variável mais barata do sistema em pixels ganhos por unidade.

   (b) `--esc-corpo: 13.5px` (da delicada). Pelo mesmo motivo: os 26px do item (a)
       sozinhos não fechavam a conta, faltavam ~11px, e eles vêm da letra. Foi
       medido antes de ser escrito, não estimado.

   E `--esc-linha: 1.55` não é de nenhuma das duas: é a de hoje. A esbelta fecha
   para 1,50 e a delicada abre para 1,65; ele pediu *"a altura das linhas da
   esbelta"* (no CEJUSC) mas com a letra menor da delicada — 1,55 sobre 13,5px dá
   20,9px de linha, contra os 21,0px da esbelta. A linha de tabela sai igual à que
   ele aprovou, sem apertar o texto corrido. */
:root[data-escala="meio"] {
  --esc-corpo: 13.5px; --esc-linha: 1.55;
  --esc-h1: 1.6em;     --esc-h2: 1.3em;   --esc-h3: 1.1em;
  --titulo-vao: .55em;
  /* NEGRITO, e a razão é dele em três abas: *"em painel da chefia, gosto da
     altura e do negrito nos cartões da esbelta"*, *"em pessoal, prefiro o título
     em negrito"*, e no Mural *"gosto de 'dúvidas, avisos e orientações' em
     negrito"* — que são os <h2> daquela tela. A exceção que ele pediu no mesmo
     fôlego está numa regra própria, logo abaixo do bloco. */
  --titulo-peso: 700;
  /* 11.5px (da delicada) e não os 12 que a esbelta pediria. Esta variável é o
     tamanho do CABEÇALHO de tabela, e em tela de 1440px ela vale 21px de largura
     na Equipe: com 12px a tabela precisa de 1155 e sobram 10; com 11,5 precisa de
     1134 e sobram 31 — a mesma folga da delicada, que é a que ele aprovou. Dez
     pixels de folga não sobrevivem a um nome mais comprido. */
  --fonte-peq: 11.5px; --fonte-mini: 11.5px; --fonte-nano: 10.5px;
  --fonte-topo: 15.5px; --fonte-usuario: 13.5px;
  --fonte-apoio: 12.5px;  /* ponto médio corpo(13.5)–peq(11.5) */
  --esc-ico: .9;
  /* "a altura dos cartões da esbelta", dita duas vezes (chefia e pessoal) */
  --card-pad: 14px;    --card-vao: 14px;
  --conteudo-pad: 18px; --conteudo-larg: 1320px;
  --topo-y: 10px;
  /* 6px na vertical (esbelta, "a altura das linhas" do CEJUSC) e 8px na
     horizontal (delicada, o que faz a Equipe caber). O eixo vertical e o
     horizontal da mesma célula vêm de escalas diferentes — é literalmente onde
     este meio-termo é meio-termo. */
  --celula-y: 6px;  --celula-x: 8px;
  --botao-y: 6px;   --botao-x: 13px;
  --campo-y: 7px;   --campo-x: 9px;
  --etiqueta-y: 1px; --etiqueta-x: 8px;
  --flash-y: 8px;   --flash-x: 12px;
  --nav-y: 7px;     --nav-vao: 10px;
  --grade-min: 250px; --grade-vao: 13px;
  --cal-min: 265px;
  --btn-quad: 30px;
  --raio: 8px;      --raio-peq: 5px;
  --lateral-larg: 224px;
}
/* O versalete da delicada entra: *"em equipe, gosto da delicada porque o título
   da coluna é mais agradável"*. Custa largura (maiúscula é mais larga que
   minúscula, e o espaçamento soma), e por isso entrou depois de conferir que a
   tabela da Equipe continua cabendo com ele. */
:root[data-escala="meio"] .tabela th {
  text-transform: uppercase; letter-spacing: .06em; font-weight: 600;
}
/* A EXCEÇÃO do negrito, pedida no Mural: *"prefiro 'Bem-vindos ao Ambiente
   Virtual da PS' sem negrito"*. Aquele título é um <h3>, e os títulos que ele
   QUER em negrito (os cartões da Chefia, as sanfonas do Pessoal) também são
   <h3> — então o peso não podia decidir pela etiqueta.

   O que os separa é a estrutura, e é exata: no cartão da Chefia o link envolve o
   título (`<a class="card-link"><h3>`); no item do Mural o título envolve o link
   (`<h3><a>`). `h3:has(> a)` pega o segundo caso e só ele — medido: dos 34 <h3>
   do sistema, exatamente 2 contêm link, e os dois são o título de publicação do
   Mural (a lista e o arquivo). Nenhum outro título muda.

   Escolhi a estrutura em vez do nome de classe de propósito: `.cabeca-publicacao`
   pertence ao módulo `avisos`, de outra frente, e uma regra minha presa ao nome
   dela pararia de valer em silêncio no dia em que a renomeassem.

   Navegador sem `:has()` mostra o título em negrito — ou seja, degrada para o que
   já existe hoje, não para algo quebrado. */
:root[data-escala="meio"] h3:has(> a) { font-weight: 500; }

/* ---------- 2. ESBELTA — guardada, fora do menu ----------
   Reduz a letra e a folga em cerca de 15% e devolve o ganho em LARGURA: a área
   de trabalho passa de 1200 para 1320px, então a tabela ganha coluna em vez de
   ganhar só linha. É a escala para quem acha a de hoje grande demais mas não
   quer trabalhar em tela apertada — o espaço em branco entre blocos continua,
   porque é ele que separa um assunto do outro. */
:root[data-escala="esbelta"] {
  --esc-corpo: 14px;   --esc-linha: 1.5;
  --esc-h1: 1.6em;     --esc-h2: 1.3em;   --esc-h3: 1.1em;
  --titulo-vao: .55em; --titulo-peso: 700;
  --fonte-peq: 12.5px; --fonte-mini: 11.5px; --fonte-nano: 10.5px;
  --fonte-topo: 15.5px; --fonte-usuario: 13.5px;
  --fonte-apoio: 13px;    /* ponto médio corpo(14)–peq(12.5), arredondado */
  --esc-ico: .92;
  --card-pad: 14px;    --card-vao: 14px;
  --conteudo-pad: 18px; --conteudo-larg: 1320px;
  --topo-y: 10px;
  --celula-y: 6px;  --celula-x: 9px;
  --botao-y: 6px;   --botao-x: 13px;
  --campo-y: 7px;   --campo-x: 9px;
  --etiqueta-y: 1px; --etiqueta-x: 8px;
  --flash-y: 8px;   --flash-x: 12px;
  --nav-y: 7px;     --nav-vao: 10px;
  --grade-min: 250px; --grade-vao: 13px;
  --cal-min: 265px;
  --btn-quad: 30px;
  --raio: 8px;      --raio-peq: 5px;
  --lateral-larg: 224px;
}

/* AQUI HAVIA uma terceira escala, `compacta` — 13px de corpo, célula de 4px,
   1560px de largura útil. Ela cabia 36 linhas de tabela onde o conforto cabe 24,
   e era a que melhor respondia ao problema das telas longas. Saiu em 2026-08-08,
   no dia em que entrou, por decisão do usuário depois de ver na tela com o volume
   real: *"descarto compacta por ser muito pequena"*. O ganho de densidade era
   real e a medição não foi contestada — o que reprovou foi o tamanho de leitura,
   que é o critério dele e não se discute com número.

   Fica o registro para quem for propor uma quarta escala: densidade de tabela já
   foi tentada por este caminho e o limite não está na conta de quantas linhas
   cabem, está em quanto se lê sem cansar. */

/* ---------- 3. DELICADA — guardada, fora do menu ----------
   A única das três que NÃO é só "menor": ela encolhe a letra e o canto (4px,
   quase reto) mas ABRE a linha (1,65 contra 1,55) e mantém folga no cartão. O
   efeito é de papelaria fina em vez de painel de controle — e as três diferenças
   de forma abaixo são o que a torna outra coisa, não uma compacta mais frouxa:
   título em peso médio no lugar do negrito, cabeçalho de tabela em versalete, e
   cartão sem sombra. É a leitura mais confortável das três alternativas, e a que
   menos ganha em número de linhas visíveis. */
:root[data-escala="delicada"] {
  --esc-corpo: 13.5px; --esc-linha: 1.65;
  --esc-h1: 1.45em;    --esc-h2: 1.2em;   --esc-h3: 1.05em;
  --titulo-vao: .7em;  --titulo-peso: 500;
  --fonte-peq: 11.5px; --fonte-mini: 11px; --fonte-nano: 10px;
  --fonte-topo: 15px;  --fonte-usuario: 13px;
  --fonte-apoio: 12.5px;  /* ponto médio corpo(13.5)–peq(11.5) */
  --esc-ico: .88;
  --card-pad: 16px;    --card-vao: 12px;  --sombra-card: none;
  --conteudo-pad: 20px; --conteudo-larg: 1240px;
  --topo-y: 10px;
  --celula-y: 7px;  --celula-x: 8px;
  --botao-y: 5px;   --botao-x: 14px;
  --campo-y: 6px;   --campo-x: 9px;
  --etiqueta-y: 1px; --etiqueta-x: 9px;
  --flash-y: 8px;   --flash-x: 13px;
  --nav-y: 6px;     --nav-vao: 10px;
  --grade-min: 240px; --grade-vao: 12px;
  --cal-min: 255px;
  --btn-quad: 29px;
  --raio: 4px;      --raio-peq: 3px;
  --lateral-larg: 216px;
}
/* Versalete no cabeçalho da tabela: é o que faz a coluna se anunciar sem
   precisar de negrito nem de tamanho. Só nesta escala — nas outras o cabeçalho
   continua como sempre foi. */
:root[data-escala="delicada"] .tabela th {
  text-transform: uppercase; letter-spacing: .06em; font-weight: 600;
}

/* Texto que some da tela mas continua sendo anunciado por leitor de tela (o programa que
   lê a página em voz alta para quem não enxerga). `display:none` e `visibility:hidden`
   não servem aqui: os dois tiram o elemento também da leitura. */
.so-leitor-de-tela {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; border: 0;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}

* { box-sizing: border-box; }
/* Três declarações no lugar do atalho `font:` de antes. O atalho aceitaria as
   variáveis, mas separado fica claro qual eixo mexe em quê — e o corpo e a
   altura de linha passaram a variar por ESCALA. */
body {
  margin: 0; background: var(--fundo); color: var(--texto);
  font-family: "Segoe UI", system-ui, sans-serif;
  font-size: var(--esc-corpo); line-height: var(--esc-linha);
}
a { color: var(--azul-claro); text-decoration: none; }
/* `--fonte-titulo` é `inherit` no claro e no escuro — ou seja, o título fica na
   fonte do corpo, exatamente como sempre esteve. Só o papel e o alto contraste
   trocam por serifa. O PESO não é mexido aqui de propósito: alterá-lo mudaria
   os dois temas que devem ficar intocados. */
/* O TAMANHO dos três títulos passou a ser explícito. Antes vinha do padrão do
   navegador (2em / 1.5em / 1.17em), e um valor que não está escrito não pode
   variar por escala — era justamente o h1 de 30px que o usuário apontou como
   "tudo enorme". Os valores da escala `conforto` são exatamente esses padrões,
   então nada muda enquanto ninguém escolher outra escala.
   O PESO agora também é variável, e só a escala `delicada` o baixa para 500. */
h1, h2, h3 { line-height: 1.25; margin: 0 0 var(--titulo-vao); color: var(--texto);
  font-family: var(--fonte-titulo); font-weight: var(--titulo-peso); }
h1 { font-size: var(--esc-h1); }
h2 { font-size: var(--esc-h2); }
h3 { font-size: var(--esc-h3); }
small, .suave { color: var(--texto-suave); }

/* ---------- moldura geral */
.moldura { display: flex; min-height: 100vh; }
.lateral {
  width: var(--lateral-larg); flex-shrink: 0; background: var(--painel);
  border-right: 1px solid var(--borda); padding: 10px 10px; position: sticky;
  top: 0; height: 100vh; overflow-y: auto; overflow-x: hidden;
  transition: width .18s ease;
}
/* faixa institucional azul→verde no topo da lateral */
.lateral::before {
  content: ""; display: block; height: 4px; border-radius: 3px; margin: 2px 4px 10px;
  background: linear-gradient(90deg, var(--azul), var(--verde));
}
.marca {
  display: flex; gap: 9px; align-items: center; padding: 4px 8px 12px; font-weight: 600;
  white-space: nowrap;
}
/* `calc(tamanho do tema × fator da escala)`: o tema diz o tamanho base do ícone,
   a escala o reduz na mesma proporção. Sem o calc, uma escala menor teria de
   cravar um px e desfaria a distinção entre ícone de emoji e ícone de traço. */
/* Caixa FIXA (a do claro/escuro) com o desenho centrado dentro. O `display:flex`
   substitui a antiga aritmética de altura de linha: era ela que deixava o tema
   mandar na altura do título da lateral — 46,67px no claro contra 53,66 no
   papel. Agora o desenho maior ocupa a mesma caixa. */
.marca-icone {
  font-size: calc(var(--marca-tam) * var(--esc-ico));
  height: calc(var(--marca-caixa) * var(--esc-ico) * var(--esc-linha));
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
/* (O estilo do antigo botão `.marca-tema` saiu em 2026-08-06: a pílula voltou a
   ser só a marca, e a escolha de tema mudou para o menu do usuário.) */
.nav-item {
  display: flex; align-items: center; gap: var(--nav-vao); padding: var(--nav-y) 10px;
  border-radius: var(--raio); color: var(--texto); margin-bottom: 2px;
  white-space: nowrap; border-left: 3px solid transparent;
}
/* 21px, e não os 17px de antes (direção do usuário, 2026-08-06: "os ícones estão
   muito pequenos"). O emoji que havia ali tinha corpo colorido e ocupava toda a
   caixa; um traço de 1,1px no mesmo espaço parece menor mesmo tendo o mesmo
   tamanho — desenho vazado pesa menos que mancha cheia. A largura do encaixe
   acompanha, senão o ícone maior encosta no rótulo. */
/* A ALTURA é a mesma nos quatro temas (`--ico-caixa`); só o DESENHO cresce nos
   autorais (`--ico-tam`). Antes desta separação a caixa era a altura de linha do
   próprio ícone, então o traço de 21px empurrava cada item 5,6px para baixo e
   afastava os ícones uns dos outros — o que o usuário viu e mandou corrigir em
   2026-08-09. O `display:flex` centra o desenho na caixa e dispensa o
   `text-align`/`vertical-align`, que só valiam enquanto isto era linha de texto. */
.nav-item .ico { font-size: calc(var(--ico-tam) * var(--esc-ico));
  width: calc(var(--ico-larg) * var(--esc-ico));
  height: calc(var(--ico-caixa) * var(--esc-ico) * var(--esc-linha));
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0; }
/* AS DUAS FORMAS de cada ícone chegam na página, e estas duas regras escolhem a
   do tema. Não dá para escolher no servidor: o tema mora no `localStorage` do
   navegador, e o HTML é montado antes de alguém saber qual tema será lido.
   O custo é uns poucos bytes por item de menu; o ganho é a troca de tema
   continuar instantânea, sem ida ao servidor. */
.ico-orig { display: var(--ico-orig); }
.ico-traco { display: var(--ico-traco); align-items: center; vertical-align: -.15em; }
/* O <svg> é de 1em, então acompanha o `font-size` de quem o contém — o do menu,
   o da marca, o dos botões — sem precisar de uma classe por tamanho. */
.ico-svg { display: block; }
.nav-item:hover { background: var(--acao-fraco); color: var(--acao-ativo); }
/* "Avisos" pisca em amarelo-laranja enquanto houver publicação sem ciência */
@keyframes piscaAviso {
  0%, 100% { background: transparent; color: var(--texto); }
  50% { background: var(--pisca-bg); color: var(--pisca-tx); }
}
.nav-item.piscando { animation: piscaAviso 1.1s ease-in-out infinite; }
/* O mesmo pulso, num CARD do Início (2026-08-07): o do CEJUSC pisca em amarelo
   quando há demanda vencendo hoje ou vencida. Mais lento que o do menu (1,8s
   contra 1,1s) porque a área é grande — no tamanho de um cartão, a cadência do
   item de menu vira estroboscópio.
   ⚠️ Quem pediu ao sistema menos animação (uma preferência do próprio sistema
   operacional) recebe o realce PARADO: a informação continua toda ali, sem o
   movimento. Piscar sem essa saída dispara enxaqueca em quem tem sensibilidade,
   e um aviso de prazo não vale isso. */
@keyframes piscaCard {
  0%, 100% { background: var(--painel); }
  50% { background: var(--pisca-bg); }
}
.card-pisca { animation: piscaCard 1.8s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) {
  .nav-item.piscando { animation: none; background: var(--pisca-bg); color: var(--pisca-tx); }
  .card-pisca { animation: none; background: var(--pisca-bg); }
}
.nav-item.ativo {
  background: var(--acao-fraco); color: var(--acao-ativo);
  border-left-color: var(--acao); font-weight: 600;
}
.nav-secao {
  padding: 14px 10px 4px; font-size: var(--fonte-nano); letter-spacing: .04em;
  text-transform: uppercase; color: var(--texto-suave); white-space: nowrap;
}
.principal { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.topo {
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
  padding: var(--topo-y) var(--conteudo-pad); border-bottom: 1px solid var(--borda);
  font-size: var(--fonte-topo);
  font-weight: 600; background: var(--painel); position: sticky; top: 0; z-index: 5;
}
.topo-esq { display: flex; align-items: center; gap: 12px; min-width: 0; }
.topo-usuario { display: flex; gap: 12px; align-items: center;
  font-size: var(--fonte-usuario); font-weight: 400; }
.conteudo { padding: var(--conteudo-pad); max-width: var(--conteudo-larg); width: 100%; }

/* ---------- botão de recolher a lateral */
.recolher {
  border: 1px solid var(--borda-campo); background: var(--painel); color: var(--texto-suave);
  width: var(--btn-quad); height: var(--btn-quad); border-radius: var(--raio); cursor: pointer;
  font-size: calc(var(--ico-btn) * var(--esc-ico)); line-height: 1; flex-shrink: 0;
}
.recolher:hover { border-color: var(--azul); color: var(--azul); }
/* botão de recolher vive DENTRO da lateral (topo-direita); centraliza ao recolher */
.lateral .recolher { margin: 0 0 6px auto; }
.recolhida .lateral .recolher { margin: 0 auto 6px; }

/* ---------- estado recolhido (rail só com ícones) */
.recolhida .lateral { width: var(--lateral-larg-recolhida); }
.recolhida .nav-item { justify-content: center; gap: 0; padding: var(--nav-y) 0; }
.recolhida .rotulo,
.recolhida .marca-texto,
.recolhida .nav-secao { display: none; }
.recolhida .marca { justify-content: center; padding-left: 0; padding-right: 0; }

/* ---------- blocos */
/* ESCOLHA 2 do usuário (2026-08-06): faixa no topo de cada cartão, no mesmo
   par de cores do filete da barra lateral (madeira→latão no papel, azul→verde
   no institucional). Assim a identidade se REPETE em vez de ser introduzida
   duas vezes, e cumpre a regra do "clássico chique": a madeira aparece em
   2 px, como traço, nunca como massa.
   Feita com gradiente de FUNDO, e não com `border-image`: border-image
   desliga o canto arredondado do elemento, e o cartão perderia o raio. */
.card {
  background: linear-gradient(90deg, var(--filete-a), var(--filete-b))
              top / 100% var(--faixa-cartao) no-repeat, var(--painel);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  /* O topo é a folga NORMAL mais a espessura da faixa do tema — que é
     exatamente a conta que o antigo `--card-pad-topo` fazia à mão em cada um dos
     quatro temas (18 nos sem faixa, 20 nos com faixa de 2px). Escrita como
     `calc`, ela continua certa quando a ESCALA muda a folga, e some uma variável
     que precisava ser mantida em quatro lugares. */
  padding: calc(var(--card-pad) + var(--faixa-cartao)) var(--card-pad) var(--card-pad);
  margin-bottom: var(--card-vao);
  box-shadow: var(--sombra-card);
}
/* O cartão do login já tem a própria barra superior e uma foto atrás: a faixa
   ali seria a segunda linha horizontal em cima da mesma coisa. */
.cartao-login { background-image: none; padding-top: var(--card-pad); }
/* No ALTO CONTRASTE o cartão ganha uma faixa à esquerda. É a única regra de
   layout que muda entre temas, e há uma razão medida para ela: naquele tema o
   fundo é preto e o cartão é #141414 — a diferença entre as duas superfícies é
   de 1,14:1, ou seja, o olho não vê onde um começa e o outro acaba. Num tema
   claro o cartão se destaca pelo tom; num tema quase preto, não há tom que
   destaque, e quem delimita é a FAIXA.
   O modelo veio do usuário: a barra do cartão "edição direta do banco", que ele
   apontou como o que ali funcionou.
   Só a LARGURA é fixada aqui, não a cor — assim a barra amarela do `.sql-aviso`
   (que significa "cuidado, ferramenta destrutiva") continua amarela, em vez de
   virar cinza como as demais. Cor com significado não pode ser atropelada por
   uma regra de aparência. */
:root[data-tema="alto"] .card { border-left-width: 4px; }

/* A foto do gabinete no miolo foi RETIRADA em 2026-08-01: o usuário viu na tela e
   reprovou. A área de trabalho volta ao fundo claro e neutro — a ambientação fica
   nas bordas (entrada e barra lateral), onde não disputa com tabela e formulário. */
.card.estreito { max-width: 460px; }
.card-link { display: block; color: var(--texto); }
.card-link:hover { border-color: var(--azul); box-shadow: 0 2px 10px rgba(13, 90, 167, .12); }
.card-link p { margin: .25em 0; color: var(--texto-suave); }
.grade-cards { display: grid;
  grid-template-columns: repeat(auto-fill, minmax(var(--grade-min), 1fr));
  gap: var(--grade-vao); }

/* ---------- tabelas */
.tabela { width: 100%; border-collapse: collapse; }
.tabela th, .tabela td { text-align: left; padding: var(--celula-y) var(--celula-x);
  border-bottom: 1px solid var(--filete-linha); }
.tabela th { color: var(--texto-suave); font-weight: 600; font-size: var(--fonte-peq); }
.tabela tr:hover td { background: var(--painel-2); }
.acoes { display: flex; gap: 6px; flex-wrap: wrap; }

/* ---------- formulários */
.formulario label { display: block; margin: 10px 0 4px; color: var(--texto-suave);
  font-size: var(--fonte-peq); }
/* `--painel` no lugar do branco cravado: em tema claro ele É branco (nada muda),
   e no escuro o campo acompanha o resto da tela. Mesma troca no .botao-sec. */
.formulario input, .formulario select, .formulario textarea {
  width: 100%; padding: var(--campo-y) var(--campo-x); border-radius: var(--raio);
  border: 1px solid var(--borda-campo); background: var(--painel); color: var(--texto); font: inherit;
}
.formulario input:focus, .formulario select:focus, .formulario textarea:focus {
  outline: none; border-color: var(--azul); box-shadow: 0 0 0 3px rgba(13, 90, 167, .12);
}
.formulario textarea { min-height: 110px; resize: vertical; }
.formulario button { margin-top: 14px; }
.formulario-linha { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.formulario-linha input, .formulario-linha select { width: auto; flex: 1; min-width: 140px; }
.formulario-linha button { margin-top: 0; }
.formulario-inline { display: inline; }

/* ---------- botões e etiquetas */
.botao, .botao-sec {
  display: inline-block; border: 1px solid transparent; border-radius: var(--raio);
  padding: var(--botao-y) var(--botao-x); cursor: pointer; font: inherit;
}
/* ESCOLHA 3 do usuário (2026-08-06): primário SÓLIDO DE CANTO RETO, secundário
   só texto. O canto reto lê como papelaria fina; o raio de 2px (e não 0) evita
   o degrau serrilhado que um canto absolutamente vivo mostra em tela comum. */
.botao { background: var(--acao); color: var(--acao-texto);
  border-radius: var(--botao-raio); }
.botao:hover { background: var(--acao-hover); }
/* O secundário deixa de ter moldura e vira texto sublinhado. Some a borda,
   então some também a questão dos 3:1 — o que identifica o controle passa a
   ser a COR e o SUBLINHADO, que é como um link se identifica.
   ⚠️ O contorno de foco por teclado fica ainda mais importante aqui: sem
   moldura, é a única coisa que mostra onde se está navegando sem mouse. */
.botao-sec { background: var(--botao-sec-bg); border-color: var(--borda-campo);
  color: var(--texto); border-radius: var(--raio); }
.botao-sec:hover { border-color: var(--acao); color: var(--acao); }

/* A forma de LINK do botão secundário, só nos dois temas autorais.
   `border-bottom`, e não `text-decoration: underline`: o sublinhado é
   desenhado glifo a glifo e NÃO atravessa emoji colorido — nos 25 botões
   que têm ícone junto do texto (← Retornar, 🗑, próximo →) a linha saía
   quebrada sob o ícone. A borda atravessa a caixa inteira, sempre. */
:root[data-tema="papel"] .botao-sec,
:root[data-tema="alto"] .botao-sec {
  background: none; border: none; border-bottom: 1px solid currentColor;
  border-radius: 0; color: var(--acao-hover); padding: 6px 2px 3px;
}
:root[data-tema="papel"] .botao-sec:hover,
:root[data-tema="alto"] .botao-sec:hover {
  color: var(--acao); border-bottom-width: 2px; padding-bottom: 2px;
}
/* Sem moldura, o contorno de foco é a ÚNICA coisa que mostra onde se está
   navegando por teclado. Por isso ele é reforçado justamente aqui. */
:root[data-tema="papel"] .botao-sec:focus-visible,
:root[data-tema="alto"] .botao-sec:focus-visible {
  outline: 2px solid var(--acao); outline-offset: 2px; border-radius: 2px;
}
.etiqueta {
  display: inline-block; padding: var(--etiqueta-y) var(--etiqueta-x); border-radius: 999px;
  font-size: var(--fonte-mini); background: var(--painel-2); border: 1px solid var(--borda);
}
/* A COR DO TEXTO passou a sair do par (`--ok-tx`), e não mais de `--ok`. Era
   `--ok` que fazia a etiqueta "deferido" medir 3,94:1 sobre o próprio pastel —
   abaixo dos 4,5 da norma. O par existe justamente para os dois andarem juntos. */
.etiqueta-ok { color: var(--ok-tx); border-color: var(--ok); background: var(--ok-bg); }
.etiqueta-erro { color: var(--erro-tx); border-color: var(--erro); background: var(--erro-bg); }
.etiqueta-alerta { color: var(--alerta-tx); border-color: var(--alerta); background: var(--alerta-bg); }

/* ---------- flashes e vazios */
.flashes { padding: var(--topo-y) var(--conteudo-pad) 0; }
.flash { padding: var(--flash-y) var(--flash-x); border-radius: var(--raio);
  margin-bottom: 8px; border: 1px solid; }
.flash-ok { background: var(--ok-bg); border-color: var(--ok); color: var(--ok-tx); }
.flash-erro { background: var(--erro-bg); border-color: var(--erro); color: var(--erro-tx); }
.flash-alerta { background: var(--alerta-bg); border-color: var(--alerta); color: var(--alerta-tx); }
.aviso-vazio { color: var(--texto-suave); padding: var(--card-pad); text-align: center; }

/* ---------- login */
.pagina-login { display: grid; place-items: center; min-height: 100vh;
  background: linear-gradient(135deg, var(--fundo), var(--painel-2)); }
/* Fundo fotográfico — só nas telas que pedem a classe `fundo-foto`, para não arrastar
   junto as telas de cadastro, que compartilham `.pagina-login`. A foto entra por baixo
   de um véu azul-escuro leve: o cartão é branco opaco e já garante o contraste do texto,
   então o véu só acalma o fundo sem apagar a madeira e o pôr do sol. `cover`+`center`
   mantêm o gabinete centralizado em qualquer proporção de tela; `fixed` fica de fora de
   propósito (o iOS não o honra e a foto "salta" ao rolar). A cor no fim é o que aparece
   enquanto a imagem carrega, evitando o clarão branco. E `minmax(0, 1fr)` obriga a coluna
   a caber na largura útil: sem isso ela cresce até os 360px do cartão, o padding some
   pela direita em tela estreita e o `max-width` do cartão não tem contra o que morder. */
.pagina-login.fundo-foto { padding: 20px; grid-template-columns: minmax(0, 1fr);
  background: linear-gradient(rgba(11, 24, 40, .25), rgba(11, 24, 40, .40)),
              url("imagens/fundo-login.jpg") center / cover no-repeat, #1b2636; } /* !cor-de-foto */
/* Cartão em vidro fosco: 28% de transparência deixa a foto aparecer por trás, e o
   desfoque (`backdrop-filter`, disponível em todos os navegadores atuais desde set/2024)
   impede que o detalhe da estante compita com o formulário. O desfoque é brando de
   propósito — mais que isso achata o que está atrás numa mancha e a transparência perde
   o sentido. Navegador antigo que ignore o desfoque continua legível: o contraste abaixo
   foi calculado SEM contar com ele. */
.pagina-login.fundo-foto .cartao-login {
  background: rgba(255, 255, 255, .5);
  -webkit-backdrop-filter: blur(3px) saturate(115%);
  backdrop-filter: blur(3px) saturate(115%);
  border-color: rgba(255, 255, 255, .5);
  box-shadow: 0 18px 44px rgba(6, 16, 28, .45);
}
/* Com metade da luz do cartão vindo da foto, os rótulos em --texto-suave ficariam em
   1,9:1 — a WCAG AA pede 4,5:1 para texto normal. Este quase-preto mede 4,9:1 sobre o
   pixel mais escuro que passa por trás, sem contar com o desfoque, e é ele que sustenta
   os 50% de transparência acima: as duas coisas andam juntas, mexer numa pede refazer a
   conta da outra. Só aqui — no resto do sistema o cartão é opaco e a cor original serve. */
.pagina-login.fundo-foto .cartao-login .suave,
.pagina-login.fundo-foto .cartao-login .formulario label { color: #0e1620; } /* !cor-de-foto */
.cartao-login { width: 360px; max-width: 100%; border-top: 4px solid var(--azul); }
.cartao-login h1 { font-size: 20px; }

/* ---------- TESTE DE ESCALA: barra lateral como estante de escritório
   (2026-08-01). A foto entra como FUNDO e os itens do menu continuam sendo texto
   HTML por cima — não recortes clicáveis da imagem. Três razões concretas:
   (1) o menu muda por permissão (a chefia tem itens que o servidor não vê), e
   uma imagem tem um número fixo de prateleiras; (2) texto dentro de foto não é
   lido por leitor de tela, não amplia no zoom e não dá para corrigir uma palavra
   sem refazer a arte; (3) o item ativo precisa se destacar, e isso é estado, não
   desenho. As placas douradas abaixo são CSS imitando as da foto.
   Ativa com a classe `lateral-estante` na barra. */
.lateral-estante {
  background-image: linear-gradient(rgba(20, 12, 6, .30), rgba(20, 12, 6, .55)),
                    url("imagens/estante-lateral.jpg");
  background-size: cover; background-position: top center;
  background-repeat: no-repeat; background-color: #2b1c10; /* !cor-de-foto */
  border-right-color: #3a2718; /* !cor-de-foto */
}
.lateral-estante::before { background: linear-gradient(90deg, #c9a227, #8a6b12); } /* !cor-de-foto */
.lateral-estante .marca { color: #f3e6c8; text-shadow: 0 1px 2px rgba(0,0,0,.7); } /* !cor-de-foto */
/* A PRATELEIRA é o botão (pedido do usuário): cada item vira uma faixa invisível
   que cobre uma fatia da estante, distribuída por `flex:1` em vez de coordenadas
   fixas — coordenada fixa quebraria em toda altura de tela diferente. O rótulo some
   da vista (a foto já traz as placas) mas continua no HTML, senão o menu ficaria
   ilegível para leitor de tela e impossível de operar por teclado. */
/* Sem rolagem: a barra é a estante inteira, e uma barra de rolagem cortaria a
   moldura da imagem. Os itens dividem a altura disponível — se um dia forem
   muitos, encolhem em vez de gerar rolagem. */
.lateral-estante { overflow: hidden; padding: 0; display: flex; flex-direction: column; }
.lateral-estante nav { display: flex; flex-direction: column; flex: 1; min-height: 0;
  padding: 0 8px 10px; }
.lateral-estante .nav-item {
  flex: 1; min-height: 0; border: none; border-left: none; border-radius: 0;
  background: transparent; margin: 0; padding: 0;
  display: flex; align-items: center; justify-content: center;
}
.lateral-estante .nav-item .ico,
.lateral-estante .nav-item .rotulo {
  /* invisível na tela, presente para leitor de tela e para o clique */
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
/* Sem retângulo nenhum no passar do mouse nem no item ativo (pedido do usuário):
   a estante é a arte, e um retângulo por cima a suja. O retorno visual fica por
   conta do cursor e, quando os objetos das prateleiras chegarem, do próprio
   objeto. O contorno de foco por TECLADO permanece — sem ele, quem navega sem
   mouse não sabe onde está. */
.lateral-estante .nav-item:hover,
.lateral-estante .nav-item.ativo { background: transparent; box-shadow: none; }
.lateral-estante .nav-item:focus-visible { outline: 2px solid #f3e6c8; outline-offset: -3px; } /* !cor-de-foto */
.lateral-estante .nav-secao { display: none; }

/* Recolhida: só uma RIPA de madeira e o puxador — nenhuma prateleira à vista.
   A faixa vem da borda direita da foto (a moldura lateral da estante, madeira
   lisa), ampliada para preencher a altura; `background-size: auto 300%` amplia o
   suficiente para que nenhuma prateleira caiba no recorte. */
/* NB: a classe `recolhida` vive no <html>, não na barra — daí o seletor
   descendente. */
.recolhida .lateral-estante {
  background-image: linear-gradient(rgba(20, 12, 6, .30), rgba(20, 12, 6, .55)),
                    url("imagens/estante-lateral.jpg");
  background-position: 97% center; background-size: auto 300%;
  cursor: pointer; position: relative;
}
/* o puxador desenhado sobre a ripa: um arco de latão preso por duas bases */
.recolhida .lateral-estante::after {
  content: ""; position: absolute; left: 50%; top: 50%;
  width: 14px; height: 92px; transform: translate(-50%, -50%);
  border: 3px solid #c9a94f; border-left-color: transparent; /* !cor-de-foto */
  border-radius: 0 10px 10px 0;
  box-shadow: 2px 0 5px rgba(0,0,0,.55), inset -1px 0 0 rgba(255,240,200,.5);
}
/* ⚠️ Estas duas regras (e o `cursor:pointer` acima) foram escritas quando a barra
   recolhida INTEIRA reabria ao clique. Essa regra caiu em 2026-08-02 — só o botão
   de três linhas abre e fecha —, e o bloco `.lateral-estante` está dormente desde
   2026-08-01. Quem for revivê-lo precisa devolver o botão de recolher à vista,
   senão a estante recolhida não terá como reabrir. */
.recolhida .lateral-estante nav,
.recolhida .lateral-estante .recolher { display: none; }

/* ---------- permissões */
.grade-permissoes { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 6px; margin: 10px 0; }
.permissao { display: flex; gap: 6px; align-items: center; padding: 6px 8px; border-radius: var(--raio); background: var(--painel-2); }
/* Fundo apagado = "vem da categoria do cargo", não "está travada". A opacidade
   caiu de 0,55 para 0,8 em 2026-08-02, quando a caixa deixou de ser desabilitada:
   a chefia passou a poder RETIRAR o que a categoria dá, e um rótulo lavado demais
   continuaria dizendo "não se mexe aqui". */
.permissao-do-papel { opacity: var(--opacidade-herdada); }

/* ---------- menu do usuário (clicar no nome → Dados cadastrais / Sair) */
.usuario-menu { position: relative; }
.usuario-menu > summary { cursor: pointer; list-style: none; padding: 6px 10px;
  border-radius: var(--raio); user-select: none; }
.usuario-menu > summary::-webkit-details-marker { display: none; }
.usuario-menu > summary:hover { background: var(--azul-fraco); }
.usuario-seta { color: var(--texto-suave); font-size: 11px; }
.usuario-menu-pop { position: absolute; right: 0; top: 100%; margin-top: 4px;
  background: var(--painel); border: 1px solid var(--borda); border-radius: var(--raio);
  box-shadow: var(--sombra); min-width: 180px; z-index: 30; display: flex; flex-direction: column; }
.usuario-menu-pop a { padding: 9px 14px; color: var(--texto); }
.usuario-menu-pop a:hover { background: var(--acao-fraco); color: var(--acao-ativo); }

/* ---------- escolha de tema, dentro do menu do usuário
   Quatro ícones numa fila, separados dos links por um filete: eles não navegam,
   e sem a separação a fila parece mais um item de menu. O tema em vigor fica
   marcado por `aria-pressed`, e o CSS lê o MESMO atributo — assim o que o leitor
   de tela anuncia e o que o olho vê não podem divergir. */
.tema-escolha { display: flex; gap: 4px; padding: 8px 12px;
  border-top: 1px solid var(--borda); border-bottom: 1px solid var(--borda); }
.tema-op { flex: 1; border: 1px solid transparent; background: none; cursor: pointer;
  border-radius: var(--raio); padding: 6px 0;
  font-size: calc(var(--ico-btn) * var(--esc-ico)); line-height: 1.1;
  color: inherit; }
.tema-op:hover { background: var(--acao-fraco); }
.tema-op:focus-visible { outline: 2px solid var(--acao); outline-offset: 1px; }
.tema-op[aria-pressed="true"] { background: var(--acao-fraco); border-color: var(--acao); }

/* ---------- escolha de ESCALA, logo abaixo da de tema
   Em duas colunas, e não numa fila como os ícones do tema: são rótulos de
   palavra inteira, e quatro deles lado a lado dentro de um menu de 180px
   ficariam cortados ou obrigariam a alargar o menu por causa desta linha.
   O `--fonte-mini` e o `--nav-y` vêm da própria escala: o seletor encolhe junto
   com a tela, que é a demonstração mais curta do que ele faz. */
.escala-escolha { display: grid; grid-template-columns: 1fr 1fr; gap: 4px;
  padding: 8px 12px; border-bottom: 1px solid var(--borda); }
.escala-op { border: 1px solid var(--borda); background: none; cursor: pointer;
  border-radius: var(--raio-peq); padding: var(--nav-y) 4px;
  font: inherit; font-size: var(--fonte-mini); color: var(--texto); }
.escala-op:hover { background: var(--acao-fraco); color: var(--acao-ativo); }
.escala-op:focus-visible { outline: 2px solid var(--acao); outline-offset: 1px; }
.escala-op[aria-pressed="true"] { background: var(--acao-fraco); border-color: var(--acao);
  color: var(--acao-ativo); font-weight: 600; }

/* ---------- GAVETA do menu em tela estreita (frente celular, 2026-08-09)
   A regra anterior empilhava a lateral INTEIRA acima do conteúdo: no celular,
   o menu completo empurrava a tela útil ~960px para baixo em toda página
   (medido no passo 0 do PLANO-celular.md). Agora a lateral fica escondida
   fora da tela e o botão .abrir-menu do topo a traz por cima do conteúdo,
   com um véu escurecido atrás; a classe `menu-aberto` vive no <html>, como a
   `recolhida`. O estado recolhido (rail de ícones) não faz sentido em gaveta —
   dentro do @media ele é neutralizado de propósito, senão quem recolheu no
   computador abriria no celular uma gaveta de 62px só de ícones. */
.abrir-menu { display: none; }
.veu-menu { display: none; }

@media (max-width: 800px) {
  .abrir-menu { display: inline-flex; align-items: center; justify-content: center; }
  .lateral {
    position: fixed; top: 0; left: 0; z-index: 30;
    width: min(300px, 84vw); height: 100%;
    transform: translateX(-105%); transition: transform .18s ease;
  }
  .menu-aberto .lateral { transform: none; box-shadow: 0 0 28px rgba(0, 0, 0, .35); }
  .menu-aberto .veu-menu { display: block; position: fixed; inset: 0; z-index: 29;
    background: rgba(0, 0, 0, .4); }
  .menu-aberto body { overflow: hidden; }
  /* o rail de ícones vira gaveta completa: desfaz o estado recolhido */
  .recolhida .lateral { width: min(300px, 84vw); }
  .recolhida .nav-item { justify-content: flex-start; gap: var(--nav-vao);
    padding: var(--nav-y) 10px; }
  .recolhida .rotulo,
  .recolhida .marca-texto { display: inline; }
  .recolhida .nav-secao { display: block; }
  .recolhida .nav-switch-track { display: block; }
  /* o botão de recolher não tem papel na gaveta */
  .lateral .recolher { display: none; }
  /* Tabela larga rola DENTRO de si, em vez de estourar a página e forçar o
     navegador a reduzir o zoom (o texto minúsculo do diagnóstico). display:block
     num <table> mantém a renderização de tabela — as linhas viram conteúdo de
     um bloco rolável. É o piso de TODAS as telas com .tabela; onde couber
     cartão empilhado (fila de uso diário), o cartão vem na passada da tela. */
  main.conteudo .tabela { display: block; overflow-x: auto; }
  /* Campo de formulário nunca força a página a alargar: quem define a largura
     em tela estreita é a coluna do formulário, não o atributo size/cols. */
  main.conteudo input:not([type="checkbox"]):not([type="radio"]),
  main.conteudo select,
  main.conteudo textarea { max-width: 100%; box-sizing: border-box; }
}

/* ---------- barra "Retornar" das ferramentas do Painel da Chefia */
.ret-barra { margin-bottom: 12px; }

/* ---------- Modo de edição de textos (switch na lateral + edição inline) */
/* switch: reaproveita o .nav-item; a trilha some quando a lateral está recolhida */
.nav-switch { cursor: pointer; }
.nav-switch .rotulo { flex: 1; }
.nav-switch-input { position: absolute; opacity: 0; width: 0; height: 0; }
.nav-switch-track { width: 34px; height: 18px; border-radius: 999px;
  background: var(--borda); position: relative; flex-shrink: 0; transition: background .15s; }
.nav-switch-thumb { position: absolute; top: 2px; left: 2px; width: 14px; height: 14px;
  border-radius: 50%; background: var(--switch-thumb); box-shadow: 0 1px 2px rgba(0,0,0,.3); transition: left .15s; }
.nav-switch-input:checked + .nav-switch-track { background: var(--azul); }
.nav-switch-input:checked + .nav-switch-track .nav-switch-thumb { left: 18px; }
.nav-switch-input:focus-visible + .nav-switch-track { box-shadow: 0 0 0 3px rgba(13,90,167,.25); }
.recolhida .nav-switch-track { display: none; }

/* realce dos textos editáveis enquanto o modo está ativo */
.editando-textos [data-txt-o] { outline: 1px dashed var(--alerta); outline-offset: 2px;
  cursor: text; border-radius: 3px; }
.editando-textos [data-txt-o]:hover { background: var(--edicao-bg); }
.editando-textos [data-txt-o]:focus { outline: 2px solid var(--acao); background: var(--painel); }

/* barra fixa do modo de edição */
.txt-barra { position: fixed; left: 50%; transform: translateX(-50%); bottom: 16px;
  z-index: 80; display: none; align-items: center; gap: 12px; flex-wrap: wrap;
  background: var(--painel); border: 1px solid var(--alerta); border-radius: 999px;
  padding: 8px 16px; box-shadow: 0 4px 18px rgba(16,42,67,.22); font-size: var(--fonte-apoio);
  max-width: calc(100vw - 24px); }
.txt-barra-ico { font-size: 16px; }

/* confirmação flutuante ao salvar/restaurar um texto */
.txt-toast { position: fixed; right: 18px; bottom: 18px; z-index: 90;
  /* fundo no tom ESCURO do par, não em `--ok`: o verde institucional com texto
     branco por cima media 4,38:1 e reprovava por pouco. `--ok-tx` já é a versão
     do verde feita para carregar texto, então o par fecha sem inventar cor. */
  background: var(--ok-tx); color: var(--sobre-ok); padding: 9px 14px; border-radius: 8px;
  font-size: var(--fonte-apoio); box-shadow: 0 3px 12px rgba(0,0,0,.2); opacity: 1; transition: opacity .5s; }
.txt-toast.erro { background: var(--erro-tx); }
.txt-toast.some { opacity: 0; }

/* ===== Calendário anual de férias =====================================
   Estava embutido em ferias/minhas.html até 2026-08-01. Subiu para cá quando a
   Gestão de Férias (Painel da Chefia) passou a mostrar o MESMO calendário: duas
   telas com a mesma grade não podem depender de dois blocos de estilo, ou a
   primeira correção de cor deixa uma diferente da outra.
   A marcação da grade vive em templates/_calendario_ano.html. */
.fer-meses { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--cal-min), 1fr));
  gap: 14px; margin-top: 4px; }
.fer-mes { border: 1px solid var(--borda); border-radius: 10px;
  background: var(--painel); overflow: hidden; }
.fer-mes-titulo { margin: 0; padding: 10px 14px; font-size: var(--esc-corpo); font-weight: 600;
  border-bottom: 1px solid var(--borda); }
.fer-grade { display: grid; grid-template-columns: repeat(7, 1fr);
  gap: 2px; padding: 10px; }
.fer-dow { text-align: center; font-size: var(--fonte-nano); color: var(--texto-suave);
  padding: 2px 0; font-weight: 600; }
.fer-dow.fds { color: var(--azul); }
/* borda de CAMPO, não filete: o dia é um botão clicável, e é a borda que diz
   onde cada um começa — a norma pede 3:1 para isso */
.fer-dia { position: relative; aspect-ratio: 1 / 1; border: 1px solid var(--borda-campo);
  border-radius: var(--raio-peq); background: var(--ladrilho); font-size: var(--fonte-mini); color: var(--texto);
  display: flex; flex-direction: column; align-items: center; justify-content: flex-start;
  padding: 3px 0 0; cursor: pointer; transition: border-color .1s, box-shadow .1s; }
.fer-dia:hover { border-color: var(--azul); }
/* Só-leitura (Painel da Chefia): o dia informa, não convida ao clique. */
.fer-dia.fer-estatico { cursor: default; }
.fer-dia.fer-estatico:hover { border-color: var(--borda-campo); }
.fer-vazio { border: none; background: transparent; cursor: default; }
.fer-dia.hoje { outline: 2px solid var(--azul); outline-offset: -2px; }
.fer-dia.meu { box-shadow: inset 0 0 0 2px var(--verde); }
.fer-dia.sel { border-color: var(--azul); background: var(--azul-fraco);
  box-shadow: inset 0 0 0 2px var(--azul); }
/* `--erro` e `--alerta` são cores de BORDA e de acento; como texto sobre o painel
   o alerta media 3,64:1 e reprovava. O par de texto (`--alerta-tx`) é o que foi
   calculado para ser lido. */
.fer-dia.feriado .fer-num { color: var(--erro-tx); font-weight: 700; }
.fer-dia.facultativo .fer-num { color: var(--alerta-tx); font-weight: 700; }
.fer-num { line-height: 1; }
.fer-faixas { position: absolute; left: 0; right: 0; bottom: 3px;
  display: flex; flex-direction: column; gap: 1px; }
.fer-faixa { height: 3px; margin: 0 -3px; }
.fer-faixa.ini { margin-left: 2px; border-top-left-radius: 3px;
  border-bottom-left-radius: 3px; }
.fer-faixa.fim { margin-right: 2px; border-top-right-radius: 3px;
  border-bottom-right-radius: 3px; }
