@import url("vendor/select2/select2.min.css");

*, *::before, *::after { box-sizing: border-box; }
body { margin: 0; font-family: var(--font-sans); font-size: var(--fs-base); color: var(--text-body); background: var(--surface-page); -webkit-font-smoothing: antialiased; }
a { color: var(--accent-regulatorio); text-decoration: none; }
a:hover { color: var(--accent-regulatorio-strong); text-decoration: underline; }
.shell { min-height: 100vh; display: grid; grid-template-columns: var(--sidebar-width) minmax(0, 1fr); }
.sidebar { background: var(--surface-sidebar); position: sticky; top: 0; height: 100vh; display: flex; flex-direction: column; overflow: auto; }
.sidebar__brand { padding: var(--space-10) var(--space-9) var(--space-8); border-bottom: 1px solid var(--surface-sidebar-border); display: flex; align-items: center; gap: var(--space-5); }
/* Item 1 do relatório (2026-08-25), REVISTO no retoque de 2026-08-25: a
   suposição acima ("a marca de verdade já resolve o próprio contraste")
   estava errada. logo-cervam-completo.png é desenhada para fundo CLARO —
   traço preto/cinza-escuro, teal escuro e vermelho, fundo transparente
   (confirmado por amostragem de pixel com PIL: nenhuma cor clara no
   próprio arquivo). Sobre --surface-sidebar (#101b57, quase preto-azulado)
   o traço escuro se funde no fundo — mancha ilegível, pior ainda recolhida
   a 40px. O cabeçalho público (app/templates/publico/cabecalho.php) nunca
   teve esse problema porque está sobre --surface-card (branco); aqui a cor
   de fundo é o problema, não o tratamento do <img>.
   Reintroduzido o chip: um fundo --surface-card (branco, mesmo token do
   cabeçalho público) por trás da marca, só que agora deliberado — devolve
   à marca o "chão claro" para o qual foi desenhada, em vez de reinventar
   um segundo tratamento da marca em si. Mesmo --radius-sm dos outros
   controles da barra (.sidebar__toggle) e --shadow-card (o token que já
   nomeia esse par com --surface-card) — nenhum token novo.
   Dimensão do <img> reduzida de 40px para 36px (proporção 275:200
   preservada, 36×26) para que o chip inteiro — imagem + padding — caiba
   nos 48px disponíveis na trilha recolhida (64px de --shell--colapsada
   menos os 2×--space-3 de padding de .sidebar--colapsada .sidebar__brand)
   sem estourar a largura da trilha; 48px é também o min-width que
   .sidebar__toggle já usa recolhido, então os dois elementos da coluna de
   ícones alinham na mesma largura.
   flex:none aqui é sobre o próprio <span>, não sobre o <img> — mantém o
   invólucro fora do cálculo de flex-grow da linha (mark | brandtext) sem
   depender de largura fixa. */
.sidebar__mark { display: flex; align-items: center; justify-content: center; flex: none; background: var(--surface-card); border-radius: var(--radius-sm); padding: var(--space-2); box-shadow: var(--shadow-card); }
.sidebar__mark img { display: block; width: 36px; height: auto; }
.sidebar__brandtext { min-width: 0; }
.sidebar__title { display: block; font-family: var(--font-display); font-weight: var(--fw-bold); font-size: var(--fs-lg); color: var(--text-on-dark); letter-spacing: var(--ls-wider); line-height: var(--lh-tight); }
.sidebar__subtitle { display: block; font-size: var(--fs-2xs); color: var(--accent-mint); letter-spacing: .1em; text-transform: uppercase; font-weight: var(--fw-semibold); }
.nav { padding: var(--space-6) var(--space-5); display: flex; flex-direction: column; gap: 3px; }
.nav__label { font-size: var(--fs-3xs); font-weight: var(--fw-bold); color: var(--text-on-dark-faint); letter-spacing: .14em; text-transform: uppercase; padding: var(--space-2) var(--space-4) var(--space-3); margin: 0; }
.nav__item { display: flex; align-items: center; gap: var(--space-4); width: 100%; padding: 11px var(--space-5); border: none; border-left: 3px solid transparent; border-radius: 0 var(--radius-sm) var(--radius-sm) 0; background: transparent; color: var(--text-on-dark-muted); font-family: var(--font-sans); font-size: var(--fs-base); font-weight: var(--fw-semibold); text-align: left; text-decoration: none; cursor: pointer; }
.nav__item:hover { background: var(--surface-sidebar-hover); color: var(--text-on-dark); text-decoration: none; }
.nav__item[aria-current="page"] { background: var(--surface-sidebar-active); border-left-color: var(--accent-mint); color: var(--text-on-dark); }
.nav__item svg { width: 17px; height: 17px; flex: none; }
.nav__item span { flex: 1; min-width: 0; }
/* Item 2 do relatório (2026-08-25): reproduzido no navegador antes de
   mexer — "Histórico mensal" e "Conjuntos elétricos" quebravam em duas
   linhas e o contador virava um chip esticado. Não era falta de espaço
   (238px de sobra dava para o texto inteiro numa linha só, medido via
   getBoundingClientRect() depois do reparo abaixo) nem o badge "grande
   demais": era uma colisão de especificidade CSS. ".nav__badge" é um
   span, então ".nav__item span" (0,1,1 — uma classe MAIS um tipo) bate
   ".nav__badge" (0,1,0 — só uma classe) na cascata, não importa a ordem
   das regras no arquivo: o "flex: none" abaixo nunca vencia, o badge
   herdava "flex: 1" do rótulo e brigava por espaço com ele — encolhendo
   o rótulo até quebrar linha, e esticando o próprio badge (confirmado via
   getComputedStyle: "flex: 1 1 0%" no badge, contra o "flex: none" que o
   código já pedia). ".nav__item .nav__badge" (0,2,0 — duas classes) é a
   correção mínima: mais específico que ".nav__item span" só nisto, sem
   tocar a regra genérica nem duplicar as outras propriedades do badge. */
.nav__badge { background: #2b3a86; color: #c3cbe9; font-size: var(--fs-2xs); font-weight: var(--fw-bold); font-style: normal; border-radius: var(--radius-pill); padding: 2px var(--space-3); flex: none; }
.nav__item .nav__badge { flex: none; }
.nav__item[aria-current="page"] .nav__badge { background: var(--accent-mint); color: #0d1740; }
/* Item 5 do relatório: botão de recolher/expandir, em linha própria entre
   a marca e a navegação (ver o comentário do template — dividir a largura
   com "CERVAM ENERGIA" quebrava o título em duas linhas). width:100% +
   min-height em --space-14 (48px) para o alvo mínimo de 44×44 (mesmo
   token que .btn-repetir já usa pelo mesmo motivo, mais abaixo) — um
   controle novo não pode nascer abaixo do mínimo que o resto desta
   revisão está corrigindo em outros lugares (item 6). */
.sidebar__toggle-row { padding: var(--space-5) var(--space-9) 0; }
.sidebar__toggle { display: flex; align-items: center; gap: var(--space-4); width: 100%; min-height: var(--space-14); background: transparent; border: 1px solid var(--surface-sidebar-border); border-radius: var(--radius-sm); padding: var(--space-3) var(--space-5); color: var(--text-on-dark-muted); font-family: var(--font-sans); font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; }
.sidebar__toggle:hover { background: var(--surface-sidebar-hover); color: var(--text-on-dark); }
.sidebar__toggle:focus-visible { outline: 2px solid var(--accent-mint); outline-offset: 1px; }
.sidebar__toggle svg { width: 16px; height: 16px; flex: none; }
.sidebar__foot { margin-top: auto; padding: var(--space-7) var(--space-8); border-top: 1px solid var(--surface-sidebar-border); display: flex; flex-direction: column; gap: var(--space-5); }
.btn-ghost-mint { background: transparent; color: var(--accent-mint); border: 1px solid #2f7a52; border-radius: var(--radius-sm); padding: var(--space-2) var(--space-5); font-family: var(--font-sans); font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; text-align: left; text-decoration: none; }
.btn-ghost-mint:hover { background: var(--accent-sem-expurgo-dark); color: var(--text-on-dark); text-decoration: none; }
.user { display: flex; align-items: center; gap: var(--space-4); }
.user__avatar { width: 32px; height: 32px; border-radius: 50%; background: #2b3a86; color: var(--text-on-dark); display: flex; align-items: center; justify-content: center; font-size: var(--fs-sm); font-weight: var(--fw-bold); flex: none; }
.user__name { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-on-dark); }
.user__logout { background: none; border: none; padding: 0; font-family: var(--font-sans); font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: #8b97c9; cursor: pointer; }
.user__logout:hover { color: var(--text-on-dark); }

/* ------------------------------------------------------------------
   Item 5 do relatório (2026-08-25): barra lateral recolhível, server-side.
   $colapsada (painel/app/bootstrap.php: sidebarColapsada(), cookie
   PAINEL_SIDEBAR) decide, no PHP, se ".shell" e ".sidebar" nascem com o
   modificador "--colapsada" — nenhuma das regras abaixo depende de
   JavaScript nem do truque do checkbox (a barra some/volta ao trocar de
   página exatamente como antes, porque a marcação já nasce no estado
   certo a cada carregamento, não é escondida depois por CSS puro).

   64px é o mesmo raciocínio de table.grid--historico (min-width medido,
   não chutado, ver o comentário lá): com a barra recolhida a 64px, main
   ganha ~174px a mais (238px − 64px) do que a barra expandida — o
   suficiente, numa tela de 1536px ou mais, para a tabela de histórico
   (min-width: 1366px) caber sem rolagem horizontal; numa tela de 1440px
   ainda falta espaço. Retoque de 2026-08-25: o padding horizontal de main
   NÃO é mais fixo neste estado — ver a regra ".shell--colapsada main"
   logo abaixo, que já aperta esse respiro; mesmo com ela, 1440px
   colapsada continua exigindo rolagem (ver o comentário daquela regra e o
   relatório para a medição completa nas larguras testadas).

   Todo texto escondido abaixo usa clip/1px (mesma técnica de .sr-only,
   não display:none): continua no DOM e na árvore de acessibilidade — só
   some da tela. O nome acessível de cada destino (ícone + rótulo) não
   muda entre os dois estados; só a apresentação visual muda. */
.shell--colapsada { grid-template-columns: 64px minmax(0, 1fr); }
/* Item 2 do retoque de 2026-08-25 (painel-dec-fec): a 1440px — a largura de
   laptop mais comum — mesmo com a barra recolhida (64px) ainda faltava
   espaço para table.grid--historico (min-width: 1366px) caber sem rolagem
   horizontal, como o comentário acima já expunha (1366 + 60px de padding
   fixo de main, --admin-gutter × 2, somam 1426px; só 14px sobram — não dá
   nem para reduzir o próprio min-width, ver abaixo). Medido de novo no
   navegador (getBoundingClientRect(), 1440px, barra recolhida): main tem
   1361px de clientWidth (1440 − 64 do trilho − ~15px de barra de rolagem
   vertical desta página) e o table-wrap disponível fica em ~1299px — a
   tabela nativa (1366px) ainda excede isso em quase 70px.
   Recolher é o operador trocando deliberadamente cromo por conteúdo — o
   mesmo raciocínio já usado para o próprio trilho de 64px acima —, então
   apertar o respiro horizontal de main E do .topbar (ambos usam
   --admin-gutter, 30px de cada lado) só neste estado seleciona o MESMO
   valor que a media query de celular já usa para os dois
   (@media max-width:900px, mais abaixo neste arquivo: main vira
   var(--space-9) var(--space-7) var(--space-14), .topbar vira
   var(--space-5) var(--space-7)) — var(--space-7) = 16px, não um valor
   novo, é o mesmo token reaproveitado para o mesmo problema (menos espaço
   disponível) num contexto diferente. padding-left/right em vez do
   shorthand: preserva o padding vertical de cada regra, só o horizontal
   muda. Como o valor é IDÊNTICO ao que a media query de celular já aplica
   nos dois seletores, esta regra não conflita com aquela abaixo de 900px
   (mesmo resultado computado, não precisa de uma segunda guarda de
   @media) — só passa a valer também acima de 900px, que é o ganho novo.

   Resultado, honesto: 60px → 32px de padding libera 28px. Mesmo assim,
   1440px colapsada AINDA não fecha sem rolagem — ver o relatório para a
   medição completa e por que fechar de vez é matematicamente inviável
   aqui (mesmo com padding zero, 1440 − 64 = 1376px, menos que o mínimo
   real da tabela com dois ou mais conjuntos elétricos, ~1385px medido).
   Reduz a rolagem, não a elimina; documentando os números em vez de
   forçar um encaixe que não fecha. */
.shell--colapsada .topbar,
.shell--colapsada main { padding-left: var(--space-7); padding-right: var(--space-7); }
.sidebar--colapsada .sidebar__brand { justify-content: center; padding: var(--space-6) var(--space-3); }
.sidebar--colapsada .sidebar__toggle-row { padding: var(--space-3) var(--space-3) 0; }
.sidebar--colapsada .sidebar__toggle { width: auto; min-width: var(--space-14); justify-content: center; padding: var(--space-3); margin: 0 auto; }
.sidebar--colapsada .sidebar__toggle svg { transform: scaleX(-1); }
.sidebar--colapsada .sidebar__brandtext,
.sidebar--colapsada .sidebar__toggle span,
.sidebar--colapsada .nav__item > span,
.sidebar--colapsada .sidebar__link-label,
.sidebar--colapsada .user__name { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
.sidebar--colapsada .nav__item { justify-content: center; padding: 11px var(--space-3); }
.sidebar--colapsada .nav__label { display: none; }
.sidebar--colapsada .sidebar__foot { padding: var(--space-7) var(--space-3); align-items: center; }
.sidebar--colapsada .btn-ghost-mint { text-align: center; padding: var(--space-2) var(--space-3); }
.sidebar--colapsada .user { justify-content: center; }
.sidebar--colapsada .user br { display: none; }

.content { min-width: 0; display: flex; flex-direction: column; }
.topbar { background: var(--surface-card); border-bottom: 1px solid var(--border-default); padding: var(--space-6) var(--admin-gutter); display: flex; align-items: center; justify-content: space-between; gap: var(--space-8); flex-wrap: wrap; position: sticky; top: 0; z-index: 20; box-shadow: var(--shadow-topbar); }
.status { display: flex; align-items: center; gap: var(--space-4); font-size: var(--fs-sm); color: var(--text-secondary); margin: 0; }
.status__dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.status__dot--rascunho { background: var(--state-warning); }
.status__dot--publicado { background: var(--state-success); }
.status strong { color: var(--text-primary); font-weight: var(--fw-semibold); }
.actions { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; }
.btn { border-radius: var(--radius-sm); font-family: var(--font-sans); cursor: pointer; }
.btn--secondary { background: var(--surface-card); color: var(--accent-regulatorio); border: 1px solid var(--border-dashed); padding: var(--space-4) var(--space-8); font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.btn--secondary:hover { background: var(--surface-accent-soft); }
.btn--primary { background: var(--accent-sem-expurgo); color: var(--text-on-dark); border: none; padding: var(--space-4) var(--space-10); font-size: var(--fs-base); font-weight: var(--fw-bold); box-shadow: 0 1px 2px rgba(25,107,58,.3); }
.btn--primary:hover { background: var(--accent-sem-expurgo-hover); }
.btn--navy { background: var(--surface-sidebar); color: var(--text-on-dark); border: none; padding: var(--space-4) var(--space-8); font-size: var(--fs-base); font-weight: var(--fw-semibold); }
.btn--navy:hover { background: var(--accent-regulatorio); }
.btn[disabled] { background: var(--state-disabled-bg); color: var(--state-disabled-text); border-color: var(--border-default); box-shadow: none; cursor: progress; }
main { flex: 1; min-width: 0; width: 100%; overflow-x: hidden; padding: var(--space-11) var(--admin-gutter) var(--space-15); }
.stack { display: flex; flex-direction: column; gap: var(--space-9); }
.page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-11); flex-wrap: wrap; }
.page-head h1 { font-family: var(--font-display); font-size: var(--fs-3xl); font-weight: var(--fw-bold); color: var(--text-primary); margin: 0 0 var(--space-1); }
.page-head p { margin: 0; font-size: var(--fs-base); color: var(--text-secondary); max-width: 680px; text-wrap: pretty; }
.card { background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2xl); padding: var(--space-10) var(--space-11) var(--space-11); }
.card__head { display: flex; align-items: center; gap: var(--space-5); margin-bottom: var(--space-8); }
.card__icon { width: 38px; height: 38px; border-radius: var(--radius-md); border: 2px solid currentColor; display: flex; align-items: center; justify-content: center; flex: none; }
.card__icon svg { width: 19px; height: 19px; }
.card__title { font-family: var(--font-display); font-size: var(--fs-lg); font-weight: var(--fw-bold); letter-spacing: var(--ls-wide); line-height: var(--lh-snug); }
.card__title small { color: #8b93b0; font-size: inherit; font-weight: inherit; }
.card--regulatorio .card__icon, .card--regulatorio .card__title { color: var(--accent-regulatorio); }
.card--limpo .card__icon, .card--limpo .card__title { color: var(--accent-sem-expurgo); }
.section-title { font-family: var(--font-display); font-size: var(--fs-xl); font-weight: var(--fw-bold); color: var(--text-primary); letter-spacing: var(--ls-wide); margin: 0 0 var(--space-2); }
.section-note { margin: 0 0 var(--space-8); font-size: var(--fs-base); color: var(--text-secondary); }
.grid-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--space-9); }
.grid-pair { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: var(--space-7); }
.grid-4 { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--space-7); }
.grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--space-7); }
/* Task 6 (delta 2026-08-25): a tela de Médias anuais perde os quatro
   campos — os indicadores viram somente-leitura, calculados a partir do
   histórico mensal (HistoricoRepo::totaisAnuais()), nunca mais digitados
   nem gravados aqui. .resumo-item usa <dt>/<dd> (par termo/definição), não
   <input disabled>: um campo desabilitado ainda parece um campo de
   formulário (mesma borda, mesmo fundo) e sugere "isto poderia ser editado
   se algo mudasse" — nada aqui pode ser editado nesta tela, em lugar
   nenhum, e a marcação precisa dizer isso tanto visual quanto
   semanticamente (revisão de UX, regra read-only-distinction). Tipografia
   igual à dos KPIs do painel público (painel/assets/publico.css:
   .kpi__label/.kpi__value) — mesmos tokens já definidos em tokens.css
   (--font-display, --fs-4xl — documentado lá como "numero do card
   publico" —, --fw-bold, --ls-wider), sem importar publico.css (não
   carregado no admin) nem tocar tokens.css. font-variant-numeric:
   tabular-nums alinha os dígitos entre os quatro valores (revisão de UX,
   regra number-tabular) — nenhuma tela do admin usava essa propriedade
   antes. dl.grid-pair reseta a margem padrão do navegador para <dl>
   (.grid-pair, acima, só tinha consumidores em <div> até agora, que já
   nascem sem margem — este reset é um no-op para eles). */
dl.grid-pair { margin: 0; }
.resumo-item { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; margin: 0; }
.resumo-item__rotulo { margin: 0; font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-secondary); letter-spacing: var(--ls-wide); text-transform: uppercase; }
.resumo-item__valor { margin: 0; font-family: var(--font-display); font-size: var(--fs-4xl); font-weight: var(--fw-bold); letter-spacing: var(--ls-wider); color: var(--text-primary); font-variant-numeric: tabular-nums; }
.resumo-item--limpo .resumo-item__rotulo, .resumo-item--limpo .resumo-item__valor { color: var(--accent-sem-expurgo); }
/* Achado da revisão de UX (revisão final): mesmo mecanismo e mesmo token
   que .kpi__value[data-vazio="1"] já usa em publico.css — um indicador
   sem medição (Numero::formatar(null), "--,--") pintado em --text-muted
   em vez da cor de destaque normal, aqui ou lá. Depois de .resumo-item--
   limpo acima na cascata (mesma especificidade, duas classes/atributo:
   decide quem vem por último) para vencer também nos dois cards "sem
   expurgo". */
.resumo-item__valor[data-vazio="1"] { color: var(--text-muted); }
.field { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.field > label { font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-secondary); letter-spacing: var(--ls-wide); text-transform: uppercase; }
.field__hint { font-size: var(--fs-2xs); color: var(--text-muted); }
.field__error { font-size: var(--fs-2xs); font-weight: var(--fw-semibold); color: var(--state-error-text); }
input, select, textarea { font-family: var(--font-sans); }
.select2-container { font-family: var(--font-sans); font-size: var(--fs-base); }
.select2-container--default .select2-selection--single { min-height: 46px; border: 1px solid var(--border-input); border-radius: var(--radius-md); background: var(--surface-muted); color: var(--text-body); }
.select2-container--default .select2-selection--single .select2-selection__rendered { padding: 10px 42px 10px var(--space-6); color: var(--text-body); line-height: 24px; }
.select2-container--default .select2-selection--single .select2-selection__placeholder { color: var(--text-muted); }
.select2-container--default .select2-selection--single .select2-selection__arrow { width: 40px; height: 44px; }
.select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: var(--text-secondary) transparent transparent; border-width: 6px 5px 0; margin-left: -5px; margin-top: -3px; }
.select2-container--open .select2-selection--single { border-color: var(--accent-regulatorio); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-regulatorio) 26%, transparent); }
.select2-dropdown { z-index: 1200; border: 1px solid var(--border-input); border-radius: var(--radius-md); background: var(--surface-card); box-shadow: var(--shadow-card); overflow: hidden; }
.select2-container--default .select2-search--dropdown { padding: var(--space-4); }
.select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid var(--border-input); border-radius: var(--radius-xs); color: var(--text-body); font-family: var(--font-sans); font-size: var(--fs-base); padding: var(--space-3) var(--space-4); }
.select2-container--default .select2-results__option { padding: var(--space-4) var(--space-5); }
.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable { background: var(--surface-sidebar); color: var(--text-on-dark); }
.select2-container--default .select2-results__option--selected { background: var(--surface-accent-soft); color: var(--text-primary); font-weight: var(--fw-semibold); }
.select2-container--invalid .select2-selection--single { border-color: var(--state-error-border); background: var(--state-error-surface); }
.select2-container--invalid.select2-container--open .select2-selection--single { box-shadow: 0 0 0 2px color-mix(in srgb, var(--state-error-border) 26%, transparent); }
.select2-container--default .select2-selection--single:focus-visible { outline: 2px solid var(--accent-regulatorio); outline-offset: 2px; }
.input-cell + .select2-container { min-width: 170px; }
.select-wrap .select2-container { width: auto !important; min-width: 8rem; flex: 1 1 8rem; }
.configuracao-indicadores { display: grid; gap: var(--space-6); border: 1px solid var(--border-default); }
.configuracao-indicadores .card__head { align-items: flex-start; }
.configuracao-indicadores .field__hint { margin: var(--space-1) 0 0; }
.modo-indicadores { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); margin: 0; padding: 0; border: 0; }
.modo-indicadores legend { font-weight: var(--fw-bold); margin-bottom: var(--space-3); }
.modo-indicadores__opcao { display: flex; gap: var(--space-3); align-items: flex-start; padding: var(--space-5); border: 1px solid var(--border-default); border-radius: var(--radius-lg); cursor: pointer; background: var(--surface-card); transition: border-color .18s ease, box-shadow .18s ease, background .18s ease; }
.modo-indicadores__opcao:hover, .modo-indicadores__opcao.is-ativo { border-color: var(--accent-regulatorio); background: var(--surface-accent-soft); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-regulatorio) 16%, transparent); }
.modo-indicadores__opcao input { inline-size: 1.15rem; block-size: 1.15rem; margin-top: .15rem; accent-color: var(--accent-regulatorio); }
.modo-indicadores__opcao strong, .modo-indicadores__opcao small { display: block; }
.modo-indicadores__opcao small { margin-top: var(--space-1); color: var(--text-secondary); }
.configuracao-indicadores__manual { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-4); padding: var(--space-5); border-radius: var(--radius-lg); background: var(--surface-muted); }
.configuracao-indicadores__manual .field, .configuracao-indicadores__limites .field { display: grid; gap: var(--space-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.configuracao-indicadores__manual.is-oculto { display: none; }
.configuracao-indicadores__limites { display: grid; grid-template-columns: minmax(15rem, 1fr) repeat(2, minmax(9rem, .4fr)); gap: var(--space-5); align-items: end; padding-top: var(--space-5); border-top: 1px solid var(--border-subtle); }
.configuracao-indicadores__limites p { margin: 0; }
.historico-configuracao { border: 1px solid var(--border-default); border-radius: var(--radius-xl); background: var(--surface-card); }
.historico-configuracao summary { display: flex; justify-content: space-between; align-items: center; gap: var(--space-5); padding: var(--space-5) var(--space-7); cursor: pointer; color: var(--accent-regulatorio); font-weight: var(--fw-bold); }
.historico-configuracao summary small { color: var(--text-secondary); font-weight: var(--fw-medium); }
.historico-configuracao__conteudo { display: grid; gap: var(--space-5); padding: 0 var(--space-7) var(--space-7); }
.historico-configuracao__periodo, .historico-configuracao__campos { display: flex; flex-wrap: wrap; gap: var(--space-4); align-items: end; margin: 0; padding: var(--space-5); border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); background: var(--surface-muted); }
.historico-configuracao__periodo label { display: grid; gap: var(--space-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.historico-configuracao__periodo input { min-height: 44px; border: 1px solid var(--border-input); border-radius: var(--radius-md); padding: 0 var(--space-4); font: inherit; background: var(--surface-card); }
.historico-configuracao__campos legend { padding: 0 var(--space-2); font-size: var(--fs-sm); font-weight: var(--fw-bold); }
.historico-configuracao__campos label { font-size: var(--fs-sm); color: var(--text-secondary); }
.historico-configuracao__campos input { accent-color: var(--accent-regulatorio); }
/* Icone dentro de um <th> da grade (coluna de visibilidade). Herda
   currentColor do cabecalho, como os <svg> do cabecalho da tabela publica. */
.th-icone { display: inline-flex; align-items: center; justify-content: center; }
.th-icone svg { width: 18px; height: 18px; }
.btn-visibilidade { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border: 1px solid var(--border-default); border-radius: 50%; background: var(--surface-card); color: var(--text-muted); line-height: 1; cursor: pointer; }
.btn-visibilidade svg { width: 20px; height: 20px; }
.btn-visibilidade.is-visivel { border-color: var(--accent-sem-expurgo); background: var(--state-success-surface); color: var(--accent-sem-expurgo-dark); }
.btn-visibilidade:hover { border-color: var(--accent-regulatorio); color: var(--accent-regulatorio); }
.btn-visibilidade:focus-visible { outline: 2px solid var(--accent-regulatorio); outline-offset: 2px; }
@media (max-width: 860px) { .modo-indicadores, .configuracao-indicadores__manual, .configuracao-indicadores__limites { grid-template-columns: 1fr 1fr; } .configuracao-indicadores__limites p { grid-column: 1 / -1; } }
@media (max-width: 560px) { .modo-indicadores, .configuracao-indicadores__manual, .configuracao-indicadores__limites { grid-template-columns: 1fr; } }
.input, .input-num, .input-cell, textarea.input { width: 100%; min-width: 0; border: 1px solid var(--border-input); border-radius: var(--radius-md); background: var(--surface-muted); color: var(--text-body); padding: 11px var(--space-6); font-size: var(--fs-base); }
.input-num { font-size: var(--fs-lg); font-weight: var(--fw-bold); color: var(--text-primary); text-align: center; }
.input-cell { padding: var(--space-3); text-align: center; background: var(--surface-card); border-color: var(--border-subtle); }
.is-limpo { border-color: var(--border-input-clean); background: var(--surface-clean-soft); color: var(--accent-sem-expurgo); font-weight: var(--fw-semibold); }
.is-limpo.input-cell { background: #fbfefc; border-color: #d5e6dc; }
:is(input, select, textarea):focus { outline: 2px solid var(--accent-regulatorio); outline-offset: -1px; }
/* select entrou nesta lista na Task 3 (delta "conjuntos por mês"): o
   seletor de conjunto de admin/templates/admin/historico-mensal.php é o
   primeiro <select> desta tela a poder ficar aria-invalid (conjunto_ordem
   ausente/inexistente — Validador::CONJUNTO_OBRIGATORIO/CONJUNTO_INVALIDO,
   Task 2). Mesmo tratamento visual que input/textarea já tinham, mesmos
   tokens — sem isso o <select> ficava com aria-invalid="true" no HTML mas
   sem nenhum sinal visual, a única diferença entre "o operador esqueceu"
   e "está tudo certo". */
:is(input, select, textarea)[aria-invalid="true"] { border-color: var(--state-error-border); background: var(--state-error-surface); color: var(--state-error-text); }
::placeholder { color: var(--text-muted); }
textarea.input { resize: vertical; line-height: var(--lh-loose); text-align: left; }
.select-wrap { display: flex; align-items: center; gap: var(--space-4); background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: var(--space-3) var(--space-5); }
.select-wrap label { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-secondary); }
.select-wrap select { border: 1px solid var(--border-default); border-radius: var(--radius-xs); padding: var(--space-2) var(--space-4); font-size: var(--fs-base); font-weight: var(--fw-semibold); color: var(--text-primary); background: var(--surface-card); }
/* white-space: pre-line (achado da revisão de UX, revisão final): o
   alerta de validação do histórico mensal (admin/salvar-historico.php)
   monta uma frase por erro ("Linha N (MÊS): ...") e as concatenava com
   espaço só — um parágrafo corrido, sem quebra nem marcador, que cresceu
   de até 4 erros possíveis por linha (antes deste delta) para até 6
   (Limite DEC/FEC entraram na validação). pre-line respeita as quebras de
   linha que o PHP já insere entre as frases (implode("\n", ...)) sem
   exigir <li>/<ul> dentro do <p> nem mudar cor, posição ou o mecanismo de
   foco deste alerta (tabindex/autofocus em alerta.php continuam
   intocados) — e não afeta nenhum alerta de uma frase só (a maioria):
   sequências de espaço normais continuam colapsando como sempre,
   só quebras de linha explícitas passam a ser respeitadas. */
.alert { border-radius: var(--radius-lg); padding: var(--space-5) var(--space-7); font-size: var(--fs-base); font-weight: var(--fw-semibold); margin: 0; white-space: pre-line; }
.alert--success { background: var(--state-success-surface); border: 1px solid var(--state-success-border); color: var(--state-success-text); }
.alert--error { background: var(--state-error-surface); border: 1px solid var(--state-error-border); color: var(--state-error-text); }
.alert--info { background: var(--surface-accent-soft); border: 1px solid var(--border-dashed); color: var(--accent-regulatorio); }
.empty { border: 1px dashed var(--border-subtle); background: var(--surface-muted); border-radius: var(--radius-lg); padding: var(--space-12) var(--space-9); text-align: center; color: var(--text-secondary); font-size: var(--fs-base); }
.table-wrap { background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2xl); overflow-x: auto; }
table.grid { width: 100%; min-width: 760px; border-collapse: collapse; }
/* table.grid é a classe genérica de tabela do admin — hoje só a tela de
   histórico mensal a usa, mas nada impede outra tela de reaproveitá-la
   depois, então o min-width de 760px acima fica como estava. Os dois
   modificadores abaixo escopam o aumento só para .grid--historico.

   Medido de novo na Task 3 (delta "conjuntos por mês"): a tela foi de 8
   para 10 colunas (as duas de marcação, cada uma com seu próprio botão
   "Repetir em todos" — ver HistoricoRepo::COLUNAS, chave 'repetir') mais
   a coluna do seletor de conjunto quando há dois ou mais (11 no total).
   Mesmo método da medição anterior (table-wrap forçado a larguras
   decrescentes, via Range.getClientRects() sobre o nó de texto de cada
   .btn-repetir — não pela altura do botão, que tem min-height:48px fixo
   e nunca encolhe) — não chutado: 1336px é o ponto exato em que o texto
   de QUALQUER um dos quatro botões "Repetir em todos" (Limite DEC,
   Limite FEC, DEC atende, FEC atende) ainda cabe numa linha só; 1366px
   dá a mesma margem de segurança de 30px que a medição anterior usava,
   para variação de fonte entre sistemas. Abaixo disso, o wrapper com
   overflow-x: auto assume — mesmo comportamento que os 760px genéricos
   já davam para as 6 colunas originais.

   FIX 8 da revisão final: até esta correção, table.grid.grid--historico
   aplicava esses 1366px incondicionalmente — inclusive ao caso de 10
   colunas (um conjunto só, sem o <th> do seletor), a situação real da
   CERVAM hoje, que "cabe com folga" bem abaixo disso e pagava um piso
   mais largo do que a própria tabela precisa. $exibirSeletorConjunto (já
   existia no template, decide se o <th> do seletor é desenhado) agora
   também escolhe qual das duas classes abaixo a tabela recebe —
   table.grid.grid--historico deixou de carregar min-width sozinha.
   grid--historico-10col foi medido em separado, no navegador, MESMO
   método (table-wrap forçado a larguras decrescentes, Range.getClientRects()
   sobre o texto dos 4 botões "Repetir em todos" — que continuam
   aparecendo com um conjunto só, $permiteRepetir não depende disso):
   1084px é o ponto exato de wrap; 1114px (+30px, a mesma margem de
   segurança de sempre) é o floor final. A 1440px, com a barra lateral
   EXPANDIDA (o estado padrão, sem precisar recolher), .table-wrap tem
   1140px disponíveis — 1114px cabe, sem rolagem horizontal, medido no
   navegador (window.innerWidth 1440, sidebar 238px, main.clientWidth
   1202px, table-wrap.clientWidth 1140px > 1114px). Antes desta correção,
   os mesmos 1140px disponíveis perdiam para os 1366px herdados do caso
   de 11 colunas — a tabela rolava mesmo com a barra recolhida. */
table.grid.grid--historico-11col { min-width: 1366px; }
table.grid.grid--historico-10col { min-width: 1114px; }
table.grid thead th { background: var(--surface-sidebar); color: var(--text-on-dark); font-family: var(--font-display); font-size: var(--fs-sm); font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; padding: var(--space-5); text-align: center; }
table.grid thead th:first-child { text-align: left; }
table.grid thead th.is-limpo-head { background: var(--accent-sem-expurgo-dark); }
table.grid tbody tr { border-bottom: 1px solid var(--border-subtle); }
table.grid tbody tr:nth-child(even) { background: var(--surface-zebra); }
table.grid td { padding: var(--space-3) var(--space-4); vertical-align: middle; }
table.grid td:first-child { padding-left: var(--space-5); }
.input-mes { width: 100%; min-width: 0; border: 1px solid var(--border-subtle); border-radius: var(--radius-xs); padding: var(--space-3) var(--space-4); font-size: var(--fs-base); font-weight: var(--fw-bold); color: var(--text-primary); background: var(--surface-card); letter-spacing: .03em; }
/* Task 3 (delta "conjuntos por mês"): as duas colunas de marcação da
   tela de histórico mensal reusam o par rádio "Sim"/"Não" que a tela de
   conjuntos elétricos resolveu primeiro — mesmo .toggle (estilo definido
   mais abaixo, sem alteração), mesmo par de <label> "sim"/"nao". O que
   aquela tela não tinha era o <fieldset> por rádio DENTRO de uma célula
   de tabela densa, então o reset de borda/margem/padding do <fieldset>
   (reset do navegador) é próprio daqui, escopado a table.grid--historico
   — nunca precisou de outro lugar para herdar.
   (Até a Task 4, o par ".atende"/".atende fieldset" da tela de conjuntos
   fazia esse mesmo reset, só que dentro de um wrapper com gap e
   border-top pensados para dois fieldsets lado a lado FORA de uma
   tabela — layout que não servia aqui, e por isso nunca foi reusado. A
   Task 4 apagou aquele par junto com os campos que ele envolvia; a regra
   abaixo não dependia dele e continua igual.)
   [aria-invalid] no fieldset: mesmo sinal visual que input/select/
   textarea já têm (token --state-error-border) — como o <input> do
   rádio fica visualmente oculto (.toggle input, abaixo), o retângulo
   teria ficado sem NENHUM indício visual de campo inválido; outline (não
   border) porque o fieldset não tem borda própria para recolorir. */
table.grid--historico fieldset { border: none; margin: 0; padding: 0; }
table.grid--historico fieldset[aria-invalid="true"] { outline: 2px solid var(--state-error-border); outline-offset: 3px; border-radius: var(--radius-sm); }
.btn-remove { background: transparent; border: none; color: var(--state-neutral-mark); font-size: var(--fs-xl); line-height: 1; cursor: pointer; padding: var(--space-2) var(--space-3); border-radius: var(--radius-xs); }
.btn-remove:hover { color: var(--state-error); background: var(--state-error-surface); }
/* Task 5: um botão por coluna de limite, dentro do <th>, abaixo do rótulo
   da coluna — mesma forma de um botão de ordenação de coluna. .th-rotulo
   só separa visualmente o texto do rótulo do botão abaixo dele. .btn-repetir
   fica subordinado ao "+ Adicionar mês" e às ações da barra superior:
   texto em vez de glifo, cor --accent-mint (já usada para destaque sobre
   o fundo navy do cabeçalho — mesmo token de .btn-ghost-mint).
   min-width/min-height em --space-14 (48px) cobre o alvo mínimo de 44×44
   exigido para o novo controle sem introduzir um valor literal.

   Achado da revisão de UX (revisão final): sem borda nem preenchimento
   nenhum em repouso, o botão era indistinguível de uma legenda estática
   sob o rótulo da coluna — só o :hover preenchendo o fundo revelava que
   era clicável, diferente de "+ Adicionar mês"/"Importar planilha" ao
   lado dele, que já têm essa affordance em repouso. border-bottom
   tracejado dá esse sinal sem imitar o preenchimento sólido dos outros
   dois (continua subordinado, do jeito que o parágrafo acima descreve) e
   sem cor nem token novo — mesmo --accent-mint que o texto já usa. */
.th-rotulo { display: block; margin-bottom: var(--space-3); }
.btn-repetir { display: inline-block; background: transparent; border: none; border-bottom: 1px dashed var(--accent-mint); color: var(--accent-mint); font-family: var(--font-sans); font-size: var(--fs-2xs); font-weight: var(--fw-semibold); text-transform: none; letter-spacing: normal; cursor: pointer; padding: var(--space-3) var(--space-4); border-radius: var(--radius-sm); min-height: var(--space-14); min-width: var(--space-14); }
.btn-repetir:hover { background: var(--accent-sem-expurgo-dark); color: var(--text-on-dark); border-bottom-color: transparent; }
.btn-repetir:focus-visible { outline: 2px solid var(--accent-mint); outline-offset: 2px; }
/* Task 3 (delta "conjuntos por mês", revisão): substitui .btn-repetir com
   dois ou mais conjuntos elétricos (ver o comentário do template,
   $permiteRepetir) — não é um controle, é a explicação de por que o
   controle sumiu, então sem cor de destaque (--accent-mint é reservada
   para o que é clicável), sem cursor, sem :hover/:focus-visible. Mesmo
   padding/font-size de .btn-repetir para a altura da linha do cabeçalho
   não pular quando a tela alterna entre os dois estados (não é o caso
   normal — o número de conjuntos não muda no meio de uma sessão — mas é
   grátis manter os dois do mesmo tamanho). --text-on-dark-muted (não
   --text-on-dark-faint, baixo contraste demais sobre --surface-sidebar
   para texto que precisa ser lido, não só notado) é o mesmo token que
   .nav__item já usa para texto secundário sobre o mesmo fundo navy. */
.th-repetir-indisponivel { display: inline-block; color: var(--text-on-dark-muted); font-family: var(--font-sans); font-size: var(--fs-2xs); font-weight: var(--fw-semibold); text-transform: none; letter-spacing: normal; padding: var(--space-3) var(--space-4); }
.charts { display: flex; gap: var(--space-9); flex-wrap: wrap; }
.chart-card { flex: 1; min-width: 340px; background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2xl); padding: var(--space-9) var(--space-11) var(--space-10); }
.chart-card h2 { font-family: var(--font-display); font-size: var(--fs-lg); font-weight: var(--fw-bold); color: var(--text-primary); letter-spacing: var(--ls-wide); margin: 0 0 var(--space-6); }
.chart-card svg { width: 100%; height: auto; display: block; }
.legend { display: flex; gap: var(--space-8); margin: var(--space-7) 0 0; font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-secondary); flex-wrap: wrap; }
.legend span { display: flex; align-items: center; gap: var(--space-2); }
.legend i { width: 11px; height: 11px; display: block; }
.legend i.com { background: var(--accent-regulatorio-strong); }
.legend i.sem { background: var(--accent-sem-expurgo); }
.legend i.lim { height: 0; border-top: 2px dashed var(--text-body); width: 16px; }
.conjunto { display: flex; flex-direction: column; gap: var(--space-7); }
.conjunto__head { display: flex; align-items: center; gap: var(--space-6); flex-wrap: wrap; }
.conjunto__n { width: 28px; height: 28px; border-radius: 50%; background: var(--accent-sem-expurgo); color: var(--text-on-dark); display: flex; align-items: center; justify-content: center; font-size: var(--fs-base); font-weight: var(--fw-bold); flex: none; }
.conjunto__nome { flex: 1; min-width: 200px; border: 1px solid var(--border-input); border-radius: var(--radius-md); padding: var(--space-4) var(--space-6); font-size: var(--fs-lg); font-weight: var(--fw-semibold); color: var(--accent-regulatorio); background: var(--surface-muted); }
.conjunto__mes { display: flex; align-items: center; gap: var(--space-3); flex: none; }
.conjunto__mes label { font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-secondary); letter-spacing: var(--ls-wide); text-transform: uppercase; }
.conjunto__mes input { border: 1px solid var(--border-input); border-radius: var(--radius-md); padding: var(--space-2) var(--space-5); font-size: var(--fs-base); color: var(--text-primary); background: var(--surface-muted); }
.btn-remove-outline { background: transparent; border: 1px solid var(--border-subtle); color: var(--state-neutral-mark); font-size: var(--fs-lg); line-height: 1; cursor: pointer; padding: var(--space-3) 11px; border-radius: var(--radius-sm); flex: none; }
.btn-remove-outline:hover { color: var(--state-error); border-color: var(--state-error-border); background: var(--state-error-surface); }
/* Item 6 do relatório (2026-08-25): padding: var(--space-2) var(--space-7)
   (6px vertical) media ~28px de altura — abaixo dos 44×44 que o WCAG 2.5.5
   pede e a ANEEL exige, num rótulo que hoje aparece 2x em Conjuntos
   elétricos e 24x (12 linhas × 2 colunas de marcação) em Histórico mensal.
   var(--space-6) (14px vertical, a mesma largura horizontal de antes) dá
   ~44px de altura (14×2 + ~16px de linha de texto em --fs-sm) — reaproveita
   um token já existente na escala, não inventa um valor novo. Largura já
   folgava acima de 44px (padding horizontal + "Sim"/"Não"), não mexida. */
.toggle { display: flex; gap: var(--space-2); }
.toggle label { border: 1px solid var(--border-subtle); background: var(--surface-card); color: #8b93b0; border-radius: var(--radius-sm); padding: var(--space-6) var(--space-7); font-size: var(--fs-sm); font-weight: var(--fw-bold); cursor: pointer; }
.toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.toggle input:checked + label.sim { border-color: var(--accent-sem-expurgo); background: var(--state-success-surface); color: var(--state-success-text); }
.toggle input:checked + label.nao { border-color: var(--state-error); background: var(--state-error-surface); color: var(--state-error-text); }
.toggle input:focus-visible + label { outline: 2px solid var(--accent-regulatorio); outline-offset: 1px; }
.dest { display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap; }
.dest > span { font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-secondary); letter-spacing: var(--ls-wide); text-transform: uppercase; }
/* Achado da varredura (item 6 do relatório, 2026-08-25): mesmo padrão
   ".toggle" (ver o comentário lá) — padding: var(--space-3) var(--space-7)
   também media ~32px de altura, abaixo de 44×44. Único par desta tela
   (Importar planilha, "Destino da importação"), mesma correção. */
.dest label { border: 1px solid var(--border-subtle); background: var(--surface-card); color: #8b93b0; border-radius: var(--radius-sm); padding: var(--space-6) var(--space-7); font-size: var(--fs-sm); font-weight: var(--fw-bold); cursor: pointer; }
.dest input { position: absolute; opacity: 0; width: 0; height: 0; }
.dest input:checked + label { border-color: var(--surface-sidebar); background: var(--surface-sidebar); color: var(--text-on-dark); }
/* a4 da auditoria: .toggle (linha acima, :focus-visible) já tem anel de
   foco; .dest — mesmo padrão de input com opacity:0 — não tinha nenhuma
   regra equivalente, então um rádio de "Destino" focado por teclado não
   mostrava foco nenhum. Espelha exatamente a regra de .toggle. */
.dest input:focus-visible + label { outline: 2px solid var(--accent-regulatorio); outline-offset: 1px; }
.codebox { background: var(--surface-muted); border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); padding: var(--space-6) var(--space-7); }
.codebox strong { display: block; font-size: var(--fs-xs); font-weight: var(--fw-bold); color: var(--text-secondary); letter-spacing: var(--ls-wide); text-transform: uppercase; margin-bottom: var(--space-3); }
.codebox code { font-family: var(--font-mono); font-size: var(--fs-sm); color: var(--text-primary); line-height: 1.7; }
textarea.csv { width: 100%; min-width: 0; border: 1px solid var(--border-input); border-radius: var(--radius-lg); padding: var(--space-5) var(--space-6); font-family: var(--font-mono); font-size: var(--fs-sm); color: var(--text-body); background: var(--surface-card); resize: vertical; line-height: 1.65; }
.file-drop { background: var(--surface-card); border: 1px dashed var(--border-dashed); color: var(--accent-regulatorio); border-radius: var(--radius-md); padding: var(--space-4) var(--space-8); font-size: var(--fs-base); font-weight: var(--fw-semibold); cursor: pointer; display: inline-block; }
.file-drop:hover { background: var(--surface-accent-soft); }
/* a1 da auditoria de acessibilidade: display:none tirava o input da ordem
   de tabulação e da árvore de acessibilidade — quem só usa teclado não
   conseguia alcançar o seletor de arquivo. 1px/opacity:0 mantém o input
   focável e invisível; o anel de foco aparece no rótulo (.file-drop) que
   o envolve, via :focus-within, sem nenhuma mudança visual em repouso. */
.file-drop input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.file-drop:focus-within { outline: 2px solid var(--accent-regulatorio); outline-offset: 1px; }
.import-actions { display: flex; align-items: center; gap: var(--space-6); flex-wrap: wrap; }
.report { border-collapse: collapse; width: 100%; font-size: var(--fs-sm); }
.report th, .report td { text-align: left; padding: var(--space-3) var(--space-5); border-bottom: 1px solid var(--border-subtle); }
.report th { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: var(--ls-wide); color: var(--text-secondary); }
.report td.erro { color: var(--state-error-text); font-weight: var(--fw-semibold); }
.toast { position: fixed; bottom: var(--space-11); right: var(--space-11); background: var(--surface-sidebar); color: var(--text-on-dark); border-radius: var(--radius-lg); padding: var(--space-6) var(--space-10); font-size: var(--fs-base); font-weight: var(--fw-semibold); box-shadow: var(--shadow-toast); z-index: 50; margin: 0; }
@media (max-width: 1180px) { .charts { flex-direction: column; } .chart-card { min-width: 0; } }
@media (max-width: 900px) {
  .shell { grid-template-columns: 1fr; }
  .sidebar { position: static; height: auto; }
  .nav { flex-direction: row; overflow-x: auto; padding: var(--space-3) var(--space-5); }
  .nav__label { display: none; }
  .nav__item { border-left: none; border-bottom: 3px solid transparent; border-radius: var(--radius-sm) var(--radius-sm) 0 0; white-space: nowrap; }
  .nav__item[aria-current="page"] { border-left-color: transparent; border-bottom-color: var(--accent-mint); }
  main { padding: var(--space-9) var(--space-7) var(--space-14); }
  .topbar { padding: var(--space-5) var(--space-7); }
  /* Item 5 do relatório: "recolhida" é um ganho de espaço horizontal —
     não existe abaixo de 900px, onde a barra já vira uma faixa horizontal
     de abas roláveis (regras acima) em vez de uma coluna vertical. Sem
     este bloco, uma preferência "recolhida" salva numa sessão de desktop
     chegava aqui com os rótulos escondidos (item 5, regra desktop) dentro
     de uma faixa que os exige (white-space: nowrap acima pressupõe texto
     visível) — a faixa virava uma fileira de ícones sem nome visível,
     apertada, sem ganhar nada em troca (o grid já é 1fr aqui, não há
     coluna de barra lateral para encolher). As regras abaixo desfazem,
     só neste breakpoint, a apresentação "--colapsada" — mesma técnica
     inversa de .sr-only--focusable (mais abaixo neste arquivo), que
     também restaura display/posição em vez de introduzir um terceiro
     conjunto de valores. */
  .shell--colapsada { grid-template-columns: 1fr; }
  .sidebar--colapsada .sidebar__brand { justify-content: flex-start; padding: var(--space-10) var(--space-9) var(--space-8); }
  .sidebar--colapsada .sidebar__toggle-row { padding: var(--space-5) var(--space-9) 0; }
  .sidebar--colapsada .sidebar__toggle { width: 100%; min-width: 0; justify-content: flex-start; padding: var(--space-3) var(--space-5); margin: 0; }
  .sidebar--colapsada .sidebar__brandtext,
  .sidebar--colapsada .sidebar__toggle span,
  .sidebar--colapsada .nav__item > span,
  .sidebar--colapsada .sidebar__link-label,
  .sidebar--colapsada .user__name { position: static; width: auto; height: auto; padding: 0; margin: 0; overflow: visible; clip: auto; white-space: normal; }
  .sidebar--colapsada .nav__item { justify-content: flex-start; padding: 11px var(--space-5); }
  .sidebar--colapsada .sidebar__foot { padding: var(--space-7) var(--space-8); align-items: stretch; }
  .sidebar--colapsada .btn-ghost-mint { text-align: left; padding: var(--space-2) var(--space-5); }
  .sidebar--colapsada .user { justify-content: flex-start; }
  .sidebar--colapsada .user br { display: initial; }
}
@media (max-width: 640px) { .page-head h1 { font-size: var(--fs-2xl); } .actions .btn { flex: 1; } }

/* Página utilitária sem tela própria no design (ex.: recuperar-senha.php) —
   um card centralizado sobre o fundo navy do shell, na mesma linguagem do
   login. */
.pagina-simples { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--surface-sidebar); padding: var(--space-13); }
.pagina-simples main { width: 100%; max-width: 440px; background: var(--surface-card); border-radius: var(--radius-3xl); padding: var(--space-13); box-shadow: var(--shadow-raised); text-align: center; }
.pagina-simples h1 { font-family: var(--font-display); font-size: var(--fs-3xl); font-weight: var(--fw-bold); color: var(--text-primary); margin: 0 0 var(--space-7); }
.pagina-simples p { font-size: var(--fs-base); line-height: var(--lh-loose); color: var(--text-body); margin: 0 0 var(--space-7); }
.pagina-simples p:last-child { margin-bottom: 0; }
.pagina-simples a { color: var(--accent-regulatorio); font-weight: var(--fw-semibold); }
.pagina-simples a:hover { color: var(--accent-regulatorio-strong); text-decoration: underline; }

/* ------------------------------------------------------------------
   Utilitários de acessibilidade (auditoria 2026-08-24, itens a2/a17).
   Nenhuma regra abaixo altera a composição visual em repouso: os dois
   padrões só ficam visíveis quando o próprio elemento recebe foco. */
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
.sr-only--focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; white-space: normal; }

/* a17: mecanismo de pulo para o conteúdo principal, antes dos sete itens
   focáveis da barra lateral repetida em toda página do admin. Invisível
   até receber foco — desliza para dentro da viewport, não some do fluxo
   como .sr-only--focusable, porque aqui o objetivo é ficar bem visível
   (não só legível) enquanto focado. */
.skip-link { position: absolute; top: -40px; left: var(--space-5); z-index: 100; background: var(--accent-regulatorio); color: var(--text-on-dark); padding: var(--space-3) var(--space-6); border-radius: var(--radius-sm); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.skip-link:focus { top: var(--space-5); }

/* Histórico anual: uma grade editorial, mais leve que a planilha mensal.
   O cartão separa com/sem expurgo para a leitura seguir a mesma linguagem
   visual do painel público, e preserva o status como contexto secundário. */
.eyebrow { margin: 0 0 var(--space-2); color: var(--accent-sem-expurgo); font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: var(--ls-widest); text-transform: uppercase; }
.historico-anual__actions { align-items: center; }
/* Duas linhas a direita do cabecalho: o seletor de ANO DE REFERENCIA (que
   versao do painel esta sendo editada) em cima, as acoes da tela embaixo. Os
   dois sao <select> de ano e ficariam ambiguos lado a lado — a separacao em
   linhas, com o rotulo visivel so no de referencia, e o que distingue "trocar
   de versao" de "acrescentar um ano ao historico". */
.historico-anual__head-direita { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-4); }
.btn--compacto { padding: var(--space-3) var(--space-5); font-size: var(--fs-sm); }
.historico-anual__notice { display: flex; align-items: flex-start; gap: var(--space-4); max-width: 900px; margin: 0; padding: var(--space-5) var(--space-6); color: var(--accent-regulatorio); background: var(--surface-accent-soft); border: 1px solid var(--border-dashed); border-radius: var(--radius-lg); font-size: var(--fs-sm); line-height: var(--lh-base); }
.historico-anual__notice svg { width: 20px; height: 20px; flex: none; margin-top: 1px; }
.historico-anual-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); gap: var(--space-8); }
.historico-anual-card { min-width: 0; margin: 0; padding: var(--space-7); border: 1px solid var(--border-default); box-shadow: var(--shadow-card); }
.historico-anual-card--erro { border-color: var(--state-error-border); box-shadow: 0 0 0 2px var(--state-error-surface); }
/* legend com width auto (era 100%) para .historico-anual-card__controles caber
   na MESMA linha, encostado a direita: os dois flutuam, e .historico-anual-card__groups
   ja tinha o clear: both que fecha a linha logo abaixo. */
.historico-anual-card > legend { float: left; width: auto; margin: 0 0 var(--space-5); color: var(--text-primary); font-family: var(--font-display); font-size: var(--fs-3xl); font-weight: var(--fw-bold); letter-spacing: var(--ls-wide); line-height: 1; }
.historico-anual-card__controles { float: right; display: flex; align-items: center; gap: var(--space-2); }
.historico-anual-card__erro-ano { clear: both; margin: 0 0 var(--space-4); }
.historico-anual__adicionar { display: inline-flex; align-items: center; gap: var(--space-3); }
.historico-anual__adicionar select { min-width: 104px; padding: var(--space-3) var(--space-4); border: 1px solid var(--border-input); border-radius: var(--radius-sm); background: var(--surface-card); color: var(--text-primary); font-family: inherit; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.historico-anual__adicionar .select2-container { width: 104px !important; }
.historico-anual__sem-anos { margin: 0; align-self: center; color: var(--text-secondary); font-size: var(--fs-sm); }

/* Ativo/inativo por ano. O estado nunca depende so da cor: o texto ao lado do
   interruptor troca de "Ativo" para "Inativo" (WCAG 1.4.1), e o corpo do card
   perde contraste por :has() — em navegador sem :has() o card so nao esmaece,
   o rotulo continua dizendo qual e o estado. */
.switch-ativo { display: inline-flex; align-items: center; gap: var(--space-3); min-height: 44px; padding: 0 var(--space-2); cursor: pointer; }
.switch-ativo input { position: absolute; opacity: 0; width: 0; height: 0; }
.switch-ativo__pista { position: relative; flex: none; width: 40px; height: 22px; border-radius: var(--radius-pill); background: var(--state-neutral-mark); transition: background 160ms ease; }
.switch-ativo__pista::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--surface-card); transition: transform 160ms ease; }
.switch-ativo input:checked + .switch-ativo__pista { background: var(--accent-sem-expurgo); }
.switch-ativo input:checked + .switch-ativo__pista::after { transform: translateX(18px); }
.switch-ativo input:focus-visible + .switch-ativo__pista { outline: 2px solid var(--accent-regulatorio); outline-offset: 2px; }
.switch-ativo__texto { color: var(--text-secondary); font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: var(--ls-wide); text-transform: uppercase; }
.switch-ativo__on { display: none; }
.switch-ativo input:checked ~ .switch-ativo__texto { color: var(--state-success-text); }
.switch-ativo input:checked ~ .switch-ativo__texto .switch-ativo__on { display: inline; }
.switch-ativo input:checked ~ .switch-ativo__texto .switch-ativo__off { display: none; }
.historico-anual-card:has(.switch-ativo input:not(:checked)) { border-style: dashed; background: var(--surface-muted); }
.historico-anual-card:has(.switch-ativo input:not(:checked)) .historico-anual-card__groups,
.historico-anual-card:has(.switch-ativo input:not(:checked)) .historico-anual-card__status { opacity: 0.55; }
@media (prefers-reduced-motion: reduce) {
  .switch-ativo__pista, .switch-ativo__pista::after { transition: none; }
}
.historico-anual-card > legend span { display: block; margin-bottom: var(--space-1); color: var(--text-secondary); font-family: var(--font-sans); font-size: var(--fs-3xs); letter-spacing: var(--ls-widest); }
.historico-anual-card__groups { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); clear: both; }
.historico-anual-grupo { min-width: 0; padding: var(--space-5); background: var(--surface-accent-soft); border: 1px solid #dce4f8; border-radius: var(--radius-md); }
.historico-anual-grupo--limpo { background: var(--surface-clean-soft); border-color: var(--border-input-clean); }
.historico-anual-grupo h2 { margin: 0 0 var(--space-4); color: var(--accent-regulatorio); font-family: var(--font-display); font-size: var(--fs-lg); font-weight: var(--fw-bold); letter-spacing: var(--ls-wide); text-transform: uppercase; }
.historico-anual-grupo--limpo h2 { color: var(--accent-sem-expurgo); }
.historico-anual-fields { display: grid; gap: var(--space-4); }
.historico-anual-card input[type="text"] { width: 100%; min-width: 0; padding: var(--space-3) var(--space-4); border: 1px solid var(--border-input); border-radius: var(--radius-xs); background: var(--surface-card); color: var(--text-primary); font-family: var(--font-display); font-size: var(--fs-xl); font-weight: var(--fw-bold); line-height: 1.1; }
.historico-anual-card input[type="text"]:focus { outline: 2px solid var(--accent-regulatorio); outline-offset: 1px; }
.historico-anual-card input[aria-invalid="true"] { border-color: var(--state-error); }
.historico-anual-card__status { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-6); margin-top: var(--space-6); padding-top: var(--space-5); border-top: 1px solid var(--border-subtle); }
.atende--anual { display: flex; flex-wrap: wrap; gap: var(--space-3); margin: 0; padding: 0; border: 0; }
.atende--anual legend { width: 100%; margin-bottom: var(--space-1); color: var(--text-secondary); font-size: var(--fs-xs); font-weight: var(--fw-bold); letter-spacing: var(--ls-wide); text-transform: uppercase; }
.atende--anual label { display: inline-flex; align-items: center; gap: var(--space-2); color: var(--text-body); font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; }
.atende--anual input { accent-color: var(--accent-sem-expurgo); }
.atende--anual .field__error { width: 100%; }
.historico-anual-percentual { width: 112px; flex: none; }
.historico-anual-percentual label { white-space: nowrap; }
@media (max-width: 640px) {
  .historico-anual__actions { width: 100%; flex-wrap: wrap; }
  .historico-anual__actions .btn { flex: 1; }
  .historico-anual__adicionar { flex: 1 1 100%; }
  .historico-anual__adicionar select { flex: 1; }
  .historico-anual__adicionar .select2-container { flex: 1; width: auto !important; }
  .historico-anual-grid { grid-template-columns: 1fr; }
  .historico-anual-card__groups { grid-template-columns: 1fr; }
  .historico-anual-card__status { align-items: stretch; flex-direction: column; }
  .historico-anual-percentual { width: 100%; }
}
