/* ==========================================================================
   apen.css — Gestão Apen (app irmão do Conecta)
   Derivado de GESTAO_APEN_DESIGN_SPEC.md. Carregar DEPOIS do Bootstrap 5.
   Fonte self-hosted (CSP, sem CDN): colocar .woff2 em /static/vendor/jost/.
   ========================================================================== */

@font-face{font-family:'Jost';font-weight:300;font-style:normal;font-display:swap;
  src:url('/static/vendor/jost/Jost-Light.woff2') format('woff2')}
@font-face{font-family:'Jost';font-weight:400;font-style:normal;font-display:swap;
  src:url('/static/vendor/jost/Jost-Regular.woff2') format('woff2')}
@font-face{font-family:'Jost';font-weight:500;font-style:normal;font-display:swap;
  src:url('/static/vendor/jost/Jost-Medium.woff2') format('woff2')}

/* ---- Tokens ---- */
:root{
  --bg-white:#FFFFFF; --bg-off:#F8F7F4; --bg-warm:#F0EDE8;
  --navy:#081226; --text-2:#4A4844; --text-body:#888480;
  --border:#E8E4DE; --border-w:#C8C4BE;
  --blue-m:#365FAF; --pos:#365FAF; --blue-d:#0D2E6E; --blue-l:#8FA8C8;
  --neg:#C62828; --warn:#B17D00;
  /* variantes clareadas p/ estado sobre superfície navy (hover-invert). #FF9B9B
     é verbatim do apen.css real (danger on-dark); --warn-inv é o par âmbar do D3-bis. */
  --neg-inv:#FF9B9B; --warn-inv:#E8C56A; --mkt-pos-inv:#4ADE80;
  /* --bg-hover = wash CLARO (menus, gauge, ghost); --bg-hover-inv = navy do
     hover-invert (regra dura do Conecta 2026-07-13: superfície clicável inverte
     p/ navy + texto branco). Verbatim do apen.css real: invert = navy #081226. */
  --bg-hover:#EDF0F7; --bg-hover-inv:#081226;
  --pill-ok:#E8F0FE; --pill-pend:#FFF4E0; --pill-err:#FDECEA;

  --font-body:'Jost',system-ui,sans-serif;

  --fs-micro:10px; --fs-xs:11px; --fs-sm:12px; --fs-base:13px;
  --fs-md:14px; --fs-lg:18px; --fs-xl:22px; --fs-2xl:28px;
  /* Degraus de DISPLAY (Bloco G, 2026-08-04). Existem porque a escala parava em
     28px e o produto precisa de numeral grande — então cada tela inventava o
     seu: 8 usos em 7 telas com 5 valores diferentes (1.9 / 2 / 2.1 / 2.6 /
     3.2rem). Não é gente desleixada, é a escala não conseguindo expressar o
     caso. 3xl cobre a marca (.brand-a-lg, 32px exato) e o número macro do
     Cortes e da Dispersão — que são o MESMO componente e estavam em 30,4 e
     33,6px. 4xl é o herói dos Indicadores; 5xl é o código HTTP da tela de erro. */
  --fs-3xl:32px; --fs-4xl:40px; --fs-5xl:48px;

  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px;
  --sp-5:24px; --sp-6:32px; --sp-7:40px;

  --radius-sm:0; --radius:0; --radius-md:0;

  --shadow-card-hover:0 6px 18px rgba(8,18,38,.16);
  --shadow-modal:0 10px 40px rgba(0,0,0,.25);
  --shadow-toast:0 4px 20px rgba(8,18,38,.15);
  --t-fast:.15s ease; --t-base:.2s ease;
  --header-h:56px; --header-px:40px;
  --modal-sm:420px; --modal-md:480px; --modal-lg:560px;

  /* DESVIO D3 — semáforo SÓ p/ sinal de dinheiro (retorno/P&L). Nada mais usa verde. */
  --mkt-pos:#16A34A; --mkt-neg:#C62828;

  /* Rampa das CLASSES de ativo (proporção do portfólio no Dashboard; gestor,
     2026-10-01). Sequencial de um azul só, do mais conservador (1, caixa, claro)
     ao mais arriscado (6, renda variável, escuro); o offshore (11-14) usa os
     passos 1/3/5/6. Validada com o validate_palette.js --ordinal (um matiz,
     luminância monotônica, degraus visíveis, o passo claro destaca do fundo) no
     branco e no creme do suave; o escuro tem a rampa dele em temas.css.
     --cls-N-ink = o texto escrito em cima do passo N (contraste >= 4,5:1). */
  --cls-1:#9AB0D4; --cls-2:#7493C5; --cls-3:#5276B6;
  --cls-4:#365FAF; --cls-5:#22468E; --cls-6:#0D2E6E;
  --cls-1-ink:var(--navy); --cls-2-ink:var(--navy); --cls-3-ink:#FFFFFF;
  --cls-4-ink:#FFFFFF; --cls-5-ink:#FFFFFF; --cls-6-ink:#FFFFFF;
}

/* ---- Base ---- */
*{box-sizing:border-box}
body{margin:0;background:var(--bg-off);color:var(--navy);
  font-family:var(--font-body);font-weight:400;font-size:var(--fs-base);
  -webkit-font-smoothing:antialiased}
.num{font-variant-numeric:tabular-nums}
a{color:var(--blue-m)}

/* ---- Bootstrap overrides (este app é Bootstrap; o Conecta não) ---- */
.btn,.card,.form-control,.form-select,.modal-content,.dropdown-menu,.badge,
.alert,.list-group-item,.nav-pills .nav-link,.input-group-text,.table,.toast{
  border-radius:0 !important}
body,.btn,.form-control,.form-select{font-family:var(--font-body);font-weight:400}
.card{box-shadow:none;border-color:var(--border)}

/* ---- Header ---- */
.apen-header{height:var(--header-h);background:var(--bg-white);
  border-bottom:1px solid var(--border);display:flex;align-items:center;
  justify-content:space-between;padding:0 var(--header-px);position:sticky;top:0;z-index:20}
.apen-crumbs{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-xs);
  letter-spacing:.04em;color:var(--text-body);text-transform:uppercase}
.apen-crumbs .cur{color:var(--navy)}
.apen-crumbs .sep::before{content:'/';color:var(--border-w)}
.apen-logo{font-size:var(--fs-lg);font-weight:500;color:var(--navy);line-height:1}
/* å oficial: trocar por mask-image de /static/apen-a.svg — não usar fonte */

/* ---- Sidebar (reconciliação com o apen.css real do Túlio, 2026-07-29) ----
   1ª volta (rascunho aprovado): corpo claro + navy só no topo. A Natália viu
   rodando e voltou atrás — prefere manter a sidebar INTEIRA azul escura (mais
   perto do visual original), só com fonte menor e mais respiro entre os
   grupos ("quebras", no sentido de separação visual — não confundir com a
   metodologia de enquadramento). Corrigido na 2ª volta, mesmo dia.
   Cor sólida (sem gradiente — o resto do sistema real não usa gradiente em
   superfície grande, só no acento fino do topo). Sharp corners e RGB real do
   navy (8,18,38) entram de qualquer forma, independente da cor de fundo.
   Sobrescreve main.css, que segue dono da estrutura (largura, collapse,
   overlay mobile) — aqui só a pele muda.
   Pendente (ver GESTAO_APEN_DESIGN_SPEC.md §10): apen-a.svg oficial (o "å"
   do topo segue textual por ora). O print que a Natália mandou em seguida
   mostra que os itens do menu real do Túlio TÊM sub-itens que expandem/
   recolhem (+/−) — não replicado aqui: o Gestão Apen hoje não tem sub-página
   sob nenhum item do menu, então isso ficaria fabricando estrutura que não
   existe. Se for pra ter de verdade, é conversa própria sobre o que cada
   tela ganha de sub-item, não só visual. */
.apen-sidebar{background:var(--navy);box-shadow:2px 0 12px rgba(8,18,38,.15)}
.sidebar-header{height:var(--header-h)}
/* PERFORMÅ (2026-07-29, caixa alta é grafia — corrigido depois da 1ª tentativa
   em minúsculas): nome da plataforma escolhido pela Natália, substitui
   "åpen"+"capital" como a marca principal no topo — "Åpen Capital" (a
   empresa) vira legenda pequena logo abaixo, mesmo padrão do "WORKSPACE ·
   ÅPEN" no sistema real do Túlio. text-transform:none porque o texto já
   vem em caixa alta no template (não é o lowercase antigo do "åpen").
   Fica FORA do <nav> (não rola com a lista) e some no modo recolhido,
   igual aos rótulos de seção. */
.sidebar-workspace{padding:.4rem .85rem .6rem;font-size:var(--fs-micro);
  letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.35);
  flex-shrink:0;border-bottom:1px solid rgba(255,255,255,.08)}
.apen-sidebar.collapsed .sidebar-workspace{height:0;padding:0;border:0;overflow:hidden}
.sidebar-toggle-btn{border-radius:0}
.sidebar-link{color:rgba(255,255,255,.68);font-size:var(--fs-sm);border-radius:0}
.sidebar-link:hover{background:rgba(255,255,255,.08);color:#fff}
.sidebar-link.active{background:var(--bg-white);color:var(--navy);font-weight:500}
.sidebar-link.active::before{content:none}
.sidebar-link.active:hover{background:var(--bg-white);color:var(--navy)}
.sidebar-section{color:rgba(255,255,255,.4);font-weight:500;font-size:var(--fs-micro);
  margin:1.5rem 0 .3rem}
@media (max-width:767px){
  .apen-sidebar.mobile-open{box-shadow:4px 0 24px rgba(8,18,38,.35)}
  .sidebar-backdrop.show{background:rgba(8,18,38,.45)}
}

/* ---- Page scaffold ----
   Sem max-width: cockpit desktop-first e denso em números (§1 do spec) —
   telas largas devem usar o espaço, não sobrar vazio nas laterais. O limite
   de 1180px (2026-07-27) forçava scroll horizontal interno em tabelas com
   mais colunas (ex.: enquadramento por classe) e desperdiçava espaço em
   monitores largos. */
/* O topo começa logo abaixo da barra (24px, eram 32): o nome da tela já está nela
   (gestor, 2026-10-08: "utilizar melhor a tela ... dos lados e no topo"). E nenhuma
   tela trava a largura com max-width inline: Dados, Fechamento, Saúde, Metas,
   Demandas, Réguas, Performances e Usuários travavam entre 1.000 e 1.400px e
   deixavam faixa vazia dos lados. */
.apen-page{margin:0 auto;padding:var(--sp-5) var(--header-px) var(--sp-7)}
.apen-page-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:var(--sp-5)}
.apen-page-title{font-size:var(--fs-xl);font-weight:500;margin:0}
.apen-page-sub{font-size:var(--fs-sm);color:var(--text-body);margin-top:var(--sp-1)}
.apen-page-meta{font-size:var(--fs-sm);color:var(--text-body)}
.apen-section-title{font-size:var(--fs-sm);text-transform:uppercase;letter-spacing:.05em;
  color:var(--text-body);margin:0 0 var(--sp-3)}
/* Volta-para (Bloco E, 2026-08-04): era copiado em 8 telas — client, os 3
   diagnósticos, expurgo, plano de cobertura, restaurar quarentena e vocabulário.
   Já se chamava `apen-*` sem estar no sistema. */
.apen-back-link{color:var(--text-body);text-decoration:none;font-size:var(--fs-sm);font-weight:500}
.apen-back-link:hover{color:var(--navy)}

/* ---- Filterbar ----
   Uma linha leve, sem caixa (gestor, 2026-10-08: "eu n quero ter que aplicar ou
   clicar em outro botão para funcionar"): o filtro aplica sozinho ao fechar o
   dropdown ou trocar o select (static/js/drawer.js:initDpFilters), então não há
   botão "filtrar" nem dica de "clique em filtrar". O fundo é o da página: grudada
   no topo ao rolar, ela cobre a tabela em vez de flutuar sobre ela. */
.apen-filterbar{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;
  background:var(--bg-off);padding:var(--sp-2) 0;
  position:sticky;top:var(--header-h);z-index:10;margin-bottom:var(--sp-4)}
.apen-filterbar .dp-trigger,.apen-filterbar .apen-btn-ghost{font-size:var(--fs-sm);font-weight:400;
  text-transform:none;letter-spacing:0;padding:var(--sp-1) var(--sp-3);background:var(--bg-white);
  color:var(--text-2)}
.apen-filterbar .dp-trigger::after{content:"\F282";font-family:"bootstrap-icons";font-size:var(--fs-micro);
  margin-left:var(--sp-2);color:var(--text-body)}
.apen-filterbar .dp-trigger.has-active{background:var(--navy);border-color:var(--navy);color:#fff}
.apen-filterbar .dp-trigger.has-active::after{color:#fff}
.apen-filterbar .dp-trigger .panel-badge{margin-left:var(--sp-1)}
.apen-filterbar .form-select-sm{font-size:var(--fs-sm);padding-top:var(--sp-1);padding-bottom:var(--sp-1);
  border-color:var(--border-w);color:var(--text-2)}
.apen-seg{display:inline-flex;border:1px solid var(--border-w)}
/* aceita <button> (toggle client-side) OU <a> (navegação GET, preserva filtro
   na querystring — é o caso mais comum no app, server-rendered) */
.apen-seg button,.apen-seg a{font-family:inherit;font-size:var(--fs-xs);font-weight:500;letter-spacing:.03em;
  padding:var(--sp-2) var(--sp-3);background:var(--bg-white);color:var(--text-2);border:0;
  border-right:1px solid var(--border-w);cursor:pointer;transition:var(--t-fast);
  text-decoration:none;display:inline-block}
.apen-seg button:last-child,.apen-seg a:last-child{border-right:0}
.apen-seg button.is-active,.apen-seg a.is-active{background:var(--navy);color:#fff}
.apen-seg a:hover{text-decoration:none}
.apen-chip{font-size:var(--fs-xs);padding:var(--sp-1) var(--sp-3);border:1px solid var(--border-w);
  color:var(--text-2);background:var(--bg-white);cursor:pointer;transition:var(--t-fast)}
.apen-chip.is-on{background:var(--pill-ok);border-color:var(--blue-m);color:var(--blue-d)}
.apen-search{margin-left:auto;font-family:inherit;font-size:var(--fs-sm);color:var(--navy);
  padding:var(--sp-2) var(--sp-3);border:1px solid var(--border-w);background:var(--bg-white);min-width:200px}
.apen-search:focus{outline:none;border-color:var(--blue-m)}

/* ---- KPIs ---- */
.apen-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-4);margin-bottom:var(--sp-4)}
.apen-kpi{background:var(--bg-white);border:1px solid var(--border);padding:var(--sp-5)}
.apen-kpi .lbl{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--text-body)}
.apen-kpi .val{font-size:var(--fs-xl);font-weight:500;margin-top:var(--sp-2)}
.apen-kpi .sub{font-size:var(--fs-sm);color:var(--text-body);margin-top:var(--sp-1)}

/* Valor de KPI é sempre número: tabular-nums para as casas alinharem entre
   cards vizinhos. Vinha só no .mini-kpi-val (main.css) e se perderia na
   migração do Bloco B (2026-08-03); no componente, vale para as 20 telas. */
.apen-kpi .val{font-variant-numeric:tabular-nums}

/* Estados semânticos do valor (Bloco E, 2026-08-04). Já vinham namespaced em
   `.apen-kpi` — prometiam ser do sistema e eram cópia local em 7, 6 e 1 telas.
   Diferente dos `.mk-*` da nota abaixo: aqueles pintam o CARD daquela tela, estes
   pintam o VALOR e significam a mesma coisa em toda a casa (alerta / atenção /
   sem dado), então são vocabulário do DS. */
.apen-kpi .val.kpi-alert{color:var(--neg)}
.apen-kpi .val.kpi-attn{color:var(--warn)}
.apen-kpi .val.kpi-muted{color:var(--text-body)}

/* KPI clicável (Bloco E, 2026-08-04): o card inteiro é <a> e inverte no hover,
   mesma gramática do .apen-card-action. Eram estes 6 seletores copiados em
   alocador, dashboard, gestao_apen e riscos_painel — 4 lugares para mudar um
   hover. O .kpi-cockpit do riscos_painel segue LOCAL: é grid de coluna daquela
   tela, não componente.

   `cursor:pointer` é o ÚNICO ponto onde as 4 cópias divergiam, e ele fica: metade
   das telas monta o card como <div> que abre drawer por JS (alocador,
   gestao_apen) e sem isso o cursor não vira mão; a outra metade usa <a href>
   (dashboard, riscos_painel), onde a declaração é no-op. Com ele, a promoção
   preserva as 4 telas — sem ele, quebraria 2. */
.kpi-link{position:relative;text-decoration:none;color:inherit;display:block;cursor:pointer;transition:var(--t-base)}
.kpi-link .kpi-link-arrow{position:absolute;top:var(--sp-5);right:var(--sp-5);color:var(--text-body);font-size:var(--fs-sm)}
.kpi-link:hover{background:var(--bg-hover-inv);border-color:transparent;box-shadow:var(--shadow-card-hover)}
.kpi-link:hover .lbl,.kpi-link:hover .sub{color:rgba(255,255,255,.62)}
.kpi-link:hover .val{color:var(--bg-white)}
.kpi-link:hover .val.kpi-alert{color:var(--neg-inv)}
.kpi-link:hover .val.kpi-attn{color:var(--warn-inv)}
.kpi-link:hover .kpi-link-arrow{color:var(--bg-white)}

/* .mini-kpi/.mini-kpi-val/.mini-kpi-label REMOVIDOS no Bloco B (2026-08-03):
   eram o mesmo componente do .apen-kpi com outro nome e uma 3ª aparência
   (centralizado, padding menor). As 6 telas que ainda os usavam — cliente,
   diagnóstico, diagnóstico de duplicatas, restaurar quarentena, saúde dos dados
   e vocabulário de sufixos — passaram a usar .apen-kpi > .val/.lbl. Os
   modificadores de estado .mk-alert/.mk-ok/.mk-attn seguem LOCAIS nas telas que
   os usam: são cor de estado daquela tela, não parte do DS. */

/* ---- Painel: card / donut / barras ---- */
.apen-card{background:var(--bg-white);border:1px solid var(--border);padding:var(--sp-6)}
.apen-card-title{font-size:var(--fs-lg);font-weight:500;margin:0 0 var(--sp-4)}
/* Cabeçalho e rodapé de card FLUSH (Bloco F, 2026-08-04).

   Quando a tabela precisa ir de ponta a ponta, o card recebe `p-0` e perde o
   padding — então o título e a nota de pé passam a carregar o próprio. Isso
   estava como `style="padding:var(--sp-4) var(--sp-4) 0"` inline em 7 lugares
   (6 no client, 1 no usuarios) e o par de rodapé em 2. Combina com
   .apen-section-title / .apen-page-sub, que continuam donos da tipografia —
   estas duas classes só resolvem o espaçamento.

   NÃO cobre a variante `... var(--sp-2)` da comparacao_reguas: valor diferente,
   uso único, fica local. */
.apen-card-head{padding:var(--sp-4) var(--sp-4) 0}
.apen-card-foot{padding:0 var(--sp-4) var(--sp-4)}
/* Cabeçalho de seção dentro de card: título à esquerda, ação/meta à direita
   (Bloco E, 2026-08-04). Estava copiado em 6 telas — analise, dashboard,
   enquadramento_v2, enquadramento_v2_fila, gestao_apen e riscos_painel.

   Único seletor do Bloco E que divergia de verdade: 5 telas com gap sp-2 (8px) e
   a enquadramento_v2_fila com sp-3 (12px). Unificado em sp-2 por decisão do
   gestor — a Fila perde 4px de respiro entre título e ação, e é a ÚNICA mudança
   de aparência de todo o bloco. */
.pnl-sec-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);flex-wrap:wrap}
/* Caixa de explicação/aviso em prosa (Bloco E, 2026-08-04): copiada em client,
   painel_acao e perfis. Também já se chamava `apen-*` sem estar aqui. */
.apen-info-box{font-size:var(--fs-sm);color:var(--text-2);background:var(--bg-off);
  border:1px solid var(--border);padding:var(--sp-3) var(--sp-4)}
.apen-donut{position:relative;width:120px;height:120px}
.apen-donut svg{transform:rotate(-90deg)}
.apen-donut .center{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center}
.apen-donut .pct{font-size:var(--fs-xl);font-weight:500}
.apen-donut .cap{font-size:var(--fs-micro);text-transform:uppercase;letter-spacing:.05em;color:var(--text-body)}
/* fórmula única: r=24 → circumference 150.8; dashoffset = 150.8*(1-p) */
.apen-donut .track{fill:none;stroke:var(--bg-warm);stroke-width:8}
.apen-donut .fill{fill:none;stroke:var(--blue-d);stroke-width:8;stroke-dasharray:150.8}
.apen-bars{display:flex;flex-direction:column;gap:var(--sp-4)}
.apen-bar-row{display:grid;grid-template-columns:120px 1fr 56px;align-items:center;gap:var(--sp-3)}
.apen-bar-row .name{font-size:var(--fs-sm);color:var(--text-2)}
.apen-bar-track{height:8px;background:var(--bg-warm);position:relative}
.apen-bar-fill{height:100%;background:var(--blue-d)}
.apen-bar-fill.is-under{background:var(--blue-l)}
.apen-bar-val{font-size:var(--fs-sm);text-align:right;color:var(--navy)}
.apen-bar-100{position:absolute;top:-3px;bottom:-3px;width:1px;background:var(--navy);opacity:.35}

/* ---- Tabela ---- */
.apen-table{width:100%;border-collapse:collapse;background:var(--bg-white);border:1px solid var(--border)}
.apen-table thead th{font-size:var(--fs-micro);text-transform:uppercase;letter-spacing:.05em;
  text-align:left;color:var(--text-body);font-weight:500;background:var(--bg-warm);
  padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--border)}
.apen-table th.r,.apen-table td.r{text-align:right}
/* .c ao lado do .r que já morava aqui (Bloco E, 2026-08-04): era a mesma linha
   copiada em analise, carteiras, client, comparacao_reguas e enquadramento_v2_fila. */
.apen-table th.c,.apen-table td.c{text-align:center}
.apen-table tbody td{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--border);
  font-size:var(--fs-base);color:var(--text-2)}
.apen-table tbody tr:last-child td{border-bottom:0}
/* Densa: a tabela analítica, muitas linhas de número lidas em bloco (Indicadores,
   página do alocador) — a linha cai de 44 para 36px. A preferência "linhas
   compactas" (temas.css, que carrega depois, mesma especificidade) ainda desce
   mais. Gestor, 2026-10-08: "essas telas estão muito grandes". */
.apen-table.is-densa thead th{padding:var(--sp-2) var(--sp-3)}
.apen-table.is-densa tbody td{padding:var(--sp-2) var(--sp-3)}
.apen-table tbody tr:nth-child(even) td{background:var(--bg-off)}
/* Hover-invert (regra dura Conecta): a linha inteira inverte p/ navy e o texto
   branqueia — EXCETO classes de estado/controle (badge/tag/chip/pill/status/neg/
   danger/btn/avatar), que mantêm identidade própria. Verbatim do apen.css real. */
.apen-table tbody tr:hover td{background:var(--bg-hover-inv);color:#fff}
.apen-table tbody tr:hover td *:not([class*="danger"],[class*="neg"],[class*="pill"],[class*="badge"],[class*="tag"],[class*="chip"],[class*="status"],[class*="avatar"],[class*="btn"],.apen-empty,.apen-empty *){color:#fff}
/* Linha de estado vazio (colspan + .apen-empty) não é dado de linha — o card
   já é autocontido (fundo/borda próprios); achado em 2026-07-28: sem esta
   exceção o hover-invert deixava o título/texto brancos sobre o card branco. */
.apen-table tbody tr:has(.apen-empty):hover td{background:transparent}
/* on-dark: estados clareados p/ contraste sobre o navy (mesma lógica do sistema real).
   .apen-pill-* NÃO precisa de override aqui — o :not([class*="pill"]) acima já os
   poupa do branqueamento, e eles têm fundo próprio (preenchido, não outline), então
   ficam legíveis contra qualquer fundo de linha sem ajuste extra (mesmo motivo pelo
   qual apen-real.css só dá tratamento especial ao .apen-pill-admin, ver mais abaixo). */
/* Campo e lista dentro da linha em destaque mantêm a cor: o branco acima deixava
   a lista de carteiras branca no branco (gestor, 2026-10-12: "ficam todas em branco
   e quando passo o mouse ela aparece"). */
.apen-table tbody tr:hover td :is(input, select, option, optgroup, textarea, .combo-lista, .combo-lista *){color:var(--navy)}
.apen-table tbody tr:hover td :is(.combo-grupo, .combo-extra, .combo-vazio){color:var(--text-body)}
.apen-table tbody tr:hover td .num-neg{color:var(--neg-inv)}
/* `num-neg` NO PRÓPRIO td, não só em filho dele. Só o par descendente acima
   existia, e `.apen-table tbody td{color:var(--text-2)}` (0,1,2) vence
   `.num-neg` (0,1,0) — então a classe posta na célula não pintava NADA. Achei
   medindo a cor computada da fila do enquadramento: `class="r num num-neg"`
   aplicado, cor idêntica à das células normais. Eram 5 usos assim em 4 telas
   (riscos_painel ×2, enquadramento_v2_fila ×2, enquadramento_v2 ×1) contra 1
   único em <span> — a convenção do markup é no td; o CSS é que estava pela
   metade. `.num.attn` não sofria disso por ter duas classes (0,2,0). */
.apen-table tbody td.num-neg{color:var(--neg)}
.apen-table tbody tr:hover td.num-neg{color:var(--neg-inv)}
.apen-table tbody tr:hover td .num.attn{color:var(--warn-inv)}
.apen-table tbody tr:hover td .tipo-tag{color:rgba(255,255,255,.7)}
.apen-table tbody tr:hover td .gauge-mark{background:#fff}
/* Botão-ícone (.apen-iconbtn — Bloco D, 2026-08-03). O `:not(.is-danger)` é do
   apen-real.css: ação destrutiva não branqueia, clareia p/ vermelho, senão
   "excluir" fica indistinguível de "salvar" sobre a linha invertida. */
.apen-table tbody tr:hover td .apen-iconbtn:not(.is-danger){border-color:rgba(255,255,255,.55);color:#fff;background:transparent}
.apen-table tbody tr:hover td .apen-iconbtn:not(.is-danger):hover{background:rgba(255,255,255,.14);border-color:#fff;color:#fff}
.apen-table tbody tr:hover td .apen-iconbtn.is-danger{color:#FF9B9B;border-color:rgba(255,155,155,.6);background:transparent}
/* Botão de AÇÃO por linha (texto, não só ícone): o :not() acima poupa qualquer
   [class*="btn"] do branqueamento, então .apen-btn-ghost mantinha color:var(--navy)
   — navy sobre a linha invertida em navy = texto invisível. Achado em 2026-07-28
   na fila do FGC, o primeiro caso real de botão com rótulo dentro de linha de
   dado. Mesmo contrato do .apen-iconbtn acima. */
.apen-table tbody tr:hover td .apen-btn-ghost,
.apen-table tbody tr:hover td .apen-btn{border-color:rgba(255,255,255,.55);color:#fff;background:transparent}
.apen-table tbody tr:hover td .apen-btn-ghost:hover,
.apen-table tbody tr:hover td .apen-btn:hover{background:rgba(255,255,255,.14);border-color:#fff;color:#fff}
/* D3 — semáforo de DINHEIRO preservado no hover (verde/vermelho clareados p/ o
   navy; o real branqueava o .pos, mas o semáforo de dinheiro é invariante do DS). */
.apen-table tbody tr:hover td .pos{color:var(--mkt-pos-inv)}
.apen-table tbody tr:hover td .neg{color:var(--neg-inv)}
.apen-table .acr{color:var(--navy);font-weight:500}
/* DESVIO D3: .pos/.neg SÓ em coluna de retorno/P&L */
.pos{color:var(--mkt-pos)}
.neg{color:var(--mkt-neg)}

/* Bases que o hover-invert acima JÁ referenciava sem que existissem aqui
   (Bloco E, 2026-08-04). O componente estava pela metade: o estado on-dark morava
   no sistema (`.num-neg` L222, `.tipo-tag` L224) e a base era copiada por tela —
   5 e 10 cópias idênticas. Foi assim que a acompanhamento.html passou a usar
   `.tipo-tag` no markup sem ninguém definir a classe: a tag "off" saía sem
   caixa-alta e sem fs-micro, só ali. Base no sistema, o esquecimento não repete. */
.num-neg{color:var(--neg)}
/* Marcador de universo da carteira (ex.: "off"). Não é pill: é sufixo tipográfico
   do código, por isso micro + caixa-alta e não tem fundo próprio. */
.tipo-tag{font-size:var(--fs-micro);text-transform:uppercase;letter-spacing:.05em;color:var(--text-body)}
/* Risco vertical de alvo sobre barra (.apen-bar-track e as barras locais). Mesmo
   caso: o hover-invert dele estava aqui (L~226) e a base era cópia em client e
   gestao_riscos. Posiciona-se contra o pai relativo, por isso não tem tamanho. */
.gauge-mark{position:absolute;top:-2px;bottom:-2px;width:2px;background:var(--navy)}

/* ---- Status (bolinha + texto; paleta azul→navy, sem verde) ---- */
.apen-status{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);color:var(--text-2)}
.apen-status .dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
.dot-ok{background:var(--navy)}
.dot-attn{background:var(--blue-l)}
.dot-neutral{background:var(--border-w)}
.dot-alert{background:var(--neg)}
/* D3-bis (2026-07-21): estado "atenção" em âmbar (2º desvio consciente do Conecta).
   .dot-attn (=--blue-l) herdado fica intacto; a atenção "quente" é classe própria. */
.dot-attn-warm{background:var(--warn)}
.num.attn{color:var(--warn)}
.an-muted{color:var(--text-body)}

/* ---- Pills/badges — reconciliado com apen-real.css (2026-07-30). Substitui
   sit-badge/badge-ok/badge-alert/badge-neutral/apen-badge-attn (vocabulário
   inventado por sessões sem acesso ao arquivo real do Túlio — GESTAO_APEN_
   DESIGN_SPEC.md §10). Nomes e formas (preenchido, não outline) verbatim do
   apen-real.css; cores via tokens que o app já tinha com nomes próprios
   (--pill-ok/-pend/-err ≡ --bg-ok/-pending/-error do arquivo real, mesmos
   hex). ---- */
.apen-pill{display:inline-block;padding:2px 8px;font-size:var(--fs-micro);font-weight:500;
  text-transform:uppercase;letter-spacing:.5px;line-height:1.6;white-space:nowrap}
.apen-pill-ok{background:var(--pill-ok);color:var(--blue-d)}
.apen-pill-pending{background:var(--pill-pend);color:var(--warn)}
.apen-pill-error{background:var(--pill-err);color:var(--neg)}
.apen-pill-admin{background:var(--navy);color:#fff}
.apen-pill-neutral{background:var(--bg-warm);color:var(--text-2)}
/* .apen-pill-admin é o único pill com fundo escuro — precisa de contraste
   próprio contra o hover-invert (também navy) da linha/row, senão desaparece;
   verbatim do apen-real.css. Os outros pills não precisam (fundo claro
   próprio já contrasta com qualquer estado de hover). */
.apen-table tbody tr:hover td .apen-pill-admin,
.apen-row:hover .apen-pill-admin{border:1px solid rgba(255,255,255,.4)}

/* ---- Card de navegação (hover inverte) ---- */
.apen-card-action{display:block;background:var(--bg-white);border:1px solid var(--border);
  padding:var(--sp-5);text-decoration:none;transition:var(--t-base);cursor:pointer}
.apen-card-action .ca-lbl{font-size:var(--fs-micro);text-transform:uppercase;letter-spacing:.05em;color:var(--text-body)}
.apen-card-action .ca-title{font-size:var(--fs-lg);font-weight:500;color:var(--navy);margin-top:var(--sp-1)}
.apen-card-action .ca-desc{font-size:var(--fs-sm);color:var(--text-body);margin-top:var(--sp-2)}
.apen-card-action:hover{background:var(--bg-hover-inv);border-color:transparent;box-shadow:var(--shadow-card-hover)}
.apen-card-action:hover .ca-title{color:#fff}
.apen-card-action:hover .ca-lbl{color:rgba(255,255,255,.55)}
.apen-card-action:hover .ca-desc{color:rgba(255,255,255,.72)}
/* tile de SELEÇÃO (.selected) usa wash, não inverte */
.apen-tile.selected:hover,.apen-tile.is-active:hover{background:var(--bg-hover)}

/* ---- Botões ----
   Cada classe é autocontida (não uma combinação de .apen-btn + modificador):
   todo uso real no app já era `class="apen-btn-ghost"` sozinha, nunca
   `apen-btn apen-btn-ghost` junto. Com .apen-btn-ghost só definindo
   background/color/border-color (achado em 2026-07-28), <a> ficava sem
   padding/border-width/font/text-decoration nenhum — <button> escapava
   porque o UA stylesheet do navegador já dá algum default de caixa a
   button, mas <a> não tem nada por padrão. */
.apen-btn,.apen-btn-ghost{font-family:inherit;font-size:var(--fs-xs);font-weight:500;
  letter-spacing:.05em;text-transform:uppercase;padding:var(--sp-2) var(--sp-4);
  border:1px solid var(--navy);cursor:pointer;transition:var(--t-fast);
  text-decoration:none;display:inline-block;line-height:1.4}
.apen-btn{background:var(--navy);color:#fff}
.apen-btn:hover{background:var(--blue-d);border-color:var(--blue-d);color:#fff}
.apen-btn-ghost{background:transparent;color:var(--navy);border-color:var(--border-w)}
.apen-btn-ghost:hover{background:var(--bg-hover);border-color:var(--border-w);color:var(--navy)}
/* Botão-ícone — portado do apen-real.css no Bloco D (2026-08-03). Substituiu o
   `.apen-btn-icon` local, que era o mesmo componente com outro nome e uma
   diferença que importa: o local era 26px fixo, o do DS é 32px por padrão e 26
   com `.is-sm`. Por isso a migração dos 15 usos foi para `apen-iconbtn is-sm` —
   trocar sem o modificador aumentaria todo botão de ação e mexeria na altura das
   linhas de tabela, que não era o objetivo do bloco.
   Sempre acompanhar de title/aria-label (o botão é só ícone). */
.apen-iconbtn{position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:32px;height:32px;flex:0 0 32px;border:1px solid var(--border-w);
  background:var(--bg-white);color:var(--text-2);cursor:pointer;text-decoration:none;
  transition:var(--t-fast)}
.apen-iconbtn:hover{border-color:var(--blue-m);color:var(--blue-m);text-decoration:none}
.apen-iconbtn.is-active{border-color:var(--blue-m);color:var(--blue-m)}
.apen-iconbtn svg{width:16px;height:16px;stroke:currentColor;fill:none}
/* Denso, p/ ação dentro de linha de tabela — é o tamanho que o app usa hoje. */
.apen-iconbtn.is-sm{width:26px;height:26px;flex:0 0 26px}
.apen-iconbtn.is-sm svg{width:14px;height:14px}
.apen-iconbtn.is-primary{border-color:var(--blue-m);color:var(--blue-m)}
.apen-iconbtn.is-primary:hover{background:var(--bg-ok)}
.apen-iconbtn.is-danger{border-color:var(--neg);color:var(--neg)}
.apen-iconbtn.is-danger:hover{background:var(--bg-error)}
.apen-iconbtn:disabled{opacity:.45;cursor:default;pointer-events:none}
/* Contador sobreposto (ex.: nº de filtros ativos). Sem uso ainda no app; entra
   junto para o componente não ficar meio portado. */
.apen-iconbtn-badge{position:absolute;top:-6px;right:-6px;
  min-width:14px;height:14px;padding:0 3px;
  font-size:9px;line-height:14px;text-align:center;
  background:var(--blue-m);color:#fff}

/* ---- Modal + drawer ---- */
.apen-modal-backdrop{position:fixed;inset:0;background:rgba(8,18,38,.35);z-index:40}
.apen-modal{background:var(--bg-white);border:1px solid var(--border);box-shadow:var(--shadow-modal);
  width:var(--modal-md);max-width:calc(100vw - var(--sp-6));padding:var(--sp-6)}
.apen-modal-sm{width:var(--modal-sm)} .apen-modal-lg{width:var(--modal-lg)}
.apen-modal-title{font-size:var(--fs-xl);font-weight:500;margin:0 0 var(--sp-4)}
.apen-drawer{position:fixed;top:0;right:0;height:100%;width:var(--modal-md);background:var(--bg-white);
  border-left:1px solid var(--border);box-shadow:var(--shadow-modal);z-index:40;padding:var(--sp-6)}
.apen-savebar{position:sticky;bottom:0;background:var(--bg-white);border-top:1px solid var(--border);
  padding:var(--sp-3) 0;display:flex;justify-content:flex-end;gap:var(--sp-3)}

/* ---- Toast ---- */
.apen-toast{position:fixed;bottom:28px;right:28px;background:var(--bg-white);border:1px solid var(--border);
  box-shadow:var(--shadow-toast);padding:var(--sp-3) var(--sp-4);max-width:420px;
  font-size:var(--fs-sm);display:none;z-index:50}
.apen-toast.is-visible{display:block}
.apen-toast-ok{border-color:var(--blue-m)} .apen-toast-error{border-color:var(--neg)}

/* ---- Estados: vazio / carregando / sem-resultado ---- */
.apen-empty{background:var(--bg-white);border:1px solid var(--border);padding:var(--sp-7);text-align:center;color:var(--text-body)}
.apen-empty .t{font-size:var(--fs-lg);font-weight:500;color:var(--navy);margin-bottom:var(--sp-2)}
.apen-skeleton{background:linear-gradient(90deg,var(--bg-off),var(--bg-warm),var(--bg-off));
  background-size:200% 100%;animation:apen-shimmer 1.2s infinite;height:16px;margin:var(--sp-2) 0}
@keyframes apen-shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}

/* ---- Vocabulário mínimo dos partials de drawer (templates/_drawer/*) ----
   Os 11 partials usavam as classes semânticas do Bootstrap
   (text-success/-danger/-warning), que trazem o verde e o vermelho do
   Bootstrap em vez dos tokens — e, no caso do text-success, punham VERDE em
   "está tudo certo", o que o D3 proíbe (verde só existe no semáforo de
   dinheiro, via .pos/--mkt-pos). Escopado no .ga-drawer para não virar
   utilitário global solto. Achado em 2026-07-28: os drawers nunca entraram na
   contagem da migração, embora sejam superfície que o usuário abre pelos KPIs. */
.ga-drawer .dr-ok{color:var(--navy)}
.ga-drawer .dr-bad{color:var(--neg)}
.ga-drawer .dr-attn{color:var(--warn)}

/* .rf-menu/.rf-menu-flip removidos no Bloco C (2026-08-03): o dropdown antigo
   não existe mais em nenhuma tela. O flip de borda virou .dp-right, aplicado
   pelo initDpFilters. */

/* ---- Dropdown de filtro (.dp-wrap/.dropdown-panel) — reconciliado com
   apen-real.css (2026-07-30, Bloco C). Único dropdown do app desde o
   Bloco C — markup pela macro _filtro_dp.html (ds §10, GESTAO_APEN_DESIGN_
   SPEC.md). Estado (aberto, toggle ligado) é via classe — não :checked —
   porque .dp-row.is-on também revela .dp-value (select/input inline), não só
   o toggle; abrir/fechar/sincronizar em static/js/drawer.js:initDpFilters(). */
.dp-wrap{position:relative}
.dp-trigger .panel-badge{display:none}
.dp-trigger.has-active{border-color:var(--blue-m);color:var(--blue-m)}
.dp-trigger.has-active .panel-badge{display:inline-block}
.dropdown-panel{position:absolute;top:calc(100% + 6px);left:0;z-index:300;
  background:var(--bg-white);border:1px solid var(--border);border-radius:0;
  box-shadow:0 8px 28px rgba(8,18,38,.13);width:440px;max-width:calc(100vw - 32px);
  max-height:72vh;overflow-y:auto;display:none}
.dropdown-panel.dp-right{left:auto;right:0}
.dropdown-panel.is-open{display:block}
.dp-header{padding:14px 16px 10px;display:flex;align-items:center;
  justify-content:space-between;border-bottom:1px solid var(--border)}
.dp-title{font-size:12px;font-weight:500;letter-spacing:.05em;
  text-transform:uppercase;color:var(--text-body)}
.dp-action{font-size:11px;color:var(--neg);cursor:pointer;background:none;
  border:none;font-family:var(--font-body)}
.dp-row[hidden],.dp-empty[hidden]{display:none}
.dp-busca{position:sticky;top:0;z-index:1;padding:8px 16px;background:var(--bg-white);
  border-bottom:1px solid var(--border)}
.dp-grp-lbl{font-size:10px;font-weight:500;letter-spacing:.08em;
  text-transform:uppercase;color:var(--text-body);padding:10px 16px 6px;
  border-top:1px solid var(--border)}
.dp-row{display:flex;align-items:center;gap:10px;padding:7px 16px;cursor:pointer}
.dp-row:hover{background:var(--bg-off)}
.dp-toggle{width:32px;height:18px;border-radius:0;background:var(--border);
  position:relative;flex-shrink:0;transition:background .2s}
.dp-toggle::after{content:'';position:absolute;top:3px;left:3px;width:12px;
  height:12px;border-radius:0;background:#fff;transition:transform .2s;
  box-shadow:0 1px 3px rgba(0,0,0,.2)}
.dp-row.is-on .dp-toggle{background:var(--blue-m)}
.dp-row.is-on .dp-toggle::after{transform:translateX(14px)}
.dp-label{font-size:13px;flex:1;color:var(--navy)}
.dp-label small{display:block;font-size:11px;color:var(--text-body);margin-top:1px}
.dp-value{display:none;flex-shrink:0}
.dp-row.is-on .dp-value{display:flex;align-items:center;gap:5px}
.dp-select{padding:4px 8px;border:1px solid var(--border);border-radius:0;
  font-family:var(--font-body);font-size:12px;background:var(--bg-white);
  outline:none;max-width:160px;color:var(--navy)}
.dp-input{padding:4px 8px;border:1px solid var(--border);border-radius:0;
  font-family:var(--font-body);font-size:12px;width:140px;outline:none;color:var(--navy)}
.dp-footer{padding:12px 16px;border-top:1px solid var(--border);display:flex;
  justify-content:flex-end;gap:8px}
/* Painel sem opção: o `.rf-hint` local da fila de enquadramento fazia esse papel
   ("nenhum alocador cadastrado"); virou parte do componente no Bloco C para não
   sumir na migração — painel abrindo em branco parece defeito. */
.dp-empty{padding:14px 16px;font-size:var(--fs-sm);color:var(--text-body)}
/* ---- Colunas personalizáveis (static/js/colunas.js) — o painel reusa a pele do
   dropdown de filtro (.dropdown-panel/.dp-row/.dp-toggle) com wrapper próprio
   (.col-wrap), para o initDpFilters não tratar "colunas" como filtro. */
.col-barra{display:flex;justify-content:flex-end;padding:4px 8px}
.col-wrap{position:relative;display:inline-block}
.col-btn{font-family:var(--font-body);font-size:var(--fs-xs);letter-spacing:.03em;
  color:var(--text-body);background:none;border:1px solid transparent;
  padding:3px 8px;cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.col-btn:hover,.col-btn[aria-expanded="true"]{color:var(--navy);border-color:var(--border)}
.col-painel{width:300px}
.col-painel .dp-row{padding:5px 12px;cursor:default}
.col-liga{background:none;border:0;padding:0;cursor:pointer;display:inline-flex}
.col-mover{background:none;border:0;padding:2px 4px;color:var(--text-body);cursor:pointer;line-height:1}
.col-mover:hover{color:var(--navy)}
.col-mover:disabled{opacity:.25;cursor:default}
.col-cadeado{width:32px;text-align:center;color:var(--text-body);font-size:var(--fs-xs)}
.col-fixa .dp-label{color:var(--text-body)}
.col-rodape{font-size:var(--fs-xs);color:var(--text-body);justify-content:flex-start}
.col-oculta{display:none!important}
.chips-row{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.chips-row:empty{display:none}
.af-label{font-size:11px;color:var(--text-body);flex-shrink:0}
/* --pill-ok ≡ --bg-ok do arquivo real (mesmo hex, ver nota do bloco de pills acima). */
.af-chip{display:flex;align-items:center;gap:5px;background:var(--pill-ok);
  border:1px solid var(--border-w);color:var(--blue-d);border-radius:0;
  padding:3px 10px 3px 12px;font-size:11px;font-weight:500}
.af-chip .af-x{cursor:pointer;opacity:.6;font-size:13px;padding:0 0 1px 2px}
.af-chip .af-x:hover{opacity:1}

/* ---- A11y ---- */
button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{
  outline:2px solid var(--blue-m);outline-offset:1px}
:disabled{opacity:.5;cursor:not-allowed}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* ---- Troca de tela ----
   Gestor, 2026-10-08: "tente deixar a troca de tela o mais fluida possível". Entre
   telas da casa, o conteúdo cruza num instante curto em vez de piscar em branco; o
   menu e a barra do topo ficam parados (a captura nova entra direto, sem fade). O
   navegador sem suporte (Firefox, por ora) troca como antes; quem pede menos
   movimento no sistema também. */
@view-transition{navigation:auto}
.apen-sidebar{view-transition-name:apen-menu}
.apen-topbar{view-transition-name:apen-topo}
::view-transition-old(root),::view-transition-new(root){animation-duration:.16s}
::view-transition-old(apen-menu),::view-transition-old(apen-topo){display:none}
::view-transition-new(apen-menu),::view-transition-new(apen-topo),
::view-transition-group(apen-menu),::view-transition-group(apen-topo){animation:none}
@media (prefers-reduced-motion:reduce){@view-transition{navigation:none}}

/* Esqueleto da gaveta: linhas no lugar do conteúdo enquanto ele chega (era um
   spinner no meio do vazio). Com o pré-carregamento no hover, quase não aparece. */
.ga-esqueleto{display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-2) 0}
.ga-esqueleto span{display:block;height:var(--sp-3);
  background:linear-gradient(90deg,var(--bg-warm) 25%,var(--bg-off) 50%,var(--bg-warm) 75%);
  background-size:200% 100%;animation:ga-brilho 1.2s linear infinite}
.ga-esqueleto span:nth-child(3n){width:60%}
.ga-esqueleto span:nth-child(3n+2){width:85%}
@keyframes ga-brilho{from{background-position:200% 0}to{background-position:-200% 0}}

/* ---- Mobile (desktop-first; tabelas viram cards no app) ---- */
@media (max-width:820px){
  .apen-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}   /* minmax: o número longo quebra, não empurra */
  .apen-page,.apen-header{padding-left:var(--sp-5);padding-right:var(--sp-5)}
  /* título e ações: no celular as ações descem para a linha de baixo (sem a
     quebra, o seletor de janela empurrava a página para o lado) */
  .apen-page-head{flex-wrap:wrap;gap:var(--sp-3)}
  .apen-drawer,.apen-modal{width:100%}
}

/* ---- Barras de rolagem sempre à mostra ----
   Gestor, 2026-10-12: "a barra de rolagem ... fica em branco e quando passo o mouse
   ela aparece". A barra do sistema (sobreposta, fina) some até o mouse chegar; aqui
   ela fica visível em toda área que rola. Quem tem scrollbar-width:none continua sem. */
html{scrollbar-color:var(--border-w) transparent}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--border-w);border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background-color:var(--text-body)}

/* ---- Lista de códigos com busca (static/js/combo.js) ---- */
.combo{position:relative;display:inline-block;width:100%}
.combo-oculto{display:none!important}
.combo-lista{position:absolute;z-index:1060;left:0;top:100%;min-width:100%;max-width:min(420px,90vw);
  max-height:300px;overflow-y:auto;background:var(--bg-white);border:1px solid var(--border-w);
  box-shadow:var(--shadow-toast);margin-top:2px;scrollbar-width:auto}
.combo-grupo{padding:var(--sp-2) var(--sp-3) var(--sp-1);font-size:var(--fs-xs);text-transform:uppercase;
  letter-spacing:.05em;color:var(--text-body);position:sticky;top:0;background:var(--bg-white)}
.combo-op{padding:var(--sp-1) var(--sp-3);font-family:'SF Mono','Fira Code',monospace;font-size:var(--fs-sm);color:var(--navy);
  cursor:pointer;white-space:nowrap}
.combo-op:hover,.combo-op.is-ativo{background:var(--bg-hover)}
.combo-extra{margin-left:var(--sp-2);font-family:var(--font-body);font-size:var(--fs-xs);color:var(--text-body)}
.combo-vazio{padding:var(--sp-2) var(--sp-3);font-size:var(--fs-xs);color:var(--text-body)}


/* Telas de trabalho: o campo do alvo só aparece quando há movimento sugerido. */
.tt-acao .tt-alvo { display: none; }
.tt-acao:has(option[value="completar_risco"]:checked) .tt-alvo { display: block; }

/* ── Simulador on/off ─────────────────────────────────────────────────────────
   Gestor, 2026-10-13. Azul = onshore, dourado = offshore (validadas juntas); o traço
   escuro é a meta. Situação da linha: cinza = sem offshore, azul claro = até a meta,
   âmbar = acima da meta, como na campanha offshore. */
.sim-eyebrow{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.14em;color:var(--text-body)}
.sim-padrao{display:flex;align-items:center;gap:var(--sp-2)}
.sim-padrao input{width:64px}
.sim-legenda{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-4);font-size:var(--fs-sm)}
.sim-chip{padding:2px var(--sp-3);border:1px solid var(--border);background:var(--bg-white);color:var(--text-2)}
.sim-chip.sim-ate{background:var(--pill-ok);border-color:var(--blue-l)}
.sim-chip.sim-acima{background:var(--pill-pend);border-color:var(--warn-inv)}
.sim-dot{display:inline-block;width:10px;height:10px;margin-right:var(--sp-1)}
.sim-dot-on{background:var(--blue-m)}
.sim-dot-off{background:var(--warn)}
.sim-busca{max-width:170px}
.sim-sel{max-width:210px}
.sim-contagem{margin-left:auto;font-size:var(--fs-sm)}

.sim-tabela .sim-linha{cursor:pointer;border-left:3px solid transparent}
.sim-tabela .sim-linha.sim-r-sem{border-left-color:var(--border-w)}
.sim-tabela .sim-linha.sim-r-ate{border-left-color:var(--blue-m)}
.sim-tabela .sim-linha.sim-r-acima{border-left-color:var(--warn)}
.sim-tabela .sim-linha.sim-r-ate>td{background:var(--pill-ok)}
.sim-tabela .sim-linha.sim-r-acima>td{background:var(--pill-pend)}
.sim-tabela .sim-linha.is-aberta>td{box-shadow:inset 0 -2px 0 var(--navy)}
.sim-tabela .sim-linha:focus-visible{outline:2px solid var(--navy);outline-offset:-2px}
.sim-celula-pct{white-space:nowrap}
.sim-trilho{position:relative;display:inline-block;width:110px;height:8px;margin-left:var(--sp-3);vertical-align:middle;
  background:linear-gradient(to right,var(--blue-m) calc((100 - var(--off)) * 1%),var(--warn) 0)}
.sim-trilho-meta{position:absolute;top:-3px;bottom:-3px;width:2px;left:calc((100 - var(--meta)) * 1%);background:var(--navy)}

.sim-painel{position:fixed;top:var(--header-h);right:0;bottom:0;width:440px;max-width:100%;background:var(--bg-white);
  border-left:1px solid var(--border);box-shadow:var(--shadow-modal);z-index:30;overflow-y:auto;
  transform:translateX(105%);transition:transform var(--t-base);padding:var(--sp-5)}
.sim-painel.is-aberto{transform:translateX(0)}
.sim-painel-topo{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-3);margin-bottom:var(--sp-4)}
.sim-painel-titulo{font-size:var(--fs-xl);font-weight:500;color:var(--navy);word-break:break-word}
.sim-fechar{border:0;background:transparent;color:var(--text-2);font-size:var(--fs-md);padding:var(--sp-1)}
.sim-fechar:hover{color:var(--navy)}
.sim-bloco{padding:var(--sp-4) 0;border-top:1px solid var(--border)}
.sim-rotulo{display:block;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--text-body);margin-bottom:var(--sp-2)}
.sim-seg{display:flex}
.sim-seg button{flex:1;padding:var(--sp-2) var(--sp-3)}
.sim-painel input[type=range]{width:100%;margin-top:var(--sp-3);accent-color:var(--navy)}
.sim-atalhos{display:flex;gap:var(--sp-2);margin-top:var(--sp-2)}
.sim-barras{display:flex;flex-direction:column;gap:var(--sp-4);margin-bottom:var(--sp-4)}
.sim-barra-linha{display:grid;grid-template-columns:48px 1fr 56px;align-items:center;gap:var(--sp-3);font-size:var(--fs-sm)}
.sim-barra-nome{color:var(--text-body)}
.sim-barra{position:relative;height:18px;background:linear-gradient(to right,var(--blue-m) calc((100 - var(--off, 0)) * 1%),var(--warn) 0)}
.sim-barra-meta{position:absolute;top:-4px;bottom:-4px;width:2px;left:calc((100 - var(--meta, 20)) * 1%);background:var(--navy)}
.sim-barra-pct{text-align:right;color:var(--navy)}
.sim-quadro{width:100%;font-size:var(--fs-sm);border-collapse:collapse}
.sim-quadro th{font-weight:400;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--text-body);padding:var(--sp-1) 0}
.sim-quadro td{padding:var(--sp-1) 0;border-top:1px solid var(--border)}
.sim-resumo{margin-top:var(--sp-3);padding:var(--sp-3);background:var(--bg-off);border-left:3px solid var(--navy);font-size:var(--fs-sm);color:var(--text-2)}
.sim-meta-form{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.sim-meta-form input[name=meta]{width:70px}
.sim-nota{margin-top:var(--sp-2);font-size:var(--fs-xs);color:var(--text-body)}
.sim-rodape{padding-top:var(--sp-4);border-top:1px solid var(--border)}
@media (min-width:1100px){
  body.sim-com-painel .sim-pagina{margin-right:440px}
}

/* Cinco cartões numa linha; a tabela não quebra os valores (rola, se faltar espaço) e, com
   o painel aberto, esconde as colunas secundárias para o cliente e os números caberem. */
.sim-pagina .apen-kpis{grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:1100px){.sim-pagina .apen-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}
.sim-tabela th,.sim-tabela td{white-space:nowrap}
body.sim-com-painel .sim-col-sec{display:none}

/* Simulador on/off: moeda (R$ / US$), câmbio e remessa. */
.sim-pagina[data-moeda="brl"] .m-usd{display:none}
.sim-pagina[data-moeda="usd"] .m-brl{display:none}
.sim-legenda-dir{margin-left:auto;display:inline-flex;align-items:center;gap:var(--sp-2)}
.sim-fx{margin-bottom:var(--sp-4);font-size:var(--fs-sm);color:var(--text-body)}
.sim-fx.sim-fx-aviso{padding:var(--sp-2) var(--sp-3);background:var(--pill-pend);border-left:3px solid var(--warn);color:var(--text-2)}
.sim-rotulo-linha{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-2)}
.sim-rotulo-linha .sim-rotulo{margin-bottom:0}
.sim-remessa{margin-top:var(--sp-3);padding:var(--sp-3);background:var(--bg-off);border-left:3px solid var(--warn)}
.sim-remessa .sim-rotulo{margin-bottom:var(--sp-1)}
.sim-remessa-val{font-size:var(--fs-xl);font-weight:500;color:var(--navy)}
.sim-usd{font-size:var(--fs-xs);color:var(--text-body)}
.sim-quadro td .sim-usd{margin-top:0}

/* ── Planilha de decisão (Telas de trabalho, modo planilha) ───────────────────────────────
   Gestor, 2026-10-14. Cinza = o modelo (só leitura); azul = o alocador preenche; amarelo =
   falta algo para fechar o cliente. O painel por alocador fica no topo e filtra a planilha. */
.tp-vivo{display:inline-flex;align-items:center;gap:6px;margin-left:var(--sp-2);color:var(--text-2)}
.tp-vivo i{width:8px;height:8px;border-radius:50%;background:var(--mkt-pos);display:inline-block}
.tp-dash{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--sp-3);margin-bottom:var(--sp-3)}
.tp-card{background:var(--bg-white);border:1px solid var(--border);padding:var(--sp-3);cursor:pointer}
.tp-card.is-sel{border-color:var(--navy);box-shadow:inset 0 -3px 0 var(--navy)}
.tp-card:focus-visible{outline:2px solid var(--navy);outline-offset:1px}
.tp-card-todos{background:var(--navy);border-color:var(--navy);color:#fff}
.tp-card-nome{font-size:var(--fs-sm);letter-spacing:.08em;text-transform:uppercase;color:var(--text-body)}
.tp-card-todos .tp-card-nome{color:rgba(255,255,255,.72)}
.tp-card-big{font-size:var(--fs-xl);font-weight:500;margin-top:var(--sp-1)}
.tp-card-big small{font-size:var(--fs-sm);font-weight:400;color:var(--text-body)}
.tp-card-todos .tp-card-big small{color:rgba(255,255,255,.72)}
.tp-barra{height:5px;background:var(--border);margin:var(--sp-2) 0}
.tp-barra b{display:block;height:100%;width:calc(var(--p) * 1%);background:var(--blue-m)}
.tp-card-todos .tp-barra{background:rgba(255,255,255,.25)}
.tp-card-todos .tp-barra b{background:#fff}
.tp-card-l{font-size:var(--fs-xs);color:var(--text-2);line-height:1.5}
.tp-card-todos .tp-card-l{color:rgba(255,255,255,.88)}
.tp-card-l strong{font-weight:500;color:var(--navy)}
.tp-card-todos .tp-card-l strong{color:#fff}
.tp-dash-tabela tr[data-tp-grupo]{cursor:pointer}
.tp-g-tot td{font-weight:500}
.tp-motivos{margin-bottom:var(--sp-3);font-size:var(--fs-sm);color:var(--text-2)}
.tp-motivos summary{cursor:pointer;display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}
.tp-chip{border:1px solid var(--border-w);background:var(--bg-white);padding:1px var(--sp-3)}
.tp-chip b{font-weight:500;color:var(--navy);margin-left:var(--sp-1)}
.tp-filtros{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;margin:var(--sp-3) 0}
.tp-f-in{max-width:190px}.tp-f-sel{max-width:210px}
.tp-faixa{display:inline-flex;align-items:center;gap:var(--sp-1);font-size:var(--fs-sm)}
.tp-faixa input{width:84px}
.tp-filtros .apen-seg em{font-style:normal;opacity:.65;margin-left:var(--sp-1)}
.tp-filtros .is-on{border-color:var(--navy)}
.tp-contagem{margin-left:auto;font-size:var(--fs-sm)}
.tp-leg{display:flex;flex-wrap:wrap;gap:var(--sp-4);font-size:var(--fs-xs);color:var(--text-2);margin-bottom:var(--sp-2)}
.tp-leg i{display:inline-block;width:10px;height:10px;margin-right:5px;vertical-align:middle}
.tp-lg-m{background:var(--bg-warm)}.tp-lg-a{background:var(--pill-ok);border:1px solid var(--blue-l)}.tp-lg-y{background:var(--pill-pend);border:1px solid var(--warn-inv)}
.tp-aviso{margin-bottom:var(--sp-2);padding:var(--sp-2) var(--sp-3);background:var(--pill-ok);border-left:3px solid var(--blue-m);font-size:var(--fs-sm);color:var(--text-2)}
.tp-aviso.is-erro{background:var(--pill-err);border-left-color:var(--neg)}
.tp-folha{background:var(--bg-white);border:1px solid var(--border);overflow:auto;max-height:70vh}
.tp-tabela{border-collapse:collapse;width:100%;font-size:var(--fs-sm);white-space:nowrap}
.tp-tabela th,.tp-tabela td{padding:5px 8px;border-bottom:1px solid var(--border);text-align:left;vertical-align:middle}
.tp-tabela .r{text-align:right}
.tp-tabela thead{position:sticky;top:0;z-index:2;background:var(--bg-white)}
.tp-banda th{font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;border-bottom:0;font-weight:500}
.tp-b-m{background:var(--bg-warm);color:var(--text-2)}.tp-b-a{background:var(--pill-ok);color:var(--blue-d)}.tp-b-s{color:var(--text-2)}
.tp-cols th{font-size:var(--fs-xs);font-weight:500;color:var(--text-2);background:var(--bg-off);position:relative}
.tp-cols .tp-th-a{background:var(--pill-ok);color:var(--blue-d)}
.tp-ord,.tp-fun{border:0;background:transparent;color:inherit;font:inherit;padding:0}
.tp-fun{margin-left:var(--sp-1);opacity:.45;font-size:var(--fs-xs)}.tp-fun:hover,.tp-fun.is-on{opacity:1;color:var(--blue-m)}
.tp-pop{position:absolute;top:100%;right:0;z-index:5;background:var(--bg-white);border:1px solid var(--border-w);box-shadow:var(--shadow-modal);padding:var(--sp-3);display:flex;flex-direction:column;gap:var(--sp-2);min-width:170px;text-align:left;font-weight:400}
.tp-pop label{display:flex;flex-direction:column;gap:2px;font-size:var(--fs-xs)}
.tp-pop-b{display:flex;gap:var(--sp-2)}
.tp-grupo[hidden]{display:none}
.tp-tabela td.tp-m{background:var(--bg-off);color:var(--text-2)}
.tp-nome{display:flex;align-items:center;gap:var(--sp-1)}
.tp-chev{border:0;background:transparent;padding:0;width:16px;color:var(--text-body)}
.tp-chev i{display:inline-block;transition:transform var(--t-fast)}
.tp-aberto .tp-chev i{transform:rotate(90deg)}
.tp-chev-vazio{display:inline-block;width:16px}
.tp-s-faz>td,.tp-s-executado>td{background-image:linear-gradient(var(--pill-ok),var(--pill-ok));background-blend-mode:normal}
.tp-grupo.tp-salvando{opacity:.55}
.tp-filho td{background:var(--bg-white);color:var(--text-body);font-size:var(--fs-xs)}
.tp-filho td.tp-m{background:var(--bg-off)}
.tp-nome-f{padding-left:34px !important}
.tp-pill{display:inline-block;font-size:var(--fs-xs);padding:1px var(--sp-3);border:1px solid var(--border-w);background:var(--bg-white);color:var(--text-2)}
.tp-p-analise{background:var(--pill-pend);border-color:var(--warn-inv);color:var(--warn)}
.tp-p-faz,.tp-p-mov{background:var(--pill-ok);border-color:var(--blue-l);color:var(--blue-d)}
.tp-p-nao{background:var(--pill-err);border-color:var(--neg);color:var(--neg)}
.tp-p-executado{background:var(--bg-white);border-color:var(--mkt-pos);color:var(--mkt-pos)}
.tp-cel{min-width:118px;max-width:200px;font-size:var(--fs-sm);padding:2px var(--sp-2);border:1px solid var(--blue-l);background:var(--bg-white);color:var(--blue-d)}
.tp-cel.tp-vazio{color:var(--text-body);border-style:dashed}
.tp-cel.tp-falta{background:var(--pill-pend);border-color:var(--warn-inv);color:var(--warn)}
.tp-num{min-width:96px;text-align:right}.tp-data{min-width:120px}.tp-txt{min-width:160px}
.tp-cel-ro{display:inline-block;padding:2px var(--sp-2)}
.tp-cel-ro.tp-falta{background:var(--pill-pend);color:var(--warn)}
.tp-calc{color:var(--text-2)}
.tp-selbar{margin-top:var(--sp-3);display:flex;justify-content:space-between;align-items:center;background:var(--navy);color:#fff;padding:var(--sp-3) var(--sp-4);font-size:var(--fs-md);position:sticky;bottom:0}
.tp-selbar[hidden]{display:none}
.tp-btn-claro{border:1px solid #fff;background:#fff;color:var(--navy);padding:5px var(--sp-4);font-size:var(--fs-sm);font-weight:500}
