/* =====================================================================
   SegueRota — identidade visual.

   Paleta da marca:
     #0D1B2A  tinta      texto, trilha lateral, superfícies escuras
     #1366FF  azul       ação primária, foco, "em andamento"
     #22C55E  verde      conclusão, sucesso, confirmação
     #6B7280  cinza      texto de apoio
     #F4F6F8  claro      fundo da aplicação

   Tipografia: Poppins em toda a interface, inclusive nos dados. O desenho
   geométrico da fonte já traz algarismos de mesma largura quando se pede
   `tabular-nums`, então a coluna de números continua alinhada sem exigir uma
   segunda família monoespaçada — que não existe na marca e destoaria dela.

   Dois temas, o mesmo conjunto de variáveis. O claro é o da papelaria; o
   escuro reaproveita a tinta #0D1B2A como fundo, que é exatamente como a
   marca se apresenta nas peças de fundo escuro.
   ===================================================================== */
:root{
  /* --- cores da marca, sem tradução --- */
  --marca-tinta:#0B1F33;
  --marca-azul:#146EF5;
  --marca-verde:#22C55E;
  --marca-cinza:#565E6B;
  --marca-claro:#F4F6F8;

  /* --- papéis --- */
    /* Link é TEXTO, e texto pequeno precisa de 4,5:1. O azul da marca serve
     para preencher botão — onde o contraste é medido contra o branco por
     cima — mas fica em 4,38:1 como texto sobre fundo claro. Um tom mais
     fechado resolve sem mudar a identidade. */
  --hi:#0A45B8; --hi-forte:#083A9B;
  --ok:#0B6440; --alerta:#D98B17; --erro:#C93B3B;

  /* Cantos generosos: a marca é feita de setas curvas e cápsulas.
     Canto vivo de 4px brigava com o símbolo. */
  /* Raio por FUNÇÃO, não por gosto: campo, botão, cartão e modal têm cada
     um o seu, e o mesmo valor se repete em toda a interface. */
  --r-p:8px;    /* campo, botão pequeno   */
  --r:10px;     /* botão                  */
  --r-g:12px;   /* cartão                 */
  --r-gg:16px;  /* modal                  */

  /* Escala de espaçamento. Valor fora dela é acidente, não decisão. */
  --e1:4px;  --e2:8px;  --e3:12px; --e4:16px;
  --e5:20px; --e6:24px; --e7:32px; --e8:40px;

  /* Sombra leve: o cartão se percebe por borda e espaço, não por peso. */
  --sombra-1:0 1px 2px rgba(16,24,40,.04);
  --sombra-2:0 1px 2px rgba(16,24,40,.04), 0 4px 12px rgba(16,24,40,.05);
  --sombra-3:0 12px 34px -18px rgba(16,24,40,.32);
}
html[data-tema="claro"]{
  --fundo:#F6F8FB; --carta:#FFFFFF; --carta2:#F8FAFC;
  --texto:#102033; --suave:#5A6676; --apagado:#94A3B8; --linha:#E3E9F0;
  --rail:#0B1F33; --rail-txt:#A9B6C6; --rail-titulo:#FFFFFF; --rail-grupo:#8FA3BA;
  --rail-ativo:#146EF5; --rail-hover:#102A43;
  --mapa:#EAEEF3; --mapa-via:#D7DEE7; --mapa-via2:#C6D0DC;
  --sombra:0 1px 2px rgba(13,27,42,.04), 0 12px 32px -20px rgba(13,27,42,.35);
  --selo-a:#E7EFFF; --selo-at:#0A45B8;   /* aberta      — azul claro   */
  --selo-b:#E7EFFF; --selo-bt:#0A45B8;   /* andamento   — azul         */
  --selo-c:#EAF8F1; --selo-ct:#0B6440;   /* concluído   — verde        */
  --selo-d:#EEF1F5; --selo-dt:#565E6B;   /* neutro      — cinza        */
  --selo-e:#FFF6E5; --selo-et:#7A4F09;   /* atenção     — âmbar        */
  --selo-f:#FFF0F0; --selo-ft:#A32D2D;   /* erro        — vermelho     */
  --trilho-vazio:#DDE3EB;
}
html[data-tema="escuro"]{
  /* Tokens PRÓPRIOS do tema escuro, não a inversão do claro: superfície
     ligeiramente acima do fundo, borda visível e texto que não vibra. */
  --fundo:#071827; --carta:#0D2033; --carta2:#122A40;
  --texto:#E8EEF5; --suave:#A3B3C6; --apagado:#8497AC; --linha:#1E3448;

  /* Azul e vermelho CLAREADOS no tema escuro.
     A cor da marca sobre fundo branco tem contraste de sobra; a mesma cor
     sobre navy fica em 3,6:1 — abaixo do mínimo para texto pequeno, que é
     justamente onde ela aparece: número de demanda em tabela.
     Cor de marca não é a mesma coisa em dois fundos diferentes. */
  --marca-azul:#5C9BFF;
  --erro:#FF7B7B;
  --ok:#4ADE9A;
  --alerta:#E9B75C;
  --rail-grupo:#8FA3BA;

  /* `--hi` (cor de link) e `--ok` são definidos no :root com tons ESCUROS,
     certos sobre fundo branco e ilegíveis sobre navy. Sobrescrever aqui é
     obrigatório: variável herdada não muda sozinha com o tema. */
  --hi:#7FB2FF; --hi-forte:#A8CBFF;
  --rail:#06101B; --rail-txt:#A9B6C6; --rail-titulo:#FFFFFF; --rail-grupo:#8FA3BA;
  --mapa:#122335; --mapa-via:#1E3145; --mapa-via2:#182A3D;
  --sombra:0 1px 2px rgba(0,0,0,.5), 0 14px 36px -22px rgba(0,0,0,.9);
  --selo-a:#12294A; --selo-at:#7FAAFF;
  --selo-b:#12294A; --selo-bt:#5C93FF;
  --selo-c:#0F3222; --selo-ct:#5BD98A;
  --selo-d:#1B2A3B; --selo-dt:#93A2B5;
  --selo-e:#38290F; --selo-et:#E9B75C;
  --selo-f:#3A1717; --selo-ft:#F08B8B;
  --trilho-vazio:#24384E;
}
*{box-sizing:border-box}
body{margin:0;background:var(--fundo);color:var(--texto);
     font:400 14px/1.6 "Poppins",system-ui,-apple-system,sans-serif;
     -webkit-font-smoothing:antialiased;
     transition:background .18s ease,color .18s ease}

/* Títulos em caixa normal e peso 600. O wireframe usava condensada em caixa
   alta, de placa de sinalização; a marca é o oposto — geométrica, arredondada
   e falando em frase ("Segue a rota. Você no controle."). */
h1,h2,h3{font-weight:600;letter-spacing:-.01em;text-transform:none}
h1{font-size:23px;margin:0;line-height:1.25}
h2{font-size:16px;margin:0 0 12px}
h3{font-size:13px;margin:0 0 8px;color:var(--suave);font-weight:600}

/* `.mono` deixou de significar "outra família": significa dado tabular.
   Mesma fonte, algarismos de largura fixa. */
.mono,.num{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;
           letter-spacing:.01em}
a{color:var(--hi)}
/* Botão com aparência de link. Existe porque algumas ações que pareciam
   link precisaram virar POST — sair, principalmente — e a forma não devia
   mudar só porque o método mudou. */
.link-botao{background:none;border:0;padding:0;font:inherit;color:var(--hi);
            cursor:pointer;text-decoration:underline;text-underline-offset:2px}
.link-botao:hover{color:var(--hi-forte)}

/* ---- ícones ---- */
.ico{width:17px;height:17px;flex:0 0 auto;stroke:currentColor;fill:none;
     stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.ico.g{width:21px;height:21px}
.ico.p{width:14px;height:14px}

/* ---- estrutura ---- */
.marca{padding:18px 18px 15px;border-bottom:1px solid rgba(255,255,255,.08);
       display:flex;gap:10px;align-items:center}
.marca .sinal{width:34px;height:34px;border-radius:var(--r-p);background:#fff;
              display:grid;place-items:center;flex:0 0 auto;padding:4px}
.marca strong{display:block;color:var(--rail-titulo);font-size:17px;font-weight:600;
              letter-spacing:-.02em;line-height:1.15}
.marca strong i{font-style:normal;color:var(--marca-azul)}
/* Só a assinatura vai em caixa alta. O seletor `.marca span` pegava também o
   <span> que embrulha o logotipo, e "SegueRota" virava "SEGUEROTA" — que não
   é como a marca se escreve. */
.marca > span > span{display:block;font-size:9px;color:var(--rail-grupo);
                     letter-spacing:.1em;text-transform:uppercase;line-height:1.4}
.marca strong{text-transform:none}

/* =====================================================================
   SegueRota — Opção E: grupos em abas no topo, trilha com um grupo só.

   Substitui os blocos "estrutura" (trilha e topo), "Menu recolhível" e o
   trecho de trilha do fim do portal.css. O resto do arquivo continua
   valendo — cartões, tabelas, selos, trilho, formulários, nada é tocado.

   A DIVISÃO:
     FAIXA 1 (navy)   sessão — marca, busca, empresa, conta, sair.
     FAIXA 2 (clara)  os GRUPOS, como abas. Navegação de primeiro nível.
     TRILHA           só os itens do grupo aberto. Cinco, não dezoito.

   Por que a trilha encolhe: o menu do ADMIN tem 18 itens em 6 grupos, e
   nenhuma tela cabe nisso sem rolar. Com o grupo escolhido em cima, a
   coluna sempre cabe — e o caminho até um item fica declarado em dois
   passos, grupo e item, em vez de uma lista longa onde tudo tem o mesmo
   peso.
   ===================================================================== */

/* Altura das duas faixas somadas. A trilha gruda logo abaixo delas. */
:root{--faixas:107px}

.app{display:flex;flex-direction:column;min-height:100vh}
.corpo{display:flex;flex:1;min-width:0}

/* ---------------------------------------------------------------------
   FAIXA 1 — SESSÃO
   --------------------------------------------------------------------- */
.topo-sessao{background:var(--rail);color:var(--rail-txt);
  padding:9px 20px;display:flex;align-items:center;gap:12px;
  position:sticky;top:0;z-index:30}

.topo-sessao .marca{padding:0;border:0;flex:0 0 auto;gap:10px}
.topo-sessao .marca .sinal{width:32px;height:32px}
.topo-sessao .marca strong{font-size:16px}
/* O "Rota" da marca sobre a trilha navy: #146EF5 dá 3,64:1, abaixo do
   mínimo para texto deste tamanho. O tom clareado já existe no tema
   escuro e resolve sem sair da identidade. */
.topo-sessao .marca strong i{color:#5C9BFF}

.topo-sessao .busca{flex:0 1 300px;max-width:none;position:relative;
  display:flex;align-items:center;margin-left:16px}
.topo-sessao .busca .ico{position:absolute;left:11px;color:var(--rail-grupo)}
.topo-sessao .busca input{padding:9px 12px 9px 34px;border-radius:100px;
  border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.07);color:#fff}
.topo-sessao .busca input:focus{border-color:#5C9BFF;
  box-shadow:0 0 0 3px rgba(92,155,255,.22)}
/* Sem cor declarada, o placeholder cai no cinza claro do navegador e
   some sobre o navy: 1,3:1. */
.topo-sessao .busca input::placeholder{color:var(--rail-grupo)}
.topo-sessao .espaco-busca{flex:0 1 300px;margin-left:16px}
.topo-sessao .empurra{flex:1}
.topo-sessao .divisor{width:1px;height:26px;background:rgba(255,255,255,.14);flex:0 0 auto}

/* EM QUAL EMPRESA SE ESTÁ OPERANDO. Numa plataforma com várias
   transportadoras, errar de empresa custa tanto quanto errar de usuário,
   e essa informação não aparecia em lugar nenhum da tela. */
.chip-empresa{display:flex;align-items:center;gap:8px;padding:8px 12px 8px 8px;
  border:1px solid rgba(255,255,255,.14);border-radius:100px;
  background:rgba(255,255,255,.06);color:#fff;font:inherit;
  font-size:12.5px;font-weight:600;white-space:nowrap;text-decoration:none}
a.chip-empresa:hover{background:rgba(255,255,255,.12)}
.chip-empresa .sigla{width:22px;height:22px;border-radius:6px;display:grid;
  place-items:center;background:var(--selo-a);color:var(--selo-at);
  font-size:9.5px;font-weight:700;flex:0 0 auto}

/* ---------------------------------------------------------------------
   CONTA
   --------------------------------------------------------------------- */
.conta{position:relative;flex:0 0 auto}
.conta-btn{display:flex;align-items:center;gap:8px;padding:4px 10px 4px 4px;
  border:1px solid rgba(255,255,255,.14);border-radius:100px;
  background:rgba(255,255,255,.06);font:inherit;cursor:pointer;color:#fff}
.conta-btn:hover{background:rgba(255,255,255,.12)}
.conta-btn .quem{text-align:left;line-height:1.15;min-width:0}
.conta-btn .quem b{display:block;font-size:12.5px;font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px}
.conta-btn .quem span{display:block;font-size:10.5px;color:var(--rail-txt)}
.conta-btn .seta{color:var(--rail-grupo);transition:transform 160ms ease}
.conta-btn[aria-expanded="true"] .seta{transform:rotate(180deg)}

.menu-conta{position:absolute;right:0;top:calc(100% + 8px);width:246px;
  background:var(--carta);border:1px solid var(--linha);border-radius:var(--r-g);
  padding:7px;box-shadow:var(--sombra-3);z-index:60}
.menu-conta[hidden]{display:none}
.menu-conta .quem-cab{padding:8px 11px 9px;border-bottom:1px solid var(--linha);
  margin-bottom:5px}
.menu-conta .quem-cab b{display:block;font-size:12.5px;font-weight:600;line-height:1.3;
  color:var(--texto)}
.menu-conta .quem-cab .email{display:block;font-size:11px;color:var(--suave);
  line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.menu-conta .quem-cab .selos{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap}
.menu-conta a,
.menu-conta button{display:flex;align-items:center;gap:10px;width:100%;
  padding:10px 11px;border:0;border-radius:var(--r-p);background:transparent;
  color:var(--texto);font:inherit;font-size:13px;font-weight:500;
  text-align:left;text-decoration:none;cursor:pointer}
.menu-conta a:hover,
.menu-conta button:hover{background:var(--carta2)}
.menu-conta .ico{color:var(--suave)}
.menu-conta .separa{height:1px;background:var(--linha);margin:5px 4px}

/* SAIR é vermelho e vem depois do filete: a separação é o que impede o
   clique de inércia logo abaixo de "Tema escuro". */
.menu-conta .sair,
.menu-conta .sair .ico{color:var(--erro)}
.menu-conta .sair:hover{background:var(--selo-f)}

/* ---------------------------------------------------------------------
   FAIXA 2 — OS GRUPOS COMO ABAS

   É a mudança que dá nome a esta versão. O agrupamento deixa de ser uma
   etiqueta de 9,5px em caixa alta dentro da coluna e vira navegação de
   primeiro nível, com o mesmo peso de qualquer outra aba do sistema.
   --------------------------------------------------------------------- */
.faixa-grupos{background:var(--carta);border-bottom:1px solid var(--linha);
  padding:0 20px;display:flex;align-items:center;gap:2px;
  overflow-x:auto;position:sticky;top:60px;z-index:25}

.faixa-grupos .aba{display:flex;align-items:center;gap:8px;padding:0 14px;
  height:46px;border:0;background:transparent;cursor:pointer;
  color:var(--suave);font:inherit;font-size:13px;font-weight:500;
  border-bottom:2px solid transparent;white-space:nowrap;text-decoration:none}
.faixa-grupos .aba:hover{color:var(--texto)}
.faixa-grupos .aba[aria-selected="true"],
.faixa-grupos .aba.ativo{color:var(--hi);font-weight:600;border-bottom-color:var(--marca-azul)}
.faixa-grupos .aba:focus-visible{outline:2px solid var(--marca-azul);outline-offset:-2px}

/* Quantos itens a aba guarda. Sem o número, a aba não diz se vale o
   clique — e o custo de descobrir é uma troca de contexto inteira. */
.faixa-grupos .aba .quantos{background:var(--carta2);color:var(--suave);
  border-radius:100px;font-size:10.5px;font-weight:600;padding:1px 7px;
  font-variant-numeric:tabular-nums}
.faixa-grupos .aba[aria-selected="true"] .quantos{background:var(--selo-a);color:var(--selo-at)}

.faixa-grupos .empurra{flex:1;min-width:12px}

/* A ação principal fica na ponta da faixa: é a única coisa que CRIA algo,
   e não pertence a grupo nenhum. */
.faixa-grupos .acao-menu{display:flex;align-items:center;gap:8px;
  padding:10px 16px;border-radius:100px;background:var(--marca-azul);color:#fff;
  font-size:13px;font-weight:600;text-decoration:none;white-space:nowrap;
  box-shadow:0 8px 20px -10px rgba(19,102,255,.9);flex:0 0 auto}
.faixa-grupos .acao-menu:hover{background:var(--hi-forte)}
.faixa-grupos .acao-menu .ico{color:#fff}

/* Perfil com um grupo só não precisa de aba: uma aba sozinha não é
   escolha, é decoração. O PHP omite a faixa; esta regra é a garantia. */
.faixa-grupos:empty{display:none}

/* ---------------------------------------------------------------------
   TRILHA — só o grupo aberto
   --------------------------------------------------------------------- */
.trilha{width:232px;flex:0 0 232px;background:var(--rail);color:var(--rail-txt);
  display:flex;flex-direction:column;padding:14px 0 10px;
  position:sticky;top:var(--faixas);height:calc(100vh - var(--faixas));
  align-self:flex-start;
  transition:width 160ms ease, flex-basis 160ms ease}

.titulo-grupo{display:flex;align-items:center;gap:9px;padding:0 20px 12px;color:#fff}
.titulo-grupo .nome{font-size:15px;font-weight:600;letter-spacing:-.01em;
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.titulo-grupo .quantos{background:rgba(255,255,255,.1);color:var(--rail-txt);
  border-radius:100px;font-size:10.5px;font-weight:600;padding:2px 8px;
  font-variant-numeric:tabular-nums}

.nav{flex:1;overflow-y:auto;overflow-x:hidden;padding:0 0 8px}
.nav .itens-grupo[hidden]{display:none}

.nav a{display:flex;align-items:center;gap:11px;margin:2px 12px;padding:10px 12px;
  color:var(--rail-txt);text-decoration:none;font-size:13.5px;font-weight:500;
  border-radius:var(--r-p);cursor:pointer;position:relative}
.nav a:hover{background:rgba(255,255,255,.06);color:#fff}
.nav a.ativo{background:var(--marca-azul);color:#fff;font-weight:600;
  box-shadow:0 6px 16px -8px rgba(19,102,255,.9)}
.nav a:focus-visible{outline:2px solid #5C9BFF;outline-offset:2px}
.nav a.ramo-ativo{color:#fff;background:rgba(255,255,255,.05)}
.nav a .tem-filhos{margin-left:auto;opacity:.5}
.nav a.sub-item{padding:7px 12px 7px 44px;font-size:12.5px;color:var(--rail-grupo)}
.nav a.sub-item:hover{color:#fff}
.nav a.sub-item.ativo{background:var(--marca-azul);color:#fff;font-weight:600}

/* Contador do item. `.bolha` já existia, em verde: cor de sucesso para
   anunciar ocorrência aberta diz a coisa errada. */
.nav .bolha{margin-left:auto;background:var(--marca-verde);color:#06331B;
  border-radius:100px;font-size:10px;font-weight:700;padding:1px 7px;
  font-variant-numeric:tabular-nums}
.nav .bolha.atencao{background:var(--erro);color:#fff}

/* O botão de recolher desce para o pé da coluna: no topo ele disputaria
   com o título do grupo, que é a informação nova desta versão. */
.trilha .recolher{background:transparent;border:0;cursor:pointer;
  width:40px;height:40px;border-radius:var(--r);color:var(--rail-grupo);
  display:grid;place-items:center;margin:0 12px;flex:0 0 auto}
.trilha .recolher:hover{background:rgba(255,255,255,.08);color:#fff}
/* A seta aponta para onde a coluna VAI: para a esquerda quando recolhe,
   para a direita quando volta. Girada 90° ela apontava para baixo, que não
   diz nada sobre largura. */
.trilha .recolher .seta{transform:rotate(180deg);transition:transform 160ms ease}
body.menu-recolhido .trilha .recolher .seta{transform:rotate(0deg)}

/* ---------------------------------------------------------------------
   TRILHA RECOLHIDA (62px)

   Aqui ela vale menos que nas outras opções — a coluna já é curta —, mas
   continua: em tela de 1366px, 170px devolvidos são uma coluna a mais na
   tabela do fechamento.
   --------------------------------------------------------------------- */
body.menu-recolhido .trilha{width:62px;flex:0 0 62px}
body.menu-recolhido .titulo-grupo .nome,
body.menu-recolhido .titulo-grupo .quantos,
body.menu-recolhido .nav a span,
body.menu-recolhido .nav a .tem-filhos,
body.menu-recolhido .nav a.sub-item{display:none}
body.menu-recolhido .titulo-grupo{justify-content:center;padding:0 0 10px}
body.menu-recolhido .nav a{justify-content:center;margin:2px 9px;padding:10px 0}
body.menu-recolhido .trilha .recolher{margin:0 auto}

body.menu-recolhido .nav .bolha{position:absolute;top:3px;right:4px;margin:0;
  width:7px;height:7px;padding:0;border-radius:50%;font-size:0;overflow:hidden;
  border:1.5px solid var(--rail)}

@media (max-width:720px){ .trilha .recolher{display:none} }

/* ---------------------------------------------------------------------
   CABEÇALHO DA TELA — dentro do corpo

   Ele disputava a barra do topo com a sessão e perdia: o título ficava
   espremido entre a busca e o relógio. Aqui tem a largura inteira.
   --------------------------------------------------------------------- */
.conteudo{flex:1;min-width:0}
main{padding:0 24px 60px}
.cabecalho-tela{padding:18px 0 0}
.cabecalho-tela .caminho{display:flex;align-items:center;gap:6px;
  font-size:11.5px;color:var(--suave)}
.cabecalho-tela .caminho b{color:var(--texto);font-weight:600}
.cabecalho-tela h1{margin:0}
.cabecalho-tela .descricao-tela{margin:2px 0 0;font-size:12.5px;color:var(--suave)}
.tela{display:none;padding-top:16px}
.tela.ativa{display:block}

/* ---------------------------------------------------------------------
   TELA PEQUENA

   A trilha vira uma segunda faixa horizontal logo abaixo das abas. É a
   forma que esta opção já tem em pé: grupos numa linha, itens do grupo
   aberto na linha de baixo.
   --------------------------------------------------------------------- */
@media(max-width:900px){
  :root{--faixas:0px}
  .corpo{flex-direction:column}

  .topo-sessao{padding:8px 12px;flex-wrap:wrap}
  .topo-sessao .marca strong{display:none}
  .topo-sessao .busca{flex:1 1 100%;order:3;margin:8px 0 0}
  .topo-sessao .espaco-busca{display:none}
  .conta-btn .quem{display:none}
  .faixa-grupos{padding:0 12px}
  .faixa-grupos .acao-menu{padding:8px 14px}

  .trilha{width:100%;flex:none;height:auto;position:static;
    flex-direction:row;align-items:center;padding:8px 12px}
  .titulo-grupo{display:none}
  .nav{padding:0;overflow-x:auto;overflow-y:hidden}
  .nav .itens-grupo{display:flex;gap:6px}
  .nav a{margin:0;padding:7px 12px;border-radius:100px;white-space:nowrap;
    background:rgba(255,255,255,.08);flex:0 0 auto}
  .nav a.ativo{background:#fff;color:var(--rail);box-shadow:none}
  .nav a.sub-item{display:none}
}

/* ---- cartões ---- */
.grade{display:grid;gap:13px}
.g5{grid-template-columns:repeat(5,1fr)}.g4{grid-template-columns:repeat(4,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}.g2{grid-template-columns:repeat(2,1fr)}
.cartao{background:var(--carta);border:1px solid var(--linha);border-radius:var(--r);
        padding:16px;box-shadow:var(--sombra)}
.indicador .rotulo{font-size:11.5px;letter-spacing:.02em;color:var(--suave);font-weight:500;
                   display:flex;align-items:center;gap:6px;margin-bottom:6px}
.indicador .num{font-size:31px;font-weight:600;line-height:1;letter-spacing:-.02em}
.indicador .nota{font-size:11px;color:var(--suave);margin-top:5px}
.indicador.destaque{border-left:3px solid var(--marca-azul)}
.num.ok{color:var(--ok)}.num.risco{color:var(--erro)}.num.atencao{color:var(--alerta)}

/* ---- tabelas ---- */
.tabela-caixa{background:var(--carta);border:1px solid var(--linha);border-radius:var(--r);
              overflow:auto;box-shadow:var(--sombra)}
table{width:100%;border-collapse:collapse;font-size:13.5px}
th{text-align:left;font-size:11.5px;text-transform:none;letter-spacing:0;color:var(--suave);
   font-weight:600;padding:11px 13px;background:var(--carta2);
   border-bottom:1px solid var(--linha);white-space:nowrap}
td{padding:11px 13px;border-bottom:1px solid var(--linha);vertical-align:middle}
tbody tr:last-child td{border-bottom:0}
tbody tr.clicavel{cursor:pointer}
tbody tr.clicavel:hover{background:var(--carta2)}

/* ---- ELEMENTO-ASSINATURA: o trilho ----
   Seis marcos reais do processo. A barra preenchida diz até onde a carga
   chegou sem que o operador precise ler o texto do status. */
.trilho{display:flex;align-items:center;min-width:116px}
.trilho .marco{width:8px;height:8px;border-radius:50%;background:var(--carta);
               border:2px solid var(--trilho-vazio);flex:0 0 auto;z-index:1}
.trilho .haste{height:2px;background:var(--trilho-vazio);flex:1}
.trilho .marco.feito{background:var(--hi);border-color:var(--hi)}
.trilho .haste.feito{background:var(--hi)}
.trilho .marco.agora{box-shadow:0 0 0 3px rgba(19,102,255,.24)}
.trilho.fim .marco.feito,.trilho.fim .haste.feito{background:var(--ok);border-color:var(--ok)}
.trilho-legenda{display:flex;justify-content:space-between;font-size:10.5px;color:var(--suave);
                text-transform:none;letter-spacing:0;margin-top:6px}

/* ---- barra de franquia ---- */
.barra{height:9px;background:var(--trilho-vazio);border-radius:100px;overflow:hidden;position:relative}
.barra i{display:block;height:100%;background:var(--hi);border-radius:100px}
.barra i.ok{background:var(--ok)}.barra i.alerta{background:var(--alerta)}.barra i.risco{background:var(--erro)}
.barra-info{display:flex;justify-content:space-between;font-size:11.5px;color:var(--suave);margin:5px 0 2px}
.barra-meta{position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--texto);opacity:.55}

/* ---- selos ---- */
.selo{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:100px;
      font-size:10.5px;font-weight:600;letter-spacing:.01em;white-space:nowrap}
.s-aberta{background:var(--selo-a);color:var(--selo-at)}
.s-andamento{background:var(--selo-b);color:var(--selo-bt)}
.s-ok{background:var(--selo-c);color:var(--selo-ct)}
.s-off{background:var(--selo-d);color:var(--selo-dt)}
.s-alerta{background:var(--selo-e);color:var(--selo-et)}
.s-erro{background:var(--selo-f);color:var(--selo-ft)}
.atrasado{color:var(--erro);font-weight:600}
.chapa{display:inline-block;background:var(--marca-tinta);color:#fff;padding:2px 8px;
       border-radius:6px;font-size:11.5px;font-weight:500;letter-spacing:.04em;
       font-variant-numeric:tabular-nums}

/* ---- formulários ---- */
label{display:block;font-size:11.5px;letter-spacing:0;text-transform:none;
      font-weight:500;color:var(--suave);margin-bottom:5px}
input,select,textarea{width:100%;padding:9px 12px;border:1px solid var(--linha);
      border-radius:var(--r-p);font:inherit;background:var(--carta);color:var(--texto);
      transition:border-color .15s ease,box-shadow .15s ease}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--marca-azul);
      box-shadow:0 0 0 3px rgba(19,102,255,.16)}
input:disabled,select:disabled{background:var(--carta2);color:var(--suave);cursor:not-allowed}
.campo{margin-bottom:12px}
.linha-campos{display:grid;gap:12px;grid-template-columns:repeat(2,1fr)}
.linha-campos.t3{grid-template-columns:repeat(3,1fr)}
.linha-campos.t4{grid-template-columns:repeat(4,1fr)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:9px 18px;
     border:0;border-radius:100px;background:var(--marca-azul);color:#fff;
     font-family:inherit;font-size:13.5px;font-weight:600;letter-spacing:0;
     text-transform:none;cursor:pointer;text-decoration:none;
     transition:background .15s ease,transform .06s ease}
.btn:hover{background:var(--hi-forte)}
.btn:active{transform:translateY(1px)}
.btn.verde{background:var(--marca-verde)}
.btn.verde:hover{background:#199C4C}
.btn.escuro{background:var(--marca-tinta);color:#fff}
.btn.claro{background:var(--carta);color:var(--texto);border:1px solid var(--linha)}
.btn.claro:hover{background:var(--carta2)}
.btn.mini{padding:5px 13px;font-size:12px}
.btn:focus-visible{outline:2px solid var(--marca-azul);outline-offset:2px}
.filtros{display:flex;gap:9px;align-items:flex-end;flex-wrap:wrap;margin-bottom:14px}
.filtros .campo{margin:0;min-width:136px}
.entre{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
.pilha{display:flex;flex-direction:column;gap:13px}
.abas{display:flex;gap:2px;border-bottom:1px solid var(--linha);margin-bottom:15px;overflow-x:auto}
.aba{padding:9px 14px;font-size:13.5px;font-weight:500;text-transform:none;cursor:pointer;
     white-space:nowrap;border-bottom:2px solid transparent;color:var(--suave)}
.aba.ativa{border-bottom-color:var(--marca-azul);color:var(--marca-azul);font-weight:600}

/* ---- mapa esquemático ---- */
.mapa{background:var(--mapa);border:1px solid var(--linha);border-radius:var(--r);
      position:relative;overflow:hidden}
.mapa svg{display:block;width:100%;height:100%}
.legenda{position:absolute;left:10px;bottom:10px;background:var(--carta);
         border:1px solid var(--linha);border-radius:var(--r);padding:6px 10px;font-size:11px}
.legenda i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}

/* ---- linha do tempo ---- */
.tempo-lista{list-style:none;margin:0;padding:0}
.tempo-lista li{display:grid;grid-template-columns:64px 16px 1fr;gap:9px;padding-bottom:14px;position:relative}
.tempo-lista li:not(:last-child)::before{content:'';position:absolute;left:71px;top:15px;bottom:0;
                                          width:2px;background:var(--linha)}
.tempo-lista .hora{font-variant-numeric:tabular-nums;font-size:12px;color:var(--suave)}
.tempo-lista .ponto{width:9px;height:9px;border-radius:50%;background:var(--hi);
                    margin:5px 0 0 3px;z-index:1;position:relative}
.tempo-lista .ponto.ok{background:var(--ok)}
.tempo-lista .oque{font-weight:600;font-size:13.5px}
.tempo-lista .detalhe{font-size:12px;color:var(--suave)}

/* ---- etiqueta ---- */
.etiqueta{background:#fff;color:#111;border:1px solid #999;border-radius:6px;padding:12px;
          width:250px;font-family:"Poppins",sans-serif}
.etiqueta .cab{display:flex;justify-content:space-between;align-items:flex-start;
               border-bottom:2px solid #111;padding-bottom:6px;margin-bottom:8px}
.etiqueta .vol{font-size:28px;font-weight:700;line-height:.95;letter-spacing:-.02em}
.etiqueta .rota{font-size:12.5px;line-height:1.45}
.etiqueta .barras{display:flex;gap:1px;height:44px;align-items:flex-end;margin:9px 0 4px}
.etiqueta .barras b{background:#111;display:block;height:100%}
.etiqueta .cod{font-variant-numeric:tabular-nums;font-size:12px;text-align:center;letter-spacing:.1em}
.etiqueta .marca{font-size:14px;font-weight:600;padding:0;border:0}
.etiqueta .aviso{margin-top:7px;font-size:10.5px;border-top:1px dashed #999;padding-top:6px;color:#444}

/* ---- avisos ---- */
.aviso{padding:10px 13px;border-radius:var(--r);margin-bottom:14px;font-size:13.5px;
       border-left:3px solid;display:flex;gap:9px;align-items:flex-start}
.aviso.alerta{background:var(--selo-e);border-color:var(--alerta);color:var(--selo-et)}
.aviso.erro{background:var(--selo-f);border-color:var(--erro);color:var(--selo-ft)}
.aviso.info{background:var(--selo-b);border-color:var(--selo-bt);color:var(--selo-bt)}
.nota-wire{background:var(--selo-e);border:1px dashed var(--alerta);border-radius:var(--r);
           padding:9px 12px;font-size:12px;color:var(--selo-et);margin-bottom:14px;
           display:flex;gap:8px;align-items:flex-start}

@media(max-width:1150px){.g5{grid-template-columns:repeat(3,1fr)}}
@media(max-width:900px){
  .g5,.g4,.g3,.g2,.linha-campos,.linha-campos.t3,.linha-campos.t4{grid-template-columns:1fr 1fr}
  main{padding:16px 13px 48px}
}
@media(max-width:560px){.g5,.g4,.g3,.g2,.linha-campos,.linha-campos.t3,.linha-campos.t4{grid-template-columns:1fr}}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* =====================================================================
   Acréscimos ao wireframe: telas públicas (landing, login, erro),
   paginação, ficha de detalhe e estados vazios.

   Reaproveitam as MESMAS variáveis de tema declaradas acima, então os dois
   temas continuam valendo sem nenhuma regra duplicada.
   ===================================================================== */

/* ---- páginas fora do portal ---- */
body.fora{display:block}
.fora-topo{display:flex;align-items:center;justify-content:space-between;gap:16px;
           padding:14px 26px;background:var(--carta);border-bottom:1px solid var(--linha);
           position:sticky;top:0;z-index:20}
.fora-topo .marca{padding:0;border:0}
.fora-topo .marca strong{color:var(--texto)}
.fora-nav{display:flex;align-items:center;gap:18px}
.fora-nav a{color:var(--suave);text-decoration:none;font-size:13.5px;font-weight:500}
.fora-nav a:hover{color:var(--texto)}
.fora-nav a.btn{color:#fff}
.fora-main{max-width:1100px;margin:0 auto;padding:38px 26px 70px}
.fora-secao{margin-top:52px}
.fora-secao h2{font-size:20px;margin-bottom:16px}
.fora-rodape{border-top:1px solid var(--linha);background:var(--carta);
             padding:18px 26px;display:flex;justify-content:space-between;
             font-size:12.5px;color:var(--suave)}

.heroi{display:grid;grid-template-columns:1fr 380px;gap:34px;align-items:center}
.heroi h1{font-size:44px;line-height:1.1;margin:16px 0 18px;letter-spacing:-.03em}
/* O slogan tem duas metades: a afirmação em tinta e a promessa em azul.
   É assim que ele aparece na papelaria da marca. */
.heroi h1 em{font-style:normal;color:var(--marca-azul);display:block}
.heroi p{font-size:15.5px;color:var(--suave);max-width:52ch;margin:0}
.heroi-acoes{display:flex;gap:10px;flex-wrap:wrap;margin-top:22px}
.heroi-quadro{background:var(--carta);border:1px solid var(--linha);border-radius:var(--r);
              padding:16px;box-shadow:var(--sombra)}
.linha-demo{display:flex;justify-content:space-between;align-items:center;
            margin:12px 0 5px;font-size:13px}

/* ---- entrada (login) ---- */
.entrada{display:grid;grid-template-columns:1fr 440px;min-height:100vh}
.entrada-lado{background:var(--rail);color:var(--rail-txt);padding:40px 44px;
              display:flex;flex-direction:column;justify-content:center}
.entrada-lado .marca{padding:0;border:0;margin-bottom:34px}
.entrada-lado h2{color:var(--rail-titulo);font-size:28px;line-height:1.2;letter-spacing:-.02em}
.entrada-lado h2 em{font-style:normal;color:#5C93FF;display:block}
.entrada-lado p{font-size:13.5px;color:var(--rail-grupo);max-width:44ch;margin-top:26px}
.entrada-lado .trilho-legenda{color:var(--rail-grupo)}
.entrada-caixa{background:var(--carta);padding:44px 46px;display:flex;
               flex-direction:column;justify-content:center}
.entrada-caixa h1{font-size:29px;margin-bottom:5px}
.entrada-caixa .sub{color:var(--suave);font-size:13.5px;margin:0 0 24px}
.entrada-caixa form{margin-top:6px}
.entrada-caixa .so-estreito{display:none;padding:0;border:0;margin-bottom:26px}
.rodape-entrada{font-size:12px;color:var(--suave);margin:16px 0 0;line-height:1.5}
.campo-senha{display:flex;gap:7px;align-items:stretch}
.campo-senha input{flex:1}

/* ---- campos empilhados (formulários) ---- */
.campo.bloco{display:flex;flex-direction:column;gap:5px;min-width:0}
.campo.bloco label{font-size:11.5px;letter-spacing:0;text-transform:none;font-weight:500;color:var(--suave)}
.campo.bloco input,.campo.bloco select,.campo.bloco textarea{width:100%}
textarea{font:inherit;padding:8px 10px;border:1px solid var(--linha);border-radius:var(--r);
         background:var(--carta);color:var(--texto);resize:vertical}
.btn.largo{width:100%;justify-content:center;margin-top:6px}

/* ---- página de erro ---- */
.pagina-erro{min-height:100vh;display:grid;place-items:center;padding:26px}
.pagina-erro .cartao{max-width:560px;text-align:center;padding:38px 34px}
.num-erro{font-size:56px;font-weight:600;color:var(--hi);line-height:1}
.pagina-erro h1{margin:8px 0 10px;text-transform:none}
.pagina-erro p{color:var(--suave);margin:0 0 22px}
.pagina-erro .heroi-acoes{justify-content:center}
.detalhe-erro{background:var(--carta2);border:1px solid var(--linha);border-radius:var(--r);
              padding:12px;font-size:11.5px;text-align:left;white-space:pre-wrap;
              word-break:break-word;max-height:260px;overflow:auto;margin:0 0 12px}

/* ---- paginação ---- */
.paginacao{display:flex;align-items:center;justify-content:space-between;gap:12px;
           flex-wrap:wrap;margin-top:12px;font-size:12px;color:var(--suave)}
.paginacao-botoes{display:flex;gap:6px}

/* ---- ficha de detalhe (dt/dd) ---- */
.ficha{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;margin:0;font-size:13px}
.ficha dt{color:var(--suave);white-space:nowrap}
.ficha dd{margin:0;text-align:right;word-break:break-word}

/* ---- estado vazio de tabela ---- */
td.vazio{text-align:center;color:var(--suave);padding:26px 12px;font-size:13px}

/* ---- placa do mapa não configurado ---- */
.mapa-placa{background:var(--mapa);border:1px dashed var(--linha);border-radius:var(--r);
            min-height:380px;display:flex;flex-direction:column;align-items:center;
            justify-content:center;gap:12px;color:var(--suave);text-align:center}
.mapa-placa p{margin:0;font-size:13px;line-height:1.6}

/* ---- abas como links de verdade ---- */
a.aba{text-decoration:none;color:inherit}

/* ---- telas estreitas ---- */
@media (max-width:900px){
  .heroi{grid-template-columns:1fr}
  .entrada{grid-template-columns:1fr}
  .entrada-lado{display:none}
  .entrada-caixa .so-estreito{display:flex}
  .grade.g5,.grade.g4,.grade.g3{grid-template-columns:repeat(2,1fr)}
  .grade[style*="330px"],.grade[style*="360px"]{grid-template-columns:1fr!important}
  .trilha{position:static;height:auto;width:100%;flex:none}
  .app{flex-direction:column}
}
@media (max-width:560px){
  .grade.g5,.grade.g4,.grade.g3,.grade.g2{grid-template-columns:1fr}
  .fora-main{padding:24px 16px 50px}
  .entrada-caixa{padding:30px 22px}
  main{padding:16px 14px 50px}
}

/* =====================================================================
   Marca — bloco reutilizável.
   O símbolo assenta sobre uma pastilha branca porque as setas são azul e
   verde saturados: sobre a tinta escura da trilha, o verde perde contraste,
   e sobre o cinza claro do fundo, o "S" some. Branco resolve os dois casos
   com a mesma regra.
   ===================================================================== */
.marca .sinal svg{width:100%;height:100%}
.marca-clara{padding:0;border:0}
.marca-clara .sinal{background:#fff;box-shadow:0 1px 3px rgba(13,27,42,.14)}
.marca-clara strong{color:var(--texto)}
.marca-clara span span,.marca-clara > span > span{color:var(--suave)}
.marca > span{min-width:0}

/* Pastilha de ícone das seções da landing */
.cartao h3 .ico{color:var(--marca-azul);vertical-align:-3px;margin-right:5px}

/* Pilares da marca: precisão, segurança, visibilidade, agilidade */
.pilares{display:grid;grid-template-columns:repeat(4,1fr);gap:13px;text-align:center}
.pilar{padding:18px 12px;background:var(--carta);border:1px solid var(--linha);
       border-radius:var(--r)}
.pilar .disco{width:44px;height:44px;border-radius:50%;background:var(--selo-b);
              color:var(--marca-azul);display:grid;place-items:center;margin:0 auto 10px}
.pilar b{display:block;font-size:13.5px;font-weight:600}
.pilar span{font-size:12px;color:var(--suave)}
@media(max-width:900px){.pilares{grid-template-columns:repeat(2,1fr)}}

/* Segunda linha de uma célula (rota, subtítulo). O par origem→destino não
   pode quebrar no meio: "BIA-01 →" numa linha e "BIA-02" na outra faz o
   operador ler a rota errada num relance. */
.sub-celula{display:block;font-size:12px;color:var(--suave);line-height:1.45}
.par-rota{white-space:nowrap}

/* No tema escuro a chapa usava a tinta da marca, que é exatamente a cor do
   cartão — a placa virava texto solto, sem a leitura de "plaqueta" que ela
   precisa ter numa tabela de despacho. */
html[data-tema="escuro"] .chapa{background:#1E3145;color:#E8EEF5}

/* =====================================================================
   Formulários de cadastro
   ===================================================================== */
.grade-form{display:grid;grid-template-columns:repeat(3,1fr);gap:13px}
.grade-form .larg-2{grid-column:span 2}
.grade-form .larg-3{grid-column:span 3}
.grade-form .campo{margin:0}

/* O asterisco de obrigatório é informação, não decoração: fica na cor de
   erro para que a leitura rápida do formulário mostre o que não pode faltar. */
label .obrig{color:var(--erro);font-style:normal;margin-left:2px}

.erro-campo{display:block;font-size:11.5px;color:var(--erro);margin-top:4px}
.dica-campo{display:block;font-size:11.5px;color:var(--suave);margin-top:4px}

/* O campo recusado precisa se distinguir sem depender só da cor — quem não
   distingue vermelho continua vendo a borda mais grossa e a mensagem. */
.campo.com-erro input,.campo.com-erro select,.campo.com-erro textarea{
  border-color:var(--erro);border-width:2px;background:var(--selo-f)}

/* Não é `sticky`: presa ao rodapé da janela, a barra passava por cima do
   cartão seguinte e escondia o título da seção. Formulário de cadastro é
   preenchido de cima para baixo e enviado no fim — a barra pertence ao fim. */
.barra-acoes{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
             background:var(--carta);border:1px solid var(--linha);
             border-radius:var(--r);padding:14px 16px}

@media(max-width:900px){
  .grade-form{grid-template-columns:repeat(2,1fr)}
  .grade-form .larg-3{grid-column:span 2}
}
@media(max-width:560px){
  .grade-form{grid-template-columns:1fr}
  .grade-form .larg-2,.grade-form .larg-3{grid-column:span 1}
}
.alinha-num{text-align:right;font-variant-numeric:tabular-nums}

/* Opção com caixa de seleção (carteira do gestor) */
.caixa-opcao{display:flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid var(--linha);
             border-radius:var(--r-p);font-size:13px;cursor:pointer;text-transform:none;
             letter-spacing:0;color:var(--texto);font-weight:400;margin:0}
.caixa-opcao:hover{background:var(--carta2)}
.caixa-opcao input{width:auto;margin:0}

/* Campo com botão de ação ao lado (consulta de CEP) */
.campo-com-botao{display:flex;gap:7px;align-items:stretch}
.campo-com-botao input{flex:1;min-width:0}
.campo-com-botao .btn{white-space:nowrap}

/* Linha de detalhe da auditoria, aberta sob demanda */
tr.escondido{display:none}

/* Senha provisória do aplicativo */
.card-senha{background:var(--carta2);border:1px solid var(--linha);border-radius:var(--r);
            padding:14px 16px;margin-bottom:13px}
.senha-oculta{font-size:20px;letter-spacing:.14em;color:var(--suave)}
.senha-oculta.senha-visivel{color:var(--texto);font-weight:600;letter-spacing:.06em;
                            user-select:all}

/* Legenda do mapa ao vivo */
.ponto{display:inline-block;width:9px;height:9px;border-radius:50%;vertical-align:1px}

/* Chapa em formato de pílula, centralizada (seção de preço da landing) */
.chapa.pilula{display:inline-block;width:auto;align-self:center;padding:4px 14px;
              border-radius:100px;font-size:11px;letter-spacing:.06em}

/* Prova de entrega: assinatura e foto */
.provas{display:flex;gap:11px;flex-wrap:wrap}
.prova{display:block;border:1px solid var(--linha);border-radius:var(--r);overflow:hidden;
       background:#fff;text-decoration:none;width:150px}
.prova img{display:block;width:100%;height:106px;object-fit:contain;background:#fff}
.prova span{display:block;padding:6px 9px;font-size:11.5px;color:var(--suave);
            border-top:1px solid var(--linha);text-align:center}
.prova:hover{border-color:var(--azul)}

/* Legenda do mapa, com contagem por categoria */
.legenda-mapa{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.item-legenda{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;
              border:1px solid var(--linha);border-radius:100px;font-size:11.5px;
              color:var(--suave);background:#fff}
.item-legenda .qtd{color:var(--texto);font-variant-numeric:tabular-nums}
.item-legenda.apagado{opacity:.42}

/* Coleta urgente ou com aceite vencido chama atenção sem virar pisca-pisca */
@keyframes pulso-marcador{0%,100%{opacity:1}50%{opacity:.45}}
.marcador-pulsa{animation:pulso-marcador 1.8s ease-in-out infinite}

/* =====================================================================
   Diálogo e carregamento
   ===================================================================== */

/* Fundo escurecido. `backdrop-filter` desfoca o que está atrás: a decisão
   pedida no diálogo costuma ser irreversível, e tirar a tela de trás do foco
   ajuda a pessoa a ler antes de clicar. */
.veu{position:fixed;inset:0;background:rgba(13,27,42,.45);backdrop-filter:blur(3px);
     display:grid;place-items:center;z-index:900;padding:20px;
     opacity:0;transition:opacity .16s ease}
.veu.visivel{opacity:1}

.dialogo{background:var(--carta);border:1px solid var(--linha);border-radius:16px;
         box-shadow:0 18px 50px rgba(13,27,42,.22);max-width:440px;width:100%;
         padding:22px 24px;transform:translateY(8px) scale(.98);
         transition:transform .16s ease}
.veu.visivel .dialogo{transform:none}

.dialogo .ico-topo{width:42px;height:42px;border-radius:12px;display:grid;
                   place-items:center;margin-bottom:13px}
.dialogo h3{margin:0 0 6px;font-size:17px;font-weight:600;letter-spacing:-.01em}
.dialogo p{margin:0;font-size:13.5px;color:var(--suave);line-height:1.55}
.dialogo .detalhe{margin-top:11px;padding:11px 13px;background:var(--carta2);
                  border-radius:var(--r-p);font-size:13px}
.dialogo .acoes{display:flex;gap:9px;justify-content:flex-end;margin-top:20px}
.dialogo .acoes .btn{min-width:104px;justify-content:center}

.d-perigo .ico-topo{background:var(--selo-f);color:var(--selo-ft)}
.d-alerta .ico-topo{background:var(--selo-e);color:var(--selo-et)}
.d-info   .ico-topo{background:var(--selo-a);color:var(--selo-at)}

/* Carregando: barra fina no topo + véu discreto.
   A barra aparece SOZINHA nos primeiros instantes; o véu só entra depois de
   400 ms, para que ações rápidas não pisquem uma tela de carregamento. */
.barra-carga{position:fixed;top:0;left:0;height:3px;width:0;z-index:1000;
             background:linear-gradient(90deg,var(--marca-azul),var(--ok));
             transition:width .3s ease,opacity .3s ease}
.barra-carga.ativa{width:82%}
.barra-carga.pronta{width:100%;opacity:0}

.veu-carga{position:fixed;inset:0;background:color-mix(in srgb,var(--fundo) 78%,transparent);
           backdrop-filter:blur(2px);display:grid;place-items:center;z-index:890;
           opacity:0;pointer-events:none;transition:opacity .2s ease}
.veu-carga.visivel{opacity:1;pointer-events:all}
.veu-carga .caixa{display:flex;flex-direction:column;align-items:center;gap:13px}
.veu-carga span{font-size:13px;color:var(--suave)}

.girador{width:34px;height:34px;border-radius:50%;border:3px solid var(--linha);
         border-top-color:var(--marca-azul);animation:girar .7s linear infinite}
@keyframes girar{to{transform:rotate(360deg)}}

/* Esqueleto para listas que carregam depois */
.esqueleto{background:linear-gradient(90deg,var(--carta2) 25%,var(--linha) 37%,var(--carta2) 63%);
           background-size:400% 100%;animation:brilho 1.3s ease infinite;border-radius:6px}
@keyframes brilho{0%{background-position:100% 50%}100%{background-position:0 50%}}

@media (prefers-reduced-motion: reduce){
  .girador,.esqueleto{animation:none}
  .veu,.dialogo,.barra-carga,.veu-carga{transition:none}
}

/* Carga de valor alto: símbolo, não texto — painel varrido de relance */
.selo-valor{display:inline-grid;place-items:center;width:22px;height:22px;
            border-radius:6px;background:var(--selo-c);color:var(--selo-ct);
            vertical-align:middle}

/* Filtro de contexto (empresa/clientes) */
.filtro-contexto{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;
                 margin-bottom:13px;padding:11px 13px;background:var(--carta);
                 border:1px solid var(--linha);border-radius:var(--r)}
.filtro-contexto .campo{margin:0;min-width:190px}
.filtro-contexto select.multi{min-height:38px}

/* A marca fica ao lado do filtro, e some junto com ele: é o que evita
   alguém olhar uma tela recortada achando que é a operação inteira. */
.marca-filtro{display:inline-flex;align-items:center;gap:7px;padding:6px 12px;
              border-radius:100px;background:var(--selo-e);color:var(--selo-et);
              font-size:12px;font-weight:600}
.marca-filtro a{color:inherit;text-decoration:none;font-size:14px;opacity:.75}
.marca-filtro a:hover{opacity:1}

/* =====================================================================
   Correções de formulário
   ===================================================================== */

/* SELECT NO MODO ESCURO.
   O navegador desenha a lista aberta com as cores do SISTEMA, não as da
   página: no tema escuro, texto escuro sobre fundo escuro. Definir cor e
   fundo na própria <option> é o único jeito de alcançar o menu nativo. */
select, select option{background-color:var(--carta);color:var(--texto)}
select option:checked{background:var(--marca-azul);color:#fff}
select option:disabled{color:var(--suave)}

/* =====================================================================
   Seletor múltiplo
   ===================================================================== */
.multi-caixa{position:relative}

/* Campo fechado: etiquetas do que está ativo, sem obrigar a abrir a lista */
.multi-etiquetas{display:flex;flex-wrap:wrap;gap:6px;align-items:center;
                 min-height:40px;padding:5px 10px;border:1px solid var(--linha);
                 border-radius:var(--r-p);background:var(--carta);cursor:pointer;
                 transition:border-color 120ms ease,box-shadow 120ms ease}
.multi-etiquetas:hover{border-color:var(--apagado)}
.multi-etiquetas:focus-visible,.multi-caixa:focus-within .multi-etiquetas{
  border-color:var(--marca-azul);box-shadow:0 0 0 3px rgba(38,132,255,.12);outline:none}
.multi-etiquetas .vazio{color:var(--apagado);font-size:13px}

.etiqueta-sel{display:inline-flex;align-items:center;gap:5px;
              padding:3px 5px 3px 10px;border-radius:100px;
              background:var(--selo-a);color:var(--selo-at);
              border:1px solid color-mix(in srgb,var(--selo-at) 22%,transparent);
              font-size:12px;font-weight:600;white-space:nowrap;line-height:1.5}
.etiqueta-sel button{border:0;background:transparent;color:inherit;cursor:pointer;
                     font-size:14px;line-height:1;padding:0 3px;opacity:.65}
.etiqueta-sel button:hover{opacity:1}

/* "+4": o campo não cresce sem limite e empurra a tabela para fora da tela */
.etiqueta-mais{border:1px dashed var(--linha);background:transparent;
               color:var(--suave);font:inherit;font-size:12px;font-weight:600;
               padding:3px 9px;border-radius:100px;cursor:pointer}
.etiqueta-mais:hover{border-color:var(--marca-azul);color:var(--marca-azul)}

/* Painel */
.multi-painel{position:absolute;z-index:80;left:0;top:calc(100% + 5px);
              min-width:320px;max-width:420px;width:max-content;
              background:var(--carta);border:1px solid var(--linha);
              border-radius:var(--r-g);overflow:hidden;
              box-shadow:0 8px 24px rgba(15,23,42,.10), 0 2px 6px rgba(15,23,42,.05)}

.multi-busca{padding:9px;border-bottom:1px solid var(--linha)}
.multi-busca input{width:100%;height:36px;border:1px solid var(--linha);
                   border-radius:var(--r-p);padding:0 11px;font:inherit;font-size:13px;
                   background:var(--carta2);color:var(--texto)}
.multi-busca input:focus{outline:none;border-color:var(--marca-azul);background:var(--carta)}

/* Só a lista rola: busca e rodapé ficam sempre à vista */
.multi-lista{max-height:280px;overflow-y:auto;padding:5px}

.multi-opcao{display:flex;align-items:center;gap:11px;min-height:42px;
             padding:8px 12px;border-radius:7px;cursor:pointer;
             font-size:13.5px;white-space:nowrap;
             transition:background-color 120ms ease}
.multi-opcao:hover{background:var(--carta2)}
.multi-opcao.focada{background:var(--carta2);box-shadow:inset 0 0 0 1px var(--linha)}
/* Fundo sutil no selecionado: a marca é o indicador principal, não a cor */
.multi-opcao.marcada{background:var(--selo-a)}
.multi-opcao.marcada:hover{background:color-mix(in srgb,var(--selo-a) 80%,var(--carta))}
.multi-rotulo{flex:1;overflow:hidden;text-overflow:ellipsis}

.multi-todos{font-weight:600;color:var(--suave);border-bottom:1px solid var(--linha);
             border-radius:7px 7px 0 0;margin-bottom:4px}

/* Caixa de marcação própria: a nativa muda de cara em cada navegador */
.marca-check{width:19px;height:19px;flex:0 0 auto;border-radius:5px;
             border:1.5px solid var(--linha);background:var(--carta);
             display:grid;place-items:center;transition:all 120ms ease}
.multi-opcao.marcada .marca-check{background:var(--marca-azul);border-color:var(--marca-azul)}
.multi-opcao.marcada .marca-check::after{content:'';width:5px;height:9px;
             border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg);
             margin-top:-2px}
/* Estado intermediário do "selecionar todos" */
.multi-opcao.parcial .marca-check{background:var(--marca-azul);border-color:var(--marca-azul)}
.multi-opcao.parcial .marca-check::after{content:'';width:9px;height:2px;
             background:#fff;border:0;transform:none;margin:0}

.multi-rodape{display:flex;align-items:center;justify-content:space-between;
              padding:9px 13px;border-top:1px solid var(--linha);
              background:var(--carta2);font-size:12px;color:var(--suave)}
.multi-limpar{border:0;background:transparent;color:var(--hi);font:inherit;
              font-size:12px;font-weight:600;cursor:pointer;padding:2px 0}
.multi-limpar:disabled{color:var(--apagado);cursor:default}
.multi-limpar:not(:disabled):hover{text-decoration:underline}

@media (max-width:520px){
  .multi-painel{min-width:0;width:100%;max-width:none}
}

/* Endereço: coordenadas ocupam a linha inteira, com o botão depois dos dois
   campos — a busca usa os dois, e ficar só ao lado da latitude sugeria que
   preenchia um só. */
.linha-coordenada{display:grid;grid-template-columns:1fr 1fr auto;gap:13px;
                  align-items:end;grid-column:1/-1}
.linha-coordenada .campo{margin:0}

/* Loja sem ponto confiável no mapa */
.sem-ponto{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;
           border-radius:100px;background:var(--selo-e);color:var(--selo-et);
           font-size:11px;font-weight:600}

/* =====================================================================
   Componentes de identificação e estado
   ===================================================================== */

/* AVATAR.
   Foto quando existe; iniciais quando não. Nunca foto genérica de pessoa —
   um rosto que não é o do motorista atrapalha justamente onde o avatar
   deveria ajudar: reconhecer quem está na porta da loja. */
.avatar{width:36px;height:36px;border-radius:50%;flex:0 0 auto;overflow:hidden;
        display:grid;place-items:center;background:var(--selo-a);color:var(--selo-at);
        font-size:12.5px;font-weight:700;letter-spacing:.02em;user-select:none}
.avatar img{width:100%;height:100%;object-fit:cover;display:block}
.avatar.g{width:52px;height:52px;font-size:17px}
.avatar.p{width:28px;height:28px;font-size:10.5px}
/* Miniatura de apoio — placa de veículo dentro de uma linha de texto. Não
   serve para reconhecer um rosto; serve para distinguir moto de caminhão. */
.avatar.mini{width:20px;height:20px;font-size:8.5px}
.avatar.quadrado{border-radius:9px}
.avatar.quadrado.mini{border-radius:5px}

/* A cor sai do nome, não é aleatória: a mesma pessoa tem sempre a mesma
   cor, e é isso que faz o avatar funcionar como reconhecimento rápido. */
.avatar.t1{background:#E7EFFF;color:#0B4FD1}
.avatar.t2{background:#EAF8F1;color:#0F7A50}
.avatar.t3{background:#FFF6E5;color:#8A5A0B}
.avatar.t4{background:#F1ECFE;color:#5B3FBF}
.avatar.t5{background:#FFF0F0;color:#B03636}
.avatar.t6{background:#E6F6F8;color:#0E6E7A}

.pessoa{display:flex;align-items:center;gap:10px;min-width:0}
.pessoa .nome{font-weight:600;font-size:13.5px;line-height:1.25;
              overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pessoa .sub{display:block;font-size:11.5px;color:var(--suave);line-height:1.3;
             margin-top:1px}
.pessoa>span:last-child{min-width:0;display:block}

/* ESTADO VAZIO.
   "Nenhum registro" numa linha de tabela não diz o que fazer em seguida.
   Aqui o vazio explica por que está vazio e oferece a ação. */
.vazio-estado{display:flex;flex-direction:column;align-items:center;gap:var(--e3);
              padding:var(--e8) var(--e5);text-align:center}
.vazio-estado .ico-vazio{width:56px;height:56px;border-radius:16px;display:grid;
                         place-items:center;background:var(--carta2);color:var(--apagado);
                         border:1px solid var(--linha)}
.vazio-estado .ico-vazio svg,.vazio-estado .ico-vazio .ico{width:26px;height:26px}
/* Cor explícita: a tabela define cor no <th>/<td> e o h3 herdava dela,
   saindo cinza-azulado em vez da cor de título. */
.vazio-estado h3{margin:0;font-size:15.5px;font-weight:600;color:var(--texto)}
.vazio-estado p{margin:0;max-width:44ch;font-size:13px;color:var(--suave);line-height:1.5}

/* ESQUELETO.
   Giro no centro da tela não diz quanto falta nem o que virá. O esqueleto
   mostra a forma do conteúdo antes de ele chegar. */
.esq{background:linear-gradient(90deg,var(--carta2) 25%,var(--linha) 37%,var(--carta2) 63%);
     background-size:400% 100%;animation:brilho 1.3s ease infinite;border-radius:6px;
     height:12px;margin:7px 0}
.esq.t{width:70%} .esq.m{width:45%} .esq.c{width:90%}

/* TABELA: sem bordas verticais, cabeçalho leve, hover discreto. */
table thead th{background:var(--carta2);font-size:11.5px;font-weight:600;
               letter-spacing:.02em;color:var(--suave);text-transform:none}
table tbody tr{transition:background 140ms ease}
table tbody tr:hover{background:var(--carta2)}
table td, table th{border-left:0;border-right:0}

/* MENU DE AÇÕES.
   Três botões no fim de cada linha competem com o conteúdo. Um só, discreto,
   abre o resto — e a ação principal continua visível. */
.menu-acoes{position:relative;display:inline-block}
.menu-acoes>button{background:transparent;border:1px solid transparent;border-radius:8px;
                   width:30px;height:30px;cursor:pointer;color:var(--suave);
                   display:grid;place-items:center;font-size:16px;line-height:1}
.menu-acoes>button:hover{background:var(--carta2);border-color:var(--linha);color:var(--texto)}
.menu-acoes .itens{position:absolute;right:0;top:34px;z-index:60;min-width:190px;
                   background:var(--carta);border:1px solid var(--linha);
                   border-radius:var(--r);box-shadow:var(--sombra-3);padding:5px}
.menu-acoes .itens a,.menu-acoes .itens button{display:flex;align-items:center;gap:9px;
      width:100%;padding:8px 11px;border:0;background:transparent;border-radius:7px;
      font:inherit;font-size:13px;color:var(--texto);text-decoration:none;cursor:pointer;
      text-align:left}
.menu-acoes .itens a:hover,.menu-acoes .itens button:hover{background:var(--carta2)}
.menu-acoes .itens .perigo{color:var(--erro)}
.menu-acoes .itens hr{border:0;border-top:1px solid var(--linha);margin:5px 0}

/* TOOLTIP em ícone cujo sentido não é evidente sozinho. */
.dica{position:relative;cursor:help;border-bottom:1px dotted var(--apagado)}
.dica::after{content:attr(data-dica);position:absolute;bottom:calc(100% + 7px);left:50%;
             transform:translateX(-50%);background:var(--marca-tinta);color:#fff;
             padding:6px 10px;border-radius:7px;font-size:11.5px;font-weight:400;
             white-space:normal;width:max-content;max-width:240px;line-height:1.4;
             opacity:0;pointer-events:none;transition:opacity 140ms ease;z-index:70}
.dica:hover::after{opacity:1}

/* Foco visível em tudo que recebe teclado: sem isto, navegar por Tab é
   avançar às cegas. */
:where(a,button,input,select,textarea,[tabindex]):focus-visible{
  outline:2px solid var(--marca-azul);outline-offset:2px;border-radius:4px}

@media (prefers-reduced-motion: reduce){
  .esq{animation:none}
  table tbody tr,.dica::after{transition:none}
}

/* Tendência ao lado do número: direção importa mais que o valor isolado */
.tendencia{font-weight:700;font-size:11px}
.tendencia.sobe{color:var(--erro)}    /* fila crescendo é problema */
.tendencia.desce{color:var(--ok)}     /* drenando é bom            */

/* Funil do percurso: origem → movimentação → destino */
.trilho-funil{display:grid;grid-template-columns:repeat(5,1fr);gap:0}
.etapa-funil{position:relative;padding:0 var(--e3)}
.etapa-funil.vazia{opacity:.45}
.marca-etapa{position:relative;height:14px;margin-bottom:var(--e2)}
.bolinha{position:absolute;left:0;top:3px;width:9px;height:9px;border-radius:50%;
         background:var(--marca-azul);z-index:2}
.bolinha.fim{background:var(--ok)}
.linha-etapa{position:absolute;left:9px;right:-12px;top:7px;height:2px;
             background:var(--linha)}
.valor-etapa{font-size:23px;font-weight:700;line-height:1;letter-spacing:-.02em}
.rotulo-etapa{font-size:11.5px;color:var(--suave);margin:3px 0 7px}
.barra-etapa{height:4px;border-radius:99px;background:var(--carta2);overflow:hidden}
.barra-etapa span{display:block;height:100%;border-radius:99px;background:var(--marca-azul)}
.etapa-funil:last-child .barra-etapa span{background:var(--ok)}

@media (max-width:900px){
  .trilho-funil{grid-template-columns:repeat(2,1fr);gap:var(--e4)}
  .linha-etapa{display:none}
}

/* Painel lateral do mapa */
.busca-painel{width:100%;padding:8px 11px;border:1px solid var(--linha);
              border-radius:var(--r-p);background:var(--carta2);font:inherit;
              font-size:13px;color:var(--texto);margin-bottom:var(--e2)}
.busca-painel::placeholder{color:var(--apagado)}

.lista-motoristas{max-height:430px;overflow-y:auto;margin:0 -6px;padding:0 6px}
.item-motorista{display:flex;gap:10px;align-items:center;padding:9px 8px;
                border-radius:var(--r-p);cursor:pointer;transition:background 140ms ease}
.item-motorista:hover{background:var(--carta2)}
.item-motorista.sem-ponto-mot{cursor:default;opacity:.6}
.item-motorista.sem-ponto-mot:hover{background:transparent}
.item-motorista.focado{background:var(--selo-a)}
.nome-mot{font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bateria-baixa{color:var(--erro);font-weight:600}

/* Veículo do motorista, no painel do mapa.
   `min-width:0` no filho de texto é o que permite as reticências: sem ele o
   modelo longo estica a linha e empurra a placa para fora do cartão. */
.veiculo-mot{display:flex;align-items:center;gap:6px;margin-top:4px;
             font-size:11.5px;color:var(--suave);min-width:0}
.veiculo-mot .modelo-mot{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Mapa: em telas estreitas o painel vai para baixo, e o mapa encolhe */
@media (max-width:1100px){
  .mapa-layout{grid-template-columns:1fr !important}
  .mapa-layout #mapa{height:60vh !important;min-height:340px !important}
  .lista-motoristas{max-height:320px}
}

/* A coluna do painel acompanha a altura do mapa e rola por dentro */
@media (min-width:1101px){
  .mapa-layout{align-items:start}
  .coluna-painel{max-height:calc(100vh - 150px);overflow-y:auto;padding-right:4px}
}

/* Ficha do motorista no mapa */
.ficha-mapa .leaflet-popup-content-wrapper{border-radius:var(--r-g);padding:4px;
     box-shadow:var(--sombra-3);background:var(--carta);color:var(--texto)}
.ficha-mapa .leaflet-popup-content{margin:11px 13px;font:inherit}
.ficha-mapa .leaflet-popup-tip{background:var(--carta)}
.topo-ficha{display:flex;align-items:center;gap:10px;padding-bottom:9px;
            margin-bottom:9px;border-bottom:1px solid var(--linha)}
.topo-ficha b{font-size:14px;line-height:1.2}
.sub-ficha{font-size:11.5px;font-weight:600;margin-top:1px}
.linha-ficha{display:flex;justify-content:space-between;gap:14px;font-size:12.5px;
             padding:3px 0}
.linha-ficha span{color:var(--suave)}
/* O valor da linha pode carregar uma miniatura; sem o flex, a imagem cai
   sobre a linha de base do texto e desalinha a placa ao lado dela. */
.linha-ficha b{display:flex;align-items:center;gap:7px;justify-content:flex-end}
.linha-ficha b span{color:inherit}
.mini-veiculo{width:34px;height:26px;object-fit:cover;border-radius:5px;
              flex:0 0 auto;border:1px solid var(--linha)}
.acoes-ficha{display:flex;gap:7px;margin-top:11px;padding-top:10px;
             border-top:1px solid var(--linha)}
.acoes-ficha .btn{flex:1;justify-content:center}

/* Trilha de passos da nova demanda */
.trilha-passos{display:flex;align-items:center;gap:var(--e2);margin-bottom:var(--e4);
               flex-wrap:wrap}
.marco{display:flex;align-items:center;gap:8px;background:transparent;border:0;
       padding:6px 4px;font:inherit;font-size:12.5px;color:var(--suave);cursor:pointer}
.marco:disabled{cursor:default}
.marco .bola{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;
             background:var(--carta2);border:1px solid var(--linha);color:var(--suave);
             font-size:11.5px;font-weight:700;transition:all 150ms ease}
.marco.ativo{color:var(--texto);font-weight:600}
.marco.ativo .bola{background:var(--marca-azul);border-color:var(--marca-azul);color:#fff}
.marco.feito .bola{background:var(--selo-c);border-color:var(--selo-c);color:var(--selo-ct)}
.marco.feito .bola::before{content:'✓';font-size:12px}
.marco.feito .bola{font-size:0}
.traco{flex:1;min-width:16px;height:1px;background:var(--linha)}

.numero-passo{display:inline-grid;place-items:center;width:22px;height:22px;
              border-radius:50%;background:var(--selo-a);color:var(--selo-at);
              font-size:11.5px;font-weight:700;margin-right:8px;vertical-align:2px}

/* Resumo lateral */
/* Abertura de serviço: formulário à esquerda, resumo à direita.
   Era estilo em linha na view, e por isso nenhuma media query conseguia
   desfazer a segunda coluna no celular — onde ela deixava 140px para os
   campos. Como classe, a largura volta a ser decisão da folha de estilo. */
.grade-nova{grid-template-columns:1fr 300px}
@media (max-width:900px){ .grade-nova{grid-template-columns:1fr} }

.resumo-demanda{position:sticky;top:16px}
.bloco-resumo{padding:9px 0;border-bottom:1px solid var(--linha)}
.bloco-resumo:last-child{border-bottom:0}
.rot-resumo{display:block;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;
            color:var(--apagado);margin-bottom:2px}
.bloco-resumo b,.ponto-rota b{font-size:13.5px;font-weight:600;display:block;line-height:1.35}
.vazio-resumo{color:var(--apagado);font-weight:400}

/* Origem → destino com sentido visual */
.rota-resumo{padding:11px 0;border-bottom:1px solid var(--linha)}
.ponto-rota{display:flex;gap:10px;align-items:flex-start}
.ponto-rota .bolinha{width:9px;height:9px;border-radius:50%;background:var(--marca-azul);
                     margin-top:14px;flex:0 0 auto}
.ponto-rota .bolinha.fim{background:var(--ok)}
.haste{width:1px;height:16px;background:var(--linha);margin:2px 0 2px 4px}

@media (max-width:1100px){
  .resumo-demanda{position:static}
}

/* `hidden` precisa vencer as regras de componente.
   Botões e cartões definem `display`, e uma regra de classe tem mais peso
   que o estilo padrão do atributo — o elemento continuava visível mesmo
   marcado como escondido. */
[hidden]{display:none !important}

/* Pilha de toasts */
.pilha-toast{position:fixed;right:var(--e5);bottom:var(--e5);z-index:950;
             display:flex;flex-direction:column;gap:var(--e2);
             max-width:min(420px, calc(100vw - 40px));pointer-events:none}
.pilha-toast .toast{pointer-events:all;margin:0;box-shadow:var(--sombra-3);
                    padding-right:38px;position:relative;
                    opacity:0;transform:translateY(10px);
                    transition:opacity 200ms ease, transform 200ms ease}
.pilha-toast .toast.visivel{opacity:1;transform:none}
.pilha-toast .toast.saindo{opacity:0;transform:translateX(14px)}
.fecha-toast{position:absolute;top:8px;right:8px;border:0;background:transparent;
             color:inherit;opacity:.5;font-size:17px;line-height:1;cursor:pointer;
             padding:2px 6px;border-radius:6px}
.fecha-toast:hover{opacity:1;background:rgba(0,0,0,.06)}

@media (max-width:600px){
  .pilha-toast{left:var(--e3);right:var(--e3);bottom:var(--e3);max-width:none}
}
@media (prefers-reduced-motion: reduce){
  .pilha-toast .toast{transition:none}
}

/* Avatares no tema escuro.
   Os tons claros do tema padrão ficam berrantes sobre superfície escura e
   puxam o olho para o avatar em vez do nome. Aqui o fundo é a superfície
   levemente tingida e a letra é que carrega a cor. */
[data-tema="escuro"] .avatar.t1{background:#12294A;color:#7FAAFF}
[data-tema="escuro"] .avatar.t2{background:#0F3222;color:#5BD98A}
[data-tema="escuro"] .avatar.t3{background:#38290F;color:#E9B75C}
[data-tema="escuro"] .avatar.t4{background:#241C3D;color:#B49CFF}
[data-tema="escuro"] .avatar.t5{background:#3A1717;color:#F08B8B}
[data-tema="escuro"] .avatar.t6{background:#0E2C30;color:#5FC6D1}

/* =====================================================================
   Responsividade
   ===================================================================== */

/* 1024–1439: as grades de cinco e três colunas ficam apertadas antes de
   quebrar sozinhas — a de indicadores é a que mais sofre. */
@media (max-width:1300px){
  .grade.g5{grid-template-columns:repeat(3,1fr)}
  .mapa-layout{grid-template-columns:1fr 320px !important}
}

@media (max-width:1080px){
  .grade.g5,.grade.g3{grid-template-columns:repeat(2,1fr)}
  .grade.g2{grid-template-columns:1fr}
  /* O mapa passa a ocupar a largura toda e o painel vai para baixo:
     lado a lado, nenhum dos dois caberia. */
  .mapa-layout{grid-template-columns:1fr !important}
}

@media (max-width:760px){
  .grade.g5,.grade.g3,.grade.g2{grid-template-columns:1fr}
  .grade-form{grid-template-columns:1fr}
  .campo.bloco.larg-2{grid-column:auto}

  /* Tabela larga rola na horizontal em vez de espremer as colunas até o
     texto quebrar letra a letra. */
  .tabela-caixa{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .tabela-caixa table{min-width:640px}

  .filtros,.filtro-contexto{flex-direction:column;align-items:stretch}
  .filtros .campo,.filtro-contexto .campo{min-width:0;width:100%}

  .trilha-passos{gap:var(--e1)}
  .trilha-passos .rot{display:none}   /* só as bolinhas numeradas */
  .traco{min-width:8px}

  .heroi-acoes{flex-direction:column-reverse}
  .heroi-acoes .btn{width:100%;justify-content:center}
}

/* A barra de navegação horizontal precisa de largura MÁXIMA para rolar.
   `overflow-x:auto` sozinho não segura nada: sem `min-width:0`, um item
   flex cresce até caber o conteúdo inteiro e empurra a página — era o menu
   lateral, virado em barra, que criava a rolagem horizontal no celular. */
@media (max-width:900px){
  .app{min-width:0;overflow-x:hidden}
  .trilha{min-width:0;max-width:100%;overflow:hidden}
  .nav{min-width:0;max-width:100%}
  main{min-width:0;overflow-x:hidden}
}

/* Corpo da torre: a coluna lateral desce quando não cabe */
@media (max-width:1150px){
  .torre-corpo{grid-template-columns:1fr !important}
}

/* Cartão de documento com validade próxima */
.doc-alerta{display:block;padding:11px 13px;border:1px solid var(--linha);
            border-radius:var(--r-p);background:var(--carta2);text-decoration:none;
            color:var(--texto);transition:border-color 150ms ease}
.doc-alerta:hover{border-color:var(--marca-azul)}
.doc-alerta.vencido{border-left:3px solid var(--erro)}
.doc-alerta b{display:block;font-size:13.5px;margin:6px 0 2px;
              overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Onde a busca não existe, o espaço dela é preservado: sem isto, o cabeçalho
   muda de layout entre telas e o olho perde a referência. */
.espaco-busca{flex:1}

/* Retorno da busca da tela */
.aviso-busca{padding:8px 12px;margin-bottom:9px;border-radius:var(--r-p);
             background:var(--carta2);border:1px solid var(--linha);
             font-size:12.5px;color:var(--suave)}

/* Ocorrência que já passou do tempo aceitável */
.linha-urgente{background:var(--selo-f)}
.linha-urgente:hover{background:var(--selo-f)}
.texto-erro{color:var(--erro)}

/* Ícone de ocorrência ao lado da demanda e do motorista */
.tem-ocorrencia{display:inline-grid;place-items:center;width:20px;height:20px;
                border-radius:5px;background:var(--selo-f);color:var(--selo-ft);
                vertical-align:middle;text-decoration:none}
.tem-ocorrencia:hover{background:var(--erro);color:#fff}


/* =====================================================================
   Padrão das telas de cadastro
   =====================================================================
   Medidas do guia visual, aplicadas de uma vez para todos os cadastros:
   a tela é gerada por um arquivo só, então o padrão nasce consistente em
   vez de depender de alguém lembrar em cada tela nova.
   ===================================================================== */

/* Campo de 48px: alvo confortável de toque, e o guia pede exatamente isso.
   Vale para input, select e o botão de ação ao lado deles. */
.grade-form input:not([type=checkbox]):not([type=radio]),
.grade-form select,
.grade-form .campo .btn{min-height:48px}

.grade-form textarea{min-height:96px;padding-top:11px}

/* 24px por dentro do card, 16px entre campos. */
.cartao.cadastro{padding:24px}
.cartao.cadastro .grade-form{gap:16px}

/* Título com ícone na cor primária. O ícone não decora: distingue as seções
   de relance quando o cadastro tem sete cards. */
.cartao.cadastro > h2{display:flex;align-items:center;gap:9px;
                      margin:0 0 4px;font-size:15.5px}
.cartao.cadastro > h2 .ico{color:var(--marca-azul);flex:0 0 auto}
.cartao.cadastro > .sub-secao{font-size:12.5px;color:var(--suave);
                              margin:0 0 15px}

/* Ações no topo, à direita, com hierarquia: neutro, perigo, primário. */
.cabecalho-cadastro{display:flex;align-items:flex-start;gap:14px;
                    flex-wrap:wrap;margin-bottom:16px}
.cabecalho-cadastro .titulo{flex:1;min-width:220px}
.cabecalho-cadastro .titulo h1{display:flex;align-items:center;gap:10px;
                               margin:0;font-size:22px}
.cabecalho-cadastro .titulo p{margin:4px 0 0;font-size:13px;color:var(--suave)}
.cabecalho-cadastro .acoes{display:flex;gap:9px;flex-wrap:wrap}

/* =====================================================================
   Cabeçalho padrão das telas
   ===================================================================== */
.cabecalho-tela{min-width:0;flex:1}

.cabecalho-tela .caminho{display:flex;align-items:center;gap:6px;
                         font-size:11.5px;color:var(--apagado);
                         margin-bottom:3px;letter-spacing:.02em}
.cabecalho-tela .caminho b{color:var(--suave);font-weight:600}

.cabecalho-tela h1{display:flex;align-items:center;gap:10px;margin:0;
                   font-size:21px;letter-spacing:-.3px}

/* Descrição: diz PARA QUE serve a tela. Uma linha, sem competir com o
   título — quem já sabe, ignora; quem chegou agora, lê. */
.descricao-tela{margin:3px 0 0;font-size:12.5px;color:var(--suave);
                max-width:70ch}

@media (max-width:720px){
  .cabecalho-tela .caminho{display:none}
  .cabecalho-tela h1{font-size:18px}
}

/* "Limpar" sempre presente na barra de filtros, apagado quando não há o que
   limpar. Some-e-aparece muda a largura da barra enquanto se digita. */
.btn.inerte{opacity:.45;pointer-events:none}

/* =====================================================================
   Central de impressão de etiquetas
   ===================================================================== */

/* Desktop: prévia à esquerda, resumo à direita. Empilha em tablet. */
.etq-colunas{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px}
@media (max-width:1024px){ .etq-colunas{grid-template-columns:1fr} }

.chips-volume{display:flex;gap:8px;flex-wrap:wrap}

.chip-vol{display:inline-flex;align-items:center;gap:7px;padding:9px 15px;
          border:1px solid var(--linha);border-radius:100px;cursor:pointer;
          font-size:13.5px;font-weight:600;background:var(--carta);
          user-select:none;transition:all 120ms ease;min-height:40px}
.chip-vol:hover{border-color:var(--marca-azul)}
.chip-vol.ligado{background:var(--selo-a);border-color:var(--selo-at);
                 color:var(--selo-at)}

/* `.tique`, não `.marca`: `.marca` JÁ EXISTE — é o bloco da logomarca no
   menu lateral, com padding de 18px. O nome repetido fazia o quadradinho
   herdar aquele padding e virar do tamanho de um botão.

   A marca é uma confirmação, não o elemento principal — o NÚMERO do volume
   é o que se lê. Sem `line-height` o quadrado herdava a altura da linha do
   chip e ficava do tamanho de um botão. */
.chip-vol .tique{width:16px;height:16px;border-radius:5px;flex:0 0 auto;
                 border:1.5px solid var(--linha);background:var(--carta);
                 display:inline-grid;place-items:center;line-height:0;
                 box-sizing:border-box}
.chip-vol.ligado .tique{background:var(--selo-at);border-color:var(--selo-at)}
.chip-vol.ligado .tique::after{content:'';width:4px;height:8px;
                 border:solid #fff;border-width:0 2px 2px 0;
                 transform:rotate(45deg);margin-top:-2px}

/* Palco da prévia: fundo levemente cinza para a etiqueta branca se destacar,
   e rolagem horizontal quando a tela é menor que a etiqueta — reduzir a
   etiqueta a ponto de não se ler não serve para conferir nada. */
.previa-palco{background:var(--carta2);border:1px solid var(--linha);
              border-radius:var(--r-p);padding:16px;overflow:auto;
              display:flex;justify-content:center}

.navega-previa{display:flex;align-items:center;gap:9px}

.resumo-impressao{display:grid;grid-template-columns:auto 1fr;
                  gap:9px 12px;margin:0;font-size:13px}
.resumo-impressao dt{display:flex;align-items:center;gap:7px;
                     color:var(--suave);white-space:nowrap}
.resumo-impressao dt .ico{color:var(--apagado)}
.resumo-impressao dd{margin:0;text-align:right;font-weight:600}

/* Só no papel: a prévia mostra uma etiqueta, a impressão sai com todas. */
.somente-impressao{display:none}
@media print{
  .somente-impressao{display:block}
  .trilha,.topo-sessao,.faixa-grupos,.nao-imprime,.etq-colunas{display:none!important}
  body{background:#fff}
  .conteudo{margin:0;padding:0}
}

/* Ícone colado no texto do título quando o h2 não é flex — acontece nos
   cards desta tela que usam `.entre` para alinhar o contador à direita. */
.cartao.cadastro > .entre > h2{display:flex;align-items:center;gap:9px}
.resumo-impressao dt .ico{flex:0 0 auto}

/* =====================================================================
   Ação dentro do campo (consulta de CEP)
   =====================================================================
   Um botão ao lado dizia "Buscar" sem dizer o quê e ocupava a largura de
   um campo inteiro para uma ação auxiliar. Dentro do input, a relação
   entre a ação e o dado fica evidente sem texto nenhum. */
.campo-acao-interna{position:relative}
.campo-acao-interna input{padding-right:42px;width:100%}

.campo-acao-interna button{position:absolute;right:5px;top:50%;
  transform:translateY(-50%);width:34px;height:34px;border:0;
  background:transparent;border-radius:var(--r-p);cursor:pointer;
  display:grid;place-items:center;color:var(--apagado);
  transition:background 120ms ease,color 120ms ease}
.campo-acao-interna button:hover{background:var(--carta2);color:var(--marca-azul)}
.campo-acao-interna button:focus-visible{outline:2px solid var(--marca-azul);
  outline-offset:1px}
.campo-acao-interna button:disabled{cursor:default;opacity:.5}

/* Estado de consulta: o ícone gira em vez de trocar por um spinner, para o
   botão não mudar de tamanho no meio do clique. */
.campo-acao-interna button.carregando .ico{animation:girando 700ms linear infinite}
@keyframes girando{to{transform:rotate(360deg)}}

/* =====================================================================
   Localização geográfica — subseção do card Endereço
   ===================================================================== */
.sub-secao-geo{grid-column:1/-1;border-top:1px solid var(--linha);
               margin-top:6px;padding-top:16px}

.sub-secao-geo > .titulo{margin-bottom:12px}
.sub-secao-geo > .titulo b{display:block;font-size:12px;letter-spacing:.04em;
                           text-transform:uppercase;color:var(--suave)}
.sub-secao-geo > .titulo span{font-size:12.5px;color:var(--apagado)}

/* `minmax(0,1fr)` porque numa grade a coluna não encolhe abaixo do conteúdo
   e o par ficava com 174px por campo — estreito demais para uma coordenada
   de sete casas decimais. */
.par-coordenada{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
                gap:16px;max-width:640px}

/* Ferramentas auxiliares: linha de baixo, compactas, secundárias. */
.acoes-geo{display:flex;gap:9px;flex-wrap:wrap;margin-top:12px}

/* A regra de 48px dos cadastros vale para CAMPO, não para ferramenta
   auxiliar — daí `!important`: a outra é `.grade-form .campo .btn`, mais
   específica, e vencia mesmo declarada antes. */
.acoes-geo .btn{min-height:34px!important;height:34px;padding:0 13px;
                font-size:12.5px}

.sub-secao-geo .dica-campo{display:block;margin-top:9px}

@media (max-width:720px){
  .par-coordenada{grid-template-columns:1fr}
  .acoes-geo .btn{flex:1 1 100%;justify-content:center}
}


/* Campo de busca acima de um select longo. */


/* =====================================================================
   Select editável (combobox)
   =====================================================================
   Fechado precisa parecer um select — mesma altura, mesma borda, mesmo raio
   dos demais campos. Um controle que se anuncia diferente faz o operador
   parar para entender o que é. */
.combo{position:relative}

.combo-campo{width:100%; padding-right:64px!important}
.combo-oculto{display:none}

.combo .combo-lupa{position:absolute; right:12px; top:50%;
  transform:translateY(-50%); color:var(--apagado); pointer-events:none}
.combo.escolhido .combo-lupa{color:var(--marca-azul)}

.combo-limpa{position:absolute; right:36px; top:50%; transform:translateY(-50%);
  width:26px; height:26px; border:0; background:transparent; cursor:pointer;
  border-radius:6px; color:var(--apagado); display:grid; place-items:center}
.combo-limpa:hover{background:var(--carta2); color:var(--erro)}

.combo-lista{position:absolute; z-index:40; left:0; right:0; top:calc(100% + 4px);
  margin:0; padding:5px; list-style:none; max-height:264px; overflow:auto;
  background:var(--carta); border:1px solid var(--linha);
  border-radius:var(--r-p); box-shadow:0 8px 24px rgba(11,27,43,.12)}

.combo-item{padding:9px 11px; border-radius:6px; font-size:13.5px;
  cursor:pointer; line-height:1.35}
.combo-item:hover,.combo-item.marcado{background:var(--selo-a);
  color:var(--selo-at)}

.combo-vazio{padding:11px; font-size:12.5px; color:var(--suave);
  text-align:center}

/* Item em dois níveis: nome e documento. O documento fica menor e apagado —
   serve para desempatar homônimos, não para ser lido primeiro. */
.combo-item b{display:block; font-weight:600}
.combo-item span{display:block; font-size:11.5px; color:var(--suave);
  margin-top:1px}
.combo-item:hover span,.combo-item.marcado span{color:var(--selo-at)}

/* =====================================================================
   PAINEL — gráficos SVG, trilhos de consumo e insights.

   As cores dos gráficos são variáveis de tema usadas direto no atributo
   `fill` do SVG. É o que faz o gráfico trocar de cor junto com o portal
   sem uma linha de JavaScript — um canvas pintado em JS não faria.
   ===================================================================== */
html[data-tema="claro"]{--grade:#E7EBEA}
html[data-tema="escuro"]{--grade:#222D36}

.sub-painel{color:var(--suave);font-size:13px}

.g-topo{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:12px}
.g-topo .titulo{font-family:"Barlow Condensed",sans-serif;font-size:14px;font-weight:600;
                text-transform:uppercase;letter-spacing:.03em}
.g-topo .dica{font-size:11.5px;color:var(--suave)}

/* `overflow:visible` porque o rótulo do eixo e a etiqueta de meta ficam
   fora do viewBox de propósito — sem ele, os dois são cortados. */
svg.grafico{width:100%;height:auto;display:block;overflow:visible}
.grafico-vazio{color:var(--suave);font-size:12.5px;text-align:center;margin:26px 0;font-style:italic}

.legenda{display:flex;gap:14px;flex-wrap:wrap;margin-top:10px;font-size:11.5px;color:var(--suave)}
.legenda i{width:9px;height:9px;border-radius:2px;display:inline-block;margin-right:5px}

.trilho{margin-bottom:12px}
.trilho:last-child{margin-bottom:0}
.trilho .cima{display:flex;justify-content:space-between;gap:10px;font-size:12.5px;margin-bottom:4px}
.trilho .barra-t{height:7px;border-radius:99px;background:var(--trilho-vazio);overflow:hidden}
.trilho .barra-t span{display:block;height:100%;border-radius:99px}

.cartao.plano{box-shadow:none}
.insight{display:flex;gap:11px;padding:11px 12px;border:1px solid var(--linha);
         border-radius:var(--r);background:var(--carta2);margin-bottom:9px;align-items:flex-start}
.insight:last-child{margin-bottom:0}
.insight .bolha{width:7px;height:7px;border-radius:99px;flex:0 0 auto;margin-top:6px}
.insight .txt{font-size:12.8px;line-height:1.5}
.insight .acao{font-size:11.5px;color:var(--hi);text-decoration:none;white-space:nowrap;
               margin-left:auto;align-self:center;font-weight:600}
.insight.risco{border-color:#E9BFBB} .insight.risco .bolha{background:var(--erro)}
.insight.atencao{border-color:#EBD9A8} .insight.atencao .bolha{background:var(--alerta)}
.insight.bom .bolha{background:var(--ok)}
.insight.info .bolha{background:var(--suave)}

.delta{font-size:11.5px;font-weight:600;font-family:"IBM Plex Mono",monospace}
.delta.sobe{color:var(--ok)} .delta.desce{color:var(--erro)}

.grade.g23{grid-template-columns:2fr 1fr}
.grade.g32{grid-template-columns:1fr 2fr}
@media(max-width:1000px){.grade.g23,.grade.g32{grid-template-columns:1fr}}


/* =====================================================================
   PAINEL DE CONTROLE — faixa de indicadores, ranking, alertas, atalhos.
   ===================================================================== */

.topo-painel{align-items:flex-end;margin-bottom:16px}

/* A faixa quebra para 3 e 2 colunas antes de virar uma pilha: cinco
   cartões espremidos num notebook cortam o valor no meio. */
.grade.painel-kpis{grid-template-columns:repeat(5,1fr)}
@media(max-width:1400px){.grade.painel-kpis{grid-template-columns:repeat(3,1fr)}}
@media(max-width:820px){.grade.painel-kpis{grid-template-columns:repeat(2,1fr)}}

.cartao.kpi{position:relative;overflow:hidden;padding:14px 16px 15px}
.kpi-topo{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:9px}
.kpi-ico{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;
         justify-content:center;background:var(--selo-d);color:var(--selo-dt);flex:0 0 auto}
.kpi-ico .ico{width:17px;height:17px}
.cartao.kpi.ok .kpi-ico{background:var(--selo-c);color:var(--selo-ct)}
.cartao.kpi.info .kpi-ico{background:var(--selo-b);color:var(--selo-bt)}
.cartao.kpi.alerta .kpi-ico{background:var(--selo-e);color:var(--selo-et)}
.cartao.kpi.erro .kpi-ico{background:var(--selo-f);color:var(--selo-ft)}

.kpi-num{font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;
         font-size:27px;font-weight:600;line-height:1.05;letter-spacing:-.02em}
.kpi-rot{font-family:"Barlow Condensed",sans-serif;font-size:13px;font-weight:600;
         text-transform:uppercase;letter-spacing:.04em;color:var(--suave);margin-top:3px}
.kpi-nota{font-size:11.5px;color:var(--suave);margin-top:2px}
.delta em{font-style:normal;color:var(--suave);font-weight:400;margin-left:3px;font-size:10.5px}

/* O minigráfico encosta no rodapé do cartão e sangra pelas laterais: é
   textura de fundo, não um gráfico para medir. */
.kpi-spark{position:absolute;left:0;right:0;bottom:0;opacity:.5;pointer-events:none}
.kpi-spark svg{width:100%;height:30px;display:block}

/* ---- ranking ---- */
ol.ranking{list-style:none;margin:0;padding:0}
ol.ranking li{display:flex;align-items:center;gap:10px;padding:8px 0;
              border-bottom:1px solid var(--linha)}
ol.ranking li:last-child{border-bottom:0;padding-bottom:0}
ol.ranking .pos{width:20px;height:20px;border-radius:99px;background:var(--carta2);
                color:var(--suave);font-size:11px;font-weight:600;flex:0 0 auto;
                display:flex;align-items:center;justify-content:center;
                font-family:"IBM Plex Mono",monospace}
ol.ranking li:first-child .pos{background:var(--selo-a);color:var(--selo-at)}
ol.ranking .quem{flex:1;min-width:0;font-size:13px;overflow:hidden;
                 text-overflow:ellipsis;white-space:nowrap}
ol.ranking .quem em{display:block;font-style:normal;font-size:11px;color:var(--suave)}
ol.ranking .valor{font-weight:600;font-size:14px}

/* ---- alertas ---- */
a.alerta{display:flex;gap:10px;align-items:center;padding:9px 10px;margin-bottom:7px;
         border:1px solid var(--linha);border-radius:var(--r);background:var(--carta2);
         text-decoration:none;color:inherit}
a.alerta:last-child{margin-bottom:0}
a.alerta:hover{border-color:var(--hi)}
.alerta-ico{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;
            justify-content:center;flex:0 0 auto}
.alerta-ico .ico{width:15px;height:15px}
a.alerta.risco .alerta-ico{background:var(--selo-f);color:var(--selo-ft)}
a.alerta.atencao .alerta-ico{background:var(--selo-e);color:var(--selo-et)}
.alerta-txt{min-width:0}
.alerta-txt b{display:block;font-size:12.8px;font-weight:600}
.alerta-txt em{font-style:normal;font-size:11.5px;color:var(--suave)}

/* ---- progresso com meta ---- */
.progresso{margin-bottom:15px}
.progresso:last-child{margin-bottom:0}
.progresso .cima{display:flex;justify-content:space-between;align-items:baseline;
                 gap:10px;font-size:12.5px;margin-bottom:5px}
.progresso .cima b{font-size:16px;font-weight:600}
.trilho-p{position:relative;height:8px;border-radius:99px;background:var(--trilho-vazio)}
.trilho-p span{display:block;height:100%;border-radius:99px}
/* A meta é um risco SOBRE a barra, não um segundo trilho: o que interessa
   é a distância entre onde se está e onde se quer chegar. */
.trilho-p .marca-meta{position:absolute;top:-3px;width:2px;height:14px;
                      background:var(--texto);opacity:.55;border-radius:2px}
.meta-p{font-size:11px;color:var(--suave);margin-top:4px}

/* ---- resumo financeiro ---- */
table.resumo-fin{width:100%;border-collapse:collapse;font-size:13px}
table.resumo-fin td{padding:9px 0;border-bottom:1px solid var(--linha)}
table.resumo-fin tr:last-child td{border-bottom:0}
table.resumo-fin td:last-child{text-align:right;font-weight:600}
table.resumo-fin td.ok{color:var(--ok)}
table.resumo-fin td.alerta{color:var(--alerta)}
table.resumo-fin td.erro{color:var(--erro)}

/* ---- ações rápidas ---- */
.acoes-rapidas h3{margin-bottom:11px}
.acoes-rapidas .tiras{display:grid;grid-template-columns:repeat(6,1fr);gap:9px}
@media(max-width:1100px){.acoes-rapidas .tiras{grid-template-columns:repeat(3,1fr)}}
@media(max-width:620px){.acoes-rapidas .tiras{grid-template-columns:repeat(2,1fr)}}
.acoes-rapidas .tira{display:flex;align-items:center;gap:8px;padding:11px 12px;
                     border:1px solid var(--linha);border-radius:var(--r);
                     background:var(--carta);text-decoration:none;color:inherit;
                     font-size:12.8px;font-weight:500}
.acoes-rapidas .tira:hover{border-color:var(--hi);color:var(--hi)}
.acoes-rapidas .tira .ico{color:var(--hi);flex:0 0 auto}

.grade.g3{grid-template-columns:repeat(3,1fr)}
@media(max-width:1100px){.grade.g3{grid-template-columns:1fr}}

/* =====================================================================
   Opção com descrição (credenciais da API)
   =====================================================================
   `.caixa-opcao` nasceu para rótulo de uma linha e centraliza o conteúdo.
   Quando a opção carrega uma explicação embaixo, centralizar desalinha o
   controle em relação ao título; `flex-start` prende o rádio na primeira
   linha do texto, que é onde o olho procura por ele.

   O `width:auto` do controle vem de `.caixa-opcao input` e é o que impede
   a regra global `input{width:100%}` de esticar o rádio pela linha inteira. */
/* A BRIGA DE ESPECIFICIDADE QUE QUEBRA RÁDIO DENTRO DE FORMULÁRIO.
   `.caixa-opcao input{width:auto}` (0,1,1) perde para
   `.campo.bloco input{width:100%}` (0,2,1) — e perde EM SILÊNCIO: o rádio
   estica pela linha inteira, centraliza o próprio ponto e empurra o texto
   para a borda direita. Foi o que desalinhou a tela de credenciais, e vale
   para qualquer `.caixa-opcao` colocada dentro de um `.campo.bloco`
   (a de marcações de volume, em Nova demanda, é outra). Daí a regra abaixo
   ter as duas classes: ela precisa ganhar da que tem duas. */
.campo.bloco .caixa-opcao input,
.campo.bloco .caixa-opcao select{width:auto}

.opcao-alta{align-items:flex-start;padding:12px 14px}
.opcao-alta input{margin-top:3px;flex:0 0 auto;width:auto}
.opcao-alta > span{display:flex;flex-direction:column;gap:3px;min-width:0}
.opcao-alta b{font-weight:600;line-height:1.3}
.opcao-alta em{font-style:normal;font-size:12px;color:var(--suave);line-height:1.45}
/* Marcada, a opção precisa se distinguir sem depender só do controle: numa
   grade de quatro escopos o ponto do rádio é pequeno demais para varrer. */
.opcao-alta:has(input:checked){border-color:var(--marca-azul);background:var(--selo-a)}
.opcao-alta:focus-within{box-shadow:0 0 0 3px rgba(19,102,255,.16)}

/* Parágrafo explicativo dentro de cartão — o mesmo tom em toda a tela, em
   vez de repetir `style="font-size:13px;color:var(--suave)"` em cada um. */
.texto-apoio{font-size:13px;color:var(--suave);line-height:1.55;margin:6px 0 0}

/* Aviso de segredo irrecuperável: vermelho porque a informação é que
   recarregar a página perde o valor para sempre. */
.aviso-segredo{font-size:13px;color:var(--erro);font-weight:600;margin:6px 0 14px;line-height:1.5}

/* =====================================================================
   Detalhe do serviço
   =====================================================================
   ERA `style="grid-template-columns:1fr 330px"` DIRETO NA VIEW, E ISSO
   QUEBRAVA DE DOIS JEITOS.

   Primeiro: faixa de grade tem `min-width:auto`, então o conteúdo que não
   sabe encolher — a `.ficha`, com `dt` em `nowrap` — empurrava o cartão para
   fora da tela. Abaixo de ~1280px o corredor da direita saía pela borda e o
   operador tinha de rolar na horizontal para ler o resumo. `minmax(0,1fr)`
   e `min-width:0` são o que dizem à grade que pode encolher.

   Segundo: não havia media query nenhuma. Em tela estreita continuavam duas
   colunas, uma delas fixa em 330px.

   O corredor tem largura MÍNIMA além da máxima: abaixo de ~300px os pares
   rótulo/valor da `.ficha` quebram em duas linhas cada e o cartão vira uma
   escada. */
.grade-detalhe{display:grid;gap:13px;
               grid-template-columns:minmax(0,1fr) minmax(300px,340px)}
.grade-detalhe > *{min-width:0}

@media(max-width:1180px){
  .grade-detalhe{grid-template-columns:1fr}
}

/* A ficha do resumo, quando NÃO está no corredor estreito.
   Doze pares empilhados viravam uma coluna de 12 linhas ao lado de um vazio
   de 900px; espalhados, cabem em três linhas e sobra espaço para o resto. */
.ficha-larga{gap:9px 22px}
@media(min-width:900px){  .ficha-larga{grid-template-columns:repeat(2,auto minmax(0,1fr))} }
@media(min-width:1280px){ .ficha-larga{grid-template-columns:repeat(3,auto minmax(0,1fr))} }
@media(min-width:1650px){ .ficha-larga{grid-template-columns:repeat(4,auto minmax(0,1fr))} }

/* VALOR COLADO NO RÓTULO, NÃO NA BORDA DA CÉLULA.
   `.ficha dd` alinha à direita, e num cartão estreito isso é o desenho
   clássico de lista de definição: rótulo à esquerda, valor à direita, os dois
   a poucos centímetros. Espalhado em quatro pares por linha, a mesma regra
   abre um vão de mais de cem pixels entre "Cliente" e o nome do cliente, e o
   olho passa a ter de emparelhar os dois. */
.ficha-larga dd{text-align:left}

.faixa-resumo{margin-bottom:13px}

/* O `dd` também precisa poder encolher — é ele que segura nome de cliente
   e de motorista, que são justamente os textos longos. */
.ficha dd{min-width:0}

/* =====================================================================
   Itens do checklist na abertura do serviço
   =====================================================================
   O bloco nasce vazio e é preenchido pelo navegador quando o modelo é
   escolhido. A borda à esquerda existe para separar visualmente o que é
   instrução ao motorista do resto do formulário do serviço — sem isso,
   "Parcelas" parece mais um campo do frete. */
.campos-checklist{
  max-width:520px;
  margin:14px 0 4px;
  padding:14px 0 4px 14px;
  border-left:3px solid var(--borda, #d8dce4);
}
.campos-checklist .titulo-checklist{
  margin:0 0 4px;
  font-size:15px;
  font-weight:600;
}
.campos-checklist > .dica-campo{display:block;margin-bottom:10px}
.campos-checklist .item-checklist{margin-bottom:12px}
.campos-checklist .item-checklist:last-child{margin-bottom:0}
.campos-checklist .item-checklist[hidden]{display:none}

/* Item de foto não tem controle: é recado, e recado com cara de campo
   vazio faz o operador procurar o que preencher. */
.campos-checklist .item-checklist-aviso label{opacity:.75}

/* =====================================================================
   Tabela de pacotes (preço da plataforma)
   =====================================================================
   A tela existe para ajustar preço, e quase toda visita a ela é uma
   edição — por isso a linha é editável no lugar, e não um atalho para
   outro formulário. O campo dentro da célula precisa parecer campo sem
   virar uma grade de caixas: borda só ao passar o mouse e ao focar. */
.tabela-planos input{
  width:100%;
  border:1px solid transparent;
  background:transparent;
  border-radius:var(--r-p);
  padding:6px 8px;
  font:inherit;
  color:var(--texto);
}
.tabela-planos input:hover{border-color:var(--linha);background:var(--carta2)}
.tabela-planos input:focus{
  border-color:var(--hi);
  background:var(--carta);
  outline:none;
}
.tabela-planos .campo-num{
  text-align:right;
  font-variant-numeric:tabular-nums;
  max-width:140px;
  margin-left:auto;
}
.tabela-planos .campo-sub{
  font-size:12px;
  color:var(--suave);
  margin-top:2px;
}
.tabela-planos td{vertical-align:middle}

/* Faixa inativa continua legível — ela conta história de contrato antigo —
   mas não disputa atenção com a escada em vigor. */
.tabela-planos .linha-off{opacity:.55}

/* A linha de criar não é uma faixa: o traço a separa do que já existe. */
.tabela-planos .linha-nova td{border-top:2px dashed var(--linha)}
.tabela-planos .linha-nova input::placeholder{color:var(--suave)}

/* Aviso que pede ação sem ser erro: empresa operando sem pacote. */
.cartao.aviso-atencao{border-left:3px solid var(--alerta)}

/* =====================================================================
   Montagem de roteiro
   =====================================================================
   A coluna dos candidatos é uma lista longa de leitura rápida — o gestor
   varre procurando o que combina. A do roteiro é curta e fixa. Por isso a
   grade é assimétrica e a lista rola sozinha, em vez de empurrar o resumo
   e os botões para fora da tela. */
.grade-roteiro{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(300px,360px);
  gap:14px;
  align-items:start;
}
.grade-roteiro > *{min-width:0}
@media(max-width:1100px){.grade-roteiro{grid-template-columns:1fr}}

.lista-candidatos{max-height:520px;overflow-y:auto;margin:0 -4px;padding:0 4px}

.candidato{
  display:flex;
  gap:10px;
  align-items:flex-start;
  padding:9px 10px;
  border:1px solid var(--linha);
  border-radius:var(--r-p);
  margin-bottom:7px;
  cursor:pointer;
  font-weight:400;
  text-transform:none;
  letter-spacing:0;
  color:var(--texto);
}
.candidato:hover{background:var(--carta2)}
/* Escolhido fica marcado pela borda, não pelo fundo: numa lista de trinta,
   trinta fundos coloridos não destacam nada. */
.candidato.marcado{border-color:var(--hi);box-shadow:inset 3px 0 0 var(--hi)}
.candidato input[type="checkbox"]{width:auto;margin-top:3px;flex:none}
.candidato-corpo{display:block;min-width:0;flex:1}
.candidato-topo{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.candidato-rota{display:block;font-size:13px;margin:2px 0 1px}
.candidato-rota .seta{color:var(--suave);margin:0 3px}

.selo.mini{font-size:10.5px;padding:1px 6px}

.resumo-roteiro{
  display:flex;gap:14px;flex-wrap:wrap;
  margin-top:12px;padding-top:11px;
  border-top:1px solid var(--linha);
  font-size:13px;color:var(--suave);
}
.resumo-roteiro b{color:var(--texto);font-size:15px}

/* --- a sequência --- */
.paradas{list-style:none;margin:0;padding:0;counter-reset:parada}
.parada{
  border:1px solid var(--linha);
  border-radius:var(--r-p);
  padding:10px 12px;
  margin-bottom:9px;
}
.parada-cabeca{display:flex;align-items:flex-start;gap:10px}
.parada-numero{
  flex:none;width:26px;height:26px;border-radius:50%;
  background:var(--hi);color:#fff;
  display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:700;
}
.parada-mover{display:flex;gap:4px;flex:none}
.parada-mover .btn[disabled]{opacity:.35}

.operacoes{list-style:none;margin:9px 0 0;padding:0 0 0 36px}
.operacao{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:5px 0;font-size:13px;
}
.operacao + .operacao{border-top:1px dashed var(--linha)}
/* Coletar e entregar se distinguem pela cor da etiqueta: numa parada que
   faz as duas, ler a palavra em cada linha é o que demora. */
.op-tipo{
  flex:none;font-size:11px;font-weight:700;letter-spacing:.3px;
  text-transform:uppercase;padding:2px 7px;border-radius:99px;
}
.op-coleta  .op-tipo{background:var(--selo-a);color:var(--selo-at)}
.op-entrega .op-tipo{background:var(--selo-c);color:var(--selo-ct)}


/* Lista de pontos sem coordenada, dentro do aviso do mapa ao vivo.
   Tabela pequena e sem moldura: ela mora DENTRO de uma faixa de alerta, e
   repetir a borda ali dá a impressão de duas caixas empilhadas. */
.pendencia-coord{margin-top:10px;font-size:12px;background:var(--carta);
  border-radius:var(--r);overflow:hidden}
.pendencia-coord th{font-size:10.5px;text-transform:uppercase;letter-spacing:.03em}
.pendencia-coord td, .pendencia-coord th{padding:5px 9px}
.pendencia-coord td.suave{color:var(--suave)}

/* Cabeçalho da landing no telefone.
   Os três links de âncora mais o botão Entrar não cabem em 380px e empurravam
   a página inteira para o lado — rolagem horizontal na primeira tela que um
   visitante vê. Os links somem e o botão fica: numa tela dessa altura a
   pessoa rola até a seção, mas entrar ela precisa poder. */
@media(max-width:560px){
  .fora-topo{padding:12px 16px;gap:10px}
  .fora-nav{gap:10px}
  .fora-nav a:not(.btn){display:none}
}

/* =====================================================================
   Acompanhamento público (/r/{token})
   =====================================================================
   Página de uma coluna, lida quase sempre no celular, por quem está
   esperando uma caixa. A previsão é o maior número da tela porque é a
   única pergunta que essa pessoa tem. */
.rastreio{max-width:840px;margin:0 auto;display:flex;flex-direction:column;gap:14px}

.rastreio-estado{display:flex;align-items:center;justify-content:space-between;gap:16px}
.rastreio-estado h1{font-size:20px;margin:8px 0 0;letter-spacing:-.01em}

.rastreio-eta{text-align:right;white-space:nowrap}
.rastreio-eta strong{font-size:40px;font-weight:600;letter-spacing:-.03em;line-height:1}
.rastreio-eta span{font-size:14px;color:var(--suave);margin-left:3px}
.rastreio-eta small{display:block;font-size:12px;color:var(--suave);margin-top:2px}

.rastreio-mapa{height:320px;width:100%;background:var(--carta2)}
.rastreio-rodape-mapa{margin:0;padding:8px 14px;font-size:12px;border-top:1px solid var(--linha)}

.rastreio-grade{grid-template-columns:1fr 1fr;gap:14px;align-items:start}

/* Linha do tempo. O passo cumprido ganha a cor e o peso; o que falta fica
   apagado — sem inventar um "previsto para" que ninguém prometeu. */
.rastreio-linha{list-style:none;margin:10px 0 0;padding:0;position:relative}
.rastreio-linha li{display:flex;justify-content:space-between;gap:10px;
  padding:7px 0 7px 22px;position:relative;color:var(--suave);font-size:13.5px}
.rastreio-linha li::before{content:'';position:absolute;left:3px;top:13px;
  width:9px;height:9px;border-radius:50%;background:var(--linha);
  border:2px solid var(--carta);box-shadow:0 0 0 1px var(--linha)}
.rastreio-linha li::after{content:'';position:absolute;left:7px;top:22px;
  width:1px;height:100%;background:var(--linha)}
.rastreio-linha li:last-child::after{display:none}
.rastreio-linha li.feito{color:var(--texto);font-weight:500}
.rastreio-linha li.feito::before{background:#0F9D58;box-shadow:0 0 0 1px #0F9D58}
.rastreio-linha .quando{font-size:12px;color:var(--suave);font-weight:400}

.rastreio-ficha{margin:10px 0 0;display:grid;grid-template-columns:86px 1fr;
  gap:8px 12px;font-size:13.5px}
.rastreio-ficha dt{color:var(--suave);font-size:12px;padding-top:2px}
.rastreio-ficha dd{margin:0}

.rastreio-nota{font-size:12px;text-align:center;margin:2px 0 24px}

@media(max-width:720px){
  .rastreio-grade{grid-template-columns:1fr}
  .rastreio-estado{flex-direction:column;align-items:flex-start;gap:8px}
  .rastreio-eta{text-align:left}
  .rastreio-mapa{height:260px}
}

/* ---------------------------------------------------------------------
   A avaliação, no fim da página pública
   ---------------------------------------------------------------------
   Respondida com o polegar, numa mão, em pé na porta de casa. Daí as três
   decisões desta folha: a estrela tem 40px de alvo (o mínimo que se acerta
   sem mirar), o rádio de verdade continua no DOM e só sai de vista (leitor
   de tela e teclado seguem funcionando), e nada aqui depende de JavaScript
   para ficar utilizável. */
.avaliacao .av-forma{display:flex;flex-direction:column;gap:14px;margin-top:12px}

.av-estrelas{display:flex;gap:2px;margin:2px 0 0}
.av-estrela{position:relative;cursor:pointer;line-height:1;
  width:40px;height:40px;display:grid;place-items:center}
/* O rádio sai de vista sem sair do documento: `display:none` o tiraria da
   navegação por teclado e do leitor de tela, e a nota é o conteúdo. */
.av-estrela input,.av-zero input{position:absolute;opacity:0;width:1px;height:1px}
.av-estrela span{font-size:32px;color:var(--linha);transition:color .08s}
.av-estrela em{position:absolute;opacity:0;font-size:1px}
/* Pintura acumulada: três estrelas significa as três primeiras cheias, não a
   terceira sozinha.

   DUAS CAMADAS, DE PROPÓSITO, e a segunda é que faz a fileira responder ao
   clique. Este bloco desenha a partir de `data-nota`, que o servidor manda
   pronto — a nota inicial aparece certa antes de qualquer script rodar. Mas
   `data-nota` só muda se o JavaScript mudar, e um `rastreio.js` velho em
   cache (ou bloqueado) deixava a estrela clicada sem pintar: o rádio marcava,
   a nota era enviada certa, e a tela não dizia nada. Por isso o bloco
   `:has(:checked)` logo abaixo, que não depende de script nenhum. */
.av-estrelas[data-nota="1"] .av-estrela:nth-of-type(-n+1) span,
.av-estrelas[data-nota="2"] .av-estrela:nth-of-type(-n+2) span,
.av-estrelas[data-nota="3"] .av-estrela:nth-of-type(-n+3) span,
.av-estrelas[data-nota="4"] .av-estrela:nth-of-type(-n+4) span,
.av-estrelas[data-nota="5"] .av-estrela:nth-of-type(-n+5) span{color:#E8A81C}
/* Nota baixa muda a COR, não só a quantidade: a fileira amarela pela metade
   lê como "quase cheia" de relance, e não é isso que a pessoa disse. */
.av-estrelas[data-nota="1"] .av-estrela span,
.av-estrelas[data-nota="2"] .av-estrela span,
.av-estrelas[data-nota="3"] .av-estrela span{color:var(--linha)}
.av-estrelas[data-nota="1"] .av-estrela:nth-of-type(-n+1) span,
.av-estrelas[data-nota="2"] .av-estrela:nth-of-type(-n+2) span,
.av-estrelas[data-nota="3"] .av-estrela:nth-of-type(-n+3) span{color:var(--alerta)}

/* A MESMA PINTURA, SEM SCRIPT NENHUM.
   Vem DEPOIS e com especificidade maior para vencer o `data-nota` quando os
   dois discordam — que é exatamente o caso em que o script não rodou e o
   atributo ficou parado no valor inicial. Navegador sem `:has()` ignora o
   bloco inteiro e continua com o comportamento de cima. */
.av-estrelas:has(input[value="4"]:checked) .av-estrela:nth-of-type(-n+4) span,
.av-estrelas:has(input[value="5"]:checked) .av-estrela:nth-of-type(-n+5) span{color:#E8A81C}
.av-estrelas:has(input[value="0"]:checked) .av-estrela span,
.av-estrelas:has(input[value="1"]:checked) .av-estrela span,
.av-estrelas:has(input[value="2"]:checked) .av-estrela span,
.av-estrelas:has(input[value="3"]:checked) .av-estrela span{color:var(--linha)}
.av-estrelas:has(input[value="1"]:checked) .av-estrela:nth-of-type(-n+1) span,
.av-estrelas:has(input[value="2"]:checked) .av-estrela:nth-of-type(-n+2) span,
.av-estrelas:has(input[value="3"]:checked) .av-estrela:nth-of-type(-n+3) span{color:var(--alerta)}
/* "Nenhuma estrela" está fora da fileira, então o rádio dela mora no
   formulário — o seletor sobe até ele para apagar as cinco. */
.av-forma:has(.av-zero input:checked) .av-estrela span{color:var(--linha)}

/* Foco visível porque o rádio está escondido: sem isto, quem navega por
   teclado não tem como saber onde está. */
.av-estrela input:focus-visible+span{outline:2px solid var(--hi);
  outline-offset:3px;border-radius:4px}

.av-zero{display:inline-flex;align-items:center;gap:6px;font-size:12px;
  color:var(--suave);cursor:pointer;position:relative;padding:4px 0}
.av-zero::before{content:'○';font-size:14px}
.av-zero:has(input:checked){color:var(--erro);font-weight:600}
.av-zero:has(input:checked)::before{content:'●'}

.av-motivos{border:1px solid var(--linha);border-radius:var(--r-p);
  padding:10px 12px 12px;margin:0;display:flex;flex-wrap:wrap;gap:8px 16px}
/* Os motivos só existem com nota baixa, e quem decide isso é o CSS — não o
   script. Nota alta é o caso comum, então "o que deu errado?" aberto por
   padrão diante de cinco estrelas é uma pergunta que contradiz a resposta.
   Navegador sem `:has()` mostra sempre, o que é feio e continua correto. */
.av-forma:has(input[name="nota"][value="4"]:checked) .av-motivos,
.av-forma:has(input[name="nota"][value="5"]:checked) .av-motivos{display:none}
.av-motivos legend{font-size:12px;color:var(--suave);padding:0 5px}
.av-motivos label{display:flex;align-items:center;gap:7px;font-size:13.5px;
  cursor:pointer}
.av-motivos input{width:18px;height:18px;margin:0;accent-color:var(--hi)}

.av-campo{display:flex;flex-direction:column;gap:5px;font-size:13px}
.av-campo span{color:var(--suave)}
.av-campo em{font-style:normal;color:var(--apagado)}
/* 16px no campo de texto: abaixo disso o Safari do iPhone dá zoom sozinho ao
   focar, e a página salta na cara de quem ia escrever. */
.av-campo textarea{font:inherit;font-size:16px;padding:9px 11px;
  border:1px solid var(--linha);border-radius:var(--r-p);
  background:var(--carta);color:var(--texto);resize:vertical}

.avaliacao .btn{align-self:flex-start}
.av-lida{font-size:16px;color:#E8A81C;letter-spacing:2px}

/* Média e distribuição — tela de avaliações, painel e ficha do motorista. */
.av-media{display:flex;align-items:baseline;gap:8px}
.av-media strong{font-size:34px;font-weight:600;letter-spacing:-.02em;line-height:1}
.av-media span{font-size:13px;color:var(--suave)}
.av-barras{display:grid;gap:5px;margin-top:10px}
.av-barra{display:grid;grid-template-columns:34px 1fr 40px;align-items:center;
  gap:8px;font-size:12px;color:var(--suave)}
.av-barra i{display:block;height:8px;border-radius:4px;background:var(--linha)}
.av-barra i b{display:block;height:100%;border-radius:4px;background:#E8A81C}
.av-barra.baixa i b{background:var(--erro)}
.av-estrelinhas{color:#E8A81C;letter-spacing:1px;white-space:nowrap}
.av-comentario{font-size:13px;color:var(--texto);margin:4px 0 0;line-height:1.45}
.av-motivo-selo{display:inline-block;font-size:10.5px;padding:2px 7px;
  border-radius:99px;background:var(--selo-e);color:var(--selo-et);
  margin:2px 4px 0 0;white-space:nowrap}

/* Composição da conta de um serviço (detalhe > Financeiro).
   Lista curta, tipo pequeno: é conferência, não leitura corrida. */
.conta-servico{margin-top:12px;border-top:1px solid var(--linha);padding-top:10px;
  font-size:12px;color:var(--suave)}
.conta-servico b{display:block;color:var(--texto);font-size:11px;
  text-transform:uppercase;letter-spacing:.04em;margin:8px 0 3px}
.conta-servico b:first-child{margin-top:0}
.conta-servico ul{margin:0;padding-left:16px}
.conta-servico li{padding:1px 0}

/* =====================================================================
   O PORTAL NO CELULAR

   O gerente da loja abre serviço do balcão, com o celular na mão. Até
   aqui a tela cabia em 390px sem barra de rolagem horizontal — o que não
   é a mesma coisa que ser usável: a faixa de grupos rolava para o lado
   levando junto o botão "Novo serviço", e o formulário de abertura
   mantinha a coluna do resumo, sobrando 140px para os campos.

   Tudo abaixo vale a partir de 720px para baixo.
   ===================================================================== */
@media (max-width:720px){

  /* ---------------------------------------------------------------
     A AÇÃO PRINCIPAL SAI DA FAIXA QUE ROLA

     "Novo serviço" ficava depois das abas, dentro do mesmo contêiner
     com overflow horizontal: no celular ele nascia fora da tela, e só
     aparecia para quem arrastasse a faixa de abas para o lado — que
     ninguém faz, porque nada indica que há algo ali.

     Como botão flutuante ele está sempre a um toque, que é o que a
     tarefa merece: abrir serviço é o motivo de a loja entrar no portal.
     --------------------------------------------------------------- */
  .faixa-grupos .empurra{display:none}

  .faixa-grupos .acao-menu{
    position:fixed;
    right:14px;
    bottom:calc(14px + env(safe-area-inset-bottom, 0px));
    z-index:60;
    padding:14px 20px;
    font-size:14px;
    border-radius:100px;
    box-shadow:0 10px 26px -8px rgba(19,102,255,.75), 0 2px 6px rgba(13,27,42,.18);
  }

  /* Espaço no fim da página para o botão flutuante não cobrir a última
     linha da tabela nem o último botão do formulário. */
  .conteudo{padding-bottom:78px}

  /* Na própria tela de abrir serviço o botão não tem para onde levar, e
     flutuando ali ele cobriria justamente o "Continuar". */
  body[data-tela="nova"] .faixa-grupos .acao-menu{display:none}
  body[data-tela="nova"] .conteudo{padding-bottom:16px}

  /* ---------------------------------------------------------------
     CAMPOS QUE NÃO PROVOCAM ZOOM

     Abaixo de 16px, o Safari do iPhone dá zoom ao focar o campo e
     desloca a página inteira — o usuário perde o contexto a cada toque.
     A tipografia menor continua valendo no resto da interface.
     --------------------------------------------------------------- */
  .campo input, .campo select, .campo textarea,
  input[type=text], input[type=email], input[type=password],
  input[type=date], input[type=number], input[type=search],
  select, textarea{font-size:16px;min-height:44px}

  .campo label{font-size:12.5px}

  /* Alvo de toque: 44px é o mínimo confortável com o polegar. */
  .btn{min-height:44px}
  .btn.mini{min-height:38px}

  /* ---------------------------------------------------------------
     ABERTURA DE SERVIÇO EM UMA COLUNA

     O resumo continua logo abaixo do formulário, onde ele é conferência
     antes de enviar — e não uma coluna competindo por largura com os
     campos que se está preenchendo.
     --------------------------------------------------------------- */
  .grade-nova{grid-template-columns:1fr !important}

  .resumo-demanda{position:static;margin-top:4px}

  /* Os passos viram só as bolinhas numeradas: os rótulos não cabem, e
     o título do passo já está no próprio cartão logo abaixo. */
  .trilha-passos{gap:6px;overflow-x:auto;padding-bottom:2px}
  .trilha-passos .rot{display:none}
  .trilha-passos .traco{min-width:14px}

  /* A barra de ações do formulário acompanha o polegar. */
  .barra-acoes{flex-wrap:wrap;gap:8px}
  .barra-acoes .btn{flex:1 1 140px;justify-content:center}
}

/* Telas bem estreitas: o cartão perde o recuo interno generoso, que a
   essa largura só rouba espaço do conteúdo. */
@media (max-width:420px){
  .cartao{padding:13px}
  .faixa-grupos .acao-menu{padding:13px 18px}
}

/* ---------------------------------------------------------------------
   Importar planilha
   ---------------------------------------------------------------------
   Duas peças pequenas: os três passos do topo e a lista de erros dentro da
   célula da prévia. O resto da tela reusa cartão, grade e tabela. */
.passos-import{margin:10px 0 0;padding-left:20px;font-size:13.5px;line-height:1.7}
.passos-import li{margin-bottom:4px}

/* O erro mora DENTRO da célula da primeira coluna, e não numa coluna
   própria: a linha errada tem de ser lida como uma coisa só — "esta loja,
   por este motivo" — e uma coluna "erros" no fim da tabela obrigaria a
   percorrer a largura inteira para ligar o motivo ao registro. */
.erros-linha{margin:5px 0 0;padding-left:16px;font-size:11.5px;color:var(--selo-ft);
  font-weight:500;line-height:1.5}
.erros-linha li{margin-bottom:2px}

/* ---------------------------------------------------------------------
   Modelos de serviço (Novo serviço)
   ---------------------------------------------------------------------
   Cartão pequeno, com o suficiente para reconhecer o serviço sem abrir
   nada: nome, as duas pontas e quantos volumes. O botão de remover fica no
   canto, discreto — remover modelo é raro e não deve competir com o botão
   que se usa todo dia. */
.modelos-servico{margin-bottom:14px}
.modelo-cartao{position:relative;border:1px solid var(--linha);border-radius:var(--r-p);
  padding:11px 12px;display:flex;flex-direction:column;gap:2px;background:var(--carta)}
.modelo-cartao b{font-size:13.5px;padding-right:22px}
.modelo-cartao .sub-celula{font-size:11.5px}
/* Modelo travado continua na tela, apagado, com o motivo à vista: botão que
   some não explica nada a quem procurava por ele. */
.modelo-cartao.travado{opacity:.72;background:var(--carta2)}
.modelo-remover{position:absolute;top:6px;right:6px;margin:0}
.modelo-remover button{background:none;border:0;cursor:pointer;color:var(--apagado);
  padding:3px;line-height:0;border-radius:6px}
.modelo-remover button:hover{color:var(--erro);background:var(--carta2)}

.salvar-modelo{margin:0 0 14px;display:flex;flex-direction:column;gap:5px}
.salvar-modelo > span:first-child{font-size:12.5px;color:var(--suave);font-weight:500}
.salvar-modelo em{font-style:normal;color:var(--apagado)}
