/* =========================================================================
   Talkline · Posicao de Pedido — style.css
   Identidade visual ESPELHADA do painel "Fluxo de Entrada e Saida".
   Tema UNICO: branco + masthead teal escuro da marca (sem alternador).
   Sem nenhum CDN (offline-friendly). Comentarios em pt-BR sem acento.

   PALETA (manual Talkline / Burnier):
     teais:   #0A3C47 #134E5B #1B606E #247780  (analogas ciano #1E8C99 #16707C)
     claros:  #98C2CC #B8D6DC #CFE3E7 #E6F0F2
     neutros: #F3F2EF #202020 #303030 #3E3E3E
   ========================================================================= */

:root {
  --fundo:        #E6F0F2;   /* azul-claro da marca (fundo da pagina) */
  --painel:       #ffffff;   /* cards/paineis brancos */
  --log:          #08252b;   /* console de log: teal bem escuro */
  --texto:        #202020;   /* escuro da marca (texto no conteudo branco) */
  --texto-claro:  #F3F2EF;   /* texto sobre o masthead teal */
  --dim:          #4d717a;   /* teal-acinzentado (rotulos/secundario) */
  --teal:         #1B606E;   /* teal primario da marca */
  --teal-hover:   #247780;   /* teal da marca (hover) */
  --ok:           #1E8C99;   /* analoga ciano (acao confirmar) */
  --neutro:       #B8D6DC;   /* azul-claro da marca (botoes neutros) */

  /* Coluna Estoque: a largura mora AQUI porque o JS precisa dela para decidir
     quantos nomes de loja cabem inteiros na celula (ver EST_REGUA em app.js) e
     duas fontes de verdade para a mesma medida divergem no primeiro ajuste.
     --tabela-pad-x e o padding lateral da celula: o que sobra para o texto e
     --est-col menos duas vezes ele. */
  --est-col:      285px;
  --tabela-pad-x: 12px;

  --painel-borda: #B8D6DC;
  --painel-claro: #CFE3E7;
  --campo:        #ffffff;
  --erro:         #c0392b;
  --verde:        #0f9b86;   /* semantico: processado/ok */
  --amarelo:      #B45309;   /* semantico: nao processado/pendente (ambar quente:
                                o oliva antigo #9a7d10 embarrava em area grande) */
  --vermelho:     #c0504d;   /* semantico: erro */
  --azul-info:    #16707C;   /* semantico: info */
  --amarelo-forte:#97430B;   /* mesmo ambar, um degrau mais escuro: o --amarelo cai
                                para 4.26:1 sobre a linha da tabela em hover; este
                                fica em 5.70:1. Usado so em TEXTO de alerta. */

  /* tons do masthead teal escuro (cabecalho + abas + filtros = um bloco) */
  --mast-top:     #042124;
  --mast-bot:     #084450;
  --mast-filtros-top: #0a3c47;
  --mast-filtros-bot: #08303a;
  --mast-borda:   #1f4f58;
  --mast-dim:     #93c4cf;   /* rotulos claros sobre o teal escuro */
  --mast-campo:   #0f3a41;   /* fundo dos campos dentro do masthead */
  --mast-campo-borda: #2c6b78;

  --radius: 12px;
  --radius-sm: 9px;
  --sombra: 0 6px 20px rgba(20, 40, 80, .10);
}

* { box-sizing: border-box; }
html, body { margin: 0; height: 100%; }
body {
  background: var(--fundo);
  color: var(--texto);
  font-family: "Segoe UI", system-ui, -apple-system, Roboto, Arial, sans-serif;
  font-size: 14px;
  line-height: 1.45;
  -webkit-font-smoothing: antialiased;
  color-scheme: light;
}
[hidden] { display: none !important; }

/* ===================== LOGIN (usuario + senha) ===================== */
.overlay {
  position: fixed; inset: 0; display: grid; place-items: center;
  background: radial-gradient(circle at 50% 30%, #CFE3E7 0%, var(--fundo) 65%);
  z-index: 50;
}
.login-card {
  background: var(--painel);
  border: 1px solid var(--painel-borda);
  border-radius: 16px;
  border-top: 3px solid var(--ok);
  padding: 34px 30px 30px;
  width: 360px; max-width: 92vw;
  box-shadow: 0 18px 50px rgba(8, 48, 58, .22);
  display: grid; gap: 12px;
}
.login-logo {
  color: var(--teal); font-weight: 800; letter-spacing: .5px; font-size: 15px;
}
.login-titulo { margin: 0; font-size: 22px; font-weight: 700; color: var(--texto); }
.login-sub { margin: 0 0 6px; color: var(--dim); font-size: 13px; }

.campo { display: grid; gap: 5px; }
.campo > span { font-size: 12px; color: var(--dim); font-weight: 600; }
.campo input, .campo select,
.campo-inline input, .campo-inline select {
  background: var(--campo);
  border: 1px solid var(--painel-borda);
  color: var(--texto);
  border-radius: var(--radius-sm);
  padding: 10px 12px; font-size: 14px; outline: none; width: 100%;
  font-family: inherit;
  transition: border-color .15s, box-shadow .15s;
}
.campo input:focus, .campo select:focus,
.campo-inline input:focus, .campo-inline select:focus {
  border-color: var(--teal-hover);
  box-shadow: 0 0 0 3px rgba(36, 119, 128, .14);
}
.erro { color: var(--erro); font-size: 13px; margin: 2px 0; }

/* ===================== BOTOES ===================== */
.btn {
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  padding: 10px 18px; cursor: pointer;
  font-size: 14px; font-weight: 600; color: #fff;
  background: var(--teal);
  text-decoration: none; display: inline-flex; align-items: center; gap: 7px;
  font-family: inherit;
  transition: background .15s, opacity .15s, transform .05s, box-shadow .15s, border-color .15s;
}
.btn:active { transform: translateY(1px); }
.btn:disabled { opacity: .45; cursor: not-allowed; }
.btn-bloco { width: 100%; justify-content: center; }
.btn-pq { padding: 7px 13px; font-size: 13px; }

/* teal primario com leve gradiente + profundidade */
.btn-primario {
  background: linear-gradient(180deg, #247780 0%, var(--teal) 100%);
  box-shadow: 0 2px 10px rgba(30, 140, 153, .22);
}
.btn-primario:hover:not(:disabled) {
  background: linear-gradient(180deg, #2a8b98 0%, var(--teal-hover) 100%);
}
/* ciano da marca (acao confirmar / exportar) */
.btn-ok {
  background: linear-gradient(180deg, #1E8C99 0%, #16707C 100%);
  box-shadow: 0 2px 10px rgba(30, 140, 153, .20);
}
.btn-ok:hover:not(:disabled) { background: linear-gradient(180deg, #2a9eab 0%, #1b818f 100%); }
/* perigo (parar) */
.btn-perigo { background: linear-gradient(180deg, #d06b67 0%, var(--vermelho) 100%); }
.btn-perigo:hover:not(:disabled) { background: linear-gradient(180deg, #d77c78 0%, #b2473f 100%); }
/* fantasma: usado dentro do masthead teal -> texto claro */
.btn-fantasma {
  background: rgba(255, 255, 255, .14);
  border-color: rgba(255, 255, 255, .34);
  color: #ffffff;
}
.btn-fantasma:hover:not(:disabled) { background: rgba(255, 255, 255, .26); }
.btn-icone { background: transparent; border: none; cursor: pointer; font-size: 18px; }

/* ===================== MASTHEAD (cabecalho + abas + filtros) =====================
   Bloco teal escuro CONTINUO no topo: header sticky -> abas dentro -> filtros sticky.
   Espelha o masthead do Fluxo (cabecalho gradiente + barra de filtros teal escuro). */
.topo {
  display: flex; align-items: center; gap: 18px;
  height: 60px;            /* altura fixa: ancora o sticky encadeado da barra de filtros */
  padding: 0 22px;
  background: linear-gradient(180deg, var(--mast-top) 0%, var(--mast-bot) 100%);
  border-bottom: none;
  position: sticky; top: 0; z-index: 700;
}
.topo-esq { display: flex; align-items: baseline; gap: 12px; }
.marca { color: #ffffff; font-weight: 800; letter-spacing: .3px; }
.topo-titulo { color: rgba(235, 248, 250, .82); font-size: 13px; }

/* Abas em pilula, centralizadas (estilo do toggle do Fluxo) */
.abas {
  display: flex; gap: 5px;
  margin-left: auto;
  padding: 5px;
  background: rgba(255, 255, 255, .12);
  border: 1px solid rgba(255, 255, 255, .22);
  border-radius: 999px;
}
.aba {
  background: transparent; border: none;
  color: rgba(255, 255, 255, .82); cursor: pointer;
  padding: 8px 16px; border-radius: 999px; font-size: 14px; font-weight: 600;
  white-space: nowrap;
  transition: color .15s, background .15s, box-shadow .15s;
  font-family: inherit;
}
.aba:hover { color: #ffffff; }
.aba.ativa {
  background: #ffffff; color: var(--teal);
  box-shadow: 0 2px 8px rgba(0, 0, 0, .22);
}
/* "Ao vivo ↗" (22/10): link com cara de aba — abre a tela ao vivo noutra aba do navegador */
.aba-link {
  color: rgba(255, 255, 255, .82); text-decoration: none;
  padding: 8px 16px; border-radius: 999px; font-size: 14px; font-weight: 600;
  white-space: nowrap; transition: color .15s;
}
.aba-link:hover { color: #ffffff; }
.topo-dir { display: flex; align-items: center; gap: 12px; }
.topo-usuario { color: rgba(235, 248, 250, .82); font-size: 13px; }

/* Faixa de aviso (deps): logo abaixo do cabecalho, ainda dentro do bloco teal.
   Rola junto com o conteudo (nao compete pelo sticky com cabecalho/filtros). */
.faixa-aviso {
  margin: 0; padding: 9px 22px;
  background: rgba(232, 201, 90, .14);
  color: #ffe6a6;
  border-bottom: 1px solid var(--mast-borda);
  font-size: 13px;
}

/* ===================== PAINEIS ===================== */
.painel-aba { display: none; padding: 0 22px 28px; }
.painel-aba.ativa { display: block; animation: fade .18s ease; }
@keyframes fade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

/* ===================== FILTROS (barra sticky on-brand, fecha o masthead) =====================
   A barra de filtros/acoes do Dashboard "gruda" ABAIXO do cabecalho com o mesmo
   teal escuro, formando o bloco continuo pedido. */
.filtros {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 14px;
  padding: 14px 22px;
  margin: 0 -22px 18px;   /* estende de borda a borda dentro do .painel-aba (que tem padding lateral) */
  background: linear-gradient(180deg, var(--mast-filtros-top) 0%, var(--mast-filtros-bot) 100%);
  border-bottom: 1px solid var(--mast-borda);
  box-shadow: 0 6px 18px rgba(0, 0, 0, .18);
  position: sticky; top: 60px; z-index: 600;   /* 60px = altura do .topo: encadeia o bloco */
}
/* A barra de filtros do Historico e simples (so um botao): nao precisa colar */
.painel-aba[data-painel="historico"] .filtros {
  position: static; box-shadow: none; justify-content: flex-end;
}

.campo-inline { display: grid; gap: 5px; }
.campo-inline > span {
  font-size: 11px; color: var(--mast-dim); font-weight: 700;
  text-transform: uppercase; letter-spacing: .5px;
  display: flex; align-items: center; gap: 7px;
}
/* barrinha de acento teal no rotulo (estilo Meta/Fluxo) */
.filtros .campo-inline > span::before {
  content: ""; width: 3px; height: 11px; border-radius: 2px;
  background: var(--teal-hover); flex: none;
}
.campo-inline.cresce { flex: 1; min-width: 200px; }
.campo-inline select, .campo-inline input { min-width: 150px; }

/* campos DENTRO do masthead teal: fundo teal escuro, texto claro */
.filtros .campo-inline input,
.filtros .campo-inline select {
  background: var(--mast-campo);
  border: 1px solid var(--mast-campo-borda);
  color: #eaf4f5;
}
.filtros .campo-inline input::placeholder { color: #6f9aa4; }
.filtros .campo-inline input:focus,
.filtros .campo-inline select:focus {
  border-color: #34a7b6;
  box-shadow: 0 0 0 3px rgba(52, 167, 182, .16);
}
.filtros .campo-inline input[type="date"] { color-scheme: dark; font-variant-numeric: tabular-nums; }
.filtros .campo-inline select {
  appearance: none; cursor: pointer; padding-right: 30px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'><path d='M2 4l4 4 4-4' fill='none' stroke='%2393c4cf' stroke-width='1.6'/></svg>");
  background-repeat: no-repeat; background-position: right 10px center;
}
/* intervalo de datas (De / Ate) lado a lado com travessao */
.campo-intervalo { display: flex; align-items: center; gap: 7px; }
.campo-intervalo input[type="date"] { min-width: 140px; }
.campo-intervalo .sep { color: var(--mast-dim); font-weight: 700; }

/* acoes da barra (Atualizar / Baixar Excel / Planilha / Limpar) alinham na base */
.filtros .btn { align-self: flex-end; }
/* Limpar filtros: outline teal claro sobre o masthead escuro */
.btn-limpar {
  background: transparent;
  border-color: var(--teal-hover);
  color: #bfe3ea;
}
.btn-limpar:hover:not(:disabled) { background: rgba(36, 119, 128, .22); color: #fff; }
/* contador de filtros ativos (chip branco com numero ciano) */
.filtros-contador {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px; margin-left: 2px;
  border-radius: 999px; background: #ffffff; color: #16707C;
  font-size: 11px; font-weight: 800; line-height: 1;
}

/* ===================== MULTI-SELECT (filtros Loja/UF/Cliente) =====================
   Portado do Fluxo. Botao com as cores do masthead teal escuro; painel branco
   (lista de itens) para legibilidade maxima sobre a barra escura. */
.ms { position: relative; width: 100%; min-width: 150px; }
.ms-botao {
  width: 100%;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  background: var(--mast-campo);
  border: 1px solid var(--mast-campo-borda);
  border-radius: var(--radius-sm);
  color: #eaf4f5;
  font-size: 14px;
  padding: 10px 12px;
  cursor: pointer;
  font-family: inherit;
  transition: border-color .15s, box-shadow .15s;
}
.ms-botao:hover { border-color: #34a7b6; }
.ms.aberto .ms-botao { border-color: #34a7b6; box-shadow: 0 0 0 3px rgba(52, 167, 182, .16); }
.ms.ms-ativo .ms-botao { border-color: #34a7b6; }
.ms-rotulo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; }
.ms-seta { color: var(--mast-dim); font-size: 11px; flex: none; transition: transform .15s; }
.ms.aberto .ms-seta { transform: rotate(180deg); }

.ms-painel {
  position: absolute;
  z-index: 60;
  top: calc(100% + 4px);
  left: 0; right: 0;
  background: var(--painel);
  border: 1px solid var(--painel-borda);
  border-radius: var(--radius-sm);
  box-shadow: 0 14px 34px rgba(8, 48, 58, .25);
  padding: 8px;
  max-height: 300px;
  display: flex;
  flex-direction: column;
}
.ms-busca {
  background: var(--campo);
  border: 1px solid var(--painel-borda);
  border-radius: var(--radius-sm);
  color: var(--texto);
  font-size: 14px;
  padding: 8px 10px;
  width: 100%;
  margin-bottom: 6px;
  font-family: inherit;
}
.ms-busca::placeholder { color: #9aa7ab; }
.ms-busca:focus { outline: none; border-color: var(--teal-hover); box-shadow: 0 0 0 3px rgba(36, 119, 128, .14); }
.ms-acoes {
  display: flex; gap: 16px;
  padding: 2px 4px 8px;
  border-bottom: 1px solid var(--painel-borda);
  margin-bottom: 6px;
}
.ms-todos, .ms-limpar {
  background: none; border: none;
  color: var(--dim);
  font-size: 11.5px; font-weight: 700; letter-spacing: .5px;
  text-transform: uppercase; cursor: pointer; padding: 0;
  font-family: inherit;
}
.ms-todos:hover, .ms-limpar:hover { color: var(--teal); }
.ms-lista { overflow-y: auto; }
.ms-item {
  display: flex; align-items: center; gap: 9px;
  padding: 7px 6px; border-radius: 5px; cursor: pointer; font-size: 14px;
  color: var(--texto);
}
.ms-item:hover { background: rgba(27, 96, 110, .08); }
.ms-item input { accent-color: var(--teal); width: 15px; height: 15px; cursor: pointer; flex: none; }
.ms-vazio { color: var(--dim); font-style: italic; font-size: 13px; padding: 10px 6px; }
.ms-lista::-webkit-scrollbar { width: 8px; }
.ms-lista::-webkit-scrollbar-thumb { background: #b9d1d7; border-radius: 6px; }
.ms-lista::-webkit-scrollbar-track { background: transparent; }

/* BLINDAGEM: as regras genericas de campo do masthead (.campo-inline input/select
   e .filtros .campo-inline input) NAO podem vazar para dentro do multiselect — senao
   estragam os checkboxes (padding/width/fundo teal) e a busca. Especificidade maior
   (.filtros .campo-inline .ms-* = 0,3,x) ganha das regras genericas (0,1,1 / 0,2,1). */
.filtros .campo-inline .ms-busca {
  width: 100%; padding: 8px 10px; font-size: 14px;
  background: #ffffff; color: var(--texto);
  border: 1px solid var(--painel-borda); border-radius: var(--radius-sm);
}
.filtros .campo-inline .ms-busca::placeholder { color: #9aa7ab; }
.filtros .campo-inline .ms-item input {
  width: 16px; height: 16px; min-width: 0; padding: 0; margin: 0;
  background: none; border: 0; border-radius: 0; box-shadow: none;
  accent-color: var(--teal); flex: none;
}
/* rotulo das opcoes: texto escuro e legivel no painel branco (e ocupa o espaco) */
.filtros .campo-inline .ms-item { color: var(--texto); }
.filtros .campo-inline .ms-item span { color: var(--texto); flex: 1 1 auto; min-width: 0; }
.filtros .campo-inline .ms-vazio { color: var(--dim); }
/* painel um pouco mais largo que o botao, para nomes longos de loja respirarem */
.ms-painel { min-width: 230px; }

/* ===================== CARDS / KPIs ===================== */
.cards {
  display: grid;
  grid-template-columns: repeat(8, minmax(0, 1fr));
  gap: 10px; margin-bottom: 18px;
}
.card {
  display: flex; align-items: center; gap: 10px;
  background: var(--painel);
  border: 1px solid var(--painel-borda);
  border-radius: 12px;
  padding: 11px 12px;
  box-shadow: 0 2px 10px rgba(20, 60, 71, .06);
  transition: border-color .15s, transform .12s, box-shadow .15s;
}
.card:hover {
  border-color: rgba(30, 140, 153, .5);
  transform: translateY(-2px);
  box-shadow: 0 10px 24px rgba(8, 48, 58, .14);
}
.card-ico {
  width: 34px; height: 34px; border-radius: 10px; flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
}
.card-ico svg { width: 18px; height: 18px; display: block; }
.card-body { display: flex; flex-direction: column; min-width: 0; gap: 1px; }
.card-rot {
  color: var(--dim); font-size: 10.5px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .3px; line-height: 1.15;
}
.card-num {
  font-size: 22px; font-weight: 800; line-height: 1.1; color: var(--texto);
  font-variant-numeric: tabular-nums;
}

/* responsivo: quebra em telas menores em vez de espremer demais */
@media (max-width: 1180px) { .cards { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 680px)  { .cards { grid-template-columns: repeat(2, 1fr); } }

/* tintas dos icones: fundo translucido + glifo solido */
.ico-teal     { background: rgba(27, 96, 110, .14);  color: #1B606E; }
.ico-ok       { background: rgba(30, 140, 153, .14); color: #1E8C99; }
.ico-verde    { background: rgba(15, 155, 134, .15); color: #0f9b86; }
.ico-amarelo  { background: rgba(154, 125, 16, .16); color: #9a7d10; }
.ico-info     { background: rgba(22, 112, 124, .14); color: #16707C; }
.ico-vermelho { background: rgba(192, 80, 77, .15);  color: #c0504d; }

/* valores com cor semantica */
.card-ok .card-num   { color: var(--verde); }
.card-warn .card-num { color: var(--amarelo); }
.card-num.num-teal   { color: var(--teal); }

.meta { color: var(--dim); font-size: 13px; margin: 4px 0 12px; }

/* ===================== TABELAS ===================== */
.tabela-wrap {
  background: var(--painel);
  border: 1px solid var(--painel-borda);
  border-radius: var(--radius);
  overflow: auto; max-height: 62vh;
  box-shadow: var(--sombra);
  /* container do detalhe inline da coluna Estoque. Tem de ser ESTE elemento: e o
     scroller, entao a largura dele e o espaco que o usuario realmente enxerga —
     ao contrario do <td colspan>, que tem a largura da tabela inteira. */
  container: tabela / inline-size;
}
/* ---- sinal de que a tabela ROLA ----
   Em ~980px a tabela (1170px) nao cabe no wrap: o cabecalho mostrava "Esto"
   cortado no meio da palavra e os dados da coluna Estoque sumiam — le como dado
   FALTANDO, nao como dado escondido.
   As faixas ficam ACIMA do conteudo (pseudo-elementos de um pai posicionado), e
   NAO no background do scroller: o truque de background-attachment: local pinta
   atras das linhas, e aqui elas tem fundo proprio (zebra .linha-par, hover, thead
   sticky) que cobriria o fade em metade da tabela. As classes .rola-esq/.rola-dir
   vem do JS (app.js, marcarRolagem): CSS sozinho nao sabe se ainda ha o que rolar,
   entao o fade some ao chegar em cada ponta. */
.tabela-scroll { position: relative; min-width: 0; --th-alt: 39px; }
.tabela-scroll::before, .tabela-scroll::after {
  content: ""; position: absolute; top: 1px; bottom: 1px; width: 26px; z-index: 2;
  pointer-events: none; opacity: 0; transition: opacity .18s ease-out;
}
/* Cada faixa tem TRES camadas, porque ela atravessa dois fundos opostos: o thead
   (gradiente TEAL, escuro) e as linhas (branco). Um esfumado teal so aparece no
   corpo — sobre o cabecalho ele some, e e justamente ali que o texto fica cortado
   no meio da palavra ("Est"), lendo como bug de layout e nao como dado escondido.
     1) fio de 2px atravessando a altura inteira: claro na faixa do cabecalho,
        teal da faixa dele para baixo — e o "aqui corta", visivel nos dois fundos;
     2) veu claro limitado a faixa do cabecalho (--th-alt vem do JS, medido no
        proprio <th>: hardcodar a altura deixaria um degrau visivel no veu);
     3) o esfumado teal de sempre, para o corpo da tabela.
   Nao da para trocar as duas camadas de cor por uma so: elas pintam a faixa
   INTEIRA, entao um veu claro por cima lavaria o esfumado teal do corpo. */
.tabela-scroll::before {
  left: 1px; border-radius: var(--radius) 0 0 var(--radius);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, .85) 0 var(--th-alt),
                            rgba(27, 96, 110, .38) var(--th-alt)) left top / 2px 100% no-repeat,
    linear-gradient(90deg, rgba(255, 255, 255, .58), rgba(255, 255, 255, 0))
      left top / 100% var(--th-alt) no-repeat,
    linear-gradient(90deg, rgba(27, 96, 110, .22), rgba(27, 96, 110, 0));
}
.tabela-scroll::after {
  right: 1px; border-radius: 0 var(--radius) var(--radius) 0;
  background:
    linear-gradient(180deg, rgba(255, 255, 255, .85) 0 var(--th-alt),
                            rgba(27, 96, 110, .38) var(--th-alt)) right top / 2px 100% no-repeat,
    linear-gradient(270deg, rgba(255, 255, 255, .58), rgba(255, 255, 255, 0))
      right top / 100% var(--th-alt) no-repeat,
    linear-gradient(270deg, rgba(27, 96, 110, .22), rgba(27, 96, 110, 0));
}
.tabela-scroll.rola-esq::before, .tabela-scroll.rola-dir::after { opacity: 1; }

.tabela { width: 100%; border-collapse: collapse; font-size: 13px; }
.tabela thead th {
  position: sticky; top: 0;
  background: linear-gradient(180deg, var(--teal-hover) 0%, var(--teal) 100%);
  color: #ffffff; text-align: left;
  padding: 10px 12px; font-weight: 700; white-space: nowrap; z-index: 1;
}
/* cabecalho clicavel p/ ordenar (setinha ▲/▼). O <th> so pinta; quem clica e
   recebe foco de teclado e o <button> interno, que ocupa a celula inteira. */
.tabela thead th.th-sort { padding: 0; user-select: none; }
.tabela thead th.th-sort:hover { background: linear-gradient(180deg, var(--ok) 0%, var(--teal-hover) 100%); }
.tabela thead th.th-ativo { background: linear-gradient(180deg, var(--ok) 0%, var(--azul-info) 100%); }
.th-sort-bt {
  display: flex; align-items: center; width: 100%;
  margin: 0; padding: 10px 12px; border: 0; background: none;
  color: inherit; font: inherit; text-align: left; white-space: nowrap;
  cursor: pointer;
}
/* coluna de dinheiro: rótulo à direita, junto dos números que ele encabeça */
.tabela thead th.th-num .th-sort-bt { justify-content: flex-end; }
.th-sort-bt:focus-visible { outline: 2px solid #fff; outline-offset: -3px; border-radius: 3px; }
.tabela thead th .th-seta { margin-left: 6px; font-size: 10px; opacity: .95; }
.tabela thead th .th-seta-dim { opacity: .4; font-weight: 400; }   /* "↕" discreto = ordenável */
.tabela tbody td {
  padding: 9px var(--tabela-pad-x); border-top: 1px solid var(--painel-borda);
  vertical-align: top; color: var(--texto);
}
.tabela tbody tr:nth-child(even) { background: #f4f9fa; }
.tabela tbody tr:hover td { background: rgba(27, 96, 110, .07); }
.tabela-vazia { text-align: center; color: var(--dim); padding: 22px; font-style: italic; }
.col-num { text-align: right; font-variant-numeric: tabular-nums; }
.col-centro { text-align: center; }

/* ---- linha de TOTAL (tfoot) ----
   Sticky no fim do scroller pelo mesmo motivo do thead ser sticky no topo: o
   .tabela-wrap tem max-height 62vh, entao a soma sairia da tela justo quando ha
   MUITA linha — que e exatamente quando ela importa.
   Banda clara com borda teal em cima em vez de repetir o gradiente do cabecalho:
   assim ela FECHA a tabela; com o mesmo tratamento do <thead> leria como um
   segundo cabecalho aparecendo no meio da rolagem. */
.tabela tfoot td {
  position: sticky; bottom: 0; z-index: 1;
  background: var(--painel-claro);
  border-top: 2px solid var(--teal);
  padding: 10px var(--tabela-pad-x);
  color: var(--texto); font-weight: 700; white-space: nowrap;
}
/* --dim (#4d717a) sobre esta banda da 3.99:1 — reprova em texto pequeno. O
   --teal da 5.36:1 e ja e cor da paleta, entao nao entra token novo so por isso. */
.tot-sub { margin-left: 10px; font-weight: 500; color: var(--teal); }
.tot-num { font-variant-numeric: tabular-nums; }
.tot-status { font-weight: 600; }

/* ===================== PILULAS DE STATUS ===================== */
.pill {
  display: inline-block; padding: 2px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 700;
}
.pill-done    { background: rgba(15, 155, 134, .16); color: #0f9b86; }
.pill-stopped { background: rgba(154, 125, 16, .18); color: #9a7d10; }
.pill-error   { background: rgba(192, 80, 77, .16); color: #c0504d; }
.pill-running { background: rgba(30, 140, 153, .16); color: #16707C; }

/* % processado por linha */
.td-pct { white-space: nowrap; }
.pct {
  display: inline-block; min-width: 46px; text-align: center;
  padding: 2px 8px; border-radius: 999px; font-size: 12px; font-weight: 700;
}
.pct-full { background: rgba(15, 155, 134, .16); color: #0f9b86; }
.pct-part { background: rgba(154, 125, 16, .18); color: #9a7d10; }
.pct-zero { background: rgba(192, 80, 77, .16); color: #c0504d; }

/* ===================== RODAR ===================== */
.run-grid { display: grid; grid-template-columns: 400px 1fr; gap: 16px; padding-top: 18px; }
@media (max-width: 860px) { .run-grid { grid-template-columns: 1fr; } }
.card-box {
  background: var(--painel);
  border: 1px solid var(--painel-borda);
  border-radius: var(--radius);
  padding: 20px;
  box-shadow: var(--sombra);
}
.card-box h2 { margin: 0 0 12px; font-size: 16px; font-weight: 700; color: var(--texto); }
.ajuda { color: var(--dim); font-size: 13px; margin: 0 0 14px; }
.run-form .campo { margin-bottom: 12px; }
.run-datas { display: grid; grid-template-columns: 1fr 1fr;
  place-items: stretch;   /* nao herdar align-items:center de regra antiga */
  place-content: stretch; gap: 12px; }
.run-botoes { display: flex; gap: 10px; margin-top: 6px; }

.token-box {
  margin-top: 14px; padding: 13px;
  background: rgba(154, 125, 16, .10);
  border: 1px solid var(--amarelo);
  border-radius: var(--radius-sm);
}
.token-rot { display: block; font-size: 13px; margin-bottom: 8px; color: var(--texto); font-weight: 600; }
.token-linha { display: flex; gap: 8px; }
.token-linha input {
  flex: 1; background: var(--campo); border: 1px solid var(--painel-borda);
  color: var(--texto); border-radius: var(--radius-sm); padding: 9px 11px; font-family: inherit;
}
.token-linha input:focus { outline: none; border-color: var(--teal-hover); box-shadow: 0 0 0 3px rgba(36, 119, 128, .14); }

.progresso-wrap { display: flex; align-items: center; gap: 10px; margin-top: 14px; }
.progresso {
  flex: 1; height: 10px; background: var(--painel-claro);
  border: 1px solid var(--painel-borda); border-radius: 999px; overflow: hidden;
}
.progresso-preenchido {
  height: 100%; width: 0;
  background: linear-gradient(90deg, var(--teal) 0%, var(--ok) 100%);
  transition: width .3s;
}
.progresso-texto { color: var(--dim); font-size: 12px; white-space: nowrap; font-variant-numeric: tabular-nums; }

/* console de log: teal bem escuro (mantem legibilidade do log colorido) */
.console {
  background: var(--log);
  border: 1px solid #15302f;
  border-radius: var(--radius-sm);
  color: #cfe6e6;
  padding: 14px 16px; height: 60vh; overflow: auto; margin: 0;
  font-family: "Cascadia Code", Consolas, "Courier New", monospace;
  font-size: 12.5px; line-height: 1.55; white-space: pre-wrap; word-break: break-word;
}
.console-linha.log-ok    { color: #4fd2c0; }
.console-linha.log-erro  { color: #e08585; }
.console-linha.log-aviso { color: #e8c95a; }
.console-linha.log-info  { color: #9fcdd7; }
.console::-webkit-scrollbar,
.tabela-wrap::-webkit-scrollbar { width: 10px; height: 10px; }
.console::-webkit-scrollbar-thumb { background: #2a4a4a; border-radius: 6px; }
.tabela-wrap::-webkit-scrollbar-thumb { background: #b9d1d7; border-radius: 6px; }
.console::-webkit-scrollbar-track,
.tabela-wrap::-webkit-scrollbar-track { background: transparent; }

/* ===================== RODAPE / TOAST ===================== */
.rodape {
  padding: 14px 22px; color: var(--dim); font-size: 12px;
  border-top: 1px solid var(--painel-borda); background: var(--fundo);
}
.toast {
  position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%);
  background: var(--painel); border: 1px solid var(--painel-borda);
  color: var(--texto);
  padding: 12px 20px; border-radius: var(--radius);
  box-shadow: 0 10px 30px rgba(8, 48, 58, .25);
  z-index: 100; font-size: 14px; max-width: 80vw;
}
.toast-erro { border-color: var(--erro); color: var(--erro); }
.toast-ok   { border-color: var(--ok); color: var(--verde); }

/* ===================== RESPONSIVO ===================== */
@media (max-width: 880px) {
  /* cabecalho quebra em linhas no mobile: solta a altura fixa e o sticky encadeado */
  .topo { flex-wrap: wrap; gap: 12px; height: auto; padding: 12px 22px; position: static; }
  .abas { margin-left: 0; order: 3; width: 100%; overflow-x: auto; }
  .topo-dir { margin-left: auto; }
  .filtros { position: static; }   /* sem sticky quando o cabecalho nao tem altura fixa */
  .filtros .campo-inline { flex: 1 1 100%; min-width: 0; }
  .campo-inline select, .campo-inline input { min-width: 0; }
  .campo-intervalo input[type="date"] { min-width: 0; flex: 1; }
}

/* ====================== LOGIN OPT-IN (portal WhatsApp) ====================== */
.login-card form { display: grid; gap: 12px; text-align: left; }
.login-etapa { display: block; text-align: center; font-size: 11px; letter-spacing: 1px;
  text-transform: uppercase; color: var(--dim); margin: 0; }
.login-etapa-mini { margin-top: 6px; opacity: .85; }
.login-card .login-titulo, .login-card .login-sub { text-align: center; }
/* etapa 1: guia numerada */
.login-guia { list-style: none; margin: 0; padding: 14px; display: grid; gap: 12px;
  background: var(--painel-claro); border: 1px solid var(--painel-borda); border-radius: var(--radius-sm); }
.login-guia li { display: flex; align-items: flex-start; gap: 10px; font-size: 12.5px; color: var(--dim); line-height: 1.4; }
.login-guia li b { color: var(--texto); }
.guia-num { flex: 0 0 22px; width: 22px; height: 22px; border-radius: 50%; background: var(--teal);
  color: #fff; font-size: 12px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; margin-top: 1px; }
/* etapa 2: caixa de info + whatsapp + copiar */
.login-info { font-size: 12.5px; color: var(--dim); line-height: 1.4; padding: 11px 13px;
  border-left: 3px solid var(--teal); background: var(--painel-claro); border-radius: 8px; }
.login-info b { color: var(--texto); }
.phone-display { font-family: Consolas, Monaco, monospace; font-weight: 700; color: var(--texto); }
.input-otp { text-align: center; font-size: 24px; letter-spacing: 10px; font-variant-numeric: tabular-nums; }
.btn-whats { background: #25D366 !important; color: #fff !important; display: flex; align-items: center;
  justify-content: center; gap: 8px; border: none; text-decoration: none; }
.btn-whats:hover { background: #1ebe57 !important; }
.login-link { background: none; border: none; color: var(--dim); font-size: 12.5px;
  cursor: pointer; font-family: inherit; padding: 4px 2px; }
.login-link:hover { color: var(--texto); text-decoration: underline; }
.login-link-copiar { display: block; width: 100%; text-align: center; margin: 0; }
.login-acoes { display: flex; justify-content: space-between; gap: 10px; }
.login-acoes-centro { justify-content: center; }
.login-alt { text-align: center; }

/* =====================================================================
   OVERLAY DE LOGIN — split-screen "Fiel-ao-CRM" (versao final)
   Base: Design 0 (mais robusto). Enxertos: halos/glow e sheen (D1),
   eyebrow com acento teal (D2), icones traco fino (D2), wave animado
   com guarda de movimento (D1), apoio sob o OTP e OTP limpo/centrado (D2).
   Esquerda teal-escura (marca) + direita creme (form). Visual IDENTICO
   nos dois temas: tudo escopado em .login-overlay para nao ser afetado
   por body.tema-claro. Comentarios em pt-BR sem acento.
   ===================================================================== */

/* tokens locais so do login (nao dependem do tema do painel) */
.login-overlay {
  --lg-teal-1: #08252b;   /* petroleo topo-esquerda */
  --lg-teal-2: #0b2e34;
  --lg-teal-3: #114550;   /* teal baixo-direita */
  --lg-mint:   #9fcdd7;
  --lg-creme:  #f6f1e9;   /* superficie clara e quente */
  --lg-creme-2:#efe7db;
  --lg-tinta:  #10343b;   /* texto escuro sobre creme */
  --lg-mudo:   #5b6e72;   /* subtitulo mudo */
  --lg-borda-in: #ddd3c4; /* borda quente dos inputs */
  --lg-anel:   #1B606E;   /* anel de foco teal */
}

/* raiz: duas colunas 50/50, ocupa a tela toda, sem scroll horizontal.
   !important vence o display:flex do overlay base, se houver. */
.login-overlay:not([hidden]) {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: grid !important;
  grid-template-columns: 1.7fr 1fr;  /* painel do video maior p/ o logo caber inteiro */
  place-items: stretch;   /* nao herdar align-items:center de regra antiga */
  place-content: stretch;
  background: var(--lg-creme);   /* fallback do lado direito */
  overflow-x: hidden;            /* nunca scroll horizontal */
  overflow-y: auto;
}

/* ---------------------- COLUNA ESQUERDA: MARCA ---------------------- */
.login-overlay .login-marca {
  position: relative;
  background: linear-gradient(135deg, var(--lg-teal-1) 0%, var(--lg-teal-2) 42%, var(--lg-teal-3) 100%);
  color: #fff;
  display: flex;
  align-items: center;
  padding: 56px 60px;
  overflow: hidden;
}
/* video de fundo (logo Talkline): preenche a coluna, bordas desvanecem no teal
   (mask radial). Tint teal por cima garante a legibilidade do texto branco. */
.login-overlay .login-video {
  position: absolute; inset: 0; z-index: 0;
  width: 100%; height: 100%;
  object-fit: cover; object-position: center;
  pointer-events: none;
}
.login-overlay .login-video-tint {
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(135deg,
    rgba(8, 37, 43, 0.90) 0%, rgba(11, 46, 52, 0.76) 44%, rgba(17, 69, 80, 0.58) 100%);
}
@media (prefers-reduced-motion: reduce) {
  .login-overlay .login-video { display: none; }
}
/* halos radiais suaves (glow premium) — profundidade sem virar template */
.login-overlay .login-glow {
  position: absolute;
  border-radius: 50%;
  pointer-events: none;
  filter: blur(8px);
}
.login-overlay .login-glow-1 {
  width: 460px; height: 460px;
  top: -120px; left: -100px;
  background: radial-gradient(circle, rgba(79,210,192,0.16) 0%, rgba(79,210,192,0) 68%);
}
.login-overlay .login-glow-2 {
  width: 520px; height: 520px;
  bottom: -160px; right: -150px;
  background: radial-gradient(circle, rgba(143,191,200,0.14) 0%, rgba(143,191,200,0) 70%);
}
.login-overlay .login-marca-inner {
  position: relative;   /* acima dos halos */
  z-index: 1;
  width: 100%;
  max-width: 440px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

/* lockup marca */
.login-overlay .login-lockup { display: flex; align-items: center; gap: 11px; }
.login-overlay .login-lockup-ico { flex: none; filter: drop-shadow(0 3px 10px rgba(0,0,0,0.30)); }
.login-overlay .login-lockup-word {
  position: relative;
  font-size: 25px;
  font-weight: 700;
  letter-spacing: -0.5px;
  color: #fff;
  padding-right: 10px;
}
.login-overlay .login-lockup-dot {
  position: absolute;
  right: 0; bottom: 5px;
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--lg-mint);
  box-shadow: 0 0 10px rgba(159,205,215,0.6);
}

/* eyebrow editorial + fino acento teal em degrade */
.login-overlay .login-eyebrow {
  position: relative;
  display: inline-block;
  margin: 6px 0 -2px;
  padding-bottom: 12px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 2.4px;
  text-transform: uppercase;
  color: var(--lg-mint);
  align-self: flex-start;
}
.login-overlay .login-eyebrow::after {
  content: "";
  position: absolute;
  left: 0; bottom: 4px;
  width: 34px; height: 2px;
  border-radius: 2px;
  background: linear-gradient(90deg, #8fbfc8, rgba(143,191,200,0));
}

.login-overlay .login-marca-titulo {
  margin: 2px 0 0;
  font-size: 40px;
  line-height: 1.1;
  font-weight: 800;
  letter-spacing: -0.6px;
  color: #fff;
  text-wrap: balance;
  max-width: 18ch;
}
.login-overlay .login-marca-sub {
  margin: 0;
  font-size: 16px;
  line-height: 1.5;
  color: var(--lg-mint);
  max-width: 40ch;
}

/* cards de recurso */
.login-overlay .login-cards {
  list-style: none;
  margin: 10px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.login-overlay .login-card-feat {
  position: relative;
  display: flex;
  align-items: center;
  gap: 15px;
  padding: 16px;
  border-radius: 14px;
  background: rgba(255,255,255,0.05);
  border: 1px solid rgba(255,255,255,0.09);
  overflow: hidden;
  transition: transform 0.2s ease, background 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
}
/* sheen sutil no topo do card (acabamento premium) */
.login-overlay .login-card-feat::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 42%;
  background: linear-gradient(180deg, rgba(255,255,255,0.07) 0%, rgba(255,255,255,0) 100%);
  pointer-events: none;
}
.login-overlay .login-card-feat:hover {
  transform: translateY(-3px);
  background: rgba(255,255,255,0.08);
  border-color: rgba(159,205,215,0.28);
  box-shadow: 0 12px 28px rgba(0,0,0,0.26);
}
.login-overlay .login-card-tile {
  position: relative;
  flex: none;
  width: 46px; height: 46px;
  border-radius: 12px;
  background: rgba(143,191,200,0.14);
  border: 1px solid rgba(159,205,215,0.18);
  display: grid;
  place-items: center;
}
.login-overlay .login-card-txt { display: flex; flex-direction: column; gap: 2px; }
.login-overlay .login-card-txt strong { font-size: 15px; font-weight: 700; color: #fff; }
.login-overlay .login-card-txt span   { font-size: 13px; color: var(--lg-mint); line-height: 1.35; }

/* ---------------------- COLUNA DIREITA: FORMULARIO ---------------------- */
.login-overlay .login-form-wrap {
  background: radial-gradient(120% 90% at 100% 0%, var(--lg-creme) 0%, var(--lg-creme-2) 100%);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px;
  overflow-y: auto;
}
.login-overlay .login-form-inner {
  width: 100%;
  max-width: 380px;
}

/* anti-overflow horizontal: itens de grid/flex tem min-width:auto e NAO encolhem
   abaixo do min-content do conteudo. O input do codigo (letter-spacing grande +
   size=20 default) tem min-content ~418px e estouraria a tela no mobile. Zerar o
   min-width deixa o width:100% mandar e a largura respeitar o viewport. */
.login-overlay .login-marca,
.login-overlay .login-form-wrap,
.login-overlay .login-marca-inner,
.login-overlay .login-form-inner { min-width: 0; }
.login-overlay .login-campo .input,
.login-overlay .input.login-input-otp { max-width: 100%; }

/* faixa de marca reduzida (so aparece no mobile) */
.login-overlay .login-marca-mini {
  display: none;
  margin-bottom: 18px;
}

/* wordmark escura (texto #123, dot teal) — sobrescreve a .wordmark base */
.login-overlay .login-word-dark {
  position: relative;
  display: inline-block;
  font-size: 26px;
  font-weight: 700;
  letter-spacing: -0.5px;
  color: #123;
  padding-right: 11px;
  margin-bottom: 24px;
}
.login-overlay .login-word-dark-dot {
  position: absolute;
  right: 0; bottom: 6px;
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--lg-anel);
}

.login-overlay .login-bemvindo {
  margin: 0 0 8px;
  font-size: 30px;
  font-weight: 800;
  letter-spacing: -0.5px;
  color: var(--lg-tinta);
  display: flex;
  align-items: center;
  gap: 8px;
}
/* aceno do emoji (curto, so 2 ciclos) — guardado por reduced-motion */
.login-overlay .login-wave {
  display: inline-block;
  transform-origin: 70% 70%;
  animation: lgAceno 2.4s ease-in-out 0.5s 2;
}
@keyframes lgAceno {
  0%,60%,100% { transform: rotate(0); }
  10%,30%,50% { transform: rotate(14deg); }
  20%,40%     { transform: rotate(-8deg); }
}
.login-overlay .login-form-sub {
  margin: 0 0 24px;
  font-size: 14.5px;
  line-height: 1.5;
  color: var(--lg-mudo);
}

/* labels do form (sobrescreve o estilo mint/escuro do painel) */
.login-overlay .campo-label {
  display: block;
  margin: 16px 0 7px;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: #46595d;
}
.login-overlay form > .campo-label:first-of-type { margin-top: 0; }

/* wrapper do input com icone interno */
.login-overlay .login-campo { position: relative; }
.login-overlay .login-campo-ico {
  position: absolute;
  left: 14px; top: 50%;
  transform: translateY(-50%);
  color: #7c9298;      /* icone mudo sobre branco */
  pointer-events: none;
  transition: color 0.15s ease;
}
.login-overlay .login-campo:focus-within .login-campo-ico { color: var(--lg-anel); }

/* INPUTS claros (sobrescreve o .input escuro do painel; especificidade
   0,3,0 vence body.tema-claro .input que e 0,2,0) */
.login-overlay .login-campo .input {
  width: 100%;
  height: 48px;
  padding: 0 14px 0 42px;
  background: #ffffff;
  color: var(--lg-tinta);
  border: 1px solid var(--lg-borda-in);
  border-radius: 10px;
  font-size: 15px;
  font-family: inherit;
  box-shadow: 0 1px 2px rgba(16,52,59,0.04);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
  color-scheme: light;   /* evita autofill/tema escuro herdado */
}
.login-overlay .login-campo .input::placeholder { color: #a9b3b4; }
.login-overlay .login-campo .input:hover { border-color: #c7bdad; }
.login-overlay .login-campo .input:focus {
  outline: none;
  border-color: var(--lg-anel);
  box-shadow: 0 0 0 3px rgba(27,96,110,0.18);
}

/* CODIGO do autenticador: limpo, sem icone, centrado de verdade e simetrico.
   Especificidade 0,2,1 vence body.tema-claro .input (0,2,0). */
.login-overlay .input.login-input-otp {
  width: 100%;
  height: 52px;
  padding: 0 14px;
  background: #ffffff;
  color: var(--lg-tinta);
  border: 1px solid var(--lg-borda-in);
  border-radius: 10px;
  font-family: inherit;
  box-shadow: 0 1px 2px rgba(16,52,59,0.04);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
  color-scheme: light;
  /* digitos espacados e centrados: text-indent compensa o letter-spacing
     do ultimo digito, mantendo o bloco otico no centro */
  text-align: center;
  letter-spacing: 10px;
  text-indent: 10px;
  font-weight: 700;
  font-size: 19px;
  font-variant-numeric: tabular-nums;
}
.login-overlay .input.login-input-otp::placeholder { color: #c2cac9; font-weight: 700; }
.login-overlay .input.login-input-otp:hover { border-color: #c7bdad; }
.login-overlay .input.login-input-otp:focus {
  outline: none;
  border-color: var(--lg-anel);
  box-shadow: 0 0 0 3px rgba(27,96,110,0.18);
}

/* texto de apoio sob o OTP */
.login-overlay .login-apoio {
  margin: 8px 2px 0;
  font-size: 12px;
  line-height: 1.4;
  color: #7d8c8f;
}

/* BOTAO entrar: gradiente teal-escuro, alto, com seta via ::after.
   A seta NUNCA e um filho DOM porque o JS troca btn.textContent — ::after
   sobrevive ao swap e some sozinha no estado :disabled ("Entrando..."). */
.login-overlay .login-btn {
  width: 100%;
  height: 52px;
  margin-top: 22px;
  border-radius: 12px;
  font-size: 15px;
  font-weight: 700;
  color: #fff;
  background: linear-gradient(180deg, #1c6a78 0%, #124450 100%);
  box-shadow: 0 10px 22px rgba(17,69,80,0.28), inset 0 1px 0 rgba(255,255,255,0.14);
  transition: transform 0.06s ease, box-shadow 0.18s ease, filter 0.18s ease;
}
.login-overlay .login-btn::after {
  content: " →";
  display: inline-block;
  white-space: pre;
  font-weight: 700;
  transition: transform 0.18s ease;
}
.login-overlay .login-btn:hover:not(:disabled) {
  filter: brightness(1.08);
  box-shadow: 0 14px 30px rgba(17,69,80,0.34), inset 0 1px 0 rgba(255,255,255,0.18);
}
.login-overlay .login-btn:hover:not(:disabled)::after { transform: translateX(3px); }
.login-overlay .login-btn:active:not(:disabled) { transform: translateY(1px); }
.login-overlay .login-btn:disabled {
  opacity: 0.7;
  cursor: default;
  box-shadow: none;
}
.login-overlay .login-btn:disabled::after { content: ""; }
.login-overlay .login-btn:focus-visible {
  outline: 3px solid rgba(27,96,110,0.35);
  outline-offset: 2px;
}

/* linha de erro (sobre creme) */
.login-overlay .login-erro {
  margin-top: 14px;
  padding: 10px 12px;
  border-radius: 9px;
  background: rgba(224,133,133,0.12);
  border: 1px solid rgba(224,133,133,0.4);
  color: #b4453f;
  font-size: 13px;
  text-align: center;
}

/* link cadastrar autenticador */
.login-overlay .login-alt { text-align: center; margin-top: 16px; }
.login-overlay .login-link {
  background: none; border: none;
  color: var(--lg-mudo);
  font-size: 13px; font-family: inherit;
  cursor: pointer; text-decoration: none;
  padding: 4px 2px;
}
.login-overlay .login-link:hover { color: var(--lg-anel); text-decoration: underline; }
.login-overlay .login-link:focus-visible { outline: 2px solid var(--lg-anel); outline-offset: 3px; border-radius: 3px; }

/* entrada suave dos dois lados */
@keyframes lgFadeUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes lgFadeIn { from { opacity: 0; } to { opacity: 1; } }
.login-overlay .login-marca-inner { animation: lgFadeIn 0.5s ease both; }
.login-overlay .login-form-inner  { animation: lgFadeUp 0.45s ease both; }
.login-overlay .login-card-feat   { animation: lgFadeUp 0.5s ease both; }
.login-overlay .login-card-feat:nth-child(1) { animation-delay: 0.06s; }
.login-overlay .login-card-feat:nth-child(2) { animation-delay: 0.12s; }
.login-overlay .login-card-feat:nth-child(3) { animation-delay: 0.18s; }

/* ---------------------- RESPONSIVO ---------------------- */
/* abaixo de 860px: esconde a coluna de marca, form ocupa a tela toda */
@media (max-width: 860px) {
  .login-overlay:not([hidden]) { grid-template-columns: 1fr; }
  .login-overlay .login-marca { display: none; }
  .login-overlay .login-form-wrap { padding: 28px 22px; }
  .login-overlay .login-marca-mini { display: block; }   /* mostra o lockup mini no topo */
  .login-overlay .login-bemvindo { font-size: 27px; }
}
@media (max-width: 400px) {
  .login-overlay .login-bemvindo { font-size: 25px; }
}

/* respeita quem prefere menos movimento */
@media (prefers-reduced-motion: reduce) {
  .login-overlay .login-marca-inner,
  .login-overlay .login-form-inner,
  .login-overlay .login-card-feat,
  .login-overlay .login-wave { animation: none !important; }
  .login-overlay .login-card-feat,
  .login-overlay .login-btn,
  .login-overlay .login-btn::after,
  .login-overlay .login-campo-ico { transition: none !important; }
}

/* ---------------------- BLINDAGEM DE TEMA ----------------------
   Garante o mesmo visual mesmo com body.tema-claro: o overlay define
   suas proprias cores. body.tema-claro .login-overlay (0,2,0) vence o
   fundo do painel definido no style.css base. */
body.tema-claro .login-overlay,
.login-overlay { background: var(--lg-creme); }
body.tema-claro .login-overlay .login-campo .input,
body.tema-claro .login-overlay .input.login-input-otp { color-scheme: light; }


/* =========================================================================
   RESUMO DO DASHBOARD (substitui a fileira de 8 cards iguais)
   Duas zonas: "Atendimento" (o balanco) e "Onde esta faltando" (assinatura:
   barras por loja, ranqueadas pelo que ainda nao chegou). Numeros em tabular
   para as colunas nao dancarem entre atualizacoes.
   ========================================================================= */
.resumo {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr) minmax(0, 1fr);
  gap: 14px;
  margin: 0 0 16px;
}
/* 980–1279px: volta as duas colunas originais e o funil ocupa a linha inteira
   embaixo (comprimir tres colunas nessa faixa quebra os nomes de loja). */
@media (max-width: 1279px) {
  .resumo { grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); }
  .resumo-estoque { grid-column: 1 / -1; }
}
@media (max-width: 979px) {
  .resumo { grid-template-columns: minmax(0, 1fr); }
  .resumo-estoque { grid-column: auto; }
}

.resumo-bloco {
  background: var(--painel);
  border: 1px solid var(--painel-borda);
  border-radius: var(--radius);
  box-shadow: var(--sombra);
  padding: 16px 18px 18px;
  min-width: 0;
}
.resumo-cab {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; margin-bottom: 14px;
}
.resumo-cab h2 {
  margin: 0; font-size: 15px; font-weight: 700; letter-spacing: -.01em;
  color: var(--texto);
}
.resumo-nota { font-size: 12px; color: var(--dim); font-variant-numeric: tabular-nums; }
.resumo-nota b { color: var(--teal); font-weight: 700; }

/* ---- Atendimento: a frase + a barra ---- */
.atend-frase {
  margin: 0 0 10px; display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
.atend-frase strong {
  font-size: 40px; line-height: 1; font-weight: 700; letter-spacing: -.02em;
  color: var(--teal); font-variant-numeric: tabular-nums;
}
.atend-frase span {
  font-size: 13px; color: var(--dim); max-width: 20ch; text-wrap: balance;
}

.atend-trilho {
  height: 10px; border-radius: 999px; background: var(--painel-claro);
  overflow: hidden; margin-bottom: 16px;
}
.atend-fill {
  height: 100%; width: 0; border-radius: 999px;
  background: var(--ok);          /* chapado: a ousadia fica nas barras por loja */
  transition: width .25s cubic-bezier(.22,1,.36,1);
}

/* ---- os quatro numeros, em linha (sem virar 4 cards) ---- */
.resumo-numeros {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 10px; margin: 0 0 16px; padding: 0;
}
.resumo-numeros > div { min-width: 0; }
/* R$ ocupa a linha inteira: nas 4 colunas de contagem ele sobraria sozinho numa
   segunda linha e estouraria a largura da célula. Mesmo dt/dd, só mais largo. */
.resumo-numeros > .resumo-valor { grid-column: 1 / -1; }
.resumo-numeros dt {
  font-size: 11px; color: var(--dim); font-weight: 600;
  text-transform: none; margin-bottom: 2px; white-space: nowrap;
}
.resumo-numeros dd {
  margin: 0; font-size: 19px; font-weight: 700; color: var(--texto);
  font-variant-numeric: tabular-nums; letter-spacing: -.01em;
}
@media (max-width: 520px) { .resumo-numeros { grid-template-columns: repeat(2, 1fr); } }

/* ---- split processado / nao processado ---- */
.split-trilho {
  display: flex; height: 8px; border-radius: 999px; overflow: hidden;
  background: var(--painel-claro); margin-bottom: 8px;
}
.split-proc  { background: var(--verde);   transition: width .25s cubic-bezier(.22,1,.36,1); }
.split-nproc { background: var(--amarelo); transition: width .25s cubic-bezier(.22,1,.36,1); }
/* fatias do funil de estoque (mesmo trilho, tres etapas) */
.split-est      { background: var(--verde);     transition: width .25s cubic-bezier(.22,1,.36,1); }
.split-transito { background: var(--azul-info); transition: width .25s cubic-bezier(.22,1,.36,1); }
.split-sem      { background: var(--amarelo);   transition: width .25s cubic-bezier(.22,1,.36,1); }
/* fio branco entre fatias vizinhas: tres cores proximas precisam de um limite */
.split-trilho > span + span { box-shadow: inset 1px 0 0 var(--painel); }
.split-legenda { margin: 0; display: flex; gap: 16px; flex-wrap: wrap; }
/* estreito, os tres itens tem larguras diferentes e o ultimo ("25 sem entrada")
   caia sozinho numa 2a linha com ~60px de buraco ao lado. Um por linha nao deixa
   vao morto e ainda lê na mesma ordem das fatias. */
@media (max-width: 560px) { .split-legenda { flex-direction: column; gap: 4px; } }
.lg {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; color: var(--dim); font-variant-numeric: tabular-nums;
}
.lg b { color: var(--texto); font-weight: 700; }
.lg::before { content: ""; width: 8px; height: 8px; border-radius: 3px; }
.lg-ok::before   { background: var(--verde); }
.lg-warn::before { background: var(--amarelo); }
.lg-info::before { background: var(--azul-info); }

/* ---- ASSINATURA: barras "onde esta faltando" ---- */
.barras { list-style: none; margin: 0; padding: 0; display: grid; gap: 9px; }
.barra {
  display: grid; grid-template-columns: minmax(88px, 132px) minmax(0, 1fr) auto;
  align-items: center; gap: 12px;
}
.barra-loja {
  font-size: 12.5px; font-weight: 600; color: var(--texto);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.barra-trilho {
  height: 9px; border-radius: 999px; background: var(--painel-claro); overflow: hidden;
}
.barra-fill {
  display: block; height: 100%; border-radius: 999px; background: var(--amarelo);
  transition: width .25s cubic-bezier(.22,1,.36,1);
}
.barra-num {
  display: flex; align-items: baseline; gap: 7px; justify-content: flex-end;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.barra-num b { font-size: 14px; font-weight: 700; color: var(--texto); }
.barra-num small { font-size: 11px; color: var(--dim); }
.barras-vazio {
  font-size: 13px; color: var(--dim); padding: 18px 0; text-align: center;
}
/* tudo atendido: a barra vira verde e some o alarme */
.barra.ok .barra-fill { background: var(--verde); }

/* ---- funil "Chegou no estoque" (3o bloco do resumo) ---- */
/* Numero menor que o do bloco Atendimento de proposito: la esta o balanco
   principal; aqui e a leitura de apoio. Escalas iguais deixariam os dois cards
   com a mesma silhueta. */
.est-frase { margin: 0 0 12px; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.est-frase strong {
  font-size: 26px; line-height: 1; font-weight: 700; letter-spacing: -.02em;
  color: var(--teal); font-variant-numeric: tabular-nums;
}
.est-frase span { font-size: 13px; color: var(--dim); }
.est-frase b { color: var(--texto); font-weight: 700; font-variant-numeric: tabular-nums; }

/* o carimbo da carga ancora no pe do card: o bloco e mais curto que os vizinhos
   e o grid o estica — melhor um rodape de verdade do que um vao morto. */
.resumo-estoque { display: flex; flex-direction: column; }
.est-atualizado { display: block; margin: 16px 0 0; padding-top: 2px; }
/* Retrato velho / releitura falhou: o rodape deixa de ser so um carimbo e vira
   aviso — e o alerta "sem entrada" esta suspenso enquanto isso. Cor do alerta da
   coluna (--amarelo, 5.3:1 no branco), sem fundo: continua rodape, nao vira banner. */
.est-atualizado.est-rodape-aviso { color: var(--amarelo); font-weight: 600; }
@media (min-width: 1280px) { .est-atualizado { margin-top: auto; } }
/* estado vazio HONESTO: sem estoque lido nao inventamos zeros */
.est-indisponivel {
  margin: 0; padding: 16px 0 4px;
  font-size: 13px; line-height: 1.5; color: var(--dim); text-wrap: pretty;
}

/* ---- "Falta dar entrada": o que sobrou de vao no card vira o acionavel ----
   Lista de TEXTO tabulado, sem barras: o bloco vizinho ("Onde esta faltando") ja
   e uma coluna de barras e repetir a forma aqui do lado viraria card clonado.
   O ritmo vem dos fios entre as linhas e da coluna de numeros a direita. */
.est-sem { margin-top: 16px; }
/* rotulo de sub-secao, NAO eyebrow: em caixa alta ele competia com o <h2> do card
   e ainda por cima nomeava um balde diferente do da legenda logo acima. */
.est-sem-tit {
  margin: 0 0 6px; font-size: 12px; font-weight: 600; color: var(--dim);
}
.est-sem-lista { list-style: none; margin: 0; padding: 0; }
.est-sem-item {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: baseline; gap: 10px;
  padding: 6px 0; border-top: 1px solid var(--painel-borda);
}
.est-sem-loja {
  /* sem elipse aqui tambem: "nome de loja nunca cortado" vale para todo lugar onde
     o painel escreve um nome de loja, nao so para a coluna Estoque. A coluna e
     minmax(0,1fr) e o nome longo quebra em duas linhas. */
  font-size: 12.5px; font-weight: 600; color: var(--texto);
}
.est-sem-meta {
  font-size: 12px; color: var(--dim); white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.est-sem-meta b { color: var(--amarelo-forte); font-weight: 700; }
.est-sem-resto, .est-sem-ok {
  padding: 7px 0 0; font-size: 12px; color: var(--dim);
}
.est-sem-resto { border-top: 1px solid var(--painel-borda); padding-top: 6px; }

/* =========================================================================
   COLUNA "ESTOQUE" (cruzamento com o estoque Datasys)
   A celula mostra LOCALIZACAO — o dado que o operador quer ("em qual loja").
   O ESTADO vem da cor e do peso do texto, nunca de mais uma pilula: a linha
   ja tem Status e % em pilula e um terceiro badge viraria bagunca.
   ========================================================================= */
/* max-width: com table-layout auto quem manda na largura da coluna e o conteudo,
   e o conteudo mais largo (296px) e de UMA celula em 261. Sem teto a coluna
   travava em 320px — 85 delas com um "—" dentro — enquanto a Descricao ficava com
   236px e quebrava em 2+ linhas em 224 das 261 linhas.
   285px e o ponto medido em que a troca ainda e so ganho. Em 1440: Descricao
   236 -> 259px, descricoes que quebram 224 -> 169, altura media da linha
   55,0 -> 52,5px; em 1280 a altura media cai de 79,9 para 67,9px.
   O preco NAO e mais nome cortado: o teto nao corta nada, ele so decide quantos
   nomes INTEIROS cabem (o orcamento medido em app.js, EST_REGUA); o que nao cabe vai
   inteiro para o contador "+N lojas" e continua no title= e no detalhe "Onde
   esta". Nenhum caminho desta coluna produz "…" em nome de loja. */
/* width == min == max, e nao so o max-width: a coluna precisa ser a MESMA nas
   quatro larguras porque o orcamento da celula (JS) e um so. Com so o teto, o
   table-layout auto encolhia a coluna para o min-width (176px) em 980/390 enquanto
   o JS continuava orcando 261px — e a lista, que nao corta mais, caia para uma 2a
   linha em 35 celulas de 116 (18 em 1280, 8 em 1440).
   Medido nas quatro larguras, presa em 285px: 0 celulas em 2 linhas, maior lista
   256,1px dentro dos 261px uteis, altura media da linha 52,5px em 1440 e 67,9px em
   1280 (os mesmos numeros de quando a coluna travava em 285 por acaso). Em 980/390
   a tabela ja rola de lado e a altura media nao muda (92,9px nos dois casos): o
   preco e so a tabela ficar 109px mais larga (1056 -> 1165px), i.e. mais rolagem
   horizontal numa tabela que ja rolava.
   Se um nome sozinho passar de 285px a coluna cede e cresce — nada e cortado por
   causa deste teto. */
.td-est {
  white-space: normal;
  width: var(--est-col); min-width: var(--est-col); max-width: var(--est-col);
}
.est-plano, .est-btn { display: block; width: 100%; font-size: 12.5px; line-height: 1.35; }
.est-btn {
  margin: 0; padding: 0; text-align: left;
  background: none; border: 0; border-radius: 8px;
  color: inherit; font-family: inherit; cursor: pointer;
}
.est-linha { display: inline-flex; align-items: baseline; gap: 4px; }
.est-btn:focus-visible { outline: 2px solid var(--teal); outline-offset: 3px; }
/* affordance de "isto abre" no proprio texto, para a setinha nao precisar gritar.
   O sublinhado vai nos PEDACOS de texto, nao no container: os filhos de um flex
   sao blocos, herdam a decoracao do pai e a setinha (que gira 180deg quando o
   detalhe abre) girava junto o proprio sublinhado — sobrava um risco solto ACIMA
   do triangulo.
   (".est-txt" saiu da lista: ele só nasce nos estados SEM localização, que não
   expandem e por isso desenham em .est-plano, nunca dentro do <button>. Medido:
   .est-btn .est-txt = 0 no DOM, .est-plano .est-txt = 145.) */
.est-btn:hover .est-lugar-nome, .est-btn:hover .est-lugar b,
.est-btn:hover .est-ponto, .est-btn:hover .est-mais,
.est-btn:hover .est-excecao {
  text-decoration: underline; text-decoration-color: var(--painel-borda);
  text-underline-offset: 3px;
}

/* ---- lista de lugares: TEXTO, nunca capsula ----
   "RIO ANIL 7 · ILHA 1 · +1 loja". Antes cada loja era um chip com fundo e raio, e
   o cluster inteiro virava o TERCEIRO grupo de capsulas da linha (depois de Status
   e %) — o mais largo dos tres, gritando mais alto que o campo mais importante.
   Aqui a celula le como DADO: nome em peso normal, numero em bold tabular, "·" em
   --dim. NADA aqui encolhe e NADA e cortado: quantos lugares entram na celula ja
   foi decidido no JS (orcamento medido, EST_REGUA / --est-col), e o que nao coube
   saiu inteiro para o contador "+N lojas". Se o orcamento errar por um caractere, a
   lista QUEBRA para uma 2a linha — uma linha a mais e legivel, meia palavra nao e. */
.est-lugares {
  display: inline-flex; flex-wrap: wrap; align-items: baseline;
  gap: 2px 4px; max-width: 100%;
}
/* "NOME N" e uma coisa so: flex:none + nowrap para o numero nunca se divorciar do
   nome quando a lista quebra a linha. */
.est-lugar {
  display: inline-flex; align-items: baseline; gap: 4px;
  flex: none; white-space: nowrap;
}
.est-lugar-nome {
  /* SEM overflow/text-overflow/flex-shrink. Todo corte por PIXEL que passou por aqui
     (14ch fixo, depois elipse com flex-shrink proporcional) tinha o mesmo defeito:
     ele so age DEPOIS de prometer espaco a todos e reparte a falta entre os nomes,
     estragando TODOS ("(em trans… 3 · RIO A… 3"). Pior, um nome de 3-5 letras nao e
     nome e pode ser AMBIGUO ("PATIO…" = PATIO CENTRAL ou PATIO NORTE, os dois na
     base), e o title= nao existe no toque. Quem decide agora e o orcamento do JS. */
  color: var(--texto); font-weight: 400;
}
/* deposito de passagem entre parenteses: parenteses dizem "isto nao e uma loja" e
   desfazem a colisao com o estado "aguardando entrada" da mesma coluna. O --dim faz
   parte do recado: em tinta cheia ele lia como uma loja de verdade.
   ATENCAO: este rotulo aparece em TRES lugares (celula, "Onde esta" de uma loja so e
   barra do detalhe) e o do detalhe tem regra propria de cor — ver
   .est-barra-loja.est-lugar-transito, mais abaixo. */
.est-lugar-transito { color: var(--dim); }
.est-lugar b { flex: none; color: var(--texto); font-weight: 700; font-variant-numeric: tabular-nums; }
.est-ponto { flex: none; color: var(--dim); }
.est-mais { flex: none; color: var(--dim); white-space: nowrap; }
/* a excecao ("1 ja saiu") explica o parcial; a razao "9/10" so repetia um numero */
.est-excecao { flex: none; color: var(--dim); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* estados sem localizacao: so tipografia */
.est-txt { font-variant-numeric: tabular-nums; }
.est-saiu     { color: var(--dim); }
.est-transito { color: var(--azul-info); }
.est-alerta   { color: var(--amarelo-forte); font-weight: 700; }   /* unico alerta da coluna */
.est-nulo     { color: var(--dim); }

/* a setinha COLA no ultimo item (gap 4px do container) e herda a cor do texto.
   Solta ~18px depois do ultimo dado ela parecia sujeira no monitor; discreta e
   grudada, ela le como "tem mais aqui" e so ganha destaque no hover/foco. */
.est-seta {
  /* .45 dava #9B9B9B sobre branco = 2.78:1, abaixo do 3:1 que a WCAG 1.4.11 pede
     para componente de UI — e esta setinha e o UNICO sinal PERMANENTE de "esta
     linha abre" (o sublinhado so existe no hover, que no toque nao existe).
     .62 => #757575 = 4.61:1 sobre branco, 4.54:1 sobre a zebra #f4f9fa, 4.45:1
     sobre a linha aberta #EDF5F7 e 4.36:1 no pior caso (hover sobre a zebra).
     line-height 0: o filho e um <svg>, nao um glifo. */
  flex: none; display: inline-flex; align-self: center;
  color: inherit; opacity: .62; line-height: 0;
  transition: transform .16s cubic-bezier(.22,1,.36,1), opacity .16s;
}
.est-seta svg { display: block; }
.est-btn:hover .est-seta, .est-btn:focus-visible .est-seta { opacity: 1; color: var(--teal); }
.est-btn[aria-expanded="true"] .est-seta { transform: rotate(180deg); opacity: 1; }

/* zebra por CLASSE nesta tabela: a revelacao inline entra como <tr> no meio do
   tbody e :nth-child(even) inverteria as faixas de tudo que vem abaixo dela. */
#tabela-pedidos tbody tr:nth-child(even) { background: transparent; }
#tabela-pedidos tbody tr.linha-par { background: #f4f9fa; }

/* ---- revelacao inline do detalhe (sem modal) ---- */
#tabela-pedidos tbody tr.est-det td {
  background: #EDF5F7; border-top: 0; padding: 0 12px 13px;
}
/* A linha que ABRIU usa o MESMO fundo do detalhe: os dois leem como um bloco so,
   e em 390px (onde o detalhe fica sticky a esquerda e a linha pode estar rolada)
   da para ver o que foi clicado. Pinta o <td>, e nao o <tr>, porque
   ".tabela tbody tr:hover td" tambem pinta td e apagaria a linha aberta; o
   seletor com #id vence tanto o hover quanto a zebra .linha-par sem !important. */
#tabela-pedidos tbody tr.linha-aberta td { background: #EDF5F7; }
/* STICKY no eixo X, encostado a esquerda do SCROLLER (.tabela-wrap).
   Ancorado a direita, em 390px o detalhe nascia em x=12..332 enquanto o wrap
   estava em scrollLeft=814 para a coluna Estoque ficar clicavel: o conteudo caia
   ~480px a esquerda da area visivel e a linha "abria vazia" (o
   scrollIntoView({block:"nearest"}) do JS so cuida do eixo Y).
   Sticky resolve em QUALQUER scrollLeft e em qualquer largura — e no desktop
   tambem tira o bloco de pairar no meio da tabela sem se alinhar a coluna
   nenhuma: encostado a esquerda ele le como continuacao da linha.
   O min() usa o container query do .tabela-wrap (cqi = largura REAL visivel,
   nao a da tabela); 24px = padding do <td>. */
.est-det-in {
  position: sticky; left: 12px;
  display: grid; gap: 10px; padding-top: 2px;
  max-width: min(620px, calc(100cqi - 24px));
  opacity: 0; transform: translateY(-4px);
  transition: opacity .16s ease-out, transform .16s ease-out;
}
.est-det.est-det-on .est-det-in { opacity: 1; transform: none; }
.est-det-item {
  display: grid; grid-template-columns: 84px minmax(0, 1fr);
  gap: 12px; align-items: start;
}
.est-det-rot {
  padding-top: 2px; font-size: 11px; font-weight: 700; color: var(--dim);
  text-transform: uppercase; letter-spacing: .4px;
}
.est-det-val { font-size: 12.5px; color: var(--texto); }
.est-sep { color: var(--dim); margin: 0 3px; }
.est-det-rodape { margin: 0; padding-left: 96px; font-size: 12px; color: var(--dim); }

/* barras do detalhe: mesma gramatica de .barra, classes proprias.
   Fill teal (e nao ambar): la o bar significa FALTA, aqui significa CHEGOU. */
.est-barras { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.est-barra {
  display: grid; grid-template-columns: minmax(78px, 126px) minmax(0, 1fr) auto;
  align-items: center; gap: 10px;
}
.est-barra-loja {
  /* sem elipse: nome de loja nao se corta em lugar nenhum. Aqui o rotulo tem coluna
     estreita (78-126px), entao ele QUEBRA em duas linhas — a barra ao lado continua
     alinhada pelo center e a linha so cresce alguns pixels. */
  font-size: 12px; font-weight: 600; color: var(--texto);
}
/* MESMA especificidade (0,1,0) que .est-lugar-transito e DEPOIS dele no arquivo: a
   regra de cor da barra ganhava por ordem e o "(em transito)" saia em tinta cheia
   assim que a linha era ABERTA — na celula ele era --dim e no detalhe virava uma
   loja de verdade, a colisao que os parenteses existem para desfazer. Compondo as
   duas classes (0,2,0) a cor do deposito ganha em qualquer ordem, sem !important. */
.est-barra-loja.est-lugar-transito { color: var(--dim); }
.est-barra-trilho {
  height: 8px; border-radius: 999px; background: var(--painel-claro); overflow: hidden;
}
.est-barra-fill {
  display: block; height: 100%; border-radius: 999px; background: var(--teal);
  transition: width .25s cubic-bezier(.22,1,.36,1);
}
.est-barra-num {
  display: flex; align-items: baseline; gap: 5px; justify-content: flex-end;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.est-barra-num b { font-size: 13px; font-weight: 700; color: var(--texto); }
.est-barra-num small { font-size: 11px; color: var(--dim); }

/* CONTAINER query, nunca @media: quem sabe o espaco REAL e o .tabela-wrap (o
   proprio scroller). O viewport nao serve — a tabela nao encolhe (11 colunas,
   ~1170px), ela ROLA. */
@container tabela (max-width: 520px) {
  /* trilho de ~100px com radius 999px numa barra de 14px vira BOLINHA e le como
     bullet/radio, nao como barra. Estreito demais para comparar, o trilho sai e
     sobra o que importa: "LOJA .... N un.". */
  .est-barra { grid-template-columns: minmax(0, 1fr) auto; }
  .est-barra-trilho { display: none; }
  /* sem a coluna do rotulo a esquerda, 96px de recuo viravam um vao morto */
  .est-det-rodape { padding-left: 0; }
}

/* ---- legenda da coluna (discreta, acima da tabela) ----
   Cada par (termo + definicao) e um ITEM que nunca se parte: montada como texto
   corrido com "·", em 980px o termo terminava a linha 1 e a definicao comecava a
   linha 2 (termo divorciado da definicao) e em 390px sobrava um "·" orfao abrindo
   linha. O separador virou ESPACAMENTO (gap), nao caractere. */
.est-legenda {
  margin: 0 0 8px; font-size: 11px; line-height: 1.5; color: var(--dim);
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 18px;
}
.est-legenda-item { display: inline-block; max-width: 100%; }
.est-legenda-tit { display: inline-block; color: var(--texto); font-weight: 700; }
.est-legenda b { color: var(--teal); font-weight: 700; }
.est-legenda i { color: var(--dim); font-style: normal; font-weight: 700; }
.est-legenda i.est-legenda-transito { color: var(--azul-info); }
.est-legenda i.est-legenda-alerta { color: var(--amarelo-forte); }

@media (prefers-reduced-motion: reduce) {
  .atend-fill, .split-proc, .split-nproc, .barra-fill,
  .split-est, .split-transito, .split-sem,
  .est-barra-fill, .est-seta { transition: none; }
  .tabela-scroll::before, .tabela-scroll::after { transition: none; }
  /* a revelacao inline aparece pronta, sem deslocamento */
  .est-det-in { transition: none; opacity: 1; transform: none; }
}
