:root{
  color-scheme:light;
  
  --texto:#0D1E37; --secundario:#4A5468; --apagado:#657188;
  --fundo:#F7F8FA; --superficie:#FFFFFF;
  --borda-cartao:#DEE3EB; --borda-campo:#C3CCD8; --borda-fina:#EEF1F5;
  
  --acao:#193F77; --marinho:#0D1E37; --alerta:#DC2626; --sucesso:#15803D; --atencao:#946200;
  --acao-fundo:#F0F4FA; --acao-fraco:#DCE5F1;
  --marinho-bg:#0D1E37;
  
  --ink:#0D1E37; --acento:#4DD5FF; --acento-texto:#0A7FA8; --acento-fundo:#ECFAFF;
  --sucesso-sinal:#16A34A;
  --anel-foco:0 0 0 3px rgba(77,213,255,.45);
  
  --raio:6px; --raio-p:6px; --raio-chip:999px;
  
  --alvo:38px;
  
  --ledge:56px;
  
  --t1:11px; --t2:12px; --t3:12px; --t4:13px; --t5:14px; --t6:17px; --t7:20px;
  
  --info-fundo:#EEF4FF; --info-borda:#CFE0FF; --info-texto:#1A3D7C;
  --ok-fundo:#EEF8F0; --ok-borda:#BFE3C8; --ok-texto:#14682B;
  --cuidado-fundo:#FFF8E6; --cuidado-borda:#F0D9A0; --cuidado-texto:#7A5A10;
  --erro-fundo:#FDECEC; --erro-borda:#F3C9C8; --erro-texto:#8F1D1B;
  --ia-fundo:#F6F2FE; --ia-borda:#E2D6FB; --ia-texto:#5B3FA8;
  --branco:#FFFFFF; --acao-hover:#15325E; --sombra:var(--sombra);
  --fonte:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;
}

:root[data-tema="escuro"]{
  color-scheme:dark;
  
  --texto:#E7ECF3; --secundario:#A9B6C9; --apagado:#8593A8;
  --fundo:#0B1420; --superficie:#18222F;
  --borda-cartao:#28323F; --borda-campo:#3A4552; --borda-fina:#1E2732;
  --acao:#B4C5DE; --marinho:#DCE5F1; --alerta:#F87171; --sucesso:#4ADE80; --atencao:#FBBF24;
  --acao-fundo:#16233D; --acao-fraco:#274475;
  --marinho-bg:#22344F;
  --ink:#0D1E37; --acento:#7EDEFF; --acento-texto:#7EDEFF; --acento-fundo:#0F2A38;
  --sucesso-sinal:#4ADE80;
  --info-fundo:#16233d; --info-borda:#274475; --info-texto:#a9c6ff;
  --ok-fundo:#14281b; --ok-borda:#2c5738; --ok-texto:#86e0a0;
  --cuidado-fundo:#2e2611; --cuidado-borda:#5c4a1e; --cuidado-texto:#eccb6e;
  --erro-fundo:#331717; --erro-borda:#6b2b2a; --erro-texto:#ff9d9a;
  --ia-fundo:#241a3a; --ia-borda:#43356b; --ia-texto:#c9b6f5;
  --branco:#FFFFFF; --acao-hover:#C9D6E8; --sombra:0 8px 24px rgba(0,0,0,.5);}
@media (prefers-color-scheme: dark){ :root:not([data-tema="claro"]){
  color-scheme:dark;
  
  --texto:#E7ECF3; --secundario:#A9B6C9; --apagado:#8593A8;
  --fundo:#0B1420; --superficie:#18222F;
  --borda-cartao:#28323F; --borda-campo:#3A4552; --borda-fina:#1E2732;
  --acao:#B4C5DE; --marinho:#DCE5F1; --alerta:#F87171; --sucesso:#4ADE80; --atencao:#FBBF24;
  --acao-fundo:#16233D; --acao-fraco:#274475;
  --marinho-bg:#22344F;
  --ink:#0D1E37; --acento:#7EDEFF; --acento-texto:#7EDEFF; --acento-fundo:#0F2A38;
  --sucesso-sinal:#4ADE80;
  --info-fundo:#16233d; --info-borda:#274475; --info-texto:#a9c6ff;
  --ok-fundo:#14281b; --ok-borda:#2c5738; --ok-texto:#86e0a0;
  --cuidado-fundo:#2e2611; --cuidado-borda:#5c4a1e; --cuidado-texto:#eccb6e;
  --erro-fundo:#331717; --erro-borda:#6b2b2a; --erro-texto:#ff9d9a;
  --ia-fundo:#241a3a; --ia-borda:#43356b; --ia-texto:#c9b6f5;
  --branco:#FFFFFF; --acao-hover:#C9D6E8; --sombra:0 8px 24px rgba(0,0,0,.5);} }
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}

body{font:var(--t3)/1.5 var(--fonte);margin:0;background:var(--fundo);color:var(--texto);-webkit-text-size-adjust:100%}
a{color:var(--acao);text-decoration:none} a:hover{text-decoration:underline}
/* =================================================================================================
   ⚠️⚠️ 30/08 (Fatia 3) — O ANEL DE FOCO, PARA TODO CONTROLE. O handoff exige (§7): "foco visivel
   sempre; ring ciano 3px; nao remover outline sem substituto".

   Medido antes: o produto tem ~445 elementos clicaveis distintos e **treze declaracoes** de foco
   proprio. O resto dependia do desenho padrao do navegador — que existe, mas muda de forma por
   navegador e some sobre fundo escuro.

   ⚠️⚠️ A FORMA CONSERVADORA, E A ESCOLHA E DELIBERADA. Existe uma maneira "limpa" de fazer isto:
   outline:none + box-shadow:anel. Ela DESLIGA o anel do navegador em centenas de elementos e
   passa a depender do anel novo pintar em todos — e se ele nao pintar num canto qualquer (um
   elemento com overflow:hidden no pai, um background que cobre a sombra), aquele controle fica
   SEM foco nenhum, e o produto vai de "anel em todo lugar" para "anel em lugar nenhum" sem aviso.
   Aqui eu **acrescento** a sombra e **nao toco no outline**: no pior caso a pessoa ve os dois, que e
   feio e acessivel — e feio-e-acessivel ganha de bonito-e-invisivel.
   ⚠️ Medido: ZERO ocorrencias de outline:none no produto hoje. Ninguem apagou o anel do navegador,
   entao nao ha estrago a remendar — so falta acrescentar.

   ⚠️ :focus-visible e nao :focus: o segundo pinta tambem no clique de mouse, e um anel que
   aparece a cada clique ensina a pessoa a ignora-lo — que e como um sinal de acessibilidade morre.
   ⚠️ O anel e o CIANO da marca (--anel-foco), o unico papel em que o handoff manda usa-lo sobre
   claro: ele reprova como texto (1,71 sobre branco) e serve como anel, que nao carrega leitura.
   ================================================================================================= */
a:focus-visible,button:focus-visible,summary:focus-visible,label:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{
  box-shadow:var(--anel-foco); border-radius:var(--raio-p);
}
/* ⚠️ pastilha e cartao mantem o proprio canto ao focar — o border-radius acima e so para quem nao
   tem nenhum, e sobrescreve-lo aqui deixaria um anel quadrado em volta de uma pastilha redonda. */
/* =================================================================================================
   ⚠️⚠️ 30/08 (Fatia 3) — O DEDO. A regua da casa e do handoff (§7) e a mesma: **alvo >= 44px no
   celular**. Medido num iPhone de 390px, cinco telas: 103 alvos abaixo disso.

   Os culpados, em ordem (classe -> quantos, menor altura):
     summary  35x, menor 19px  <- o pior, e o mais grave: <details> E O MECANISMO DE TODA A
                                 INTERFACE deste produto (colapso sem JavaScript). Um resumo de 19px
                                 e a coisa que a pessoa mais toca, com o menor alvo da tela.
     .mdb     12x, menor 15px  <- o alternador de modo (Foco/Quadro/Lista/Calendario)
     .lnk      8x, menor 32px · .sgb 7x, 30px · .bt 3x, 38px

   ⚠️ SO NO PONTEIRO GROSSO (pointer:coarse). Na mesa, 38px e o que o handoff pede e o que a casa ja
   pratica em 18 lugares — crescer tudo para 44px na mesa engordaria toda tela de lista sem motivo.
   ⚠️ min-height + align-items:center, e nao padding: padding empurraria o texto e quebraria o
   alinhamento de quem ja esta certo; altura minima cresce a AREA sem mover o conteudo.

   ⚠️⚠️ O QUE NAO ENTRA AQUI, E POR QUE: input apareceu 11x com 20px, mas sao os radios INVISIVEIS
   dentro das pastilhas de escolha (opacity:0, 1px) — ali o alvo real e a etiqueta, que ja tem 44.
   Crescer o input escondido nao daria alvo nenhum e ainda poderia vazar por cima do vizinho.
   ⚠️ E .opo/.cli (o titulo e o cliente no cartao do quadro, 16-18px) TAMBEM ficam de fora: eles
   sao texto dentro de um cartao, e engorda-los estouraria a promessa de tres linhas. O conserto certo
   deles e outro — o cartao inteiro virar alvo, como ja acontece no cartao de tarefa. Fica registrado.
   ================================================================================================= */
@media (pointer:coarse),(hover:none){
  :root{--alvo:44px}
  
  summary,.mdb,.sgb,.lnk,.bt,.acao,.lk{display:inline-flex;align-items:center;min-height:var(--alvo)}
  summary{display:flex}
}
.chip:focus-visible,.selo:focus-visible,.pil:focus-visible,
[class*="fvo"]:focus-visible,[class*="fvc"]:focus-visible{border-radius:var(--raio-chip)}
.top{background:var(--superficie);border-bottom:1px solid var(--borda-cartao);padding:5px 14px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;position:sticky;top:0;z-index:5;min-height:var(--ledge);box-sizing:border-box}
/* =================================================================================================
   ⚠️⚠️ TODA ÂNCORA DO PRODUTO CAIA ATRÁS DO CABEÇALHO — 29/08, dono: *"quando clicamos nos atalhos de
   navegacao embaixo a pagina nao para no ponto certo... para cortando o quadro"*.

   .top é position:sticky (a linha acima). O navegador rola a âncora até o TOPO DA JANELA, que é
   justamente onde o cabeçalho está grudado — então ele come os primeiros ~96px do bloco, e o que a
   pessoa vê é o meio de um quadro cujo título ficou escondido.

   ⚠️ scroll-padding-top NO CONTAINER DE ROLAGEM, e não scroll-margin-top em cada alvo. Já havia um
   remendo por alvo em negocio.js (scroll-margin no proprio #checklist) e ele consertava UMA das oito
   ⚠️ E ESTE COMENTARIO NAO ESCREVE A REGRA ANTIGA POR EXTENSO DE PROPOSITO: ele vira comentario CSS
   na pagina servida, e a sonda p29 confere que a regra antiga NAO esta la — escreve-la aqui faria a
   sonda achar o meu comentario e reprovar. Ja medi string no lugar da coisa 4 vezes neste projeto.
   âncoras — as outras sete continuaram quebradas, porque conserto por alvo só conserta o alvo que
   alguém lembrou. Aqui é uma linha e vale para toda âncora que existir de agora em diante.
   ⚠️ E OS DOIS NÃO PODEM CONVIVER: eles SOMAM. Com os dois, o #checklist pararia 192px abaixo — por
   isso o remendo antigo foi removido junto (ver negocio.js).
   ⚠️ 104px = os ~96px medidos do cabeçalho + 8px de respiro, para o título não encostar na borda.
   ================================================================================================= */
html{scroll-padding-top:calc(var(--ledge) + 8px)}
@media (max-width:759px){
  /* o cabeçalho é mais baixo no telefone (padding menor, menos coisa na linha da meta) */
}
.top img.logo{height:19px;width:auto;display:block}
/* =================================================================================================
   A BUSCA GLOBAL DO TOPO — 30/08. Handoff §4 pede 320px; aqui ela ESTICA ate 380 e encolhe ate 180,
   porque a fileira do topo carrega a fita do espelho, o nome e quatro botoes, e um numero fixo faria
   um dos dois quebrar linha em telas de 1100-1280 (a faixa do notebook, onde o time trabalha).
   ⚠️ flex:1 1 180px com max-width e o que faz ela ceder ANTES de qualquer outra coisa do topo:
   ela e a unica peca dali que continua util com metade da largura.
   ================================================================================================= */
.tbusca{flex:1 1 180px;max-width:380px;min-width:0;margin:0 4px}
.tbusca input{width:100%;min-height:var(--alvo);padding:6px 11px;box-sizing:border-box;
  border:1px solid var(--borda-campo);border-radius:var(--raio-p);background:var(--superficie);
  color:var(--texto);font:400 var(--t3) var(--fonte)}
.tbusca input::placeholder{color:var(--apagado)}
.tbusca input:focus-visible{border-color:var(--acento);box-shadow:var(--anel-foco);outline:none}
/* ⚠️ SO NA MESA: num telefone de 390px um campo de 320px nao cabe ao lado da marca, e a barra do
   polegar JA tem "Buscar" — que continua sendo o caminho do celular. */
@media (max-width:759px){ .tbusca{display:none} }
.marca{display:flex;align-items:center;gap:7px;flex:0 0 auto}
.marca b{font-size:var(--t4);letter-spacing:-.2px;color:var(--marinho);white-space:nowrap}
/* ATENCAO — position:relative + z-index:1 NAO E ENFEITE, e a linha de baixo tambem nao. Ver o bloco
   longo no fim deste CSS (max-height:480px), que explica o defeito medido: o selo transbordava POR
   CIMA do menu no celular deitado e comia o toque em 12 de 12 combinacoes. O conserto de verdade e o
   min-width do selo; esta linha e o CINTO: no dia em que qualquer outro elemento desta barra
   transbordar, quem recebe o toque continua sendo o menu, que e navegacao, e nao um rotulo. */
nav.nav{display:flex;align-items:center;gap:2px;font-size:var(--t3);position:relative;z-index:1}
nav.nav a{display:inline-flex;align-items:center;justify-content:center;padding:7px 9px;border-radius:6px;color:var(--secundario);font-weight:600;white-space:nowrap}
nav.nav a:hover{background:var(--fundo);color:var(--acao);text-decoration:none}
nav.nav a.aqui{color:var(--marinho);background:var(--fundo)}
nav.acoes{display:flex;align-items:center;gap:6px;flex:0 0 auto} nav.acoes form{margin:0;display:flex}
.ic{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:1px solid var(--borda-cartao);border-radius:6px;background:var(--superficie);color:var(--secundario);cursor:pointer}
.ic:hover{background:var(--fundo);color:var(--acao);border-color:var(--borda-campo);text-decoration:none}
.ic.sair:hover{color:var(--alerta);border-color:var(--erro-borda)} .ic svg{width:17px;height:17px;display:block}
.eu{flex:1 1 0;display:flex;flex-direction:column;line-height:1.25;font-size:var(--t2);color:var(--secundario);min-width:0;text-align:right}
.eu b{font-size:var(--t3);color:var(--texto);font-weight:600}
/* ⚠️ O TOPO NO CELULAR — medido em 187px antes do primeiro dado, com 11 alvos. Sai só o redundante:
   o "VISO.CRM" ao lado do próprio logotipo, o nome do perfil, e a quebra do nome em duas linhas (que
   era o que fazia a barra crescer). NÃO sai nada que só exista aqui: nome, tema, senha e sair moram
   só no topo — o menu lateral tem apenas navegação. */
@media (max-width:759px){
  .top{padding:4px 10px;gap:7px}
  .top .marca b{display:none}
  .eu{flex-direction:row;align-items:baseline;gap:6px;white-space:nowrap;overflow:hidden}
  .eu b{text-overflow:ellipsis;overflow:hidden}
  .eu>span{display:none}
  .top nav.acoes{gap:2px}
}
/* ATENCAO — ELE E UMA FILEIRA DO '.top' AGORA, nao uma faixa propria (ver o bloco longo na casca).
   'flex:1 0 100%' o poe na linha que sobra da barra; o fundo cinza, a borda de baixo e o padding
   lateral sairam porque a barra ja os tem — eram justamente os pixels que a faixa separada cobrava.
   ATENCAO — 'order:9' garante que ele fica DEPOIS dos botoes de conta mesmo se alguem reordenar o HTML:
   a informacao e status, e status nao disputa a primeira linha com identidade e navegacao. */
.carimbo{position:relative;margin-left:auto;font-size:var(--t2);color:var(--secundario)}
.carimbo>summary.carimbores{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:5px;min-height:30px;padding:2px 10px;
  border:1px solid var(--borda-campo);border-radius:var(--raio-chip);background:var(--superficie);white-space:nowrap;font-size:var(--t2)}
.carimbo>summary.carimbores::-webkit-details-marker{display:none}
.carimbo>summary.carimbores:hover,.carimbo[open]>summary.carimbores{border-color:var(--acao);color:var(--acao)}
.carimbo .mttri{color:var(--texto);font-weight:700}
.carimbo .mtres{color:var(--texto);font-weight:700}
.carimbo .mtseta{font-style:normal;font-size:var(--t1);opacity:.7}
.carimbocorpo{position:absolute;right:0;top:calc(100% + 6px);z-index:30;min-width:min(760px,calc(100vw - 28px));max-width:calc(100vw - 28px);
  background:var(--superficie);border:1px solid var(--borda);border-radius:var(--raio-p);box-shadow:var(--sombra);padding:10px 12px;
  display:flex;gap:8px 14px;flex-wrap:wrap;align-items:center;line-height:1.35}
/* no celular o chip é só o percentual (a linha da busca não tem 220px sobrando): o trimestre e o ritmo estão no painel */
@media (pointer:coarse),(hover:none){ .carimbo>summary.carimbores{min-height:44px} }
@media (max-width:640px){ .carimbo .mtrit,.carimbo .mttri{display:none} .carimbo>summary.carimbores{padding:2px 8px;gap:3px} .top .eu{display:none}
  /* o painel ancorado a direita do chip sairia pela esquerda da tela: no celular ele ocupa a largura toda, abaixo da linha da busca */
  .carimbocorpo{position:fixed;left:10px;right:10px;top:calc(var(--ledge) + 4px);min-width:0;max-width:none} }
.carimbo b{color:var(--texto);font-weight:600}
.carimbo .mtopo{margin-left:10px;padding-left:10px;border-left:1px solid var(--borda-cartao)}
.carimbo .mtopo .mtsep{opacity:.45;margin:0 2px}
.carimbo .mtopo .mtok{color:var(--sucesso)}
.carimbo .mtopo .mtat{color:var(--cuidado-texto)}
.carimbo .mtopo .mtesc{opacity:.6}
@media (max-width:760px){ .carimbo .mtopo{margin-left:0;padding-left:0;border-left:0;display:block} }
.carimbo .cuidado{color:var(--cuidado-texto);background:var(--cuidado-fundo);border:1px solid var(--cuidado-borda);border-radius:6px;padding:1px 6px}
.wrap{padding:14px;max-width:1400px}
.card{background:var(--superficie);border:1px solid var(--borda-cartao);border-radius:var(--raio);padding:14px;margin-bottom:14px}
table{width:100%;border-collapse:collapse;font-size:var(--t3)}
th{text-align:left;font-size:var(--t2);text-transform:uppercase;color:var(--secundario);border-bottom:1px solid var(--borda-cartao);padding:7px 8px}
td{padding:7px 8px;border-bottom:1px solid var(--borda-fina)} tr:hover td{background:var(--borda-fina)}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
.kpi{display:flex;gap:10px;flex-wrap:wrap} .kpi div{background:var(--superficie);border:1px solid var(--borda-cartao);border-radius:var(--raio);padding:11px 14px;flex:1 1 150px}
.kpi b{display:block;font-size:var(--t7);font-weight:700} .kpi span{font-size:var(--t2);color:var(--secundario)}
input,select,textarea{font-size:var(--t5);padding:9px 10px;border:1px solid var(--borda-campo);border-radius:var(--raio-p);background:var(--superficie);color:var(--texto);max-width:100%}
input:focus,select:focus{outline:2px solid var(--info-borda);outline-offset:0;border-color:var(--acao)}
/* ==========================================================================================
   LAY-01 da revisão (06/09, aprovada) — A FOLHA DE COMPONENTES. Contado antes: o mesmo botão definido
   16 vezes em 10 arquivos, .lnb copiado "byte a byte" em três telas, .pil em três, a gramática do
   cabeçalho (.cab*) em duas. Uma régua, um lugar: QUATRO famílias de botão e nada mais —
     .b-primario   cheio azul (o desfecho que a empresa persegue; .btb.ganhar é a variante verde)
     .b-secundario contorno azul (o gesto do fluxo)
     .b-discreto   contorno neutro (o que sempre existe e não pode gritar: Detalhes, + oportunidade)
     .b-perigo     contorno vermelho (o que a empresa REGISTRA, não persegue)
   — mais UM campo (input/select/textarea, logo abaixo) e UMA pastilha (.pil).
   Os nomes antigos migraram tela a tela (06/09): .btb, .lnb (hoje só tamanho de tabela), .acao, .pri e
   .criar a. Sobram os sistemas locais compostos (.bt.pri de tarefas/emissao, .vbneg.pri) e o .btn dos formularios.
   Sem crase neste bloco. */
.b-primario,.b-secundario,.b-discreto,.b-perigo{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  min-height:var(--alvo,36px);padding:9px 14px;border:1px solid var(--borda-campo);border-radius:var(--raio-p);
  background:var(--superficie);color:var(--texto);font:600 var(--t4) var(--fonte);text-decoration:none;cursor:pointer;
  white-space:nowrap;text-align:center;line-height:1.25}
.b-primario{background:var(--acao);border-color:var(--acao);color:var(--branco)}
.b-primario:hover{filter:brightness(1.08)}
.b-primario.ganhar{background:var(--sucesso);border-color:var(--sucesso);color:var(--branco);font-weight:700}
.b-secundario{color:var(--acao);border-color:var(--acao)}
.b-secundario:hover{background:var(--acao);border-color:var(--acao);color:var(--branco)}
.b-discreto:hover{background:var(--fundo);border-color:var(--marinho)}
.b-perigo{color:var(--alerta);border-color:var(--borda-campo)}
.b-perigo:hover{background:var(--alerta);border-color:var(--alerta);color:var(--branco)}
/* a variante de tabela: mesma família, menor — "Detalhes ›" em 113 linhas não pode ter 44px na mesa */
.lnb{padding:6px 8px;font-size:var(--t2)}  /* 06/09: .lnb é só TAMANHO (variante de tabela); a família vem do b-* ao lado; det1 é só o marcador do cartão do celular */
.lnb.sol{color:var(--marinho)}
@media (pointer:coarse),(hover:none){
  .b-primario,.b-secundario,.b-discreto,.b-perigo{min-height:44px}
  .lnb{padding:11px 9px}
}
/* A PASTILHA (era a de estilo.mjs, a versão com apelidos de cor; a da ficha tinha os mesmos verdes em hex) */
.pil{display:inline-flex;align-items:center;gap:4px;font-size:var(--t2);padding:3px 9px;border-radius:var(--raio-chip);line-height:1.4;
  background:var(--fundo);border:1px solid var(--borda-cartao);color:var(--secundario)}
.pil b{color:var(--texto);font-weight:600}
.pil em{font-style:normal;color:var(--apagado)}
.pil.dinheiro{background:var(--ok-fundo);border-color:var(--ok-borda);color:var(--ok-texto);
  font-size:var(--t5);font-weight:700;padding:4px 12px}
.pil.dinheiro em{font-style:normal;font-size:var(--t2);font-weight:600}
.pil.semvalor{background:var(--cuidado-fundo);border-color:var(--cuidado-borda);color:var(--cuidado-texto)}
.pil.situacao{background:var(--erro-fundo);border-color:var(--erro-borda);color:var(--erro-texto);font-weight:700}
.pil.situacao b{color:var(--erro-texto);font-weight:800}
/* as três temperaturas (eram de cliente.mjs; promovidas em 10/09 com a tela 7) e a pastilha de MARGEM
   (.pil.mg — só nasce no HTML de quem tem negociacao_abrir; a cor é por faixa: faixaMargem) */
.pil.bom{background:var(--ok-fundo);border-color:var(--ok-borda);color:var(--ok-texto)}
.pil.frio{background:var(--erro-fundo);border-color:var(--erro-borda);color:var(--erro-texto)}
.pil.morno{background:var(--cuidado-fundo);border-color:var(--cuidado-borda);color:var(--cuidado-texto)}
.pil.mg{font-weight:700;font-variant-numeric:tabular-nums}
.pil.mg.ok{background:var(--ok-fundo);border-color:var(--ok-borda);color:var(--ok-texto)}
.pil.mg.cuidado{background:var(--cuidado-fundo);border-color:var(--cuidado-borda);color:var(--cuidado-texto)}
.pil.mg.mau{background:var(--erro-fundo);border-color:var(--erro-borda);color:var(--erro-texto)}
.pil.mg b,.pil.mg.ok b,.pil.mg.cuidado b,.pil.mg.mau b{color:inherit}
.cabval b.mg.ok{color:var(--ok-texto)} .cabval b.mg.cuidado{color:var(--cuidado-texto)} .cabval b.mg.mau{color:var(--erro-texto)}
/* ==========================================================================================
   A GRAMÁTICA DAS LISTAS (07/09) — recortes à esquerda (.lsrecdet/.lsrec*), o <details> que no celular
   os recolhe (.lsdet), a caixa de seleção (.selb), a barra de lote (.lsbar), os chips dos filtros ativos
   (.fchips) e a ordenação em links (.ordl), o rodapé (.lsfim). Nasceu na lista de Oportunidades (06/09)
   e a de Clientes usa a MESMA — por isso mora aqui. O que é de uma lista só fica na folha dela. */
/* o grude fica no <details> (o item da grade), não no <nav> dentro dele — dentro do details não há altura para grudar (regressão do Lote 1, pega em 07/09) */
.lsrecdet{position:sticky;top:calc(var(--ledge) + 12px);align-self:start;max-height:calc(100vh - var(--ledge) - 24px);overflow-y:auto}
.lsrecrot{margin:0 0 6px;font:700 var(--t1) var(--fonte);letter-spacing:.07em;color:var(--secundario)}
.lsrecl{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}
.lsrecit{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:var(--raio-p);
  font:500 var(--t4) var(--fonte);color:var(--texto);text-decoration:none;min-height:34px}
.lsrecit span{flex:1 1 auto;min-width:0}
.lsrecit b{font:600 var(--t3) var(--fonte);color:var(--secundario);font-variant-numeric:tabular-nums}
.lsrecit:hover{background:var(--fundo);color:var(--acao)}
/* o recorte ATIVO e marcado com moldura, nao so com cor: cor sozinha some para quem nao a distingue */
.lsrecit.on{border:1px solid var(--acao);color:var(--acao);font-weight:600}
.lsrecit.on b{color:var(--acao)}
.lsrecit.urg b{color:var(--alerta)}
.lsrecsub{padding-left:10px}
.lsrecsub .lsrecit{font-size:var(--t3);color:var(--secundario);min-height:30px}
.lsrecpe{margin:12px 0 0;font:400 var(--t1)/1.5 var(--fonte);color:var(--secundario);
  padding-top:9px;border-top:1px solid var(--borda-fina)}
/* NAV-02 — o <details> dos recortes e dos filtros: na MESA ele nem aparece (sem marcador, sempre
   aberto, sem borda); no CELULAR vira uma linha de 44px que resume o que está ativo. */
.lsdet>summary.lsdetsum{list-style:none;display:none}
.lsdet>summary::-webkit-details-marker{display:none}
.lsdet::details-content{content-visibility:visible}
@media(max-width:980px){
  .lsdet>summary.lsdetsum{display:flex;align-items:center;gap:8px;min-height:44px;padding:0 12px;margin:0 0 8px;
    border:1px solid var(--borda-campo);border-radius:var(--raio-p);background:var(--superficie);
    font:600 var(--t4) var(--fonte);color:var(--texto);cursor:pointer}
  .lsdet>summary.lsdetsum::after{content:'▾';margin-left:auto;color:var(--secundario)}
  .lsdet[open]>summary.lsdetsum::after{content:'▴'}
  .lsdet:not([open])::details-content{content-visibility:hidden}
  .selb{width:44px;height:44px} .selb input{width:20px;height:20px}
  /* no celular a barra mora no FIM da lista e só gruda no pé quando há seleção (.tem, posto pelo script):
     pegajosa sempre, ela cobria os primeiros cartões — medido: um toque na 1ª caixa caía no "todas" dela */
  .lsbar{position:static;order:99;margin:8px 0 0}
  .lsbar.tem{position:sticky;bottom:calc(64px + env(safe-area-inset-bottom))}
  .lsbar .selres{flex-basis:100%}
  .fchips .ordr{margin-left:0;flex-basis:100%}
        .lsrecdet,.lsrec{position:static;max-height:none;overflow:visible}
  .lsrecl{flex-direction:row;flex-wrap:wrap;gap:5px}
  .lsrecit{border:1px solid var(--borda-campo);min-height:36px}
  .lsrecsub{padding-left:0}
}
@media (pointer:coarse){ .lsrecit{min-height:44px} }
/* nota 7 — a caixa de seleção: 28px no ponteiro, 44 no dedo; a caixa nativa é o controle (zero desenho novo) */
.selb{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;cursor:pointer}
.selb input{width:16px;height:16px;margin:0;cursor:pointer;accent-color:var(--acao)}
/* a BARRA DE SELEÇÃO — pegajosa no topo da lista; só ganha cor quando há seleção (classe .tem, do script) */
.lsbar{position:sticky;top:calc(var(--ledge) + 6px);z-index:4;display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;
  padding:8px 12px;margin:0 0 8px;border:1px solid var(--borda-cartao);border-radius:var(--raio-p);background:var(--superficie)}
.lsbar.tem{border-color:var(--acao);box-shadow:var(--sombra)}
.lsbar .seltudo{display:inline-flex;align-items:center;gap:6px;font:600 var(--t2) var(--fonte);color:var(--secundario);cursor:pointer}
.lsbar .selres{margin:0;flex:1 1 220px;font:600 var(--t3) var(--fonte);color:var(--secundario)}
.lsbar.tem .selres{color:var(--texto)}
.lsbar .selacts{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.lsbar .selacts select{min-height:var(--alvo);font-size:var(--t3);max-width:260px}
/* nota 4 — chips dos filtros ativos e a ordenação como links */
.fchips{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin:0 0 8px;font-size:var(--t2);color:var(--secundario)}
.fchips .fchr,.fchips .ordr{font-weight:600;margin-right:2px}
.fchips .ordr{margin-left:auto}
.fchip{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border:1px solid var(--acao);border-radius:var(--raio-chip);
  color:var(--acao);background:var(--acao-fundo);text-decoration:none;font-weight:600}
.fchip b{font-weight:700}
.fchip:hover{background:var(--acao);color:var(--branco)}
.ordl{padding:3px 8px;border-radius:var(--raio-chip);color:var(--secundario);text-decoration:none;font-weight:600}
.ordl:hover{color:var(--acao)}
.ordl.on{background:var(--acao-fraco);color:var(--marinho)}
/* nota 6 — o rodapé encadeia a fila */
.lsfim{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:12px 0 0;font-size:var(--t3);color:var(--secundario)}
/* as setas de página do rodapé (era cópia local em clientes.mjs; 09/09 subiu para cá com a tela 6) */
.lsfim .pgl{min-width:36px;padding:6px 10px}
.lsfim .pgl.off{opacity:.4;pointer-events:none}
/* ==========================================================================================
   A PRIMEIRA COLUNA RECOLHÍVEL (11/09) — cookie viso.col → :root[data-col=fechada] (POST /coluna,
   molde do menu). Sete colunas 1, três classes (.lsrecdet .fesq .cknav), cinco grades; em TODAS a
   coluna é o :first-child e o miolo o :nth-child(2) — por isso UMA regra dupla basta e nenhum
   grid-template-columns é tocado (o miolo passa a cobrir trilha 1 + gap + trilha 2; a direita fica
   na trilha 3). ⚠️ grid-column:1/3 numa grade de UMA trilha cria trilha implícita e quebra —
   e as grades viram multi-coluna em pontos DIFERENTES (lscols/clcols 981, qgrid 1100, fkgrid 1180,
   cockpit 1181). Por isso três blocos, aqui, e não uma cópia em cada folha. Abaixo de 981 manda o
   <details> do celular; este atributo não existe lá.
   ⚠️ Limite honesto: a 1180 px EXATOS .fkgrid já é 3 colunas (min-width:1180) e a regra só age a partir
   de 1181 — 1 px em que a preferência não se aplica no Foco/Fila. Não vale um quarto bloco.
   ⚠️ REGRA PARA O FUTURO: coluna 1 nova = uma das três classes + primeiro filho de uma das cinco grades;
   se não couber, a regra cresce AQUI.
   ⚠️⚠️ A EXCEÇÃO MEDIDA (11/09): a 7b (documento da proposta, emissao.mjs) É .cockpit.ckdoc, mas troca de
   forma pela largura do CONTAINER (@container 1361/1157), não da janela — a 1440 com o menu aberto o container
   tem 1172 px, a .ckdoc está em DUAS trilhas com o índice em fileira, e o grid-column:1/3 do miolo tomava a
   trilha da decisão: a coluna Emitir/verificação caía 578 px para baixo do iframe; a 1280 nascia a trilha
   implícita de 0 px. Por isso .cockpit:not(.ckdoc) aqui, e o recolhimento da 7b mora na folha DELA, escrito
   nos @container dela (esconde o índice em qualquer forma; só estende o miolo quando há três trilhas).
   ========================================================================================== */
/* ⚠️ 11/09 (D20): a grade .qgrid era a do QUADRO DO FUNIL, que morreu — saiu daqui e das ROTAS da p96 (a faixa
   1100–1180 passou a ser medida na lista, .lscols, cuja regra é a de 981–1180). Seis colunas 1, quatro grades. */
/* ⚠️⚠️ 12/09 — RECOLHIDA, A COLUNA 1 VIRA UM TRILHO DE 44 px (dono: "fica reduzido como o menu"), em vez de sumir e o
   miolo se estender por grid-column. O que muda é a PRIMEIRA TRILHA de cada grade (44px) e os filhos da coluna somem
   menos o botão (.colbt), que vira o "expandir". Os pontos de largura são os mesmos de antes. */
@media(min-width:1181px){
  :root[data-col=fechada] :is(.lscols,.clcols,.fkgrid,.cockpit:not(.ckdoc))>:is(.lsrecdet,.fesq,.cknav)>*:not(.colbt){display:none}
  :root[data-col=fechada] :is(.lscols,.clcols,.fkgrid,.cockpit:not(.ckdoc))>:is(.lsrecdet,.fesq,.cknav){width:44px;min-width:0;padding:0;border-color:transparent;background:none;overflow:visible}
  :root[data-col=fechada] .lscols{grid-template-columns:44px minmax(0,1fr)}
  :root[data-col=fechada] .clcols{grid-template-columns:44px minmax(0,1fr) 296px}
  :root[data-col=fechada] .fkgrid{grid-template-columns:44px minmax(0,1fr) 300px}
  :root[data-col=fechada] .cockpit:not(.ckdoc){grid-template-columns:44px minmax(0,1fr) 320px}
}
@media(min-width:981px) and (max-width:1180px){
  :root[data-col=fechada] :is(.lscols,.clcols)>.lsrecdet>*:not(.colbt){display:none}
  :root[data-col=fechada] :is(.lscols,.clcols)>.lsrecdet{width:44px;min-width:0;padding:0;border-color:transparent;background:none}
  :root[data-col=fechada] :is(.lscols,.clcols){grid-template-columns:44px minmax(0,1fr)}
}
/* o botão: no PÉ da coluna, como o "Recolher" do menu; recolhido, só o ícone, centrado no trilho */
.colbt{display:flex;margin:12px 0 0;padding-top:8px;border-top:1px solid var(--borda-fina)}
.colbtb{display:inline-flex;align-items:center;gap:8px;background:none;border:0;padding:6px 8px;border-radius:var(--raio-p);color:var(--secundario);font:600 var(--t2) var(--fonte);cursor:pointer;min-height:36px}
.colbtb:hover{background:var(--fundo);color:var(--texto)} .colbtb svg{width:18px;height:18px;flex:none}
:root[data-col=fechada] .colbt{margin:0;padding:0;border:0;justify-content:center} :root[data-col=fechada] .colbtb{width:36px;padding:6px 0;justify-content:center}
/* o botão só existe onde a regra age: no celular manda o <details>; em .fkgrid/.cockpit abaixo de 1181 a
   coluna já virou fileira de chips (esconder tiraria as filas) */
@media(max-width:1180px){ .colbt[data-grade=fkgrid],.colbt[data-grade=cockpit]{display:none} }
@media(max-width:980px){ .colbt{display:none} }
/* O CONTROLE SEGMENTADO (.seg/.sgb) — 09/09, tela 6. Havia cinco cópias locais (três em emissao.mjs, que
   morreram com o painel antigo, e as de tarefas.mjs, qualificadas por .tks); o painel novo usa ESTA, e a
   sexta cópia não nasce. Primário = contorno que enche (a direção minimalista de 24/08). */
.seg{display:inline-flex;border:1px solid var(--borda-campo);border-radius:var(--raio-p);overflow:hidden}
.sgb{display:inline-flex;align-items:center;padding:8px 14px;font:600 var(--t3) var(--fonte);color:var(--secundario);text-decoration:none;min-height:var(--alvo)}
.sgb+.sgb{border-left:1px solid var(--borda-fina)}
.sgb.on{background:var(--acao);color:var(--branco)}
/* ==========================================================================================
   A GRAMÁTICA DO CABEÇALHO-COCKPIT (06/09) — morava em negocio.js E em oportunidades.mjs, cópia a cópia.
   LAY-02 da revisão: sobrancelha e subtítulo na MESMA linha do título (a esquerda e a direita), não
   em três linhas — medido: 73px de cabeçalho na lista antes do primeiro dado. .cabesq é uma fileira
   que embrulha: título, sobrancelha, o que mais a tela puser (na ficha: carteira e "nomear o card"),
   e .cabsub encostado à direita. No celular volta a empilhar. */
.cabtopo{display:flex;align-items:flex-start;gap:14px}
.cabesq{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:4px 12px;flex-wrap:wrap}
.cabesq h1,.cabesq .tt{margin:0}
.cabolho{margin:0;font:600 var(--t1)/1.4 var(--fonte);letter-spacing:.06em;text-transform:uppercase;color:var(--secundario)}
.cabolho b{color:var(--texto);font-weight:700}
.cabsub{margin:0 0 0 auto;font:400 var(--t3) var(--fonte);color:var(--secundario)}
.cabsub b{color:var(--texto)}
.cabdir{flex:none;display:flex;align-items:center;gap:9px}
.cabval{display:flex;flex-direction:column;align-items:flex-end;line-height:1.15}
.cabval span{font:700 var(--t1) var(--fonte);letter-spacing:.06em;color:var(--secundario)}
.cabval b{font:700 var(--t6) var(--fonte);font-variant-numeric:tabular-nums;white-space:nowrap}
/* O ... é um details nativo: menu sem uma linha de JavaScript. O painel é absoluto para não
   empurrar a tela ao abrir — menu que muda a altura da página faz o dedo errar o alvo. */
.cabmais{position:relative}
.cabmais>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;
  min-width:38px;min-height:38px;border:1px solid var(--borda-campo);border-radius:var(--raio-p);
  font:700 var(--t5)/1 var(--fonte);color:var(--secundario);background:var(--superficie);letter-spacing:1px}
.cabmais>summary::-webkit-details-marker{display:none}
.cabmais>summary::marker{content:''}
.cabmais>summary:hover,.cabmais[open]>summary{border-color:var(--acao);color:var(--acao)}
.cabmenu{position:absolute;right:0;top:calc(100% + 5px);z-index:30;min-width:216px;
  display:flex;flex-direction:column;gap:2px;padding:5px;background:var(--superficie);
  border:1px solid var(--borda);border-radius:var(--raio-p);box-shadow:var(--sombra)}
.cabmenu .mnit,.cabmenu .btsem{display:block;padding:9px 10px;border-radius:var(--raio-p);
  font:600 var(--t3) var(--fonte);color:var(--texto);text-decoration:none;white-space:normal}
.cabmenu .mnit:hover{background:var(--fundo);color:var(--acao)}
.cabmenu .mnit.mau:hover{background:var(--erro-fundo);color:var(--erro-texto)}
.cabmenu .btsem{color:var(--secundario);font-weight:400;cursor:default}
.cabchips{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 0;align-items:center}
.cabchips .pil.etapa{border-color:var(--acao);color:var(--acao)}
.cabchips .pil.mau{border-color:var(--erro-borda);color:var(--erro-texto);text-decoration:none}
@media (pointer:coarse){ .cabmais>summary{min-width:44px;min-height:44px} .cabmenu .mnit{min-height:44px} }
/* 10/09 (tela 7, medido a 390 iPhone): chip-link do cabeçalho e a saída da caixa de contexto são alvos de dedo */
@media (pointer:coarse){ .cabchips a.pil{min-height:44px} .cknavout{min-height:44px;display:flex;align-items:center} }
/* No celular a decisão vai para BAIXO do nome, em linha própria: espremer valor + botão + menu ao
   lado de um nome de empresa em 375px produz três alvos de 24px, e o alvo desta casa é 44. */
@media(max-width:620px){
  .cabtopo{flex-direction:column;gap:8px}
  .cabesq{gap:2px 10px}
  .cabsub{margin-left:0;flex-basis:100%}
  .cabdir{width:100%;justify-content:space-between;flex-wrap:wrap}
  .cabmenu{right:auto;left:0}
}
.btn{background:var(--superficie);color:var(--acao);border:1.5px solid var(--acao);border-radius:var(--raio-p);padding:11px 16px;font-size:var(--t4);font-weight:600;cursor:pointer;min-height:44px}
.btn:active{transform:translateY(1px)}
.note{font-size:var(--t2);color:var(--apagado);margin-top:10px}
.tag{display:inline-block;font-size:var(--t2);padding:2px 7px;border-radius:6px;background:var(--fundo);border:1px solid var(--borda-cartao);color:var(--secundario)}
.vazio{color:var(--apagado);padding:18px 8px;text-align:center}
.rolar{overflow-x:auto;-webkit-overflow-scrolling:touch}
.aviso{border-radius:var(--raio-p);padding:10px 12px;font-size:var(--t3);margin:0 0 12px;overflow-wrap:anywhere;word-break:break-word}
/* ============================================================================================
   O COCKPIT EM TRES COLUNAS (06/09; global em 07/09, ficha do negocio E do cliente) — indice | assunto | decisao.
   ZERO JAVASCRIPT: o indice sao ancoras e as colunas grudam com position:sticky.
   ⚠️ SEM scroll-margin-top nos alvos: a casca ja tem scroll-padding-top no html (app.js), e os
   dois SOMAM — com os dois, a ancora parava 76px ABAIXO do bloco, com o fim do bloco anterior a
   vista ("para num lugar estranho", dono, 06/09). Uma regra, um lugar.
   ============================================================================================ */
.cockpit{display:grid;grid-template-columns:186px minmax(0,1fr) 320px;gap:18px;align-items:start}
.ckmeio{min-width:0;display:flex;flex-direction:column}
.cknav,.ckdir{position:sticky;top:calc(var(--ledge) + 12px);align-self:start}
.cknavrot,.ckdirrot{margin:0 0 7px;font:700 var(--t1) var(--fonte);letter-spacing:.07em;color:var(--secundario)}
.cknavl{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}
.cknavl a{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--raio-p);
  font:500 var(--t3) var(--fonte);color:var(--texto);text-decoration:none;min-height:32px}
.cknavl a:hover{background:var(--fundo);color:var(--acao)}
.cknavl a b{margin-left:auto;font:600 var(--t2) var(--fonte);color:var(--secundario);font-variant-numeric:tabular-nums}
/* o índice de ESTADO por bloco (10/09, tela 7a): a bolinha do Foco (.ffila i, tarefas.mjs) na gramática
   do cockpit — .on = preenchido, .mau = vermelho (o bloco pede atenção antes de emitir) */
.cknavl a i{width:10px;height:10px;border:1.5px solid var(--borda-campo);border-radius:50%;flex:none}
.cknavl a.on i{background:var(--acao);border-color:var(--acao)}
.cknavl a.mau i{border-color:var(--erro-texto);background:var(--erro-texto)}
.cknavl a.mau b{color:var(--erro-texto)}
/* a caixa de contexto sob o índice (10/09, 7a e 7b): resumo em 186px, com quebra por caractere —
   formulário não cabe aqui, e o de verdade fica no meio, ancorado */
.cknavcx{margin-top:10px;padding:9px 10px;border:1px solid var(--borda-cartao);border-radius:var(--raio-p);
  font:400 var(--t2)/1.45 var(--fonte);color:var(--secundario);overflow-wrap:anywhere}
.cknavcx p{margin:0 0 2px}.cknavcx b{color:var(--texto)}
.cknavcxr{font:700 var(--t1) var(--fonte);letter-spacing:.07em;color:var(--secundario);margin:0 0 4px}
/* a VERIFICAÇÃO (10/09, 7a-15/7b-7): a mesma régua nos dois lados, o mesmo vocabulário de bolinha */
.verif{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}
.verif li{display:flex;align-items:flex-start;gap:8px;font:400 var(--t3)/1.4 var(--fonte);color:var(--texto)}
.verif li i{width:10px;height:10px;border-radius:50%;flex:none;margin-top:5px;border:1.5px solid var(--borda-campo)}
.verif li.vfok i{background:var(--ok-texto);border-color:var(--ok-texto)}
.verif li.vfav i{background:var(--cuidado-texto);border-color:var(--cuidado-texto)}
.verif li.vftr i{background:var(--erro-texto);border-color:var(--erro-texto)}
.verif li.vftr{color:var(--erro-texto);font-weight:600}
.verif li.vfav{color:var(--cuidado-texto)}
.verif li a{color:inherit}
/* a barra fixa do EDITOR (10/09; era local em proposta.js desde 19/08): quem digita precisa da saída à
   vista. Abaixo de 980px sobe acima da barra de navegação do app — a mesma régua de .lsbar.tem */
.barra{position:sticky;bottom:0;z-index:5;display:flex;justify-content:flex-end;align-items:center;gap:10px;flex-wrap:wrap;
  margin:12px 0 0;padding:10px 14px;background:var(--superficie);border:1px solid var(--borda-cartao);
  border-radius:var(--raio);box-shadow:var(--sombra)}
.barra .b-perigo{margin-right:auto}
@media(max-width:980px){ .barra{bottom:calc(64px + env(safe-area-inset-bottom))} }
.cknavout{display:block;margin-top:10px;padding:9px 10px;border:1px dashed var(--borda-campo);
  border-radius:var(--raio-p);font:400 var(--t2)/1.45 var(--fonte);color:var(--secundario);text-decoration:none}
.cknavout:hover{border-color:var(--acao);color:var(--acao)}
.ckdir{display:flex;flex-direction:column;gap:10px}
.ckdir .bl{margin:0}
.ckia .b-secundario{margin-top:6px}
/* ⚠️ A coluna direita gruda, mas se ela for MAIS ALTA que a janela o sticky trava e o fim dela fica
   inalcancavel. Teto de altura com rolagem propria resolve sem tirar o grude. */
.cknav,.ckdir{max-height:calc(100vh - 24px);overflow-y:auto}
.ckfila{display:flex;flex-wrap:wrap;align-items:center;gap:10px;justify-content:space-between;
  margin:16px 0 0;padding:11px 13px;border-top:1px solid var(--borda);background:var(--fundo-suave);
  border-radius:var(--raio-p)}
.ckfilart{font:400 var(--t3) var(--fonte);color:var(--secundario)}
.ckfilabt{display:flex;gap:8px;align-items:center}
/* ⚠️ ATE 1180px a decisao vira a PRIMEIRA coisa da pagina (order:-1), e nao a ultima: no celular
   quem abre um negocio quer saber o que fazer, e rolar ate o fim para achar isso e o defeito que
   esta coluna existe para consertar. O indice vira uma fileira de atalhos no topo. */
/* .cktopo: a coluna fora da grade (celular, NAV-04) — nem sticky nem rolagem propria */
.ckdir.cktopo{position:static;max-height:none;overflow:visible;margin:0 0 12px}
@media(max-width:1180px){
  .cockpit{grid-template-columns:1fr}
  .cknav,.ckdir{position:static;max-height:none;overflow:visible}
  .ckdir{order:-1}
  .cknav{order:-2}
  .cknavl{flex-direction:row;flex-wrap:wrap;gap:5px}
  .cknavl a{border:1px solid var(--borda-campo);min-height:36px}
  .cknavout{display:inline-block;margin-top:8px}
}
@media (pointer:coarse){ .cknavl a{min-height:44px} }
/* ATENCAO — AS CAIXAS FICARAM BRANCAS EM 17/08/2026, e a regra e do Dash, com as palavras dele: "a
   caixa e branca e so o vencido fica vermelho" (passada minimalista parte 3, sobre o proximo
   follow-up), e no cartao "a unica cor e a barra vermelha a esquerda quando pede acao".
   Medido antes de mexer: as tres classes pintavam um bloco inteiro, e o dono fotografou justamente uma
   tela com duas delas empilhadas. rgb(238,244,255) para "informacao" e um bloco colorido na tela — o
   meu proprio medidor deixou passar porque usava media de canais, e isso esta registrado la.
   ATENCAO — A COR NAO DESAPARECEU, MUDOU DE LUGAR: virou uma BARRA de 3px a esquerda mais o texto em
   negrito na cor da familia. O que pede acao continua sendo a coisa mais visivel da tela; o que apenas
   informa para de gritar. Antes, o alarme de follow-up ausente e a declaracao de que nao ha proposta
   tinham o MESMO peso visual — e o primeiro e trabalho enquanto o segundo e so um fato.
   ATENCAO — NENHUMA FRASE DA INTERFACE APARECE CITADA NESTE COMENTARIO, e a regra tem preco medido:
   comentario de CSS VIAJA NO HTML, entao uma frase entre aspas aqui e encontrada por qualquer assercao
   que procure aquela frase no corpo da pagina. Aconteceu em 17/08 — a bateria do cliente passou a achar
   o alarme de follow-up em TODA tela e reprovou produto correto. Descrever o elemento, nunca cita-lo.
   ATENCAO — 'border-left' e nao 'box-shadow': a impressao do documento do cliente descarta sombra e
   mantem borda, e o @media print deste produto ja conta com isso. */
.aviso{background:var(--superficie);border:1px solid var(--borda-cartao);border-left-width:3px}
.aviso.erro{border-left-color:var(--erro-borda);color:var(--erro-texto)}
.aviso.ok{border-left-color:var(--ok-borda);color:var(--ok-texto)}
.aviso.info{border-left-color:#8fa8cc;color:var(--texto)}
.note{color:var(--secundario)}
.vazio{color:var(--secundario)}
input,select{min-height:44px;min-width:0}

/* -------------------------------------------------------------------------------------------------
   ATENCAO — TAMANHO DE ALVO SE DECIDE PELO DEDO, NAO PELA LARGURA DA JANELA (13/08/2026, rodada 3).
   (sem crases aqui dentro: isto vive num template literal, e crase fecha a string — armadilha nº 2
   deste projeto, que acabou de custar mais um deploy abortado enquanto eu escrevia este bloco)
   Todo o conserto de alvo da rodada 2 morava dentro do @media (max-width:640px) — e o formato
   celular-deitado (812x375), que o aparato passou a fotografar nesta rodada, mostrou o preco disso
   na hora: o MESMO iPhone, virado de lado, tem 812 px de largura, cai fora da faixa e recebe
   tratamento de desktop. Medido no relato oficial, nos quatro perfis: menor alvo de 15 px na lista
   de oportunidades, 16 px no 404 e no /sair, 30,8 px na barra de navegacao.
   E literalmente o mesmo defeito de classe que matou o vw da barra de aceite em documento.mjs, um
   arquivo adiante: regra por faixa de largura casa onde voce nao espera.
   A pergunta certa nao e "a janela e estreita?" e sim "quem aponta e um dedo?". pointer:coarse
   responde isso, e hover:none cobre o aparelho que mente sobre o ponteiro.
   O QUE FICA NA FAIXA DE LARGURA, e fica certo: a virada de TABELA EM CARTAO. Aquilo e sobre caber,
   nao sobre tocar — com 812 px a tabela cabe e o cartao seria desperdicio de tela.
   ------------------------------------------------------------------------------------------------- */
a.toque{min-height:24px;display:inline-flex;align-items:center}
a.abre{color:var(--marinho);font-weight:600;display:inline-flex;align-items:center;gap:5px;min-height:26px}
a.abre:hover{color:var(--acao)}
a.abre i{font-style:normal;color:var(--acao);font-weight:400}
/* ⚠️⚠️ CAMPO DE DATA/HORA NÃO PODE ESTOURAR A TELA. O Safari do iPhone dá a eles uma largura
   MÍNIMA INTRÍNSECA e não os deixa encolher; o Chromium deixa — então um layout que cabe no
   emulador rola de lado no aparelho de verdade, com o conteúdo cortado à esquerda. São 15 campos
   assim em 4 arquivos; a regra mora aqui para que o próximo já nasça certo. */
input[type=date],input[type=time],input[type=datetime-local],input[type=month]{
  min-width:0;max-width:100%;box-sizing:border-box}

@media (pointer:coarse),(hover:none){
  nav.nav a{min-height:44px;min-width:44px}
  .ic{width:44px;height:44px} .ic svg{width:20px;height:20px}
  input,select{font-size:var(--t5)}
  a.toque{min-height:44px}
  a.abre{min-height:44px;min-width:44px;justify-content:flex-start}
  .rolar table a.toque{min-width:44px}
  table.opo td.prop a{min-height:44px;min-width:44px;display:inline-flex;align-items:center}
}
@media (max-width:640px){
  .wrap{padding:10px;padding-bottom:calc(10px + env(safe-area-inset-bottom))} .card{padding:11px;border-radius:var(--raio)}
  /* ATENCAO — row-gap pequeno e column-gap normal: o gap de 8px declarado acima valia para os DOIS
     eixos, entao cada fileira nova da barra custava 8 px de brinde. No celular a barra tem duas
     fileiras de proposito; a distancia entre elas ja e dada pelo traco fino do nav.
     (e NAO ha crase neste comentario: ele vive dentro de um template literal, e crase fecha a
     string — armadilha no 1 deste projeto, que acabou de abortar mais um deploy, o quarto, escrito
     por mim no comentario ao lado do que avisa sobre ela) */
  .top{padding:5px 10px;column-gap:8px;row-gap:2px;padding-left:calc(10px + env(safe-area-inset-left))}
  /* ATENCAO — padding ZERO: o carimbo virou fileira do '.top' em 17/08 e herda o padding da barra.
     Manter os 4px/10px daqui somaria recuo dentro de recuo e o texto sairia desalinhado do resto da
     barra — o defeito visivel de mover um bloco sem varrer as regras que o enderecavam. */
  /* 07/09: o carimbo virou chip (regras acima, valem nos dois formatos) — a fileira de largura inteira do celular saiu */
  .kpi div{flex:1 1 100%} .kpi b{font-size:var(--t6)}
  /* A PALAVRA "VISO.CRM" SAI POR font-size, NUNCA POR display (regra do Dash, 30/07). Aqui nada é
     escondido por perfil no CSS — a permissao e conferida no SERVIDOR e o link simplesmente nao e
     emitido — e e exatamente por isso que display fica reservado: no dia em que alguem precisar de
     uma regra por perfil, ela nao vai colidir com uma regra de largura de tela. No Dash a colisao
     dessas duas foi como um vendedor passou a ver Admin.
     O logotipo ja traz a palavra VISO, entao no celular o texto e repeticao que custa 74 px da
     unica fileira em que 355 px tem de acomodar quem sou eu e as duas acoes de conta. */
  .marca b{font-size:0;letter-spacing:0} .marca{gap:0}
  /* nav vai para a SEGUNDA fileira (order), com os tres destinos em rotulo de texto e SEM icone:
     o Dash mediu que somar icone ao rotulo dobrava a altura do menu no celular (117 -> 285 px).
     Aqui nao ha icone nenhum no nav para esconder — os dois unicos icones da casca sao os botoes
     de conta, que sao so-icone nos tres formatos e portanto nao somam altura a nada. */
  nav.nav{order:9;width:100%;margin-left:0;gap:0;justify-content:space-between;border-top:1px solid var(--borda-fina);padding-top:1px}
  /* as regras de ALVO que moravam aqui subiram para o bloco pointer:coarse (ver o comentario acima).
     Deixa-las duplicadas nos dois lugares e como as duas passam a divergir. */
  .card form label{flex-wrap:wrap} .card form label>span{width:auto!important;flex:1 1 100%}

  table.opo thead{display:none}
  table.opo,table.opo tbody,table.opo tr,table.opo td{display:block;width:auto}
  table.opo tr{border:1px solid var(--borda-cartao);border-radius:var(--raio-p);padding:9px 11px;margin:0 0 9px;background:var(--superficie)}
  table.opo tr:hover td{background:none}
  table.opo td{border:0;padding:1px 0;text-align:left}
  table.opo td.num{text-align:left}
  table.opo td:empty{display:none}
  table.opo td[data-r]::before{content:attr(data-r);color:var(--secundario);font-size:var(--t2);
    text-transform:uppercase;letter-spacing:.02em;margin-right:6px}
  table.opo td.cli{font-size:var(--t5);font-weight:700;color:var(--marinho);word-break:break-word;margin-bottom:2px}
  table.opo td.cli::before{content:none}
  table.opo td.val{font-size:var(--t5);font-weight:700;margin-top:2px}
  table.opo td.chip{display:inline-block;margin:2px 10px 0 0;font-size:var(--t2);color:var(--secundario)}
  table.opo td.prop{display:inline-block;margin-right:10px}
  /* NAV-02 / LAY-03 da revisão (06/09, aprovadas) — O CARTÃO DE TRÊS LINHAS. É SÓ DA LISTA (table.opo.lst): a folha
     genérica acima serve as outras tabelas da casa (clientes, cliente, propostas, emissão…) e continua
     como estava. Esta reescreve por cima, propriedade a propriedade, para a lista: a folha anterior fazia cada célula um bloco de 100% e repetia os SEIS rótulos
     das colunas em cada linha — o cabeçalho da tabela copiado 113 vezes, 270–300px por cartão, zero
     oportunidades na primeira dobra a 390px. Agora a linha é um flex que EMBRULHA em três fileiras:
       1. cliente (nome + etapa · rep, uma linha cada, com reticência)   [marcas à direita]
       2. próx. tarefa · há N d · valor · proposta rN · score
       3. só aparece quando há gesto além de Detalhes (raro) — Detalhes some: o nome já abre a ficha.
     Rótulo nenhum: nenhum dos seis números precisa de um. A ordem é a do desenho (order), não a do DOM. */
    table.opo.lst tr{display:flex;flex-wrap:wrap;align-items:center;column-gap:8px;row-gap:3px;
    border:1px solid var(--borda-cartao);border-radius:var(--raio-p);padding:8px 11px;margin:0 0 6px;background:var(--superficie)}
  table.opo.lst tr:hover td{background:none}
  table.opo.lst td{display:block;border:0;padding:0;text-align:left;width:auto;white-space:nowrap}
  table.opo.lst td:empty{display:none}
  table.opo.lst td[data-r]::before{content:none}
  /* o cliente ocupa a linha INTEIRA menos as marcas (2 alvos de 40px + folga): com flex-basis 0 a
     data e o "há N d" subiam para a linha do nome e o nome encolhia a 90px — medido a 390px. */
  /* 176px = score (24) + caixa de seleção e duas marcas (114) + folgas — medido a 390px com a caixa (nota 7) */
  table.opo.lst td.cli{order:1;flex:1 0 calc(100% - 176px);min-width:0;white-space:normal;margin:0;font-size:inherit;font-weight:400}
  /* o SCORE sobe para a linha 1, entre o nome e as marcas: é o sinal mais forte da linha e era o único
     item que não cabia na fileira de números (medido: 11 de 20 cartões quebravam só por ele). */
  table.opo.lst td.num.chip:not(.dds){order:2;flex:none;margin-left:auto}
  /* o <a> cobre nome + etapa·rep (33px) e ganha 6px de padding por lado com margem negativa: alvo de
     45px (p51, dedo) sem acrescentar um pixel ao cartão. */
  table.opo.lst td.cli{position:relative}
  table.opo.lst td.cli a.abre{display:block;padding:6px 0;margin:-6px 0;min-height:0;color:var(--marinho)}
  /* NAV-08: o "cliente ›" no pé da célula, alvo de 44px pelo mesmo padding negativo; a etapa cede o canto */
  table.opo.lst td.cli .clisub{padding-right:66px}
  table.opo.lst td.cli .clilnk{position:absolute;right:0;bottom:-14px;padding:16px 8px;font:600 var(--t1) var(--fonte);color:var(--acao);text-decoration:none}
  table.opo.lst td.cli .nome{display:block;font-size:var(--t4);font-weight:700;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  table.opo.lst td.cli a i{display:none}
  table.opo.lst td.cli .clisub{display:block;font-size:var(--t2);line-height:1.3;color:var(--secundario);font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  table.opo.lst td.mk{order:3;flex:none;margin:0}
  /* margin:0 — a genérica dá 2px 10px aos chips e 2px ao valor; somados ao gap, estouravam a fileira. */
  table.opo.lst td.chip,table.opo.lst td.dds,table.opo.lst td.val,table.opo.lst td.prop{order:4;flex:none;margin:0;font-size:var(--t2);color:var(--secundario)}
  table.opo.lst td.dds::before{content:'há ';color:var(--secundario);text-transform:none;letter-spacing:0;margin:0;font-size:var(--t2)}
  table.opo.lst td.dds b::after{content:' d'}
  table.opo.lst td.val{font-size:var(--t3);font-weight:700;color:var(--texto)}
  table.opo.lst td.prop .propsub{display:inline;margin-left:3px;font-size:var(--t1)}
  table.opo.lst td.prop .propsub:empty{display:none}
  table.opo.lst td.prop .propsub::before{content:'· '}
  /* o link da proposta (#25567) abre OUTRO destino que o cartão; alvo de 44 pelo mesmo padding negativo. */
  table.opo.lst td.prop a{display:inline-flex;align-items:center;min-height:0;min-width:44px;padding:14px 0;margin:-14px 0}
  table.opo.lst td.det{order:5;flex:none;margin-left:auto}
  table.opo.lst td.det .det1{display:none}
  table.opo.lst td.det .dact:not(:has(:not(.det1))){display:none}
}

/* -------------------------------------------------------------------------------------------------
   TELA BAIXA (celular DEITADO) — a reprovacao que ninguem tinha visto, rodada 2 dos pedacos 2+3.
   (sem crases neste comentario: ele vive num template literal, e crase fecha a string — armadilha
   no 1 deste projeto, QUATRO deploys derrubados, duas delas no comentario que avisa sobre ela)

   A regua do master e MOLDURA <= 20% da primeira dobra. Deitado, o iPhone tem 375 px de ALTURA, e
   entao 20% sao 75 px. Medido antes: casca de 81 px = 21,6% — a LISTA reprovava sem que nenhum
   criterio anterior enxergasse, porque a lista nao tem nem trilha de volta nem declaracao de
   ausencia: os 81 px sao a casca inteira, sozinha.
   Os 81 px eram 55 de barra (44 do alvo de toque + 5+5 de padding + borda) + 26 de carimbo.
   O que este bloco corta e SO ESPACO EM BRANCO: padding da barra 5 -> 2, padding do carimbo 3 -> 1.
   O alvo de 44 px NAO e tocado (seria trocar uma reprovacao por outra) e a fonte NAO e reduzida
   (o master avisou que percentual sozinho se manipula encolhendo fonte, e o piso agora e 12 px).
   Resultado medido: 49 + 20 = 69 px = 18,4% da dobra deitada.

   ⚠️ A REGRA E POR max-height, NAO por faixa de largura nem por orientation. Faixa de largura e a
   armadilha no 5 do projeto (tres aparicoes: o mesmo iPhone deitado tem 812 px e cai no tratamento
   de desktop). E orientation:landscape pegaria tambem o tablet deitado, que tem 768 px de altura e
   nao tem problema nenhum de dobra. Quem manda aqui e a ALTURA disponivel, que e a grandeza que a
   regua mede.
   ------------------------------------------------------------------------------------------------- */
@media (max-height:480px){
  /* ATENCAO — o padding-left com env() e REPETIDO aqui de proposito: declarar padding de atalho
     zera o padding-left que o bloco de celular define com safe-area-inset-left, e um celular
     PEQUENO deitado (568x320) casa nos dois blocos ao mesmo tempo. Sem esta linha, o notch comeria
     o botao de voltar exatamente no formato que este bloco existe para consertar. */
  .top{padding:2px 14px;padding-left:calc(14px + env(safe-area-inset-left))}
  /* ATENCAO — padding ZERO, mesma razao da regra irma acima: o carimbo e fileira do '.top' desde 17/08
     e a barra ja aplica o recuo, inclusive o env(safe-area-inset-left) do iPhone. */
  .carimbo{padding:0}
  /* ATENCAO — O SELO DEITA EM UMA LINHA, e isto e margem de seguranca medida, nao enfeite.
     Em pe o selo tem duas linhas empilhadas (nome / perfil + recorte) e o recorte mais longo que o
     app produz — "vê só a carteira Gustavo Morette" e "sem carteira cadastrada — nao ve negocio
     nenhum" — quebra em tres linhas: 3 x 15 px = 45 px, que passa dos 44 px do alvo de toque e faz
     a barra crescer. Medido: 49 px de barra com selo curto, 50,6 px com o longo, e a QUARTA linha
     levaria a 79 px — acima dos 75 px que os 20% de 375 permitem. Deitado ha 812 px de largura
     sobrando, entao as duas partes cabem lado a lado e a fileira volta a ser uma.
     ⚠️ O TEXTO NAO E TRUNCADO E A FONTE NAO E REDUZIDA. O recorte do selo e o que responde "esta
     sessao e de um gerente ou de um representante com escopo furado?", e um recorte cortado ao meio
     responde a pergunta errada — e por isso que ele nunca ganha ellipsis. */
  .eu{flex-direction:row;align-items:baseline;gap:6px;text-align:right;justify-content:flex-end}
  /* ATENCAO — ESTA LINHA E O CONSERTO DE UMA REGRESSAO QUE EU MESMO CRIEI NESTA PECA, e ela esta
     aqui com o numero que a paga.
     O quarto destino do menu ("meu dia") custa ZERO px em pe e no desktop — medido por remocao do
     proprio elemento no DOM renderizado (gauntlet/p4-custo-nav.mjs): 104,6 -> 104,6 e 43,8 -> 43,8.
     DEITADO ele custava, porque nesta faixa o nav NAO vai para fileira propria (isso e regra de
     max-width:640px, e o iPhone deitado tem 812 px de largura): os quatro rotulos comiam 355 px da
     unica fileira e empurravam o SELO para mais uma linha. Medido: barra de 49 -> 65 px na lista e
     de 50 -> 80 px na ficha.
     O QUE ESTA LINHA FAZ, e o que ela NAO faz: ela impede a QUEBRA DE LINHA do recorte, e nada
     mais. Nao ha overflow:hidden, nao ha text-overflow, nao ha ellipsis, nao ha fonte menor — a
     proibicao escrita seis linhas acima continua valendo inteira, e ela e sobre TRUNCAR. Conferido
     no renderizado, nos dois tamanhos de celular deitado (812x375 e 568x320): scrollWidth do selo
     igual ao clientWidth em todas as telas, ou seja o texto CABE em uma linha e nao vaza nada.
     Resultado, com o quarto destino ja incluido: lista 84,2 -> 68,2 px (22,4% -> 18,2% da dobra) e
     ficha 99,2 -> 68,2 px (26,5% -> 18,2%). Os dois ficam abaixo do que estavam ANTES desta peca
     (68,2 e 69,2), entao o destino novo sai de graca nos tres formatos. */
  /* ------------------------------------------------------------------------------------------------
     ATENCAO — O white-space:nowrap QUE MORAVA AQUI FOI REMOVIDO, e ele e a CAUSA da divida P4-02.
     (e NAO ha crase em lugar nenhum deste comentario: ele vive num template literal, e crase fecha a
     string — armadilha no 1 do projeto, que acabou de abortar o QUINTO deploy, este escrito por mim
     dentro do bloco que conserta a casca)
     O comentario logo acima dizia, com razao, que ele nao truncava nada e so impedia a quebra de
     linha do recorte. O que ninguem mediu na epoca: com .eu{flex:1 1 0;min-width:0} na regra base,
     impedir a quebra de linha nao encolhe o selo — faz o texto VAZAR para fora da caixa, para a
     esquerda, por cima do nav. E como o selo vem depois do nav no DOM, era ELE quem recebia o toque.
     Medido por mim no renderizado (gauntlet/p5-barra.mjs), 12 combinacoes, nome curto e longo:
       ANTES  — 4 de 12 com algum item de menu MORTO (o item que morre muda com o nome:
                "emitidas", "montar proposta" e "oportunidades" aparecem em combinacoes diferentes)
       DEPOIS — 0 de 12.
     E o preco, medido no mesmo instante nas mesmas 12: desktop e celular em pe NAO mudam nada
     (43,8 e 104,6-135,3 px, identicos ao byte). Deitado a barra vai de 49 para 50 px com nome curto
     e de 67,5 para 80 px com nome longo — a pior combinacao passa de 18,0% para 21,3% da dobra
     deitada. Barra 12 px mais alta contra um menu que nao navega nao e escolha dificil: menu que nao
     navega e controle que MENTE, e a regua da casa diz que botao que nao cumpre e pior que ausente.
     ⚠️ A PROIBICAO DE TRUNCAR CONTINUA INTEIRA: nao ha overflow:hidden, nao ha text-overflow, nao ha
     ellipsis e nao ha fonte menor. O recorte quebra linha DENTRO do selo, que e o que a versao em pe
     ja fazia — conferido no renderizado: scrollWidth igual ao clientWidth em 12 de 12.
     ------------------------------------------------------------------------------------------------ */
  /* ------------------------------------------------------------------------------------------------
     ATENCAO — ESTA LINHA PAGA A DIVIDA P4-02, E ELA E O UNICO DEFEITO DE SEGURANCA DE USO QUE A PECA
     4 deixou na casca: o selo transbordava por cima do menu no celular DEITADO e comia o toque. O
     master mediu 12 de 12 combinacoes com ALGUM item do menu morto, e QUAL item morria mudava com o
     tamanho do nome da pessoa — que e a razao de o defeito ter atravessado uma rodada se dizendo
     consertado (foi medido com um nome so).

     A MECANICA, e ela e inteiramente explicada pelas tres linhas acima deste bloco:
       .eu tem flex:1 1 0 e min-width:0 (regra base), ou seja ele PODE encolher abaixo do conteudo;
       .eu>span tem white-space:nowrap (a linha logo acima), ou seja o conteudo NAO encolhe.
     Caixa menor que conteudo com overflow visible = o texto VAZA. Como .eu tem text-align:right e
     justify-content:flex-end, ele vaza PARA A ESQUERDA, exatamente por cima do nav — e como .eu vem
     DEPOIS do nav no DOM, e ele quem recebe o toque naquela area.

     O QUE ESTA LINHA FAZ: devolve o minimo automatico do item flex (min-content). Com ele, .eu nao
     cabe menor que o proprio texto, e o .top (que ja tem flex-wrap:wrap) manda o selo para a segunda
     fileira em vez de deixa-lo vazar. Sobreposicao impossivel por construcao, e nao por z-index.

     O QUE ELA NAO FAZ, e a proibicao escrita 20 linhas acima continua valendo inteira: NAO ha
     overflow:hidden, NAO ha text-overflow, NAO ha ellipsis e NAO ha fonte menor. O recorte do selo
     ("ve so a carteira X" contra "ve a empresa toda") continua legivel por inteiro — ele responde se
     a sessao e de um gerente ou de um representante com escopo furado, e um recorte cortado ao meio
     responde a pergunta errada.

     O QUE ELA CUSTA, DECLARADO: no pior caso (nome longo + recorte longo) a barra volta a ter duas
     fileiras no deitado, e a moldura sobe. Preferir a barra mais alta ao menu morto nao e escolha de
     gosto: um menu que nao navega e um controle que MENTE, e a regua desta casa diz que botao que
     nao cumpre e pior que botao ausente. Os numeros medidos estao no relato desta peca.
     ------------------------------------------------------------------------------------------------ */
  .eu{min-width:auto}
}



.side{position:fixed;top:0;left:0;bottom:0;width:240px;z-index:7;box-sizing:border-box;
  background:#0D1E37;border-right:1px solid rgba(255,255,255,.08);
  overflow-y:auto;overscroll-behavior:contain;padding:12px 8px 16px;display:flex;flex-direction:column;gap:2px}
.snav{display:flex;flex-direction:column;gap:2px}
.sgrp{margin-top:12px} .sgrp:first-child{margin-top:2px}

.sgrp h2{font-size:var(--t1);font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#7E97C0;
  margin:0 0 4px;padding:0 10px;white-space:nowrap;overflow:hidden}

details.sgrp>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:6px;
  min-height:var(--alvo);padding:0 10px;border-radius:4px;
  font-size:var(--t1);font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#7E97C0;
  white-space:nowrap;overflow:hidden}
details.sgrp>summary::-webkit-details-marker{display:none}
details.sgrp>summary:hover{background:rgba(255,255,255,.06);color:#B4C5DE}
details.sgrp>summary::after{content:'▸';margin-left:auto;font-size:var(--t1);letter-spacing:0;
  transition:transform .12s cubic-bezier(.2,0,0,1)}
details.sgrp[open]>summary::after{content:'▾'}

.sgn{font-size:var(--t1);font-weight:700;letter-spacing:0;color:#7E97C0;opacity:.8}
details.sgrp[open]>summary .sgn{display:none}


.sitem{display:flex;align-items:center;gap:11px;padding:9px 12px;border-radius:4px;color:#B4C5DE;
  font-weight:500;font-size:var(--t3);text-decoration:none;white-space:nowrap;min-height:var(--alvo);
  overflow:hidden;border-left:2px solid transparent;transition:background .12s cubic-bezier(.2,0,0,1),color .12s cubic-bezier(.2,0,0,1)}
.sitem svg{width:20px;height:20px;flex:0 0 20px;color:currentColor;opacity:.85}
.sitem:hover{background:rgba(255,255,255,.06);color:#fff;text-decoration:none}
.sitem:hover svg{opacity:1}

.sitem.aqui{background:rgba(77,213,255,.12);color:#fff;border-left-color:#4DD5FF}
.sitem.aqui svg{color:#4DD5FF;opacity:1}
.sitem:focus-visible{box-shadow:var(--anel-foco)}

.scol{margin:auto 0 0} .scol button{display:flex;align-items:center;gap:11px;width:100%;padding:9px 12px;
  border:0;background:none;border-radius:4px;color:#7E97C0;font:600 var(--t3) var(--fonte);cursor:pointer;min-height:var(--alvo)}
.scol button:hover{background:rgba(255,255,255,.06);color:#B4C5DE}
.scol svg{width:20px;height:20px;flex:0 0 20px}
.burger,.ladobackdrop,.ladochk{display:none}

:root{--larg-menu:240px}
.top,.wrap{margin-left:var(--larg-menu)}

@media (min-width:760px){
  :root[data-lado=fechado] .side{width:64px}
  :root[data-lado=fechado] .sitem span,:root[data-lado=fechado] .sgrp h2,:root[data-lado=fechado] .scol span{display:none}
  :root[data-lado=fechado] .sitem,:root[data-lado=fechado] .scol button{justify-content:center;gap:0;padding-left:0;padding-right:0}
  
  :root[data-lado=fechado] .sgrp+.sgrp{border-top:1px solid rgba(255,255,255,.10);margin-top:6px;padding-top:6px}
  :root[data-lado=fechado] .sitem svg{width:22px;height:22px;flex-basis:22px;opacity:.95}
  :root[data-lado=fechado]{--larg-menu:64px}
  :root[data-lado=fechado] .top,:root[data-lado=fechado] .wrap{margin-left:var(--larg-menu)}
}
:root[data-lado=sem]{--larg-menu:0px}
:root[data-lado=sem] .top,:root[data-lado=sem] .wrap{margin-left:var(--larg-menu)}

@media (max-width:759px){
  .side{transform:translateX(-100%);width:250px;box-shadow:0 12px 28px rgba(13,30,55,.32);
    transition:transform .2s cubic-bezier(.2,0,0,1)}
  .ladochk:checked ~ .side{transform:translateX(0)}
  .ladochk:checked ~ .ladobackdrop{display:block;position:fixed;inset:0;background:rgba(13,30,55,.6);z-index:6}
  
  :root{--larg-menu:0px}
  .top,.wrap{margin-left:var(--larg-menu)}
  /* ⚠️ 25/08 (auditoria): "Recolher" só existe no desktop (data-lado, @media min-width:760px). No
     celular ele gravava cookie e recarregava sem mudar nada — e deixava o desktop recolhido na próxima
     sessão. Some no mobile. */
  .scol{display:none}
  /* ⚠️ 27/08 — o ☰ SOME no celular: a barra de baixo tem "Menu" e abre a MESMA gaveta (o mesmo
     checkbox). Dois controles para o mesmo lugar na mesma tela, e este ficava no canto mais longe
     do polegar. Ele continua no HTML e continua válido — só não é pintado onde há a barra. */
  .burger{display:none}
}
@media (prefers-reduced-motion:reduce){ .side{transition:none} }
@media (pointer:coarse),(hover:none){ .sitem,.scol button{min-height:44px} }

.bxbar{display:none}
@media (max-width:759px){
  
  .bxbar{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);position:fixed;left:0;right:0;bottom:0;
    z-index:6;background:var(--superficie);border-top:1px solid var(--borda-cartao);
    padding-bottom:env(safe-area-inset-bottom)}
  .bxi{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    min-height:54px;padding:7px 2px 8px;text-decoration:none;color:var(--secundario);
    font-size:var(--t1);font-weight:700;letter-spacing:.01em;cursor:pointer;-webkit-tap-highlight-color:transparent}
  .bxi svg{width:21px;height:21px}
  .bxi.on{color:var(--acao)}
  .bxi:focus-visible{outline:2px solid var(--acao);outline-offset:-2px}
  /* ⚠️ o respiro embaixo do conteúdo: sem ele a última linha da lista mora atrás da barra */
  .wrap{padding-bottom:calc(64px + env(safe-area-inset-bottom))}
}
@media (max-width:759px) and (display-mode:standalone){ .bxi{min-height:58px} }

/* ⚠️ o número da navegação: pequeno, vermelho, e só existe quando é maior que zero */
.sitem .sbadge{margin-left:auto;background:var(--alerta);color:#fff;border-radius:10px;
  min-width:19px;padding:0 6px;font-size:var(--t1);font-weight:700;line-height:19px;text-align:center;
  font-variant-numeric:tabular-nums}
:root[data-lado=fechado] .sitem .sbadge{position:absolute;top:4px;right:4px;margin:0;
  min-width:16px;padding:0 4px;font-size:var(--t1);line-height:16px}
:root[data-lado=fechado] .sitem{position:relative}
.bxi .bxpt{position:absolute;top:4px;left:50%;margin-left:4px;background:var(--alerta);color:#fff;
  border-radius:6px;min-width:16px;padding:0 4px;font-size:var(--t1);font-weight:700;line-height:16px;
  text-align:center;font-variant-numeric:tabular-nums}
.bxi{position:relative}
/* as famílias info/ok/cuidado/erro/ia moram em TOKENS (app.js, LAY-05 06/09) — valem em toda tela. */