/* ============================================================
   CRM Real Precatório — dourado sobre grafite
   ============================================================ */

:root {
  --dourado: #C9A24B;
  --dourado-hover: #B98E2F;
  --dourado-escuro: #7A5E1C;
  --champanhe: #F0D088;
  --champanhe-tint: #FAF3E3;
  --grafite: #1E1A12;
  --grafite-claro: #3A3324;
  --sidebar-texto: #D8CFBC;
  --offwhite: #FAF8F3;
  --card-borda: #E5DDCC;
  --texto: #1E1A12;
  --texto-suave: #6B6353;
  --marinho: #184078;
  --superficie: #fff;
  --link: var(--marinho);
  --destaque-bg: var(--champanhe-tint);
  --scroll-shadow: rgba(30, 26, 18, 0.18);

  /* Escala de status derivada do dourado da marca — ouro (novo) → âmbar
     (sessão) → bronze (comercial) → grafite (jurídico) — sem azul/roxo/rosa.
     Sucesso (compra) e erro (rejeitado) continuam com semântica própria
     (verde/vermelho), fora dessa escala. */
  --st-novo: #C9A24B;      --st-novo-bg: #F7EED9;      --st-novo-tx: #7A5E1C;
  --st-negoc: #9C7A35;     --st-negoc-bg: #F2E8D3;     --st-negoc-tx: #6B4E1D;
  --st-juri: #6B6045;      --st-juri-bg: #E9E4D4;      --st-juri-tx: #47402A;
  --st-sessao: #EF9F27;    --st-sessao-bg: #FDF0DB;    --st-sessao-tx: #96610D;
  --st-compra: #3B6D11;    --st-compra-bg: #E8F2DD;    --st-compra-tx: #2C520D;
  --st-rejeit: #A32D2D;    --st-rejeit-bg: #F8E5E5;    --st-rejeit-tx: #7E2222;

  /* Tokens semânticos genéricos, derivados da mesma paleta acima — usados por
     componentes novos (dropzone, chips, badges de situação, KPIs) que não são
     amarrados a uma fila/status específico. */
  --sucesso: var(--st-compra);       --sucesso-bg: var(--st-compra-bg);       --sucesso-tx: var(--st-compra-tx);
  --destrutivo: var(--st-rejeit);    --destrutivo-bg: var(--st-rejeit-bg);    --destrutivo-tx: var(--st-rejeit-tx);
  --neutro-bg: #EDE8DA;              --neutro-tx: var(--texto-suave);
  --topbar-altura: 53px;

  /* Hover/seleção de linha: token próprio (em vez de reaproveitar
     --champanhe-tint, que é sempre claro e vira ilegível com texto claro
     no dark mode — ver override abaixo). */
  --row-hover: var(--champanhe-tint);
  --row-hover-fg: var(--texto);

  --fonte: system-ui, -apple-system, "Segoe UI", Inter, Roboto, sans-serif;
  --mono: ui-monospace, "SF Mono", "Cascadia Mono", Consolas, monospace;
}

/* Dark mode: acionado por [data-theme="dark"] no <html> (ver script no <head>
   e o botão .btn-tema). Só os tokens de superfície/texto/borda/link mudam —
   os acentos dourado e os selos de status (badges) ficam como estão, já são
   pílulas com contraste próprio e continuam legíveis sobre um fundo escuro. */
:root[data-theme="dark"] {
  --offwhite: #15120C;
  --superficie: #211C14;
  --card-borda: #3A3324;
  --texto: #F3ECDD;
  --texto-suave: #B9AF98;
  --link: #8FBBEF;
  --destaque-bg: #2A2417;
  --scroll-shadow: rgba(201, 162, 75, 0.28);
  --neutro-bg: #2A2417;
  /* Hover no escuro precisa ser mais claro que o fundo em só ~4-6%, nunca
     um tom claro como no light mode — senão o texto (claro) fica ilegível
     sobre o hover (claro). --superficie (fundo das linhas) tem L≈0.23 em
     OKLCH — 0.28 fica uns 5 pontos acima, perceptível mas discreto. */
  --row-hover: oklch(0.28 0 0);
  --row-hover-fg: var(--texto);
  /* Sem isso, o navegador ignora as cores acima em widgets nativos (menu do
     <select>, seletor de data/hora, scrollbar) e renderiza no esquema claro
     de qualquer forma — mesmo com background/color escuros já aplicados. */
  color-scheme: dark;
}

:root[data-theme="dark"] .btn-secundario:hover { background: var(--grafite-claro); border-color: var(--dourado); }
:root[data-theme="dark"] .btn:disabled:hover { background: var(--superficie); }
:root[data-theme="dark"] .paginacao span.pag-atual { background: var(--dourado); color: var(--grafite); border-color: var(--dourado); }
:root[data-theme="dark"] ::placeholder { color: var(--texto-suave); opacity: .85; }

/* Texto em destaque dourado-escuro sobre a superfície do card (não é pílula)
   fica com pouco contraste no escuro — usa o champanhe, mais claro, aqui. */
:root[data-theme="dark"] .dado dd.valor-grande,
:root[data-theme="dark"] .cartao-stat.stat-dourado .stat-valor,
:root[data-theme="dark"] .processo-valor-destaque,
:root[data-theme="dark"] .alerta-aprovado { color: var(--champanhe); }

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

html, body { height: 100%; }

body {
  font-family: var(--fonte);
  background: var(--offwhite);
  color: var(--texto);
  font-size: 14px;
  line-height: 1.45;
}

a { color: var(--link); text-decoration: none; }
a:hover { text-decoration: underline; }

.mono { font-family: var(--mono); font-size: 0.93em; letter-spacing: -0.01em; }
.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.suave { color: var(--texto-suave); }
.nowrap { white-space: nowrap; }

/* ---------- Ícones ---------- */

.icone { flex-shrink: 0; vertical-align: -3px; color: currentColor; }

.btn .icone { vertical-align: -2px; }

/* Esconde visualmente mas mantém acessível a leitores de tela/navegação
   por teclado (mesma técnica do .input-arquivo-oculto). */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ---------- Layout geral ---------- */

.layout { display: flex; min-height: 100vh; }

.conteudo {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
}

.pagina { padding: 24px 28px 48px; max-width: 1400px; width: 100%; }

/* ---------- Sidebar ---------- */

.sidebar {
  width: 232px;
  flex-shrink: 0;
  background: var(--grafite);
  color: var(--sidebar-texto);
  display: flex;
  flex-direction: column;
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
}

.logo {
  padding: 18px 18px 14px;
  border-bottom: 1px solid rgba(216, 207, 188, 0.12);
}

.logo-imagem {
  display: block;
  width: 100%;
  max-width: 176px;
  height: auto;
}

.logo .logo-nome {
  font-size: 17px;
  font-weight: 700;
  color: var(--champanhe);
  letter-spacing: 0.02em;
}

.logo .logo-nome span { color: #fff; font-weight: 400; }

.logo .logo-sub {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--sidebar-texto);
  opacity: 0.7;
  margin-top: 2px;
}

.nav-secao {
  padding: 14px 18px 4px;
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  opacity: 0.55;
}

.nav-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 9px 18px;
  color: var(--sidebar-texto);
  font-size: 13.5px;
  border-left: 3px solid transparent;
}

.nav-item:hover { background: rgba(255, 255, 255, 0.05); text-decoration: none; }

.nav-item.ativo {
  color: var(--champanhe);
  border-left-color: var(--dourado);
  background: rgba(201, 162, 75, 0.16);
  font-weight: 600;
}

.nav-item-corpo { display: flex; align-items: center; gap: 8px; min-width: 0; }

/* Numeração das filas 1–7 como etapas do funil (a 8ª, Rejeitados, fica fora
   da sequência — ver .nav-secao-rejeitados abaixo). */
.nav-numero {
  flex-shrink: 0;
  width: 17px;
  height: 17px;
  border-radius: 50%;
  border: 1px solid rgba(216, 207, 188, 0.35);
  font-size: 10px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  font-variant-numeric: tabular-nums;
}

.nav-item.ativo .nav-numero { border-color: var(--dourado); color: var(--dourado); }

.nav-item span.nav-rotulo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.nav-secao-rejeitados {
  margin-top: 6px;
  padding-top: 6px;
  border-top: 1px dashed rgba(216, 207, 188, 0.18);
}

.nav-contador {
  font-size: 11.5px;
  background: rgba(255, 255, 255, 0.10);
  border-radius: 99px;
  padding: 1px 8px;
  font-variant-numeric: tabular-nums;
}

.nav-contador-zero { background: transparent; color: rgba(216, 207, 188, 0.45); border: 1px solid rgba(216, 207, 188, 0.18); }

.nav-item.ativo .nav-contador { background: rgba(201, 162, 75, 0.25); color: var(--champanhe); }

/* ---------- Topbar ---------- */

.topbar {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 28px;
  background: var(--superficie);
  border-bottom: 1px solid var(--card-borda);
  position: sticky;
  top: 0;
  z-index: 20;
}

.busca-global { flex: 1; max-width: 560px; position: relative; display: flex; }

.busca-global .icone-busca {
  position: absolute;
  left: 11px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--texto-suave);
  pointer-events: none;
}

.busca-global input {
  width: 100%;
  padding: 8px 40px 8px 34px;
  border: 1px solid var(--card-borda);
  border-radius: 7px;
  font-size: 13.5px;
  background: var(--offwhite);
}

.busca-global input:focus { outline: 2px solid var(--dourado); outline-offset: -1px; background: var(--superficie); }

.busca-global .atalho-busca {
  position: absolute;
  right: 9px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 11px;
  color: var(--texto-suave);
  border: 1px solid var(--card-borda);
  border-radius: 4px;
  padding: 1px 6px;
  pointer-events: none;
  background: var(--superficie);
}

.busca-global .atalho-busca[hidden] { display: none; }

.topbar-usuario { margin-left: auto; display: flex; align-items: center; gap: 12px; font-size: 13px; }

.chip-perfil {
  background: var(--champanhe-tint);
  color: var(--dourado-escuro);
  border: 1px solid var(--champanhe);
  border-radius: 99px;
  padding: 2px 10px;
  font-size: 11.5px;
  font-weight: 600;
}

/* ---------- Menu de avatar (topbar) ---------- */

.menu-avatar { position: relative; }

.menu-avatar > summary {
  list-style: none;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 5px 10px 5px 6px;
  border-radius: 99px;
  border: 1px solid var(--card-borda);
  cursor: pointer;
  color: var(--texto);
  font-size: 13px;
  min-height: 40px;
}

.menu-avatar > summary::-webkit-details-marker { display: none; }
.menu-avatar > summary:hover { border-color: var(--dourado); }

.avatar-iniciais {
  flex-shrink: 0;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--grafite);
  color: var(--champanhe);
  font-size: 11px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
}

.menu-avatar-info { display: flex; flex-direction: column; line-height: 1.25; text-align: left; }
.menu-avatar-info .nome { font-weight: 600; font-size: 12.5px; }
.menu-avatar-info .perfil { font-size: 11px; color: var(--texto-suave); }

.menu-avatar-lista {
  position: absolute;
  right: 0;
  top: calc(100% + 6px);
  min-width: 200px;
  background: var(--superficie);
  border: 1px solid var(--card-borda);
  border-radius: 10px;
  box-shadow: 0 12px 32px rgba(30, 26, 18, 0.18);
  padding: 6px;
  z-index: 30;
}

.menu-avatar-lista .item {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 8px 10px;
  border-radius: 6px;
  font-size: 13px;
  color: var(--texto);
  background: none;
  border: none;
  cursor: pointer;
  text-align: left;
  font-family: inherit;
}

.menu-avatar-lista .item:hover { background: var(--offwhite); }
.menu-avatar-lista .separador { height: 1px; background: var(--card-borda); margin: 6px 2px; }

/* ---------- Cards ---------- */

.card {
  background: var(--superficie);
  border: 1px solid var(--card-borda);
  border-radius: 10px;
  padding: 18px 20px;
  margin-bottom: 18px;
}

.card h2 {
  font-size: 15px;
  margin-bottom: 12px;
  color: var(--texto);
}

.titulo-pagina { display: flex; align-items: baseline; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }
.titulo-pagina h1 { font-size: 20px; color: var(--texto); }
.titulo-pagina .subtitulo { color: var(--texto-suave); font-size: 13px; }

/* Cabeçalho do detalhe do processo: número + badges à esquerda, valor
   requisitado em destaque à direita. */
.processo-cabecalho { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; }
.processo-cabecalho-info { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.processo-cabecalho-info h1 { font-size: 19px; color: var(--texto); }
.processo-valor-destaque { font-size: 22px; font-weight: 700; color: var(--dourado-escuro); white-space: nowrap; }

/* ---------- Botões ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 16px;
  border-radius: 7px;
  border: 1px solid transparent;
  font-size: 13.5px;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  text-decoration: none;
  white-space: nowrap;
  flex-shrink: 0;
}

.btn:hover { text-decoration: none; }

.btn-primario { background: var(--dourado); color: #1E1A12; }
.btn-primario:hover { background: var(--dourado-hover); }

.btn-secundario { background: var(--superficie); color: var(--texto); border-color: #C9C0AC; }
.btn-secundario:hover { background: var(--offwhite); border-color: var(--grafite); }

.btn-perigo { background: var(--superficie); color: var(--st-rejeit); border-color: #DEB4B4; }
.btn-perigo:hover { background: var(--st-rejeit-bg); border-color: var(--st-rejeit); }

.btn-mini { padding: 4px 10px; font-size: 12px; }

.btn:disabled { opacity: .45; cursor: not-allowed; }
.btn:disabled:hover { background: var(--superficie); }

/* ---------- Barra de ações em lote ---------- */

/* Só aparece com ≥1 processo selecionado (toggle da classe .ativa em
   app.js). "sticky bottom" gruda no rodapé da área de conteúdo ao rolar,
   sem cobrir a sidebar — diferente de "fixed", respeita a largura do
   container pai. Entra/sai com transição (max-height + opacity, já que
   display:none — usado antes via [hidden] — não anima) e some por
   completo (sem ocupar espaço) assim que a seleção zera. */
.barra-lote {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  padding: 0 16px;
  margin-top: 0;
  max-height: 0;
  overflow: hidden;
  opacity: 0;
  transform: translateY(8px);
  pointer-events: none;
  background: var(--grafite);
  color: var(--sidebar-texto);
  border-radius: 10px;
  box-shadow: 0 12px 32px rgba(30, 26, 18, 0.28);
  position: sticky;
  bottom: 16px;
  z-index: 15;
  transition: max-height .2s ease, opacity .18s ease, transform .18s ease, padding .2s ease, margin-top .2s ease;
}

.barra-lote.ativa {
  max-height: 160px;
  opacity: 1;
  transform: none;
  pointer-events: auto;
  padding: 12px 16px;
  margin-top: 12px;
}

.lote-contador { font-size: 13px; font-weight: 600; color: var(--champanhe); }

.lote-acoes { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

.lote-acoes form { display: inline-flex; margin: 0; }

.btn-limpar-selecao {
  background: none;
  border: 1px solid rgba(216, 207, 188, 0.35);
  color: var(--sidebar-texto);
  border-radius: 7px;
  padding: 6px 12px;
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
}

.btn-limpar-selecao:hover { border-color: var(--dourado); color: var(--champanhe); }

/* Botões dentro da barra escura precisam de contraste próprio (o
   .btn-secundario/.btn-perigo padrão assume fundo claro). */
.barra-lote .btn-secundario {
  background: rgba(255, 255, 255, 0.06);
  color: var(--sidebar-texto);
  border-color: rgba(216, 207, 188, 0.3);
}
.barra-lote .btn-secundario:hover { background: rgba(255, 255, 255, 0.12); border-color: var(--dourado); color: var(--champanhe); }

.barra-lote .btn-perigo {
  background: rgba(163, 45, 45, 0.18);
  color: #F3B9B9;
  border-color: rgba(163, 45, 45, 0.5);
}
.barra-lote .btn-perigo:hover { background: rgba(163, 45, 45, 0.32); border-color: var(--st-rejeit); }

.col-check { width: 34px; text-align: center; }

/* ---------- Badges de status ---------- */

.badge {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 99px;
  font-size: 11.5px;
  font-weight: 700;
  white-space: nowrap;
}

.badge-novos              { background: var(--st-novo-bg);   color: var(--st-novo-tx); }
.badge-analise_processual { background: var(--st-juri-bg);   color: var(--st-juri-tx); }
.badge-comercial          { background: var(--st-negoc-bg);  color: var(--st-negoc-tx); }
.badge-analise_documental { background: var(--st-juri-bg);   color: var(--st-juri-tx); }
.badge-sessao_pendente    { background: var(--champanhe-tint); color: var(--dourado-escuro); }
.badge-sessao_marcada     { background: var(--st-sessao-bg); color: var(--st-sessao-tx); }
.badge-compra_realizada   { background: var(--st-compra-bg); color: var(--st-compra-tx); }
.badge-rejeitados         { background: var(--st-rejeit-bg); color: var(--st-rejeit-tx); }

.badge-status-pendente { background: var(--st-novo-bg); color: var(--st-novo-tx); border: 1px dashed var(--st-novo-tx); }
.badge-status-negociacao_em_andamento { background: var(--st-sessao-bg); color: var(--st-sessao-tx); }

.badge-aprovado {
  background: var(--champanhe-tint);
  color: var(--dourado-escuro);
  border: 1px solid var(--dourado);
}

.badge-tribunal {
  background: var(--neutro-bg);
  color: var(--texto);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

/* Situação (usuários/API keys): ponto colorido + texto, no lugar do
   antigo emoji de "ativo"/"inativo". */
.badge-situacao { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; font-size: 12.5px; color: var(--texto); }

.ponto-situacao { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.ponto-situacao.ativo { background: var(--sucesso); }
.ponto-situacao.inativo { background: var(--texto-suave); opacity: .5; }

/* ---------- Tabelas ---------- */

/* overflow-x: auto + o par de gradientes "local"/"scroll" abaixo cria uma
   sombra nas bordas que só aparece enquanto houver conteúdo cortado para
   aquele lado (técnica sem JS: fundo que rola com o conteúdo "apaga" a
   sombra fixa por baixo assim que chega no início/fim). */
.tabela-wrap {
  overflow-x: auto;
  background:
    linear-gradient(to right, var(--superficie) 50%, transparent) left,
    linear-gradient(to left, var(--superficie) 50%, transparent) right,
    linear-gradient(to right, var(--scroll-shadow), transparent) left,
    linear-gradient(to left, var(--scroll-shadow), transparent) right;
  background-repeat: no-repeat;
  background-color: var(--superficie);
  background-size: 24px 100%, 24px 100%, 10px 100%, 10px 100%;
  background-attachment: local, local, scroll, scroll;
}

table.tabela { width: 100%; border-collapse: collapse; font-size: 13.5px; }

/* .tabela-processos (a listagem de processos das filas/busca, com colunas
   congeladas) faz table-layout: fixed — isso dá largura determinística a
   cada coluna a partir do th, ignorando o conteúdo. Sem isso, o "left" das
   colunas congeladas abaixo teria que adivinhar a largura real da coluna
   anterior, e qualquer diferença faz a coluna seguinte ficar coberta pela
   congelada. As demais tabelas do sistema continuam com layout automático. */
.tabela-processos { table-layout: fixed; }

/* A coluna "Na fila desde" foi removida (virou texto secundário sob o
   requerente) — larguras recalculadas para caber sem cortar Status em
   1280px mesmo com a coluna Analista visível: Analista e Tribunal foram
   enxugadas, e Status (última coluna) ganhou min-width para os dois chips
   (Etapa + Situação) empilhados sem quebra de linha — ver stacking abaixo
   de 1440px mais adiante no arquivo. */
.tabela-processos .col-check    { width: 34px; }
.tabela-processos .col-processo { width: 130px; }
.tabela-processos .col-requerente { width: 190px; }
.tabela-processos .col-cpf      { width: 118px; }
.tabela-processos .col-tribunal { width: 84px; }
.tabela-processos .col-valor    { width: 128px; }
.tabela-processos .col-analista { width: 100px; }
/* 210px cabe o chip de status comercial mais longo ("Negociação em
   andamento", ~196px de largura natural) empilhado sob o chip de etapa,
   sem cortar nem cada um encolher o texto. */
.tabela-processos .col-status   { width: 210px; min-width: 210px; }

/* Status é sempre a última coluna e nunca tem overflow escondido: os dois
   chips (Etapa + Situação) ficam lado a lado enquanto há espaço e empilham
   verticalmente abaixo de 1440px, evitando quebra de linha dentro do chip. */
.tabela-processos td.col-status { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }

@media (max-width: 1440px) {
  .tabela-processos td.col-status { flex-direction: column; align-items: flex-start; }
}

/* Cabeçalho grudado no topo ao rolar verticalmente, além das colunas
   grudadas na horizontal — precisa de z-index maior que as colunas fixas
   do corpo para não ficar por baixo delas no canto superior esquerdo. */
.tabela-processos thead th {
  position: sticky;
  top: 0;
  z-index: 3;
  background: var(--superficie);
}

/* Colunas "congeladas" à esquerda (Processo + Requerente, e o checkbox de
   seleção em lote quando presente): cada uma soma a largura das anteriores
   no seu "left", então a próxima nunca fica coberta — ela só desliza por
   baixo das que já são fixas, nunca por baixo de uma nova. */
.tabela-processos th.col-fixa, .tabela-processos td.col-fixa,
.tabela-processos th.col-check, .tabela-processos td.col-check {
  position: sticky;
  background: var(--superficie);
}

.tabela-processos th.col-fixa, .tabela-processos td.col-fixa { left: 0; }
.tabela-processos.tabela-com-selecao th.col-fixa, .tabela-processos.tabela-com-selecao td.col-fixa { left: 34px; }

.tabela-processos th.col-requerente-fixa, .tabela-processos td.col-requerente-fixa {
  position: sticky;
  left: 130px;
  background: var(--superficie);
  border-right: 1px solid var(--card-borda);
}
.tabela-processos.tabela-com-selecao th.col-requerente-fixa, .tabela-processos.tabela-com-selecao td.col-requerente-fixa { left: 164px; }

/* Cantos (coluna fixa × cabeçalho fixo) precisam do maior z-index: ficam
   presos nos dois eixos e não podem ficar por baixo nem do cabeçalho comum
   nem das colunas fixas do corpo. */
.tabela-processos th.col-fixa, .tabela-processos th.col-check, .tabela-processos th.col-requerente-fixa { z-index: 4; }
.tabela-processos td.col-fixa, .tabela-processos td.col-check, .tabela-processos td.col-requerente-fixa { z-index: 1; }

.tabela-processos td.col-fixa { padding-top: 6px; padding-bottom: 6px; }

/* Número do processo: trunca no MEIO (nunca no fim), preservando o sufixo
   (que carrega o dígito verificador/tribunal — a parte que mais importa
   pra reconhecer o processo de relance). Truque sem JS: dois spans num
   flex, só o primeiro (prefixo) pode encolher/cortar com reticências; o
   segundo (sufixo) tem largura de conteúdo e nunca é cortado. Tooltip
   nativo (title) sempre mostra o número inteiro. */
.processo-numero {
  display: flex;
  align-items: center;
  gap: 4px;
  min-width: 0;
}

.processo-numero-link {
  display: flex;
  min-width: 0;
  color: inherit;
  font-size: 12px;
}

.processo-numero-prefixo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
  flex: 1 1 auto;
}

.processo-numero-sufixo { flex: 0 0 auto; white-space: nowrap; }

/* Botão de copiar: só aparece (via opacidade) com hover/foco na linha ou
   nele mesmo, pra não empilhar ruído visual na tabela inteira. */
.btn-copiar-processo {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 2px;
  border: none;
  background: none;
  color: var(--texto-suave);
  cursor: pointer;
  border-radius: 4px;
  opacity: 0;
}

tr:hover .btn-copiar-processo,
tr:focus-within .btn-copiar-processo,
.cartao-processo:hover .btn-copiar-processo,
.btn-copiar-processo:focus-visible {
  opacity: 1;
}

.btn-copiar-processo:hover { color: var(--dourado); }
.btn-copiar-processo:focus-visible { outline: 2px solid var(--dourado); outline-offset: 1px; }
.btn-copiar-processo.copiado { color: var(--sucesso); opacity: 1; }

.tabela-processos tbody tr:hover td.col-fixa,
.tabela-processos tbody tr:hover td.col-check,
.tabela-processos tbody tr:hover td.col-requerente-fixa { background: var(--row-hover); color: var(--row-hover-fg); }

/* Texto secundário sob o requerente (substitui a coluna "Na fila desde"):
   tempo relativo calculado no servidor, com a data/hora absoluta no title
   (tooltip nativo do atributo). */
.requerente-tempo { display: block; font-size: 11px; color: var(--texto-suave); margin-top: 1px; font-weight: 400; cursor: help; }

tr[data-href]:focus-visible, .cartao-processo:focus-visible {
  outline: 2px solid var(--dourado);
  outline-offset: -2px;
  background: var(--row-hover);
  color: var(--row-hover-fg);
}

/* Colunas congeladas não herdam o background acima (têm o próprio,
   necessário para cobrir o conteúdo que desliza por baixo ao rolar) —
   repete o token nelas para teclado e seleção não caírem no bug do hover. */
.tabela-processos tbody tr:focus-visible td.col-fixa,
.tabela-processos tbody tr:focus-visible td.col-check,
.tabela-processos tbody tr:focus-visible td.col-requerente-fixa {
  background: var(--row-hover);
  color: var(--row-hover-fg);
}

/* Linha com checkbox marcado (seleção em lote): fundo persistente,
   distinto do hover transitório, também à prova do bug de contraste. */
.tabela-processos tbody tr:has(.chk-processo:checked) td {
  background: var(--destaque-bg);
}
.tabela-processos tbody tr:has(.chk-processo:checked) td.col-fixa,
.tabela-processos tbody tr:has(.chk-processo:checked) td.col-check,
.tabela-processos tbody tr:has(.chk-processo:checked) td.col-requerente-fixa {
  background: var(--destaque-bg);
}

.tabela th {
  text-align: left;
  font-size: 11.5px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--texto-suave);
  padding: 8px 10px;
  border-bottom: 2px solid var(--card-borda);
  white-space: nowrap;
}

.tabela td { padding: 9px 10px; border-bottom: 1px solid var(--card-borda); vertical-align: middle; }

.tabela tbody tr:hover { background: var(--row-hover); color: var(--row-hover-fg); }

.tabela th.num { text-align: right; }

.linha-aprovada td:first-child { box-shadow: inset 3px 0 0 var(--dourado); }

/* ---------- Lista de cards (mobile) ----------
   Mesmos dados de .tabela-processos, em cards empilhados — trocado por CSS
   no breakpoint de 768px (ver media query no fim do arquivo), sem duplicar
   a consulta/loop no backend. */
.lista-cards { display: none; flex-direction: column; gap: 10px; }

.cartao-processo {
  display: block;
  width: 100%;
  text-align: left;
  background: var(--superficie);
  border: 1px solid var(--card-borda);
  border-radius: 10px;
  padding: 12px 14px;
  color: inherit;
  font-family: inherit;
  cursor: pointer;
}

.cartao-processo.linha-aprovada { box-shadow: inset 3px 0 0 var(--dourado); }
.cartao-processo:hover { background: var(--row-hover); color: var(--row-hover-fg); }

.cartao-processo-topo { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }

.cartao-processo .cp-requerente { font-size: 14.5px; font-weight: 700; }
.cartao-processo .cp-valor { font-size: 15px; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
.cartao-processo .cp-processo { display: block; font-size: 12px; color: var(--texto-suave); margin-top: 2px; }
.cartao-processo .cp-tempo { display: block; font-size: 11.5px; color: var(--texto-suave); margin-top: 1px; }

.cartao-processo-rodape { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 10px; }

.cartao-processo-selecao { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.cartao-processo-selecao input { width: 18px; height: 18px; }

/* ---------- Formulários ---------- */

label.rotulo { display: block; font-size: 12px; font-weight: 600; color: var(--texto-suave); margin: 10px 0 4px; }

input.campo, select.campo, textarea.campo {
  width: 100%;
  padding: 8px 10px;
  border: 1px solid var(--card-borda);
  border-radius: 6px;
  font-size: 13.5px;
  font-family: inherit;
  background: var(--superficie);
  color: var(--texto);
}

input.campo:focus, select.campo:focus, textarea.campo:focus {
  outline: 2px solid var(--dourado);
  outline-offset: -1px;
}

textarea.campo { resize: vertical; min-height: 70px; }

/* Upload de arquivo: o <input type="file"> nativo é escondido de forma
   acessível (continua focável via teclado e leitores de tela) e um <label>
   com o mesmo estilo dos outros botões dispara o seletor de arquivos —
   evita o botão cinza padrão do sistema operacional, fora da identidade
   visual dourada/escura do resto da aplicação. */
.campo-arquivo { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; }

.input-arquivo-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.input-arquivo-oculto:focus-visible + .btn-arquivo {
  outline: 2px solid var(--dourado);
  outline-offset: 1px;
}

.nome-arquivo { font-size: 12.5px; color: var(--texto-suave); }

.form-linha { display: flex; gap: 12px; }
.form-linha > div { flex: 1; }

.filtros-avancados { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
.filtros-linha { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }

/* Campo de data mascarado (dd/mm/aaaa) — substitui <input type="date">
   nativo, que exibe no formato do SO/navegador (fora do nosso controle). O
   name/valor enviados continuam texto pt-BR, que o backend já entende
   (parse_data_br tenta "%d/%m/%Y" primeiro). */
.campo-data { font-variant-numeric: tabular-nums; }
.campo-data:invalid { border-color: var(--st-rejeit); }

/* "Mais filtros": <details> nativo no desktop; vira sheet no rodapé da tela
   no mobile (ver media query ≤768px no fim do arquivo). */
.mais-filtros { margin-top: 2px; }

.mais-filtros > summary {
  list-style: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  cursor: pointer;
  font-size: 13px;
  font-weight: 600;
  color: var(--texto-suave);
  padding: 6px 2px;
}

.mais-filtros > summary::-webkit-details-marker { display: none; }
.mais-filtros > summary:hover { color: var(--texto); }
.mais-filtros[open] > summary .icone { transform: rotate(180deg); }
.mais-filtros .icone { transition: transform .15s ease; }

.mais-filtros-corpo { padding-top: 10px; display: flex; flex-direction: column; gap: 10px; }

/* Botão "Filtros" com contador (só aparece ≤768px — ver media query) */
.btn-filtros-mobile {
  display: none;
  align-items: center;
  gap: 6px;
  background: var(--superficie);
  border: 1px solid var(--card-borda);
  border-radius: 7px;
  padding: 8px 14px;
  font-size: 13.5px;
  font-weight: 600;
  color: var(--texto);
  cursor: pointer;
  font-family: inherit;
}

.contador-pill {
  background: var(--dourado);
  color: #1E1A12;
  border-radius: 99px;
  font-size: 11px;
  font-weight: 700;
  padding: 1px 7px;
  font-variant-numeric: tabular-nums;
}

.filtros-backdrop { display: none; }
.filtros-backdrop.ativo {
  display: block;
  position: fixed;
  inset: 0;
  background: rgba(30, 26, 18, 0.5);
  z-index: 49;
}

/* Chips de filtros ativos */

.chips-filtro { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 2px; }

.chip-filtro {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  background: var(--destaque-bg);
  border: 1px solid var(--champanhe);
  color: var(--dourado-escuro);
  border-radius: 99px;
  padding: 3px 6px 3px 11px;
  font-size: 12px;
  font-weight: 600;
}

.chip-filtro button {
  background: none;
  border: none;
  color: inherit;
  cursor: pointer;
  display: flex;
  padding: 2px;
  border-radius: 50%;
}
.chip-filtro button:hover { background: rgba(122, 94, 28, 0.15); }

.chip-limpar-filtros {
  background: none;
  border: none;
  color: var(--texto-suave);
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  text-decoration: underline;
  padding: 3px 4px;
  font-family: inherit;
}
.chip-limpar-filtros:hover { color: var(--texto); }

/* ---------- Flash messages ---------- */

.flashes { padding: 0 28px; margin-top: 14px; }

.flash {
  padding: 10px 14px;
  border-radius: 8px;
  margin-bottom: 8px;
  font-size: 13.5px;
  border: 1px solid;
}

.flash-ok   { background: var(--st-compra-bg);  color: var(--st-compra-tx);  border-color: #BCD8A2; }
.flash-erro { background: var(--st-rejeit-bg);  color: var(--st-rejeit-tx);  border-color: #DEB4B4; }

/* ---------- Estado vazio ---------- */

.vazio {
  text-align: center;
  padding: 48px 20px;
  color: var(--texto-suave);
}

.vazio .vazio-icone {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--neutro-bg);
  color: var(--texto-suave);
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 12px;
}

.vazio h3 { font-size: 14.5px; color: var(--texto); margin-bottom: 4px; }
.vazio p { max-width: 420px; margin: 0 auto; }
.vazio .vazio-cta { margin-top: 14px; }

/* Empty states secundários do dashboard: bem mais baixos, para não abrir
   um vão vertical grande entre cards. */
.vazio-compacto { padding: 18px 20px; min-height: 120px; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.vazio-compacto .vazio-icone { width: 40px; height: 40px; margin-bottom: 8px; }

/* ---------- Paginação ---------- */

.paginacao { display: flex; align-items: center; gap: 10px; margin-top: 14px; font-size: 13px; }

.paginacao a, .paginacao span.pag-atual {
  padding: 5px 11px;
  border: 1px solid var(--card-borda);
  border-radius: 6px;
  background: var(--superficie);
}

.paginacao span.pag-atual { background: var(--grafite); color: var(--champanhe); border-color: var(--grafite); }

/* ---------- Página do processo ---------- */

.grade-processo { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 18px; align-items: start; }

@media (max-width: 1100px) { .grade-processo { grid-template-columns: 1fr; } }

/* Coluna direita empilha os cards normalmente; só o de "Ações" gruda no
   topo ao rolar (o valor de --topbar-altura soma a folga da própria
   topbar, que também é sticky, para não ficar um por cima do outro). */
.coluna-lateral-processo { display: flex; flex-direction: column; gap: 18px; }
.card-acoes-sticky { position: sticky; top: calc(var(--topbar-altura) + 12px); margin-bottom: 0; }

.bloco-dados { margin-bottom: 16px; }
.bloco-dados:last-child { margin-bottom: 0; }
.bloco-dados h3 {
  font-size: 11.5px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--texto-suave);
  margin-bottom: 8px;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--card-borda);
}

.dados-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 22px; }

.dado dt { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--texto-suave); }
.dado dd { margin-top: 1px; font-size: 13.5px; word-break: break-word; }
.dado dd.valor-grande { font-size: 17px; font-weight: 700; color: var(--dourado-escuro); }

.dado-vazio[hidden] { display: none; }

.btn-campos-vazios {
  background: none;
  border: none;
  color: var(--link);
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
  padding: 6px 0 0;
  font-family: inherit;
}
.btn-campos-vazios:hover { text-decoration: underline; }

.acoes-lista { display: flex; flex-direction: column; gap: 8px; }
.acoes-lista .btn { justify-content: center; }

/* Timeline */

.timeline-grupo-titulo {
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.07em;
  color: var(--texto-suave);
  margin: 14px 0 8px;
}
.timeline-grupo-titulo:first-child { margin-top: 0; }

.timeline { list-style: none; }

.timeline li {
  position: relative;
  padding: 0 0 14px 26px;
  border-left: 2px solid var(--card-borda);
  margin-left: 9px;
}

.timeline .timeline-icone {
  position: absolute;
  left: -13px;
  top: 0;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--superficie);
  border: 2px solid var(--dourado);
  color: var(--dourado-escuro);
  display: flex;
  align-items: center;
  justify-content: center;
}

.timeline li:last-child { padding-bottom: 0; }

.timeline .quando { font-size: 11.5px; color: var(--texto-suave); }
.timeline .oque { font-size: 13px; margin-top: 1px; }

/* Comentários */

.comentario { display: flex; gap: 10px; border-top: 1px solid var(--card-borda); padding: 12px 0; }
.comentario:first-of-type { border-top: none; }
.comentario .autor { font-weight: 600; font-size: 13px; }
.comentario .quando { font-size: 11.5px; color: var(--texto-suave); margin-left: 6px; font-weight: 400; }
.comentario .texto { margin-top: 3px; white-space: pre-wrap; }
.comentario .avatar-iniciais { margin-top: 1px; }

/* Anexos */

.anexo-item { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 7px 0; border-top: 1px solid var(--card-borda); font-size: 13px; }
.anexo-item:first-of-type { border-top: none; }
.anexo-item .anexo-nome { display: inline-flex; align-items: center; gap: 6px; }

/* Dropzone de anexos: substitui o botão "Escolher arquivo(s)" isolado.
   Continua controlando o mesmo <input type="file"> oculto — arrastar
   soltar só popula esse input via DataTransfer (ver app.js), então o
   submit do form não muda em nada no backend. */
.dropzone {
  border: 1.5px dashed var(--card-borda);
  border-radius: 10px;
  padding: 22px 16px;
  text-align: center;
  color: var(--texto-suave);
  cursor: pointer;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  transition: border-color .15s ease, background .15s ease;
}

.dropzone:hover, .dropzone.arrastando { border-color: var(--dourado); background: var(--destaque-bg); }
.dropzone .icone { color: var(--texto-suave); }
.dropzone .dropzone-texto { font-size: 13px; }
.dropzone .dropzone-dica { font-size: 11.5px; opacity: .8; }

.dropzone-lista { display: flex; flex-direction: column; gap: 6px; margin-top: 10px; }

.dropzone-arquivo {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 6px 10px;
  background: var(--offwhite);
  border: 1px solid var(--card-borda);
  border-radius: 7px;
  font-size: 12.5px;
}

.dropzone-arquivo .nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dropzone-arquivo .tamanho { color: var(--texto-suave); flex-shrink: 0; }
.dropzone-arquivo button {
  background: none;
  border: none;
  color: var(--texto-suave);
  cursor: pointer;
  display: flex;
  flex-shrink: 0;
  padding: 2px;
}
.dropzone-arquivo button:hover { color: var(--st-rejeit); }

/* Alertas contextuais */

.alerta {
  border-radius: 8px;
  padding: 12px 14px;
  margin-bottom: 16px;
  font-size: 13.5px;
  border: 1px solid;
}

.alerta-aprovado { background: var(--destaque-bg); border-color: var(--dourado); color: var(--dourado-escuro); }
.alerta-rejeitado { background: var(--st-rejeit-bg); border-color: var(--st-rejeit); color: var(--st-rejeit-tx); }
.alerta-sessao { background: var(--st-sessao-bg); border-color: var(--st-sessao); color: var(--st-sessao-tx); }

/* ---------- Dialogs (modais) ---------- */

dialog {
  border: none;
  border-radius: 12px;
  padding: 0;
  width: min(440px, 92vw);
  box-shadow: 0 20px 60px rgba(30, 26, 18, 0.35);
  background: var(--superficie);
  color: var(--texto);
}

dialog::backdrop { background: rgba(30, 26, 18, 0.55); }

.dialog-corpo { padding: 20px 22px; }
.dialog-corpo h3 { font-size: 15.5px; margin-bottom: 6px; }
.dialog-corpo .dica { font-size: 12.5px; color: var(--texto-suave); }
.dialog-acoes { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }

/* ---------- Dashboard ---------- */

.cartoes { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px; margin-bottom: 18px; }

.cartao-stat {
  background: var(--superficie);
  border: 1px solid var(--card-borda);
  border-radius: 10px;
  padding: 14px 16px;
}

.cartao-stat .stat-rotulo { font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.07em; color: var(--texto-suave); }
.cartao-stat .stat-valor { font-size: 24px; font-weight: 700; margin-top: 4px; color: var(--texto); }
.cartao-stat.stat-dourado .stat-valor { color: var(--dourado-escuro); }

.stat-variacao { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; font-weight: 600; margin-top: 5px; }
.stat-variacao.alta { color: var(--sucesso); }
.stat-variacao.baixa { color: var(--destrutivo); }
.stat-variacao .suave { font-weight: 400; }

/* Grid de duas colunas no desktop para "Evolução dos analistas" + "Agenda
   de sessões" (cada card mantém seu próprio .card, só o wrapper vira grid). */
.grid-dashboard-2col { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; align-items: start; }
.grid-dashboard-2col > .card { margin-bottom: 0; }

/* ---------- Filtro de período (dashboard) ---------- */

.filtro-periodo { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; }

.periodo-presets { display: flex; flex-wrap: wrap; gap: 6px; }

.chip-periodo {
  padding: 5px 12px;
  border-radius: 99px;
  border: 1px solid var(--card-borda);
  color: var(--texto-suave);
  font-size: 12.5px;
  font-weight: 600;
  background: var(--superficie);
}

.chip-periodo:hover { border-color: var(--dourado); color: var(--texto); text-decoration: none; }

.chip-periodo.ativo { background: var(--grafite); border-color: var(--grafite); color: var(--champanhe); }

/* O chip "Personalizado" é um <button>, não um <a> como os presets —
   precisa reafirmar fonte/cursor que os outros herdavam de graça. */
button.chip-periodo { font-family: inherit; cursor: pointer; }

.periodo-custom { display: none; align-items: center; gap: 8px; }
.periodo-custom input.campo { width: 130px; padding: 6px 10px; }
.periodo-custom.ativo { display: flex; padding: 4px 8px; border-radius: 8px; background: var(--champanhe-tint); }

/* "Personalizado" some quando os chips de preset estão visíveis, e
   vice-versa — nunca os dois ao mesmo tempo (ver JS de toggle). */
.periodo-presets.oculto { display: none; }

.card-legenda { font-size: 12px; margin: -8px 0 14px; }

/* ---------- Funil de conversão ---------- */

.funil { display: flex; flex-direction: column; gap: 10px; }

/* O valor numérico fica sempre numa coluna própria, fora da barra: a barra
   nunca contém texto, então não há como o número "cortar" com ela curta.
   A coluna do valor usa minmax (em vez de largura fixa) para não espremer
   números grandes. */
.funil-linha { display: grid; grid-template-columns: 200px 1fr minmax(44px, auto); align-items: center; gap: 12px; }

.funil-rotulo { display: flex; flex-direction: column; gap: 2px; }
.funil-conversao { font-size: 11px; }

.funil-barra-trilho { background: var(--offwhite); border-radius: 6px; height: 14px; overflow: hidden; }

/* Sem min-width por padrão: em 0%, a barra não deve deixar nenhum resíduo
   visível. Só as barras com quantidade > 0 (classe .funil-barra-preenchida,
   aplicada no template) recebem uma largura mínima para não sumir de vista
   quando a etapa tem só 1-2 processos. */
.funil-barra { height: 100%; width: 0; border-radius: 6px; transition: width .3s ease; }
.funil-barra.funil-barra-preenchida { min-width: 3px; }

.funil-barra-novos              { background: var(--st-novo); }
.funil-barra-analise_processual { background: var(--st-juri); }
.funil-barra-comercial          { background: var(--st-negoc); }
.funil-barra-analise_documental { background: var(--st-juri); }
.funil-barra-sessao_pendente    { background: var(--dourado); }
.funil-barra-sessao_marcada     { background: var(--st-sessao); }
.funil-barra-compra_realizada   { background: var(--st-compra); }

.funil-valor { font-weight: 700; }

/* ---------- Evolução dos analistas ---------- */

.evolucao-lista { display: flex; flex-direction: column; gap: 16px; }

.evolucao-linha { display: grid; grid-template-columns: 200px 1fr; gap: 16px; align-items: end; }

.evolucao-nome { font-size: 13px; font-weight: 600; }
.evolucao-totais { font-weight: 400; font-size: 11.5px; margin-top: 2px; }

.evolucao-barras { display: flex; align-items: flex-end; gap: 5px; height: 56px; }

.evolucao-semana { flex: 1; height: 100%; display: flex; align-items: flex-end; max-width: 22px; }

.evolucao-coluna { width: 100%; display: flex; align-items: flex-end; gap: 2px; height: 100%; }

.evolucao-segmento { flex: 1; min-height: 2px; border-radius: 2px 2px 0 0; }
.evolucao-compra { background: var(--dourado); }
.evolucao-rejeicao { background: var(--st-rejeit); }

.evolucao-legenda { display: flex; gap: 16px; margin-top: 12px; font-size: 12px; color: var(--texto-suave); }
.evolucao-legenda .ponto { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin-right: 5px; }
.ponto-compra { background: var(--dourado); }
.ponto-rejeicao { background: var(--st-rejeit); }

.evolucao-atraso { margin-left: 6px; }

/* ---------- Login ---------- */

.login-fundo {
  min-height: 100vh;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 22px;
  padding: 24px 16px;
  background: var(--grafite);
  background-image: radial-gradient(ellipse at top, #3A3324 0%, var(--grafite) 60%);
}

/* Fundo da página de login é sempre escuro (nos dois temas), então a logo
   clara da sidebar — já recolorida pra contraste em fundo escuro — encaixa
   aqui sem precisar de outra variante. */
.login-topo { display: flex; flex-direction: column; align-items: center; }

.login-logo-imagem {
  display: block;
  width: 260px;
  max-width: 70vw;
  height: auto;
}

.login-logo-sub {
  margin-top: 8px;
  font-size: 11.5px;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--sidebar-texto);
  opacity: 0.75;
}

.login-card {
  width: min(380px, 92vw);
  background: var(--superficie);
  border-radius: 16px;
  padding: 34px 32px;
  box-shadow: 0 30px 90px rgba(0, 0, 0, 0.35);
}

.login-card .btn { width: 100%; justify-content: center; margin-top: 18px; }

/* Painel lateral com a marca (desktop): a página vira duas colunas — a
   marca à esquerda (mesmo fundo escuro/gradiente de sempre) e o card de
   login à direita, num container claro. Abaixo do breakpoint, colapsa de
   volta para o layout centralizado atual. */
@media (min-width: 860px) {
  .login-fundo {
    flex-direction: row;
    justify-content: center;
    gap: 0;
    padding: 0;
  }

  .login-topo {
    flex: 1;
    max-width: 560px;
    height: 100vh;
    justify-content: center;
  }

  .login-lado-claro {
    flex: 1;
    max-width: 560px;
    height: 100vh;
    background: var(--offwhite);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px;
  }
}

/* ---------- Chave de API exibida uma única vez ---------- */

.chave-nova {
  background: var(--champanhe-tint);
  border: 1px dashed var(--dourado);
  border-radius: 8px;
  padding: 12px 14px;
  margin-bottom: 16px;
  word-break: break-all;
}

/* ---------- Barra de progresso global (navegação) ----------
   App 100% SSR: cada clique em link/envio de formulário recarrega a
   página inteira. Esta barra dá feedback de "carregando" nesse intervalo,
   substituindo a ideia de skeleton (que exigiria fetch client-side). */
#barra-progresso {
  position: fixed;
  top: 0;
  left: 0;
  height: 3px;
  width: 0;
  background: var(--dourado);
  z-index: 999;
  transition: width .4s ease, opacity .2s ease .3s;
  opacity: 0;
}
#barra-progresso.ativa { opacity: 1; transition: width .4s ease; }

/* ---------- Toasts ---------- */

#toasts {
  position: fixed;
  right: 18px;
  bottom: 18px;
  z-index: 60;
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: min(320px, calc(100vw - 36px));
}

.toast {
  background: var(--grafite);
  color: var(--sidebar-texto);
  border-radius: 9px;
  padding: 11px 14px;
  font-size: 13px;
  box-shadow: 0 12px 32px rgba(30, 26, 18, 0.3);
  display: flex;
  align-items: center;
  gap: 8px;
  animation: toast-entrar .2s ease;
}

.toast.toast-erro { background: var(--st-rejeit); color: #fff; }
.toast.toast-saindo { animation: toast-sair .2s ease forwards; }

@keyframes toast-entrar { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes toast-sair { to { opacity: 0; transform: translateY(6px); } }

/* ---------- Responsivo (notebook 1366px) ---------- */

@media (max-width: 1366px) {
  .pagina { padding: 18px 20px 40px; }
  .sidebar { width: 208px; }
}

/* ---------- Responsivo (tablet/celular ≤900px): sidebar vira drawer ---------- */

.btn-menu {
  display: none;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: 1px solid var(--card-borda);
  background: var(--superficie);
  border-radius: 7px;
  cursor: pointer;
  color: var(--texto);
}

/* ---------- Botão de alternar tema ---------- */

/* Botão-ícone (Moon/Sun via _icones.html) — antes era um <button> com
   emoji como texto, o que em várias fontes/plataformas renderiza como um
   quadrado vazio (glyph ausente) e ignora o tema. */
.btn-tema {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: 1px solid var(--card-borda);
  background: var(--superficie);
  color: var(--texto);
  border-radius: 7px;
  cursor: pointer;
  flex-shrink: 0;
}

.btn-tema:hover { border-color: var(--dourado); }
.btn-tema .icone-lua { display: none; }
:root[data-theme="dark"] .btn-tema .icone-sol { display: none; }
:root[data-theme="dark"] .btn-tema .icone-lua { display: inline-flex; }

.btn-tema-login { position: absolute; top: 18px; right: 18px; }

.overlay-menu {
  display: none;
  position: fixed;
  inset: 0;
  background: rgba(30, 26, 18, 0.5);
  z-index: 30;
}

@media (max-width: 900px) {
  .btn-menu { display: inline-flex; }

  .sidebar {
    position: fixed;
    inset: 0 auto 0 0;
    width: 248px;
    transform: translateX(-100%);
    transition: transform .2s ease;
    z-index: 40;
  }

  body.menu-aberto .sidebar { transform: translateX(0); }
  body.menu-aberto .overlay-menu { display: block; }
  body.menu-aberto { overflow: hidden; }

  .pagina { padding: 16px 16px 36px; }
  .topbar { padding: 10px 16px; gap: 10px; }
  .busca-global { max-width: none; }

  .form-linha, .filtros-linha { flex-direction: column; align-items: stretch; }
  .filtros-linha > div { min-width: 0 !important; }

  .funil-linha { grid-template-columns: 1fr; gap: 6px; }
  .funil-valor { text-align: left; }

  .evolucao-linha { grid-template-columns: 1fr; gap: 8px; }

  .grade-processo { grid-template-columns: 1fr; }
}

@media (max-width: 480px) {
  .cartoes { grid-template-columns: repeat(2, 1fr); }
  .dados-grid { grid-template-columns: 1fr; }
  .menu-avatar-info { display: none; }
  .filtro-periodo { flex-direction: column; align-items: stretch; }
  .periodo-custom { flex-wrap: wrap; }
  .periodo-custom input.campo { width: auto; flex: 1; min-width: 110px; }
}

/* ---------- Responsivo (mobile ≤768px): cards no lugar da tabela, filtros
   em sheet, ações em massa via checkbox visível no card ---------- */

@media (max-width: 768px) {
  .tabela-wrap-processos { display: none; }
  .lista-cards { display: flex; }

  .busca-global .atalho-busca { display: none; }

  .btn-filtros-mobile { display: inline-flex; }

  /* O form de filtros inteiro vira uma sheet fixa no rodapé da tela,
     escondida por padrão — o botão "Filtros" (acima) e o backdrop (JS)
     controlam a classe .sheet-aberta. */
  .filtros-avancados { display: none; }
  .filtros-avancados.sheet-aberta {
    display: flex;
    position: fixed;
    inset: auto 0 0 0;
    z-index: 50;
    background: var(--superficie);
    border-radius: 16px 16px 0 0;
    padding: 16px 16px calc(16px + env(safe-area-inset-bottom));
    max-height: 82vh;
    overflow-y: auto;
    box-shadow: 0 -12px 40px rgba(30, 26, 18, 0.3);
    margin: 0;
  }

  .grid-dashboard-2col { grid-template-columns: 1fr; }
  .card-acoes-sticky { position: static; }
}

@media (max-width: 1100px) {
  .card-acoes-sticky { position: static; }
}

@media print { .sidebar, .topbar, .btn-menu, .overlay-menu { display: none; } }
