*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

/* ── IDENTIDADE "TINTA" (TASK-031, 2026-08-03) ──────────────────────────────
   Grafite quente + terracota. Substitui o azul var(--ouro) (padrão Tailwind, a
   cor de milhares de projetos gerados por IA) e o cinza-azulado de fundo.
   Decisão da Amanda entre três direções; "zero azul" é literal — inclusive o
   azul de marca (var(--ouro)) saiu.

   NOMES POR PAPEL, não por cor: `--acao` diz o que a variável faz; `--azul`
   dizia só como ela parece, e foi por isso que o produto acumulou 110 cores
   distintas em 531 lugares. Os nomes antigos continuam existindo como ALIAS
   logo abaixo — trocar 531 ocorrências e os nomes no mesmo commit seria
   impossível de revisar. */
:root {
  /* ── AÇÃO: UMA COR SÓ, E ELA TEM DOIS PAPÉIS (TASK-039, 2026-08-07) ───────
     A terracota #B4552D saiu. Duas gerações de paleta conviviam — 202 usos
     de terracota contra 59 do dourado — e a cor que dominava o produto não
     era a que a Amanda aprovou no Figma. Pior: terracota (18°, 44%) e
     vermelho de urgência (6°, 46%) ficam a 12° e 2 pontos de distância; a
     regra "vermelho é só urgência" existia no documento, não na tela.

     ⚠️ DOURADO NÃO É SUBSTITUTO MECÂNICO DA TERRACOTA. Terracota é ESCURA e
     aceita texto branco; dourado é CLARO e com branco mede 2,24:1. Por isso
     ele tem dois papéis, e cada uso foi migrado para o certo:

       FUNDO  → `--ouro` SEMPRE com texto `--tinta` (8,01:1)
       TEXTO  → `--ouro-texto` SEMPRE, e sobre card branco (4,78:1)
                — sobre a mesa mede 3,92:1, só serve a texto grande

     Os nomes ficam por PAPEL: `--ouro` diz a cor, `--ouro-texto` diz o uso. */

  /* Semânticos — recalibrados para a família quente. O SIGNIFICADO não muda
     (ver BUSINESS_RULES): vermelho é urgência de prazo e nada mais. */
  --verde:         #2F6B4F;
  /* BADGES TINTADOS (TASK-039): mediam ~1,1:1 contra o card branco — o
     status não saltava na lista. Escurecidos ate 1,5:1 MISTURANDO CADA UM
     COM A PROPRIA COR FORTE, nao com preto: escurecer para o preto
     dessaturava os quatro em cinzas quase identicos, e badge que perde o
     matiz perde a funcao. Texto de cada um remedido para AA sobre o novo
     fundo. */
  --verde-claro:   #C5D7CE;   /* era #EDF4F0 (1,12:1) — TASK-039, agora 1,5:1 */
  --verde-escuro:  #1E4A36;
  --amarelo:       #B8860B;
  --amarelo-claro: #E6D19F;   /* era #FBF3E2 (1,10:1) — TASK-039, agora 1,5:1 */
  --amarelo-escuro:#755608;   /* AA (4,52:1) sobre o novo --amarelo-claro */
  --vermelho:      #C03A2B;
  --vermelho-escuro:#8E2618;  /* texto sobre --vermelho-claro; o cheio da 3,6:1 */
  --vermelho-claro:#F0CAC6;   /* era #FBECEA (1,15:1) — TASK-039, agora 1,5:1 */

  /* Neutros quentes — o "papel" da identidade.
     RECALIBRADOS em 05/08 ("está tudo muito bege"): quando a sidebar grafite
     saiu (TASK-036), a tela perdeu o polo escuro — página 91,5% de luminância,
     sidebar 94,1%, card 100%, tudo separado por razões de 1,03–1,09, abaixo
     do que o olho registra como superfícies diferentes. A resposta é a mesma
     do desenho do Figma: TINTA mais forte e a página um degrau mais escura,
     para o card branco voltar a ser "papel sobre mesa" (card × página passou
     de 1,09 para 1,22, medido). */
  --cinza:         #676159;   /* escurecido junto com a mesa: sobre ela media 3,72 e cairia para 3,33. Agora 4,50 na mesa, 6,12 no card. */
  --cinza-claro:   #F0EDE8;
  --cinza-mid:     #E4DFD8;
  --texto:         #1A1614;   /* = --tinta do desenho (era #332F2A) */
  --texto-sec:     #5C554B;   /* 7,35:1 sobre card (era #6E675D, 5,58:1) */
  --borda:         #E4DFD8;
  --bg:            #E4DCCE;   /* a MESA. TASK-039: desceu de #EDE8DF. Degrau mesa->card foi de 9,8 para 14,9 pontos HSL (minimo 8), e mesa->sidebar de 6,9 para 12 (minimo 4). Familia creme quente mantida -- o leiloa.ai e frio, dele se transpoe a ESTRUTURA, nao a temperatura. */
  --bg-card:       #FFFFFF;
  /* Superfície de COLUNA (board de Oportunidades): fica ENTRE a mesa e o
     cartão, para o cartão branco subir de dentro dela em vez de se confundir
     com o fundo. Token próprio porque não é card nem mesa — é o terceiro
     degrau, e cravar #FAF8F5 no lugar quebraria o tema escuro. */
  --coluna-bg:     #FAF8F5;
  --nav-bg:        #221F1C;   /* grafite escuro — moldura, nunca fundo de conteúdo */

  /* ── TOKENS DO DESENHO (TASK-036, medidos por estilo computado em 05/08) ──
     Valores lidos das telas /painel e /painel/kanban do figma.site. Quem
     mexer aqui remede o desenho antes — ver tasks/TASK-036-TOKENS-MEDIDOS.md.

     A sidebar deixou de ser grafite (#2B2825) e passou a ser CLARA: é o que
     o desenho oficial mostra. A moldura escura continua existindo só em
     --nav-bg, para os poucos lugares que a usam de propósito. */
  /* ── SIDEBAR EM TINTA (Ponte visual vitrine → painel, 08/08) ──────────────
     A sidebar volta a ser ESCURA — e isso reverte a TASK-036, que a havia
     clareado por fidelidade ao Figma Make ("o design do Figma, não o seu",
     05/08). A decisão nova é da Amanda e vem do handoff da auditoria: a
     vitrine (preta e dourada) e o produto (claro) não se pareciam, e a
     sidebar é a peça que os dois têm em comum.
     O produto continua CLARO — muda a moldura, não a mesa.

     ⚠️ Efeito colateral a vigiar: a "âncora escura por tela" (TASK-036) parte
     do princípio de que existe UM elemento escuro por vez. Com a sidebar
     escura permanente, o card do dia no Kanban e o card do líder na
     Inteligência deixam de ser os únicos — se começarem a competir, quem
     cede é a âncora, não a sidebar.

     Tokens PRÓPRIOS, não os gerais: `--neutro-menu` e `--ouro-texto` foram
     calibrados contra superfície CLARA e viram texto ilegível aqui. Mesma
     lição da lista de estados na mesa — token é aprovado contra uma
     superfície, não em abstrato. */
  --sidebar-bg:      #1A1614;
  --sidebar-largura: 224px;
  --sidebar-borda:   rgba(240,237,232,.10);
  --sidebar-texto:   #F0EDE8;   /* item do menu e marca: 15,2:1 sobre a tinta */
  --sidebar-hover:   rgba(240,237,232,.07);
  /* O handoff pede .45 para o rótulo de grupo; medido, dá 4,03:1 num texto de
     10px. Subiu para .55 (5,39:1). "Tokens de contraste AA" está na lista do
     que NÃO mexer do próprio handoff — então aqui o AA ganha do valor. */
  --sidebar-secao:   rgba(240,237,232,.55);
  --sidebar-ativo-bg:    rgba(200,169,110,.16);
  --sidebar-ativo-texto: #C8A96E;   /* 6,01:1 sobre o fundo ativo */
  --ouro:            #C8A96E;   /* acento de FUNDO e sobre escuro (botão, barra, contador) */
  /* Dourado como TEXTO sobre claro: #C8A96E mede 2,1:1 na sidebar — ilegível.
     Mesmo dourado escurecido até 4,5:1 (maratona 06/08). O de fundo não muda. */
  --ouro-texto:      #847049;
  --ouro-fraco:      rgba(200,169,110,.08);
  /* Peças que a TASK-039 precisou e não existiam. `--ouro-escuro` é o hover
     do botão dourado (escurece o FUNDO, mantendo texto tinta); `--ouro-mid`
     herda o papel de borda intermediária que era do `--acao-mid`. */
  --ouro-escuro:     #B08F4E;   /* hover do FUNDO dourado; com tinta da 5,89:1 */
  --ouro-clara:      #E2D1B1;   /* fundo tintado (badge e superficie): 1,5:1 contra o card */
  --ouro-texto-forte:#69593A;   /* texto SOBRE --ouro-clara: 4,53:1 (o --ouro-texto so da 3,18) */
  /* --tinta tinha DOIS papéis e no claro isso não aparecia: texto normal e
     texto sobre fundo dourado. No escuro os dois se separam — o primeiro
     precisa clarear, o segundo não pode, porque o dourado continua claro.
     Mesma lição da TASK-039 com --ouro (fundo × texto). */
  --sobre-ouro:      #1A1614;   /* texto sobre --ouro. NUNCA muda com o tema. */
  /* Texto sobre --verde. Este, ao contrário do dourado, PRECISA virar com o
     tema: no claro o verde é escuro (#2F6B4F, branco dá 5,9:1); no escuro ele
     clareia para #7FC9A4 e branco cairia para 1,7:1 — ilegível. Par declarado
     junto para ninguém escrever `color:#fff` cru sobre o verde e só descobrir
     no tema escuro. */
  --sobre-verde:     #FFFFFF;
  --sobre-vermelho:  #FFFFFF;   /* texto sobre --vermelho; vira no escuro, como o verde */
  --inverso-bg:      #1A1614;   /* superfície deliberadamente invertida (herói, card do líder) */
  --inverso-texto:   #FFFFFF;   /* texto sobre --inverso-bg: viram JUNTOS ou o card some */
  /* Dourado como TEXTO sobre a superfície INVERTIDA (08/08). É o quarto papel
     do dourado, e existe porque a superfície invertida anda na contramão do
     tema: no claro ela é escura e pede o dourado claro; no escuro ela CLAREIA
     e pede o dourado escuro — exatamente o oposto de --ouro-texto. Sem ele, o
     rótulo do cabeçalho do onboarding mede 2,4:1 no tema escuro. */
  --ouro-inverso:    #C8A96E;
  /* Verde que vive SOBRE a superficie invertida (mesmo papel do --ouro-inverso).
     No claro a superficie e tinta, entao o verde clareia. */
  --verde-inverso:   #7FA98A;
  --tinta:           #1A1614;
  --neutro-menu:     #7A716B;   /* era #9C9189 do desenho: 2,9:1 na sidebar, reprovado AA — escurecido p/ 4,5:1 (maratona 06/08) */
  --neutro-meta:   #68605A;   /* idem: 3,74 -> 4,52 sobre a mesa nova */

  /* ── LADO A / LADO B DOS COMPARATIVOS (2026-08-20) ────────────────────────
     A e B usavam --ouro e --amarelo: dois dourados quase iguais, e o título
     do card chegava a dizer "(A azul × B laranja)" sem nada azul nem laranja
     na tela. Cor aqui é IDENTIDADE DE LADO, não mérito — o comparativo não
     declara vencedor (ver _renderComparativoEstados).
     `--comp-*` é o tom CHEIO (barra, chip com texto branco); `--comp-*-texto`
     é o mesmo papel do par --ouro/--ouro-texto: o que pode virar texto sobre
     o card. No escuro os dois clareiam, senão azul-marinho sobre card escuro
     some. */
     SÃO TRÊS TONS POR LADO, e não um, porque a cor faz três trabalhos com
     exigências opostas — no claro os três coincidem, no escuro não:
       --comp-*         preenchimento GRÁFICO (barra, fatia do donut). Precisa
                        se destacar do trilho;
       --comp-*-solido  fundo de chip que carrega TEXTO BRANCO. Precisa ser
                        escuro o bastante para 4,5:1;
       --comp-*-texto   texto sobre o card;
       --comp-*-bg      fundo do pill de diferença. */
  --comp-a:        #1F4E9C;
  --comp-a-solido: #1F4E9C;   /* branco em cima: 7,99:1 */
  --comp-a-texto:  #1F4E9C;   /* 7,99:1 sobre o card branco */
  --comp-a-bg:     #E3EAF6;
  --comp-b:        #B4551D;
  --comp-b-solido: #B4551D;   /* branco em cima: 4,93:1 */
  --comp-b-texto:  #9A4818;   /* o cheio dá 4,42:1 no card; este dá 6,34:1 */
  --comp-b-bg:     #F5E4D8;

  /* Cores de coluna do Kanban — a borda superior de 3px que o desenho usa
     para dar identidade a cada coluna sem pintar o cartão inteiro. */
  --col-novo:      #1A1614;
  --col-contato:   #1D4ED8;
  --col-indicado:  #15803D;
  --col-radar:     #D97706;

  /* Os apelidos --azul* foram APOSENTADOS na TASK-039 (07/08). Eles eram a
     ponte da migracao azul -> terracota (TASK-031) e sobreviveram sem
     consumidor: o grep em src/public/ nao achou nenhum uso fora deste bloco.
     Ponte sem ninguem atravessando e so mais um nome para manter. */

  /* As duas famílias de raio viraram uma (08/08). `--radius`/`--radius-sm`
     conviviam com `--raio*` dizendo quase a mesma coisa — `--radius` e
     `--raio` eram os MESMOS 8px, e `--radius-sm` (6px) só diferia 2px do
     `--raio-sm`. Duas escalas para um eixo é o defeito que a TASK-038 já
     tinha corrigido nas sombras. Ficou a família `--raio*`, que tem a escala
     completa (sm/base/lg/pílula); as 30 ocorrências foram migradas. */
  /* ── SOMBRA: DOIS DEGRAUS, SÓ (TASK-038, item 2) ────────────────────────
     Eram 17 valores distintos de `box-shadow` espalhados pelo arquivo — nove
     deles diferindo entre si por 1px ou por 0,02 de alfa, diferença que
     ninguém enxerga mas que todo mundo precisa manter. Elevação não é um
     eixo contínuo: ou a superfície está APOIADA na página, ou está FLUTUANDO
     acima dela. Dois tokens dizem isso inteiro.

     Os dois valores já existiam no arquivo (o de repouso era `--sombra`, o
     de flutuar era o do `.alerta-flutuante`) — nada foi inventado aqui, o
     que mudou é que agora são os únicos. Quem estava no meio do caminho
     (hover de card, modal, gaveta) foi arredondado para o degrau vizinho.
     Nenhuma sombra literal fora deste bloco: se precisar de uma terceira,
     a pergunta certa é qual dos dois papéis o elemento tem. */
  --sombra-card:       0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.05);
  --sombra-flutuante:  0 4px 12px rgba(0,0,0,.15);

  /* ANÉIS — também são `box-shadow`, mas não são sombra: não simulam altura,
     desenham contorno (foco, seleção, fio de contenção). Ficam separados de
     propósito, senão voltam a virar sombra literal espalhada. */
  --anel-foco:     0 0 0 3px rgba(200,169,110,.22);  /* dourado (TASK-039); opacidade subiu de .12 p/ .22 porque o dourado e mais claro que a terracota e sumia no card */
  --anel-selecao:  0 0 0 2px rgba(200,169,110,.30);  /* idem */
  --anel-fino:     0 0 0 1px var(--borda);

  /* Escala de z-index — fonte única de empilhamento (ver DESIGN_SYSTEM.md §12).
     Camadas em passos de 100, do fundo ao topo. Nunca usar z-index numérico
     ad-hoc: sempre referenciar uma destas variáveis (inclusive em style inline). */
  --z-nav:           100;  /* barra superior fixa (sticky) */
  --z-modal:         200;  /* .modal-overlay genérico */
  --z-drawer:        300;  /* gaveta lateral (perfil de leiloeiro/vara) */
  --z-modal-elevado: 400;  /* modal sobre uma gaveta (#modal-decisao) */
  --z-popover:       500;  /* popover ancorado (sino de notificações) */
  --z-menu-mobile:   600;  /* gaveta do menu no mobile (overlay + sidebar) */
  --z-onboarding:    700;  /* modais de onboarding (primeiro uso / hint de aba) */
  --z-modal-dossie:  800;  /* #kb-modal (Dossiê Inteligente, tela cheia) */
  --z-toast:         900;  /* avisar() — feedback flutuante */
  --z-confirmar:    1000;  /* confirmar() — sempre no topo (bloqueia decisão) */
}

/* ── TIPOGRAFIA (TASK-031, fase 2) ──────────────────────────────────────────
   Pareamento editorial: SERIFA nos títulos, sans no corpo. É o que separa
   "produto" de "template" mais depressa que qualquer cor — e é a metade da
   identidade Tinta que não depende de paleta.

   Sem CDN e sem arquivo de fonte: as duas famílias são pilhas de fontes que
   já existem no sistema. A TASK proíbe CDN externo (escritório com rede
   variável), e baixar um arquivo de fonte licenciada é decisão da Amanda —
   registrado em DESIGN_SYSTEM como o próximo degrau desta fase. */
:root {
  /* TASK-036 (2026-08-05): as três fontes do desenho do Figma. A serifa
     (Iowan Old Style) saiu — era a identidade da TASK-031, e o desenho
     aprovado usa Epilogue nos títulos e números.

     São TRÊS, não quatro: a contagem de elementos na tela do painel do Figma
     deu Inter 365× · JetBrains Mono 152× · Epilogue 14× · Plus Jakarta Sans
     1×. Uma ocorrência única é resíduo do gerador, não decisão de design
     (medido pela Amanda, 05/08) — os números vão para Epilogue. */
  --fonte-titulo: 'Epilogue', 'Segoe UI', Arial, sans-serif;
  --fonte-corpo:  'Inter', 'Segoe UI', Arial, sans-serif;
  --fonte-mono:   'JetBrains Mono', ui-monospace, SFMono-Regular, Consolas, monospace;

  /* ── ESCALA TIPOGRÁFICA (TASK-033, 2026-08-04) ────────────────────────────
     7 degraus no lugar de 27 tamanhos. Medido antes de mexer: das 786
     declarações de `font-size`, **539 (69%) estavam entre 11 e 13px** — não
     havia escala, havia uma poça. Sem contraste de tamanho nenhuma paleta
     resolve, e foi por isso que a troca de tinta da TASK-031 não matou a
     sensação de "genérico".

     REGRA: nada entre degraus. 12px e 12,5px deixam de existir. Componente
     que não usar a escala é bug, não estilo. */
  --txt-xs:  11px;   /* micro-rótulo, metadado */
  --txt-sm:  13px;   /* corpo — o degrau mais usado */
  --txt-md:  15px;   /* corpo em destaque, título de card */
  --txt-lg:  18px;   /* título de seção */
  --txt-xl:  24px;   /* título de tela */
  --txt-2xl: 32px;   /* herói secundário */
  --txt-3xl: 44px;   /* O HERÓI — um por tela, e só um */

  /* ── RAIO (3 degraus + pílula) ───────────────────────────────────────────
     Eram 14 valores distintos em 140 declarações. */
  --raio-sm:  4px;
  --raio:     8px;
  --raio-lg: 12px;
  --raio-pilula: 999px;   /* não é raio, é forma: chip, badge, ponto */

  /* ── RITMO DE ESPAÇO (6 degraus) ─────────────────────────────────────────
     Eram 27 valores em 1.115 declarações, 56% fora de qualquer ritmo. O
     agrupamento por PROXIMIDADE (mesmo assunto junto, grupos separados por
     espaço) é o que substitui borda e caixa. */
  --e-1:  4px;
  --e-2:  8px;
  --e-3: 12px;
  --e-4: 16px;
  --e-5: 24px;
  --e-6: 32px;
}

/* ── MICRO-RÓTULO ────────────────────────────────────────────────────────────
   O componente que dá ar de instrumento em vez de formulário: caixa alta,
   pequeno, espaçado, cor secundária. Um só, reutilizado — antes disso cada
   tela escrevia a sua variação de `font-size: var(--txt-xs);text-transform:uppercase`. */
.rotulo {
  font-size: var(--txt-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--texto-sec);
}
.rotulo--fraco { color: var(--cinza); font-weight: 600; }
/* Rótulo dourado do cabeçalho do onboarding — hoje a única superfície
   invertida com texto dourado. Ver --ouro-inverso no :root. */
.ob-kicker { color: var(--ouro-inverso); }

/* ── HERÓI ───────────────────────────────────────────────────────────────────
   O número que responde à pergunta da tela. UM por tela — a regra que faz a
   hierarquia existir. `tabular-nums` porque herói costuma ser dinheiro ou
   contagem, e dígito desalinhado num tamanho desses salta aos olhos. */
.heroi {
  font-size: var(--txt-3xl);
  font-family: var(--fonte-titulo);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
  color: var(--texto);
}
.heroi-rot { margin-top: var(--e-1); }        /* o micro-rótulo embaixo do herói */
.im-heroi { margin-bottom: var(--e-4); }
/* Herói de Contatos: a resposta da tela é um e-mail, não uma métrica — então
   o topo da escala vai para a BUSCA, que é como se chega até ele. */
.ag-busca-heroi {
  font-size: var(--txt-lg); padding: var(--e-3) var(--e-4);
  border-radius: var(--raio-lg); max-width: 560px;
}

/* Identificador (número de processo, CNPJ, código de convite) em
   monoespaçada: é código, não prosa — e alinha quando repetido em lista. */
.ident {
  font-family: var(--fonte-mono);
  font-size: var(--txt-xs);
  letter-spacing: -.02em;
}

body {
  font-family: var(--fonte-corpo);
  background: var(--bg);
  color: var(--texto);
  font-size: var(--txt-md);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

/* Títulos em serifa. `h1..h3` cobre a maior parte das telas; as classes de
   título que não usam heading estão listadas junto para não sobrar meio
   caminho — foi a migração parcial que a TASK apontou como o pior resultado. */
h1, h2, h3,
.rel-hero-titulo, .not-grupo-t, .kb-card-linha1, .im-card-t,
.saude-veredito-t, .ag-grupo-comarca, .modal-header h3 {
  font-family: var(--fonte-titulo);
  letter-spacing: -.01em;
}

/* DINHEIRO E NÚMERO alinham em coluna: sem tabular-nums, "R$ 1.234" e
   "R$ 987" desencontram os dígitos e a tabela fica torta. */
.kb-card-valor, .im-num, .cvc-txt, .ag-caminho-n,
td, .kb-count, .saude-numeros {
  font-variant-numeric: tabular-nums;
}

/* ── BOTÕES ──────────────────────────────────────────────────────────────────── */
.btn {
  display: inline-flex; align-items: center; gap: var(--e-2);
  padding: 8px 16px; border-radius: var(--raio-sm);
  font-size: var(--txt-sm); font-weight: 500; cursor: pointer;
  border: 1px solid var(--borda); background: var(--bg-card);
  color: var(--texto); text-decoration: none;
  transition: all 0.15s; font-family: inherit; letter-spacing: -.01em;
  box-shadow: var(--sombra-card);
}
.btn:hover { background: var(--cinza-claro); border-color: var(--cinza-mid); }
.btn-primary { background: var(--ouro); color: var(--sobre-ouro); border-color: var(--ouro-texto); box-shadow: var(--sombra-card); }
.btn-primary:hover { background: var(--ouro-escuro); border-color: var(--ouro-texto); }
.btn-sm { padding: 6px 12px; font-size: var(--txt-sm); }
/* --vermelho-escuro, nao --vermelho: sobre --vermelho-claro o tom cheio da
   3,6:1. Mesma logica do par --ouro-clara/--ouro-texto-forte. */
.btn-danger { background: var(--vermelho-claro); color: var(--vermelho-escuro); border-color: var(--vermelho-claro); box-shadow: none; }
.btn-danger:hover { background: var(--vermelho-claro); }
.btn-success { background: var(--verde-claro); color: var(--verde-escuro); border-color: var(--verde-claro); box-shadow: none; }

/* ── FORMULÁRIOS ─────────────────────────────────────────────────────────────── */
input, select, textarea {
  width: 100%; padding: 9px 12px;
  border: 1px solid var(--borda); border-radius: var(--raio-sm);
  font-size: var(--txt-sm); font-family: inherit; background: var(--bg-card);
  color: var(--texto); transition: border-color 0.15s, box-shadow 0.15s;
  box-shadow: var(--sombra-card);
}
input:focus, select:focus, textarea:focus {
  outline: none; border-color: var(--ouro-texto);
  box-shadow: var(--anel-foco);
}
textarea { resize: vertical; min-height: 80px; }
label { display: block; font-size: var(--txt-sm); color: var(--texto-sec); margin-bottom: var(--e-2); font-weight: 500; letter-spacing: .01em; }
.form-row { margin-bottom: var(--e-4); }
.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--e-3); }

/* ── CARDS ───────────────────────────────────────────────────────────────────── */
.card {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: var(--e-5);
  box-shadow: var(--sombra-card);
}

/* ── BADGES ──────────────────────────────────────────────────────────────────── */
.badge {
  display: inline-flex; align-items: center; gap: var(--e-1);
  padding: 3px 10px; border-radius: var(--raio-lg);
  font-size: var(--txt-xs); font-weight: 600; letter-spacing: .02em;
}
.badge-apta     { background: var(--verde-claro);   color: var(--verde-escuro); }
.badge-possivel { background: var(--amarelo-claro);  color: var(--amarelo-escuro); }
.badge-negativo { background: var(--amarelo-claro); color: var(--amarelo-escuro); font-weight: 700; }
.badge-aguardando { background: var(--ouro-clara);   color: var(--ouro-texto-forte); }

.proc-card.negativo {
  border-left: 4px solid var(--amarelo);
  background: linear-gradient(to right, var(--amarelo-claro) 0%, var(--bg-card) 60%);
}
.badge-nomeado  { background: var(--verde-claro);   color: var(--verde-escuro); }
.badge-perdido  { background: var(--vermelho-claro); color: var(--vermelho); }
.badge-expirado { background: var(--cinza-claro);   color: var(--cinza); }

/* ── ALERTA ──────────────────────────────────────────────────────────────────── */
.alerta { padding: 10px 14px; border-radius: var(--raio-sm); font-size: var(--txt-sm); margin-bottom: var(--e-3); display: none; font-weight: 500; }
.alerta.erro { background: var(--vermelho-claro); color: var(--vermelho); border: 1px solid var(--vermelho-claro); }
.alerta.ok   { background: var(--verde-claro); color: var(--verde-escuro); border: 1px solid var(--verde-claro); }
.alerta.visivel { display: block; }
.alerta.aviso { background: var(--amarelo-claro); color: var(--amarelo-escuro); border: 1px solid var(--amarelo-claro); }
/* Avisos flutuantes (helper avisar() em aviso.js) — z-index acima do #kb-modal (9999) */
#avisos-flutuantes { position: fixed; top: 16px; left: 50%; transform: translateX(-50%); z-index: var(--z-toast); display: flex; flex-direction: column; align-items: center; gap: var(--e-2); max-width: min(520px, 90vw); }
.alerta-flutuante { margin-bottom: 0; box-shadow: var(--sombra-flutuante); cursor: pointer; animation: alertaEntra .25s ease; }
.alerta-flutuante.saindo { opacity: 0; transition: opacity .3s ease; }
/* Botão de ação dentro do aviso (o "desfazer" do × do Kanban, 2026-08-03).
   Herda a cor do próprio alerta em vez de trazer a sua: o desfazer pertence à
   mensagem, não compete com ela. */
.alerta-acao {
  margin-left: var(--e-3); padding: 2px 10px; border-radius: var(--raio-pilula);
  border: 1px solid currentColor; background: transparent; color: inherit;
  font: inherit; font-size: var(--txt-sm); font-weight: 700; cursor: pointer;
}
.alerta-acao:hover { background: rgba(0,0,0,.06); }
@keyframes alertaEntra { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } }

/* ── NAV ─────────────────────────────────────────────────────────────────────── */
/* Faixa branca fina do desenho (TASK-036): título da tela à esquerda,
   utilitários à direita. A identidade (marca + usuário) mudou-se para a
   sidebar — a faixa é contexto, não marca. */
.nav {
  background: var(--bg-card); border-bottom: 1px solid var(--borda);
  padding: 0 24px; height: 44px;
  display: flex; align-items: center; justify-content: space-between;
  position: sticky; top: 0; z-index: var(--z-nav);
}
.nav-titulo {
  font-family: var(--fonte-titulo); font-size: var(--txt-md); font-weight: 700;
  color: var(--tinta); letter-spacing: -.01em;
}
/* Marca dentro da sidebar, como no desenho. */
.sb-marca { padding: 14px 18px 10px; border-bottom: 1px solid var(--sidebar-borda); margin-bottom: var(--e-2); }
.sb-marca-logo {
  display: flex; align-items: center; gap: 10px;
  font-family: var(--fonte-titulo); font-size: 18px; font-weight: 700;
  letter-spacing: -.02em; color: var(--sidebar-texto); text-decoration: none;
}
/* ── Bloco do usuário na sidebar (handoff "Auditoria de Design", 10/08) ──────
   Medidas do protótipo: avatar 32px redondo, nome 13px/600, sub 11.5px.
   O `min-width:0` no bloco de texto não é decorativo: sem ele o flex recusa
   encolher e o nome longo empurra o avatar para fora da sidebar em vez de
   ganhar reticências — foi o que "Thais Silva Moreira de Sousa" mostrou. */
.sb-user {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 18px; border-bottom: 1px solid var(--sidebar-borda);
  margin-bottom: var(--e-2);
}
.sb-user-av {
  width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--verde); color: var(--sobre-verde);
  font-size: 13px; font-weight: 600; letter-spacing: .01em;
}
.sb-user-txt { min-width: 0; }
.sb-user-nome {
  font-size: 13px; font-weight: 600; color: var(--sidebar-texto);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sb-user-sub {
  font-size: 11.5px; color: var(--sidebar-secao);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nav-logo span { color: var(--ouro-texto); }
.nav-right { display: flex; align-items: center; gap: var(--e-3); }
.nav-right span { color: var(--cinza); font-size: var(--txt-sm); }
.nav-right .btn { background: transparent; border-color: var(--borda); color: var(--texto-sec); box-shadow: none; font-size: var(--txt-sm); }
.nav-right .btn:hover { background: rgba(26,22,20,.04); color: var(--texto); }

/* ── LAYOUT PAINEL ───────────────────────────────────────────────────────────── */
.painel-layout { display: flex; min-height: calc(100vh - 56px); }

.sidebar {
  width: var(--sidebar-largura); background: var(--sidebar-bg);
  padding: 16px 0; flex-shrink: 0;
  /* Sidebar clara precisa de fio: sem a borda ela e o conteúdo branco viram
     uma superfície só, e a navegação perde o lugar. */
  border-right: 1px solid var(--sidebar-borda);
}
/* Menu lateral — refinamento estilo Linear/Notion (2026-07-09): mais
   respiro entre grupos e títulos de seção mais leves.
   A coluna de ícones (`.sb-ico`) SAIU em 10/08. Ela existia para alinhar
   rótulos apesar das larguras irregulares dos emojis; quando os emojis foram
   removidos, sobraram 24 spans vazios reservando 20px cada — um recuo
   fantasma sem nada dentro. O protótipo do handoff mostra o item de menu
   como rótulo puro, então o recuo foi embora com eles.
   (O README do pacote pedia o contrário — preencher os 24 com SVG. Vale o
   `.dc.html`, por decisão da Amanda em 09/08.) */
/* Micro-rótulo de seção: mono 9px com letter-spacing largo, como no desenho.
   É a menor tipografia do produto e a que mais organiza a navegação. */
/* Micro-rótulo em JetBrains Mono: 10px, peso 500, letter-spacing .08em —
   a régua de micro-rótulo da Ponte visual (08/08). */
.sb-section {
  padding: 24px 18px 6px;
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 500;
  color: var(--sidebar-secao); text-transform: uppercase; letter-spacing: .08em;
}
.sb-section:first-child { padding-top: var(--e-2); }

/* Menu enxuto (2026-07-10): seções recolhíveis — o título vira botão, com
   chevron indicando o estado; itens recolhidos somem via classe própria
   (nunca inline display, para não atropelar Curadoria/Equipe/Chat que já
   têm regras de visibilidade próprias). */
.sb-section { cursor: pointer; user-select: none; display: flex; align-items: center; gap: var(--e-2); }
.sb-section::before { content: '▾'; font-size: var(--txt-xs); opacity: .65; transition: transform .15s; }
.sb-section.recolhida::before { transform: rotate(-90deg); }
.sb-section:hover { color: var(--sidebar-texto); }
.sb-item.sb-oculto { display: none; }
.sb-item.sb-solo-oculto { display: none; }
.sb-item {
  display: flex; align-items: center; gap: var(--e-3);
  padding: 8px 16px; font-size: 12px; cursor: pointer;
  color: var(--sidebar-texto); text-decoration: none;
  position: relative; font-weight: 500;
  transition: color 0.12s, background 0.12s;
  margin: 1px 8px; border-radius: var(--raio);
}
/* Ícones SVG de traço (TASK-031, fase 3). `currentColor` no traço faz o ícone
   herdar a cor do item — ativo, hover e desabilitado funcionam sem variante. */
.ico { width: 17px; height: 17px; display: block; }
/* Ícone DENTRO de uma frase (TASK-038, item 3): "✉ contato", "· e-mail@vara".
   O `.ico` de menu é `display:block` e quebraria a linha; aqui ele anda junto
   com o texto e senta na linha de base. Mesmo traço, mesma cor herdada. */
.ico--inline { display: inline-block; width: 15px; height: 15px; vertical-align: -.18em; }
/* Ponto de status: a cor É a informação (era o que 🔴🟢🟡 carregavam). */
.ponto-status {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  flex-shrink: 0; vertical-align: middle; margin-right: var(--e-2);
}
.btn .ico, .kb-card-btn .ico { width: 15px; height: 15px; margin-right: -1px; }
/* Saída de emergência no rodapé do menu (TASK-036): separada dos grupos,
   porque não é área do produto — é para quem travou. */
.sb-item--rodape { margin-top: var(--e-4); opacity: .75; }
.sb-item--rodape:hover { opacity: 1; }
/* PLANO DA CONTA (TASK-055 fatia 2): uma linha, no fim do menu, só para a
   conta Inteligência. Decisão da Amanda: nada de cadeado em cima dos itens
   que ela não tem — o que não é do plano some, e sobra esta menção discreta.
   `--sidebar-bg` é escuro nos DOIS temas, então a cor é a mesma nos dois e
   não precisa de bloco no `[data-tema="escuro"]`. O dourado aqui é
   `--ouro` (o de FUNDO e de texto sobre escuro), não `--ouro-texto`, que é
   para card claro e daria 1,7:1 aqui. */
.sb-plano {
  margin: var(--e-3) 8px var(--e-4);
  padding: 8px 16px;
  border-top: 1px solid rgba(240,237,232,.10);
  font-family: var(--fonte-mono); font-size: 10.5px; line-height: 1.5;
  color: rgba(240,237,232,.72);
  display: flex; flex-wrap: wrap; gap: 0 5px;
}
.sb-plano-sep { opacity: .5; }
.sb-plano-conhecer { color: var(--ouro); }
/* Item e seção que não são do plano somem — classe própria, nunca inline
   display, pelo mesmo motivo de `sb-oculto`: aqui há três regras de
   visibilidade empilhadas (admin, solo, plano) e a última a escrever venceria
   as outras se todas usassem style. */
.sb-item.sb-fora-do-plano,
.sb-section.sb-fora-do-plano { display: none; }
/* Hover e ativo em cima da sidebar CLARA: escurecer levemente em vez de
   clarear, que era o gesto da versão grafite. */
.sb-item:hover { background: var(--sidebar-hover); color: var(--sidebar-texto); }
/* Ativo do desenho: dourado sobre um véu do próprio dourado. A barrinha
   vertical à esquerda saiu — o desenho marca o ativo só por cor e fundo, e
   com a sidebar clara a barra virava um segundo acento competindo. */
.sb-item.ativo { background: var(--sidebar-ativo-bg); color: var(--sidebar-ativo-texto); font-weight: 600; }
.sb-item.ativo:hover { background: var(--sidebar-ativo-bg); color: var(--sidebar-ativo-texto); }
/* Contador: mono 9px, dourado sólido com tinta por cima, raio pequeno. */
.sb-badge {
  margin-left: auto; background: var(--ouro); color: #080808;
  font-family: var(--fonte-mono); font-size: 9px; font-weight: 500;
  padding: 2px 6px; border-radius: 3px;
}

.painel-main { flex: 1; padding: 28px 32px; overflow-y: auto; min-width: 0; }

/* ── STATS GRID ──────────────────────────────────────────────────────────────── */
.stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: var(--e-3); margin-bottom: var(--e-5); }
.stat {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 16px 18px;
  box-shadow: var(--sombra-card);
}
.stat-label { font-size: var(--txt-xs); color: var(--texto-sec); margin-bottom: var(--e-2); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
.stat-val { font-size: var(--txt-xl); font-weight: 800; letter-spacing: -.5px; }

/* ── RELATÓRIO: CARD HERÓI ──────────────────────────────────────────────────── */
/* O bloco do herói (TASK-033). A CAIXA ficou mais discreta de propósito: com
   o número em 44px, o fundo tintado e a borda viravam ruído em volta do que
   já grita sozinho. Menos superfície, mais contraste — é a troca da TASK. */
.rel-hero {
  position: relative; background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio-lg); padding: var(--e-5) var(--e-5) var(--e-4);
  margin-bottom: var(--e-4);
}
/* Âncora escura da tela (05/08, "está tudo muito bege"): o card do dia em
   TINTA sólida — um elemento escuro por tela, nunca mais. É o mesmo gesto do
   card "MUITO ALTO" da Inteligência no desenho do Figma: com um polo escuro,
   todo o resto parece claro por comparação, sem escurecer o produto.
   Vale SÓ para o herói do dia; os estados menores (carregando/erro)
   continuam claros — âncora repetida deixa de ancorar. */
/* A SUPERFÍCIE INVERTIDA VIRA COM O TEMA — E O CONTEÚDO DELA TEM DE VIRAR
   JUNTO (corrigido em 10/08, Bloco 2 da blindagem).
   `--inverso-bg` já virava (#1A1614 no claro → #F2EDE6 no escuro), mas o que
   vive em cima estava cravado em branco e no dourado que não vira: no tema
   escuro o herói era texto branco sobre fundo quase branco — 1,13:1.
   Agora tudo aqui deriva de `--inverso-texto`, que vira junto: o `color-mix`
   com `transparent` reproduz o mesmo esmaecimento das opacidades antigas,
   só que na cor certa de cada tema. */
.rel-hero--tinta { background: var(--inverso-bg); border-color: var(--inverso-bg); }
.rel-hero--tinta .heroi { color: var(--inverso-texto); }
.rel-hero--tinta .heroi-rot { color: var(--ouro-inverso); }
.rel-hero--tinta .rel-hero-msg { color: color-mix(in srgb, var(--inverso-texto) 78%, transparent); }
.rel-hero--tinta .kb-hero-negocio { color: color-mix(in srgb, var(--inverso-texto) 70%, transparent); }
.rel-hero--tinta .kb-hero-negocio strong { color: var(--inverso-texto); }
.rel-hero--tinta .kb-hero-rodape {
  color: color-mix(in srgb, var(--inverso-texto) 62%, transparent);
  border-top-color: color-mix(in srgb, var(--inverso-texto) 14%, transparent);
}
/* O botão do desenho é DOURADO sobre o escuro (como na landing) — a terracota
   sumiria contra a tinta. */
.rel-hero--tinta .btn-primary { background: var(--ouro); border-color: var(--ouro); color: #080808; box-shadow: none; }
.rel-hero--tinta .btn-primary:hover { background: #D6BA85; border-color: #D6BA85; }
.rel-hero--tinta .btn:not(.btn-primary) { background: rgba(127,127,127,.14); border-color: rgba(127,127,127,.30); color: var(--inverso-texto); }
.rel-hero-hora { position: absolute; top: var(--e-4); right: var(--e-5); font-size: var(--txt-xs); color: var(--texto-sec); }
.rel-hero-titulo { font-size: var(--txt-lg); font-weight: 800; letter-spacing: -.01em; color: var(--texto); margin-bottom: var(--e-1); }
.rel-hero-msg { font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5; margin: var(--e-3) 0 var(--e-4); max-width: 560px; }
.rel-hero-cta { font-size: var(--txt-sm); }

.rel-apoio {
  display: flex; flex-wrap: wrap; gap: 4px 18px; margin-bottom: var(--e-5);
  font-size: var(--txt-sm); color: var(--texto-sec);
}

/* ── HOME (dashboard executivo do dia) ──────────────────────────────────────── */
/* Topo "Mercado" — deliberadamente discreto (2026-07-07): a usuária deve
   olhar primeiro pro Hero pessoal, não pros números nacionais. Números em
   estilo `.mapa-kpi` (já existente na Inteligência de Mercado) — número
   grande primeiro, rótulo pequeno depois: o cérebro bate no número antes
   (pedido da Amanda, revisão de 2026-07-07). */

/* ── PROCESSO CARD ───────────────────────────────────────────────────────────── */
.proc-card {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 16px 18px;
  margin-bottom: var(--e-3); border-left: 4px solid var(--borda);
  box-shadow: var(--sombra-card); transition: box-shadow 0.15s;
}
.proc-card:hover { box-shadow: var(--sombra-flutuante); }
.proc-card.apta      { border-left-color: var(--verde); }
.proc-card.possivel  { border-left-color: var(--amarelo); }
.proc-card.aguardando{ border-left-color: var(--ouro-texto); }
.proc-card.nomeado   { border-left-color: var(--verde); }
.proc-card.perdido   { border-left-color: var(--vermelho); }
.proc-card.expirado  { border-left-color: var(--cinza); }
.proc-top { display: flex; align-items: center; gap: var(--e-2); flex-wrap: wrap; margin-bottom: var(--e-2); }
.proc-num {
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  background: var(--cinza-claro); padding: 2px 8px;
  border-radius: var(--raio-sm); letter-spacing: .02em; color: var(--texto-sec);
}
.proc-trib { font-size: var(--txt-xs); font-weight: 700; color: var(--cinza); text-transform: uppercase; letter-spacing: .06em; }
.proc-meta { font-size: var(--txt-sm); color: var(--texto-sec); margin-bottom: var(--e-2); }
.proc-trecho { font-size: var(--txt-sm); line-height: 1.6; color: var(--texto); }
.proc-trecho mark { background: var(--amarelo-claro); padding: 0 2px; border-radius: var(--raio-sm); }
.proc-acoes {
  display: flex; gap: var(--e-4); align-items: center; flex-wrap: wrap;
  margin-top: var(--e-3); padding-top: var(--e-3); border-top: 1px solid var(--cinza-claro);
}
.proc-acoes a { font-size: var(--txt-sm); color: var(--ouro-texto); cursor: pointer; font-weight: 600; text-decoration: none; transition: color 0.1s; }
.proc-acoes a:hover { color: var(--ouro-texto); text-decoration: underline; }
.proc-motivo { font-size: var(--txt-xs); color: var(--texto-sec); }

.urgente-tag {
  font-size: var(--txt-xs); background: var(--vermelho-claro); color: var(--vermelho);
  padding: 2px 8px; border-radius: var(--raio-lg); font-weight: 700;
}

/* ── PRAZO BAR ───────────────────────────────────────────────────────────────── */
.prazo-bar { height: 4px; background: var(--cinza-claro); border-radius: var(--raio-sm); margin-top: var(--e-1); overflow: hidden; }
.prazo-fill { height: 4px; border-radius: var(--raio-sm); background: var(--ouro); transition: width 0.3s; }
.prazo-fill.urgente { background: var(--vermelho); }
.prazo-fill.ok      { background: var(--verde); }

/* ── FILTROS ─────────────────────────────────────────────────────────────────── */
.filtros { display: flex; gap: var(--e-2); flex-wrap: wrap; margin-bottom: var(--e-4); }
.filtro {
  padding: 5px 14px; border-radius: var(--raio-lg); font-size: var(--txt-sm);
  border: 1px solid var(--borda); cursor: pointer;
  background: var(--bg-card); color: var(--texto-sec);
  font-weight: 500; transition: all 0.12s; box-shadow: var(--sombra-card);
}
.filtro:hover { border-color: var(--ouro); color: var(--ouro-texto); }
.filtro.ativo { background: var(--ouro); color: var(--sobre-ouro); border-color: var(--ouro-texto); box-shadow: var(--sombra-card); }

/* ── INTELIGÊNCIA DE MERCADO (componentes premium padronizados) ──────────────── */
.mapa-kpis {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: var(--e-3); margin-bottom: var(--e-5);
}
.mapa-kpi {
  background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio);
  padding: 16px 18px; box-shadow: var(--sombra-card); transition: box-shadow .15s, transform .15s;
}
.mapa-kpi:hover { box-shadow: var(--sombra-flutuante); transform: translateY(-1px); }
.mapa-kpi .v { font-size: var(--txt-xl); font-weight: 800; letter-spacing: -.5px; line-height: 1; color: var(--texto); }
.mapa-kpi .l { font-size: var(--txt-xs); color: var(--texto-sec); text-transform: uppercase; letter-spacing: .6px; margin-top: var(--e-2); }

/* Comparador de Estados (2026-07-11) — lado a lado, sem coroar vencedor. */
.cmp-head { display: flex; align-items: center; justify-content: center; gap: var(--e-4); margin: 4px 0 14px; font-size: var(--txt-lg); font-weight: 800; }
.cmp-vs { color: var(--texto-sec); font-weight: 700; }
.cmp-row { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: var(--e-3); padding: 9px 0; border-bottom: 1px solid var(--borda); }
.cmp-row:last-child { border-bottom: 0; }
.cmp-val { font-size: var(--txt-md); font-variant-numeric: tabular-nums; font-weight: 600; }
.cmp-a { text-align: right; }
.cmp-b { text-align: left; }
.cmp-forte { font-weight: 800; font-size: var(--txt-lg); }
.cmp-rot { font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .03em; color: var(--texto-sec); text-align: center; cursor: help; min-width: 116px; }
.cmp-resumo { margin-top: var(--e-4); padding: 14px 16px; background: var(--cinza-claro, var(--bg)); border-radius: var(--raio); border-left: 3px solid var(--ouro); }
.cmp-resumo-t { font-size: var(--txt-sm); font-weight: 800; text-transform: uppercase; letter-spacing: .03em; margin-bottom: var(--e-2); }
.cmp-resumo-t span { font-weight: 600; color: var(--texto-sec); text-transform: none; letter-spacing: 0; }

/* ── IDENTIDADE DE LADO A/B (2026-08-20) ───────────────────────────────────
   Cor é identidade de LADO, não de mérito: o comparativo continua sem
   declarar vencedor. Antes A e B eram --ouro e --amarelo, dois dourados
   quase iguais — ler qual coluna era qual dependia da posição, não da cor. */
.comp-legenda { display: flex; gap: var(--e-2); flex-wrap: wrap; align-items: center; margin-bottom: var(--e-4); }
/* `flex-wrap` na linha + `nowrap` no chip: nome longo ("Zuk Leilões (Dora
   Plat e Mauro Zukerman)") quebra por chip inteiro, nunca no meio do pill. */
.comp-chip {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--txt-sm); font-weight: 700; color: #fff;
  padding: 5px 13px; border-radius: 999px; white-space: nowrap;
}
.comp-chip--a { background: var(--comp-a-solido); }
.comp-chip--b { background: var(--comp-b-solido); }
.comp-legenda-nota { font-size: var(--txt-xs); color: var(--texto-sec); }

/* Quadradinho "A"/"B" antes da barra: diz o lado sem depender de o olho
   lembrar qual linha é qual. */
.comp-tag {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; flex-shrink: 0; border-radius: 3px;
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 700; color: #fff;
}
.comp-tag--a { background: var(--comp-a-solido); }
.comp-tag--b { background: var(--comp-b-solido); }

.comp-linha { margin: 12px 0; }
.comp-linha-t { display: flex; justify-content: space-between; align-items: center; font-size: var(--txt-sm); margin-bottom: var(--e-2); }
.comp-linha-rot { font-weight: 600; }
.comp-barra-linha { display: flex; align-items: center; gap: var(--e-2); margin-top: var(--e-1); }
.comp-valor { font-family: var(--fonte-mono); font-weight: 700; font-size: var(--txt-sm); min-width: 54px; text-align: right; font-variant-numeric: tabular-nums; }
.comp-valor--a { color: var(--comp-a-texto); }
.comp-valor--b { color: var(--comp-b-texto); }

/* Diferença: pill, não texto solto. É o número que responde a pergunta da
   tela, e como texto colorido tinha o mesmo peso do rótulo ao lado. */
.comp-delta {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 700;
  padding: 2px 9px; border-radius: 999px; white-space: nowrap; font-variant-numeric: tabular-nums;
}
.comp-delta--a { color: var(--comp-a-texto); background: var(--comp-a-bg); }
.comp-delta--b { color: var(--comp-b-texto); background: var(--comp-b-bg); }
.comp-delta--zero { color: var(--texto-sec); background: var(--cinza-claro); }

/* Crescimento vira mini-card com a borda superior do lado — mesmo recurso
   que as colunas do Kanban usam para dar identidade sem pintar a caixa. */
.comp-cresc {
  flex: 1 1 150px; min-width: 150px;
  border: 1px solid var(--borda); border-top: 3px solid var(--cinza);
  border-radius: 8px; padding: 12px 14px; background: var(--bg-card);
}
.comp-cresc--a { border-top-color: var(--comp-a); }
.comp-cresc--b { border-top-color: var(--comp-b); }
.comp-cresc-n { font-weight: 700; font-size: var(--txt-sm); }
.comp-cresc--a .comp-cresc-n { color: var(--comp-a-texto); }
.comp-cresc--b .comp-cresc-n { color: var(--comp-b-texto); }
.comp-kicker {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texto-sec);
  margin: 18px 0 8px;
}

/* Select do lado: fio de 3px na cor, para o controle e a coluna serem
   reconhecidos como a mesma coisa. */
.comp-campo-a .im-select { border-left: 3px solid var(--comp-a); }
.comp-campo-b .im-select { border-left: 3px solid var(--comp-b); }
.comp-campo-a > label { color: var(--comp-a-texto); font-weight: 700; }
.comp-campo-b > label { color: var(--comp-b-texto); font-weight: 700; }

/* Estado × Estado: vencedor da linha cheio, perdedor recuado — a hierarquia
   é de LEITURA (qual número é maior), não de mérito. */
.cmp-val--a { color: var(--comp-a-texto); }
.cmp-val--b { color: var(--comp-b-texto); }
/* 18px (--txt-lg) contra 15px (--txt-md, o tamanho base da linha). O handoff
   pedia 17 × 14; usei os degraus da escala tipográfica em vez de dois valores
   soltos — a diferença de leitura é a mesma e não cria tamanho órfão. */
.cmp-fraco { opacity: .75; }
.cmp-qual { font-weight: 400; }
/* Barras espelhadas: cabo-de-guerra a partir do rótulo central. */
.cmp-trilho { background: var(--cinza-mid); border-radius: 4px; height: 7px; max-width: 220px; overflow: hidden; margin-top: 5px; display: flex; }
.cmp-trilho--a { margin-left: auto; justify-content: flex-end; }
.cmp-trilho--b { margin-right: auto; justify-content: flex-start; }
.cmp-trilho > span { display: block; height: 100%; border-radius: 4px; transition: width .45s cubic-bezier(.22,.61,.36,1); }
.cmp-trilho--a > span { background: var(--comp-a); }
.cmp-trilho--b > span { background: var(--comp-b); }
/* Mapa estratégico (2026-07-11) — classe por cor + resumo executivo no hover. */
.geo-legenda { display: flex; flex-wrap: wrap; gap: 10px 14px; margin-top: var(--e-2); font-size: var(--txt-xs); color: var(--texto-sec); }
.geo-legenda span { display: inline-flex; align-items: center; gap: var(--e-2); }
.geo-dot { width: 12px; height: 12px; border-radius: var(--raio-sm); display: inline-block; }
.geo-resumo { min-height: 80px; padding: 14px 16px; background: var(--cinza-claro, var(--bg)); border-radius: var(--raio); }
.geo-classe { display: inline-block; font-size: var(--txt-sm); font-weight: 800; margin: 6px 0 10px; padding: 3px 10px; border-radius: var(--raio-lg); }
.geo-classe--entrada { background: var(--verde-claro); color: var(--verde); }
.geo-classe--competitivo { background: var(--amarelo-claro); color: var(--amarelo-escuro); }
.geo-classe--dominado { background: var(--vermelho-claro); color: var(--vermelho); }
.geo-classe--sem-dados { background: var(--bg); color: var(--texto-sec); }
.geo-ind { list-style: none; margin: 0 0 12px; padding: 0; }
.geo-ind li { font-size: var(--txt-sm); padding: 3px 0 3px 16px; position: relative; }
.geo-ind li::before { content: '•'; position: absolute; left: 2px; color: var(--texto-sec); }
.geo-carac { font-size: var(--txt-sm); line-height: 1.55; border-top: 1px solid var(--borda); padding-top: var(--e-3); }
.geo-carac span { display: block; font-size: var(--txt-xs); font-weight: 800; text-transform: uppercase; letter-spacing: .04em; color: var(--texto-sec); margin-bottom: var(--e-1); }
/* Prioridade do dia (2026-07-11) — Painel de Hoje orientado à ação. */
.prio-bloco { background: var(--bg-card); border: 1px solid var(--borda); border-left: 3px solid var(--ouro); border-radius: var(--raio); padding: 14px 16px; margin-bottom: var(--e-3); box-shadow: var(--sombra-card); }
.prio-bloco.prio-aviso { border-left-color: var(--amarelo); }
.prio-bloco.prio-ok { border-left-color: var(--verde); }
.prio-tit { font-size: var(--txt-sm); font-weight: 800; text-transform: uppercase; letter-spacing: .04em; margin-bottom: var(--e-2); }
.prio-bloco.prio-magico { border-left-color: var(--verde); background: linear-gradient(135deg, var(--verde-claro, var(--verde-claro)), var(--bg-card)); position: relative; }
.prio-magico-x { position: absolute; top: 8px; right: 10px; background: none; border: none; font-size: var(--txt-lg); line-height: 1; cursor: pointer; color: var(--texto-sec); }
.prio-magico-x:hover { color: var(--texto); }
/* Funil de prospecção (2026-07-11, Ciclo 6) — métricas de conversão honestas. */
.funil { background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio); padding: 12px 16px; margin-bottom: var(--e-4); box-shadow: var(--sombra-card); }
.funil-tit { font-size: var(--txt-sm); font-weight: 800; text-transform: uppercase; letter-spacing: .04em; color: var(--texto-sec); margin-bottom: var(--e-2); }
.funil-etapas { display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap; }
.funil-etapa { text-align: center; min-width: 76px; }
.funil-n { font-size: var(--txt-xl); font-weight: 800; letter-spacing: -.5px; line-height: 1; }
.funil-l { font-size: var(--txt-xs); color: var(--texto-sec); text-transform: uppercase; letter-spacing: .03em; margin-top: var(--e-1); }
.funil-pct { font-size: var(--txt-xs); font-weight: 700; color: var(--verde); margin-top: var(--e-1); }
.funil-seta { color: var(--texto-sec); font-size: var(--txt-lg); }
.funil-nota { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: var(--e-2); line-height: 1.4; }
/* CRM de Oportunidades (2026-07-11) — board por próxima ação, separado do Kanban. */
/* ── OPORTUNIDADES v2 (10/08) ────────────────────────────────────────────────
   Board por próxima ação. Duas mudanças estruturais em relação à v1:

   1. GRID DE 4, NÃO ROLAGEM HORIZONTAL. Era `flex` com colunas de 250px fixos
      e `overflow-x:auto` — em tela menor a quarta coluna saía da vista, e
      "Aguardando decisão" desaparecia justamente de quem tem funil cheio.
      Agora `repeat(4, minmax(0,1fr))`: as quatro cabem sempre, e o `minmax`
      com mínimo 0 é o que permite encolher (com `1fr` puro o conteúdo
      empurraria a coluna e a rolagem voltaria pela porta dos fundos).
   2. COLUNA É SUPERFÍCIE CALMA. Fundo quase-branco e cartão branco por cima:
      o cartão sobe da coluna, e a coluna sobe da mesa. Só "Fazer hoje" tem
      cor — borda superior vermelha e contador vermelho. Se toda coluna
      gritasse, nenhuma gritaria. */
/* ── LAUDOS DE AVALIAÇÃO — QUADRO POR IDADE (10/08) ─────────────────────────
   Reusa as colunas do quadro de prospecção (`.oport-col*`): mesma superfície
   calma, mesmo cabeçalho, mesmo contador tingido. Duas telas que fazem a
   mesma pergunta ("em que degrau está isto?") não podem ter dois desenhos de
   coluna diferentes — e um terceiro conjunto de classes seria manutenção
   duplicada sem nada em troca.

   A coluna cresce com rolagem própria: são 238 cards na maior, e sem teto a
   página inteira viraria uma coluna de 4 metros. */
.lau-topo { display: flex; align-items: baseline; gap: var(--e-2); margin-bottom: var(--e-3); flex-wrap: wrap; }
.lau-n { font-family: var(--fonte-titulo); font-size: 30px; font-weight: 600; color: var(--tinta); line-height: 1; font-variant-numeric: tabular-nums; }
.lau-n-l { font-size: var(--txt-sm); color: var(--texto-sec); }
/* Recorte escrito da tela de laudos (25/08) — BUSINESS_RULES 6.2: a lista diz
   quais estados cobre, quantos em cada um e de que período. Sem isto, uma
   lista recortada por estado parece a lista completa. */
.lau-escopo { display: flex; align-items: center; gap: var(--e-2); flex-wrap: wrap;
  font-size: var(--txt-xs); color: var(--texto-sec); margin: 0 0 var(--e-3);
  padding: 8px 10px; border: 1px solid var(--borda); border-radius: var(--raio);
  background: var(--fundo-sec, var(--bg)); line-height: 1.5; }
.lau-escopo-t { font-weight: 700; color: var(--tinta); }
.lau-chip { display: inline-flex; align-items: baseline; gap: 4px; padding: 2px 7px;
  border: 1px solid var(--borda); border-radius: 999px; background: var(--bg-card);
  font-variant-numeric: tabular-nums; }
.lau-chip strong { color: var(--tinta); }
/* Chip que FILTRA (26/08). A Amanda pediu para ver os laudos separados por
   tribunal — os números por estado já estavam no cabeçalho, só não faziam
   nada. Filtro e não coluna: a coluna é o estado do trabalho e é ela que
   recebe o arrastar. */
.lau-chip--btn {
  font-family: inherit; font-size: var(--txt-xs); cursor: pointer;
  /* `color` EXPLÍCITO, e não herdado: o chip virou <button> em 26/08 e o
     navegador aplica a cor de sistema `buttontext` quando o autor não define
     nenhuma. Medido: no tema escuro o chip inativo caiu para 1,43:1 — texto
     escuro sobre fundo escuro. O <span> anterior herdava de .lau-escopo e por
     isso o problema não existia. */
  color: var(--texto-sec);
  transition: background .12s, border-color .12s, color .12s;
}
.lau-chip--btn:hover { border-color: var(--ouro); color: var(--ouro-texto-forte); }
.lau-chip--on {
  background: var(--ouro-clara); border-color: var(--ouro); color: var(--ouro-texto-forte);
}
.lau-chip--on strong { color: var(--ouro-texto-forte); }
.lau-escopo-vazio, .lau-escopo-fora { flex-basis: 100%; color: var(--texto-sec); }

/* O quadro dos laudos usa as classes do KANBAN (26/08): .kb-board-cap,
   .kb-coluna, .kb-col-header, .kb-count, .kb-col-sub, .kb-col-body,
   .kb-col-vazia, .kb-card, .kb-card-linha1, .kb-card-titulo, .kb-trib,
   .kb-card-processo, .kb-card-meta, .kb-card-valor e .kb-card-btn.
   Pedido da Amanda: "mesma linguagem visual, mesmos componentes de card e
   coluna (reusar, nao copiar/colar CSS)". Saiu daqui, por ser duplicata:
   .lau-board, .lau-col, .lau-card, .lau-l-topo, .lau-proc, .lau-l-vara,
   .lau-valor, .lau-l-motivo e .lau-acao. Ficaram so as duas regras abaixo,
   do trecho da decisao, que o card do Kanban nao tem — nao havia o que
   reusar, e inventar e diferente de duplicar. */
.lau-trecho {
  font-size: 11.5px; color: var(--texto-sec); line-height: 1.45; margin-top: 6px;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden;
}
/* Card sem trecho: a frase é de ausência, não de conteúdo — itálico e mais
   apagada, para não competir com os cards que têm decisão de verdade. */
.lau-trecho--vazio { font-style: italic; color: var(--neutro-menu); }
.lau-ver {
  display: inline-block; margin-top: 6px; font-size: 11.5px; font-weight: 600;
  color: var(--ouro-texto-forte); cursor: pointer;
}
.lau-ver:hover { text-decoration: underline; }

/* Gaveta do funil: mesma pílula do arquivo, no fim da tela. */
.oport-funil { margin-top: var(--e-5); }
.oport-funil > .oport-arq-pill { margin-bottom: var(--e-3); }

/* As quebras responsivas do quadro dos laudos saíram em 26/08: agora quem
   manda são as do .kb-board-cap (2 colunas em 1000px, 1 em 640px), as mesmas
   do quadro da Captação. */

.oport-kicker {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texto-sec);
  margin-bottom: 6px;
}
.oport-intro {
  font-size: var(--txt-sm); color: var(--texto-sec);
  margin: 0 0 22px; max-width: 78ch; line-height: 1.5;
}

.oport-board {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px; align-items: start;
}
.oport-col {
  background: var(--coluna-bg); border: 1px solid var(--borda);
  border-radius: var(--raio); overflow: hidden; min-width: 0;
}
.oport-col--hoje { border-top: 3px solid var(--vermelho); }
.oport-col-cab { padding: 12px 14px 10px; border-bottom: 1px solid var(--borda); }
.oport-col-linha { display: flex; align-items: center; justify-content: space-between; gap: var(--e-2); }
.oport-col-t { font-family: var(--fonte-titulo); font-size: 14px; font-weight: 600; }
.oport-col-n {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 700;
  padding: 1px 8px; border-radius: var(--raio-pilula);
  color: var(--texto-sec); background: var(--cinza-claro);
}
.oport-col--hoje .oport-col-n { color: var(--vermelho-escuro); background: var(--vermelho-claro); }
.oport-col-sub {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--neutro-menu); margin-top: 3px;
}
.oport-col-body { padding: 10px; display: flex; flex-direction: column; gap: 10px; }
.oport-vazio { font-size: 12px; color: var(--neutro-menu); text-align: center; padding: 18px 0; }

.oport-card {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio-sm); padding: 12px 14px; min-width: 0;
}
.oport-card-vara { font-size: 13.5px; font-weight: 600; line-height: 1.35; }
.oport-card-meta { font-size: 11.5px; color: var(--texto-sec); margin-top: 4px; line-height: 1.4; }
/* A IDADE é o que decide o dia num follow-up: fica maior que a meta e vira
   vermelho-negrito quando estoura o SLA. É a única cor do cartão. */
.oport-idade { font-size: 12px; font-weight: 500; color: var(--texto-sec); margin-top: 8px; }
.oport-idade--over { font-weight: 700; color: var(--vermelho); }
.oport-proc { font-size: 11.5px; color: var(--verde-escuro); font-weight: 600; margin-top: 4px; }
.oport-card-acoes { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 10px; }
/* Botões do cartão são menores que os da tela: dentro de uma coluna de ~1/4
   de largura, o `.btn` padrão empurra três ações para três linhas. */
.oport-card-acoes .btn { font-size: 11.5px; padding: 5px 10px; box-shadow: none; }
.oport-x { padding: 5px 9px; }

/* Arquivo: uma pílula que abre uma grade. Consulta, não coluna. */
.oport-arquivo { margin-top: 18px; }
.oport-arq-pill {
  display: inline-block; cursor: pointer; list-style: none;
  font-size: 12.5px; font-weight: 600; color: var(--texto-sec);
  border: 1px solid var(--borda); background: var(--bg-card);
  padding: 7px 14px; border-radius: var(--raio-pilula);
}
.oport-arq-pill::-webkit-details-marker { display: none; }
.oport-arq-pill::after { content: ' ▾'; }
.oport-arquivo[open] .oport-arq-pill::after { content: ' ▴'; }
.oport-arq-grade {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px; margin-top: 12px;
}
/* Arquivado é passado: 75% de opacidade tira peso sem esconder. */
.oport-arq-card {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio-sm); padding: 12px 14px; opacity: .75; min-width: 0;
}
.oport-arq-topo { display: flex; align-items: center; justify-content: space-between; gap: var(--e-2); }
.oport-arq-nome { font-size: 13px; font-weight: 600; }
.oport-arq-tag {
  font-size: 11px; font-weight: 700; padding: 2px 8px;
  border-radius: var(--raio-pilula); flex-shrink: 0; white-space: nowrap;
}
.oport-arq-tag--ganho { color: var(--verde-escuro); background: var(--verde-claro); }
.oport-arq-tag--perdido { color: var(--vermelho-escuro); background: var(--vermelho-claro); }
.oport-arq-ctx { font-size: 11.5px; color: var(--texto-sec); margin-top: 4px; }

/* Abaixo de ~1000px as quatro colunas ficam estreitas demais para um cartão
   com nome, OAB, vara e três botões. Vira 2×2, depois 1. */
@media (max-width: 1000px) {
  .oport-board { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .oport-arq-grade { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .oport-board, .oport-arq-grade { grid-template-columns: minmax(0, 1fr); }
}

.mapa-subnav { display: flex; gap: var(--e-1); flex-wrap: wrap; border-bottom: 1px solid var(--borda); }
.mapa-subtab {
  background: none; border: none; padding: 10px 15px; font-size: var(--txt-sm); font-weight: 600;
  color: var(--texto-sec); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
  transition: color .15s, border-color .15s; border-radius: var(--raio-sm) var(--raio-sm) 0 0;
}
.mapa-subtab:hover { color: var(--texto); background: var(--cinza-claro); }
/* --ouro-texto-forte, nao --ouro-texto: a sub-aba vive na MESA, onde o
   primeiro mede 3,51:1. Mesma armadilha ja documentada no .not-pulso-l. */
.mapa-subtab.ativo { color: var(--ouro-texto-forte); border-bottom-color: var(--ouro-texto-forte); background: none; }

.mapa-row {
  display: flex; align-items: center; gap: var(--e-4); padding: 13px 15px;
  border: 1px solid var(--borda); border-radius: var(--raio); margin-bottom: var(--e-3);
  background: var(--bg-card); cursor: pointer; transition: box-shadow .15s, transform .15s, border-color .15s;
}
.mapa-row:hover { box-shadow: var(--sombra-flutuante); transform: translateY(-1px); border-color: var(--ouro); }
.mapa-avatar {
  width: 42px; height: 42px; border-radius: 50%; flex-shrink: 0; display: flex;
  align-items: center; justify-content: center; font-weight: 800; color: #fff; font-size: var(--txt-md);
  box-shadow: var(--sombra-card);
}
.mapa-chip { font-size: var(--txt-xs); font-weight: 700; padding: 3px 10px; border-radius: var(--raio-lg); white-space: nowrap; }
.mapa-bar { flex: 1; background: var(--cinza-mid); border-radius: var(--raio); height: 9px; overflow: hidden; min-width: 60px; }
.mapa-bar > div { height: 100%; border-radius: var(--raio); transition: width .45s cubic-bezier(.22,.61,.36,1); }

.bandeira-uf {
  width: 20px; height: 14px; object-fit: cover; border-radius: var(--raio-sm);
  vertical-align: -2px; box-shadow: var(--anel-fino); flex-shrink: 0;
}

/* As classes .kb-chip-* (chips de tribunal do topo do Kanban) foram
   REMOVIDAS em 2026-07-27 junto com a linha "Monitorando" que as usava:
   ela ocupava um bloco inteiro para repetir uma configuração que já tem
   tela própria (aba Monitoramento). O aviso de tribunal que não respondeu
   sobreviveu, como frase no rodapé do card do dia (.kb-hero-rodape). */

/* Escopo da Captação (2026-07-27) — substitui o mapa próprio que ela tinha.
   Aqui a linha se justifica (ao contrário do topo do Kanban, onde saiu): a
   busca é disparada por botão e o escopo é o que define o resultado, então
   precisa estar à vista na hora de buscar. */
.cap-escopo-linha {
  display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap;
  font-size: var(--txt-sm); color: var(--texto-sec);
  border: 1px solid var(--borda); border-radius: var(--raio-sm);
  padding: 9px 12px; background: var(--bg-card);
}
.cap-escopo-linha strong { color: var(--texto); }

/* ── Lentes da Captação (TASK-054, 26/08) ──────────────────────────────────
   Duas antenas na mesma tela: leilões negativos e falências. Pílulas, o mesmo
   vocabulário dos filtros do produto — não é navegação, é troca de lente. */
.cap-lentes { display: flex; gap: var(--e-2); margin-bottom: var(--e-4); flex-wrap: wrap; }
.cap-lente {
  font-family: inherit; font-size: var(--txt-sm); font-weight: 600; cursor: pointer;
  padding: 7px 14px; border-radius: var(--raio-pilula); border: 1px solid var(--borda);
  background: transparent; color: var(--texto-sec);
  transition: background .12s, border-color .12s, color .12s;
}
.cap-lente:hover { border-color: var(--ouro); color: var(--ouro-texto-forte); }
.cap-lente--on { background: var(--ouro-clara); border-color: var(--ouro); color: var(--ouro-texto-forte); }
/* Os estados que ficam DE FORA do recorte de 4 — dito, não escondido. */
.cap-fal-fora {
  font-size: var(--txt-xs); color: var(--texto-sec); margin-top: 6px; line-height: 1.5;
}
/* O tipo do evento é o que o card responde primeiro: decretou? convolou?
   nomeou administrador? Vem antes do número do processo, de propósito. */
.cap-fal-evento {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 500;
  letter-spacing: .06em; text-transform: uppercase;
  color: var(--vermelho-escuro); margin-bottom: var(--e-2);
}
/* Ausência declarada: itálico e apagado, para não competir com o card que
   TEM o nome. Medido na Etapa 1 — o nome consta em 50% das nomeações e em
   0–8% das decretações, então este estado é o comum, não a exceção. */
.cap-fal-sem-admin { font-style: italic; color: var(--neutro-menu); }
.cap-escopo-linha--vazia { border-color: var(--amarelo); background: var(--amarelo-claro); color: var(--amarelo-escuro); }

/* Linha "isto se atualiza sozinho" (2026-08-19). Sem borda nem fundo: é
   informação de contexto, não aviso — competir com o quadro logo abaixo
   custaria atenção que pertence aos cards. */
.cap-rodape {
  font-size: var(--txt-sm); color: var(--texto-sec);
  margin-bottom: var(--e-4); line-height: 1.5;
}
.cap-rodape strong { color: var(--texto); }

/* Card do dia — ações e rodapé (2026-07-27). Os contadores que ficavam
   soltos acima do card ("54 para analisar · 71 acompanhando") viraram botões
   aqui: número que não leva a lugar nenhum é peso morto na tela. */
.kb-hero-acoes { display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap; }
.kb-hero-rodape {
  margin-top: var(--e-4); padding-top: var(--e-3); border-top: 1px solid var(--ouro);
  font-size: var(--txt-xs); color: var(--texto-sec);
  display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap;
}
/* Tribunal que não respondeu: âmbar, não vermelho — não é erro da usuária
   nem falha do produto, é o tribunal fora do ar. Mas precisa ser visto,
   porque explica um número do dia menor que o normal. */
.kb-hero-rodape--alerta { border-top-color: var(--amarelo); color: var(--amarelo-escuro); }

/* Controle segmentado "Exibir por" (2026-07-10, revisão formiga) — antes o
   mesmo widget existia 2x com estilos inline (Painel de hoje e Captação) e
   o JS alternava o estado pintando style.background à mão. */
.kb-seg { display: inline-flex; border: 1px solid var(--cinza-mid); border-radius: var(--raio); overflow: hidden; }
.kb-seg button {
  border: none; background: var(--bg-card); color: var(--texto);
  font-size: var(--txt-sm); font-weight: 600; padding: 5px 12px; cursor: pointer; font-family: inherit;
}
.kb-seg button.ativo { background: var(--ouro); color: var(--sobre-ouro); }

/* Título de seção padronizado */
.im-title {
  font-weight: 700; font-size: var(--txt-sm); text-transform: uppercase; letter-spacing: .5px;
  color: var(--texto-sec); border-bottom: 1px solid var(--borda); padding-bottom: var(--e-2); margin-top: var(--e-5);
}
/* Inteligência de Mercado executiva — Fase 1 (2026-07-10). Cada bloco
   responde uma pergunta do leiloeiro; o IDL deixou de ser número pelado. */
.im-rank-pergunta { font-size: var(--txt-md); font-weight: 800; letter-spacing: -.2px; margin: 6px 0 8px; }
/* Medidor de faixa 0-100 do IDL — COMPONENTE ÚNICO (ranking + drawer)
   (2026-07-11, pedido da Amanda: mesma métrica, mesma representação visual em
   todo o produto). Hierarquia número → rótulo → barra. Cor = RISCO (vermelho =
   concorrente forte), nunca desempenho — não reutilizar p/ métrica positiva.
   Ver DESIGN_SYSTEM.md. */
.im-idl-gauge { display: flex; flex-direction: column; align-items: center; gap: var(--e-1); min-width: 96px; margin: 0 auto; cursor: help; }
.im-idl-gauge--esq { align-items: flex-start; margin: 0; max-width: 190px; }
.im-idl-cap { font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--texto-sec); }
.im-idl-num { font-size: var(--txt-lg); font-weight: 800; line-height: 1; letter-spacing: -.5px; }
.im-idl-lbl { font-size: var(--txt-xs); font-weight: 600; color: var(--texto-sec); white-space: nowrap; }
.im-idl-bar { width: 100%; height: 6px; border-radius: var(--raio-pilula); background: var(--cinza-claro, var(--bg)); overflow: hidden; margin-top: var(--e-2); }
.im-idl-bar > span { display: block; height: 100%; border-radius: var(--raio-pilula); transition: width .3s ease; }
.im-rank-row { border-bottom: 1px solid var(--borda); cursor: pointer; transition: background .1s; }
.im-rank-row:hover { background: var(--cinza-claro); }
.im-rank-lider { background: color-mix(in srgb, var(--amarelo) 8%, transparent); }
.im-rank-lider:hover { background: color-mix(in srgb, var(--amarelo) 14%, transparent); }
/* "O que é o IDL?" — recolhível */
.im-idl-ajuda { margin: 0 0 12px; font-size: var(--txt-sm); }
.im-idl-ajuda summary { cursor: pointer; color: var(--ouro-texto); font-weight: 600; list-style: none; user-select: none; }
.im-idl-ajuda summary::-webkit-details-marker { display: none; }
.im-idl-ajuda summary:hover { text-decoration: underline; }
.im-idl-corpo { margin-top: var(--e-3); padding: 12px 14px; background: var(--cinza-claro); border-radius: var(--raio-sm); color: var(--texto-sec); line-height: 1.6; }
.im-idl-corpo strong { color: var(--texto); }
.im-idl-legenda { display: flex; gap: var(--e-3); flex-wrap: wrap; margin-top: var(--e-3); }
.im-idl-legenda span { font-size: var(--txt-xs); font-weight: 700; padding: 3px 10px; border-radius: var(--raio-lg); }
.im-idl-fatores { margin: 6px 0 8px; padding-left: var(--e-5); display: flex; flex-direction: column; gap: var(--e-2); }
.im-idl-fatores li { font-size: var(--txt-sm); }
.im-idl-fatores li span { color: var(--texto-sec); font-size: var(--txt-xs); }

/* Bullets da "Leitura do mercado" — usados no painel "Ler análise" da Visão
   Geral (imMarketSummary → mapa-leitura-full). */
.im-exec-bullets { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--e-3); }
.im-exec-bullets li { font-size: var(--txt-sm); color: var(--texto); line-height: 1.45; }
.im-exec-bullets li strong { font-weight: 700; }

/* Card padronizado */
.im-card {
  background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio);
  padding: var(--e-5); box-shadow: var(--sombra-card); transition: box-shadow .15s, transform .15s;
}
.im-card:hover { box-shadow: var(--sombra-flutuante); }
.im-card-t { font-weight: 700; font-size: var(--txt-sm); margin-bottom: var(--e-4); color: var(--texto); display: flex; align-items: center; gap: var(--e-2); }
/* Caixa de IA padronizada */
.im-ia {
  background: linear-gradient(135deg, var(--ouro-clara), var(--ouro-clara));
  border: 1px solid var(--ouro); border-radius: var(--raio-sm);
  padding: 12px 14px; font-size: var(--txt-sm); line-height: 1.6; color: var(--texto); margin-top: var(--e-3);
}
/* Controles de filtro/seleção padronizados */
.im-field { display: flex; flex-direction: column; gap: var(--e-2); }
.im-field > label { font-size: var(--txt-xs); color: var(--texto-sec); text-transform: uppercase; letter-spacing: .4px; }
.im-input, .im-select {
  padding: 8px 11px; border: 1px solid var(--borda); border-radius: var(--raio-sm);
  font-size: var(--txt-sm); font-family: inherit; background: var(--bg-card); color: var(--texto);
  transition: border-color .15s, box-shadow .15s; max-width: 260px;
}
.im-input:focus, .im-select:focus { outline: none; border-color: var(--ouro-texto); box-shadow: var(--anel-foco); }
.im-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--e-5); }

/* Drawer lateral */
.drawer-head {
  padding: 22px 24px; border-bottom: 1px solid var(--borda);
  background: linear-gradient(135deg, var(--ouro-clara), var(--bg-card));
}
.drawer-body { padding: 20px 24px; }
.im-crumb { transition: color .12s; }
.im-crumb:hover { text-decoration: underline; }

/* Dark mode — restrito ao módulo Inteligência (não afeta o resto do app) */
@media (prefers-color-scheme: dark) {
  #tab-mapa, #tab-analytics, #tab-comparativos, #tab-radar, #mapa-drawer-overlay {
    --bg: var(--texto); --bg-card: var(--texto); --texto: var(--borda); --texto-sec: var(--texto-sec);
    --borda: var(--texto); --cinza-claro: var(--texto); --cinza-mid: var(--texto); --ouro-clara: var(--texto);
  }
}

/* Responsividade */
@media (max-width: 640px) {
  .mapa-kpis { grid-template-columns: 1fr; gap: var(--e-3); }
  .mapa-kpi .v { font-size: var(--txt-xl); }
  .im-grid { grid-template-columns: 1fr; }
  .drawer-head, .drawer-body { padding-left: var(--e-5); padding-right: var(--e-5); }
}

/* Animações do mapa geográfico */
@keyframes mapaFadeIn { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: none; } }
@keyframes mapaPop { from { opacity: 0; transform: scale(.985); } to { opacity: 1; transform: none; } }
.mapa-anim { animation: mapaFadeIn .30s ease both; }
#mapa-geo-drill { animation: mapaFadeIn .22s ease both; }
[id^="mapa-hmg-"] path { transition: opacity .2s ease, stroke-width .18s ease, fill .35s ease; }
[id^="mapa-hm-"] { animation: mapaPop .35s ease both; }
.mapa-crumb { transition: color .12s ease; }
.mapa-crumb:hover { text-decoration: underline; }

/* ── MODAL ───────────────────────────────────────────────────────────────────── */
.modal-overlay {
  position: fixed; inset: 0; background: rgba(0,0,0,.5);
  z-index: var(--z-modal); display: none; align-items: center;
  justify-content: center; padding: var(--e-5); backdrop-filter: blur(2px);
}
.modal-overlay.open { display: flex; }
.modal {
  background: var(--bg-card); border-radius: var(--raio);
  padding: var(--e-6); width: 100%; max-width: 500px;
  max-height: 90vh; overflow-y: auto;
  box-shadow: var(--sombra-flutuante);
}
.modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--e-2); }
.modal-header h3 { font-size: var(--txt-lg); font-weight: 700; letter-spacing: -.2px; }
.modal-close { background: none; border: none; font-size: var(--txt-xl); cursor: pointer; color: var(--cinza); padding: 0; line-height: 1; transition: color 0.1s, transform .12s; }
.modal-close:hover { color: var(--texto); }
.modal-sub { font-size: var(--txt-sm); color: var(--texto-sec); margin-bottom: var(--e-5); }
.modal-footer { display: flex; gap: var(--e-2); justify-content: flex-end; margin-top: var(--e-5); padding-top: var(--e-4); border-top: 1px solid var(--borda); }
.modal-sm { max-width: 400px; } /* modificador reutilizável para modais curtos (ex.: confirmar()) */

/* Modificadores criados em 2026-07-31 para encerrar a dívida das "4
   implementações de modal" (seção 11 do DESIGN_SYSTEM): o que os modais
   grandes tinham de próprio era largura, padding e rolagem — não estrutura.
   Com estes três, eles passam a usar a MESMA base .modal-overlay/.modal, e
   um ajuste no padding padrão deixa de precisar ser replicado em 4 lugares.

   .modal-lg    largura de conteúdo denso (dossiê do kanban, decisão)
   .modal-flush corpo sem padding — quem manda no espaçamento é o conteúdo
   .modal-col   coluna com cabeçalho fixo e miolo rolando (não a caixa toda) */
.modal-lg { max-width: 960px; }
.modal-md { max-width: 780px; }
.modal-flush { padding: 0; overflow: hidden; }
.modal-col { display: flex; flex-direction: column; max-height: 92vh; }

/* Confirmação não-bloqueante (helper confirmar() em confirmar.js) — reusa .modal */
.confirmar-overlay { z-index: var(--z-confirmar); } /* acima do avisar() e de qualquer modal */
.confirmar-msg { font-size: var(--txt-md); color: var(--texto-sec); line-height: 1.5; white-space: pre-line; margin: 4px 0; }

/* ── COMPONENTES DE INTELIGÊNCIA DE MERCADO (im-componentes.js) ──────────────
   Peças reutilizáveis (Home / Visão Geral / Analytics / Comparativos). */

/* 1. Executive Header */
.im-exec-header { display: flex; align-items: center; justify-content: space-between; gap: var(--e-4); flex-wrap: wrap; }
.imeh-esq { display: flex; align-items: center; gap: 10px 12px; flex-wrap: wrap; min-width: 0; }
.imeh-titulo { font-size: var(--txt-lg); font-weight: 800; letter-spacing: -.01em; }
.imeh-estados { font-size: var(--txt-sm); color: var(--texto-sec); font-weight: 600; }
.imeh-mais { color: var(--ouro-texto); font-weight: 700; cursor: default; }
.imeh-alterar { background: none; border: 1px solid var(--borda); border-radius: var(--raio-lg); padding: 3px 11px; font-size: var(--txt-sm); color: var(--texto-sec); cursor: pointer; }
.imeh-alterar:hover { border-color: var(--ouro-texto); color: var(--ouro-texto); }
.imeh-acoes { display: flex; gap: var(--e-2); align-items: center; flex-wrap: wrap; }
.imeh-meta { font-size: var(--txt-xs); color: var(--texto-sec); }

/* 2. Market Summary */
.im-market { display: flex; align-items: center; gap: var(--e-5); flex-wrap: wrap; background: var(--bg); border: 1px solid var(--borda); border-radius: var(--raio-sm); padding: 11px 16px; }
.imms-kpi { display: inline-flex; align-items: baseline; gap: var(--e-2); }
.imms-kpi .n { font-size: var(--txt-xl); font-weight: 800; letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
.imms-kpi .l { font-size: var(--txt-sm); color: var(--texto-sec); }
.imms-sep { width: 1px; align-self: stretch; background: var(--borda); }
.imms-insight { font-size: var(--txt-sm); display: inline-flex; align-items: center; gap: var(--e-2); }
.imms-insight .t { color: var(--texto); }         /* NÃO cortar — lead curto já vem pronto */
/* Idem: botao de texto direto na mesa (3,51:1 com --ouro-texto). */
.imms-mais { background: none; border: 0; color: var(--ouro-texto-forte); font-weight: 600; font-size: var(--txt-sm); cursor: pointer; padding: 0; white-space: nowrap; }
.im-market--vazio { color: var(--texto-sec); font-size: var(--txt-sm); }
/* Análise completa (todos os insights) sob a banda — abre no "Ler análise" */
.im-leitura-full { background: var(--ouro-clara); border: 1px solid var(--ouro); border-radius: var(--raio-sm); padding: 12px 16px; margin-top: var(--e-3); }
.im-leitura-titulo { font-size: var(--txt-sm); font-weight: 700; color: var(--ouro-texto); margin-bottom: var(--e-2); }

/* 3. State Strip */
.im-strip-wrap { position: relative; }
.ims-topo { display: flex; align-items: center; gap: var(--e-3); margin-bottom: var(--e-3); }
.ims-rot { font-size: var(--txt-sm); color: var(--texto-sec); font-weight: 600; }
.ims-tgl { display: inline-flex; background: var(--bg); border: 1px solid var(--borda); border-radius: var(--raio-lg); padding: var(--e-1); }
.ims-tgl-btn { font-size: var(--txt-sm); font-weight: 600; border: 0; background: transparent; color: var(--texto-sec); padding: 4px 12px; border-radius: var(--raio-lg); cursor: pointer; transition: transform .12s; }
.ims-tgl-btn.ativo { background: var(--bg-card); color: var(--texto); box-shadow: var(--sombra-card); }
.ims-info { width: 18px; height: 18px; border-radius: 50%; border: 1px solid var(--borda); color: var(--texto-sec); font-size: var(--txt-xs); display: inline-flex; align-items: center; justify-content: center; cursor: help; }
/* fita horizontal de altura fixa: N estados vira scroll lateral, nunca altura */
.im-strip { display: flex; gap: var(--e-3); overflow-x: auto; padding-bottom: var(--e-1); scrollbar-width: thin; }
.im-strip-wrap::after { content: ""; position: absolute; right: 0; bottom: 2px; top: 40px; width: 26px; pointer-events: none;
  background: linear-gradient(to right, transparent, var(--bg-card)); }
.im-strip-card { flex: 0 0 auto; min-width: 150px; background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio-sm); padding: 9px 12px; display: flex; align-items: center; gap: var(--e-4); cursor: pointer; transition: border-color .12s; }
.im-strip-card:hover { border-color: var(--ouro-texto); }
.ims-card-pos { font-size: var(--txt-xs); font-weight: 700; color: var(--texto-sec); font-variant-numeric: tabular-nums; }
.ims-card-uf { font-size: var(--txt-md); font-weight: 700; white-space: nowrap; }
.ims-card-facts { font-size: var(--txt-xs); color: var(--texto-sec); line-height: 1.35; }
.ims-card-facts--zero { font-style: italic; }
.ims-card-pot { margin-left: auto; text-align: right; }
.ims-card-pot .s { font-size: var(--txt-lg); font-weight: 800; line-height: 1; letter-spacing: -.02em; font-variant-numeric: tabular-nums; display: block; }
.ims-card-pot .c { font-size: var(--txt-xs); text-transform: uppercase; letter-spacing: .05em; color: var(--texto-sec); }
/* Potencial em PALAVRA (2026-07-22): "Muito alto" não cabe em 19px sem
   empurrar o card — a palavra é menor que o número, mas continua o destaque. */
.ims-card-pot .ims-card-pot--palavra { font-size: var(--txt-md); white-space: nowrap; }
/* 1º card da fileira em TINTA sólida (TASK-036): no desenho do Figma o
   estado líder é o único card escuro — mesma âncora do card do dia no
   Kanban. Um por fileira, nunca mais. */
.im-strip-card--lider { background: var(--inverso-bg); border-color: var(--inverso-bg); }
.im-strip-card--lider .ims-card-pos { color: rgba(255,255,255,.55); }
.im-strip-card--lider .ims-card-uf, .im-strip-card--lider .ims-card-facts { color: var(--inverso-texto); }
.im-strip-card--lider .ims-card-pot .s { color: var(--ouro); }
.im-strip-card--lider .ims-card-pot .c { color: rgba(255,255,255,.6); }
.im-strip-card--lider:hover { border-color: var(--ouro); }
/* Barra fina de score: Potencial 0–100 virando comprimento, em dourado. */
.ims-card-bar {
  position: absolute; left: 12px; right: 12px; bottom: 6px; height: 2px;
  background: rgba(26,22,20,.08); overflow: hidden; border-radius: 0;
}
.ims-card-bar > span { display: block; height: 100%; background: var(--ouro); }
.im-strip-card { position: relative; padding-bottom: 14px; }
.im-strip-card--lider .ims-card-bar { background: rgba(255,255,255,.15); }
.ims-pot--alto { color: var(--verde); } .ims-pot--bom { color: var(--ouro-texto); }
.ims-pot--medio { color: var(--amarelo); } .ims-pot--baixo { color: var(--texto-sec); }
.im-strip--vazio { font-size: var(--txt-sm); color: var(--texto-sec); padding: 14px 4px; }

/* 4. Ranking Header */
.im-rank-header { display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap; }
.irh-titulo { font-size: var(--txt-lg); font-weight: 800; letter-spacing: -.01em; }
.irh-ctx { font-size: var(--txt-sm); color: var(--texto-sec); }
.irh-badge { font-size: var(--txt-xs); font-weight: 700; color: var(--verde); background: var(--verde-claro); border-radius: var(--raio-lg); padding: 2px 9px; margin-left: auto; }

/* ── MODAL DECISÃO ───────────────────────────────────────────────────────────── */
.dec-header {
  display: flex; justify-content: space-between; align-items: flex-start;
  padding: 24px 28px 20px; border-bottom: 1px solid var(--borda);
  /* Era `--sidebar-bg` quando a sidebar era grafite. Com a sidebar clara
     (TASK-036) o cabeçalho passou a apontar para a moldura escura de
     verdade — o texto aqui é branco (.dec-proc) e ficaria ilegível. */
  background: var(--nav-bg);
}
.dec-proc {
  font-family: var(--fonte-mono); font-size: var(--txt-md); font-weight: 700;
  color: #fff; letter-spacing: .3px; margin-bottom: var(--e-1);
}
.dec-meta { font-size: var(--txt-sm); color: rgba(255,255,255,.6); margin-bottom: var(--e-1); }
.dec-classe {
  display: inline-block; font-size: var(--txt-xs); font-weight: 700; letter-spacing: .8px;
  text-transform: uppercase; background: rgba(255,255,255,.1); color: rgba(255,255,255,.8);
  border-radius: var(--raio-sm); padding: 2px 8px; margin-top: var(--e-1);
}
.dec-info-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr));
  border-bottom: 1px solid var(--borda);
}
.dec-info-item { padding: 14px 28px; border-right: 1px solid var(--borda); }
.dec-info-item:last-child { border-right: none; }
.dec-info-label {
  font-size: var(--txt-xs); font-weight: 700; letter-spacing: .8px;
  text-transform: uppercase; color: var(--texto-sec); margin-bottom: var(--e-1);
}
.dec-info-valor { font-size: var(--txt-sm); font-weight: 600; color: var(--texto); line-height: 1.4; }
.dec-corpo { padding: 20px 28px; }
.dec-corpo-label {
  font-size: var(--txt-xs); font-weight: 700; letter-spacing: .8px;
  text-transform: uppercase; color: var(--texto-sec); margin-bottom: var(--e-3);
}
.dec-texto { font-size: var(--txt-sm); line-height: 1.8; color: var(--texto); white-space: pre-wrap; word-break: break-word; }
.dec-footer {
  display: flex; gap: var(--e-3); justify-content: flex-end; align-items: center;
  padding: 16px 28px; border-top: 1px solid var(--borda);
  background: var(--bg-card); position: sticky; bottom: 0;
}

/* ── TRIB CHECKBOXES ─────────────────────────────────────────────────────────── */
.trib-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--e-2); }
.trib-opt {
  display: flex; align-items: center; justify-content: center;
  padding: 8px 6px; border: 1px solid var(--borda);
  border-radius: var(--raio-sm); cursor: pointer;
  font-size: var(--txt-sm); font-weight: 600; user-select: none;
  background: var(--bg-card); color: var(--texto-sec);
  transition: all 0.12s; box-shadow: var(--sombra-card);
  text-align: center;
}
.trib-opt:hover { border-color: var(--ouro); color: var(--ouro-texto-forte); background: var(--ouro-clara); }
.trib-opt.sel { border-color: var(--ouro-texto); background: var(--ouro-clara); color: var(--ouro-texto-forte); box-shadow: var(--anel-selecao); }

/* ── LOADING ─────────────────────────────────────────────────────────────────── */
.loading { text-align: center; padding: var(--e-6); color: var(--texto-sec); font-size: var(--txt-md); }
.spinner {
  display: inline-block; width: 18px; height: 18px;
  border: 2px solid var(--cinza-mid); border-top-color: var(--ouro-texto);
  border-radius: 50%; animation: spin 0.65s linear infinite;
  margin-right: var(--e-2); vertical-align: middle;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* ── VAZIO ───────────────────────────────────────────────────────────────────── */
.vazio { text-align: center; padding: 56px 20px; color: var(--texto-sec); }
.vazio-icon { font-size: var(--txt-2xl); margin-bottom: var(--e-3); opacity: .6; }
.vazio p { font-size: var(--txt-md); }

/* ── NOTA ────────────────────────────────────────────────────────────────────── */
.nota {
  display: flex; gap: var(--e-3); align-items: flex-start;
  background: var(--ouro-clara); border: 1px solid var(--ouro);
  border-radius: var(--raio-sm); padding: 10px 14px;
  /* --ouro-texto-forte sobre --ouro-clara: o par certo, 4,53:1. Com o
     --ouro-texto dava 3,18:1 -- e o proprio comentario do token ja dizia
     isso desde a TASK-039; a nota nunca foi ajustada. */
  font-size: var(--txt-sm); color: var(--ouro-texto-forte); line-height: 1.5;
}
.nota.aviso { background: var(--vermelho-claro); color: var(--vermelho); border-color: var(--vermelho-claro); }

/* ── RESPONSIVO ──────────────────────────────────────────────────────────────── */
/* Menu hambúrguer (2026-07-10, auditoria CTO): antes o sidebar simplesmente
   sumia no mobile (display:none) e não existia NENHUMA forma de navegar —
   quem abria do celular ficava preso na primeira tela. Agora o ☰ da topbar
   abre o mesmo sidebar como gaveta sobreposta. */
#btn-menu-mobile { display: none; background: none; border: none; cursor: pointer; color: var(--texto); padding: 4px 8px; line-height: 1; }
/* O ☰ era um glifo de texto e vivia do `font-size` do botão; virou SVG de
   traço (TASK-038) e passa a viver do próprio tamanho. */
#btn-menu-mobile .ico { width: 21px; height: 21px; }
#menu-mobile-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: var(--z-menu-mobile); }
@media (max-width: 700px) {
  #btn-menu-mobile { display: block; }
  .sidebar { display: none; }
  .sidebar.aberta {
    display: block; position: fixed; top: 0; left: 0; bottom: 0; z-index: calc(var(--z-menu-mobile) + 1);
    /* --sidebar-bg, não --bg-card: no celular é a MESMA sidebar, só que
       deslizando. Com o fundo branco daqui e o texto creme de lá, o menu
       inteiro sumia (Ponte visual, 08/08). */
    width: min(290px, 84vw); background: var(--sidebar-bg); overflow-y: auto;
    box-shadow: var(--sombra-flutuante); padding-top: var(--e-4);
  }
  #menu-mobile-overlay.aberta { display: block; }
  .form-grid { grid-template-columns: 1fr; }
  .stats-grid { grid-template-columns: repeat(2, 1fr); }
  .painel-main { padding: var(--e-4); }
}

/* ── CHAT ────────────────────────────────────────────────────────────────────── */
.chat-bolha {
  max-width: 75%; padding: 9px 13px; border-radius: var(--raio-lg);
  font-size: var(--txt-sm); line-height: 1.5;
}
.chat-bolha.minha { align-self: flex-end; background: var(--ouro); color: var(--sobre-ouro); border-bottom-right-radius: 3px; }
.chat-bolha.outro { align-self: flex-start; background: var(--cinza-claro); border: 1px solid var(--borda); border-bottom-left-radius: 3px; }
.chat-autor { font-size: var(--txt-xs); font-weight: 700; margin-bottom: var(--e-1); opacity: .8; }
.chat-hora  { font-size: var(--txt-xs); opacity: .6; margin-top: var(--e-1); text-align: right; }
.chat-lida  { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: var(--e-1); align-self: flex-end; }
.conversa-item {
  display: flex; align-items: center; justify-content: space-between;
  padding: 11px 14px; cursor: pointer; border-bottom: 1px solid var(--borda);
  font-size: var(--txt-sm); transition: background 0.1s;
}
.conversa-item:hover { background: var(--cinza-claro); }
.conversa-item.ativa { background: var(--ouro-clara); border-left: 3px solid var(--ouro); }
.conversa-badge {
  background: var(--vermelho); color: #fff; font-size: var(--txt-xs);
  padding: 2px 6px; border-radius: var(--raio-lg); min-width: 16px; text-align: center; font-weight: 700;
}

/* ── KANBAN ─────────────────────────────────────────────────────────────────── */
#kanban-board {
  display: flex; gap: var(--e-3); overflow-x: auto; padding-bottom: var(--e-4); min-height: 180px;
  scrollbar-width: thin;
}
/* Coluna do desenho (TASK-036): cartão BRANCO com raio 8px e borda superior
   de 3px na cor da etapa. Era fundo cinza com borda uniforme — a coluna
   parecia uma caixa, não uma etapa. A cor vem do JS (KANBAN_COLUNAS), que é
   onde a etapa é definida. */
.kb-coluna {
  flex: 0 0 220px; background: var(--bg-card); border-radius: 8px;
  border: 1px solid var(--borda); border-top: 3px solid var(--borda);
  display: flex; flex-direction: column; min-height: 160px;
}
/* O título da coluna é tinta, não a cor da etapa: a borda superior já
   identifica, e repetir a cor no texto criava dois acentos disputando. */
.kb-col-header {
  display: flex; justify-content: space-between; align-items: center;
  padding: 10px 12px 8px;
  font-family: var(--fonte-titulo); font-size: var(--txt-sm); font-weight: 700;
  color: var(--tinta);
}
/* Contador do desenho: véu de tinta, sem raio, mono. */
.kb-count {
  background: rgba(26,22,20,.094); border-radius: 0; padding: 2px 6px;
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 500;
  color: var(--tinta); font-variant-numeric: tabular-nums;
}
.kb-col-body {
  flex: 1; padding: var(--e-3); display: flex; flex-direction: column; gap: var(--e-3); overflow-y: auto;
}

/* ── QUADRO DA CAPTAÇÃO (handoff painel14, 10/08) ───────────────────────────
   O mesmo renderizador do Kanban, com quatro colunas por próxima ação.
   Diferenças que justificam classe própria e não um ajuste no `.kb-coluna`
   geral: aqui são SEMPRE quatro (cabem numa grade e não precisam de rolagem),
   e a coluna é superfície calma para o card branco subir de dentro dela —
   no Kanban a coluna é branca porque as colunas variam de número. */
/* O número de colunas é variável desde 26/08: a Captação tem 4 e os Laudos de
   avaliação têm 5 ("Chegou hoje" + três janelas de idade + "Já prospectado").
   Uma variável em vez de uma segunda regra — duplicar a grade seria copiar o
   CSS, que é exatamente o que o pedido proibiu. */
.kb-board-cap {
  display: grid; grid-template-columns: repeat(var(--kb-cols, 4), minmax(0, 1fr));
  gap: var(--e-3); align-items: start; padding-bottom: var(--e-4); min-height: 200px;
}
.kb-board-cap .kb-coluna { flex: initial; background: var(--coluna-bg); min-width: 0; }
/* A coluna em destaque: além da borda e do contador, um tint de 6% no fundo.
   É UMA por quadro — se todas tivessem, nenhuma chamaria.
   A cor vem de `--kb-col-cor`, escrita pelo renderizador a partir da própria
   coluna (26/08). Era vermelho fixo, o que servia à "Fazer hoje" da Captação
   e diria o contrário do certo na "Chegou hoje" dos Laudos, que é janela
   abrindo e não atraso. O fallback mantém o vermelho de antes. */
.kb-board-cap .kb-coluna--derivada {
  background: color-mix(in srgb, var(--kb-col-cor, var(--vermelho)) 6%, var(--coluna-bg));
}
.kb-col-sub {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase;
  /* --texto-sec: sobre a coluna com tint de 6% o --neutro-menu cai para
     4,13:1. O sub-rotulo e texto de 10px, precisa de 4,5:1. */
  color: var(--texto-sec);
  padding: 0 12px 8px; margin-top: -4px;
}
/* Coluna derivada não recebe drop, então também não mostra "Soltar aqui" —
   a área de soltar é a promessa de que algo seria gravado. No lugar, a frase
   que diz por que a coluna está vazia. */
.kb-col-vazia {
  font-size: 12px; color: var(--neutro-menu); text-align: center; padding: 18px 0;
}

@media (max-width: 1000px) {
  .kb-board-cap { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .kb-board-cap { grid-template-columns: minmax(0, 1fr); }
}
/* Card do desenho: branco, raio 8px, borda esquerda pela prioridade. Dentro
   de uma coluna branca ele precisa da borda completa para se separar do
   fundo — no desenho a coluna é branca e o card também. */
.kb-card {
  background: var(--bg-card); border: 1px solid var(--borda); border-left: 3px solid var(--cinza-mid);
  border-radius: 8px; padding: 8px 10px; cursor: grab; position: relative;
  box-shadow: var(--sombra-card); transition: box-shadow .15s;
  font-size: var(--txt-xs);
}
.kb-card:hover { box-shadow: var(--sombra-flutuante); }
.kb-card:active { cursor: grabbing; }
.kb-del {
  position: absolute; top: 6px; right: 6px; background: none; border: none;
  font-size: var(--txt-lg); line-height: 1; cursor: pointer; color: var(--texto-sec);
  opacity: 0; transition: opacity .15s;
}
.kb-card:hover .kb-del { opacity: 1; }
.kb-drop-area {
  border: 2px dashed var(--borda); border-radius: var(--raio); padding: var(--e-3);
  text-align: center; color: var(--texto-sec); font-size: var(--txt-xs);
  margin-top: auto; opacity: 0; transition: opacity .2s;
}
.kb-coluna:hover .kb-drop-area { opacity: 1; }

/* ── Kanban: revisão "Proposta A" (2026-07-10) — status vira faixa na borda
   esquerda do card em vez de badge, tribunal em texto simples, motivo
   cortado em 1 linha e bem/valor/prazo/responsável/idade viram uma única
   linha de meta discreta. Objetivo: menos elementos coloridos disputando
   atenção por card (ver mockup aprovado pela Amanda). ───────────────────── */
.kb-card-linha1 { display: flex; align-items: baseline; justify-content: space-between; gap: var(--e-3); margin-bottom: var(--e-2); }
/* TASK-025: `word-break: break-all` era o motivo de o número do processo
   quebrar no meio de um dígito na coluna estreita. Agora ele fica em UMA
   linha, em fonte mono (alinha os grupos de dígitos), e some com reticências
   se não couber — o número inteiro continua no Dossiê. */
.kb-card-processo {
  font-family: var(--fonte-mono);
  font-weight: 600; font-size: var(--txt-xs); color: var(--texto-sec);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  display: block; max-width: 100%;
}
.kb-card-processo-linha { margin-bottom: var(--e-2); min-width: 0; }

/* ── Valor como protagonista do card (TASK-025) ───────────────────────────
   A cor comunica a faixa de valor do bem — é informação, não enfeite (ver
   BUSINESS_RULES 6.3). Vermelho NÃO entra aqui: fica reservado a prazo. */
.kb-valor { font-size: var(--txt-md); font-weight: 800; letter-spacing: -.2px; }
.kb-valor--alta   { color: var(--amarelo-escuro); }   /* ≥ R$ 1 mi  — dourado */
.kb-valor--media  { color: var(--verde-escuro); }     /* ≥ R$ 300 mil — verde */
.kb-valor--neutra { color: var(--texto); }
.kb-valor--vazio  { color: var(--texto-sec); font-weight: 600; font-size: var(--txt-sm); font-style: italic; }

/* Borda esquerda ecoando a mesma faixa (o card inteiro "lê" a cor de longe) */
.kb-card--valor-alta   { border-left-color: var(--amarelo) !important; }
.kb-card--valor-media  { border-left-color: var(--verde) !important; }
.kb-card--valor-neutra { border-left-color: var(--cinza-mid) !important; }
/* Prazo vence qualquer faixa de valor — urgência é a única dona do vermelho */
.kb-card--prazo { border-left-color: var(--vermelho) !important; }

/* ── PRAZOS (2026-08-18) ─────────────────────────────────────────────────────
   O card mostrava a data crua e ficava calado sobre ela estar vencida. Agora o
   estado é dito por texto E por cor, nas duas pontas: o selo no card e a faixa
   no topo do quadro. Cores das variantes -escuro: o selo é texto pequeno sobre
   a mesa, e o token cheio (--vermelho) so da 3,97:1 ali. */
.kb-prazo {
  font-family: var(--fonte-mono); font-size: var(--txt-xs); font-weight: 700;
  padding: 1px 6px; border-radius: var(--raio-sm); white-space: nowrap;
}
.kb-prazo--vencido  { background: var(--vermelho-claro); color: var(--vermelho-escuro); }
.kb-prazo--hoje     { background: var(--amarelo-claro);  color: var(--amarelo-escuro); }
.kb-prazo--vencendo { background: var(--amarelo-claro);  color: var(--amarelo-escuro); }
.kb-prazo--futuro   { background: var(--cinza-claro);    color: var(--texto-sec); }

/* Vencido puxa a borda do card para o vermelho cheio — "vence em 5 dias" e
   "venceu há 8" nao podem ter o mesmo peso: um e aviso, o outro e divida. */
.kb-card--vencido { border-left-color: var(--vermelho) !important; }

.kb-prazos {
  border: 1px solid var(--vermelho-claro); border-left: 3px solid var(--vermelho);
  border-radius: var(--raio); background: var(--bg-card);
  padding: var(--e-4); margin-bottom: var(--e-4);
}
.kb-prazos-t {
  font-family: var(--fonte-mono); font-size: var(--txt-xs); font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em; color: var(--texto);
  margin-bottom: var(--e-3);
}
.kb-prazos-lista { display: flex; flex-direction: column; gap: var(--e-2); }
.kb-prazo-linha {
  display: flex; align-items: center; gap: var(--e-3); width: 100%; text-align: left;
  background: none; border: none; border-radius: var(--raio-sm);
  padding: var(--e-2); cursor: pointer; font-family: inherit;
}
.kb-prazo-linha:hover { background: var(--cinza-claro); }
.kb-prazo-proc { font-family: var(--fonte-mono); font-size: var(--txt-sm); color: var(--texto); }
.kb-prazo-org { font-size: var(--txt-xs); color: var(--texto-sec); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-prazos-mais { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: var(--e-3); }

/* Linha de negócio do herói (TASK-025) — quanto há em jogo e prazos correndo */
.kb-hero-negocio {
  font-size: var(--txt-sm); color: var(--texto-sec); margin: -6px 0 12px;
}
.kb-hero-negocio strong { color: var(--texto); font-weight: 700; }

/* ── Chips de tribunal (TASK-025) ─────────────────────────────────────── */
/* Chips + "Baixar" na MESMA linha (desenho, 05/08). */
.kb-chips-linha { display: flex; align-items: center; justify-content: space-between; gap: var(--e-3); flex-wrap: wrap; margin-bottom: var(--e-3); }
.kb-baixar-btn { background: transparent; border: 1px solid var(--borda); color: var(--texto-sec); box-shadow: none; }
.kb-baixar-btn:hover { border-color: var(--texto-sec); color: var(--texto); background: transparent; }
.kb-chips { display: flex; gap: var(--e-2); flex-wrap: wrap; }
.kb-chip {
  display: inline-flex; align-items: center; gap: var(--e-2);
  padding: 5px 11px; border-radius: var(--raio-pilula); cursor: pointer;
  background: var(--bg-card); border: 1px solid var(--borda);
  font-size: var(--txt-sm); font-weight: 600; color: var(--texto-sec);
  transition: background .12s, border-color .12s, color .12s, transform .12s;
}
.kb-chip:hover { border-color: var(--ouro); color: var(--texto); }
.kb-chip--ativo { background: var(--ouro); border-color: var(--ouro-texto); color: var(--sobre-ouro); }
.kb-chip-n {
  font-size: var(--txt-xs); font-weight: 700; padding: 1px 6px; border-radius: var(--raio-pilula);
  background: var(--cinza-claro); color: var(--texto-sec);
}
/* Derivado do texto do proprio chip, que ja vira com o tema — branco cravado
   virava branco sobre chip claro no escuro (2,24:1). */
.kb-chip--ativo .kb-chip-n { background: color-mix(in srgb, currentColor 22%, transparent); color: inherit; }

/* ── Legenda das faixas ───────────────────────────────────────────────── */
.kb-legenda {
  display: flex; align-items: center; gap: var(--e-4); flex-wrap: wrap;
  margin-bottom: var(--e-4); font-size: var(--txt-xs); color: var(--texto-sec);
}
.kb-legenda-item { display: inline-flex; align-items: center; gap: var(--e-2); }
.kb-legenda-sep { color: var(--cinza-mid); }
.kb-swatch { width: 10px; height: 10px; border-radius: var(--raio-sm); display: inline-block; }
.kb-swatch--alta   { background: var(--amarelo); }
.kb-swatch--media  { background: var(--verde); }
.kb-swatch--neutra { background: var(--cinza-mid); }
/* Badge de tribunal (TASK-036): selo sólido na cor do tribunal, medido no
   desenho — mono 9px, texto branco, raio 4px, padding 2px 6px. Era texto
   cinza, e cinza não distingue TJSP de TJSC num quadro misturado.
   O fundo vem do JS (window.corDoTribunal); aqui fica só a forma. */
.kb-trib {
  font-family: var(--fonte-mono); font-size: 9px; font-weight: 500;
  color: #fff; background: var(--neutro-meta);
  padding: 2px 6px; border-radius: 4px;
  white-space: nowrap; flex-shrink: 0; letter-spacing: .02em;
}
.kb-card-linha2 {
  font-size: var(--txt-xs); color: var(--texto-sec); line-height: 1.4; margin-bottom: var(--e-2);
  display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
}
.kb-card-meta {
  font-size: var(--txt-xs); color: var(--texto-sec); display: flex; flex-wrap: wrap; gap: var(--e-2);
}
.kb-meta-alerta { color: var(--amarelo-escuro); font-weight: 700; }
.kb-idade-meta { color: var(--texto-sec); }

/* Card como unidade de decisão (2026-07-10) — valor e "tem contato?" no card,
   e ações que dispensam abrir o Dossiê. */
.kb-card-valor { color: var(--verde-escuro); font-weight: 700; }
.kb-card-contato { color: var(--ouro-texto); font-weight: 600; }
/* Pré-classificador sem IA (Etapa 1.5, 2026-07-16) — score visível no card */
/* ── "Já vi este card" (2026-07-30) ───────────────────────────────────────
   Cinza de propósito: o código de cores do card já está ocupado (âmbar/verde
   = faixa de valor, vermelho = prazo). Aqui a diferença é de PRESENÇA — o
   olho procura o que ainda NÃO tem selo. */
.kb-card-linha1-dir { display: inline-flex; align-items: center; gap: var(--e-2); flex-shrink: 0; }
.kb-visto {
  border: 0; background: transparent; cursor: pointer; padding: 1px 5px;
  border-radius: var(--raio-pilula); font-size: var(--txt-xs); line-height: 1.6; color: var(--cinza-mid);
  transition: color .12s, background .12s; white-space: nowrap;
}
.kb-visto:hover { color: var(--texto-sec); background: var(--cinza-claro); }
.kb-visto--on {
  color: var(--texto-sec); background: var(--cinza-claro); font-weight: 600;
}
/* Card já visto recua um passo — continua legível, mas para de disputar a
   atenção com o que ainda não foi aberto. */
.kb-card--visto { opacity: .72; }
.kb-card--visto:hover { opacity: 1; }

/* Prioridade em palavra, com a COR numa bolinha (2026-07-30, decisão da
   Amanda: "poderia ser fonte diferente ali na prioridade, como um negrito e
   uma cor, tipo vermelha para alta, amarelo media, verde baixa").

   As três cores que ela pediu já têm dono no card (vermelho = prazo, âmbar =
   bem ≥ R$ 1 mi, verde = bem ≥ R$ 300 mil — BUSINESS_RULES 6.3). Pintar o
   TEXTO faria verde significar "bem valioso" num canto e "prioridade baixa"
   no outro. Isolando a cor num marcador redondo, as duas escalas convivem:
   cor de texto = valor; bolinha = prioridade. O texto fica escuro e em
   negrito — a "fonte diferente" que ela também pediu. */
.kb-card-prescore {
  display: inline-flex; align-items: center; gap: var(--e-2);
  color: var(--texto); font-weight: 700; cursor: help;
}
.kb-prio-bola {
  width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0;
  background: var(--cinza); display: inline-block;
}
.kb-prio--alta  .kb-prio-bola { background: var(--vermelho); }
.kb-prio--media .kb-prio-bola { background: var(--amarelo); }
.kb-prio--baixa .kb-prio-bola { background: var(--verde); }
/* Baixa não precisa gritar: mesma bolinha, texto um passo atrás. */
.kb-prio--baixa { color: var(--texto-sec); font-weight: 600; }
/* Potencial econômico do bem, sem IA (2026-07-16) — selo compacto no card */
.kb-card-potencial { font-weight: 700; cursor: help; }
.kb-card-potencial--bom { color: var(--verde-escuro); }
.kb-card-potencial--medio { color: var(--amarelo-escuro); }
.kb-card-potencial--baixo { color: var(--vermelho); }
.kb-card-acoes { display: flex; gap: var(--e-2); margin-top: var(--e-3); }
/* Botões do card em PÍLULA outline, como o desenho (05/08). */
.kb-card-btn {
  flex: 1; font-family: inherit; font-size: var(--txt-xs); font-weight: 600; cursor: pointer;
  padding: 5px 10px; border-radius: var(--raio-pilula); border: 1px solid var(--borda);
  background: transparent; color: var(--texto-sec); transition: background .12s, border-color .12s, color .12s, transform .12s;
}
/* Título do card: a VARA, em Epilogue na tinta. */
.kb-card-titulo {
  font-family: var(--fonte-titulo); font-weight: 700; font-size: var(--txt-sm);
  color: var(--tinta); line-height: 1.3; min-width: 0;
}
.kb-card-btn:hover { background: var(--ouro-clara); border-color: var(--ouro); color: var(--ouro-texto-forte); }

/* Resumo da coluna — estado da etapa em uma linha, sob o cabeçalho. */
.kb-col-resumo {
  font-size: var(--txt-xs); color: var(--texto-sec); padding: 0 12px 8px; margin-top: -4px;
  border-bottom: 1px solid var(--borda);
}

.kb-grupo { display: flex; flex-direction: column; gap: var(--e-3); margin-bottom: var(--e-2); }
.kb-grupo:not(:first-child) { margin-top: var(--e-3); padding-top: var(--e-3); border-top: 1px dashed var(--borda); }
.kb-grupo-titulo {
  display: flex; align-items: center; gap: var(--e-2);
  font-size: var(--txt-xs); font-weight: 700; color: var(--texto-sec);
}
.kb-grupo-sub { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: -4px; opacity: .85; }

/* Bloco "Esquecidos" — o que ficou parado +1 mês. Era uma banda âmbar no TOPO
   de "Novo" até 2026-07-30; por decisão da Amanda ("os novos é que deveriam
   aparecer em primeiro") virou bloco recolhido no FIM, reusando o padrão
   .kb-fora do "Resto da fila". Fica só o tom âmbar no cabeçalho, para
   continuar legível como aviso sem disputar a atenção do trabalho do dia. */
.kb-fora-esquecidos .kb-fora-cabecalho {
  color: var(--amarelo-escuro);
  background: var(--amarelo-claro);
  border-color: color-mix(in srgb, var(--amarelo) 32%, transparent);
}

/* Grupo recolhido "Fora do monitoramento" (TASK-023) — fica no rodapé do
   quadro, abaixo das colunas. Cinza de propósito: é dado arquivado, não pode
   competir por atenção com as colunas de trabalho. Primeiro padrão recolhível
   do Kanban; se surgir um segundo, extrair daqui em vez de duplicar. */
.kb-fora { margin-top: var(--e-2); border: 1px dashed var(--borda); border-radius: var(--raio); background: var(--fundo-sec, var(--bg)); }
.kb-fora-cabecalho {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e-3);
  width: 100%; padding: 10px 14px; background: none; border: 0; cursor: pointer;
  font-size: var(--txt-sm); font-weight: 700; color: var(--texto-sec); text-align: left;
}
.kb-fora-cabecalho:hover { color: var(--texto); }
.kb-fora-dica { font-size: var(--txt-xs); font-weight: 500; opacity: .8; }
.kb-fora-texto { font-size: var(--txt-sm); color: var(--texto-sec); padding: 0 14px 10px; margin: 0; max-width: 70ch; }
.kb-fora-linha {
  display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap;
  padding: 8px 14px; border-top: 1px solid var(--borda);
}
.kb-fora-trib { font-size: var(--txt-sm); font-weight: 700; }
.kb-fora-n { font-size: var(--txt-sm); color: var(--texto-sec); flex: 1; }

/* Destaque temporário ao focar um grupo a partir do mini-herói do Kanban —
   reaproveita a mesma animação já usada pelo card herói do Relatório do dia. */
.kb-destaque-pulso { animation: relHeroPulso 1.6s ease-out; border-radius: var(--raio); }

/* ── Tarefas estilo Todoist ──────────────────────────────────────────── */
.td-list { display: flex; flex-direction: column; }
.td-item {
  display: flex; align-items: flex-start; gap: var(--e-3);
  padding: 12px 8px; border-bottom: 1px solid var(--borda); position: relative;
  transition: background .12s;
}
.td-item:hover { background: rgba(0,0,0,.02); }
.td-check {
  width: 19px; height: 19px; border: 1.5px solid var(--cinza); border-radius: 50%;
  flex-shrink: 0; margin-top: var(--e-1); cursor: pointer; background: var(--bg-card);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: var(--txt-xs); transition: all .15s;
}
.td-check:hover { border-color: var(--verde); background: var(--verde-claro); }
.td-check.done { background: var(--verde); border-color: var(--verde); }
.td-check.andamento { border-color: var(--amarelo); }
.td-body { flex: 1; min-width: 0; }
/* Usava `--sidebar-bg` como cor de TEXTO (era o grafite). Com a sidebar clara
   passou a apontar para a tinta do desenho, que é o papel que exercia. */
.td-titulo { font-size: var(--txt-md); color: var(--tinta); line-height: 1.4; font-weight: 500; }
.td-item.concluida .td-titulo { text-decoration: line-through; color: var(--cinza); font-weight: 400; }
.td-desc { font-size: var(--txt-sm); color: var(--texto-sec); margin-top: var(--e-1); white-space: pre-line; }
.td-meta { display: flex; flex-wrap: wrap; gap: var(--e-3); align-items: center; margin-top: var(--e-2); font-size: var(--txt-sm); color: var(--texto-sec); }
.td-prazo { display: inline-flex; align-items: center; gap: var(--e-1); }
.td-prazo.urgente { color: var(--amarelo); font-weight: 600; }
.td-prazo.vencido { color: var(--vermelho); font-weight: 600; }
.td-tag { font-size: var(--txt-xs); padding: 1px 8px; border-radius: var(--raio); background: var(--cinza-claro, var(--borda)); color: var(--cinza, var(--texto-sec)); }
.td-acoes { display: flex; gap: var(--e-3); opacity: 0; transition: opacity .15s; margin-left: auto; }
.td-item:hover .td-acoes { opacity: 1; }
.td-acoes a { cursor: pointer; color: var(--texto-sec); font-size: var(--txt-sm); white-space: nowrap; }
.td-acoes a:hover { color: var(--ouro-texto); }


/* Busca geral do Ranking (2026-07-28) — resultados de leiloeiro/vara/cidade
   acima da lista de estados. Rótulo discreto: quem digitou já sabe o que
   procurou, o que precisa de destaque é o resultado. */
.mapa-busca-rotulo {
  font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .4px;
  color: var(--texto-sec); margin: 0 0 8px;
}
.mapa-busca-lista { margin-bottom: var(--e-5); }

/* ── Notícias do mercado — "Hoje no mercado" (redesenho editorial 2026-07-28)
   Segunda iteração no mesmo dia: a primeira, de cartões com pílula colorida
   e borda colorida, foi reprovada ("precisa ficar mais clean, mais
   profissional"). Regras do desenho atual:
   1. A cor mora em DOIS lugares — kicker da manchete e deltas. Todo o resto
      é preto/cinza/branco: a página lê como jornal de negócios, e as duas
      cores que sobram voltam a significar algo.
   2. Tipografia faz a hierarquia (22px → 13.5px → 11px), não caixas.
   3. Sem emoji dentro do feed, sem pílula, sem texto tachado.
   4. Listas agrupadas por tipo, com números tabulares alinhados à direita. */
.not-hero { padding: 4px 0 22px; border-bottom: 1px solid var(--borda); margin-bottom: var(--e-6); }
.not-kicker { font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .09em; margin-bottom: var(--e-3); }
.not-kicker--ouro { color: var(--ouro-texto); }
.not-kicker--verde { color: var(--verde); }
.not-kicker--ambar { color: var(--amarelo); }
.not-kicker--neutro { color: var(--texto-sec); }
.not-hero-t { font-size: var(--txt-xl); font-weight: 800; letter-spacing: -.4px; line-height: 1.3; color: var(--texto); max-width: 34ch; margin: 0; }
.not-hero-t--vazio { font-size: var(--txt-lg); font-weight: 700; color: var(--texto-sec); }
.not-hero-i { font-size: var(--txt-md); color: var(--texto); margin-top: var(--e-3); max-width: 60ch; }
.not-hero-d { font-size: var(--txt-sm); color: var(--texto-sec); margin-top: var(--e-2); }

.not-sec { font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .09em; color: var(--texto-sec); margin: 0 0 14px; }
.not-grupo-t { font-size: var(--txt-sm); font-weight: 700; color: var(--texto); margin-bottom: var(--e-3); }
/* Badge de UF (TASK-036): mesmo formato do selo de tribunal do Kanban —
   mono 9px, texto branco, raio 4px. O fundo vem do JS (window.corDaUf);
   aqui só a forma, para não nascer uma segunda tabela de cor. */
.uf-badge {
  display: inline-block; font-family: var(--fonte-mono); font-size: 9px;
  font-weight: 500; color: #fff; background: var(--neutro-meta);
  padding: 2px 6px; border-radius: 4px; letter-spacing: .02em;
  vertical-align: 1px;
}

/* Números tabulares: as colunas de "3 → 10 +7" alinham entre linhas, o que
   transforma a lista num mini-gráfico legível de cima a baixo. */
.not-num { font-size: var(--txt-sm); color: var(--texto-sec); white-space: nowrap; font-variant-numeric: tabular-nums; }
.not-num strong { color: var(--texto); font-weight: 700; }
.not-num-seta { opacity: .55; }
.not-delta { font-weight: 700; margin-left: var(--e-2); font-variant-numeric: tabular-nums; }
.not-delta--verde { color: var(--verde); }
/* Texto âmbar usa o tom escuro: o âmbar puro não passa contraste em corpo 13px. */
.not-delta--ambar { color: var(--amarelo-escuro); }

.not-nacional { margin-top: var(--e-6); padding-top: var(--e-6); border-top: 1px solid var(--borda); }
.not-corte { font-size: var(--txt-xs); color: var(--texto-sec); border-top: 1px solid var(--borda); margin-top: var(--e-6); padding-top: var(--e-4); max-width: 78ch; }

/* Interatividade das notícias (2026-07-28) — cada item é uma porta. O chevron
   "›" é a única pista visual permanente (funciona no toque, onde hover não
   existe); o hover reforça no desktop. Nada disso adiciona cor: interação se
   sinaliza por forma e resposta, não por mais tinta. */
.not-chev { font-size: var(--txt-md); color: var(--texto-sec); opacity: .55; }
.not-nome-link { cursor: pointer; }
.not-nome-link:hover { text-decoration: underline; }
.not-cta { display: inline-block; margin-top: var(--e-4); font-size: var(--txt-sm); font-weight: 700; text-decoration: none; }
.not-cta:hover { text-decoration: underline; }
.not-cta--ouro { color: var(--ouro-texto); }
.not-cta--verde { color: var(--verde); }
.not-cta--ambar { color: var(--amarelo-escuro); }

/* Terceira revisão (2026-07-28, "está muito solta as informações"): coluna
   única com largura de leitura — a página se lê de cima a baixo como
   newsletter, não se varre como dashboard. O pulso dá a régua do dia antes
   da primeira notícia; as frases de abertura (.not-intro) costuram cada
   seção à sua tabela. */
.not-col { max-width: 760px; }
/* Pulso como CARDS DE KPI (TASK-036, passo 3): o desenho do Figma usa cartão
   branco com borda superior de 2.4px na cor do indicador — dourado no herói,
   laranja e azul nos dois de contexto — número grande em Epilogue e rótulo
   mono embaixo. A versão anterior (TASK-033) agrupava por proximidade, sem
   caixa; o desenho decide por caixa, e a régua agora é o desenho. */
/* ── ESCOPO no lugar do ticker (v2, 09/08) ────────────────────────────────
   O ticker rolava estado, cidade e métrica sem rótulo. Aqui o recorte é dito
   numa linha e os estados aparecem com a cor real do tribunal. */
.not-escopo {
  display: flex; align-items: center; gap: var(--e-2); flex-wrap: wrap;
  margin-bottom: var(--e-2);
}
.not-escopo-k {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texto-sec);
}
.not-escopo-vazio { font-size: var(--txt-xs); color: var(--neutro-meta); }

/* ── KPIs SEM CARD (v2, 09/08) ────────────────────────────────────────────
   Eram três caixas brancas com borda superior colorida. Card é moldura, e
   três molduras lado a lado competem; sem elas, o que separa os números é o
   espaço e um fio fino, e a linha se lê de uma vez.
   O herói continua sendo o primeiro — pela posição e pelo delta, não por uma
   borda dourada. */
.not-pulso {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px;
  padding: 0 0 18px; margin-bottom: var(--e-5); border-bottom: 1px solid var(--borda);
}
.not-pulso-item {
  min-width: 0;
  border-left: 2px solid rgba(26, 22, 20, .18);
  padding-left: 18px;
  /* Coluna flex para o link-âncora poder colar no rodapé (`margin-top:auto`):
     os três rótulos têm alturas diferentes e, sem isso, cada link pousaria
     numa linha distinta — três âncoras desalinhadas leem-se como três coisas
     diferentes, não como a mesma affordance repetida. */
  display: flex; flex-direction: column; align-items: flex-start;
}
.not-pulso-n { font-family: var(--fonte-titulo); font-size: 38px; font-weight: 600; letter-spacing: -.02em; color: var(--tinta); line-height: 1; font-variant-numeric: tabular-nums; }
.not-pulso-n .not-delta, .heroi .not-delta { font-size: var(--txt-sm); margin-left: var(--e-2); }
/* Rótulo do KPI em mono caixa alta.
   --texto-sec, e NÃO o --neutro-menu que o protótipo pede: este bloco vive na
   MESA (a folha é branca, mas o pulso perdeu o card), e ali o --neutro-menu
   mede 3,50:1. Mesma armadilha da lista de estados — token é aprovado contra
   uma superfície, não em abstrato. --texto-sec dá 5,40:1. */
.not-pulso-l {
  font-family: var(--fonte-mono); font-size: 10.5px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texto-sec);
  margin-top: 8px; max-width: 26ch;
}
/* Âncora do KPI para a seção que o detalha.
   O handoff pede o link em #847049 (= --ouro-texto). Medido: sobre a MESA
   (#E4DCCE), onde esta faixa vive, ele dá 3,51:1 — reprova AA para 12,5px.
   O 4,5:1 do desenho valia contra o card branco do protótipo (4,78:1).
   Fica --ouro-texto-forte, 4,99:1 sobre a mesa: mesmo dourado, mesma
   intenção, legível na superfície onde o link realmente está.
   Terceira vez que esta armadilha aparece no projeto — token se aprova
   contra uma superfície, nunca no abstrato (DESIGN_SYSTEM). */
.not-pulso-link {
  font-size: 12.5px; font-weight: 600; color: var(--ouro-texto-forte);
  text-decoration: none; margin-top: auto; padding-top: 12px;
}
.not-pulso-link:hover { text-decoration: underline; }

/* ── HERÓI EM TINTA (v2, 09/08) ───────────────────────────────────────────
   Era a faixa dourada da TASK-042. Sobre dourado TODO texto tem de ser tinta
   (branco dá 2,24:1), então não havia como criar um segundo nível de destaque
   dentro dela. Invertendo a superfície, o dourado volta a ser acento: kicker
   e movimento a 8,01:1 sobre a tinta, título a 15,39:1.
   Medido: título 15,39 · kicker/movimento 8,01 · subtítulo verde 6,80 ·
   texto do CTA sobre o dourado 8,01. */
.not-heroi {
  display: flex; align-items: center; justify-content: space-between;
  gap: 24px; flex-wrap: wrap;
  background: var(--inverso-bg); color: var(--inverso-texto);
  border-radius: var(--raio); padding: 22px 26px; margin-bottom: var(--e-6);
}
.not-heroi-txt { min-width: 0; flex: 1 1 320px; }
.not-heroi-k {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase;
  /* --ouro-inverso, não --ouro: este texto vive SOBRE a superfície
     invertida, que clareia no tema escuro. Com o dourado fixo dava 1,93:1. */
  color: var(--ouro-inverso); margin-bottom: 8px;
}
.not-heroi-t {
  font-family: var(--fonte-titulo); font-size: 21px; font-weight: 600;
  line-height: 1.35; max-width: 30ch; letter-spacing: -.01em; margin: 0;
}
.not-heroi-i { font-size: var(--txt-sm); margin-top: 6px; opacity: .82; line-height: 1.5; }
.not-heroi-dir { display: flex; align-items: center; gap: 28px; flex-shrink: 0; flex-wrap: wrap; }
.not-heroi-mov { text-align: right; }
.not-heroi-num {
  font-family: var(--fonte-mono); font-size: 26px; font-weight: 700;
  color: var(--ouro-inverso); white-space: nowrap;
}
/* Verde clareado para viver sobre a tinta — o --verde do produto foi medido
   contra card branco e aqui daria 2,4:1. */
/* O verde também vive sobre a superfície invertida: cravado em #7FA98A ele
   funcionava sobre a tinta e sumia sobre o creme do tema escuro (2,27:1).
   `--verde-inverso` é o par que vira junto, como o --ouro-inverso. */
.not-heroi-sub { font-family: var(--fonte-mono); font-size: 11px; color: var(--verde-inverso); margin-top: 4px; }
/* O CTA é o único elemento CLARO sobre a tinta — é ele o alvo do clique.
   Fundo dourado com texto tinta: 8,01:1, o par fechado na TASK-039. */
.not-heroi .not-cta {
  flex: 0 0 auto; margin-top: 0;
  background: var(--ouro); color: var(--sobre-ouro);
  border-radius: var(--raio-sm); padding: 10px 18px;
  font-size: var(--txt-sm); font-weight: 600;
  text-decoration: none; white-space: nowrap;
}
.not-heroi .not-cta:hover { background: var(--ouro-escuro); text-decoration: none; }
.not-heroi .not-cta:active { transform: scale(0.98); }
.not-heroi .not-cta:focus-visible { outline: 2px solid var(--ouro-clara); outline-offset: 3px; }

/* ══ HOJE NO MERCADO v2 — GRUPOS LADO A LADO E LISTAS EM GRADE ═════════════
   Aprovado por preview em 09/08, portado do `.dc.html` bloco a bloco.

   Duas mudanças de fundo em relação ao formato "newsletter" de julho:

   1. A FOLHA BRANCA SAIU. A tela inteira vivia dentro de um `.not-folha`
      (uma folha só, com sombra). Agora cada bloco é um cartão próprio sobre a
      mesa — é o que permite pôr dois lado a lado sem parecer que a folha foi
      cortada ao meio.
   2. COLUNA ÚNICA VIROU DUAS (decisão da Amanda, 09/08, revertendo a de
      28/07). O argumento de julho era "ritmo de newsletter"; o que mudou é
      que a tela cresceu muito desde então, e rolagem longa também cansa.

   As listas deixaram de ser texto por extenso ("66 nomeações / ▲ subiu 50") e
   viraram GRADE: nome | antes → depois | Δ. O número em mono, alinhado à
   direita, é o que permite comparar linhas de relance — que é o que a tela
   pede. A sparkline saiu: no desenho ela não existe, e disputava espaço com
   o dado. */
.not-g2   { display: grid; grid-template-columns: 1fr 1.15fr; gap: var(--e-3); margin-bottom: var(--e-3); }
.not-g2--igual { grid-template-columns: 1fr 1fr; }
.not-cartao {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 20px 22px;
}
.not-cartao-t { font-family: var(--fonte-titulo); font-size: 16px; font-weight: 600; margin: 0 0 2px; }
.not-cartao-s { font-size: 12.5px; color: var(--texto-sec); margin-bottom: 12px; }
/* Micro-rótulo de bloco: mono caixa alta. Dentro do cartão branco o
   --neutro-menu mede 4,77:1 e passa — na MESA ele daria 3,50 (ver a seção
   "Superfície importa"). Estes rótulos só existem dentro de cartão. */
.not-rot2 {
  font-family: var(--fonte-mono); font-size: 10.5px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--neutro-menu);
  margin: 16px 0 6px;
}
.not-rot2:first-of-type { margin-top: 0; }

/* Pílula de variação — verde sobe, vermelho cai. A seta acompanha a cor
   SEMPRE: cor sozinha não serve a quem não distingue verde de vermelho. */
.not-pill {
  font-size: 13px; font-weight: 600; padding: 2px 9px; border-radius: var(--raio-pilula);
  white-space: nowrap; font-variant-numeric: tabular-nums;
}
.not-pill--sobe { color: var(--verde-escuro);    background: var(--verde-claro); }
.not-pill--cai  { color: var(--vermelho-escuro); background: var(--vermelho-claro); }

/* Linha simples (estados): badge + nome ....... número + pílula */
.not-l {
  display: grid; grid-template-columns: minmax(0, 1fr) 70px 64px;
  align-items: center; gap: 10px; padding: 9px 0;
  border-bottom: 1px solid var(--cinza-claro);
}
.not-l:last-child { border-bottom: 0; }
.not-l--link { cursor: pointer; }
.not-l--link:hover { background: var(--ouro-fraco); }
.not-l-nome { display: flex; align-items: center; gap: 10px; min-width: 0; }
.not-l-nome .t { font-size: 13.5px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.not-l-num { font-family: var(--fonte-mono); font-size: 13px; font-weight: 500; text-align: right; font-variant-numeric: tabular-nums; }

/* Cabeçalho de colunas — decodifica a linha, como na lista de estados da
   Inteligência. Compartilha a grade com `.not-l2` de propósito. */
.not-cab, .not-l2 { display: grid; grid-template-columns: minmax(0, 1fr) 82px 60px; gap: 10px; }
.not-cab {
  padding-bottom: 6px; border-bottom: 1px solid var(--borda);
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--neutro-menu);
}
.not-cab > :nth-child(2), .not-cab > :nth-child(3) { text-align: right; }
.not-l2 { align-items: center; padding: 10px 0; border-bottom: 1px solid var(--cinza-claro); }
.not-l2:last-child { border-bottom: 0; }
.not-l2--link { cursor: pointer; }
.not-l2--link:hover { background: var(--ouro-fraco); }
.not-l2-topo { display: flex; align-items: center; gap: 8px; }
.not-l2-nome { font-size: 13.5px; font-weight: 600; }
/* A LEITURA da linha — uma frase curta derivada do próprio número (maior
   salto, maior queda, todas novas...). Nunca texto inventado: se não houver
   fato que a sustente, a linha fica sem frase. */
.not-l2-leitura { font-size: 12px; color: var(--texto-sec); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.not-l2-mov { font-family: var(--fonte-mono); font-size: 13px; font-weight: 500; text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }

/* Credenciamentos: o PRAZO é o dado que decide, então vira pílula à direita.
   Vermelho aqui é urgência de prazo — o único uso permitido no produto. */
.not-cred { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--cinza-claro); }
.not-cred:last-child { border-bottom: 0; }
.not-cred--link { cursor: pointer; }
.not-cred--link:hover { background: var(--ouro-fraco); }
.not-cred-o { font-size: 14px; font-weight: 600; }
.not-cred-m { font-family: var(--fonte-mono); font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--neutro-menu); margin-top: 3px; }
.not-prazo { font-family: var(--fonte-mono); font-size: 11.5px; font-weight: 500; padding: 4px 11px; border-radius: var(--raio-pilula); white-space: nowrap; }
.not-prazo--urgente { background: var(--vermelho-claro); color: var(--vermelho-escuro); }
.not-prazo--atencao { background: var(--ouro-clara);     color: var(--ouro-texto-forte); }
.not-prazo--neutro  { background: var(--cinza-claro);    color: var(--texto-sec); }

/* Trocas de dominante: quem entrou em negrito, quem saiu em secundário, e o
   selo do tribunal + vara em mono — o caminho identifica a vara, e sem ele
   quinze "2ª Vara Cível" são indistinguíveis. */
.not-troca { padding: 12px 0; border-bottom: 1px solid var(--cinza-claro); }
.not-troca:last-child { border-bottom: 0; }
.not-troca--link { cursor: pointer; }
.not-troca--link:hover { background: var(--ouro-fraco); }
.not-troca-t { font-size: 13.5px; line-height: 1.5; }
.not-troca-t .de { color: var(--texto-sec); }
.not-troca-m { display: flex; align-items: center; gap: 8px; margin-top: 6px; flex-wrap: wrap; }
.not-troca-vara { font-family: var(--fonte-mono); font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--neutro-menu); }

.not-giro-sub { font-size: 12.5px; color: var(--texto-sec); margin-bottom: 12px; }
.not-giro-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 32px; }

@media (max-width: 780px) {
  .not-g2, .not-giro-grid { grid-template-columns: 1fr; }
}
@media (max-width: 720px) {
  .not-pulso { grid-template-columns: 1fr; gap: var(--e-4); }
  .not-heroi-dir { width: 100%; justify-content: space-between; }
  .not-heroi-mov { text-align: left; }
}
.not-intro { font-size: var(--txt-sm); color: var(--texto); margin: 0 0 10px; max-width: 62ch; line-height: 1.5; }
.not-grupo { margin-bottom: var(--e-6); }
.not-grupo-t { font-size: var(--txt-md); font-weight: 800; letter-spacing: -.2px; color: var(--texto); margin-bottom: var(--e-2); }
/* ASSINATURA VENCIDA (2026-09-01) — tela cheia, e não modal com "×".
   Não há o que fechar: enquanto a assinatura não voltar, não existe produto
   atrás dela. Um modal fechável convidaria a pessoa a fechar e concluir que o
   sistema está quebrado.
   Usa os tokens do produto (não os da vitrine), porque aparece DENTRO do
   painel — quem chega aqui já está logado. */
.assinatura-bloqueio {
  position: fixed; inset: 0; z-index: 100;
  background: var(--bg); display: flex; align-items: center; justify-content: center;
  padding: var(--e-5); overflow-y: auto;
}
.assinatura-caixa {
  max-width: 520px; background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: var(--e-6);
}
.assinatura-caixa h2 { font-size: var(--txt-xl); font-weight: 700; margin: var(--e-2) 0 var(--e-4); }
.assinatura-caixa p { font-size: var(--txt-sm); line-height: 1.65; color: var(--texto); margin-bottom: var(--e-3); }
/* A frase que tira o medo de ter perdido o trabalho ganha peso próprio: é a
   primeira coisa que a pessoa procura ao ver um bloqueio. */
.assinatura-calma {
  background: var(--cinza-claro); border-radius: var(--raio-sm);
  padding: var(--e-3) var(--e-4); color: var(--texto-sec) !important;
}
.assinatura-acoes { display: flex; gap: var(--e-3); flex-wrap: wrap; margin: var(--e-5) 0 var(--e-4); }
.assinatura-rodape { font-size: var(--txt-xs) !important; color: var(--texto-sec) !important; margin: 0 !important; }
.assinatura-rodape a { color: var(--ouro-texto-forte); }
@media (max-width: 680px) {
  .assinatura-caixa { padding: var(--e-5); }
  .assinatura-acoes .btn { flex: 1; justify-content: center; }
}

/* CONTAS E PLANOS (TASK-055 fatia 3). `.not-row` não tem estilo nenhum no CSS
   — é bloco puro —, então a ação da direita caía na linha de baixo e passava a
   ler como parte da conta seguinte. Medido no navegador. Classe PRÓPRIA, e não
   um estilo em `.not-row`, para não mexer no bloco vizinho (gasto de IA por
   conta), que é do mesmo desenho e não está com defeito. */
.planos-row {
  display: flex; align-items: flex-start; gap: var(--e-3);
  padding: 8px 0; border-bottom: 1px solid var(--borda);
}
.planos-row:last-child { border-bottom: 0; }
.planos-row .not-row-main { flex: 1; min-width: 0; }
.planos-row .not-row-fim { flex-shrink: 0; white-space: nowrap; }
.planos-hist { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: 2px; }

.not-estados { font-size: var(--txt-sm); color: var(--texto-sec); margin-top: var(--e-4); line-height: 2; }
.not-estado-chip { cursor: pointer; color: var(--texto); font-weight: 600; white-space: nowrap; }
.not-estado-chip:hover { text-decoration: underline; }

/* Quarta revisão (2026-07-28) — cara de newsletter, pedido da Amanda:
   FOLHA BRANCA centralizada (a newsletter em cima da mesa), Epilogue (era Lora ate a TASK-036)
   na saudação, manchete e títulos de seção — a tipografia que separa jornal
   de sistema —, emojis de volta nos títulos (decisão da dona do produto,
   revertendo a regra da 2ª iteração) e a bandeira oficial dos estados como
   imagem. Corpo e números continuam em Inter: dado tabular pede sans. */

/* ── Sparkline (TASK-026) ─────────────────────────────────────────────────
   Forma, não leitura fina: sem eixo e sem rótulo. A cor descreve o próprio
   desenho (compara a 2ª metade da série com a 1ª). */

/* ── Carimbo de frescor (TASK-026) ────────────────────────────────────── */
.not-frescor {
  display: inline-flex; align-items: center; gap: var(--e-2); margin-top: var(--e-3);
  font-size: var(--txt-xs); color: var(--texto-sec);
}
.not-frescor-bola {
  width: 6px; height: 6px; border-radius: 50%; background: var(--verde);
  display: inline-block; flex-shrink: 0;
}
/* Dado de outro dia: âmbar. Não é erro (a captura pode não ter rodado ainda),
   mas a usuária precisa saber que não está lendo o mercado de hoje. */
.not-frescor--velho { color: var(--amarelo-escuro); }
.not-frescor--velho .not-frescor-bola { background: var(--amarelo); }

.not-masthead { padding-bottom: var(--e-5); margin-bottom: var(--e-5); border-bottom: 2px solid var(--texto); }
.not-masthead-d { font-size: var(--txt-sm); color: var(--texto-sec); margin-top: var(--e-2); }
/* Dentro da folha, as tabelas ficam mais quietas: a folha já é o cartão. */


/* Número que se lê como frase (2026-07-28, terceira tentativa no formato —
   Amanda: "ainda está ruim de entender"). Aprendizado: SÍMBOLO NÃO EXPLICA,
   nem "9 → 17" nem "+8". A linha virou frase em miniatura: o número com a
   unidade escrita e a variação com verbo ("▲ subiu 8" / "▼ caiu 6"). */

/* Barras do dia a dia (2026-07-28) — "quanto de nomeações diárias teve nos
   estados configurados". Barra = volume do dia, número em cima, dia embaixo,
   HOJE em azul. Sem biblioteca de gráfico: flexbox resolve. */
.not-dias { display: flex; align-items: flex-end; gap: var(--e-2); padding: 4px 2px 0; }
.not-dia { flex: 1; display: flex; flex-direction: column; align-items: center; gap: var(--e-2); min-width: 0; }
.not-dia-n { font-size: var(--txt-xs); font-weight: 700; color: var(--texto); font-variant-numeric: tabular-nums; }
/* POLARIDADE CORRIGIDA (handoff "Auditoria de Design", item 2, 10/08).
   A barra comum era `--cinza-mid` (#E4DFD8) sobre a mesa (#E4DCCE): 1,03:1 de
   diferença, ou seja, invisível — o gráfico existia e ninguém via. E o
   dourado, o acento mais forte da paleta, estava gasto no dia de HOJE, que é
   justamente o dado incompleto (fecha só às 6h30).
   Agora: série em dourado, hoje em tinta. `--tinta` inverte no tema escuro
   (#1A1614 → #F7F3EC), então a barra de hoje continua sendo a que destoa
   das outras nos dois temas — que é o único trabalho dela. */
.not-dia-bar { width: 100%; max-width: 34px; background: var(--ouro); border-radius: var(--raio-sm) 4px 0 0; }
.not-dia--hoje .not-dia-bar { background: var(--tinta); }
.not-dia--hoje .not-dia-l { color: var(--tinta); font-weight: 700; }
.not-dia-l { font-size: var(--txt-xs); color: var(--texto-sec); white-space: nowrap; }

/* Área de 30 dias (2026-07-30) — na janela longa a barra vira serrilhado e o
   olho perde a trajetória. Aqui só três números: pico, média e hoje. Ver a
   nota de _notAreaDiaria em painel.js para o porquê da interpolação do fim
   de semana. */
.not-area-resumo {
  font-size: var(--txt-sm); font-weight: 600; color: var(--texto-sec);
  font-variant-numeric: tabular-nums; margin: 2px 0 6px;
}
.not-area { display: block; overflow: visible; }
.not-area-g0 { stop-color: var(--ouro-texto); stop-opacity: .22; }
.not-area-g1 { stop-color: var(--ouro-texto); stop-opacity: .02; }
.not-area-linha { stroke: var(--ouro-texto); }
.not-area-media { stroke: var(--texto-sec); stroke-width: 1; stroke-dasharray: 4 4; opacity: .65; }
.not-area-pt-hoje { fill: var(--ouro-texto); }
/* Único texto dentro do gráfico: o rótulo "média" na ponta da tracejada.
   Número, nenhum — todos moram na linha de resumo acima (2026-07-30). */
.not-area-n { font-size: var(--txt-xs); font-weight: 700; }
.not-area-n--media { fill: var(--texto-sec); font-weight: 600; font-size: var(--txt-xs); }
.not-area-x { font-size: var(--txt-xs); fill: var(--texto-sec); }
.not-area-x--hoje { fill: var(--ouro-texto); font-weight: 700; }

/* Esteira de Licitações (TASK-027, 2026-07-30) — três etapas lado a lado, o
   mesmo formato de board já usado no Kanban. A diferença que importa: aqui
   NÃO há arrastar-e-soltar, a transição é por botão de veredito. É mais
   explícito, funciona no celular e não deixa dúvida sobre o que aconteceu. */
/* ── CABEÇALHO DA TRIAGEM (2026-08-19) ──────────────────────────────────────
   Eram três blocos empilhados em largura inteira — faixa da carteira, herói
   solto, e uma linha com recorte + carimbo + Atualizar amontoados. Vira duas
   colunas: à esquerda o que a tela responde, à direita a única pendência.
   O carimbo e o "Atualizar" sobem para a barra de topo, onde ela já os
   procura no "Hoje no mercado". */
.lic-topo {
  display: flex; justify-content: space-between; align-items: center;
  gap: var(--e-3); flex-wrap: wrap; margin-bottom: var(--e-3);
}
.lic-topo-acoes { display: flex; align-items: center; gap: var(--e-3); margin-left: auto; }
.lic-cabecalho {
  display: flex; justify-content: space-between; align-items: flex-start;
  gap: 32px; flex-wrap: wrap; margin-bottom: var(--e-4);
}
.lic-cab-esq { flex: 1 1 340px; min-width: 260px; }
/* Herói + a janela na mesma respiração: "15" sozinho não diz de quanto tempo. */
.lic-heroi { display: flex; align-items: center; gap: var(--e-3); }
.lic-heroi-rot {
  font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.35; max-width: 220px;
}
/* Carteira vazia: card compacto, não faixa. É UMA pendência, não o assunto. */
.lic-carteira {
  flex: 0 1 330px; max-width: 330px;
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: var(--e-4);
}
.lic-carteira-t { font-size: var(--txt-sm); font-weight: 700; line-height: 1.35; }
.lic-carteira-p { font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.45; margin-top: var(--e-2); }
.lic-carteira-a { display: inline-block; margin-top: var(--e-3); font-size: var(--txt-sm); font-weight: 600; color: var(--ouro-texto-forte); cursor: pointer; }

/* Fio que separa o cabeçalho dos filtros — o mesmo papel do fio do Kanban. */
.lic-filtros {
  display: flex; align-items: center; gap: var(--e-2); flex-wrap: wrap;
  border-top: 1px solid var(--borda); padding-top: var(--e-3); margin-bottom: var(--e-4);
}
.lic-filtros:empty { border-top: 0; padding-top: 0; margin-bottom: 0; }
.lic-filtros-k {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase; color: var(--texto-sec);
  margin-right: var(--e-2);
}
.lic-chip {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--txt-sm); font-weight: 600; color: var(--texto);
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: 999px; padding: 4px 12px; cursor: pointer; line-height: 1.4;
}
.lic-chip:hover { border-color: var(--neutro-meta); }
/* Ativo = tinta cheia. Usa --texto/--bg-card e não uma cor fixa: no tema
   escuro os dois invertem juntos e o chip continua legível sem regra à parte. */
.lic-chip--on { background: var(--texto); border-color: var(--texto); color: var(--bg-card); }
.lic-chip-cor { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; }
.lic-chip-n { font-weight: 700; opacity: .75; }
/* Ordenação: controle discreto no cabeçalho da coluna — não compete com o
   título dela. Nunca persiste (ver _licOrdem em licitacoes.js). */
.lic-ordem {
  font-size: var(--txt-xs); color: var(--texto-sec); font-weight: 600;
  background: transparent; border: 1px solid var(--borda); border-radius: var(--raio-sm);
  padding: 2px 4px; cursor: pointer;
  /* `flex:0 0 auto` porque o cabeçalho da coluna é flex: sem isto o select
     esticava para 283px de uma coluna de 377 e jogava "Novas — triar" para
     duas linhas (medido no navegador, 19/08). */
  flex: 0 0 auto; max-width: 96px;
}
.lic-col-t > span:first-child { white-space: nowrap; }

.lic-esteira { display: flex; gap: var(--e-5); align-items: flex-start; overflow-x: auto; padding-bottom: var(--e-4); }
.lic-col { flex: 1 1 300px; min-width: 280px; }
.lic-col-t {
  font-weight: 700; font-size: var(--txt-sm); padding-bottom: var(--e-2); margin-bottom: var(--e-3);
  border-bottom: 3px solid; display: flex; justify-content: space-between; align-items: center; gap: var(--e-3);
}
.lic-col-n { font-size: var(--txt-xs); font-weight: 700; padding: 1px 8px; border-radius: var(--raio); }
.lic-col-corpo { display: flex; flex-direction: column; gap: var(--e-3); }
/* Coluna vazia: caixa tracejada e texto centrado — sem fundo de card, para
   não parecer que há um item ali. */
.lic-vazio {
  font-size: var(--txt-sm); color: var(--texto-sec); background: transparent;
  border: 1px dashed var(--borda); border-radius: var(--raio);
  padding: var(--e-5) var(--e-4); line-height: 1.5; text-align: center;
}
.lic-nota-busca { font-size: var(--txt-xs); color: var(--texto-sec); padding: 4px 2px; }

/* Faixa colorida do estado na borda esquerda (2026-08-19): a cor vem do JS
   (corDaUf), a mesma tabela do Kanban e do "Hoje no mercado". Num quadro
   misto, cinza não distingue SP de MG. */
.lic-card {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-left: 3px solid var(--neutro-meta);
  border-radius: var(--raio); padding: var(--e-4);
}
.lic-card--adiada { opacity: .72; }
.lic-card-top { display: flex; justify-content: space-between; align-items: center; gap: var(--e-2); margin-bottom: var(--e-2); }
.lic-card-orgao { font-size: var(--txt-sm); font-weight: 700; line-height: 1.3; }
.lic-card-meta { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: var(--e-1); }
/* Objeto em 2 linhas: o texto do PNCP passa de 300 caracteres e é sempre a
   mesma ladainha — o que decide é o órgão e o prazo, não o parágrafo. */
.lic-card-objeto {
  font-size: var(--txt-xs); color: var(--texto-sec); line-height: 1.45; margin: 8px 0;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.lic-card-nota { font-size: var(--txt-xs); color: var(--texto-sec); margin: 6px 0; }
.lic-card-link, .lic-card-acoes a { font-size: var(--txt-xs); color: var(--ouro-texto); cursor: pointer; }
.lic-card-link--fim { margin-left: auto; align-self: center; }
.lic-card-acoes { display: flex; gap: var(--e-3); margin-top: var(--e-3); }
.lic-vereditos { display: flex; gap: var(--e-2); flex-wrap: wrap; align-items: center; margin-top: var(--e-3); }

/* Prazo: vermelho é PRAZO e só (regra da TASK-025). O badge azul "Encerra em
   365d" com o mesmo peso de um prazo de 5 dias era o defeito a corrigir —
   se tudo é urgente, nada é. Acima de 30 dias o prazo é texto neutro. */
.lic-prazo { font-size: var(--txt-xs); font-weight: 600; color: var(--texto-sec); }
.lic-prazo--fim { color: var(--cinza); text-decoration: line-through; font-size: var(--txt-xs); font-weight: 600; }
/* O prazo virou pill (2026-08-19): é o dado que decide a ordem de atender, e
   como texto cinza tinha o mesmo peso do nome do município. As cores de texto
   são as `-escuro`, medidas sobre os fundos claros — as puras reprovam em AA. */
.lic-pill {
  font-family: var(--fonte-mono); font-size: 10.5px; font-weight: 700;
  padding: 2px 8px; border-radius: 999px; white-space: nowrap; letter-spacing: .02em;
}
.lic-pill--urgente { color: var(--vermelho-escuro); background: var(--vermelho-claro); }
.lic-pill--atencao { color: var(--amarelo-escuro); background: var(--amarelo-claro); }
.lic-pill--neutro { color: var(--texto-sec); background: var(--bg); }

.lic-check { margin: 8px 0; }
.lic-check-barra { height: 5px; background: var(--bg); border-radius: var(--raio-sm); overflow: hidden; }
.lic-check-barra span { display: block; height: 100%; background: var(--ouro); }
.lic-check-txt { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: var(--e-2); }
.lic-check-falta { font-size: var(--txt-xs); color: var(--amarelo-escuro); margin-top: var(--e-1); line-height: 1.4; }
.lic-check-ok { font-size: var(--txt-xs); color: var(--verde); margin-top: var(--e-1); }

/* Gaveta "conferir quando sobrar tempo" (2026-07-29) — o POSSÍVEL sai da rotina
   diária mas não do produto. Reaproveita a moldura de .kb-fora; só precisa de
   corpo com respiro e de uma lista que role, porque aqui pode haver centenas. */
.kb-fora-corpo { padding: 0 14px 12px; }
.kb-fora-seta { font-size: var(--txt-xs); opacity: .7; }
.kb-conferir-lista { max-height: 420px; overflow-y: auto; display: flex; flex-direction: column; gap: var(--e-3); }

/* Saúde da captura (2026-07-31) — a tela abre com um VEREDITO, não com uma
   tabela: ela responde "posso confiar no que estou lendo hoje?". Aqui o
   vermelho é permitido e é o ponto (ao contrário da tela de notícias, onde é
   proibido): captura parada É erro operacional. */
.saude-veredito { border-radius: var(--raio); padding: 16px 18px; margin-bottom: var(--e-5); border: 1px solid; }
.saude-veredito-t { font-size: var(--txt-lg); font-weight: 700; margin-bottom: var(--e-1); }
.saude-veredito-p { font-size: var(--txt-sm); color: var(--texto-sec); margin-bottom: var(--e-3); }
.saude-veredito--ok      { background: var(--verde-claro);    border-color: var(--verde-claro); }
.saude-veredito--ok .saude-veredito-t      { color: var(--verde-escuro); }
.saude-veredito--atencao { background: var(--amarelo-claro);               border-color: var(--amarelo-claro); }
.saude-veredito--atencao .saude-veredito-t { color: var(--amarelo-escuro); }
.saude-veredito--falha   { background: var(--vermelho-claro); border-color: var(--vermelho-claro); }
.saude-veredito--falha .saude-veredito-t   { color: var(--vermelho); }

.saude-numeros { display: flex; gap: var(--e-5); flex-wrap: wrap; padding: 4px 2px; }
.saude-num { display: flex; flex-direction: column; }
.saude-num-v { font-size: var(--txt-xl); font-weight: 700; font-variant-numeric: tabular-nums; }
.saude-num-r { font-size: var(--txt-xs); color: var(--texto-sec); }
.saude-num--ruim .saude-num-v { color: var(--vermelho); }

.saude-linha { font-size: var(--txt-sm); padding: var(--e-1); }
.saude-linha--falha { color: var(--vermelho); font-weight: 600; }
.saude-linha--desligado { color: var(--texto-sec); }
.saude-aviso { font-size: var(--txt-sm); color: var(--texto-sec); margin-top: var(--e-2); line-height: 1.5; }
.saude-fraco { color: var(--texto-sec); font-weight: 400; }
.saude-ruim { color: var(--vermelho); }
/* Conta perto do teto de IA: ainda dá para agir, então âmbar. Vermelho fica
   reservado para o fato consumado (ver DESIGN_SYSTEM, escala de cor). */
.saude-atencao { color: var(--amarelo-escuro); font-weight: 600; }
.saude-barra { flex: 0 0 90px; height: 5px; background: var(--bg); border-radius: var(--raio-sm); overflow: hidden; margin: 0 10px; }
.saude-barra span { display: block; height: 100%; background: var(--ouro); }

/* ── Tabela padronizada (2026-07-31, dívida de UX de média prioridade) ──────
   Antes, cada tabela do produto trazia o próprio estilo inline: mudar o
   espaçamento ou a tipografia de tabela exigia editar tela por tela, com o
   risco normal de esquecer uma e a interface passar a ter duas tabelas
   parecidas mas diferentes.

   O padrão sai do que as tabelas JÁ faziam de comum (13px, cabeçalho em
   caixa alta pequena, linhas separadas por 1px) — é extração, não redesenho,
   então adotá-lo não muda a aparência de nenhuma tela. A única adição é
   tabular-nums nas colunas de número: dígitos de larguras diferentes
   desalinham a coluna, e nenhuma das versões inline tratava isso. */
.tabela-wrap { overflow-x: auto; }
.tabela { width: 100%; border-collapse: collapse; font-size: var(--txt-sm); }
.tabela thead th {
  text-align: left; padding: 9px 10px; font-size: var(--txt-xs); font-weight: 700;
  color: var(--texto-sec); text-transform: uppercase; letter-spacing: .4px;
  white-space: nowrap; border-bottom: 2px solid var(--borda);
}
.tabela tbody td { padding: 9px 10px; border-bottom: 1px solid var(--borda); vertical-align: middle; }
.tabela tbody tr:last-child td { border-bottom: none; }

/* Modificadores de célula — a alternativa é o style inline, que é de onde
   esta dívida veio. */
.tabela .col-num { text-align: center; font-variant-numeric: tabular-nums; }
.tabela .col-forte { font-weight: 700; }
.tabela .col-fraca { color: var(--texto-sec); }
.tabela .col-acoes { white-space: nowrap; }
.tabela th.ordenavel { cursor: pointer; user-select: none; }
.tabela--linhas tbody tr { cursor: pointer; }
.tabela--linhas tbody tr:hover { background: var(--bg); }

/* Contato da vara no card do processo (TASK-028, 2026-08-02). Discreto de
   propósito: é informação de apoio ao lado do nome do órgão, não uma seção.
   Se competisse por atenção com a decisão, atrapalharia a leitura do card —
   que é o que a usuária abriu o modal para fazer. */
.cv-slot { margin-left: var(--e-3); font-weight: 400; }
.cv-box { display: inline-flex; align-items: center; gap: var(--e-2); flex-wrap: wrap; font-size: var(--txt-xs); }
.cv-item { color: var(--ouro-texto); text-decoration: none; }
.cv-item:hover { text-decoration: underline; }
.cv-copiar { font-size: var(--txt-xs); color: var(--texto-sec); cursor: pointer; border-bottom: 1px dotted var(--borda); }
.cv-copiar:hover { color: var(--texto); }
.cv-add { font-size: var(--txt-xs); color: var(--texto-sec); cursor: pointer; border-bottom: 1px dashed var(--borda); }
.cv-add:hover { color: var(--ouro-texto); border-bottom-color: var(--ouro-texto); }
.cv-carregando { font-size: var(--txt-xs); color: var(--cinza); }
.cv-selo { font-size: var(--txt-xs); color: var(--verde); font-weight: 700; }
/* "conferir" é âmbar, não vermelho: o contato provavelmente está certo — a
   fonte é que não informou a especialidade da vara. Vermelho aqui faria a
   usuária desconfiar de um dado que na prática serve. */
.cv-aviso { font-size: var(--txt-xs); color: var(--amarelo-escuro); font-weight: 700; cursor: help; }
.cv-data { font-size: var(--txt-xs); color: var(--cinza); font-variant-numeric: tabular-nums; }

/* Indicador de cobertura da aba Contatos (TASK-028). Ele responde "quanto
   falta", que é a pergunta que decide se vale continuar preenchendo — um
   total absoluto de contatos não decide nada. */
.cvc-box { background: var(--bg); border: 1px solid var(--borda); border-radius: var(--raio); padding: 12px 14px; margin-bottom: var(--e-4); }
.cvc-barra { height: 6px; background: var(--bg-card); border-radius: var(--raio-sm); overflow: hidden; margin-bottom: var(--e-3); }
.cvc-barra span { display: block; height: 100%; background: var(--ouro); }
.cvc-txt { font-size: var(--txt-sm); font-variant-numeric: tabular-nums; }
.cvc-tribs { display: flex; gap: var(--e-4); flex-wrap: wrap; margin-top: var(--e-2); }
.cvc-trib { font-size: var(--txt-xs); color: var(--texto-sec); font-variant-numeric: tabular-nums; }
.cvc-falta { font-size: var(--txt-xs); color: var(--texto-sec); margin-top: var(--e-3); line-height: 1.5; }

/* ── AGENDA NACIONAL DE CONTATOS DE VARA (TASK-030) ────────────────────────
   Mapa em BLOCOS: uma grade que preserva a posição relativa dos estados
   (Norte em cima, Sul embaixo), sem biblioteca de mapa e sem GeoJSON — mesma
   decisão das sparklines da TASK-026. Ele é TERMÔMETRO de cobertura, não o
   navegador principal: com o radar atual acende 4 de 27 estados, e como
   seletor único seria um clique num mapa quase todo apagado. */
.ag-topo { display: flex; gap: var(--e-5); align-items: flex-start; flex-wrap: wrap; margin-bottom: var(--e-4); }
.ag-mapa { background: var(--bg); border: 1px solid var(--borda); border-radius: var(--raio); padding: 10px 12px; }
.ag-mapa-titulo { font-size: var(--txt-xs); font-weight: 700; color: var(--texto-sec); text-transform: uppercase; letter-spacing: .5px; margin-bottom: var(--e-3); }
.ag-mapa-linha { display: flex; gap: var(--e-2); }
.ag-uf {
  width: 30px; height: 22px; border-radius: var(--raio-sm); display: inline-flex;
  align-items: center; justify-content: center; margin-bottom: var(--e-2);
  font-size: var(--txt-xs); font-weight: 700; cursor: pointer; user-select: none;
  border: 1px solid transparent; transition: transform .1s;
}
.ag-uf:hover { transform: scale(1.12); }
.ag-uf--vazio { background: none; cursor: default; }
.ag-uf--vazio:hover { transform: none; }
/* Cor = cobertura. O vermelho é fato consumado ("tenho trabalho nesse estado
   e nenhum contato"), nunca previsão — a régua do DESIGN_SYSTEM. */
.ag-uf--boa { background: var(--verde-claro); color: var(--verde-escuro); }
.ag-uf--parcial { background: var(--amarelo-claro); color: var(--amarelo-escuro); }
.ag-uf--zero { background: var(--vermelho-claro); color: var(--vermelho); }
.ag-uf--sem-radar { background: var(--ouro-clara); color: var(--ouro-texto-forte); }
.ag-uf--fora { background: var(--bg-card); color: var(--cinza); }
.ag-uf--sel { border-color: var(--ouro-texto); box-shadow: var(--anel-selecao); }
.ag-legenda { display: flex; gap: var(--e-3); flex-wrap: wrap; margin-top: var(--e-2); font-size: var(--txt-xs); color: var(--texto-sec); }
.ag-legenda span { display: inline-flex; align-items: center; gap: var(--e-2); }
.ag-sw { width: 10px; height: 10px; border-radius: var(--raio-sm); display: inline-block; }

/* Três níveis: estado → tribunal → comarca. Cada chip mostra a cobertura,
   que é o que transforma a lista em decisão (onde vale preencher). */
.ag-niveis { flex: 1; min-width: 260px; display: flex; flex-direction: column; gap: var(--e-3); }
.ag-nivel-t { font-size: var(--txt-xs); font-weight: 700; color: var(--texto-sec); text-transform: uppercase; letter-spacing: .5px; margin-bottom: var(--e-2); }
.ag-chips { display: flex; gap: var(--e-2); flex-wrap: wrap; }
.ag-chips--rolagem { max-height: 128px; overflow-y: auto; }
.ag-chip {
  background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio-pilula);
  padding: 4px 11px; font-size: var(--txt-sm); cursor: pointer; font-family: inherit; color: var(--texto);
}
.ag-chip b { font-weight: 600; color: var(--texto-sec); font-variant-numeric: tabular-nums; margin-left: var(--e-2); }
.ag-chip:hover { border-color: var(--ouro-texto); }
.ag-chip--on { background: var(--ouro); border-color: var(--ouro-texto); color: var(--sobre-ouro); }
.ag-chip--on b { color: rgba(255,255,255,.8); }

.ag-caminho { display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap; font-size: var(--txt-sm); color: var(--texto-sec); margin-bottom: var(--e-3); }
.ag-caminho b { color: var(--texto); }
.ag-sep { color: var(--cinza); }
.ag-caminho-n { font-variant-numeric: tabular-nums; }
.ag-limpar { color: var(--ouro-texto); cursor: pointer; font-size: var(--txt-sm); }

/* FICHA no lugar da linha de tabela: o caminho (comarca · tribunal) fica na
   própria ficha, porque sem ele quinze "1ª Vara Cível" continuam iguais. */
/* ── AGENDA: LISTA DENSA (TASK-046, 2026-08-08) ──────────────────────────────
   Substitui a grade de fichas. Eram ~370 cards de altura irregular para um
   dado de duas linhas, e o e-mail — a única coisa que a pessoa veio buscar —
   ficava perdido dentro da moldura. DESIGN_SYSTEM: card é para o que se AGE;
   lista é lista.

   A comarca virou CABEÇALHO DE GRUPO em vez de repetir em cada item: era ela
   que distinguia quinze "1ª Vara Cível", e agora distingue uma vez por bloco.

   As colunas de manutenção (fonte/editar/remover) entram só para o admin —
   por isso a grade termina em `auto`, e não numa faixa reservada que ficaria
   vazia na conta comum. */
.ag-lista { display: flex; flex-direction: column; gap: var(--e-4); }
.ag-grupo { background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio); overflow: hidden; }
.ag-grupo-cab {
  display: flex; align-items: baseline; gap: var(--e-3); flex-wrap: wrap;
  padding: 10px 14px; background: var(--cinza-claro); border-bottom: 1px solid var(--borda);
}
.ag-grupo-comarca { font-size: var(--txt-sm); font-weight: 700; }
.ag-grupo-trib { font-family: var(--fonte-mono); font-size: 10px; text-transform: uppercase; letter-spacing: .08em; color: var(--texto-sec); }
.ag-grupo-n { margin-left: auto; font-size: var(--txt-xs); color: var(--neutro-meta); font-variant-numeric: tabular-nums; }

.ag-item {
  display: grid; align-items: center; gap: 2px var(--e-3);
  grid-template-columns: minmax(140px, 1.1fr) minmax(0, 1.4fr) minmax(96px, auto) auto;
  padding: 8px 14px; border-bottom: 1px solid var(--borda); font-size: var(--txt-sm);
}
.ag-item:last-child { border-bottom: 0; }
.ag-item:hover { background: var(--ouro-fraco); }
.ag-item-vara { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ag-item-ok { color: var(--verde); margin-left: 6px; }
/* Identificadores em mono: leem-se caractere a caractere, e é assim que se
   confere um e-mail de cartório antes de colar num ofício. */
.ag-item-email, .ag-item-tel {
  font-family: var(--fonte-mono); font-size: 12px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ag-item-email { color: var(--ouro-texto); text-decoration: none; }
.ag-item-email:hover { text-decoration: underline; }
.ag-item-tel { color: var(--texto-sec); }
.ag-item-sem { font-size: var(--txt-xs); color: var(--neutro-meta); }
.ag-item-copiar {
  font-size: var(--txt-xs); font-weight: 600; color: var(--ouro-texto);
  background: none; border: 1px solid var(--borda); border-radius: var(--raio-sm);
  padding: 3px 10px; cursor: pointer; font-family: inherit; white-space: nowrap;
}
.ag-item-copiar:hover { border-color: var(--ouro-texto); }
.ag-item-copiar:active { transform: scale(0.98); }
.ag-item--vazio { color: var(--texto-sec); }
.ag-item-nada { font-size: var(--txt-xs); color: var(--neutro-meta); grid-column: 2 / span 2; }
/* A manutenção do admin desce para uma SEGUNDA LINHA da mesma célula-grade.
   Disputando a linha com o e-mail, ela espremia justamente o dado que a tela
   existe para entregar — o e-mail virava "adama…" na conta admin e ficava
   inteiro na conta comum, ou seja, quem mantém a base via pior do que quem
   só consulta. Agora a linha de dados é IDÊNTICA nos dois papéis, e o admin
   ganha uma tarja discreta embaixo. */
.ag-item-admin {
  grid-column: 1 / -1; display: flex; align-items: center; gap: var(--e-3);
  font-size: var(--txt-xs); white-space: nowrap; padding-left: 2px;
}
.ag-item-fonte { color: var(--neutro-meta); overflow: hidden; text-overflow: ellipsis; }
.ag-item-admin a { color: var(--ouro-texto); cursor: pointer; }
.ag-item-admin .ag-remover { color: var(--cinza); }

@media (max-width: 860px) {
  /* No estreito a linha vira duas: a vara em cima, contato e copiar embaixo.
     Truncar e-mail de cartório seria pior que quebrar — é o dado da tela. */
  .ag-item { grid-template-columns: 1fr auto; row-gap: 2px; }
  .ag-item-vara { grid-column: 1 / -1; }
  .ag-item-email, .ag-item-tel { white-space: normal; word-break: break-all; }
  .ag-item-admin { grid-column: 1 / -1; }
}

.ag-corte { font-size: var(--txt-sm); color: var(--texto-sec); margin-top: var(--e-3); }

@media (max-width: 720px) {
  .ag-topo { flex-direction: column; }
}

/* Prévia da importação por CSV (TASK-028). */
.csv-resumo { font-size: var(--txt-sm); margin-top: var(--e-3); line-height: 1.6; }
.csv-erros { font-size: var(--txt-xs); color: var(--amarelo-escuro); margin-top: var(--e-2); line-height: 1.6; }

/* ── FOCO VISÍVEL (maratona 06/08, item 1.1) ────────────────────────────
   Navegação por Tab tem que mostrar onde o foco está, em TODO interativo.
   :focus-visible não dispara no clique — só teclado — então não suja o uso
   com mouse. O tom é o dourado de TEXTO (4,5:1 no claro). */
:focus-visible { outline: 2px solid var(--ouro-texto); outline-offset: 2px; }

/* ── FEEDBACK DE CLIQUE (TASK-038, item 1) ──────────────────────────────
   O produto tinha 56 `:hover` e 1 `:active`: a interface reagia ao mouse
   PASSANDO e ficava muda no momento em que a usuária de fato apertava. O
   clique é a única interação que ela sabe que fez — e era a única sem
   resposta. Um recuo de 2% dá a confirmação física sem mexer em cor.

   Só ENTRA aqui o que é ação (botão, pílula, chip). Fica de fora quem já
   tem feedback próprio de pressionar — `.kb-card` (vira `cursor: grabbing`
   ao arrastar) e `.ag-uf` (já usa `transform` no hover; dois transforms
   competindo é pior que nenhum). Sem cor, sem sombra, sem escala nova:
   a duração é a de 0.12s já praticada no arquivo. */
.btn:active,
.filtro:active,
.trib-opt:active,
.kb-chip:active,
.kb-card-btn:active,
.ims-tgl-btn:active,
.modal-close:active {
  transform: scale(0.98);
}


/* As barras do período vivem dentro do card do número (ver painel.js): 315 e
   a soma das barras são o mesmo fato, e separados eram dois blocos. */
.not-dias--heroi { margin-top: var(--e-3); gap: 5px; }
.not-dias--heroi .not-dia-bar { max-height: 42px; }
/* ── MINI-VISUAIS DOS KPIs (2026-08-18, handoff "Auditoria de Design" v2) ────
   Os KPIs 2 e 3 ganham a repartição que o número sozinho esconde: 29 trocas
   num tribunal só é outra notícia que 29 espalhadas por oito. Tudo em div,
   sem biblioteca — a fonte dos números é o pulso, não os arrays cortados de
   exibição (ver _notTrocasBarra em painel.js). */
.not-kpi-viz { margin-top: var(--e-4); }
.not-kpi-barra { display: flex; gap: 2px; max-width: 230px; height: 10px; }
.not-kpi-seg { border-radius: 2px; min-width: 3px; }

/* Legenda em mono, como os rótulos de KPI: ela é etiqueta de dado, não frase. */
.not-kpi-leg {
  display: flex; flex-wrap: wrap; gap: var(--e-1) var(--e-4); margin-top: var(--e-3);
  font-family: var(--fonte-mono); font-size: 9.5px; color: var(--texto-sec);
}
.not-kpi-leg-item { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.not-kpi-leg-cor { width: 7px; height: 7px; border-radius: 2px; flex-shrink: 0; }
.not-kpi-leg-mais { color: var(--neutro-meta); }
.not-kpi-leg-sep { color: var(--texto-sec); }

/* Quadradinhos: um por comarca em movimento. Quebram em duas linhas a partir
   de ~20 — a faixa é para dar VOLUME de relance, não para ser contada. */
.not-kpi-quadros { display: flex; flex-wrap: wrap; gap: 3px; max-width: 230px; }
.not-kpi-quad { width: 9px; height: 9px; border-radius: 2px; }
/* --verde e o MESMO token da pilula de delta positivo (.not-delta--verde),
   nao o --verde-inverso: aquele e a versao para superficie invertida e no
   tema claro sai #7FA98A, claro demais para um quadradinho de 9px. */
.not-kpi-quad--sobe { background: var(--verde); }
.not-kpi-quad--cai { background: var(--vermelho); }
/* TEXTO da legenda usa as variantes -escuro; o QUADRADINHO fica com a cor cheia.
   Medido sobre a mesa: --vermelho da 3,97:1, abaixo do minimo de 4,5 para texto
   de 9,5px. O quadrado e elemento grafico (minimo 3:1) e passa com folga; o
   texto ao lado, nao. Com -escuro: verde 7,39:1 e vermelho 6,32:1.
   E a mesma armadilha ja registrada no DESIGN_SYSTEM: token e aprovado contra
   uma SUPERFICIE, e a mesa nao e o card. */
.not-kpi-sobe { color: var(--verde-escuro); font-weight: 700; }
.not-kpi-cai { color: var(--vermelho-escuro); font-weight: 700; }

/* O valor de cada dia passou para DEBAIXO da barra (ver painel.js). Na faixa
   de KPI ele reaparece — estava escondido porque competia com o total de
   40px logo acima; embaixo da própria coluna ele não compete, descreve. */
.not-dias--heroi .not-dia-n {
  display: block; font-family: var(--fonte-mono); font-size: 9px; line-height: 1;
  font-weight: 400; color: var(--neutro-meta);
}
.not-dias--heroi .not-dia--hoje .not-dia-n { font-weight: 700; color: var(--tinta); }


/* Deltas em pílula tintada, como na referência — o sinal fica visível de
   relance, sem depender de o olho achar um ▲ pequeno no meio do texto. */
.not-delta {
  display: inline-flex; align-items: center; gap: 3px;
  border-radius: 999px; padding: 2px 9px; font-size: var(--txt-xs);
}
.not-delta--verde { background: var(--verde-claro); color: var(--verde-escuro); }
.not-delta--ambar { background: var(--vermelho-claro); color: var(--vermelho-escuro); }

/* ══ MODO ESCURO (TASK-043) ═══════════════════════════════════════════════
   Só as cores mudam. Espaçamento, tipografia, raios e z-index são os mesmos
   — tema é troca de paleta, não outro produto.

   A ESTRUTURA DE DEGRAUS DA TASK-039 É PRESERVADA, INVERTIDA. No claro a
   mesa é a mais escura das três superfícies e o card o mais claro. No
   escuro isso vira: a mesa é a mais escura, o card sobe. Elevação continua
   sendo "mais claro = mais perto", que é o que o olho já aprendeu aqui.

   A FAMÍLIA É QUENTE, não cinza-azulada. O creme da identidade tem verde e
   vermelho baixos e vermelho alto; o escuro segue o mesmo eixo (matiz ~25°).
   Um escuro frio ao lado da logo dourada faria a marca parecer de outro
   produto.

   O DOURADO CLAREIA. #C8A96E dá 2,4:1 contra a mesa escura — invisível como
   texto. Como FUNDO ele continua idêntico (e leva --sobre-ouro por cima);
   como TEXTO, o papel passa para --ouro-clara. É a mesma separação de papéis
   da TASK-039, agora com o segundo eixo do tema. */
:root[data-tema="escuro"] {
  --bg:            #14100E;   /* mesa */
  --bg-card:       #2E2723;   /* card: sobe da mesa, como no claro */
  --coluna-bg:     #1E1917;   /* o degrau do meio inverte junto: mesa < coluna < card */
  --sidebar-bg:    #201A18;
  --sidebar-borda: rgba(242,237,230,.10);
  --borda:         #3A322D;
  --cinza-claro:   #383029;
  --cinza-mid:     #3A322D;
  --cinza:         #A79C92;

  --texto:         #F2EDE6;
  --texto-sec:     #BCB1A5;
  --neutro-menu:   #A79C92;
  --neutro-meta:   #ADA298;
  --tinta:         #F7F3EC;   /* título de tela e número herói */
  --inverso-bg:    #F2EDE6;   /* a inversão também inverte: no escuro ela clareia */
  --inverso-texto: #1A1614;

  /* Lados A/B do comparativo: o tom CHEIO clareia um pouco (a barra precisa
     aparecer sobre card escuro e ainda segurar texto branco no chip), o de
     TEXTO clareia bastante, e os fundos dos pills viram versões escuras — um
     pill azul-claro sobre card escuro seria um facho de luz no meio da
     tabela. Medido nos dois temas: nenhum par abaixo de 4,5:1. */
  --comp-a:        #6FA0E8;   /* barra: sobre o trilho escuro precisa CLAREAR */
  --comp-a-solido: #2C64BE;   /* chip com texto branco: precisa ESCURECER */
  --comp-a-texto:  #9FC1EE;
  --comp-a-bg:     #1B2C48;
  --comp-b:        #E08A50;
  --comp-b-solido: #A8481A;
  --comp-b-texto:  #EDA878;
  --comp-b-bg:     #3D2718;

  /* Dourado: fundo igual, texto mais claro (ver nota acima). */
  --ouro-texto:       #E2D1B1;
  --ouro-texto-forte: #F0E4CC;
  --ouro-fraco:       rgba(200,169,110,.14);
  /* --ouro-clara NÃO TINHA VALOR NO ESCURO (achado na medição de 10/08, o
     mais espalhado do Bloco 2). Ela é FUNDO DE TEXTO em ~10 lugares — badge
     "aguardando", prazo de credenciamento, etiqueta de nome na Mesa, chip de
     tribunal, item ativo do chat. Herdando o #E2D1B1 do claro, no tema
     escuro ficava um retângulo claro com --ouro-texto-forte (#F0E4CC) por
     cima: 1,19:1, ilegível. Aqui ela vira o tint escuro correspondente, e o
     par com --ouro-texto-forte mede 9,4:1. */
  --ouro-clara:       #3A3121;
  /* A superfície invertida clareou junto com o tema, então o dourado que vive
     sobre ela precisa ESCURECER — o inverso do --ouro-texto acima. */
  /* #847049 media 4,1:1 sobre a superficie invertida clara — passa como texto
     grande, reprova nos micro-rotulos de 11px que sao o uso real. Escurecido
     para o mesmo tom do --ouro-texto-forte do tema claro: 5,4:1. */
  --ouro-inverso:     #69593A;
  --verde-inverso:    #2F6B4F;   /* a superficie invertida clareou: o verde escurece junto */

  /* Semânticas: os tons cheios do claro escurecem demais sobre a mesa
     escura. Sobem para a faixa clara da própria família; os "-claro"
     (usados como FUNDO de pílula) descem, para o texto escuro voltar a
     pousar sobre eles. */
  --verde:          #7FC9A4;
  --verde-escuro:   #C9E8D8;
  --verde-claro:    #24402F;
  --sobre-verde:    #14100E;
  --sobre-vermelho: #14100E;   /* o vermelho clareou (#F09080): o texto por cima escurece */   /* o verde clareou: o texto por cima escurece junto (11,9:1) */
  --amarelo:        #E3B84E;
  --amarelo-escuro: #F2D99A;
  --amarelo-claro:  #423318;
  --vermelho:       #F09080;
  --vermelho-escuro:#F7C4B9;
  --vermelho-claro: #4A2620;

  --nav-bg:        #0E0B0A;
  --anel-foco: 0 0 0 3px rgba(226,209,177,.28);
}
/* O anel de foco muda de cor, nunca de existência — regra da TASK-039. */
:root[data-tema="escuro"] :focus-visible { outline-color: var(--ouro-texto); }

/* ── Badges de tribunal no escuro (TASK-043) ────────────────────────────────
   MEDIÇÃO: das 57 cores de tribunal, 54 ficam abaixo de 3:1 contra o card
   escuro — elas foram escolhidas para viver sobre branco. TJRJ (#0F2D5C) dá
   1,08:1: o badge simplesmente some.

   A cor NÃO muda. "Mesmo tribunal, mesma cor em todas as telas" é regra da
   TASK-036, com teste — e ela não deixa de valer porque a mesa escureceu.
   O que entra é um anel interno claro: o LIMITE do badge passa a carregar o
   contraste, e o preenchimento continua sendo a identidade. É o mesmo
   raciocínio do botão sobre a faixa dourada (TASK-042), onde a borda em
   tinta é que separa o componente do fundo.

   `inset` de propósito: não muda largura nem altura, então nenhum
   alinhamento medido no claro se desloca no escuro. */
:root[data-tema="escuro"] .uf-badge,
:root[data-tema="escuro"] .kb-trib,
:root[data-tema="escuro"] .ims-card-uf,
:root[data-tema="escuro"] .imeh-uf {
  box-shadow: inset 0 0 0 1px rgba(242, 237, 230, .38);
}

/* ══ MESA DO ADMIN (TASK-048) ═══════════════════════════════════════════════
   Uma fila, ordenada por impacto, com a ação dentro do item.

   Escolha visual que não é estética: a mesa NÃO usa card branco sobre card
   branco. Ela é uma faixa contínua com divisórias finas, porque o olho tem
   que ler "isto é uma lista de pendências" e não "isto são 40 blocos". Card
   por item transformaria 40 decisões em 40 objetos, que é exatamente a
   sensação que esta task existe para acabar.

   Cor: a etiqueta de tipo usa o dourado sobre card BRANCO (`--ouro-texto`,
   4,78:1). Sobre a mesa escura ele daria 3,51:1 e reprovaria — token se
   aprova contra a superfície, nunca no abstrato (DESIGN_SYSTEM). */

.mesa-topo {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--e-3); margin-bottom: var(--e-3);
}
.mesa-t {
  font-family: var(--fonte-titulo); font-size: var(--txt-xl);
  color: var(--tinta); margin: 0; letter-spacing: -.01em;
}
.mesa-s {
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  color: var(--texto-sec); text-transform: uppercase; letter-spacing: .06em;
  margin-top: 2px;
}

.mesa-fila {
  background: var(--bg-card); border: 1px solid var(--borda);
  border-radius: var(--raio); overflow: hidden;
}
.mesa-item {
  padding: 12px 14px; border-bottom: 1px solid var(--borda);
  display: grid; gap: 6px;
}
.mesa-item:last-child { border-bottom: 0; }
.mesa-item:hover { background: var(--bg); }
.mesa-item--feito { background: var(--verde-claro); }

.mesa-item-cab { display: flex; align-items: baseline; gap: var(--e-2); flex-wrap: wrap; }
.mesa-item-t {
  font-weight: 600; color: var(--tinta); font-size: var(--txt-sm);
  line-height: 1.35;
}
.mesa-item-p { font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.45; }

/* Etiqueta de tipo: diz POR QUE o item está no topo, em uma palavra. É a
   tradução visível do peso — sem ela a ordem pareceria arbitrária. */
.mesa-tag {
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  text-transform: uppercase; letter-spacing: .06em; white-space: nowrap;
  padding: 2px 7px; border-radius: 999px; border: 1px solid var(--borda);
  color: var(--texto-sec); background: var(--bg);
}
.mesa-tag--duplicado { color: var(--vermelho-escuro); border-color: var(--vermelho-claro); background: var(--vermelho-claro); }
.mesa-tag--nome      { color: var(--ouro-texto-forte); border-color: var(--ouro-clara); background: var(--ouro-clara); }
.mesa-tag--feedback  { color: var(--verde-escuro); border-color: var(--verde-claro); background: var(--verde-claro); }

.mesa-item-acoes { display: flex; gap: var(--e-2); flex-wrap: wrap; margin-top: 2px; }
.mesa-acao {
  font-family: inherit; font-size: var(--txt-xs); font-weight: 600;
  padding: 5px 11px; border-radius: var(--raio);
  border: 1px solid var(--ouro-texto); background: var(--bg-card);
  color: var(--ouro-texto); cursor: pointer;
}
.mesa-acao:hover { background: var(--ouro-clara); color: var(--ouro-texto-forte); }
.mesa-acao--fraca { border-color: var(--borda); color: var(--texto-sec); }
.mesa-acao--fraca:hover { background: var(--bg); color: var(--tinta); }

.mesa-feito {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--e-2); font-size: var(--txt-sm); color: var(--verde-escuro);
}
/* "permanente" onde não há desfazer: a ausência do botão precisa ter NOME,
   senão lê-se como falha da tela em vez de propriedade da ação. */
.mesa-permanente {
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  text-transform: uppercase; letter-spacing: .06em; color: var(--texto-sec);
  white-space: nowrap;
}

/* Estado zerado: afirmação, não espaço em branco. */
.mesa-zerada { padding: 28px 16px; text-align: center; }
.mesa-zerada-t {
  font-family: var(--fonte-titulo); font-size: var(--txt-lg); color: var(--tinta);
}
.mesa-zerada-s {
  font-family: var(--fonte-mono); font-size: var(--txt-xs); color: var(--texto-sec);
  text-transform: uppercase; letter-spacing: .06em; margin-top: 4px;
}

/* O que as regras fizeram sozinhas: recolhido, nunca escondido. */
.mesa-resolvido { margin-top: var(--e-3); font-size: var(--txt-sm); }
.mesa-resolvido > summary {
  cursor: pointer; color: var(--texto-sec); padding: 8px 0;
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  text-transform: uppercase; letter-spacing: .06em;
}
.mesa-res-linha {
  display: flex; gap: var(--e-3); align-items: flex-start;
  padding: 8px 12px; border-left: 2px solid var(--borda); color: var(--texto-sec);
}
.mesa-res-n {
  font-family: var(--fonte-mono); font-weight: 700; color: var(--tinta);
  min-width: 42px; text-align: right; font-variant-numeric: tabular-nums;
}
.mesa-res-d { color: var(--texto-sec); }

/* ── MODELOS DE EDITAL (TASK-053, fatia 1) ─────────────────────────────────
   Seção dentro de "Meus documentos", separada por um fio: é outro assunto
   (o modelo em branco do leiloeiro), mas do mesmo dono — não merece aba
   própria. Reusa .btn/.input/.alerta/.loading; o que existe aqui é só a
   forma da seção e do card. */
.me-secao { margin-top: var(--e-6); padding-top: var(--e-5); border-top: 1px solid var(--borda); }
/* Primeira seção da aba Editais: sem fio nem recuo — não há nada acima
   dela para separar (a seção nasceu dentro de "Meus documentos", onde o fio
   fazia sentido). */
.me-secao--primeira { margin-top: 0; padding-top: 0; border-top: 0; }
.me-topo { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--e-4); flex-wrap: wrap; margin-bottom: var(--e-4); }
.me-t { font-size: var(--txt-md); font-weight: 700; margin: 0; }
.me-sub { font-size: var(--txt-sm); color: var(--texto-sec); margin: var(--e-1) 0 0; max-width: 62ch; line-height: 1.5; }
.me-rot { display: block; font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: var(--texto-sec); margin-bottom: var(--e-1); }
.me-form { background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio); padding: var(--e-4); margin-bottom: var(--e-4); max-width: 520px; }
.me-form-linha { margin-bottom: var(--e-3); }
.me-form-linha .input { width: 100%; }
.me-form-acoes { display: flex; gap: var(--e-2); }
.me-aviso:not(:empty) { margin-top: var(--e-3); }
.me-vazio {
  font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5;
  border: 1px dashed var(--borda); border-radius: var(--raio);
  padding: var(--e-5) var(--e-4); text-align: center;
}
.me-grade { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--e-3); }
.me-card { background: var(--bg-card); border: 1px solid var(--borda); border-radius: var(--raio); padding: var(--e-4); }
.me-card-n { font-size: var(--txt-sm); font-weight: 700; line-height: 1.3; }
/* O nome do arquivo em mono e cortado numa linha: é referência, não título —
   um .docx com nome comprido não pode empurrar as ações para fora da vista. */
.me-card-a {
  font-family: var(--fonte-mono); font-size: var(--txt-xs); color: var(--texto-sec);
  margin-top: var(--e-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.me-card-d { font-size: var(--txt-xs); color: var(--neutro-meta); margin-top: var(--e-1); }
.me-card-acoes { display: flex; gap: var(--e-3); margin-top: var(--e-3); flex-wrap: wrap; }
.me-card-acoes a { font-size: var(--txt-sm); color: var(--ouro-texto); cursor: pointer; }
.me-card-acoes a.me-remover { color: var(--cinza); }

/* ── GERAR EDITAL: FORMULÁRIO REVISÁVEL (TASK-053, fatia 2) ────────────────
   O desenho serve a uma regra de produto: a IA preenche, o humano revisa.
   Por isso o vazio é DESTACADO em vez de discreto — campo que a IA não achou
   é trabalho pendente, não detalhe — e a origem fica colada no rótulo, para
   conferir sem reabrir a peça. */
.ed-selo {
  font-size: var(--txt-xs); font-weight: 700; line-height: 1.45;
  color: var(--ouro-texto-forte); background: var(--ouro-clara);
  border-radius: var(--raio-sm); padding: 8px 12px; margin-bottom: var(--e-3);
}
.ed-sub { font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5; margin-bottom: var(--e-3); }
.ed-vazio {
  font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.55;
  border: 1px dashed var(--borda); border-radius: var(--raio); padding: var(--e-4); text-align: center;
}
.ed-rot { display: block; font-size: var(--txt-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .4px; color: var(--texto-sec); }
.ed-campo { margin-bottom: var(--e-3); }
.ed-campo-topo { display: flex; align-items: baseline; gap: var(--e-2); flex-wrap: wrap; margin-bottom: var(--e-1); }
.ed-input { width: 100%; font-family: inherit; }
.ed-ajuda { font-size: var(--txt-xs); color: var(--neutro-meta); margin-top: var(--e-1); line-height: 1.4; }
.ed-pecas { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--e-3); margin-bottom: var(--e-3); }
.ed-peca .input { width: 100%; }

/* A origem é o que torna a revisão barata: diz DE ONDE veio o valor. */
.ed-origem { font-size: var(--txt-xs); color: var(--texto-sec); font-style: italic; }
.ed-origem--sua { font-style: normal; color: var(--verde-escuro); }
/* Proposta do sistema ≠ dado lido das peças. Âmbar, e não verde: verde diz
   "conferido"; esta data foi CALCULADA e ainda precisa passar pela pauta do
   juízo. Ver services/datasPracas.js. */
.ed-origem--proposta { font-style: normal; font-weight: 600; color: var(--amarelo-escuro); }
/* Vazio em âmbar, não em vermelho: não é erro do produto nem da usuária — é
   dado que não estava nas peças, e a régua diz que vermelho é PRAZO. */
.ed-falta {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 700;
  color: var(--amarelo-escuro); background: var(--amarelo-claro);
  padding: 2px 7px; border-radius: 999px; white-space: nowrap;
}
.ed-campo--vazio .ed-input { border-color: var(--amarelo); background: var(--amarelo-claro); }

.ed-resumo {
  font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5;
  border: 1px solid var(--borda); border-left: 3px solid var(--verde);
  border-radius: var(--raio); padding: 10px 14px; margin-bottom: var(--e-3);
}
.ed-resumo--falta { border-left-color: var(--amarelo); }
.ed-resumo strong { color: var(--texto); }
.ed-acoes { display: flex; align-items: center; gap: var(--e-3); flex-wrap: wrap; margin-top: var(--e-4); }
.ed-nota { font-size: var(--txt-xs); color: var(--texto-sec); }
.ed-ok { font-size: var(--txt-sm); color: var(--verde-escuro); font-weight: 600; margin-top: var(--e-2); }
.ed-form { border-top: 1px solid var(--borda); padding-top: var(--e-3); }
/* O formulário passou a ter 20 campos (23/08): os títulos de bloco existem
   para ela achar "os valores" sem varrer a lista inteira. */
.ed-grupo {
  font-size: var(--txt-xs); font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; color: var(--texto-sec);
  margin: var(--e-5) 0 var(--e-2); padding-bottom: var(--e-2);
  border-bottom: 1px solid var(--borda);
}
.ed-form > .ed-grupo:first-child { margin-top: 0; }

/* ── MARCADORES E MINUTA GERADA (TASK-053, fatia 3) ────────────────────────
   A lista de marcadores é referência para copiar, não leitura corrida: por
   isso o código em mono, com o rótulo ao lado dizendo o que ele significa. */
/* Recolhido por decisao da Amanda (21/08): os marcadores sao obrigatorios,
   mas e trabalho de UMA vez -- prepara o modelo e nunca mais. Fora da vista
   no dia a dia, a um clique quando for cadastrar modelo novo. */
.me-marc-det { margin-top: var(--e-4); padding-top: var(--e-3); border-top: 1px solid var(--borda); }
.me-marc-sum {
  font-size: var(--txt-sm); font-weight: 600; color: var(--ouro-texto-forte);
  cursor: pointer; list-style: none; padding: 2px 0;
}
.me-marc-sum::-webkit-details-marker { display: none; }
/* A seta diz que ABRE, e gira quando aberto -- sem isso a linha parece texto
   morto e ninguem clica. */
.me-marc-sum::before { content: "▸"; display: inline-block; margin-right: 6px; transition: transform .15s; }
.me-marc-det[open] > .me-marc-sum::before { transform: rotate(90deg); }
.me-marc-sum:hover { text-decoration: underline; }
.me-marcadores { margin-top: var(--e-3); }
.me-marc-grade { display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); gap: var(--e-2); }
.me-marc {
  display: flex; align-items: center; gap: var(--e-2);
  background: var(--bg); border: 1px solid var(--borda); border-radius: var(--raio-sm);
  padding: 6px 10px;
}
.me-marc-cod { font-family: var(--fonte-mono); font-size: var(--txt-xs); color: var(--texto); white-space: nowrap; }
.me-marc-rot { font-size: var(--txt-xs); color: var(--texto-sec); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* --ouro-texto-forte, e nao --ouro-texto: o chip tem fundo de MESA, e ali
   o tom normal da 3,51:1 (medido). Mesmo par ja documentado no
   DESIGN_SYSTEM para superficie tintada. */
.me-marc-btn {
  font-size: var(--txt-xs); font-weight: 600; color: var(--ouro-texto-forte);
  background: none; border: 0; cursor: pointer; padding: 2px 4px; flex-shrink: 0;
}

/* Pendências: âmbar, e antes de gerar. Vermelho é PRAZO neste produto, e
   campo vazio não é erro — é decisão que ainda cabe a ela tomar. */
.ed-pendentes {
  border: 1px solid var(--amarelo); background: var(--amarelo-claro);
  border-radius: var(--raio); padding: var(--e-3) var(--e-4); margin-top: var(--e-2);
}
.ed-pendentes-t { font-size: var(--txt-sm); font-weight: 700; color: var(--amarelo-escuro); }
.ed-pendentes-l { margin: var(--e-2) 0; padding-left: 18px; font-size: var(--txt-sm); color: var(--texto); line-height: 1.6; }
.ed-pendentes-p { font-size: var(--txt-sm); color: var(--texto); line-height: 1.5; margin: 0; }
.ed-pendentes-p code, .ed-aviso-marc code {
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  background: var(--bg-card); padding: 1px 5px; border-radius: 3px;
}
/* ── MARCAR O MODELO COM IA (2026-08-23) ───────────────────────────────────
   O estado do modelo é a informação mais importante do card: sem marcador ele
   não gera edital nenhum — gera uma cópia do edital antigo. */
.me-card--falta { border-left: 3px solid var(--amarelo); }
.me-estado {
  font-size: var(--txt-xs); font-weight: 600; margin-top: var(--e-2);
}
.me-estado--falta { color: var(--amarelo-escuro); }
.me-estado--ok { color: var(--texto-sec); font-weight: 500; }
.me-marcar { font-weight: 700; }

.me-marcacao {
  border: 1px solid var(--borda); border-left: 3px solid var(--ouro);
  border-radius: var(--raio); padding: var(--e-4); margin-top: var(--e-3);
  background: var(--bg-card);
}
.me-bloco-t { font-size: var(--txt-sm); font-weight: 700; margin-top: var(--e-4); }
.me-marcacao > .me-bloco-t:first-child { margin-top: 0; }
.me-bloco-t--alerta { color: var(--vermelho-escuro); }
.me-bloco-p { font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5; margin: var(--e-2) 0 0; }
.me-bloco-p strong { color: var(--texto); }

.me-marc-lista { display: flex; flex-direction: column; gap: 1px; margin-top: var(--e-3); }
/* Cada linha é uma decisão dela: campo, o trecho que a IA achou, e em quantos
   lugares ele aparece. O trecho em mono porque é texto COPIADO do documento —
   ela precisa reconhecer o que está no arquivo, não uma paráfrase. */
.me-marc-item {
  display: flex; align-items: flex-start; gap: var(--e-3);
  padding: 8px; border-radius: var(--raio-sm); cursor: pointer;
}
.me-marc-item:hover { background: var(--bg); }
/* Tamanho fixo: num container flex, o checkbox estica e vira uma barra. */
.me-marc-ck { flex: 0 0 15px; width: 15px; height: 15px; margin: 2px 0 0; cursor: pointer; }
/* `min-width: 0` é o que deixa o trecho longo quebrar em vez de empurrar a
   página inteira para o lado. Sem isto um parágrafo de descrição de bem cria
   rolagem horizontal na tela toda. */
.me-marc-corpo { flex: 1 1 auto; min-width: 0; }
.me-marc-topo { display: flex; align-items: baseline; gap: var(--e-2); }
.me-marc-campo { font-size: var(--txt-sm); font-weight: 600; }
.me-marc-tr {
  display: block; font-family: var(--fonte-mono); font-size: var(--txt-xs);
  color: var(--texto-sec); line-height: 1.5;
  overflow-wrap: anywhere; margin-top: 2px;
}
.me-marc-n {
  flex-shrink: 0; font-size: 10px; font-weight: 700; color: var(--texto-sec);
  background: var(--bg); padding: 2px 7px; border-radius: 999px; white-space: nowrap;
}
.me-marc-item:hover .me-marc-n { background: var(--bg-card); }
.me-sobras { margin: var(--e-2) 0 0; padding-left: 18px; }
.me-sobras li { font-size: var(--txt-sm); line-height: 1.6; margin-bottom: 3px; }
.me-sobra-q { font-weight: 600; }
.me-sobra-t { font-family: var(--fonte-mono); font-size: var(--txt-xs); color: var(--texto-sec); }

/* Minuta que saiu com os dados do modelo. Aqui é VERMELHO, e não âmbar: não é
   pendência nem decisão dela — é um documento errado que já existe, com nome
   de processo certo e conteúdo de outra execução. */
.me-card--suspeita { border-color: var(--vermelho); }
.ed-suspeita {
  font-size: var(--txt-xs); line-height: 1.5; color: var(--texto);
  background: var(--vermelho-claro); border-radius: var(--raio-sm);
  padding: 6px 9px; margin-top: var(--e-2);
}

/* Bloqueio, não pendência: aqui o documento sairia com os dados DE OUTRO
   processo. Continua âmbar (vermelho é prazo), mas com a borda esquerda
   marcada — é parada obrigatória, não decisão dela. */
.ed-pendentes--bloqueio { border-left: 3px solid var(--amarelo-escuro); }
.ed-marc-det { margin: var(--e-3) 0 var(--e-2); }
.ed-marc-det summary {
  font-size: var(--txt-sm); font-weight: 600; color: var(--texto);
  cursor: pointer; padding: 2px 0;
}
.ed-marc-l { margin: var(--e-2) 0 0; padding-left: 18px; font-size: var(--txt-sm); line-height: 1.9; }
.ed-marc-l code {
  font-family: var(--fonte-mono); font-size: var(--txt-xs);
  background: var(--bg-card); padding: 1px 5px; border-radius: 3px;
}
.ed-marc-rot { color: var(--texto-sec); font-size: var(--txt-xs); }

.ed-gerado {
  border: 1px solid var(--borda); border-left: 3px solid var(--verde);
  border-radius: var(--raio); padding: var(--e-3) var(--e-4); margin-top: var(--e-2); background: var(--bg-card);
}
.ed-gerado-t { font-size: var(--txt-sm); font-weight: 700; color: var(--verde-escuro); }
.ed-gerado-p { font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5; margin: var(--e-1) 0 0; }
.ed-aviso-marc {
  font-size: var(--txt-sm); color: var(--texto); line-height: 1.5;
  background: var(--amarelo-claro); border-radius: var(--raio-sm);
  padding: 8px 12px; margin-top: var(--e-3);
}

/* Rascunho com tudo preenchido: verde discreto, não celebração. É estado
   normal, e a ação continua sendo revisar — não "está pronto". */
.ed-completo {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 700;
  color: var(--verde-escuro); background: var(--verde-claro);
  padding: 2px 7px; border-radius: 999px; white-space: nowrap;
}

/* ── CHECKLIST DO ART. 889 (TASK-053, F2) ──────────────────────────────────
   Todos os incisos aparecem SEMPRE. O que não teve achado fica em âmbar,
   como item de conferência — não em vermelho, porque não é erro: é dado que
   a IA não encontrou nas peças, e vermelho neste produto é PRAZO. */
.i889-secao { margin-top: var(--e-5); padding-top: var(--e-4); border-top: 1px solid var(--borda); }
.i889-secao-t { font-size: var(--txt-sm); font-weight: 700; margin-bottom: var(--e-3); }
.i889-resumo {
  font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5;
  border: 1px solid var(--borda); border-left: 3px solid var(--ouro);
  border-radius: var(--raio); padding: 10px 14px; margin-bottom: var(--e-3);
}
.i889-resumo strong { color: var(--texto); }
.i889-lista { display: flex; flex-direction: column; gap: var(--e-3); }
.i889-item { border: 1px solid var(--borda); border-radius: var(--raio); padding: var(--e-3) var(--e-4); background: var(--bg-card); }
.i889-item--verificar { border-left: 3px solid var(--amarelo); }
.i889-topo { display: flex; align-items: baseline; gap: var(--e-2); flex-wrap: wrap; }
/* O numeral romano em mono e caixa: é o endereço legal do item, e a leiloeira
   procura por ele ("o inciso V"), não pelo título. */
/* --texto/--bg-card, e nao branco sobre --neutro-meta: aqueles dois tokens
   CLAREIAM no tema escuro, e o texto branco media 2,50:1 -- reprovado. Este
   par inverte junto com o tema e continua legivel nos dois. */
.i889-rot {
  font-family: var(--fonte-mono); font-size: 11px; font-weight: 700;
  color: var(--bg-card); background: var(--texto);
  padding: 2px 8px; border-radius: 4px; flex-shrink: 0;
}
/* Os complementares (fora do 889) ficam em contorno, nao em solido: sao
   sugestao da Amanda, nao exigencia do artigo, e a diferenca tem de ser
   visivel de relance. */
.i889-rot--fora { background: transparent; color: var(--texto-sec); border: 1px solid var(--borda); }
.i889-titulo { font-size: var(--txt-sm); font-weight: 700; }
.i889-texto { font-size: var(--txt-xs); color: var(--texto-sec); line-height: 1.5; margin: var(--e-2) 0; }
.i889-verificar {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 700;
  color: var(--amarelo-escuro); background: var(--amarelo-claro);
  padding: 2px 7px; border-radius: 999px; white-space: nowrap; margin-left: auto;
}
.i889-ok {
  font-family: var(--fonte-mono); font-size: 10px; font-weight: 700;
  color: var(--verde-escuro); background: var(--verde-claro);
  padding: 2px 7px; border-radius: 999px; white-space: nowrap; margin-left: auto;
}
.i889-pessoa { display: flex; gap: var(--e-2); align-items: center; margin-top: var(--e-2); flex-wrap: wrap; }
.i889-nome { flex: 2 1 200px; }
.i889-fonte { flex: 1 1 160px; }
.i889-x {
  background: none; border: 0; color: var(--cinza); font-size: 18px;
  cursor: pointer; line-height: 1; padding: 0 6px; flex-shrink: 0;
}
.i889-x:hover { color: var(--vermelho-escuro); }
/* Dispensado pelo inciso V: fica VISÍVEL, recuado. Sumir esconderia dela que
   aquele credor existe — e ela pode discordar do cruzamento. */
.i889-disp {
  font-size: var(--txt-sm); color: var(--texto-sec); line-height: 1.5;
  background: var(--bg); border-radius: var(--raio-sm);
  padding: 6px 10px; margin-top: var(--e-2);
}
.i889-fonte-txt { font-size: var(--txt-xs); }
.i889-add {
  background: none; border: 0; padding: 4px 0 0; cursor: pointer;
  font-size: var(--txt-xs); font-weight: 600; color: var(--ouro-texto-forte);
}
.i889-nota {
  font-size: var(--txt-xs); color: var(--texto-sec); line-height: 1.5;
  margin-top: var(--e-3); padding-top: var(--e-2); border-top: 1px dashed var(--borda);
}
