/* ==========================================================================
   SISTEMA VISUAL — Plataforma ConectaOn
   Arquivo unico, CSS escrito a mao. Sem build, sem framework, sem CDN.

   Ordem do arquivo:
     0. Fontes da marca            5. Componentes
     1. Fichas (variaveis)         6. Estados (carregando, vazio, erro, alcada)
     2. Reset e base               7. Celular
     3. Tipografia                 8. Utilitarios
     4. Layout e grade

   ------------------------------------------------------------------------
   A REGRA QUE SEGURA O SISTEMA INTEIRO

     VIOLETA = ACAO. So aparece em coisa que a pessoa clica para fazer algo,
     no link, e no "voce esta aqui". Nunca em aviso, nunca em grafico.
     Se o violeta virar "chamar atencao para qualquer coisa", ele para de
     significar "aperte aqui".

     LARANJA = APOIO. Contador, destaque de ambiente, calor da marca.
     Nunca e o botao principal.

   ------------------------------------------------------------------------
   O QUE MUDOU EM RELACAO A VERSAO ANTERIOR, E POR QUE

   A folha antiga foi construida sobre uma leitura ERRADA da marca: azul
   #1a0a5e com laranja #ff6b35 como cor de acao. A identidade oficial da
   ConectaOn (o mesmo brandbook da epoca da ConectaSaude) e outra:

       #0C0047  roxo escuro   a base, a cor do wordmark
       #A24CFF  violeta       o destaque, a cor "on"
       #E77642  laranja       apoio
       #EFEFEF  cinza claro   fundo
       #D3D3D3  cinza         bordas

   Entao: o roxo escuro virou a base, o VIOLETA virou a acao, e o laranja
   desceu para apoio. Quem procurar --marca-azul e --marca-roxo vai achar:
   ficaram como apelido da cor nova, para nenhuma tela quebrar de repente.

   Sobre os dois cinzas do brandbook: #EFEFEF e #D3D3D3 sao cinzas PUROS,
   sem matiz. Cinza puro encostado num violeta saturado parece defeito de
   monitor — o olho le o cinza como esverdeado. Entao a escala de neutros
   daqui tem a MESMA CLARIDADE desses dois (--n100 e --n300 sao os
   equivalentes) com um vies do matiz 250, que e exatamente o matiz do
   #0C0047. A marca continua sendo obedecida; o que muda e que ela para de
   brigar consigo mesma na tela.
   ========================================================================== */


/* ==========================================================================
   0. FONTES DA MARCA

   O brandbook e literal:
     "A fonte do logotipo e a Inter ExtraBold. Para textos longos,
      utilizar a Poppins."

   Entao o papel de cada uma aqui:
     Inter    -> marca, titulo, numero-heroi. E a letra do wordmark.
     Poppins  -> texto corrido, rotulo, botao, tabela.

   ------------------------------------------------------------------------
   LEIA ISTO ANTES DE PROCURAR BUG DE FONTE

   OS ARQUIVOS .woff2 NAO ESTAO NO REPOSITORIO. Nao foram baixados: esta
   sessao nao tinha autorizacao para baixar arquivo para a maquina, e
   preferimos deixar o buraco a vista a mentir que embutimos.

   Enquanto os arquivos nao existirem, o navegador simplesmente ignora cada
   @font-face que nao carrega e cai sozinho na proxima familia da pilha
   declarada em --fonte-marca / --fonte-texto. O sistema fica bonito e
   legivel; so nao fica com a letra da marca. Nada quebra.

   PARA EMBUTIR DE VERDADE (5 minutos, uma vez so):

     1. Baixe as duas familias. As duas sao SIL Open Font License, o que
        permite hospedar no proprio servidor:
          Inter    https://github.com/rsms/inter/releases   (ou Google Fonts)
          Poppins  https://fonts.google.com/specimen/Poppins
        Se pegar do Google Fonts, o jeito rapido de obter woff2 ja recortado
        no alfabeto latino e abrir a URL da familia com um User-Agent de
        navegador moderno e ler os enderecos .woff2 de dentro do CSS que ele
        devolve.

     2. Renomeie e coloque exatamente nestes nomes, em
        servidor/estatico/fontes/ :
          inter-600.woff2     inter-700.woff2     inter-800.woff2
          poppins-400.woff2   poppins-500.woff2
          poppins-600.woff2   poppins-700.woff2

     3. Pronto. Nao precisa mexer em CSS nenhum: as regras abaixo ja
        apontam para esses caminhos.

   font-display: swap em todas: o texto aparece na hora com a fonte do
   sistema e troca quando a da marca chega. O contrario (texto invisivel
   esperando a fonte) e inaceitavel numa tela de elegibilidade, onde
   alguem pode estar com um paciente na frente.
   ========================================================================== */

@font-face {
  font-family: "Inter ConectaOn";
  src: url("/estatico/fontes/inter-600.woff2") format("woff2");
  font-weight: 600; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Inter ConectaOn";
  src: url("/estatico/fontes/inter-700.woff2") format("woff2");
  font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Inter ConectaOn";
  src: url("/estatico/fontes/inter-800.woff2") format("woff2");
  font-weight: 800; font-style: normal; font-display: swap;
}

@font-face {
  font-family: "Poppins ConectaOn";
  src: url("/estatico/fontes/poppins-400.woff2") format("woff2");
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Poppins ConectaOn";
  src: url("/estatico/fontes/poppins-500.woff2") format("woff2");
  font-weight: 500; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Poppins ConectaOn";
  src: url("/estatico/fontes/poppins-600.woff2") format("woff2");
  font-weight: 600; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "Poppins ConectaOn";
  src: url("/estatico/fontes/poppins-700.woff2") format("woff2");
  font-weight: 700; font-style: normal; font-display: swap;
}


/* ==========================================================================
   1. FICHAS
   ========================================================================== */

:root {

  /* --- cores da marca, cruas e intocadas, direto do brandbook ---------- */
  --marca-roxo-esc:  #0c0047;   /* matiz 250 — a base, o wordmark        */
  --marca-violeta:   #a24cff;   /* matiz 269 — o destaque, a cor "on"    */
  --marca-laranja:   #e77642;   /* matiz  19 — apoio                     */
  --marca-cinza-clr: #efefef;   /* referencia de claridade do brandbook  */
  --marca-cinza:     #d3d3d3;   /* referencia de claridade do brandbook  */

  /* Apelidos da folha antiga. Ficam para nenhuma tela quebrar enquanto a
     equipe atualiza. Sao APELIDO, nao cor nova: nao use em codigo novo.  */
  --marca-azul:     var(--marca-roxo-esc);
  --marca-azul-esc: var(--marca-roxo-esc);
  --marca-roxo:     var(--marca-violeta);
  --marca-roxo-clr: var(--marca-violeta);

  /* --- neutros com vies do roxo escuro da marca ------------------------
     Todos no matiz 250, o mesmo do #0C0047. A saturacao sobe nas pontas
     (perto do branco e perto do preto) porque e ali que a cor desaparece
     se voce nao empurrar. --n100 tem a claridade do #EFEFEF do brandbook
     e --n300 a do #D3D3D3.                                              */
  --n0:    #fcfbff;
  --n25:   #f8f7fd;
  --n50:   #f3f1fa;
  --n100:  #eceaf6;   /* ~ #EFEFEF do brandbook, com matiz              */
  --n200:  #dbd8eb;
  --n300:  #cbc7de;   /* ~ #D3D3D3 do brandbook, com matiz              */
  --n400:  #a19cba;
  --n450:  #8c86a9;
  --n500:  #6e6693;
  --n600:  #565077;
  --n700:  #3d375d;
  --n800:  #292348;
  --n900:  #191334;
  --n950:  #0f0a26;
  --n1000: #08051a;

  /* --- espaco: escala de 4 em 4 ---------------------------------------
     Mais generosa que a anterior. A tela estava apertada: cartao com 20px
     de folga, grade com 16px de respiro e secao com 24px de margem faziam
     tudo encostar em tudo. Aqui o padrao de cartao subiu para 24, a grade
     para 20 e a margem de secao para 32.                                */
  --e1:  0.25rem;   /*  4px */
  --e2:  0.5rem;    /*  8px */
  --e3:  0.75rem;   /* 12px */
  --e4:  1rem;      /* 16px */
  --e5:  1.25rem;   /* 20px */
  --e6:  1.5rem;    /* 24px — folga padrao de cartao                     */
  --e7:  1.75rem;   /* 28px */
  --e8:  2rem;      /* 32px — margem entre secoes                        */
  --e10: 2.5rem;    /* 40px */
  --e12: 3rem;      /* 48px */
  --e14: 3.5rem;    /* 56px */
  --e16: 4rem;      /* 64px */
  --e20: 5rem;      /* 80px — folga de estado vazio, que precisa de ar   */

  /* --- cantos ----------------------------------------------------------
     8px em controle (botao, campo), 12px em cartao e tabela, 16px em
     modal. Abaixo de 8 parece caixa de dialogo de 2009; acima de 16 em
     cartao pequeno o canto come o conteudo.                             */
  --r1: 6px;
  --r2: 8px;
  --r3: 12px;
  --r4: 16px;
  --r5: 20px;
  --r-pilula: 999px;

  /* --- tipografia ------------------------------------------------------
     A primeira familia de cada pilha e a da marca (secao 0). O resto e
     rede de seguranca para quando o .woff2 ainda nao esta no servidor:
       Inter    -> Segoe UI Variable / system-ui sao as mais parecidas
       Poppins  -> Avenir Next (todo Mac) e Century Gothic (vem com o
                   Office, que o RH das clientes tem) sao as geometricas
                   ja instaladas que chegam perto                        */
  --fonte-marca:
    "Inter ConectaOn", "Inter",
    "Segoe UI Variable Display", "Segoe UI",
    system-ui, -apple-system, BlinkMacSystemFont, sans-serif;

  --fonte-texto:
    "Poppins ConectaOn", "Poppins",
    "Avenir Next", "Avenir", "Century Gothic",
    system-ui, -apple-system, BlinkMacSystemFont,
    "Segoe UI Variable Text", "Segoe UI", "Helvetica Neue", Arial, sans-serif;

  /* Numero, CPF, CNPJ, codigo, chave de API, valor em reais.
     Largura fixa por caractere: uma coluna de CPF vira uma coluna reta,
     e o olho acha o digito diferente sem ler o numero todo.             */
  --fonte-numero:
    ui-monospace, "SF Mono", "SFMono-Regular", Menlo,
    "Cascadia Mono", "Cascadia Code", Consolas,
    "Roboto Mono", "DejaVu Sans Mono", monospace;

  --t-xs:   0.75rem;     /* 12px — rotulo em caixa alta, nota de rodape */
  --t-sm:   0.8125rem;   /* 13px — celula de tabela densa, legenda      */
  --t-base: 0.875rem;    /* 14px — PADRAO do sistema                    */
  --t-md:   1rem;        /* 16px — texto corrido, campo no celular      */
  --t-lg:   1.125rem;    /* 18px — subtitulo                            */
  --t-xl:   1.5rem;      /* 24px — titulo de secao                      */
  --t-2xl:  1.875rem;    /* 30px — titulo de pagina                     */
  --t-3xl:  2.5rem;      /* 40px — numero de cartao                     */
  --t-4xl:  3.25rem;     /* 52px — resposta da consulta de elegibilidade*/

  --p-normal: 400;
  --p-medio:  500;
  --p-forte:  600;
  --p-titulo: 700;
  --p-marca:  800;   /* Inter ExtraBold: so no wordmark, como manda o brandbook */

  --lh-titulo: 1.15;
  --lh-densa:  1.4;
  --lh-normal: 1.6;

  --entreletra-titulo: -0.018em;  /* geometrica grande respira melhor apertada */
  --entreletra-marca:  -0.028em;  /* o wordmark e mais fechado ainda           */
  --entreletra-rotulo:  0.07em;   /* caixa alta pequena precisa de ar          */

  /* --- medidas do esqueleto ------------------------------------------- */
  --largura-app:     1480px;
  --largura-leitura: 68ch;   /* texto corrido nunca passa disso           */
  --largura-forma:   34rem;  /* formulario de uma coluna                  */
  --lateral:         272px;
  --lateral-fechada: 76px;
  --topo:            64px;
  --toque:           44px;   /* area minima de toque no celular           */

  /* Duas velocidades. A curta e para cor e borda, que precisam responder
     na hora. A longa e para sombra e deslocamento, que ficam elegantes
     quando chegam um pouquinho depois do dedo.                          */
  --transicao:       150ms cubic-bezier(.4, 0, .2, 1);
  --transicao-lenta: 260ms cubic-bezier(.2, .7, .3, 1);

  color-scheme: light;
}


/* --------------------------------------------------------------------------
   TEMA CLARO — os papeis
   Neutro nao e cor, e funcao. Aqui cada neutro ganha um nome de trabalho.
   Os numeros de contraste ao lado sao medidos, nao chutados.
   -------------------------------------------------------------------------- */
:root {
  --fundo-pagina:   var(--n50);
  --fundo-cartao:   #ffffff;
  --fundo-elevado:  #ffffff;    /* modal, menu suspenso */
  --fundo-sutil:    var(--n50);  /* cabecalho de tabela, area de apoio */
  --fundo-zebra:    #f7f6fc;
  --fundo-hover:    #eeedf8;
  --fundo-marcado:  #f0e5fd;     /* linha selecionada, com tinta do violeta */
  --fundo-desab:    var(--n100);

  --texto:      var(--n900);   /* 17.7:1 no branco */
  --texto-2:    var(--n600);   /*  7.5:1 */
  --texto-3:    var(--n500);   /*  5.3:1 no branco, 4.7:1 no fundo da pagina */
  --texto-desab: var(--n400);
  --texto-inv:  #ffffff;

  --borda:          var(--n200);  /* separador, sem funcao de leitura */
  --borda-forte:    var(--n300);
  --borda-controle: var(--n450);  /* 3.4:1 — contorno de campo e botao */

  /* --- a cor de acao -----------------------------------------------------
     ESTA E A DECISAO MAIS IMPORTANTE DA FOLHA, ENTAO VAI ESCRITA:

     O violeta da marca, #A24CFF, com texto branco por cima da 4.19:1.
     Isso REPROVA no AA para texto pequeno, que exige 4.5:1. Medido, nao
     estimado. Havia tres saidas e escolhemos a primeira:

       (a) escurecer SO O PREENCHIMENTO do botao, mantendo o matiz exato
           269 da marca                                    <- escolhida
       (b) texto escuro sobre o violeta puro
       (c) deixar reprovado

     Por que (a): o botao principal com texto BRANCO e o que a pessoa
     espera de um botao principal — em qualquer produto que ela use fora
     daqui e assim. Violeta claro com texto escuro parece selo desligado,
     nao parece "aperte aqui". E baixar a claridade de 65% para 55%
     mantendo matiz 269 e saturacao 92% nao muda a familia da cor: o
     #8823f6 continua sendo, para o olho, o violeta da ConectaOn.

     O #A24CFF puro nao some: ele fica onde nao precisa carregar texto —
     anel de foco, barra do item ativo do menu, sublinhado de aba, e o
     simbolo da marca, que ja vem violeta no proprio arquivo.            */
  --acao:        var(--marca-violeta);  /* a cor de marca, sem texto por cima */
  --acao-solido: #8823f6;   /* preenchimento de botao — branco da 5.8:1  */
  --acao-hover:  #760aeb;   /* 7.0:1 */
  --acao-ativo:  #6709ce;   /* 8.4:1 */
  --acao-txt:    #7b0df2;   /* violeta como TEXTO: 6.6:1 no branco       */

  --foco: var(--marca-violeta);   /* 4.2:1 no branco, 3.7:1 no fundo da pagina */

  /* Icone de lupa embutido no CSS. Sem CDN, sem arquivo de imagem, sem
     fonte de icone: e um SVG dentro da propria variavel.                */
  --icone-busca: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none' stroke='%236e6693' stroke-width='1.7' stroke-linecap='round'%3E%3Ccircle cx='6.8' cy='6.8' r='4.4'/%3E%3Cpath d='M10.2 10.2 L13.8 13.8'/%3E%3C/svg%3E");

  /* --- sombras em camadas ------------------------------------------------
     Tres camadas em vez de uma. Uma sombra so, dura, e o que faz interface
     parecer de 2014: a borda fica marcada e o objeto parece colado. Com
     camadas (um contato curto e apertado + uma difusa e larga) o cartao
     parece flutuar de leve, que e o efeito que Linear e Stripe usam.

     Todas tingidas do roxo #191334, nunca preto: sombra preta sobre fundo
     roxeado deixa um halo cinza sujo na borda.                          */
  --sombra1:
    0 1px 2px rgba(25, 19, 52, .04),
    0 1px 3px rgba(25, 19, 52, .06);
  --sombra2:
    0 1px 2px rgba(25, 19, 52, .04),
    0 4px 8px rgba(25, 19, 52, .05),
    0 12px 24px rgba(25, 19, 52, .07);
  --sombra3:
    0 2px 4px rgba(25, 19, 52, .05),
    0 12px 24px rgba(25, 19, 52, .09),
    0 32px 64px rgba(25, 19, 52, .13);
  /* Halo de acao: o brilho violeta que o botao principal ganha no hover.
     E o violeta puro da marca aparecendo sem precisar carregar texto.   */
  --halo-acao: 0 0 0 4px rgba(162, 76, 255, .22);

  /* --- familias semanticas ------------------------------------------------
     Quatro papeis por familia:
       -txt     texto e icone sobre a propria tinta
       -fundo   tinta de fundo do selo e do aviso
       -borda   contorno do selo e do aviso
       -solido  preenchimento cheio (botao perigo, barra de progresso)

     A distancia de matiz ate o VIOLETA de acao (269) e o que impede a
     confusao:  sucesso 117 graus, aviso 134, erro 83, info 70, apoio 110.
     O vizinho mais proximo agora e o info (azul 199) — e mesmo ele nunca
     aparece cheio no formato de botao. Selo e sempre tinta clara com
     texto escuro; botao e sempre preenchimento cheio. Formatos
     diferentes, papeis diferentes, sem ambiguidade.                     */

  --ok-txt:    #127848;  --ok-fundo:    #f1fcf6;  --ok-borda:    #a2d7be;  --ok-solido:    #0b7f49;
  --at-txt:    #876103;  --at-fundo:    #fef8e9;  --at-borda:    #e4cb8b;  --at-solido:    #da9e07;
  --erro-txt:  #9e1a2b;  --erro-fundo:  #fdeff1;  --erro-borda:  #e4aab2;  --erro-solido:  #ba1c31;
  --info-txt:  #06638e;  --info-fundo:  #edf8fd;  --info-borda:  #9ac9df;  --info-solido:  #0977aa;
  --acao-fundo: #f6eefe; --acao-borda:  #cbb0e8;
  --neu-txt:   var(--n600); --neu-fundo: var(--n100); --neu-borda: var(--n300); --neu-solido: var(--n500);

  /* Familia de APOIO: o laranja #E77642 do brandbook. Nao e alerta, nao e
     acao. E o calor da marca: contador do menu, ambiente que nao e
     producao, o brilho do fundo da tela de entrada.                     */
  --ap-txt:    #954018;  --ap-fundo:    #fdf0ea;  --ap-borda:    #e5b59e;  --ap-solido:    #b14a1b;

  /* Apelidos da familia "roxo" da folha antiga. Ela virou a familia de
     acao. Apelido, nao cor nova: em codigo novo use --acao-*.           */
  --roxo-txt:    var(--acao-txt);
  --roxo-fundo:  var(--acao-fundo);
  --roxo-borda:  var(--acao-borda);
  --roxo-solido: var(--acao-solido);

  /* Texto que fica POR CIMA do preenchimento cheio. */
  --sobre-ok:      #ffffff;   /* 5.1:1 */
  --sobre-at:      var(--n900);  /* ambar cheio com texto branco e ilegivel */
  --sobre-erro:    #ffffff;   /* 6.4:1 */
  --sobre-info:    #ffffff;   /* 5.0:1 */
  --sobre-acao:    #ffffff;   /* 5.8:1 — ver a decisao la em cima */
  --sobre-apoio:   #ffffff;   /* 5.4:1 */
  --sobre-roxo:    var(--sobre-acao);
  --sobre-laranja: var(--sobre-apoio);
}


/* --------------------------------------------------------------------------
   TEMA ESCURO
   Duas regras que mudam tudo:
   (a) no escuro a hierarquia se inverte: o cartao e MAIS CLARO que a pagina,
       porque sombra nao existe em fundo preto;
   (b) cor saturada em fundo escuro vibra e cansa. Toda tinta de fundo do
       tema escuro e quase preta com o matiz certo, e o texto e que fica claro.
   -------------------------------------------------------------------------- */
@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) { color-scheme: dark; }
}
:root[data-tema="escuro"] { color-scheme: dark; }

@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) {
    --fundo-pagina:   #0c0a18;
    --fundo-cartao:   #141122;
    --fundo-elevado:  #1c182d;
    --fundo-sutil:    #181528;
    --fundo-zebra:    #181625;
    --fundo-hover:    #221e33;
    --fundo-marcado:  #2d1547;
    --fundo-desab:    #1c1a28;

    --texto:      #eae8f3;   /* 15.3:1 no cartao */
    --texto-2:    #b8b5c9;   /*  9.3:1 */
    --texto-3:    #9893ae;   /*  6.3:1 */
    --texto-desab: #6f698c;
    --texto-inv:  var(--n900);

    --borda:          #2b273f;
    --borda-forte:    #3d3857;
    --borda-controle: #655e87;   /* 3.1:1 no cartao */

    /* No escuro o preenchimento pode subir um pouco de claridade sem
       perder o branco por cima: #9031f6 da 5.3:1. O hover NAO clareia
       mais que isso — clarear derruba o contraste do texto branco. Ele
       escurece de leve e ganha o halo violeta, que e o que da a sensacao
       de relevo em fundo escuro.                                        */
    --acao-solido: #9031f6;
    --acao-hover:  #8014f5;
    --acao-ativo:  #6709ce;
    --acao-txt:    #b570ff;   /* 5.9:1 no cartao */

    --foco: var(--marca-violeta);  /* 4.4:1 no cartao */
    --halo-acao: 0 0 0 4px rgba(162, 76, 255, .30);

    --icone-busca: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none' stroke='%239893ae' stroke-width='1.7' stroke-linecap='round'%3E%3Ccircle cx='6.8' cy='6.8' r='4.4'/%3E%3Cpath d='M10.2 10.2 L13.8 13.8'/%3E%3C/svg%3E");

    --sombra1: 0 1px 2px rgba(0,0,0,.5);
    --sombra2: 0 1px 2px rgba(0,0,0,.45), 0 4px 10px rgba(0,0,0,.5), 0 12px 28px rgba(0,0,0,.38);
    --sombra3: 0 2px 6px rgba(0,0,0,.5), 0 14px 32px rgba(0,0,0,.55), 0 36px 72px rgba(0,0,0,.5);

    --ok-txt:    #83e2b6;  --ok-fundo:    #163b2a;  --ok-borda:    #396f56;  --ok-solido:    #28c37a;
    --at-txt:    #f5cd66;  --at-fundo:    #3e3214;  --at-borda:    #796634;  --at-solido:    #f0b319;
    --erro-txt:  #f87788;  --erro-fundo:  #40171c;  --erro-borda:  #7f3942;  --erro-solido:  #d62940;
    --info-txt:  #5cc4f5;  --info-fundo:  #12313f;  --info-borda:  #326076;  --info-solido:  #1399d8;
    --acao-fundo: #2d1547; --acao-borda:  #5b3582;
    --ap-txt:    #f0956a;  --ap-fundo:    #3c2215;  --ap-borda:    #7b4932;  --ap-solido:    #de6b35;
    --neu-txt: #b8b5c9; --neu-fundo: #221e33; --neu-borda: #3d3857; --neu-solido: #655e87;

    --sobre-ok:      var(--n900);
    --sobre-at:      var(--n900);
    --sobre-erro:    #ffffff;
    --sobre-info:    var(--n900);
    --sobre-acao:    #ffffff;
    --sobre-apoio:   var(--n900);
    --sobre-roxo:    var(--sobre-acao);
    --sobre-laranja: var(--sobre-apoio);
  }
}

/* A mesma coisa, forcada pelo atributo. Vem depois para ganhar do @media
   nos dois sentidos: data-tema="escuro" acende o escuro num aparelho claro,
   e data-tema="claro" (la em cima, no :root) volta o claro num aparelho
   escuro. O botao de tema do usuario sempre vence o sistema operacional.  */
:root[data-tema="escuro"] {
  --fundo-pagina:   #0c0a18;
  --fundo-cartao:   #141122;
  --fundo-elevado:  #1c182d;
  --fundo-sutil:    #181528;
  --fundo-zebra:    #181625;
  --fundo-hover:    #221e33;
  --fundo-marcado:  #2d1547;
  --fundo-desab:    #1c1a28;

  --texto:      #eae8f3;
  --texto-2:    #b8b5c9;
  --texto-3:    #9893ae;
  --texto-desab: #6f698c;
  --texto-inv:  var(--n900);

  --borda:          #2b273f;
  --borda-forte:    #3d3857;
  --borda-controle: #655e87;

  --acao-solido: #9031f6;
  --acao-hover:  #8014f5;
  --acao-ativo:  #6709ce;
  --acao-txt:    #b570ff;

  --foco: var(--marca-violeta);
  --halo-acao: 0 0 0 4px rgba(162, 76, 255, .30);

  --icone-busca: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none' stroke='%239893ae' stroke-width='1.7' stroke-linecap='round'%3E%3Ccircle cx='6.8' cy='6.8' r='4.4'/%3E%3Cpath d='M10.2 10.2 L13.8 13.8'/%3E%3C/svg%3E");

  --sombra1: 0 1px 2px rgba(0,0,0,.5);
  --sombra2: 0 1px 2px rgba(0,0,0,.45), 0 4px 10px rgba(0,0,0,.5), 0 12px 28px rgba(0,0,0,.38);
  --sombra3: 0 2px 6px rgba(0,0,0,.5), 0 14px 32px rgba(0,0,0,.55), 0 36px 72px rgba(0,0,0,.5);

  --ok-txt:    #83e2b6;  --ok-fundo:    #163b2a;  --ok-borda:    #396f56;  --ok-solido:    #28c37a;
  --at-txt:    #f5cd66;  --at-fundo:    #3e3214;  --at-borda:    #796634;  --at-solido:    #f0b319;
  --erro-txt:  #f87788;  --erro-fundo:  #40171c;  --erro-borda:  #7f3942;  --erro-solido:  #d62940;
  --info-txt:  #5cc4f5;  --info-fundo:  #12313f;  --info-borda:  #326076;  --info-solido:  #1399d8;
  --acao-fundo: #2d1547; --acao-borda:  #5b3582;
  --ap-txt:    #f0956a;  --ap-fundo:    #3c2215;  --ap-borda:    #7b4932;  --ap-solido:    #de6b35;
  --neu-txt: #b8b5c9; --neu-fundo: #221e33; --neu-borda: #3d3857; --neu-solido: #655e87;

  --sobre-ok:      var(--n900);
  --sobre-at:      var(--n900);
  --sobre-erro:    #ffffff;
  --sobre-info:    var(--n900);
  --sobre-acao:    #ffffff;
  --sobre-apoio:   var(--n900);
  --sobre-roxo:    var(--sobre-acao);
  --sobre-laranja: var(--sobre-apoio);
}


/* ==========================================================================
   2. RESET E BASE
   ========================================================================== */

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  margin: 0;
  background: var(--fundo-pagina);
  color: var(--texto);
  font-family: var(--fonte-texto);
  font-size: var(--t-base);
  line-height: var(--lh-normal);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd { margin: 0; }
ul[class], ol[class] { list-style: none; margin: 0; padding: 0; }
img, svg, video { max-width: 100%; height: auto; display: block; }
button, input, select, textarea { font: inherit; color: inherit; }
table { border-collapse: collapse; border-spacing: 0; }
hr { border: 0; border-top: 1px solid var(--borda); margin: var(--e8) 0; }

a {
  color: var(--acao-txt);
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--transicao);
}
a:hover { text-decoration-thickness: 2px; }

/* --- foco visivel, uma regra so, valendo no sistema inteiro ------------
   :focus-visible e nao :focus. Quem clica com o mouse nao ve o anel;
   quem navega de Tab ve sempre. O anel e desenhado com outline (que
   acompanha o formato do canto) e nao com box-shadow (que some quando o
   elemento esta dentro de um container com overflow escondido).

   O anel usa o #A24CFF PURO. E o lugar em que a cor da marca aparece
   inteira, sem precisar carregar texto por cima.                        */
:focus { outline: none; }
:focus-visible {
  outline: 3px solid var(--foco);
  outline-offset: 2px;
  border-radius: var(--r1);
}

::selection { background: var(--acao-fundo); color: var(--acao-txt); }

/* Pular para o conteudo. Primeiro Tab da pagina, para quem usa teclado
   nao ter que atravessar o menu lateral inteiro toda vez.               */
.pular {
  position: absolute; left: var(--e4); top: -100px; z-index: 100;
  padding: var(--e3) var(--e5);
  background: var(--marca-roxo-esc); color: #fff; font-weight: var(--p-forte);
  border-radius: var(--r2); text-decoration: none;
  box-shadow: var(--sombra3);
  transition: top var(--transicao);
}
.pular:focus { top: var(--e4); }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}


/* ==========================================================================
   3. TIPOGRAFIA

   Titulo em Inter (a fonte do logotipo), texto em Poppins (a fonte de
   texto longo). E o que o brandbook manda, nesta ordem.

   Uma observacao honesta para quem for refinar as telas depois: a Poppins
   e mais larga que a media, e numa tabela de 883 linhas a 13px isso custa
   coluna. Se a operacao reclamar de linha cortada, trocar a familia de
   .tabela para var(--fonte-marca) e UMA linha, e a Inter foi desenhada
   justamente para tamanho pequeno em tela. Nao fizemos isso por conta
   propria porque a fonte de texto do brandbook e a Poppins.
   ========================================================================== */

h1, h2, h3, h4 {
  font-family: var(--fonte-marca);
  font-weight: var(--p-titulo);
  line-height: var(--lh-titulo);
  letter-spacing: var(--entreletra-titulo);
  color: var(--texto);
  text-wrap: balance;
}
h1 { font-size: var(--t-2xl); font-weight: var(--p-marca); }
h2 { font-size: var(--t-xl); }
h3 { font-size: var(--t-lg); font-weight: var(--p-forte); }
h4 { font-size: var(--t-md); font-weight: var(--p-forte); }

.subtitulo {
  color: var(--texto-2);
  font-size: var(--t-md);
  line-height: var(--lh-normal);
  margin-top: var(--e2);
  max-width: var(--largura-leitura);
}

/* Rotulo pequeno em caixa alta. So funciona com entreletra aberta,
   senao as maiusculas colam umas nas outras.                            */
.rotulo {
  font-size: var(--t-xs);
  font-weight: var(--p-forte);
  letter-spacing: var(--entreletra-rotulo);
  text-transform: uppercase;
  color: var(--texto-3);
}

/* Texto corrido nunca passa da largura de leitura. Linha de 200 caracteres
   faz o olho perder onde estava ao voltar para a esquerda.              */
.prosa { max-width: var(--largura-leitura); }
.prosa p + p { margin-top: var(--e5); }

/* --- numeros ------------------------------------------------------------
   .num  -> qualquer numero em coluna: alinha o digito, casa a virgula
   .cod  -> CPF, CNPJ, codigo CON-000712, chave de API, uuid            */
.num {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
.cod {
  font-family: var(--fonte-numero);
  font-variant-numeric: tabular-nums slashed-zero;
  font-feature-settings: "tnum" 1, "zero" 1;
  font-size: 0.95em;   /* monoespacada parece maior que a de texto */
  letter-spacing: 0;
  /* CPF e codigo NUNCA quebram em duas linhas. "048.617.234-" numa linha e
     "05" na outra deixa de ser um numero conferivel e vira duas metades. */
  white-space: nowrap;
}   /* CPF mascarado por alcada */

.dinheiro { font-variant-numeric: tabular-nums; font-weight: var(--p-medio); white-space: nowrap; }
.dinheiro::before { content: "R$ "; color: var(--texto-3); font-weight: var(--p-normal); }

.negativo { color: var(--erro-txt); }


/* ==========================================================================
   4. LAYOUT E GRADE
   ========================================================================== */

/* O esqueleto: menu lateral fixo + area de trabalho.
   grid-template-columns com variavel para o menu colapsar sem JS de layout. */
.app {
  display: grid;
  grid-template-columns: var(--lateral) minmax(0, 1fr);
  min-height: 100vh;
  min-height: 100dvh;
}
.app[data-menu="fechado"] { --lateral: var(--lateral-fechada); }

.area {
  min-width: 0;               /* sem isto a tabela larga estoura a grade */
  display: flex;
  flex-direction: column;
}

.conteudo {
  flex: 1;
  width: 100%;
  max-width: var(--largura-app);
  margin-inline: auto;
  padding: var(--e8);         /* era 24px; o briefing pede respiro */
  padding-bottom: var(--e14); /* o fim da pagina nao encosta na borda */
}

/* Cabecalho da pagina: titulo a esquerda, acoes a direita, quebra no celular */
.pagina-topo {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--e5);
  margin-bottom: var(--e8);
}
.pagina-acoes { display: flex; flex-wrap: wrap; gap: var(--e3); }

/* Grade de conteudo. 12 colunas so quando faz falta; no resto, auto-fit,
   que se resolve sozinha sem media query.                               */
.grade { display: grid; gap: var(--e5); }
.grade-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
.grade-auto { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }
.grade-2 { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); }
.col-4  { grid-column: span 4; }
.col-8  { grid-column: span 8; }
.col-12 { grid-column: span 12; }

.pilha { display: flex; flex-direction: column; gap: var(--e5); }
.linha { display: flex; align-items: center; gap: var(--e3); flex-wrap: wrap; }


/* ==========================================================================
   5. COMPONENTES
   ========================================================================== */

/* --------------------------------------------------------------------------
   5.1 BOTAO

   O primario e o violeta da marca escurecido o suficiente para carregar
   texto branco (a decisao esta escrita por extenso na secao 1, junto de
   --acao-solido). No hover ele escurece mais um degrau e acende o halo
   com o #A24CFF puro: e ali que o violeta original aparece inteiro.
   -------------------------------------------------------------------------- */
.bt {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--e2);
  min-height: 40px;
  padding: 0 var(--e5);
  border: 1px solid transparent;
  border-radius: var(--r2);
  background: transparent;
  font-family: var(--fonte-texto);
  font-size: var(--t-base);
  font-weight: var(--p-forte);
  line-height: 1;
  letter-spacing: -0.005em;
  white-space: nowrap;
  cursor: pointer;
  text-decoration: none;
  transition: background var(--transicao), border-color var(--transicao),
              color var(--transicao),
              box-shadow var(--transicao-lenta), transform var(--transicao);
}
.bt:active { transform: translateY(1px); }

.bt[disabled], .bt[aria-disabled="true"] {
  cursor: not-allowed;
  opacity: 1;                      /* opacity apaga a borda junto: nao serve */
  background: var(--fundo-desab);
  border-color: var(--borda);
  color: var(--texto-desab);
  transform: none;
  box-shadow: none;
}

/* primario — a acao que a tela existe para fazer. UM por tela. */
.bt-1 {
  background: var(--acao-solido);
  color: var(--sobre-acao);
  box-shadow: var(--sombra1);
}
.bt-1:hover:not([disabled]):not([aria-disabled="true"]) {
  background: var(--acao-hover);
  box-shadow: var(--sombra2), var(--halo-acao);
}
.bt-1:active:not([disabled]) { background: var(--acao-ativo); box-shadow: var(--sombra1); }

/* secundario — a acao alternativa, legitima, so nao e a principal */
.bt-2 {
  background: var(--fundo-cartao);
  border-color: var(--borda-controle);
  color: var(--texto);
  box-shadow: var(--sombra1);
}
.bt-2:hover:not([disabled]):not([aria-disabled="true"]) {
  background: var(--fundo-hover);
  border-color: var(--texto-3);
  box-shadow: var(--sombra2);
}

/* perigo — inativar, excluir, cancelar lote. Vermelho cheio, nunca violeta:
   se destruir e violeta igual a confirmar, mais dia menos dia alguem erra. */
.bt-perigo {
  background: var(--erro-solido);
  color: var(--sobre-erro);
  box-shadow: var(--sombra1);
}
.bt-perigo:hover:not([disabled]) { filter: brightness(.92); box-shadow: var(--sombra2); }

/* fantasma — acao de apoio, cabe em barra de ferramentas e dentro de linha */
.bt-fantasma { color: var(--texto-2); }
.bt-fantasma:hover:not([disabled]) { background: var(--fundo-hover); color: var(--texto); }

/* tamanhos */
.bt-p { min-height: 32px; padding: 0 var(--e3); font-size: var(--t-sm); }
.bt-g { min-height: 48px; padding: 0 var(--e7); font-size: var(--t-md); border-radius: var(--r2); }
.bt-cheio { width: 100%; }

/* botao so de icone: o quadrado precisa ser quadrado */
.bt-icone { padding: 0; width: 40px; min-height: 40px; }
.bt-icone.bt-p { width: 32px; min-height: 32px; }

/* grupo colado */


/* --------------------------------------------------------------------------
   5.2 CAMPO DE FORMULARIO
   -------------------------------------------------------------------------- */
.campo { display: flex; flex-direction: column; gap: var(--e2); }

.campo > label {
  font-size: var(--t-sm);
  font-weight: var(--p-forte);
  color: var(--texto);
  letter-spacing: -0.003em;
}
.campo .obrigatorio { color: var(--erro-txt); margin-left: 2px; }

/* A dica vem ANTES do campo, nao depois. Quem le com leitor de tela ouve
   a regra antes de digitar, e nao depois de errar.                      */
.campo .dica { font-size: var(--t-sm); color: var(--texto-2); margin-top: -2px; }

.entrada, .selecao, .area-texto {
  width: 100%;
  min-height: 40px;
  padding: var(--e2) var(--e3);
  background: var(--fundo-cartao);
  color: var(--texto);
  border: 1px solid var(--borda-controle);
  border-radius: var(--r2);
  font-size: 0.9375rem;   /* 15px: densidade no computador */
  line-height: 1.4;
  transition: border-color var(--transicao), box-shadow var(--transicao),
              background var(--transicao);
}
.area-texto { min-height: 112px; resize: vertical; padding: var(--e3); }

.entrada::placeholder, .area-texto::placeholder { color: var(--texto-3); }

.entrada:hover:not([disabled]), .selecao:hover:not([disabled]) { border-color: var(--texto-3); }

.entrada:focus, .selecao:focus, .area-texto:focus {
  outline: none;
  border-color: var(--foco);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--foco) 26%, transparent);
}
/* rede de seguranca para navegador sem color-mix */
@supports not (color: color-mix(in srgb, red, blue)) {
  .entrada:focus, .selecao:focus, .area-texto:focus { outline: 3px solid var(--foco); outline-offset: 1px; }
}

.entrada[disabled], .selecao[disabled], .area-texto[disabled] {
  background: var(--fundo-desab);
  color: var(--texto-desab);
  border-color: var(--borda);
  cursor: not-allowed;
}
.entrada[readonly] { background: var(--fundo-sutil); }

/* Campo de CPF, codigo e chave: monoespacado ja na digitacao, para o
   usuario conferir digito por digito enquanto escreve.                  */
.entrada.cod { font-family: var(--fonte-numero); letter-spacing: .02em; }

/* seta do select, desenhada em CSS para nao depender de imagem */
.selecao {
  appearance: none;
  padding-right: var(--e8);
  background-image:
    linear-gradient(45deg, transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 18px center, right 13px center;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}

/* CAMPO COM ERRO — e o que este bloco pinta AINDA NAO E USADO por
   formulario nenhum.
   
   O comentario antigo afirmava "tem borda grossa, texto de erro com icone, e
   aria-invalid no HTML". O `aria-invalid` NAO EXISTE em template nenhum, e
   `data-erro` e `class="erro"` tambem nao: hoje o erro aparece como faixa no
   TOPO da pagina (`recado-erro`, `aviso-erro`, 19 usos), e nao ao lado do
   campo que errou.
   
   Isso importa por acessibilidade: sem `aria-invalid`, o leitor de tela nao
   anuncia QUAL campo esta errado — a pessoa ouve a faixa do topo e volta a
   procurar. O bloco fica porque e o desenho certo para quando os formularios
   marcarem o campo; o que sai e a afirmacao de que ja marcam.                */
.campo[data-erro] .entrada,
.campo[data-erro] .selecao,
.campo[data-erro] .area-texto,
.entrada[aria-invalid="true"] {
  border-color: var(--erro-solido);
  border-width: 2px;
  padding: calc(var(--e2) - 1px) calc(var(--e3) - 1px);
}
.campo .erro {
  display: flex; align-items: flex-start; gap: var(--e1);
  font-size: var(--t-sm); font-weight: var(--p-medio); color: var(--erro-txt);
}
.campo .erro::before { content: "!"; flex: none; font-weight: var(--p-titulo); }

/* marcar e escolher */
.marcar { display: flex; align-items: flex-start; gap: var(--e3); cursor: pointer; }
.marcar input[type="checkbox"], .marcar input[type="radio"] {
  flex: none;
  width: 18px; height: 18px; margin: 2px 0 0;
  accent-color: var(--acao-solido);   /* pinta o controle nativo, sem redesenhar */
  cursor: pointer;
}
.marcar span { font-size: var(--t-base); }

/* busca com lupa embutida */
/* A lupa e DESENHO DE FUNDO DO PROPRIO CAMPO, nao um enfeite posicionado
   por cima do grupo. Assim ela fica centrada sozinha, com ou sem rotulo em
   cima, e continua certa quando o campo cresce para 44px no celular.    */
.busca .entrada {
  padding-left: var(--e10);
  background-image: var(--icone-busca);
  background-repeat: no-repeat;
  background-position: left var(--e3) center;
  background-size: 16px 16px;
}
/* o X nativo do type=search encosta na borda no Chrome */
.busca .entrada[type="search"]::-webkit-search-cancel-button { margin-right: 2px; }

/* barra de filtro */
.filtros {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--e4);
  padding: var(--e5) var(--e6);
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--r3);
  box-shadow: var(--sombra1);
  margin-bottom: var(--e6);
}
.filtros .campo { min-width: 170px; flex: 1 1 170px; }
.filtros .busca { flex: 2 1 300px; }


/* --------------------------------------------------------------------------
   5.3 SELO DE SITUACAO

   Seis situacoes, seis matizes, e nenhum deles e o violeta CHEIO de acao:
     Ativo               verde     152
     Inativo             neutro    250 (o proprio cinza roxeado)
     Suspenso            ambar      43
     Pendente de envio   ciano     199
     Com erro            vermelho  352
     Aguardando correcao violeta   269, em tinta clara

   Sobre o ultimo, que e o unico discutivel: agora que a acao e violeta,
   por que "Aguardando correcao" continua violeta? Porque o formato
   resolve. Selo e SEMPRE tinta clara com texto escuro e canto de pilula;
   botao e SEMPRE preenchimento cheio e canto de 8px. Ninguem confunde uma
   pilula lilas pastel com um botao violeta solido, do mesmo jeito que
   ninguem confunde um adesivo com uma maçaneta.

   A alternativa seria pintar de laranja de apoio, e ela e PIOR: o laranja
   #E77642 (matiz 19) fica a 24 graus do ambar do "Suspenso" (matiz 43), e
   dois selos vizinhos quase da mesma cor e exatamente o erro que custa
   caro numa lista. Se ainda assim quiserem o laranja, e trocar --acao-*
   por --ap-* na regra .selo-correcao, uma linha.

   Todo selo tem PONTO colorido + TEXTO. Quem nao distingue verde de
   vermelho (8% dos homens) le a palavra. Cor sozinha nunca carrega o
   significado.
   -------------------------------------------------------------------------- */
.selo {
  display: inline-flex;
  align-items: center;
  gap: var(--e2);
  padding: 4px var(--e3) 4px var(--e2);
  border: 1px solid;
  border-radius: var(--r-pilula);
  font-size: var(--t-xs);
  font-weight: var(--p-forte);
  line-height: 1.4;
  white-space: nowrap;
  vertical-align: middle;
}
.selo::before {
  content: "";
  flex: none;
  width: 6px; height: 6px;
  margin-left: var(--e1);
  border-radius: 50%;
  background: currentColor;
}
.selo-sem-ponto::before { display: none; }
.selo-sem-ponto { padding-left: var(--e3); }

.selo-ativo     { color: var(--ok-txt);   background: var(--ok-fundo);   border-color: var(--ok-borda); }
.selo-inativo   { color: var(--neu-txt);  background: var(--neu-fundo);  border-color: var(--neu-borda); }
.selo-suspenso  { color: var(--at-txt);   background: var(--at-fundo);   border-color: var(--at-borda); }
.selo-pendente  { color: var(--info-txt); background: var(--info-fundo); border-color: var(--info-borda); }
.selo-erro      { color: var(--erro-txt); background: var(--erro-fundo); border-color: var(--erro-borda); }
.selo-correcao  { color: var(--acao-txt); background: var(--acao-fundo); border-color: var(--acao-borda); }

/* =====================================================================
 * FORMULARIO EM LINHA
 *
 * Usei estas quatro classes nas telas de Contrato e de Scans achando que
 * existiam. Nao existiam: os campos ficavam empilhados na largura toda, o
 * titulo do cartao brigava com o campo ao lado, e o botao "Ver" ficava orfao
 * embaixo do campo de competencia.
 *
 * E a segunda vez nesta rodada que inventei classe (a primeira foi .mini-num).
 * A licao: escrever a regra ANTES de usar no template, ou conferir depois — e
 * agora ha um teste varrendo classe usada e nao definida.
 * ===================================================================== */
.linha-campos {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;   /* alinha pelo campo, e nao pelo rotulo */
  gap: var(--e3) var(--e4);
}
.linha-campos > .bt { flex: none; }

.campo-inline {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;            /* deixa encolher em vez de vazar do cartao */
}
.campo-inline > input,
.campo-inline > select { width: 100%; }
/* `cresce` e o campo que fica com a folga que sobrar: o texto longo (motivo,
   nome) em vez do campo curto (data, valor). */
.campo-inline.cresce { flex: 1 1 14rem; }

/* Caixa de marcar com o texto ao lado, e nao em cima: aqui o rotulo E o
   controle sao uma frase so ("E um segundo scan no mesmo dia"). */
.campo-inline.campo-caixa {
  flex-direction: row;
  align-items: center;
  gap: var(--e2);
  padding-bottom: 10px;    /* encosta na linha de base dos outros campos */
}
.campo-inline.campo-caixa > input { width: auto; }

/* No CELULAR o cabecalho do cartao empilha. Sem isto, "Fatura de 07/2026"
   quebrava em duas linhas ao lado do campo de competencia e o botao ficava
   solto embaixo — o pior arranjo possivel dos tres elementos. */
@media (max-width: 640px) {
  .cartao-topo {
    flex-direction: column;
    align-items: stretch;
    gap: var(--e3);
  }
  /* O botao NAO vira largura cheia: "Ver" ocupando uma linha inteira, sem
     moldura, lia-se como texto solto e nao como botao. Ele fica ao lado do
     campo, que e onde a mao vai depois de escolher a competencia. */
  .cartao-topo .linha-campos { align-items: flex-end; }
  .campo-inline.cresce { flex: 1 1 100%; }
}

/* Selo de alerta na linha: CPF invalido, E-mail placeholder, Sem empresa,
   Nome divergente. Sao FATOS sobre o dado, nao a situacao do cadastro,
   entao sao quadrados, sem ponto e sem preenchimento. Formato diferente =
   categoria diferente, mesmo antes de ler.                              */
.marca-alerta {
  display: inline-flex; align-items: center; gap: var(--e1);
  padding: 2px var(--e2);
  border: 1px dashed var(--at-borda);
  border-radius: var(--r1);
  background: transparent;
  color: var(--at-txt);
  font-size: var(--t-xs);
  font-weight: var(--p-medio);
  white-space: nowrap;
}
.marca-alerta-grave { border-color: var(--erro-borda); color: var(--erro-txt); border-style: solid; }

/* Selo de perfil e de alcada */
.selo-perfil {
  display: inline-block; padding: 3px var(--e2);
  border-radius: var(--r1);
  background: var(--fundo-sutil); border: 1px solid var(--borda);
  color: var(--texto-2);
  font-size: var(--t-xs); font-weight: var(--p-forte);
  letter-spacing: var(--entreletra-rotulo); text-transform: uppercase;
}


/* --------------------------------------------------------------------------
   5.4 CARTAO e CARTAO DE NUMERO
   -------------------------------------------------------------------------- */
.cartao {
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--r3);
  box-shadow: var(--sombra1);
}
.cartao-corpo { padding: var(--e6); }
.cartao-topo {
  display: flex; align-items: center; justify-content: space-between; gap: var(--e4);
  padding: var(--e5) var(--e6);
  border-bottom: 1px solid var(--borda);
}
.cartao-topo h3 { font-size: var(--t-md); }
.cartao-pe {
  padding: var(--e4) var(--e6);
  border-top: 1px solid var(--borda);
  background: var(--fundo-sutil);
  border-radius: 0 0 var(--r3) var(--r3);
  font-size: var(--t-sm); color: var(--texto-2);
}

/* Cartao de numero. O numero e o heroi: fonte grande, tabular, peso alto,
   na Inter. O rotulo vem em cima e pequeno, a comparacao vem embaixo e
   discreta.                                                             */
.num-cartao {
  display: flex; flex-direction: column; gap: var(--e2);
  padding: var(--e6);
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--r3);
  box-shadow: var(--sombra1);
  transition: box-shadow var(--transicao-lenta), border-color var(--transicao),
              transform var(--transicao-lenta);
}
.num-cartao .rotulo { margin: 0; }

/* Cartao de NUMERO DE APOIO, e nao numero-heroi.
 *
 * O .valor normal vai de 34 a 52px, dimensionado para os quatro numeros do
 * painel, que sao curtos ("27", "R$ 151,80"). Numa fila de quatro cartoes de
 * saldo, valores como "R$ 23.706,20" tem doze caracteres e vazavam para fora
 * da borda do cartao — o numero literalmente saia do quadro.
 *
 * Aqui o numero e apoio: quem le a fila de saldo esta acompanhando uma conta,
 * nao batendo o olho num indicador. Cabe menor. */
.num-cartao-apoio { padding: var(--e4) var(--e4); }
.num-cartao-apoio .valor { font-size: var(--t-lg); line-height: 1.15; }
.num-cartao-apoio .rotulo { font-size: var(--t-xs); }

.num-cartao .valor {
  font-family: var(--fonte-marca);
  font-size: var(--t-3xl);
  font-weight: var(--p-marca);
  line-height: 1.02;
  letter-spacing: var(--entreletra-marca);
  font-variant-numeric: tabular-nums;
  color: var(--texto);
}
.num-cartao .nota { font-size: var(--t-sm); color: var(--texto-2); }

/* Faixa colorida a esquerda quando o numero pede atencao. Nunca o cartao
   inteiro colorido: cinco cartoes coloridos lado a lado nao destacam nada. */
.num-cartao[data-tom="atencao"] { border-left: 4px solid var(--at-solido); }
.num-cartao[data-tom="erro"]    { border-left: 4px solid var(--erro-solido); }
.num-cartao[data-tom="ok"]      { border-left: 4px solid var(--ok-solido); }

/* Cartao clicavel: a area toda vira alvo, sem aninhar botao dentro de link.
   O leve subir no hover e o que faz o cartao parecer clicavel antes de a
   pessoa ler que ele e um link.                                         */
.num-cartao[href], a.num-cartao { text-decoration: none; color: inherit; }
a.num-cartao:hover {
  border-color: var(--borda-forte);
  box-shadow: var(--sombra2);
  transform: translateY(-2px);
}


/* --------------------------------------------------------------------------
   5.5 TABELA

   A tela que o operador vive dentro. Prioridades, nesta ordem:
     1. achar a linha certa entre 883
     2. comparar valores na vertical (por isso tabular-nums em tudo)
     3. so entao, agir

   A linha ficou mais alta que na versao anterior (16px de folga vertical
   contra 12px). Custa umas linhas por tela, e paga: a lista para de
   parecer um extrato bancario e o olho acha a linha certa mais rapido.
   -------------------------------------------------------------------------- */
.tabela-caixa {
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--r3);
  box-shadow: var(--sombra1);
  overflow: hidden;
}
/* A rolagem lateral mora AQUI, nunca no body. */
.tabela-rolagem { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* O CABECALHO GRUDADO SO GRUDA SE HOUVER ONDE ROLAR.
   O `position: sticky` das colunas ja estava escrito, e estava morto: sem
   teto de altura na caixa, quem rola e a PAGINA, e o cabecalho sobe junto.
   A partir da linha ~15 de qualquer lista o operador le selos parecidos
   ("Situacao" contra "No fornecedor") sem saber qual coluna e qual — e
   decide pela coluna errada.
   O autor sabia do problema: a tela de simulacao da importacao ganhou o
   conserto, e as listas do dia a dia nao.
   So no computador. No celular a tabela vira cartao e nao ha cabecalho. */
@media (min-width: 900px) {
  .tabela-rolagem {
    max-height: min(70vh, 720px);
    overflow-y: auto;
  }
}

.tabela { width: 100%; font-size: var(--t-sm); line-height: var(--lh-densa); }

/* A LINHA DE HOJE. O `data-hoje` ja era escrito pela agenda e nao tinha
   estilo nenhum: quem abre a agenda quer achar o dia de hoje primeiro, e
   procurava a data a olho numa lista de trinta dias. */
.tabela tr[data-hoje] > td { background: var(--info-fundo); }
.tabela tr[data-hoje] > td:first-child {
  box-shadow: inset 3px 0 0 var(--info-solido);
}

.tabela thead th {
  position: sticky; top: 0; z-index: 2;
  padding: var(--e3) var(--e5);
  background: var(--fundo-sutil);
  border-bottom: 1px solid var(--borda-forte);
  text-align: left;
  font-size: var(--t-xs);
  font-weight: var(--p-forte);
  letter-spacing: var(--entreletra-rotulo);
  text-transform: uppercase;
  color: var(--texto-2);
  white-space: nowrap;
}
.tabela tbody td {
  padding: var(--e4) var(--e5);
  border-bottom: 1px solid var(--borda);
  vertical-align: middle;
}
.tabela tbody tr:last-child td { border-bottom: 0; }
.tabela tbody tr:nth-child(even) { background: var(--fundo-zebra); }
.tabela tbody tr { transition: background var(--transicao); }
.tabela tbody tr:hover { background: var(--fundo-hover); }
.tabela tbody tr[aria-selected="true"] { background: var(--fundo-marcado); }

/* Numero, dinheiro e data vao para a direita: a unidade fica alinhada e a
   comparacao vertical funciona.                                         */
.tabela .dir { text-align: right; font-variant-numeric: tabular-nums; }
.tabela .centro { text-align: center; }
.tabela .apertado { width: 1%; white-space: nowrap; }

/* Numero em celula NUNCA quebra em duas linhas.
   A coluna e estreita e o navegador quebra justamente no hifen:
   "900.000.001-" numa linha e "75" na outra deixa de ser um CPF
   conferivel e vira duas metades. A folha ja garantia isso em .cod, mas as
   telas marcaram a coluna de CPF como .num, que ficava de fora — e com a
   folga de celula maior desta versao a quebra passou a acontecer de
   verdade. Com nowrap a tabela alarga a coluna sozinha, que e o certo:
   quem cede espaco e o nome, que tem reticencias, nao o numero.        */
.tabela td.num, .tabela td.dir { white-space: nowrap; }

/* A DESCRICAO E UMA SEGUNDA LINHA, NAO UM APENDICE DO NOME.
   `.dica` so tinha estilo dentro de `.campo` (linha 860, o formulario).
   Numa celula de tabela ela caia como texto inline do MESMO tamanho,
   colado ao nome — "Essencial Familia Nacional24h por dia, todo o Brasil"
   numa linha so, que a celula corta com reticencias.
   Pior que o feio: como a celula e `nowrap` e dimensiona pela linha
   inteira, a descricao alargava a coluna do nome e empurrava as colunas de
   "Quem enxerga" e "Situacao" — que e o que a tela de planos existe para
   mostrar.
   Aqui ela vira o que ja era em formulario: linha propria, menor, apagada. */
.tabela td .dica {
  display: block;
  font-size: var(--t-xs);
  font-weight: var(--p-normal);
  color: var(--texto-3);
  overflow: hidden; text-overflow: ellipsis;
}

/* Coluna do nome: nunca quebra em duas linhas, corta com reticencias. */
.tabela .nome {
  font-weight: var(--p-medio);
  color: var(--texto);
  max-width: 22rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Primeira coluna grudada, para o nome nao sumir ao rolar para o lado. */
.tabela-fixa th:first-child, .tabela-fixa td:first-child {
  position: sticky; left: 0; z-index: 1;
  background: var(--fundo-cartao);
  box-shadow: 1px 0 0 var(--borda);
}
.tabela-fixa thead th:first-child { z-index: 3; }
.tabela-fixa tbody tr:nth-child(even) td:first-child { background: var(--fundo-zebra); }
.tabela-fixa tbody tr:hover td:first-child { background: var(--fundo-hover); }

/* Cabecalho que ordena */
.tabela th[aria-sort] { cursor: pointer; user-select: none; }
.tabela th[aria-sort]:hover { color: var(--texto); }
.tabela th[aria-sort="ascending"]::after  { content: " ▲"; font-size: .8em; color: var(--acao-txt); }
.tabela th[aria-sort="descending"]::after { content: " ▼"; font-size: .8em; color: var(--acao-txt); }

/* Barra de acao em massa: aparece quando ha selecao. Grudada no rodape
   para nao sumir quando a lista e longa. Fundo no roxo escuro da marca,
   que aqui e o unico lugar da area de trabalho onde ele aparece cheio.  */

/* Aviso de alcada dentro da barra: TETO_LOTE do usuarios.py chegando. */

.tabela-pe {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: var(--e4);
  padding: var(--e4) var(--e5);
  border-top: 1px solid var(--borda);
  background: var(--fundo-sutil);
  font-size: var(--t-sm); color: var(--texto-2);
}


/* --------------------------------------------------------------------------
   5.6 AVISO (a caixa de recado)
   -------------------------------------------------------------------------- */
.aviso {
  display: flex;
  gap: var(--e4);
  padding: var(--e5);
  border: 1px solid;
  border-left-width: 4px;
  border-radius: var(--r3);
  font-size: var(--t-base);
  line-height: var(--lh-normal);
}
.aviso-icone {
  flex: none; width: 22px; height: 22px; margin-top: 1px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 50%;
  font-weight: var(--p-titulo); font-size: var(--t-xs);
  background: currentColor;
}
/* O glifo fica na cor da tinta de fundo, dentro de um disco na cor do
   texto. Da um icone solido sem imagem nenhuma.                         */
.aviso-icone::before { color: var(--fundo-cartao); }
.aviso-corpo { min-width: 0; }
.aviso strong { display: block; font-weight: var(--p-forte); margin-bottom: 2px; }
.aviso-acoes { display: flex; flex-wrap: wrap; gap: var(--e3); margin-top: var(--e4); }
.aviso p { max-width: var(--largura-leitura); }

.aviso-ok    { color: var(--ok-txt);   background: var(--ok-fundo);   border-color: var(--ok-borda);   border-left-color: var(--ok-solido); }
.aviso-at    { color: var(--at-txt);   background: var(--at-fundo);   border-color: var(--at-borda);   border-left-color: var(--at-solido); }
.aviso-erro  { color: var(--erro-txt); background: var(--erro-fundo); border-color: var(--erro-borda); border-left-color: var(--erro-solido); }
.aviso-info  { color: var(--info-txt); background: var(--info-fundo); border-color: var(--info-borda); border-left-color: var(--info-solido); }

.aviso-ok   .aviso-icone::before { content: "✓"; }
.aviso-at   .aviso-icone::before { content: "!"; }
.aviso-erro .aviso-icone::before { content: "✕"; }
.aviso-info .aviso-icone::before { content: "i"; }

/* Aviso de bloqueio: a mensagem que trava o "Confirmar importacao".
   Ganha peso maior porque impede a acao.                                */
.aviso-bloqueio {
  background: var(--erro-fundo);
  border: 2px solid var(--erro-solido);
  border-radius: var(--r3);
  color: var(--erro-txt);
  padding: var(--e5) var(--e6);
  font-weight: var(--p-medio);
}


/* --------------------------------------------------------------------------
   5.7 MODAL
   Usa o <dialog> nativo: fecha no Esc, prende o Tab dentro e devolve o foco
   sozinho. Nada disso precisa de JavaScript nosso.
   -------------------------------------------------------------------------- */
/* Confirmacao destrutiva: o botao que destroi fica a DIREITA e o de escapar
   a esquerda, e o destrutivo nunca recebe foco automatico.              */


/* --------------------------------------------------------------------------
   5.8 ABAS
   -------------------------------------------------------------------------- */
/* Aba com pendencia: a contagem fica vermelha, nao a aba inteira. */


/* --------------------------------------------------------------------------
   5.9 PAGINACAO
   -------------------------------------------------------------------------- */
.paginacao { display: flex; align-items: center; gap: var(--e2); flex-wrap: wrap; }
.paginacao .pag {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 36px; height: 36px; padding: 0 var(--e3);
  border: 1px solid var(--borda);
  border-radius: var(--r2);
  background: var(--fundo-cartao);
  color: var(--texto-2);
  font-size: var(--t-sm); font-weight: var(--p-medio);
  font-variant-numeric: tabular-nums;
  text-decoration: none; cursor: pointer;
  transition: background var(--transicao), color var(--transicao),
              border-color var(--transicao);
}
.paginacao .pag:hover:not([disabled]):not([aria-disabled="true"]):not([aria-current]) {
  background: var(--fundo-hover); color: var(--texto); border-color: var(--borda-forte);
}
.paginacao .pag[aria-current="page"] {
  background: var(--acao-solido); border-color: var(--acao-solido);
  color: var(--sobre-acao); font-weight: var(--p-forte);
}
/* O macro de paginacao usa <span aria-disabled> quando nao ha para onde ir:
   nao e botao desligado, e um destino que nao existe.                   */
.paginacao .pag[disabled],
.paginacao .pag[aria-disabled="true"] {
  color: var(--texto-desab);
  background: var(--fundo-desab);
  border-color: var(--borda);
  cursor: not-allowed;
}
.paginacao .reticencias { padding: 0 var(--e2); color: var(--texto-3); font-size: var(--t-sm); }


/* --------------------------------------------------------------------------
   5.10 BARRA DE PROGRESSO
   Usada no acompanhamento de lote. Precisa de numero ao lado: barra sozinha
   nao diz se 60% de 883 ja acabou ou vai levar mais meia hora.
   -------------------------------------------------------------------------- */
.progresso { display: flex; flex-direction: column; gap: var(--e2); }
.progresso-topo {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--e4);
  font-size: var(--t-sm);
}
.progresso-topo .valor { font-weight: var(--p-forte); font-variant-numeric: tabular-nums; color: var(--texto); }
.progresso-topo .resto { color: var(--texto-2); font-variant-numeric: tabular-nums; }

/* Trilho repartido: sucesso, erro e restante na MESMA barra. E o que a tela
   de lote precisa mostrar (141 sucesso, 7 erro, 735 na fila) sem tres barras. */
.progresso-misto { display: flex; height: 10px; border-radius: var(--r-pilula); overflow: hidden; border: 1px solid var(--borda); background: var(--neu-fundo); }
.progresso-misto span { height: 100%; transition: width 400ms cubic-bezier(.4,0,.2,1); }
.progresso-misto .p-ok   { background: var(--ok-solido); }
.progresso-misto .p-erro { background: var(--erro-solido); }
.progresso-misto .p-at   { background: var(--at-solido); }

/* Trabalho em andamento sem porcentagem conhecida. */
@keyframes correndo {
  0%   { margin-left: -35%; }
  100% { margin-left: 100%; }
}

.legenda { display: flex; flex-wrap: wrap; gap: var(--e5); font-size: var(--t-sm); color: var(--texto-2); }
.legenda span { display: inline-flex; align-items: center; gap: var(--e2); }
.legenda i { width: 10px; height: 10px; border-radius: 3px; flex: none; }


/* --------------------------------------------------------------------------
   5.11 MENU LATERAL

   Fundo no roxo escuro #0C0047 da marca — a cor do wordmark, usada aqui
   inteira. O item ativo e preenchido com o violeta de acao, que da 3.3:1
   contra o fundo do menu (visivel por si so, sem depender de cor de
   texto) mais uma barra de 3px no #A24CFF puro a esquerda. Dois sinais:
   um de preenchimento, um de forma. Quem enxerga mal acha o "voce esta
   aqui" pela barra mesmo sem distinguir os dois violetas.

   A MARCA DE VERDADE: o simbolo do infinito com as duas cabecas, o
   arquivo /estatico/marca/simbolo.png, entra como fundo do <span
   class="ponto"> que o base.html ja renderiza. Antes ali havia uma
   bolinha laranja desenhada em CSS fingindo ser a marca. O simbolo ja vem
   violeta e com fundo transparente, entao ele cai certo sobre o roxo
   escuro sem precisar de versao alternativa.
   -------------------------------------------------------------------------- */
.lateral {
  position: sticky; top: 0;
  height: 100vh; height: 100dvh;
  display: flex; flex-direction: column;
  background: var(--marca-roxo-esc);
  color: #fff;
  overflow-y: auto;
  overscroll-behavior: contain;
  z-index: 20;
}

.lateral-marca {
  display: flex; align-items: center; gap: var(--e3);
  padding: var(--e6) var(--e5) var(--e5);
  font-family: var(--fonte-marca);
  font-size: var(--t-lg);
  font-weight: var(--p-marca);      /* Inter ExtraBold, como manda o brandbook */
  letter-spacing: var(--entreletra-marca);
  color: #fff;
  text-decoration: none;
}
/* O simbolo da marca. Proporcao do arquivo: 256x195, ou seja 1,31:1 —
   por isso 34x26 e nao um quadrado, que amassaria o infinito.           */
.lateral-marca .ponto {
  flex: none;
  width: 34px; height: 26px;
  border-radius: 0;
  background: url("/estatico/marca/simbolo.png") center / contain no-repeat;
}

.lateral-nav { flex: 1; padding: 0 var(--e3) var(--e5); }
.lateral-grupo { margin-top: var(--e6); }
.lateral-grupo > .rotulo {
  display: block;
  padding: 0 var(--e3) var(--e2);
  color: #9c93bd;              /* 6.6:1 no roxo escuro da marca */
}

.lateral-item {
  position: relative;
  display: flex; align-items: center; gap: var(--e3);
  min-height: var(--toque);
  padding: var(--e2) var(--e3);
  border-radius: var(--r2);
  color: #beb8d5;              /* 9.9:1 no roxo escuro da marca */
  font-size: var(--t-base); font-weight: var(--p-medio);
  text-decoration: none;
  transition: background var(--transicao), color var(--transicao);
}
.lateral-item:hover { background: rgba(255,255,255,.09); color: #fff; }
.lateral-item[aria-current="page"] {
  background: var(--acao-solido);
  color: #fff;
  font-weight: var(--p-forte);
  box-shadow: 0 2px 10px rgba(162, 76, 255, .35);
}
.lateral-item[aria-current="page"]::before {
  content: "";
  position: absolute; left: calc(var(--e3) * -1 + 2px); top: 8px; bottom: 8px;
  width: 3px; border-radius: var(--r-pilula);
  background: var(--marca-violeta);
}
.lateral-item:focus-visible { outline-color: var(--marca-violeta); }

.lateral-item .icone { flex: none; width: 20px; text-align: center; opacity: .9; }
.lateral-item .texto { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* O contador e o unico lugar do menu onde o LARANJA DE APOIO aparece.
   Texto escuro por cima: #191334 sobre #E77642 da 6.0:1.                */
.lateral-item .conta {
  padding: 2px 8px; border-radius: var(--r-pilula);
  background: var(--marca-laranja); color: var(--n900);
  font-size: var(--t-xs); font-weight: var(--p-titulo);
  font-variant-numeric: tabular-nums;
}

/* Subitens (Lista geral, Importar planilha, Fila de qualidade...) */

/* Rodape: quem esta logado e com qual perfil. Fundamental num sistema com
   alcada, porque a pergunta "por que nao consigo fazer isso" comeca aqui. */
.lateral-pe {
  padding: var(--e4) var(--e5);
  border-top: 1px solid rgba(255,255,255,.14);
  font-size: var(--t-sm);
}
.lateral-pe .nome { color: #fff; font-weight: var(--p-forte); }
.lateral-pe .perfil { color: #a9a3c2; }   /* 7.9:1 no roxo escuro */
.lateral-pe .lateral-item { margin-left: calc(var(--e3) * -1); }

/* Menu fechado: some o texto, ficam os icones.
   O simbolo da marca CONTINUA visivel: some so o wordmark. A folha antiga
   escondia .lateral-marca span, que apagava a marca inteira — inclusive o
   proprio simbolo, que tambem e um span.                                */
.app[data-menu="fechado"] .lateral-item .texto,
.app[data-menu="fechado"] .lateral-grupo > .rotulo,
.app[data-menu="fechado"] .lateral-marca span:not(.ponto),
.app[data-menu="fechado"] .lateral-pe .nome,
.app[data-menu="fechado"] .lateral-pe .perfil{ display: none; }
.app[data-menu="fechado"] .lateral-item { justify-content: center; padding-inline: 0; }
.app[data-menu="fechado"] .lateral-marca { justify-content: center; padding-inline: 0; }
.app[data-menu="fechado"] .lateral-pe .lateral-item { margin-left: 0; }

/* Barra de topo da area de trabalho */
.topo {
  position: sticky; top: 0; z-index: 10;
  display: flex; align-items: center; gap: var(--e4);
  min-height: var(--topo);
  padding: 0 var(--e8);
  background: color-mix(in srgb, var(--fundo-pagina) 82%, transparent);
  backdrop-filter: saturate(180%) blur(10px);
  border-bottom: 1px solid var(--borda);
}
@supports not (backdrop-filter: blur(1px)) { .topo { background: var(--fundo-pagina); } }
.topo > strong {
  font-family: var(--fonte-marca);
  font-weight: var(--p-forte);
  letter-spacing: var(--entreletra-titulo);
}
.topo .abre-menu { display: none; }


/* --------------------------------------------------------------------------
   5.12 MIGALHAS, LISTA DE DADOS, LINHA DO TEMPO
   -------------------------------------------------------------------------- */
.migalhas { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2); font-size: var(--t-sm); color: var(--texto-2); margin-bottom: var(--e4); }
.migalhas a { color: var(--texto-2); text-decoration: none; }
.migalhas a:hover { color: var(--texto); text-decoration: underline; }
.migalhas li + li::before { content: "/"; margin-right: var(--e2); color: var(--texto-3); }
.migalhas ol { display: flex; flex-wrap: wrap; gap: var(--e2); list-style: none; margin: 0; padding: 0; }
.migalhas li { display: flex; align-items: center; gap: var(--e2); }

/* Ficha: rotulo em cima, valor embaixo. Em coluna unica no celular. */
.ficha { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--e5) var(--e6); }
.ficha .item { min-width: 0; }
.ficha .item dt { font-size: var(--t-xs); font-weight: var(--p-forte); letter-spacing: var(--entreletra-rotulo); text-transform: uppercase; color: var(--texto-3); margin-bottom: var(--e1); }
.ficha .item dd { margin: 0; font-size: var(--t-base); color: var(--texto); overflow-wrap: anywhere; }
.ficha .item dd:empty::after { content: "sem informação"; color: var(--texto-3); font-style: italic; }

.tempo { list-style: none; margin: 0; padding: 0 0 0 var(--e6); border-left: 2px solid var(--borda); }
.tempo li { position: relative; padding: 0 0 var(--e6) var(--e3); }
.tempo li::before {
  content: ""; position: absolute; left: calc(var(--e6) * -1 - 6px); top: 6px;
  width: 9px; height: 9px; border-radius: 50%;
  background: var(--fundo-cartao); border: 2px solid var(--borda-forte);
}
.tempo li[data-tom="ok"]::before   { border-color: var(--ok-solido); }
.tempo li[data-tom="erro"]::before { border-color: var(--erro-solido); }
.tempo .quando { font-size: var(--t-xs); color: var(--texto-3); font-variant-numeric: tabular-nums; }
.tempo .quem { font-weight: var(--p-forte); }


/* --------------------------------------------------------------------------
   5.13 TELA DE ENTRADA

   Estas quatro classes vinham num <style> solto dentro do entrar.html.
   Lugar de peca do sistema visual e no sistema visual: la elas repetiam a
   marca antiga (gradiente com o roxo #7b2ff7 e o laranja #ff6b35, e a
   bolinha laranja no lugar do simbolo).

   O <style> do template continua la e, por vir depois desta folha, ganha
   no empate de especificidade. Por isso as regras daqui usam `body` na
   frente: e um degrau a mais de especificidade, o suficiente para vencer
   sem !important. Quando alguem apagar aquele <style> do entrar.html,
   estas regras seguem valendo iguais e o `body` vira so ruido inofensivo.
   -------------------------------------------------------------------------- */
body .entrada-pagina {
  min-height: 100dvh;
  display: grid; place-items: center;
  padding: var(--e8);
  background:
    radial-gradient(1200px 640px at 10% -12%, rgba(162, 76, 255, .18), transparent 62%),
    radial-gradient(900px 540px at 110% 112%, rgba(231, 118, 66, .12), transparent 60%),
    var(--fundo-pagina);
}
body .entrada-caixa { width: min(420px, 100%); }
body .entrada-marca {
  display: flex; align-items: center; gap: var(--e3);
  font-family: var(--fonte-marca); font-size: var(--t-2xl);
  font-weight: var(--p-marca); letter-spacing: var(--entreletra-marca);
  color: var(--texto);
  margin-bottom: var(--e2);
}
body .entrada-marca .ponto {
  flex: none;
  width: 48px; height: 37px;      /* 256x195 do arquivo, mantendo a proporcao */
  border-radius: 0; background:
    url("/estatico/marca/simbolo.png") center / contain no-repeat;
}
body .entrada-rodape {
  margin-top: var(--e6); text-align: center;
  font-size: var(--t-sm); color: var(--texto-3); line-height: var(--lh-normal);
}


/* ==========================================================================
   6. REGRAS DE ESTADO

   Quatro estados que toda tela precisa ter antes de existir. A tela nao
   esta pronta quando o caminho feliz funciona; esta pronta quando os
   quatro estao desenhados.

   O que nunca muda:
     - a caixa NAO muda de tamanho entre carregando e carregado (senao a
       pagina pula na cara do usuario);
     - todo estado diz O QUE ACONTECEU e QUAL E A SAIDA, nesta ordem;
     - erro sempre mostra o que fazer agora, e nunca so "erro 500".
   ========================================================================== */

/* --- 6.1 CARREGANDO ------------------------------------------------------
   Esqueleto no formato do conteudo que vem, nao roda-gigante no meio da
   tela. O usuario ja comeca a ler o layout enquanto o dado chega.        */
@keyframes brilho { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }

@media (prefers-reduced-motion: reduce) {
}

/* Container esperando: some o clique, mas mantem o que ja esta na tela.
   Nunca apagar a tabela antiga para mostrar vazio enquanto recarrega.    */
[aria-busy="true"] { cursor: progress; }
@keyframes correndo-fundo { 0% { background-position: -30% 0; } 100% { background-position: 130% 0; } }

/* Botao trabalhando: some o texto, entra o giro, LARGURA TRAVADA para o
   botao nao encolher e a pessoa nao clicar em outra coisa sem querer.    */
.bt[data-carregando="true"] { color: transparent !important; pointer-events: none; position: relative; }
.bt[data-carregando="true"]::after {
  content: ""; position: absolute; inset: 0; margin: auto;
  width: 15px; height: 15px;
  border: 2px solid currentColor; border-top-color: transparent;
  border-radius: 50%;
  animation: girar .7s linear infinite;
}
.bt-1[data-carregando="true"]::after { border-color: var(--sobre-acao); border-top-color: transparent; }
.bt-perigo[data-carregando="true"]::after { border-color: var(--sobre-erro); border-top-color: transparent; }
@keyframes girar { to { transform: rotate(360deg); } }

/* --- 6.2 VAZIO -----------------------------------------------------------
   Duas coisas diferentes com o mesmo nome:
     .vazio        -> nao existe nada ainda. Convida a criar.
     .vazio-filtro -> existe, o filtro que escondeu. Convida a limpar.
   Trocar um pelo outro faz o usuario achar que perdeu dado.              */
.vazio {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: var(--e3);
  padding: var(--e20) var(--e8);
  background: var(--fundo-cartao);
  border: 1px dashed var(--borda-forte);
  border-radius: var(--r3);
}
.vazio .simbolo { font-size: 2.25rem; line-height: 1; opacity: .45; margin-bottom: var(--e2); }
.vazio h3 { font-size: var(--t-lg); }
.vazio p { color: var(--texto-2); max-width: 46ch; }
.vazio .vazio-acoes { display: flex; flex-wrap: wrap; gap: var(--e3); justify-content: center; margin-top: var(--e3); }

.vazio-filtro { border-style: solid; background: var(--fundo-sutil); padding: var(--e14) var(--e8); }

/* --- 6.3 ERRO ------------------------------------------------------------
   Erro de tela inteira. Sempre com: o que quebrou, o que o usuario pode
   fazer, e um codigo para achar na auditoria depois.                     */

/* Erro parcial: um pedaco da tela falhou, o resto continua util. */

/* --- 6.4 SEM PERMISSAO ---------------------------------------------------
   Tres situacoes diferentes, tres tratamentos. Isso espelha o
   usuarios.py: PODE, PEDE_APROVACAO, NAO_PODE.

   a) NAO_PODE, acao rara       -> o botao nao aparece. Tela limpa.
   b) NAO_PODE, acao esperada   -> botao desabilitado + explicacao no title
                                   e num texto ao lado. Sumir com um botao
                                   que a pessoa usa todo dia parece defeito.
   c) PEDE_APROVACAO            -> o botao FUNCIONA, com selo avisando que
                                   vai virar solicitacao. Nunca desabilitar:
                                   a acao e permitida, so nao e imediata.  */

/* (b) */

/* (c) */
.bt[data-alcada="aprovacao"] { position: relative; }
.bt[data-alcada="aprovacao"]::after {
  content: "precisa de aprovação";
  position: absolute; top: -8px; right: -6px;
  padding: 2px 7px;
  border-radius: var(--r-pilula);
  background: var(--at-solido); color: var(--n900);
  font-size: 10px; font-weight: var(--p-titulo);
  letter-spacing: .02em; white-space: nowrap;
  box-shadow: var(--sombra1);
}
/* No celular o rotulo flutuante nao cabe: vira texto embaixo. */
@media (max-width: 640px) {
  .bt[data-alcada="aprovacao"]::after { position: static; display: block; margin-top: var(--e1); }
  .bt[data-alcada="aprovacao"] { flex-direction: column; height: auto; padding-block: var(--e2); }
}

/* Bloco de tela inteira quando o perfil nao alcanca a pagina. */

/* Dado escondido por alcada (o Financeiro nao ve CPF). Nao e erro: e uma
   regra. Entao mostra a mascara, nao um espaco em branco.                */
.mascarado {
  font-family: var(--fonte-numero);
  color: var(--texto-3);
  letter-spacing: .06em;
  cursor: help;
  border-bottom: 1px dotted var(--borda-forte);
}

/* --- 6.5 aviso ao vivo, para leitor de tela --------------------------- */
.so-leitor {
  position: absolute !important;
  width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%);
  white-space: nowrap; border: 0;
}


/* ==========================================================================
   7. CELULAR

   O RH da Copaiba abre isso do telefone. O que vira o que:

     menu lateral   -> gaveta que entra pela esquerda, com fundo escurecido
     tabela         -> lista de cartoes (uma vida por cartao)
     barra de massa -> some (acao em massa no celular e pedido de acidente)
     filtros        -> empilham
     modal          -> folha que sobe do rodape, colada embaixo
     abas           -> rolam na horizontal, sem cortar
     botao primario -> largura total no rodape do formulario
     campo          -> 16px de fonte, senao o iPhone da zoom sozinho ao focar
   ========================================================================== */

@media (max-width: 1024px) {
  .conteudo { padding: var(--e6); padding-bottom: var(--e12); }
  .topo { padding: 0 var(--e6); } .col-4, .col-8{ grid-column: span 12; }
}

@media (max-width: 860px) {

  /* --- gaveta --- */
  .app { grid-template-columns: minmax(0, 1fr); }

  .lateral {
    position: fixed; inset: 0 auto 0 0;
    width: min(84vw, 304px);
    transform: translateX(-100%);
    transition: transform 220ms cubic-bezier(.2,.7,.3,1);
    box-shadow: var(--sombra3);
  }
  .app[data-menu="aberto"] .lateral { transform: translateX(0); }

  .app[data-menu="aberto"]::before {
    content: "";
    position: fixed; inset: 0; z-index: 19;
    background: rgba(8,5,26,.55);
  }
  .app[data-menu="aberto"] { overflow: hidden; }

  .topo { padding: 0 var(--e5); gap: var(--e3); }
  .topo .abre-menu { display: inline-flex; }
  /* O titulo da barra corta com reticencias em vez de quebrar. Quebrando,
     ele empurra os selos para uma segunda linha e a barra dobra de altura
     em TODA tela do sistema.                                             */
  .topo > strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  .conteudo { padding: var(--e5); padding-bottom: var(--e10); }
  .pagina-topo { flex-direction: column; align-items: stretch; margin-bottom: var(--e6); }
  .pagina-acoes .bt { flex: 1 1 auto; }

  /* --- toque de 44px em tudo que se clica --- */
  .bt, .lateral-item, .paginacao .pag, .marcar { min-height: var(--toque); }
  .bt-icone { width: var(--toque); }
  .paginacao .pag { min-width: var(--toque); height: var(--toque); }
  .entrada, .selecao, .area-texto {
    min-height: var(--toque);
    font-size: var(--t-md);   /* 16px: abaixo disso o iOS da zoom no foco */
  }

  /* --- tabela vira cartoes ---
     O HTML e o mesmo. Cada <td> ganha o rotulo pelo data-rotulo, entao a
     tabela continua sendo tabela para o leitor de tela no computador e
     vira lista legivel no telefone.
     No HTML:  <td data-rotulo="CPF" class="cod">900.000.008-41</td>

     O CPF de exemplo vem da faixa 900.xxx.xxx, como todo CPF que aparece
     neste repositorio. Um numero escolhido a esmo passa no digito
     verificador e pode ser o de alguem de verdade — e comentario de CSS
     tambem vai para o GitHub.                                            */
  .tabela-vira-cartao thead { display: none; }
  .tabela-vira-cartao,
  .tabela-vira-cartao tbody,
  .tabela-vira-cartao tr,
  .tabela-vira-cartao td { display: block; width: 100%; }

  .tabela-vira-cartao tr {
    background: var(--fundo-cartao) !important;
    border: 1px solid var(--borda);
    border-radius: var(--r3);
    padding: var(--e4) var(--e5);
    margin-bottom: var(--e4);
    box-shadow: var(--sombra1);
  }
  .tabela-vira-cartao td {
    display: flex; align-items: baseline; justify-content: space-between; gap: var(--e5);
    padding: var(--e3) 0;
    border-bottom: 1px solid var(--borda);
    text-align: left !important;
  }
  .tabela-vira-cartao td:last-child { border-bottom: 0; padding-bottom: 0; }
  .tabela-vira-cartao td::before {
    content: attr(data-rotulo);
    flex: none;
    font-size: var(--t-xs); font-weight: var(--p-forte);
    letter-spacing: var(--entreletra-rotulo); text-transform: uppercase;
    color: var(--texto-3);
  }
  /* A primeira celula e o titulo do cartao: sem rotulo, fonte maior. */
  .tabela-vira-cartao td:first-child {
    display: block;
    font-size: var(--t-md); font-weight: var(--p-forte);
    padding-top: 0; max-width: none; white-space: normal;
  }
  /* NOME QUE NAO E A PRIMEIRA COLUNA. Em /agenda o paciente e a SEGUNDA
     celula ("Quando" vem antes), entao a regra de cima nao o alcanca: ele
     ficava com o `white-space: nowrap` e o `max-width: 22rem` da tabela de
     computador dentro de uma celula que virou caixa flex.
     E `text-overflow: ellipsis` NAO VALE para filho de flex — entao o nome
     era cortado no meio da palavra, sem reticencia, sem `title`, e sem
     nada que rolasse para alcancar o resto. Medido a 390px: um nome de 405px
     dentro de 314px visiveis.
     Em modo cartao nao ha coluna a proteger; truncar aqui so esconde o nome. */
  .tabela-vira-cartao td.nome {
    max-width: none;
    white-space: normal;
    overflow: visible;
    overflow-wrap: anywhere;
  }
  .tabela-vira-cartao td:first-child::before { display: none; }
  .tabela-vira-cartao .esconde-celular { display: none; }
  .tabela-fixa th:first-child, .tabela-fixa td:first-child { position: static; box-shadow: none; }

  /* --- acao em massa nao existe no telefone --- */

  /* --- filtros empilham --- */
  .filtros { flex-direction: column; align-items: stretch; padding: var(--e5); }
  .filtros .campo, .filtros .busca { min-width: 0; flex: 1 1 auto; }

  /* --- modal vira folha de rodape --- */

  /* --- resto --- */
  .ficha { grid-template-columns: 1fr 1fr; }
  .grade-auto, .grade-2 { grid-template-columns: 1fr 1fr; }
  body .entrada-pagina { padding: var(--e5); }
}

@media (max-width: 560px) {
  .conteudo { padding: var(--e4); padding-bottom: var(--e10); }
  .grade-auto, .grade-2 { grid-template-columns: 1fr; }
  .ficha { grid-template-columns: 1fr; }
  .num-cartao .valor { font-size: var(--t-2xl); }
  .pagina-acoes { flex-direction: column; }
  .pagina-acoes .bt { width: 100%; }
  h1 { font-size: var(--t-xl); }
  .vazio, .vazio-filtro{ padding: var(--e12) var(--e5); }

  /* No telefone o titulo da barra de topo sai. Ele repete palavra por
     palavra o <h1> que aparece logo abaixo, e nesta largura os selos de
     "Modo simulado" e de ambiente disputam a mesma linha com ele. Entre
     repetir o titulo e mostrar que NADA esta sendo enviado ao fornecedor,
     o aviso ganha. O texto continua no HTML, entao o leitor de tela
     continua ouvindo o titulo da pagina.                                 */
  .topo > strong { display: none; }
}

/* Formulario no telefone: o botao principal fica colado no rodape,
   sempre visivel, sem precisar rolar ate o fim para confirmar.           */
@media (max-width: 860px) {
}


/* ==========================================================================
   8. UTILITARIOS
   Poucos, de proposito. Utilitario demais vira framework de novo.
   ========================================================================== */
.mt2 { margin-top: var(--e2); }
.mt4 { margin-top: var(--e4); } .mt6 { margin-top: var(--e6); } .mt8 { margin-top: var(--e8); }
.mb4 { margin-bottom: var(--e4); } .mb6 { margin-bottom: var(--e6); }

.t2 { color: var(--texto-2); } .t3 { color: var(--texto-3); }
.p-forte { font-weight: var(--p-forte); }
.pequeno { font-size: var(--t-sm); }
.mini { font-size: var(--t-xs); }
.nao-quebra { white-space: nowrap; }

@media (max-width: 860px) { .so-computador { display: none !important; } }
@media (min-width: 861px) { }

/* Impressao: relatorio de simulacao e fatura saem em papel. */
@media print {
  .lateral, .topo, .pagina-acoes, .paginacao, .filtros { display: none !important; }
  .app { display: block; }
  .conteudo { max-width: none; padding: 0; }
  .cartao, .tabela-caixa, .num-cartao { border-color: #999; box-shadow: none; break-inside: avoid; }
  .tabela thead th { position: static; background: #eee; color: #000; }
  body { background: #fff; color: #000; font-size: 11pt; }
  a[href]::after { content: " (" attr(href) ")"; font-size: 9pt; color: #555; }
}


/* ==========================================================================
   GRUPO CONFIGURACAO  (secao CFG)
   parametros.html · usuarios.html · integracoes.html · diagnostico.html · erro.html

   Secao acrescentada DEPOIS do sistema base, de proposito: nada aqui
   reescreve regra das secoes 1 a 8. Se uma peca daqui virar util em outra
   tela, o certo e promove-la para a secao 5 e apagar daqui.

   ------------------------------------------------------------------------
   O PROBLEMA QUE ESTA SECAO RESOLVE

   Tela de configuracao vira paredao. /parametros tem 20 campos em 5 grupos;
   desenhados como 20 caixas iguais numa grade de duas colunas, viram um
   formulario que ninguem le — a pessoa procura UM numero no meio de vinte e
   desiste de conferir os outros dezenove.

   A saida e a mesma que Ajustes do macOS, Stripe e Linear usam: cada
   parametro e uma LINHA, nao uma caixa. Nome e explicacao de um lado,
   controle do outro, um fio separando. O olho desce pela coluna da esquerda
   lendo nomes, e so entra na direita quando achou o que queria.
   ========================================================================== */

/* --------------------------------------------------------------------------
   CFG.1 INDICE DOS GRUPOS

   Cinco secoes numa pagina longa: sem indice, so existe a barra de rolagem.
   Sao ancoras (#), nao JavaScript: funciona com o script desligado, o
   endereco fica compartilhavel ("olha o grupo de Custos") e o botao de
   voltar do navegador continua fazendo o que a pessoa espera.
   -------------------------------------------------------------------------- */
.config-indice {
  display: flex; flex-wrap: wrap; gap: var(--e2);
  margin-bottom: var(--e8);
}
.config-indice a {
  display: inline-flex; align-items: center; gap: var(--e2);
  min-height: 36px; padding: 0 var(--e4);
  border: 1px solid var(--borda);
  border-radius: var(--r-pilula);
  background: var(--fundo-cartao);
  color: var(--texto-2);
  font-size: var(--t-sm); font-weight: var(--p-medio);
  text-decoration: none;
  transition: background var(--transicao), border-color var(--transicao),
              color var(--transicao);
}
/* Violeta no hover porque isto E link, e link e acao. */
.config-indice a:hover {
  background: var(--acao-fundo);
  border-color: var(--acao-borda);
  color: var(--acao-txt);
}
/* Quantos parametros do grupo sairam do padrao de fabrica. Zero nao aparece:
   o template so imprime a bolinha quando ha algo alterado, senao o indice
   ficaria com cinco zeros pedindo atencao a toa.                          */
.config-indice .conta {
  padding: 1px 7px;
  border-radius: var(--r-pilula);
  background: var(--ap-fundo); color: var(--ap-txt);
  border: 1px solid var(--ap-borda);
  font-size: var(--t-xs); font-weight: var(--p-titulo);
  font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   CFG.2 SECAO DE CONFIGURACAO
   -------------------------------------------------------------------------- */
.config-secao {
  /* A barra de topo e fixa. Sem esta folga, pular para a ancora esconde o
     titulo do grupo debaixo dela e a pessoa acha que caiu no lugar errado. */
  scroll-margin-top: calc(var(--topo) + var(--e6));
}
.config-secao + .config-secao { margin-top: var(--e10); }

.config-secao-topo {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--e3);
  margin-bottom: var(--e5);
}
.config-secao-topo h2 { font-size: var(--t-xl); }
.config-secao-topo .meta {
  font-size: var(--t-sm); color: var(--texto-3);
  font-variant-numeric: tabular-nums;
}

/* Listas com marcador dentro de cartao.

   ol.regras-fixas   passos/regras contaveis  -> numero
   ul.lista-notas    avisos soltos            -> disco

   ATENCAO AO SELETOR, ele parece redundante e nao e. O reset da secao 2 tem
   `ul[class], ol[class] { list-style: none }`, que vale (0,1,1) de
   especificidade: QUALQUER lista com classe perde o marcador. Uma regra
   escrita so como `.regras-fixas` vale (0,1,0) e perde do reset — a lista
   sairia sem numero nenhum. Escrita como `ol.regras-fixas` ela empata em
   (0,1,1), e o empate e decidido pela ordem no arquivo: esta secao vem
   depois do reset, entao ganha.

   E aqui o marcador e CONTEUDO, nao enfeite: sao tres regras, contaveis e
   separadas, e nao um paragrafo com pontos finais no meio.               */
ol.regras-fixas,
ul.lista-notas {
  margin: 0;
  padding-left: var(--e6);
  max-width: var(--largura-leitura);
}
ol.regras-fixas { list-style: decimal; }
ul.lista-notas  { list-style: disc; }

ol.regras-fixas li,
ul.lista-notas li { margin-bottom: var(--e2); }
ol.regras-fixas li:last-child,
ul.lista-notas li:last-child { margin-bottom: 0; }
ol.regras-fixas li::marker { color: var(--texto-3); font-weight: var(--p-forte); }
ul.lista-notas li::marker  { color: var(--texto-3); }

/* Fieldset como agrupador de campos.

   O <fieldset> fica pelo que ele faz por quem usa leitor de tela — o
   <legend> vira o rotulo do grupo inteiro, e "Marcado: Listar consultas"
   passa a ser anunciado dentro de "O que esta chave pode fazer". O que ele
   DESENHA (moldura e recuo do proprio navegador) nao combina com nada do
   sistema e sai. O min-width: 0 e o conserto classico do fieldset que se
   recusa a encolher dentro de um flex ou grid.                           */
.campo-grupo {
  display: grid;
  gap: var(--e2);
  border: 0; padding: 0; margin: 0;
  min-width: 0;
}
.campo-grupo > legend {
  padding: 0;
  font-size: var(--t-sm);
  font-weight: var(--p-forte);
  color: var(--texto);
}

/* --------------------------------------------------------------------------
   CFG.3 LINHA DE CONFIGURACAO — a peca principal desta secao

   Duas colunas: identidade a esquerda, controle a direita.

   O controle e alinhado a ESQUERDA da propria coluna, nao a direita como
   faz o macOS. La todos os controles tem a mesma largura; aqui nao — tem
   campo de 120px (percentual), de 180px (teto) e select de largura cheia.
   Alinhados a direita eles fariam um serrilhado na borda esquerda. Colados
   a esquerda formam uma linha reta que o olho desce sem tropeco.
   -------------------------------------------------------------------------- */
.config-lista {
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--r3);
  box-shadow: var(--sombra1);
  overflow: hidden;   /* para o realce da esquerda respeitar o canto do cartao */
}

.config-linha {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 300px);
  gap: var(--e4) var(--e8);
  align-items: start;
  padding: var(--e6);
  border-top: 1px solid var(--borda);
}
.config-linha:first-child { border-top: 0; }

/* Parametro fora do padrao de fabrica.

   O realce e o LARANJA DE APOIO, nao o ambar de atencao e muito menos o
   violeta de acao. Sair do padrao nao e defeito nem erro: e alguem tendo
   feito o trabalho de ajustar o sistema. O laranja e o calor da marca
   marcando "aqui a mao humana passou", que e exatamente a informacao que o
   administrador procura quando abre esta tela.

   O realce e box-shadow embutida e nao border-left para nao deslocar o
   conteudo da linha em 3px quando o valor muda.                           */
.config-linha[data-alterado] { box-shadow: inset 3px 0 0 var(--ap-solido); }

.config-info { min-width: 0; }
.config-info > label {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2);
  font-size: var(--t-md);
  font-weight: var(--p-forte);
  color: var(--texto);
  letter-spacing: -0.005em;
  cursor: pointer;
}
.config-ajuda {
  margin-top: var(--e2);
  max-width: 56ch;   /* explicacao e texto de leitura, nao legenda */
  font-size: var(--t-sm);
  color: var(--texto-2);
  line-height: var(--lh-normal);
}

.config-controle { display: flex; flex-direction: column; gap: var(--e2); min-width: 0; }
/* Campo com unidade colada ("%", "dias"): o sufixo faz parte do controle. */
.config-controle .linha { flex-wrap: nowrap; gap: var(--e2); }
.config-sufixo { color: var(--texto-2); font-size: var(--t-sm); white-space: nowrap; }

/* A ficha do valor: onde ele esta em relacao ao padrao de fabrica. */
.config-estado {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2);
  font-size: var(--t-xs);
  color: var(--texto-3);
}
.config-alterado {
  display: inline-flex; align-items: center;
  padding: 2px var(--e2);
  border: 1px solid var(--ap-borda);
  border-radius: var(--r-pilula);
  background: var(--ap-fundo); color: var(--ap-txt);
  font-weight: var(--p-forte);
}

/* Larguras de controle, na mesma convencao dos botoes (-p pequeno, -m medio).
   Numero curto em campo largo mente sobre o que se espera ali: um campo de
   400px para "3 dias" pede um texto que nao existe.                        */
.controle-p { max-width: 130px; }
.controle-m { max-width: 200px; }

/* Modificador de grade: cartoes de alturas diferentes param de esticar para
   igualar o mais alto. O padrao do grid (align-items: stretch) e o certo
   quando os cartoes sao irmaos de mesmo peso; quando um tem seis linhas e o
   outro tem dez, o menor vira um cartao com um palmo de vazio embaixo do
   proprio rodape.                                                          */
.grade-topo { align-items: start; }

/* Formulario de CRIACAO (dar acesso a alguem, gerar chave). Aqui a linha de
   duas colunas do .config-linha nao serve: aquela e para REVER valores que
   ja existem, e o olho percorre a coluna da esquerda. Para PREENCHER, o que
   funciona e a pilha de uma coluna so — rotulo em cima, campo embaixo, um
   caminho unico de cima para baixo. O que a coluna unica precisa e de um
   teto de largura: campo de nome com 900px convida a escrever um paragrafo. */
.config-forma { max-width: 38rem; }

/* --------------------------------------------------------------------------
   CFG.3b MATRIZ DE ALCADA (quem pode o que)

   A primeira celula de cada linha e <th scope="row">, nao <td>. Numa grade
   de quatro colunas de "Sim / Aprovação / Não", quem usa leitor de tela
   ouviria quatro respostas sem a pergunta. Com o th de linha, o leitor
   anuncia "beneficiario.ver, Administrador, Sim".

   O th de corpo nao herda nada do thead (as regras da secao 5.5 sao
   `thead th`), entao o basico dele vem aqui — inclusive a zebra e o hover
   da primeira coluna grudada, que na secao 5.5 so falam de td.
   -------------------------------------------------------------------------- */
.tabela-alcada tbody th {
  padding: var(--e4) var(--e5);
  border-bottom: 1px solid var(--borda);
  text-align: left;
  font-weight: var(--p-medio);
  vertical-align: middle;
}
.tabela-alcada tbody tr:last-child th { border-bottom: 0; }
.tabela-alcada tbody tr:nth-child(even) th:first-child { background: var(--fundo-zebra); }
.tabela-alcada tbody tr:hover th:first-child { background: var(--fundo-hover); }

/* A MATRIZ EDITAVEL. Quatro colunas de escolha por linha, 31 linhas.

   `selecao-p` e a versao estreita: a `selecao` normal tem largura de campo de
   formulario, e quatro delas lado a lado numa celula de tabela estouram a
   grade no computador — e a tabela ja rola de lado no telefone.             */
.selecao-p {
  min-width: 0;
  width: 100%;
  padding: var(--e1) var(--e2);
  font-size: var(--t-sm);
}
/* A celula fora do padrao tem de PARECER fora do padrao. Sem isto ninguem
   distingue o que alguem decidiu do que veio de fabrica — e a pergunta de
   quem abre esta tela e exatamente essa.                                    */
.selecao-p[data-mudado] {
  border-color: var(--at-solido);
  border-width: 2px;
  font-weight: var(--p-medio);
}
/* O nome tecnico da acao, para quem for procurar no codigo. Fica pequeno e
   embaixo: a linha principal e a frase em portugues.                        */
.mostra-codigo { display: block; font-family: var(--fonte-numero); }

/* O AVISO da celula da matriz de alcada. Fica EMBAIXO do seletor, e nao
   num `title`: aviso escondido atras do mouse nao existe no telefone, e a
   decisao de quem alcanca o que se toma tanto num quanto no outro.        */
.aviso-celula {
  margin: var(--e2) 0 0;
  font-size: var(--t-xs);
  line-height: 1.35;
  color: var(--at-txt);
  text-align: left;
}
/* Seletor cuja escolha ATUAL nao tem aviso, mas alguma outra tem: uma marca
   discreta, para a pessoa saber que ha o que ler antes de mudar.          */
.selecao-p[data-tem-aviso] { border-color: var(--at-borda); }

/* Legenda das tres respostas possiveis. Sem ela, "Aprovação" numa celula e
   um selo ambar que a pessoa tem de adivinhar.                            */
.legenda-alcada {
  display: flex; flex-wrap: wrap; gap: var(--e3) var(--e6);
  align-items: center;
}
.legenda-alcada > span {
  display: inline-flex; align-items: center; gap: var(--e2);
  font-size: var(--t-sm); color: var(--texto-2);
}

/* --------------------------------------------------------------------------
   CFG.4 BARRA DE ACAO GRUDADA NO RODAPE DO FORMULARIO

   /parametros e uma pagina longa. Com o botao de salvar so no fim, quem
   mexe no primeiro grupo precisa rolar cinco secoes para confirmar — e no
   caminho esquece se mexeu. A barra fica a vista o tempo todo.

   Nao reaproveita .forma-pe (secao 7) de proposito: aquela so existe no
   celular e cola nas bordas da tela. Esta vale em qualquer largura e e um
   objeto flutuante com canto e sombra, o que a mantem legivel por cima do
   conteudo que passa por baixo.
   -------------------------------------------------------------------------- */
.config-barra {
  position: sticky; bottom: var(--e4); z-index: 5;
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--e4);
  margin-top: var(--e8);
  padding: var(--e4) var(--e6);
  /* Sem isto a barra estoura 4px para fora no celular: o padding lateral entra
     por cima da largura do pai em vez de dentro dela, e a pagina inteira ganha
     rolagem horizontal por causa de uma barra so. `min-width: 0` protege o
     mesmo caso quando um filho longo (o nome de um parametro) nao quebra. */
  box-sizing: border-box;
  max-width: 100%;
  min-width: 0;
  border: 1px solid var(--borda);
  border-radius: var(--r3);
  background: color-mix(in srgb, var(--fundo-cartao) 90%, transparent);
  backdrop-filter: saturate(180%) blur(12px);
  box-shadow: var(--sombra2);
}
@supports not (backdrop-filter: blur(1px)) {
  .config-barra { background: var(--fundo-cartao); }
}
@supports not (color: color-mix(in srgb, red, blue)) {
  .config-barra { background: var(--fundo-cartao); }
}
/* A barra carrega SO as acoes. Texto explicativo mora fora dela: pendurado
   aqui dentro, ele engorda a barra e no celular passa a ocupar um quarto da
   tela o tempo todo, para dizer uma coisa que se le uma vez.              */

/* --------------------------------------------------------------------------
   CFG.5 OPCAO MARCAVEL — caixa de marcar que virou cartao

   Usada nos escopos da chave de API. Uma caixinha de 18px com um texto ao
   lado tem alvo de toque de 18px e nenhum limite visivel entre uma opcao e
   a seguinte. Como cartao, o alvo e a linha inteira, o estado marcado se ve
   de longe, e "o que esta chave pode fazer" para de ser uma lista e vira
   uma escolha.

   O realce do marcado usa :has(). Onde :has() nao existe, o unico que se
   perde e o fundo violeta — a caixa nativa continua marcada e o formulario
   funciona igual. Degrada sozinho, sem script.
   -------------------------------------------------------------------------- */
.opcao-lista { display: grid; gap: var(--e3); }

.opcao-marcavel {
  display: flex; align-items: flex-start; gap: var(--e3);
  padding: var(--e4);
  border: 1px solid var(--borda-forte);
  border-radius: var(--r2);
  background: var(--fundo-cartao);
  cursor: pointer;
  transition: background var(--transicao), border-color var(--transicao);
}
.opcao-marcavel:hover { background: var(--fundo-hover); border-color: var(--texto-3); }
.opcao-marcavel input[type="checkbox"] {
  flex: none;
  width: 18px; height: 18px; margin: 2px 0 0;
  accent-color: var(--acao-solido);
  cursor: pointer;
}
.opcao-marcavel .titulo { display: block; font-weight: var(--p-medio); color: var(--texto); }
.opcao-marcavel .chave {
  display: block; margin-top: 2px;
  font-family: var(--fonte-numero); font-size: var(--t-xs);
  color: var(--texto-3);
}
.opcao-marcavel:has(input:checked) {
  background: var(--acao-fundo);
  border-color: var(--acao-borda);
}
.opcao-marcavel:has(input:checked) .chave { color: var(--acao-txt); }
/* O anel de foco tem que aparecer no CARTAO, nao so na caixinha de 18px
   escondida no canto dele.                                                */
.opcao-marcavel:has(input:focus-visible) {
  outline: 3px solid var(--foco);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   CFG.6 CHAVE RECEM-CRIADA

   O unico momento da vida do sistema em que a chave inteira existe na tela.
   Se a pessoa fechar a pagina sem copiar, acabou: nao ha como recuperar.
   Entao este bloco e deliberadamente o objeto mais pesado da tela.

   user-select: all faz um clique selecionar a chave inteira. Chave de 40 e
   poucos caracteres selecionada a mao com o cursor perde um caractere na
   ponta e ninguem percebe ate a integracao do parceiro falhar.

   NAO usa .cod: .cod tem white-space: nowrap, certo para CPF e errado aqui.
   Uma chave de 43 caracteres com nowrap estoura a caixa para o lado.
   -------------------------------------------------------------------------- */
.chave-revelada {
  background: var(--fundo-cartao);
  border: 1px solid var(--ok-borda);
  border-left: 4px solid var(--ok-solido);
  border-radius: var(--r3);
  box-shadow: var(--sombra2);
}
.chave-revelada .cartao-topo { border-bottom-color: var(--ok-borda); }
.chave-revelada .cartao-topo h3 { color: var(--ok-txt); }

.chave-valor {
  display: block;
  margin: 0 0 var(--e4);
  padding: var(--e5);
  background: var(--fundo-sutil);
  border: 1px dashed var(--borda-forte);
  border-radius: var(--r2);
  font-family: var(--fonte-numero);
  font-size: var(--t-md);
  line-height: 1.5;
  color: var(--texto);
  overflow-wrap: anywhere;
  user-select: all;
}

/* --------------------------------------------------------------------------
   CFG.7 BLOCO DE CODIGO E SELO DE ESCOPO
   -------------------------------------------------------------------------- */
.bloco-codigo {
  margin: 0;
  padding: var(--e5);
  background: var(--fundo-sutil);
  border: 1px solid var(--borda);
  border-radius: var(--r2);
  /* A rolagem lateral mora na propria caixa. Sem isto, uma linha de curl
     longa alarga a pagina inteira e o corpo passa a rolar para o lado.    */
  overflow-x: auto;
  font-family: var(--fonte-numero);
  font-size: var(--t-sm);
  line-height: var(--lh-densa);
  color: var(--texto);
}

/* Escopo de chave numa celula de tabela.

   Antes isto era .marca-alerta, que e a caixa tracejada AMBAR de "cuidado
   com este dado". Escopo nao e alerta: e a ficha tecnica da chave. Com o
   ambar, toda linha da tabela aparecia com quatro avisos e o olho parava de
   acreditar em qualquer aviso da tela. Aqui e neutro, monoespacado, e quem
   carrega o alerta e o selo de ambiente, onde "Produção" e mesmo grave.   */
.marca-escopo {
  display: inline-flex; align-items: center;
  padding: 2px var(--e2);
  border: 1px solid var(--borda-forte);
  border-radius: var(--r1);
  background: var(--fundo-sutil);
  color: var(--texto-2);
  font-family: var(--fonte-numero);
  font-size: var(--t-xs);
  white-space: nowrap;
}

/* Celula que carrega VARIOS valores, e nao um. A margem que fazia esse
   trabalho saiu da .marca-escopo e virou o gap daqui, que e o lugar certo:
   espacamento entre irmaos e problema do pai.

   O invólucro nao e enfeite, e conserto. No celular a celula da tabela vira
   uma linha de `display: flex` com `justify-content: space-between`
   (secao 7). Cada escopo SOLTO contava como um item dessa linha: uma chave
   com tres escopos virava rotulo + tres itens disputando 301px, e apenas o
   primeiro aparecia — os outros dois saiam pela direita do cartao, sem
   nenhum sinal de que existiam. Com o invólucro a celula volta a ter dois
   itens, rotulo e valor, e a lista quebra em quantas linhas precisar.     */
.celula-marcas {
  display: flex;
  flex-wrap: wrap;
  gap: var(--e1);
  min-width: 0;
}

/* --------------------------------------------------------------------------
   CFG.8 CARTAO DE FATO E BARRA DE QUANTIDADE (diagnostico)
   -------------------------------------------------------------------------- */
/* .num-cartao com PALAVRA no lugar do numero: "Produção", "Simulado".
   40px em ExtraBold e a medida de um numero de quatro digitos; a mesma
   medida numa palavra de doze letras quebra em duas linhas e o cartao pula
   de altura em relacao aos vizinhos.                                      */
.num-cartao .valor.palavra {
  font-size: var(--t-xl);
  line-height: var(--lh-titulo);
  letter-spacing: var(--entreletra-titulo);
}

/* Barra de proporcao ao lado da contagem de linhas de cada tabela.
   Numero solto nao responde "esta base e grande?"; a barra responde antes
   de a pessoa ler o numero. Neutra de proposito: e dado, nao e situacao.  */
.barra-qtd {
  display: block; height: 4px; width: 100%;
  margin-top: 6px;
  border-radius: var(--r-pilula);
  background: var(--neu-fundo);
  overflow: hidden;
}
.barra-qtd i { display: block; height: 100%; background: var(--neu-solido); border-radius: inherit; }

/* --------------------------------------------------------------------------
   CFG.9 PAGINA DE ERRO

   A tela de erro nao herda o esqueleto: um erro pode acontecer justamente
   porque falta o que o menu precisa para desenhar. Entao ela traz o proprio
   layout — e a propria marca, que e o que diz a pessoa "voce continua
   dentro do sistema, so nao deu para seguir".

   POR QUE ELA NAO E VERMELHA:
   as tres situacoes que caem aqui sao 403, 404 e 500. Nenhuma e culpa de
   quem esta olhando, e duas nem sao defeito: 403 e a alcada funcionando e
   404 e um endereco que nao existe. Uma tela cheia de vermelho transforma
   "voce nao tem alcada para isso" em "voce quebrou alguma coisa" — e num
   sistema de saude a pessoa do outro lado pode estar com alguem esperando.
   A cor entra so num fio de 3px no topo do cartao, e a hierarquia e feita
   com tamanho e espaco, nao com susto.
   -------------------------------------------------------------------------- */
.erro-pagina {
  min-height: 100dvh;
  display: grid; place-items: center;
  padding: var(--e8);
  /* O mesmo brilho da tela de entrada: violeta de um canto, laranja de
     apoio do outro. E o que faz a pagina parecer da ConectaOn e nao a tela
     branca de erro que qualquer servidor devolve.                         */
  background:
    radial-gradient(1200px 640px at 10% -12%, rgba(162, 76, 255, .16), transparent 62%),
    radial-gradient(900px 540px at 110% 112%, rgba(231, 118, 66, .10), transparent 60%),
    var(--fundo-pagina);
}
.erro-caixa { width: min(560px, 100%); }

.erro-marca {
  display: inline-flex; align-items: center; gap: var(--e3);
  margin-bottom: var(--e6);
  font-family: var(--fonte-marca);
  font-size: var(--t-lg);
  font-weight: var(--p-marca);
  letter-spacing: var(--entreletra-marca);
  color: var(--texto);
  text-decoration: none;
}
.erro-marca .ponto {
  flex: none;
  width: 34px; height: 26px;   /* 256x195 do arquivo: nao e quadrado */
  background: url("/estatico/marca/simbolo.png") center / contain no-repeat;
}

.erro-cartao {
  position: relative;
  padding: var(--e10) var(--e8);
  background: var(--fundo-cartao);
  border: 1px solid var(--borda);
  border-radius: var(--r4);
  box-shadow: var(--sombra2);
  overflow: hidden;
}
/* O fio de cor. E toda a cor que a tela tem. */
.erro-cartao::before {
  content: "";
  position: absolute; inset: 0 0 auto;
  height: 3px;
  background: var(--neu-solido);
}
.erro-cartao[data-tom="atencao"]::before { background: var(--at-solido); }

.erro-tipo {
  display: block;
  margin-bottom: var(--e3);
  font-size: var(--t-xs); font-weight: var(--p-forte);
  letter-spacing: var(--entreletra-rotulo); text-transform: uppercase;
  color: var(--texto-3);
}
.erro-cartao h1 { font-size: var(--t-2xl); margin-bottom: var(--e4); }
.erro-cartao p { color: var(--texto-2); max-width: 52ch; line-height: var(--lh-normal); }
.erro-cartao p + p { margin-top: var(--e4); }
.erro-destaque { color: var(--texto) !important; font-size: var(--t-md); }

.erro-acoes {
  display: flex; flex-wrap: wrap; gap: var(--e3);
  margin-top: var(--e8);
}
/* O codigo tecnico fica no rodape, pequeno e selecionavel de uma vez so:
   e o que a operacao pede quando alguem liga. Nao e o assunto da tela,
   entao nao pode ser a primeira coisa que a pessoa le.                    */
.erro-ref {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2);
  margin-top: var(--e8);
  padding-top: var(--e5);
  border-top: 1px solid var(--borda);
  font-size: var(--t-xs); color: var(--texto-3);
}
.erro-ref code {
  font-family: var(--fonte-numero);
  padding: var(--e1) var(--e2);
  background: var(--fundo-sutil);
  border: 1px solid var(--borda);
  border-radius: var(--r1);
  user-select: all;
}

/* --------------------------------------------------------------------------
   CFG.10 CELULA DE IDENTIDADE

   Achado medindo no navegador a 1280px, que e a largura da maioria das
   maquinas da operacao. As duas tabelas de administracao NAO cabiam:

     /usuarios     7 colunas pedindo 1021px numa caixa de  942
     /integracoes  8 colunas pedindo 1254px numa caixa de  942

   O .tabela-rolagem segurava o estouro, entao nada aparecia quebrado — e era
   por isso que passava despercebido. O que caia fora da borda direita era
   sempre a ULTIMA coluna, que e justamente a acao da linha: "Tirar acesso" e
   "Revogar". Em /integracoes caiam duas, e a Situacao ia junto: a tela
   escondia se a chave esta ativa, numa pagina que existe para responder isso.

   Rolar de lado nao resolve. Ninguem rola uma tabela para descobrir que
   existe um botao ali; a pessoa conclui que a acao nao existe. Era preciso
   gastar menos coluna, e o jeito honesto de gastar menos coluna e parar de
   dar uma coluna inteira para cada pedaco da MESMA identidade.

   Uma pessoa e nome + e-mail. Uma chave e nome + parceiro + prefixo +
   ambiente. Empilhados numa celula so — nome em cima, o resto numa linha de
   apoio embaixo — eles ocupam a largura do MAIOR e nao a soma de todos.
   Medido depois: 811px em /usuarios e 838px em /integracoes, os dois com
   folga sobrando dentro dos 942.

   Nada foi escondido: os mesmos dados continuam na tela, e no celular a
   mudanca melhora o cartao, porque o nome vira titulo de verdade com a
   identificacao logo abaixo em vez de virar mais duas linhas de rotulo.

   PARA QUEM FOR CONSOLIDAR ESTE ARQUIVO DEPOIS:
   a secao OP2, escrita ao mesmo tempo que esta, tem uma peca com a mesma
   ideia e outro nome — a .dupla, com os mesmos filhos .principal e .apoio.
   Sao duas invencoes paralelas do mesmo componente, e o certo e sobrar UMA,
   promovida para a secao 5. Nao unificamos aqui porque as duas secoes
   estavam sendo escritas na mesma rodada e trocar a classe de baixo do pe de
   quem esta editando quebraria a tela dele. Fica registrado de proposito.
   -------------------------------------------------------------------------- */
.identidade { display: block; min-width: 0; }
.identidade .principal {
  display: block;
  font-weight: var(--p-forte);
  color: var(--texto);
}
/* A linha de apoio fica um degrau abaixo em tamanho E em cor. Se ela
   competisse com o nome, a celula deixaria de ter um titulo e voltaria a ser
   duas colunas coladas — que e exatamente o que esta secao veio desfazer. */
.identidade .apoio {
  display: flex; flex-wrap: wrap; align-items: center;
  /* Sem ponto separador, so folga. A versao com "·" entre os itens funciona
     enquanto a linha cabe inteira; quando ela quebra, o ponto sobra no comeco
     da linha de baixo apontando para o nada. A mesma decisao ja tinha sido
     tomada na .entidade-meta da secao LD.8, pelo mesmo motivo. O que separa
     aqui e a folga mais a diferenca de forma: o selo e pilula, o parceiro e
     Poppins e o prefixo e monoespacado. */
  gap: var(--e1) var(--e4);
  margin-top: 3px;
  font-family: var(--fonte-texto);   /* no cartao do celular o pai vira Inter */
  font-size: var(--t-xs);
  font-weight: var(--p-normal);
  line-height: var(--lh-densa);
  color: var(--texto-3);
}
.identidade .apoio > .selo { flex: none; }

/* O E-MAIL PRECISA QUEBRAR, MESMO SEM TER ONDE.
   A `.apoio` foi desenhada para quebrar em varias linhas — e por isso o
   `flex-wrap: wrap` acima. So que ela quebra ENTRE os filhos, e quando o
   filho e um so, e ele e um e-mail, nao ha entre. E-mail e um token sem
   espaco: sem uma regra explicita, ele nao quebra em lugar nenhum.

   Medido em /usuarios a 1440px, com um e-mail de 56 caracteres:
   a caixa tem 272px (o teto de `.identidade` no computador), o texto mede
   360px, e como o `overflow` e `visible` ele nao para na borda da celula —
   pinta 41px PARA DENTRO da coluna vizinha, por cima do selo do perfil. O
   fim do endereco fica ilegivel e nao ha rolagem que resolva, porque a
   tabela nem fica mais larga: o texto simplesmente sobrepoe o vizinho.

   `anywhere` e nao `break-word`: so o primeiro entra no calculo de
   min-content, e e isso que impede o e-mail de tambem alargar a coluna e
   empurrar a de acao para fora (era o mesmo defeito, visto de outro lado).*/
.identidade .apoio { overflow-wrap: anywhere; }

/* O teto de largura vale so no computador, e e ele que impede um nome de
   parceiro comprido de reabrir o estouro que esta secao veio fechar. No
   celular nao ha coluna vizinha para proteger: o cartao usa a largura toda.

   A linha de apoio QUEBRA em vez de cortar com reticencias, e isso e
   deliberado: quem corta perde o fim do prefixo da chave ("con_7kL0pR…"),
   que e justamente o pedaco pelo qual se acha a chave no registro do
   servidor. Perder duas linhas de altura e barato; perder o identificador
   nao e. Ja o NOME corta, porque ele continua inteiro no title. */
@media (min-width: 861px) {
  .tabela td .identidade { max-width: 17rem; }
  .identidade .principal { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}


/* --------------------------------------------------------------------------
   CFG.11 CELULAR
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  /* A linha de configuracao empilha: nome e explicacao em cima, controle
     embaixo. Duas colunas em 375px dariam 150px para cada uma.            */
  .config-linha {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--e3);
    padding: var(--e5);
  }
  .config-ajuda { max-width: none; }
  /* No celular o campo ocupa a largura toda: a economia de espaco nao
     compensa um alvo de toque estreito.                                   */
  .controle-p, .controle-m { max-width: none; }

  /* O indice dos grupos nasce com 36px, que e o certo no computador e falha
     no telefone: a regra do projeto e 44px de alvo de toque em tudo que se
     aperta, e a lista da secao 7 que sobe todo mundo para 44 nao conhece
     esta peca, que nasceu depois dela. Sao cinco alvos em fila, com 8px
     entre eles — errar o dedo em um e cair no vizinho.                    */
  .config-indice a { min-height: var(--toque); }

  .config-barra {
    /* Colada no rodape da area visivel, sem folga lateral: no telefone ela
       e a barra de acao da tela, nao um objeto flutuante.                 */
    position: sticky; bottom: 0;
    flex-direction: column; align-items: stretch;
    margin-inline: calc(var(--e5) * -1);
    /* O max-width: 100% da regra de cima existe para o computador, onde a
       barra nao sangra. Aqui ela PRECISA passar da largura do pai, que e
       exatamente o que a margem negativa esta pedindo — e com o teto de 100%
       ela ficava presa nos 343px do miolo, encostada na esquerda e com um
       vao de 32px sobrando na direita. O estouro que aquele teto tentava
       conter agora esta resolvido na origem, na margem.                   */
    max-width: none;
    padding-bottom: calc(var(--e4) + env(safe-area-inset-bottom));
    border-radius: 0;
    border-inline: 0;
  }
  /* Empilhados e nao lado a lado: "Salvar parâmetros" em 375px divididos em
     dois nao cabe sem cortar, e .bt tem white-space: nowrap — cortaria o
     rotulo em vez de quebrar.                                             */
  .config-barra .bt { width: 100%; }

  .config-secao + .config-secao { margin-top: var(--e8); }
  .erro-pagina { padding: var(--e5); }
  .erro-cartao { padding: var(--e8) var(--e5); }

  /* A MATRIZ DE ALCADA VOLTA A GRUDAR A PRIMEIRA COLUNA NO TELEFONE.

     A secao 7 desliga o grude de .tabela-fixa no celular, e faz certo: la
     ele existe para a tabela que vira cartao, e coluna grudada dentro de um
     cartao nao quer dizer nada. So que esta tabela nao vira cartao — e a
     unica do sistema que continua sendo grade no telefone, de proposito,
     porque matriz existe para comparar e comparar exige ver a grade. O
     proprio teste de celular abre excecao para ela.

     Sem o grude, o efeito medido a 375px: a matriz pede 749px numa caixa de
     341, e rolar 300px para o lado leva o nome da acao para fora da tela.
     Sobra uma grade de "Sim / Aprovação / Não" sem a pergunta — quatro
     respostas para uma coluna que a pessoa nao tem mais como saber qual e.

     O fundo tem de ser opaco em TODAS as linhas, e nao so nas pares como na
     regra de zebra da CFG.3b: numa coluna grudada, linha sem fundo deixa o
     resto da tabela passar por baixo do texto.                            */
  .tabela-alcada.tabela-fixa th:first-child {
    position: sticky; left: 0; z-index: 1;
    background: var(--fundo-cartao);
    box-shadow: 1px 0 0 var(--borda);
  }
  .tabela-alcada.tabela-fixa thead th:first-child { background: var(--fundo-sutil); z-index: 3; }
  .tabela-alcada.tabela-fixa tbody tr:nth-child(even) th:first-child { background: var(--fundo-zebra); }
  .tabela-alcada.tabela-fixa tbody tr:hover th:first-child { background: var(--fundo-hover); }

  /* Celula de lista no cartao: o rotulo fica numa linha e a lista na de
     baixo, encostada a esquerda.

     Nao e capricho, e aritmetica. No cartao de 375px a celula tem 301px de
     miolo; o rotulo pode ocupar ate 45% dela e ainda ha 24px de folga entre
     os dois, o que deixa cerca de 142px para o valor. A maior pastilha,
     "elegibilidade:consultar", pede 184px. Lado a lado ela nao cabe de jeito
     nenhum: sobra por cima do rotulo ou sai pela direita. Numa linha
     propria, cabe com folga e a lista inteira fica legivel.

     A classe entra no <td> pelo template em vez de sair de um :has(): assim
     a regra vale igual em navegador antigo, e neste caso o que esta em jogo
     e a lista de permissoes de uma chave de API aparecer inteira.         */
  .tabela-vira-cartao td.celula-empilha { flex-wrap: wrap; }
  /* Sem margem propria: a folga entre as duas linhas ja e o row-gap do
     proprio <td>, e somar as duas abria um buraco de 40px entre o rotulo e a
     lista dele — as duas partes pareciam de celulas diferentes.           */
  .tabela-vira-cartao td.celula-empilha .celula-marcas {
    flex: 1 0 100%;
    justify-content: flex-start;
  }

  /* A linha de apoio nao encolhe junto com o nome no cartao: o nome ali e
     titulo (18px na letra da marca, pela secao OP.7) e a linha de apoio
     continua sendo o dado pequeno de identificacao. Ver CFG.10.           */
  .tabela-vira-cartao td .identidade { max-width: none; }
}

/* A margem negativa que faz a barra sangrar ate a borda tem de valer
   EXATAMENTE a folga do .conteudo, e essa folga muda nesta largura: cai de
   --e5 (20px) para --e4 (16px). Com os -20px da regra de cima a barra saia
   4px pela esquerda e, como ela tem max-width: 100%, nao crescia de volta
   pela direita — sobrava um vao de 36px do lado direito e a barra inteira
   ficava torta na tela. Medido a 375px: left -4, right 339 numa janela de
   375. A .barra-decisao da secao LD.8 ja tinha levado o mesmo conserto,
   pelo mesmo motivo.                                                      */
@media (max-width: 560px) {
  .config-barra { margin-inline: calc(var(--e4) * -1); }
}


/* ==========================================================================
   GRUPO OPERACAO  (secao OP)
      As cinco telas de listagem onde o operador passa o dia:
      beneficiarios, empresas, consultas, lotes e auditoria.

   Nada aqui reescreve o que veio antes. Tudo e ADITIVO e entra por uma
   classe que so estas telas usam (.tabela-limpa, .chip, .bloco-filtro,
   .nota-tela). Se alguem apagar a secao inteira, as cinco telas voltam ao
   visual da secao 5 sem quebrar nenhum layout.

   O problema que esta secao resolve: a lista e uma tela de LEITURA que
   tambem e uma tela de ACAO, e as duas coisas puxam para lados opostos.
   Leitura quer densidade e silencio; acao quer contraste e destaque. A
   saida adotada aqui e sempre a mesma: o silencio e o estado de repouso, e
   o destaque so acende no que esta sob o cursor ou sob o dedo.
   ========================================================================== */

/* --------------------------------------------------------------------------
   OP.1 BARRA DE FILTRO

   A barra de filtro da secao 5 ja e boa; falta so ela dizer o que esta
   filtrando AGORA. Quem abre uma tela filtrada por um link colado no
   WhatsApp nao tem como saber por que a lista tem 3 linhas em vez de 883,
   e a conclusao natural e "sumiu dado".

   Entao a barra virou um bloco de duas partes:
     .filtros        os campos, como sempre
     .chips-ativos   uma ficha por filtro ligado, clicavel para desligar
   -------------------------------------------------------------------------- */
.bloco-filtro { margin-bottom: var(--e6); }
.bloco-filtro .filtros { margin-bottom: 0; }
.bloco-filtro .chips-ativos { margin-top: var(--e4); }

/* O par Filtrar/Limpar cola na direita da barra, longe dos campos. Colado
   no ultimo campo, "Filtrar" parece pertencer aquele campo so.            */
.filtros-acoes { display: flex; align-items: center; gap: var(--e3); margin-left: auto; }


/* --------------------------------------------------------------------------
   OP.2 FICHA (chip)

   Dois usos, propositalmente parecidos por fora e diferentes por dentro:

     .chip[aria-current]  atalho SELECIONADO. Ganha o violeta, porque isto
                          e literalmente "voce esta aqui" — o mesmo papel
                          que o violeta tem no item ativo do menu e na aba.
     .chip-filtro         filtro LIGADO, clicavel para desligar. Fica
                          neutro de proposito.

   Por que o filtro ligado nao e violeta: numa busca com quatro filtros
   ligados seriam quatro fichas violeta na tela, e o violeta pararia de
   querer dizer "aperte aqui" para virar "olhe para mim". A ficha de filtro
   descreve um estado; quem carrega a acao ali e o × no fim dela.
   -------------------------------------------------------------------------- */
.chips { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e2); }
.chips > .rotulo { flex: none; margin-right: var(--e2); }

.chip {
  display: inline-flex; align-items: center; gap: var(--e2);
  min-height: 32px;
  padding: 0 var(--e4);
  border: 1px solid var(--borda-forte);
  border-radius: var(--r-pilula);
  background: var(--fundo-cartao);
  color: var(--texto-2);
  font-family: var(--fonte-texto);
  font-size: var(--t-sm);
  font-weight: var(--p-medio);
  line-height: 1;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--transicao), border-color var(--transicao),
              color var(--transicao), box-shadow var(--transicao-lenta);
}
.chip:hover { background: var(--fundo-hover); border-color: var(--texto-3); color: var(--texto); }

.chip[aria-current] {
  background: var(--acao-fundo);
  border-color: var(--acao-borda);
  color: var(--acao-txt);
  font-weight: var(--p-forte);
}
.chip[aria-current]:hover { background: var(--acao-fundo); border-color: var(--acao-txt); }
/* Ponto violeta na ficha selecionada: o mesmo truque do selo. Quem nao
   distingue o lilas pastel do branco continua vendo qual esta ligada.    */
.chip[aria-current]::before {
  content: ""; flex: none;
  width: 6px; height: 6px; border-radius: 50%;
  background: currentColor;
}

/* Ficha de filtro ligado. O nome do campo fica apagado e o VALOR fica em
   destaque: quem le a linha quer saber "adisson", nao "Busca".          */
.chip-filtro { background: var(--fundo-sutil); border-color: var(--borda); color: var(--texto); }
.chip-filtro .chave { color: var(--texto-3); font-weight: var(--p-normal); }
.chip-filtro .x { font-size: 1.1em; line-height: 1; color: var(--texto-3); }
.chip-filtro:hover { background: var(--fundo-hover); border-color: var(--borda-forte); }
.chip-filtro:hover .x { color: var(--erro-txt); }

.chip-limpar { margin-left: auto; }


/* --------------------------------------------------------------------------
   OP.3 TABELA LIMPA

   A tabela da secao 5 tem zebra E hover E cabecalho com fundo cinza. Sao
   tres sinais competindo pelo mesmo trabalho, e o resultado numa lista de
   50 linhas e uma tela listrada, que cansa e nao guia.

   Aqui fica UM sinal de cada vez:
     repouso  -> so a linha de 1px entre as linhas
     cursor   -> a linha inteira acende
   O cabecalho perde o fundo cinza e vira um rotulo apagado sobre o proprio
   cartao: ele continua grudado no topo ao rolar, so parou de parecer uma
   faixa de menu.
   -------------------------------------------------------------------------- */
.tabela-limpa thead th {
  background: var(--fundo-cartao);
  border-bottom: 1px solid var(--borda);
  color: var(--texto-3);          /* 5.3:1 no claro, 6.3:1 no escuro */
}

/* --- a folga horizontal cai de 20px para 16px -----------------------------
   Medido a 1280px na tela de beneficiarios: com 20px de cada lado, seis
   colunas gastavam 240px so de folga e a tabela pedia 981px numa caixa de
   942 — ou seja, ela rolava para o lado no tamanho de tela mais comum da
   operacao. Com 16px sobram 48px e ela cabe.

   A folga que faz a linha "respirar" e a VERTICAL, e essa fica intocada nos
   16px que a secao 5 escolheu. A horizontal separa colunas, e para isso
   16px ja bastam: quem separa coluna de verdade e o alinhamento, nao o ar.
   Vale so em .tabela-limpa; a tabela normal da secao 5 segue com 20px.   */
.tabela-limpa thead th,
.tabela-limpa tbody td { padding-inline: var(--e4); }
.tabela-limpa tbody tr:nth-child(even) { background: transparent; }
/* A primeira coluna e grudada e opaca por conta propria: sem esta linha
   ela mantem a zebra que o resto da linha acabou de perder.              */
.tabela-limpa.tabela-fixa tbody tr:nth-child(even) td:first-child { background: var(--fundo-cartao); }
/* E precisa repetir o hover DEPOIS dela: a regra de cima tem duas classes e
   ganha do hover da secao 5, que tem uma. Sem esta linha, passar o mouse
   numa linha PAR acendia a linha inteira e deixava a primeira coluna
   branca — a linha ficava com um buraco justamente onde esta o nome.    */
.tabela-limpa.tabela-fixa tbody tr:hover td:first-child,
.tabela-limpa.tabela-fixa tbody tr:focus-within td:first-child { background: var(--fundo-hover); }

/* --- linha que leva a algum lugar -----------------------------------------
   .tabela-navegavel so entra em tabela cuja linha ABRE alguma coisa
   (beneficiarios e lotes). Nas outras a linha nao vai a lugar nenhum, e
   pintar um risco violeta nela seria prometer um clique que nao existe.

   :focus-within junto do :hover: quem chega pelo Tab ve o mesmo risco que
   quem chega pelo mouse.                                                 */
.tabela-navegavel tbody tr:hover > td:first-child,
.tabela-navegavel tbody tr:focus-within > td:first-child {
  box-shadow: inset 3px 0 0 var(--acao);
}
.tabela-navegavel.tabela-fixa tbody tr:hover > td:first-child,
.tabela-navegavel.tabela-fixa tbody tr:focus-within > td:first-child {
  box-shadow: inset 3px 0 0 var(--acao), 1px 0 0 var(--borda);
}

/* O nome da pessoa nao pode ser um link violeta sublinhado: uma coluna
   inteira assim vira uma parede de violeta e a cor de acao perde o valor.
   Ele fica na cor do texto com um sublinhado CINZA sempre visivel — o
   sublinhado e o que impede o link de depender so de cor — e vira violeta
   quando o cursor chega.                                                 */
.tabela-navegavel tbody td:first-child a {
  color: var(--texto);
  font-weight: var(--p-forte);
  text-decoration: underline;
  text-decoration-color: var(--borda-forte);
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--transicao), text-decoration-color var(--transicao);
}
.tabela-navegavel tbody tr:hover td:first-child a,
.tabela-navegavel tbody td:first-child a:hover,
.tabela-navegavel tbody td:first-child a:focus-visible {
  color: var(--acao-txt);
  text-decoration-color: currentColor;
}

/* Valor sem conteudo. O travessao solto na coluna tem o mesmo peso visual
   de um dado de verdade e polui a leitura vertical.                      */
.tabela .vazio-celula { color: var(--texto-3); }

/* --- coluna de texto que nao pode dobrar a altura da linha ---------------
   Medido em 1280px com a base de demonstracao: a coluna Empresa quebrava
   "Empresa Go Live LTDA" em duas linhas e a linha da tabela ia de 44px
   para 69px. Cinquenta linhas assim custam uma tela inteira de rolagem —
   e o pior e que o layout automatico da tabela ENCOLHE a coluna que
   aceita quebrar, entao ela ficava com 131px enquanto a vizinha sobrava.

   Com nowrap a coluna passa a pedir a largura de que precisa e as
   reticencias seguram o caso extremo. O `title` no HTML devolve o nome
   inteiro para quem parar o cursor em cima.

   Nao vale para a coluna Detalhe da auditoria, de proposito: ali cortar
   texto e esconder prova. Aquela coluna quebra em varias linhas mesmo.  */
.tabela-limpa td.corta {
  max-width: 17rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
@media (max-width: 860px) {
  /* No cartao nao ha coluna para preservar: o valor pode ocupar as linhas
     que precisar, e cortar ali so esconderia dado sem ganhar nada.      */
  .tabela-limpa.tabela-vira-cartao td.corta {
    max-width: none; overflow: visible; white-space: normal;
  }
}

/* --- a coluna de acao nao pode engordar a linha --------------------------
   Medido: com o botao normal (.bt-p tem 32px de altura minima) a linha ia
   de 50px para 65px. Numa lista de 50 pessoas isso e uma tela inteira de
   rolagem a mais, so por causa do botao.

   A saida e a margem negativa: o botao continua com 30px de altura de
   CLIQUE — acima dos 24px que a WCAG 2.5.8 pede — mas so entrega 18px para
   o calculo da altura da linha. Ele fica maior que o buraco em que mora.

   So no computador. No telefone este mesmo botao vira o rodape do cartao,
   de largura inteira e 44px, na regra do fim desta secao.               */
@media (min-width: 861px) {
  .tabela-limpa td.apertado .bt {
    min-height: 0;
    padding: 6px var(--e2);
    margin-block: -6px;
    color: var(--texto-3);
    font-weight: var(--p-medio);
  }
  /* MENOS DENTRO DA CONFIRMACAO.
     O `-6px` acima existe para o botao caber na altura apertada da LINHA.
     O botao "Sim, tirar o acesso" nao esta na linha: esta dentro da caixa
     de confirmacao, embaixo de uma frase. Ali o -6px o subia por cima da
     ultima linha do texto — medido, o paragrafo terminava em 548px e o
     botao comecava em 544px, e na tela isso vira uma frase riscada.
     Precisa desta especificidade: a regra acima tem tres classes, e uma
     excecao mais fraca perderia em silencio. */
  .tabela-limpa td.apertado .confirma-corpo .bt {
    margin-block: 0;
    min-height: 36px;
    color: inherit;
    font-weight: var(--p-forte);
  }
  /* O hover do proprio botao some quando a linha inteira ja esta com o
     fundo de hover. Aqui ele responde com COR e nao com fundo.          */
  .tabela-limpa tbody tr:hover td.apertado .bt { color: var(--texto-2); background: transparent; }
  .tabela-limpa td.apertado .bt:hover,
  .tabela-limpa td.apertado .bt:focus-visible { color: var(--acao-txt); background: transparent; }
}


/* --------------------------------------------------------------------------
   OP.4 BARRA DE PROGRESSO DENTRO DA LINHA (tela de lotes)

   "141/883" e um numero que so quer dizer alguma coisa depois de uma
   divisao mental. A barra responde "quase no fim" antes de a pessoa ler.
   O numero fica do lado assim mesmo: barra sozinha nao diz se falta uma
   hora ou um minuto.
   -------------------------------------------------------------------------- */
.progresso-linha {
  display: inline-flex; align-items: center; gap: var(--e3);
  justify-content: flex-end;
}
.progresso-linha .valor {
  font-variant-numeric: tabular-nums;
  color: var(--texto-2);
  white-space: nowrap;
}
/* Mesmo contrato de `data-estado` da .progresso da secao 5, so que na
   horizontal. Sem isto a barra fica azul de "em andamento" tambem no lote
   que ja terminou e no que falhou — e a cor passa a mentir.              */

/* Numero-heroi em dinheiro. "R$ 12.345,67" tem doze caracteres; a 40px em
   ExtraBold isso passa de 280px e nao cabe num cartao de grade automatica,
   que fica com 218px de miolo. Quebrando em duas linhas o cartao cresce e
   desalinha a fileira inteira. Um degrau abaixo resolve, e 30px continua
   sendo o maior numero da tela.                                          */
.num-cartao .valor.compacto { font-size: var(--t-2xl); }


/* --------------------------------------------------------------------------
   OP.5 NOTA DE RODAPE DA TELA

   Estas telas terminam com um paragrafo que explica uma regra do negocio
   ("nao estar no fornecedor e o normal", "o registro nao tem prazo de
   descarte"). Eram <p class="pequeno"> soltos, que o olho le como sobra de
   texto, ou caixas .aviso azuis, que gritam mais alto que a tabela.

   O meio termo: risco fino a esquerda, texto apagado, largura de leitura.
   Fica claro que e nota de rodape, e nao briga com o dado.
   -------------------------------------------------------------------------- */
.nota-tela {
  max-width: var(--largura-leitura);
  margin-top: var(--e8);
  padding-left: var(--e5);
  border-left: 2px solid var(--borda);
  color: var(--texto-2);
  font-size: var(--t-sm);
  line-height: var(--lh-normal);
}
.nota-tela p + p { margin-top: var(--e3); }
.nota-tela strong { color: var(--texto); font-weight: var(--p-forte); }


/* --------------------------------------------------------------------------
   OP.6 ESTADO VAZIO QUE ORIENTA

   O macro `vazio()` do pecas.html escreve o titulo como
   <p class="p-forte">, e nao como <h3>. Por isso as regras `.vazio h3` da
   secao 6 nunca pegaram e o estado vazio saia com o titulo do mesmo
   tamanho do corpo — parecendo recado de erro em vez de convite.

   Consertar de verdade e emitir <h3> no macro, e o pecas.html nao e desta
   equipe. Entao a correcao vem daqui, pelo lado da folha: o
   <p class="p-forte"> filho direto de um estado vazio ganha tratamento de
   titulo. No dia em que o macro virar <h3>, estas quatro regras podem ser
   apagadas sem que nada mude na tela.
   -------------------------------------------------------------------------- */
.vazio > .p-forte,
.vazio-filtro > .p-forte {
  font-family: var(--fonte-marca);
  font-size: var(--t-lg);
  font-weight: var(--p-titulo);
  letter-spacing: var(--entreletra-titulo);
  color: var(--texto);
}
.vazio > p:not(.p-forte) { max-width: 52ch; }
.vazio > .bt, .vazio-filtro > .bt { margin-top: var(--e3); }


/* --------------------------------------------------------------------------
   OP.7 O CARTAO DO CELULAR

   A tabela ja virava cartao. Faltava ela virar um cartao BONITO. Tres
   coisas estavam quebradas no telefone e so aparecem com o dedo:

   (a) A coluna so de botao (.apertado) nao tem data-rotulo, entao o
       ::before nascia vazio e sobrava um espaco fantasma antes do botao.
       Aqui ela vira o rodape do cartao, com o botao de largura inteira e
       44px de altura.
   (b) O titulo do cartao vinha do mesmo tamanho do corpo (16px). Num
       cartao, o nome da pessoa e o titulo: 18px, na letra da marca.
   (c) O rotulo e o valor podiam encostar quando os dois eram longos.

   Tudo preso a .tabela-limpa de proposito: painel.html e usuarios.html
   tambem usam .tabela-vira-cartao e nao sao desta equipe.
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  .tabela-limpa.tabela-vira-cartao tr { padding: var(--e5); }

  .tabela-limpa.tabela-vira-cartao td:first-child {
    font-family: var(--fonte-marca);
    font-size: var(--t-lg);
    font-weight: var(--p-titulo);
    letter-spacing: var(--entreletra-titulo);
    line-height: var(--lh-titulo);
    padding-bottom: var(--e4);
  }
  /* Dentro do cartao o titulo JA e o destaque pela posicao e pelo tamanho.
     O sublinhado cinza do computador vira sujeira nesta escala.          */
  .tabela-limpa.tabela-navegavel.tabela-vira-cartao td:first-child a {
    text-decoration: none;
    color: var(--acao-txt);
  }

  .tabela-limpa.tabela-vira-cartao td { gap: var(--e6); }
  .tabela-limpa.tabela-vira-cartao td::before { max-width: 45%; white-space: normal; }

  /* Sem borda propria: a celula de cima ja termina com uma linha de 1px, e
     duas linhas a 4px de distancia parecem defeito de renderizacao. Quem
     separa o rodape do cartao aqui e a folga de cima.                    */
  .tabela-limpa.tabela-vira-cartao td.apertado {
    display: block;
    width: 100%;
    padding: var(--e5) 0 0;
    border-top: 0;
    border-bottom: 0;
  }
  .tabela-limpa.tabela-vira-cartao td.apertado::before { display: none; }
  /* No computador este botao e um link discreto no fim da linha. No cartao
     ele e a UNICA acao a vista, e acao a vista precisa parecer botao:
     ganha contorno, fundo de cartao e os 44px de alvo.                   */
  .tabela-limpa.tabela-vira-cartao td.apertado .bt {
    width: 100%;
    min-height: var(--toque);
    background: var(--fundo-cartao);
    border-color: var(--borda-controle);
    color: var(--texto);
    box-shadow: var(--sombra1);
  }

  /* No cartao a barra de progresso pode ocupar a largura que sobra: ali
     ela e a informacao, nao um enfeite de coluna estreita.               */
  .tabela-limpa.tabela-vira-cartao .progresso-linha { flex: 1; }

  /* A caixa da tabela some e os cartoes ficam soltos na pagina.

     Cartao branco dentro de caixa branca anula o proprio cartao: o que
     separa uma vida da outra vira um fio de 1px no meio de um bloco unico,
     e a sombra do cartao nao aparece porque cai sobre a mesma cor. Sem a
     caixa, cada cartao flutua sobre o fundo da pagina e quem separa passa a
     ser o espaco — que e o que faz um cartao parecer um cartao.

     O rodape da tabela (contagem e paginacao) perde a faixa cinza junto: no
     celular ele nao e o pe de uma tabela, e uma linha de texto embaixo de
     uma lista.                                                            */
  .caixa-cartoes {
    background: transparent;
    border: 0;
    box-shadow: none;
    border-radius: 0;
    overflow: visible;
  }
  .caixa-cartoes .tabela-pe {
    background: transparent;
    border-top: 0;
    padding: var(--e2) 0 0;
  }

  /* Ficha continua com 44px de alvo, como todo o resto que se aperta. */
  .chip { min-height: var(--toque); }
  .filtros-acoes { margin-left: 0; }
  .filtros-acoes .bt { flex: 1; }
  .chip-limpar { margin-left: 0; }
}


/* ==========================================================================
   GRUPO LEITURA E DECISAO  (secao LD)
   ficha_beneficiario.html · elegibilidade.html · lote.html ·
   importar.html · importar_simulacao.html

   Como as demais secoes de grupo deste arquivo, esta vem DEPOIS do sistema
   base e e ADITIVA: nada aqui reescreve regra das secoes 1 a 8, tudo entra
   por classe nova que so estas cinco telas usam. Apagar a secao inteira faz
   as telas voltarem ao visual da secao 5 sem quebrar layout nenhum.

   Estas cinco telas nao existem para digitar: existem para LER e para
   DECIDIR. As secoes 1 a 8 resolvem a tela de trabalho (lista, filtro,
   formulario). O que falta e o vocabulario de leitura:

     - cabecalho de ENTIDADE, que e diferente de titulo de pagina. Numa
       ficha o nome da pessoa nao e o assunto da tela, e o sujeito dela;
     - VEREDICTO, o lugar onde uma pergunta de sim ou nao e respondida em
       tamanho de manchete;
     - TRILHA e BARRA DE DECISAO, para quem esta no meio de um caminho de
       tres passos que termina gravando 900 pessoas.

   Tudo aqui usa as fichas da secao 1. Nenhuma cor nova, nenhum espaco novo.
   A regra do violeta continua valendo: ele so aparece em acao, em link e em
   "voce esta aqui" (o passo atual da trilha). Nada aqui pinta um numero, um
   aviso ou um dado de violeta.
   ========================================================================== */


/* --------------------------------------------------------------------------
   LD.1 CABECALHO DE ENTIDADE

   Titulo de pagina responde "que tela e esta". Cabecalho de entidade
   responde "de quem e este registro". Sao coisas diferentes e mereciam
   formatos diferentes: a ficha usava .pagina-topo, o mesmo bloco da tela de
   lista, e por isso o nome da pessoa tinha o mesmo peso visual que a
   palavra "Beneficiarios".

   O monograma nao e enfeite: e ancora. Numa ficha aberta em aba, o olho
   volta para o mesmo canto e reconhece o registro antes de ler. Fica em
   NEUTRO de proposito — colorir de violeta o transformaria em algo que
   parece clicavel, e ele nao e.
   -------------------------------------------------------------------------- */
/* flex-wrap nao e detalhe: sem ele as acoes disputam a linha com o nome e o
   titulo quebra em tres pedacos no celular. Com ele, as acoes descem inteiras
   para a linha de baixo (a regra de largura total esta no bloco de celular
   la no fim desta secao). */
.entidade {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: var(--e5);
  margin-bottom: var(--e8);
}
.entidade-corpo { min-width: 0; flex: 1 1 auto; }
.entidade h1 { text-wrap: pretty; }

.monograma {
  flex: none;
  width: 60px; height: 60px;
  display: grid; place-items: center;
  border-radius: var(--r3);
  background: var(--fundo-sutil);
  border: 1px solid var(--borda-forte);
  color: var(--texto-2);
  font-family: var(--fonte-marca);
  font-size: var(--t-xl);
  font-weight: var(--p-marca);
  letter-spacing: var(--entreletra-marca);
  text-transform: uppercase;
  user-select: none;
}

/* Linha de fatos logo abaixo do nome: selo de situacao, codigo, quem criou,
   quando. O ponto separador e desenhado entre os itens, nunca no primeiro —
   assim a linha pode ganhar ou perder um pedaco no Jinja sem sobrar
   pontuacao solta. */
.entidade-meta {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--e2) var(--e3);
  margin-top: var(--e3);
  font-size: var(--t-sm);
  color: var(--texto-2);
}
.entidade-meta > * + *::before {
  content: "·";
  margin-right: var(--e3);
  color: var(--texto-3);
}
/* Selo nao leva ponto nem antes nem depois: a pilula ja se separa sozinha
   pela forma. Isso tambem resolve o ponto orfao no comeco da segunda linha
   quando a fila de selos quebra no celular. */
.entidade-meta > .selo::before,
.entidade-meta > .selo + *::before { content: none; margin: 0; }

.entidade-acoes { display: flex; flex-wrap: wrap; gap: var(--e3); margin-left: auto; }


/* --------------------------------------------------------------------------
   LD.2 FICHA EM LINHAS

   Variante da .ficha da secao 5.12. A .ficha original e uma GRADE, boa
   quando ha muito campo e espaco largo (os dados pessoais). Numa coluna
   estreita a mesma grade vira uma coluna so, e rotulo em cima do valor
   gasta o dobro da altura sem ganhar nada.

   Aqui o par fica na mesma linha, rotulo a esquerda e valor a direita,
   separados por um fio. E o formato de "registro" que todo mundo ja
   conhece de extrato e de ajustes do telefone.
   -------------------------------------------------------------------------- */
.ficha-linhas { display: block; }
.ficha-linhas .item {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--e5);
  padding: var(--e3) 0;
  border-bottom: 1px solid var(--borda);
}
.ficha-linhas .item:first-child { padding-top: 0; }
.ficha-linhas .item:last-child { padding-bottom: 0; border-bottom: 0; }
/* Os dois lados encolhem, e nenhum e travado. Com o rotulo travado, quem
   quebrava era sempre o VALOR — "Ainda / nao" em duas linhas numa coluna
   estreita. Rotulo partido em duas linhas se le sem esforco; valor partido
   no meio parece dado corrompido. */
.ficha-linhas .item dt { margin-bottom: 0; min-width: 0; }
.ficha-linhas .item dd { min-width: 0; text-align: right; font-weight: var(--p-medio); }

/* Nota de regra: o paragrafo que explica a consequencia em dinheiro do que
   esta na ficha acima. Solto, em cinza, ele parecia rodape e ninguem lia —
   e e justamente a regra que sustenta o modelo sob demanda. */
.nota-regra {
  margin-top: var(--e5);
  padding: var(--e4) var(--e5);
  border-radius: var(--r2);
  border-left: 3px solid var(--borda-forte);
  background: var(--fundo-sutil);
  color: var(--texto-2);
  font-size: var(--t-sm);
  line-height: var(--lh-normal);
}
.nota-regra strong { color: var(--texto); font-weight: var(--p-forte); }
/* Quando nao ha ficha acima dela (pessoa que nunca entrou no fornecedor), a
   nota e o unico conteudo do cartao e nao deve empurrar nada. */
.nota-regra:first-child { margin-top: 0; }


/* --------------------------------------------------------------------------
   LD.3 VEREDICTO

   A tela de elegibilidade existe para responder UMA pergunta. A resposta
   precisa ser lida do outro lado da sala, porque quem consulta muitas vezes
   esta com a pessoa na frente ou no telefone com ela.

   Tres decisoes escritas:

   (a) O painel inteiro e tingido da familia semantica (verde ou vermelho),
       nao so a palavra. Um retangulo colorido do tamanho da tela e o que
       transforma a resposta em MOMENTO. Cor sozinha nao carrega o sentido:
       ha o glifo (✓ / ✕), ha a palavra, e o painel e anunciado com
       role="status".

   (b) O contraste continua o do sistema: --ok-txt sobre --ok-fundo e
       --erro-txt sobre --erro-fundo, os mesmos pares ja medidos na secao 1,
       nos dois temas.

   (c) O DADO da pessoa nao herda a cor. Nome, empresa e plano ficam em
       --texto dentro de um cartao normal embaixo. Se tudo ficasse verde, a
       tela viraria decoracao e o verde pararia de significar "pode".
   -------------------------------------------------------------------------- */
.veredicto {
  display: flex;
  align-items: flex-start;
  gap: var(--e6);
  padding: var(--e10) var(--e8);
  border: 1px solid;
  border-radius: var(--r4);
  box-shadow: var(--sombra1);
}
.veredicto-marca {
  flex: none;
  width: 56px; height: 56px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: currentColor;
  font-size: 1.75rem;
  line-height: 1;
}
/* O glifo fica na cor do FUNDO do painel, dentro de um disco na cor do
   texto. Mesmo truque do .aviso-icone: da um icone cheio sem imagem. */
.veredicto-marca::before { font-weight: var(--p-titulo); }
.veredicto-corpo { min-width: 0; }
.veredicto-palavra {
  font-family: var(--fonte-marca);
  font-size: var(--t-4xl);
  font-weight: var(--p-marca);
  line-height: 1.02;
  letter-spacing: var(--entreletra-marca);
  margin: var(--e2) 0 0;
  text-wrap: balance;
}
.veredicto-quem {
  margin-top: var(--e4);
  font-size: var(--t-lg);
  font-weight: var(--p-forte);
  color: var(--texto);
  line-height: var(--lh-densa);
}
.veredicto-motivo {
  margin-top: var(--e2);
  font-size: var(--t-md);
  font-weight: var(--p-medio);
  max-width: var(--largura-leitura);
}
.veredicto .rotulo { color: inherit; opacity: .85; }

.veredicto-ok  { color: var(--ok-txt);   background: var(--ok-fundo);   border-color: var(--ok-borda); }
.veredicto-nao { color: var(--erro-txt); background: var(--erro-fundo); border-color: var(--erro-borda); }
.veredicto-ok  .veredicto-marca::before { content: "✓"; color: var(--ok-fundo); }
.veredicto-nao .veredicto-marca::before { content: "✕"; color: var(--erro-fundo); }

/* Largura de coluna unica para a tela de pergunta e resposta. Nao e uma
   tela de tabela: passar disso so afasta o botao do campo. A folga entre os
   blocos e maior que a da .pilha padrao porque o veredicto precisa de ar em
   volta para ser lido como resposta, e nao como mais um cartao da lista. */
.coluna-resposta { width: 100%; max-width: 46rem; }
.coluna-resposta.pilha { gap: var(--e6); }


/* --------------------------------------------------------------------------
   LD.4 TRILHA DE PASSOS

   Importar tem tres passos e o segundo grava a vida de 900 pessoas. Quem
   chega na tela de simulacao precisa saber, sem ler nada, que ainda falta
   um passo — foi o mal-entendido mais caro possivel aqui: achar que enviar
   o arquivo ja gravou.

   O passo atual usa violeta porque violeta tambem e "voce esta aqui",
   como diz a regra la em cima. Passo cumprido ganha ✓ e fica neutro:
   verde em passo cumprido competiria com o verde de "elegivel" e com o de
   "gravado" da tela de lote.
   -------------------------------------------------------------------------- */
.trilha {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--e2);
  margin-bottom: var(--e8);
}
.trilha li { display: flex; align-items: center; gap: var(--e2); }
.trilha .passo {
  display: inline-flex; align-items: center; gap: var(--e2);
  padding: var(--e2) var(--e4);
  border: 1px solid var(--borda);
  border-radius: var(--r-pilula);
  background: var(--fundo-cartao);
  color: var(--texto-3);
  font-size: var(--t-sm);
  font-weight: var(--p-forte);
  white-space: nowrap;
}
.trilha .passo .n {
  flex: none;
  width: 20px; height: 20px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--neu-fundo);
  color: var(--neu-txt);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
}
.trilha li[data-estado="feito"] .passo { color: var(--texto-2); border-color: var(--borda-forte); }
.trilha li[data-estado="feito"] .passo .n { background: var(--neu-solido); color: var(--fundo-cartao); }
.trilha li[aria-current="step"] .passo {
  background: var(--acao-fundo);
  border-color: var(--acao-borda);
  color: var(--acao-txt);
}
.trilha li[aria-current="step"] .passo .n { background: var(--acao-solido); color: var(--sobre-acao); }
.trilha .liga { width: var(--e5); height: 1px; background: var(--borda-forte); }

/* Lista numerada de instrucao ("Como funciona"). O numero vira disco a
   esquerda: o olho encontra o passo 3 sem contar do 1. */
.passos { counter-reset: passo; display: flex; flex-direction: column; gap: var(--e5); }
.passos li { position: relative; counter-increment: passo; padding-left: var(--e10); }
.passos li::before {
  content: counter(passo);
  position: absolute; left: 0; top: -1px;
  width: 26px; height: 26px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--fundo-sutil);
  border: 1px solid var(--borda-forte);
  color: var(--texto-2);
  font-family: var(--fonte-marca);
  font-size: var(--t-xs);
  font-weight: var(--p-titulo);
}


/* --------------------------------------------------------------------------
   LD.5 CAMPO DE ARQUIVO E OPCAO DE RISCO
   -------------------------------------------------------------------------- */

/* O <input type=file> cru e o unico controle da tela que nao parecia parte
   do sistema: fonte do sistema operacional, botao cinza do navegador,
   altura diferente de todos os outros campos. Aqui so o BOTAO interno e
   redesenhado (como um .bt-2), o resto do controle continua nativo — que e
   o que garante que o seletor de arquivo do sistema abra igual em todo
   lugar, inclusive no celular. Escopo em .campo-arquivo para nao mexer em
   nenhum outro campo do sistema. */
.campo-arquivo .entrada {
  padding: var(--e2);
  cursor: pointer;
  font-size: var(--t-sm);
  border-style: dashed;
}
.campo-arquivo .entrada:hover { border-color: var(--acao-txt); background: var(--fundo-hover); }
.campo-arquivo .entrada::file-selector-button {
  margin-right: var(--e4);
  padding: var(--e2) var(--e4);
  min-height: 32px;
  border: 1px solid var(--borda-controle);
  border-radius: var(--r2);
  background: var(--fundo-cartao);
  color: var(--texto);
  font-family: var(--fonte-texto);
  font-size: var(--t-sm);
  font-weight: var(--p-forte);
  cursor: pointer;
  transition: background var(--transicao), border-color var(--transicao);
}
.campo-arquivo .entrada::file-selector-button:hover {
  background: var(--fundo-hover);
  border-color: var(--texto-3);
}

/* A caixa "e a lista completa da unidade" marca gente para desligamento.
   E a unica opcao desta tela que tira acesso de alguem, e estava solta no
   meio do formulario com o mesmo peso de um campo qualquer. Aqui ela ganha
   moldura propria e um fio ambar a esquerda.

   Quando MARCADA, a caixa inteira acende em ambar: a pessoa precisa
   enxergar que armou o gatilho. :has() ainda nao existe em navegador
   antigo — por isso ele so ACRESCENTA aviso; sem ele a caixa continua
   legivel e o texto continua dizendo o que a opcao faz. */
.opcao-risco {
  padding: var(--e4) var(--e5);
  border: 1px solid var(--borda);
  border-left: 3px solid var(--at-solido);
  border-radius: var(--r2);
  background: var(--fundo-sutil);
  transition: background var(--transicao), border-color var(--transicao);
}
.opcao-risco:has(input:checked) {
  background: var(--at-fundo);
  border-color: var(--at-borda);
  border-left-color: var(--at-solido);
}
.opcao-risco strong { color: var(--texto); }
.opcao-risco:has(input:checked) strong { color: var(--at-txt); }


/* --------------------------------------------------------------------------
   LD.6 A TELA DE SIMULACAO
        barra de decisao, bloqueio, cartao com tom, lista de CPF

   Uma ressalva honesta: o unico lugar desta secao inteira que toca numa
   classe que ja existia e o `.aviso-bloqueio` daqui (secao 5.6). E adicao,
   nao troca — vira flex para caber o icone e ganha regra para a lista de
   dentro. As cores, a borda e o peso continuam vindo da secao 5.6.

   A tela de simulacao pode ter tres metros de altura: numeros, problemas,
   quem entra, quem sai, quem foi recusado. O botao que grava ficava no fim
   de tudo. Duas consequencias ruins: quem ja decidiu precisa rolar tudo de
   novo, e quem esta rolando nao tem, em nenhum momento, a conta do que vai
   acontecer a vista.

   A barra fica grudada acima do rodape da janela enquanto a pagina rola e
   pousa no lugar quando chega ao fim. Ela carrega SEMPRE o numero, porque
   confirmar sem ver quantos e o acidente que esta tela existe para evitar.
   Quando esta bloqueada, ela diz por que — e o motivo continua tambem no
   bloco de bloqueio la em cima, para quem imprime a pagina.
   -------------------------------------------------------------------------- */
.barra-decisao {
  position: sticky;
  bottom: var(--e5);
  z-index: 5;
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--e4) var(--e6);
  margin-top: var(--e8);
  padding: var(--e5) var(--e6);
  background: var(--fundo-elevado);
  border: 1px solid var(--borda-forte);
  border-radius: var(--r3);
  box-shadow: var(--sombra3);
}
/* A conta encolhe e a frase quebra em duas linhas dentro dela; os botoes
   ficam onde estao. Sem isto a frase empurrava os botoes para uma segunda
   fileira e a barra dobrava de altura, comendo a tela que o usuario esta
   tentando conferir. */
.barra-decisao .conta { flex: 1 1 20rem; min-width: 0; }
.barra-decisao .conta strong {
  display: block;
  font-family: var(--fonte-marca);
  font-size: var(--t-lg);
  font-weight: var(--p-titulo);
  letter-spacing: var(--entreletra-titulo);
  font-variant-numeric: tabular-nums;
  color: var(--texto);
}
.barra-decisao .conta .porque { font-size: var(--t-sm); color: var(--texto-2); }
.barra-decisao[data-estado="bloqueado"] { border-color: var(--erro-borda); }
.barra-decisao[data-estado="bloqueado"] .conta strong { color: var(--erro-txt); }
.barra-decisao .acoes { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e3); margin-left: auto; }
/* O botao que grava vem dentro de um <form> proprio (e um POST). O form
   nao vira `display: contents` de proposito: isso apaga o papel dele para
   parte dos leitores de tela. Ele so vira item flexivel como qualquer
   outro. */
.barra-decisao .acoes form { display: flex; }
.barra-decisao .acoes form .bt { width: 100%; }

/* Lista de impedimentos dentro do bloco vermelho. O <ul> nao tem classe, e
   o reset da secao 2 so zera lista COM classe — entao ele continua sendo
   uma lista de verdade, com marcador, que e o certo aqui. */
.aviso-bloqueio { display: flex; gap: var(--e4); }
.aviso-bloqueio .aviso-icone::before { content: "!"; color: var(--erro-fundo); }
.aviso-bloqueio ul { margin: var(--e2) 0 0; padding-left: var(--e5); }
.aviso-bloqueio li + li { margin-top: var(--e1); }

/* Cartao com tom, do mesmo jeito que o .num-cartao ja fazia na secao 5.4:
   um fio de 4px a esquerda, nunca o cartao inteiro colorido. As telas de
   simulacao marcavam isso com `style="border-left:4px solid ..."` escrito
   na mao em cada secao — tres copias do mesmo valor, e nenhuma delas muda
   junto quando o ambar mudar. */
.cartao[data-tom="atencao"] { border-left: 4px solid var(--at-solido); }
.cartao[data-tom="erro"]    { border-left: 4px solid var(--erro-solido); }
.cartao[data-tom="ok"]      { border-left: 4px solid var(--ok-solido); }

/* Tabela longa dentro de um cartao: rola dentro dela mesma, com o cabecalho
   grudado no topo (o `position: sticky` da secao 5.5). Sem teto de altura,
   uma lista de 900 pessoas empurra a barra de decisao para longe. */
.rolagem-alta { max-height: 26rem; }

/* Lista de CPFs que vao ser desligados. Como texto corrido separado por
   virgula, 40 CPFs viram um paragrafo que ninguem confere. Em pastilhas,
   cada um e um item que o olho consegue percorrer e achar. */
.lista-cpf { display: flex; flex-wrap: wrap; gap: var(--e2); margin-top: var(--e4); }
.lista-cpf li {
  padding: var(--e1) var(--e3);
  border: 1px solid var(--borda);
  border-radius: var(--r1);
  background: var(--fundo-sutil);
  font-size: var(--t-sm);
}


/* --------------------------------------------------------------------------
   LD.7 ACOMPANHAMENTO DE LOTE

   Quem abre esta tela quer uma coisa: "ja acabou, e deu tudo certo?". A
   resposta e um numero, nao uma barra — barra diz "mais ou menos ali".
   Entao o numero vira o heroi (Inter, tabular, tamanho de cartao de
   painel), a barra vira a ilustracao dele, e a contagem por situacao vira
   pastilha com ponto colorido em vez de legenda miuda.

   O texto de cada pastilha continua sendo uma frase inteira ("1 falha(s)"),
   e nao numero e rotulo separados: assim ela continua legivel em voz alta
   por leitor de tela, e continua encontravel por quem busca na pagina.
   -------------------------------------------------------------------------- */
.lote-numero {
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
  gap: var(--e3) var(--e6);
  margin-bottom: var(--e4);
}
.lote-numero .valor {
  font-family: var(--fonte-marca);
  font-size: var(--t-3xl);
  font-weight: var(--p-marca);
  line-height: 1.02;
  letter-spacing: var(--entreletra-marca);
  font-variant-numeric: tabular-nums;
  color: var(--texto);
}
.lote-numero .resto { font-size: var(--t-md); color: var(--texto-2); }
.lote-hero .progresso-misto { height: 14px; }

.legenda-pastilhas { gap: var(--e3); margin-top: var(--e5); }
.legenda-pastilhas span {
  padding: var(--e2) var(--e4);
  border: 1px solid var(--borda);
  border-radius: var(--r-pilula);
  background: var(--fundo-sutil);
  color: var(--texto);
  font-weight: var(--p-medio);
  font-variant-numeric: tabular-nums;
}


/* --------------------------------------------------------------------------
   LD.8 CELULAR E IMPRESSAO destas telas
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  .entidade { gap: var(--e4); }
  .monograma { width: 48px; height: 48px; font-size: var(--t-md); border-radius: var(--r2); }
  .entidade-acoes { width: 100%; margin-left: 0; }
  .entidade-acoes .bt { flex: 1 1 auto; }

  .veredicto { padding: var(--e8) var(--e6); gap: var(--e5); }
  .veredicto-marca { width: 44px; height: 44px; font-size: 1.375rem; }
  .veredicto-palavra { font-size: var(--t-2xl); }

  /* No telefone a barra encosta no rodape da tela e ocupa a largura toda:
     e o mesmo gesto de .forma-pe, e o polegar alcanca sem esticar. */
  .barra-decisao {
    bottom: 0;
    margin-inline: calc(var(--e5) * -1);
    padding-bottom: calc(var(--e5) + env(safe-area-inset-bottom));
    border-radius: var(--r4) var(--r4) 0 0;
    border-left: 0; border-right: 0; border-bottom: 0;
  }
  .barra-decisao .acoes { margin-left: 0; width: 100%; }
  .barra-decisao .acoes .bt { flex: 1 1 auto; }

  .lote-numero .valor { font-size: var(--t-2xl); }
  .ficha-linhas .item { gap: var(--e4); }
}

@media (max-width: 560px) {
  /* Nesta largura a linha de fatos quebra em tres ou quatro pedacos, e o
     ponto separador acaba sozinho no comeco de uma linha, parecendo sujeira.
     Some o ponto e abre a folga: o espaco separa igual, e nunca sobra. */
  .entidade-meta { gap: var(--e2) var(--e4); }
  .entidade-meta > * + *::before { content: none; margin: 0; }

  /* Rotulo e valor um debaixo do outro: nesta largura o par lado a lado
     deixa duas palavras de cada lado e um buraco no meio. */
  .ficha-linhas .item { display: block; }
  .ficha-linhas .item dd { text-align: left; margin-top: 2px; }
  .veredicto { flex-direction: column; }

  /* A trilha quebra em duas fileiras aqui. O tracinho de ligacao entre os
     passos so faz sentido quando eles estao em fila; quebrado, ele fica
     pendurado no fim da linha apontando para o nada. */
  .trilha .liga { display: none; }
  .trilha .passo { padding: var(--e2) var(--e3); font-size: var(--t-xs); }

  /* A frase de detalhe sai da barra grudada no rodape: ela toma duas linhas
     e a barra passa a comer quase metade da tela do telefone, justamente a
     tela que a pessoa esta tentando conferir. Nada se perde — a mesma conta
     esta nos cartoes de numero logo acima, e o motivo de um bloqueio esta
     no bloco vermelho, que fica no fluxo da pagina e nao aqui. */
  .barra-decisao .conta .porque { display: none; }

  /* A margem negativa que faz a barra sangrar ate a borda precisa valer
     exatamente a folga do .conteudo, que nesta largura cai de --e5 para
     --e4. Errar por 4px de cada lado poe barra de rolagem horizontal na
     pagina inteira. */
  .barra-decisao { margin-inline: calc(var(--e4) * -1); }
}

@media print {
  /* Em papel nada gruda: a barra vira o ultimo bloco da folha, e a trilha
     de passos nao diz nada num documento arquivado. */
  .barra-decisao { position: static; box-shadow: none; border-color: #999; }
  .barra-decisao .acoes, .trilha { display: none !important; }
  .veredicto { box-shadow: none; border-color: #999; }
}


/* ==========================================================================
   GRUPO PRIMEIRA IMPRESSAO  (secao PI)
      entrar.html  ·  base.html  ·  painel.html

   Numerada com letra e nao com numero de proposito: outros grupos estao
   escrevendo secoes no mesmo arquivo ao mesmo tempo e "9" ja foi usado.

   Esta secao vem DEPOIS de tudo, de proposito. Sao as tres telas do primeiro
   contato: a de entrada, o esqueleto que emoldura o sistema inteiro e o
   painel que o dono abre todo dia. Escrever aqui embaixo, num bloco com
   nome, evita colidir com quem esta refinando as outras dezesseis ao mesmo
   tempo: nada daqui reescreve o que ja estava; e tudo ou classe nova, ou
   ajuste com escopo declarado.

   POR QUE ALGUMAS REGRAS COMECAM COM `body`
   A secao 5.13 escreve `body .entrada-pagina`, `body .entrada-caixa` e
   companhia, para vencer o <style> que morava dentro do entrar.html. Aquele
   <style> foi apagado nesta rodada, mas as regras de la continuam com o
   `body`. Para ajustar essas quatro classes sem !important e sem mexer no
   bloco da colega, as daqui precisam empatar em especificidade e ganhar pela
   ordem. Por isso o `body` se repete.
   ========================================================================== */


/* --------------------------------------------------------------------------
   PI.0 UM CONSERTO QUE FALTAVA: o atributo hidden

   `hidden` e a forma certa de esconder um controle que so faz sentido com
   JavaScript ligado (o botao de tema, o de recolher menu, o "mostrar
   senha"). Mas a regra do navegador para [hidden] e `display: none` sem
   !important, e qualquer classe nossa com display (.bt e inline-flex,
   .marcar e flex) ganha dela, porque estilo de autor vence estilo de
   navegador. Sem esta linha, botao com hidden aparece na tela.
   -------------------------------------------------------------------------- */
[hidden] { display: none !important; }


/* --------------------------------------------------------------------------
   PI.1 TELA DE ENTRADA — a capa do produto

   Antes: um cartao branco de 400px no meio da tela, com uma bolinha laranja
   fingindo ser a marca. Era a primeira coisa que um cliente via do sistema
   e nao dizia nada sobre quem somos.

   Agora sao DUAS colunas dentro de um unico cartao elevado:
     esquerda  a vitrine, no roxo escuro #0C0047 da marca, com o simbolo do
               infinito grande e tres linhas do que o sistema faz
     direita   so o formulario, em fundo de cartao, sem nada disputando

   POR QUE O LOGOTIPO ENTRA COMO IMAGEM E NAO COMO TEXTO
   O wordmark e Inter ExtraBold e os arquivos .woff2 ainda nao estao no
   servidor (secao 0 explica). Escrito como texto, a marca apareceria na
   fonte do sistema justamente na unica tela em que ela precisa estar certa.
   O arquivo ja recortado nao depende de fonte nenhuma. Nas outras telas o
   wordmark segue em texto: la ele e navegacao, aqui ele e a capa.

   Usamos logo-vertical-claro.png porque a vitrine e escura: e a versao com o
   wordmark claro, feita para esse fundo.
   -------------------------------------------------------------------------- */

body .entrada-pagina {
  padding: var(--e12) var(--e6);
  /* Uma terceira camada de luz, vinda de cima, para o cartao nao pousar
     sobre um fundo chapado. As duas primeiras sao as da secao 5.13.       */
  background:
    radial-gradient(1200px 640px at 10% -12%, rgba(162, 76, 255, .20), transparent 62%),
    radial-gradient(900px 540px at 110% 112%, rgba(231, 118, 66, .13), transparent 60%),
    radial-gradient(820px 420px at 50% -4%, rgba(12, 0, 71, .07), transparent 70%),
    var(--fundo-pagina);
}

/* A caixa cresceu porque agora abriga duas colunas. */
body .entrada-caixa-larga { width: min(960px, 100%); }

/* O quadro e UM cartao so, com a vitrine e o formulario dentro. Card dentro
   de card sempre parece remendo; aqui a divisa e a cor, nao mais uma borda. */
.entrada-quadro {
  display: grid;
  grid-template-columns: minmax(0, 0.92fr) minmax(0, 1fr);
  border: 1px solid var(--borda);
  border-radius: var(--r5);
  background: var(--fundo-cartao);
  box-shadow: var(--sombra3);
  overflow: hidden;          /* segura o gradiente da vitrine dentro do canto */
}

.entrada-vitrine {
  display: flex;
  flex-direction: column;
  gap: var(--e6);
  padding: var(--e12) var(--e10);
  color: #fff;
  background:
    radial-gradient(520px 420px at 6% 2%, rgba(162, 76, 255, .46), transparent 66%),
    radial-gradient(420px 360px at 106% 108%, rgba(231, 118, 66, .20), transparent 62%),
    var(--marca-roxo-esc);
}

/* .entrada-marca continua sendo o bloco da marca, so que agora o que ela
   embrulha e o arquivo do logotipo em vez de um span com texto.           */
body .entrada-vitrine .entrada-marca { display: block; margin: 0; }
body .entrada-vitrine .entrada-marca img {
  width: 212px; max-width: 100%; height: auto;
  /* O brilho violeta que o proprio simbolo joga no painel escuro. Sombra
     preta aqui sujaria o gradiente da fita.                              */
  filter: drop-shadow(0 16px 34px rgba(162, 76, 255, .38));
}

.entrada-lema {
  font-size: var(--t-lg);
  line-height: var(--lh-densa);
  color: #d9d2ef;            /* 13.0:1 no roxo escuro da marca */
  max-width: 22ch;
}

/* As tres linhas do que o sistema faz. Ficam coladas no rodape da vitrine
   (margin-top: auto) para a marca respirar em cima.                       */
.entrada-pontos {
  display: flex; flex-direction: column; gap: var(--e4);
  margin: auto 0 0;
}
.entrada-pontos li {
  display: flex; align-items: flex-start; gap: var(--e3);
  font-size: var(--t-base); line-height: var(--lh-densa);
  color: #c9c1e4;            /* 11.1:1 no roxo escuro da marca */
}
.entrada-pontos svg {
  flex: none; width: 18px; height: 18px; margin-top: 2px;
  color: var(--marca-violeta);   /* 4.5:1 no fundo: e desenho, nao texto */
}

.entrada-forma {
  display: flex; flex-direction: column; justify-content: center;
  gap: var(--e5);
  padding: var(--e12) var(--e10);
  background: var(--fundo-cartao);
}
/* "Entrar" e o h1 da pagina — que nao existia. Fica em 24px e nao nos 30px
   do h1 padrao porque o logotipo ao lado ja e o elemento grande da tela;
   dois pesos disputando arruinam os dois.                                 */
.entrada-forma h1 { font-size: var(--t-xl); }
.entrada-forma .subtitulo { margin-top: var(--e1); font-size: var(--t-base); }
.entrada-forma form { margin-top: var(--e2); }

body .entrada-rodape { margin-top: var(--e8); }

/* No celular a vitrine vira uma faixa curta em cima do formulario: a marca
   continua, os tres pontos saem. Numa tela de 375px eles empurrariam os
   campos para baixo da dobra, e quem abre esta tela veio para digitar.    */
@media (max-width: 820px) {
  .entrada-quadro { grid-template-columns: minmax(0, 1fr); }
  .entrada-vitrine {
    gap: var(--e3);
    padding: var(--e8) var(--e6);
    align-items: center; text-align: center;
  }
  body .entrada-vitrine .entrada-marca img { width: 152px; }
  .entrada-lema { font-size: var(--t-md); max-width: none; }
  .entrada-pontos { display: none; }
  .entrada-forma { padding: var(--e8) var(--e6); }
  body .entrada-pagina { padding: var(--e6) var(--e5); }
}


/* --------------------------------------------------------------------------
   PI.2 ESQUELETO — menu lateral e barra de topo

   O que mudou e por que:

   a) A MARCA no topo do menu ganhou ar e uma divisa. Antes ela encostava no
      primeiro item e o olho lia tudo como uma lista so.
   b) Os ITENS deixaram de ficar colados uns nos outros. 4px entre eles e o
      que separa "lista de links" de "menu".
   c) Os ICONES viraram SVG (o desenho esta no base.html). Eram glifos de
      texto, e cada sistema operacional escolhe uma fonte diferente para
      eles: no Windows o ☺ de Usuarios virava uma carinha amarela de emoji.
   d) A BARRA DE TOPO subiu de 64 para 72px e o titulo dela saiu dos 14px do
      corpo para 16px. Era a unica faixa apertada de um layout que o resto
      do sistema ja tinha soltado.
   -------------------------------------------------------------------------- */

.lateral-marca {
  padding: var(--e6) var(--e5);
  margin-bottom: var(--e3);
  border-bottom: 1px solid rgba(255, 255, 255, .10);
  font-size: 1.1875rem;      /* 19px */
}
.lateral-marca .ponto {
  width: 36px; height: 27px;   /* 256x195 do arquivo: proporcao mantida */
  /* O halo violeta faz o simbolo descolar do roxo escuro. Sem ele o
     infinito, que tambem e violeta, encosta no fundo e some de longe.    */
  filter: drop-shadow(0 4px 14px rgba(162, 76, 255, .50));
}

.lateral-nav { padding-bottom: var(--e6); }
.lateral-item + .lateral-item,
.lateral-grupo > .lateral-item:first-of-type { margin-top: var(--e1); }

/* Todo icone desenhado no base.html sai com a classe .ico. Tamanho unico:
   18px e o ponto em que um traco de 1.8 ainda fica nitido sem virar
   desenho tecnico.                                                       */
.ico { flex: none; width: 18px; height: 18px; }

/* O icone do menu agora e um SVG dentro da caixa de 20px que ja existia. */
.lateral-item .icone {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px;
}
/* No item ativo o icone acompanha o texto e fica em forca total. */
.lateral-item[aria-current="page"] .icone { opacity: 1; }

.topo { min-height: 72px; }
.topo > strong {
  font-size: var(--t-md);
  color: var(--texto);
}

/* A BARRA DE TOPO E UMA LINHA SO, SEMPRE.

   Achado abrindo o painel num telefone de 390px: os selos de ambiente e os
   botoes de canto estavam no mesmo grupo, e esse grupo quebra linha. Os
   dois selos ("Modo simulado" e "desenvolvimento") mais os botoes nao
   cabiam lado a lado, o grupo virava duas linhas, a barra passava de 72
   para 84px em TODA tela do sistema e o botao de menu escorregava para o
   meio da faixa.

   Agora sao dois grupos: os selos rolam de lado quando nao cabem, e os
   botoes ficam num grupo proprio que nunca encolhe nem quebra.           */

/* Os botoes de canto da barra: tema e recolher menu. Sao alvos de toque,
   nao enfeites, entao nascem com o tamanho de .bt-icone e ganham a cor
   fraca de texto — quem procura funcionalidade acha, quem esta lendo a
   tela nao tropeca neles.                                                */
.topo-botoes { display: flex; align-items: center; gap: var(--e1); flex: none; }

/* Botao de canto nunca encolhe. Com o flex-shrink padrao, o botao de menu
   do celular perdia 4px de largura quando os selos apertavam a linha e
   caia para 39,8px — abaixo dos 44px de area de toque.                   */
.topo .bt-icone { flex: none; }

/* O botao de tema mostra o destino, nao o estado: com a tela clara ele
   mostra a lua ("clique para escurecer"). Mostrar o estado atual e a
   confusao classica desse botao.                                          */
.troca-tema .icone-lua,
.troca-tema .icone-sol { display: none; }
.troca-tema[data-tema-atual="claro"] .icone-lua { display: block; }
.troca-tema[data-tema-atual="escuro"] .icone-sol { display: block; }

/* O botao que recolhe o menu so existe no computador: no celular o menu ja
   e uma gaveta, recolher nao quer dizer nada. A folha ja sabia desenhar o
   menu recolhido desde sempre (.app[data-menu="fechado"]); o que faltava
   era um interruptor ligado nesse estado.                                 */
.recolhe-menu svg { transition: transform var(--transicao-lenta); }
.app[data-menu="fechado"] .recolhe-menu svg { transform: scaleX(-1); }


/* --------------------------------------------------------------------------
   PI.3 PAINEL — o numero e o heroi

   A fila de cartoes de numero e a primeira coisa que o dono olha de manha.
   Antes ela usava a grade generica e os cartoes tinham a mesma presenca de
   uma caixa de aviso. Aqui eles ganham:

     - 28px de folga em vez de 24, e altura minima, para a fila ficar reta
       mesmo quando um cartao tem uma nota de duas linhas;
     - o numero em tamanho fluido, de 34px a 52px conforme a largura, sem
       media query: e a mesma familia Inter ExtraBold do wordmark;
     - a nota separada por um fio, virando rodape do cartao. Isso da a
       hierarquia em tres degraus (rotulo pequeno, numero enorme, nota
       discreta) que o cartao antes nao tinha.

   TRES COISAS QUE SO APARECERAM COM A FILA MONTADA NO NAVEGADOR:

   1. O rotulo tem altura RESERVADA de duas linhas. "Ativas no fornecedor"
      cabe em uma, "Economia do modelo sob demanda" precisa de duas — e sem
      a reserva o numero de um cartao ficava 17px acima do numero do
      vizinho. Numero desalinhado quebra a unica coisa que essa fila existe
      para permitir, que e comparar de relance.
   2. Valor em reais tem tamanho proprio (.valor.em-reais). "R$ 151,80" tem
      quase o triplo dos caracteres de "27": nos 52px do numero puro ele
      quebrava em "R$" numa linha e "151,80" na outra.
   3. Entre 861 e 1240px a fila de quatro cartoes virava 3 + 1 sozinho
      embaixo, porque o menu lateral come 272px. Nessa faixa a fila passa a
      ser 2 x 2 de proposito.
   -------------------------------------------------------------------------- */

.painel-numeros {
  display: grid;
  gap: var(--e6);
  grid-template-columns: repeat(auto-fit, minmax(216px, 1fr));
  margin-bottom: var(--e8);
}
@media (min-width: 861px) and (max-width: 1240px) {
  .painel-numeros { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.painel-numeros .num-cartao {
  gap: 0;                    /* o espacamento passa a ser por elemento */
  padding: var(--e7);
  justify-content: flex-start;
}
.painel-numeros .num-cartao .rotulo {
  display: block;
  line-height: 1.4;
  /* Duas linhas reservadas mesmo quando o rotulo cabe em uma. Ver o
     item 1 do comentario da secao.                                       */
  min-height: calc(2 * 1.4 * var(--t-xs));
  margin-bottom: var(--e3);
}
.painel-numeros .num-cartao .valor {
  /* De 34px a 52px conforme a largura da janela. clamp resolve sozinho o
     que antes precisava de uma media query so para o celular.            */
  font-size: clamp(2.125rem, 1.35rem + 2.4vw, 3.25rem);
  margin-bottom: var(--e3);
}
/* Reais: menor e sem quebra. Ainda e o maior texto do cartao, entao
   continua sendo o heroi; so nao tenta ser do mesmo tamanho de "27".    */
.painel-numeros .num-cartao .valor.em-reais {
  font-size: clamp(1.625rem, 1.1rem + 1.5vw, 2.25rem);
  white-space: nowrap;
}
.painel-numeros .num-cartao .nota {
  padding-top: var(--e3);
  border-top: 1px solid var(--borda);
  color: var(--texto-3);
  line-height: var(--lh-densa);
}

/* O cartao de destaque. Ele NAO fica maior que os outros: larguras
   diferentes numa fila so viram bagunca e a fila deixa de ser comparavel.
   Ele fica mais PRESENTE — uma fita de acao no topo, tinta violeta bem
   diluida no fundo e o simbolo da marca como marca d'agua no canto.      */
.num-cartao-heroi {
  position: relative;
  overflow: hidden;
  border-color: var(--acao-borda);
  background: linear-gradient(
    180deg,
    color-mix(in srgb, var(--marca-violeta) 7%, var(--fundo-cartao)),
    var(--fundo-cartao) 62%);
}
@supports not (color: color-mix(in srgb, red, blue)) {
  .num-cartao-heroi { background: var(--fundo-cartao); }
}
.num-cartao-heroi::before {
  content: "";
  position: absolute; inset: 0 0 auto 0; height: 3px;
  background: linear-gradient(90deg, var(--marca-violeta), var(--acao-solido));
}
.num-cartao-heroi::after {
  content: "";
  position: absolute; right: -20px; bottom: -16px;
  width: 124px; height: 95px;
  background: url("/estatico/marca/simbolo.png") center / contain no-repeat;
  opacity: .07;
  pointer-events: none;
}
/* No escuro a mesma opacidade some: o simbolo violeta sobre fundo quase
   preto tem menos contraste do que sobre branco.                         */
@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) .num-cartao-heroi::after { opacity: .13; }
}
:root[data-tema="escuro"] .num-cartao-heroi::after { opacity: .13; }

/* O atalho para a lista. Fica dentro da nota, na propria linha, com a seta
   andando um passo no hover. E um link de verdade, com area de toque, e
   nao o cartao inteiro clicavel: cartao-link esconde para onde vai.      */
.painel-numeros .ir {
  display: flex; align-items: center; gap: var(--e1);
  width: fit-content;
  min-height: 32px;
  margin-top: var(--e2);
  font-size: var(--t-sm); font-weight: var(--p-forte);
  color: var(--acao-txt); text-decoration: none;
}
.painel-numeros .ir::after {
  content: "→";
  transition: transform var(--transicao);
}
.painel-numeros .ir:hover { text-decoration: underline; text-underline-offset: 3px; }
.painel-numeros .ir:hover::after { transform: translateX(3px); }

@media (max-width: 860px) {
  .painel-numeros { gap: var(--e5); }
  .painel-numeros .num-cartao { padding: var(--e6); }
  /* No celular cada cartao fica sozinho na linha: reservar duas linhas de
     rotulo so criaria buraco, porque nao ha vizinho com quem alinhar.   */
  .painel-numeros .num-cartao .rotulo { min-height: 0; }
  .painel-numeros .ir { min-height: var(--toque); }
}


/* ==========================================================================
   GRUPO OPERACAO — SEGUNDA RODADA  (secao OP2)
      beneficiarios · empresas · consultas · lotes · auditoria

   Continuacao da secao OP, escrita no fim do arquivo de proposito: a secao
   OP original tem as secoes LD e PI depois dela, e enfiar regra no meio
   mexeria na ordem de cascata do trabalho dos outros grupos. Aqui embaixo
   nada disputa com ninguem.

   As tres pecas daqui nasceram de medicao no navegador a 1280px e a 375px,
   com a base de demonstracao aberta. O numero de cada uma esta no comentario
   dela; nao sao estimativas.
   ========================================================================== */

/* --------------------------------------------------------------------------
   OP2.1 CELULA DE DUAS LINHAS

   Uma celula que carrega o fato principal e a ficha dele logo embaixo:
   o paciente com o CPF, o profissional com a especialidade.

   POR QUE ISTO EXISTE. /consultas tinha oito colunas e a tabela pedia 1128px
   numa caixa de 942 a 1280px — a largura em que a operacao trabalha. As duas
   ultimas colunas ficavam fora da tela, e uma delas era Contrato, que e o
   assunto da tela inteira. A saida NAO foi apertar: foi juntar os dois pares
   que respondem a mesma pergunta ("quem e a pessoa", "quem atendeu"). Sao
   duas colunas a menos e nenhum dado a menos.

   O QUE ISSO CUSTA, dito por extenso porque nao e de graca: a linha sobe de
   51px para 61px (medido, com a folga vertical ja reduzida logo abaixo). Em
   500 consultas sao umas cinco telas a mais de rolagem VERTICAL. A troca foi
   consciente: rolar para baixo e o movimento natural de uma lista, rolar para
   o LADO nao e — e era isso que o operador tinha que fazer, em toda linha,
   para descobrir de qual contrato a consulta era.

   Onde NAO usar: em par de dados que a pessoa compara na vertical, coluna
   contra coluna. Empilhado, o valor perde a coluna reta — e por isso que
   Vidas ativas e No fornecedor, em /empresas, continuam separadas.

   PARA QUEM FOR CONSOLIDAR ESTE ARQUIVO DEPOIS:
   a secao CFG.10 tem uma peca com a mesma ideia e outro nome — a
   .identidade, com os mesmos filhos .principal e .apoio, usada em /usuarios
   e /integracoes. Sao duas invencoes paralelas do mesmo componente, feitas na
   mesma rodada por duas equipes, e o certo e sobrar UMA, promovida para a
   secao 5. Nao unificamos aqui porque trocar a classe de baixo do pe de quem
   esta editando quebraria a tela dele. As diferencas reais entre as duas, que
   quem unificar precisa resolver: a .identidade usa peso forte no principal e
   flex com quebra no apoio (o prefixo da chave nao pode ser cortado); a
   .dupla usa peso medio e corta as duas linhas com reticencias, porque numa
   lista de 500 consultas a altura uniforme vale mais que o fim do texto.
   -------------------------------------------------------------------------- */
.dupla { display: block; min-width: 0; }

.dupla .principal {
  display: block;
  font-weight: var(--p-medio);
  color: var(--texto);
}

/* A ficha de baixo e APOIO: menor e apagada, para nunca disputar a leitura
   com o dado de cima. Se ela tivesse o mesmo peso, a coluna viraria duas
   colunas empilhadas e o olho nao saberia qual das duas seguir.          */
.dupla .apoio {
  display: block;
  margin-top: 1px;
  font-size: var(--t-xs);
  line-height: 1.35;
  color: var(--texto-3);
}

/* Mesmo motivo (e mesma medicao) do .corta da secao OP: coluna de texto que
   quebra em duas linhas dobra a altura da linha E encolhe sozinha no layout
   automatico da tabela. Aqui o teto vai na propria peca, e nao no <td>,
   porque a celula pode ter mais coisa alem dela.                         */
.tabela-limpa td .dupla { max-width: 15rem; }
.tabela-limpa td .dupla .principal,
.tabela-limpa td .dupla .apoio {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Linha com celula de duas linhas devolve 4px de folga de cada lado.

   A folga vertical de 16px da secao 5 existe para dar ESTRUTURA a uma linha
   de um andar so — sem ela, uma pilha de linhas de texto vira extrato
   bancario. Onde ja ha dois andares, a estrutura vem da propria celula, e os
   16px passam a ser sobra: 69px de linha contra os 61px que a mesma linha tem
   com 12px de folga, e a olho nu a de 61px nao parece mais apertada.

   Vale so para a linha que TEM a peca, e nao para a tabela toda: numa lista
   onde algumas linhas tem duas linhas e outras nao, encolher todo mundo
   deixaria as de um andar so espremidas por causa das vizinhas.

   Onde :has() nao existe, o navegador ignora a regra inteira e a linha fica
   com os 69px de antes. Perde-se aperto, nao se perde nada de conteudo: e
   um ajuste de folga, nao uma peca de layout.                            */
.tabela-limpa tbody tr:has(.dupla) td { padding-block: var(--e3); }

/* --------------------------------------------------------------------------
   OP2.2 BARRA DE FILTRO DENSA

   A .busca da secao 5 pede 300px de base. Em /auditoria, que tem cinco
   controles na mesma barra (busca, quem fez, de, ate e o botao), a soma das
   bases da 913px numa barra de 894 — 19px de excesso. O resultado nao e uma
   barra apertada, e o par Filtrar/Limpar caindo sozinho numa SEGUNDA
   fileira: a barra vai de 112px para 168px de altura para carregar um botao.

   Baixando so a BASE (o flex-grow 2 continua intocado), a busca volta a caber
   na mesma linha e cresce de novo para ocupar a sobra em telas maiores.
   Largura final igual, sem a quebra.
   -------------------------------------------------------------------------- */
.filtros-densa .busca { flex: 2 1 220px; }

/* --------------------------------------------------------------------------
   OP2.3 AS DUAS PECAS ACIMA NO CELULAR
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  /* No cartao nao existe coluna para preservar: o valor pode ocupar as linhas
     que precisar, e cortar ali so esconderia dado sem ganhar nada.       */
  .tabela-limpa.tabela-vira-cartao td .dupla { max-width: none; }
  .tabela-limpa.tabela-vira-cartao td .dupla .principal,
  .tabela-limpa.tabela-vira-cartao td .dupla .apoio {
    overflow: visible;
    white-space: normal;
  }

  /* Na linha do cartao o rotulo cola na esquerda e o valor na direita. As
     duas linhas do valor precisam terminar na MESMA borda, senao parecem
     dois valores soltos em vez de um fato com a ficha dele.              */
  .tabela-limpa.tabela-vira-cartao td .dupla { text-align: right; }
  /* Menos na primeira celula, que e o titulo do cartao e nao uma linha de
     rotulo e valor.                                                      */
  .tabela-limpa.tabela-vira-cartao td:first-child .dupla { text-align: left; }

  /* O titulo do cartao vem em 18px na letra da marca (regra OP.7). A ficha
     de apoio embaixo dele NAO pode herdar isso: em 18px ExtraBold ela vira
     um segundo titulo. So o tamanho, o peso e a entreletra voltam ao normal
     — quem tem .cod continua monoespacado, porque familia declarada na
     propria peca ganha de familia herdada do pai.                        */
  .tabela-limpa.tabela-vira-cartao td:first-child .dupla .apoio {
    font-size: var(--t-sm);
    font-weight: var(--p-normal);
    letter-spacing: 0;
    line-height: var(--lh-densa);
  }

  /* A barra densa empilha em coluna como qualquer outra: a base menor da
     busca so tinha sentido enquanto a barra era uma linha.               */
  .filtros-densa .busca { flex: 1 1 auto; }
}


/* ==========================================================================
   GRUPO LEITURA E DECISAO — SEGUNDA RODADA  (secao LD2)
      ficha_beneficiario.html · elegibilidade.html · lote.html ·
      importar.html · importar_simulacao.html

   A secao LD ja existe la em cima. Esta vem no FIM do arquivo, como as
   outras segundas rodadas, por dois motivos:

     1. nao reescrever o bloco de quem passou antes;
     2. porque metade do que esta aqui SO funciona vindo depois. Sao regras
        que perdiam para o reset da secao 2 por especificidade e precisam da
        ordem do arquivo para valer.

   Nada daqui e palpite: tudo saiu de medicao no navegador, com as cinco
   telas renderizadas de verdade, a 1280px e a 375px, nos dois temas. Cada
   bloco diz o que estava errado e como apareceu.
   ========================================================================== */


/* --------------------------------------------------------------------------
   LD2.1 TRES REGRAS QUE O RESET ESTAVA COMENDO EM SILENCIO

   O reset da secao 2 tem:

       ul[class], ol[class] { list-style: none; margin: 0; padding: 0; }

   Isso vale (0,1,1) de especificidade e pega QUALQUER lista com classe. Uma
   regra escrita so como `.trilha` vale (0,1,0) e perde: a declaracao existe
   no arquivo, o navegador a descarta, e nada na tela denuncia. A secao CFG
   ja tinha deixado o aviso escrito para `ol.regras-fixas`; a secao LD caiu
   na armadilha em tres lugares. Medido com getComputedStyle:

     .trilha     margin-bottom  32px -> 0.  A trilha de passos ficava com
                 ZERO de folga ate o <h1>, nas duas telas de importacao.
     .lista-cpf  margin-top     16px -> 0.  As pastilhas de CPF de quem vai
                 ser desligado encostavam no paragrafo de aviso.
     .tempo      padding-left   24px -> 0.  Esta era a pior. As bolinhas da
                 linha do tempo do historico sao posicionadas A PARTIR dessa
                 folga (`left: calc(var(--e6) * -1 - 6px)`), entao sem ela
                 iam parar 30px a esquerda da propria lista — fora do cartao,
                 soltas no fundo da pagina e longe do fio vertical.

   A correcao e a mesma que o resto do arquivo ja usa: repetir a regra com o
   ELEMENTO na frente. Empata em (0,1,1) e ganha pela ordem.
   -------------------------------------------------------------------------- */
ol.trilha    { margin-bottom: var(--e8); }
ul.lista-cpf { margin-top: var(--e4); }
ul.tempo     { padding-left: var(--e6); }


/* --------------------------------------------------------------------------
   LD2.2 A LEGENDA DO LOTE PERDE OS style= ESCRITOS NA MAO

   O lote.html carregava a cor de cada pastilha dentro do proprio HTML
   (`style="background:var(--ok-solido)"`), uma vez por pastilha. Quatro
   copias do mesmo valor num template: no dia em que o ambar mudar, mudam
   tres e esquecem a quarta. Aqui a cor vem do atributo `data-tom`, que e a
   convencao que o .num-cartao e o .cartao ja usam nesta folha.

   "Na fila" e a unica sem preenchimento, de proposito: ela nao e uma
   situacao com cor, e a ausencia de resultado. Vazia, ela se le como "ainda
   nao aconteceu" antes de a pessoa chegar na palavra.
   -------------------------------------------------------------------------- */
.legenda i[data-tom="ok"]   { background: var(--ok-solido); }
.legenda i[data-tom="erro"] { background: var(--erro-solido); }
.legenda i[data-tom="at"]   { background: var(--at-solido); }
.legenda i[data-tom="fila"] {
  background: var(--fundo-cartao);
  box-shadow: inset 0 0 0 1px var(--borda-forte);
}


/* --------------------------------------------------------------------------
   LD2.3 O FORMULARIO DE UMA PERGUNTA SO (elegibilidade)

   O elegibilidade.html trazia o layout escrito no atributo style: um
   `align-items:flex-end` no <form> e um `min-width:240px; flex:1 1 auto` no
   campo. Funcionava, e era invisivel para quem for mexer depois — layout no
   template e a primeira coisa que se perde numa refatoracao. Virou classe,
   com exatamente o mesmo comportamento no computador.

   No telefone o botao passa a ocupar a linha inteira. Medido em 375px: ele
   ficava com 128px encostado a esquerda, embaixo de um campo de 293px. Um
   botao que ocupa um terco da linha parece acao secundaria, e este e o
   unico verbo da tela.
   -------------------------------------------------------------------------- */
.forma-consulta {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--e3);
}
/* min-width e nao flex-basis: min-width quer dizer largura em qualquer
   direcao, e flex-basis muda de sentido quando o eixo vira. */
.forma-consulta .campo { flex: 1 1 auto; min-width: 240px; }

@media (max-width: 560px) {
  .forma-consulta .campo { flex: 1 1 100%; min-width: 0; }
  .forma-consulta .bt { width: 100%; }
}


/* --------------------------------------------------------------------------
   LD2.4 A BARRA DE DECISAO NO TELEFONE

   Medida em 375x812 com a simulacao bloqueada: a barra grudada no rodape
   tinha 186px de altura. Isso e 23% da tela do aparelho, o tempo todo,
   justamente na tela que a pessoa esta rolando para conferir.

   A secao LD ja tinha tirado a frase de detalhe abaixo de 560px por causa
   disso. O que sobrou de alto foram os DOIS botoes, empilhados um sobre o
   outro por causa da regra geral de celular (`.bt` nao quebra rotulo, entao
   o sistema prefere empilhar a cortar). Aqui eles voltam para a mesma linha.

   Para caber, o rotulo passa a poder quebrar em duas linhas — o contrario
   do que .bt faz por padrao, e de proposito: numa barra de ferramentas um
   rotulo quebrado e feio, mas aqui o que esta em disputa e a ALTURA da
   tela. "Confirmar — grava / 2 registro(s)" em duas linhas continua se
   lendo inteiro; cortado seria pior, e empilhado custa 56px.

   Os 44px de alvo de toque continuam garantidos com folga: duas linhas de
   texto a 1.4 de entrelinha mais o padding vertical ja passam de 50px.
   -------------------------------------------------------------------------- */
@media (max-width: 560px) {
  .barra-decisao {
    gap: var(--e3);
    padding: var(--e4) var(--e5);
    /* Repetido porque a linha de cima e atalho e apaga o que a secao LD.8
       tinha posto aqui. Sem isto a barra fica debaixo da faixa do iPhone. */
    padding-bottom: calc(var(--e4) + env(safe-area-inset-bottom));
  }
  /* `stretch` e nao `center`: com os rotulos podendo quebrar, um botao fica
     com uma linha e o outro com duas, e dois botoes lado a lado de alturas
     diferentes parecem dois pesos diferentes de acao. Esticados, os dois
     ganham a altura do mais alto e a escolha volta a ser entre iguais. */
  .barra-decisao .acoes { flex-wrap: nowrap; gap: var(--e3); align-items: stretch; }
  /* Os dois lados dividem a linha. O `min-width: 0` e o que autoriza o item
     flexivel a encolher abaixo do proprio conteudo — sem ele o rotulo longo
     empurra o vizinho para fora da tela (visto: 405px de rolagem numa tela
     de 375).

     O seletor `> .bt` parece redundante ao lado do `> *` e nao e: a secao
     LD.8 escreve `.barra-decisao .acoes .bt { flex: 1 1 auto }`, que vale
     (0,3,0) e ganha de um `> *` de (0,2,0). Sem repetir com o mesmo peso, o
     botao que e filho direto ficava com base automatica, tomava 323px dos
     327 disponiveis e espremia o outro em 26px. */
  .barra-decisao .acoes > *,
  .barra-decisao .acoes > .bt { flex: 1 1 0; min-width: 0; }
  /* O botao principal fica maior que o de escape, na proporcao 1,4 : 1. Meio
     a meio nao esta errado, so nao esta certo: um dos dois grava 900 vidas e
     o outro volta uma tela. Com mais largura ele tambem quebra em menos
     linhas, e a barra inteira encolhe junto. */
  .barra-decisao .acoes > form,
  .barra-decisao .acoes > .bt-1 { flex: 1.4 1 0; }
  .barra-decisao .acoes .bt {
    width: 100%;
    white-space: normal;
    line-height: var(--lh-densa);
    padding-inline: var(--e3);
    /* `justify-content: center` do .bt centraliza a CAIXA do texto; quando o
       rotulo quebra, quem centraliza cada linha dentro dela e o text-align.
       Sem ele "Enviar outro / arquivo" sai encostado a esquerda. */
    text-align: center;
    text-wrap: balance;
  }
}


/* --------------------------------------------------------------------------
   LD2.5 A FILEIRA DE NUMEROS DA SIMULACAO

   Sao ate seis cartoes lado a lado e so quatro deles tem a linha de
   explicacao embaixo do numero ("Nada a fazer", "Travam a confirmação").
   Como a grade iguala a altura, os dois sem explicacao ficavam com 31px de
   vazio no rodape — medido a 1280px — e a fileira parecia desalinhada
   estando alinhada.

   A saida e a que o painel ja usa: a nota vira RODAPE do cartao, empurrada
   para baixo com margin-top: auto e separada por um fio. As notas passam a
   se alinhar entre si na fileira inteira, o numero continua sendo o heroi, e
   o cartao sem nota fica com o vazio embaixo por decisao, nao por sobra.
   -------------------------------------------------------------------------- */
.simulacao-numeros .num-cartao .valor { margin-bottom: var(--e2); }
.simulacao-numeros .num-cartao .nota {
  margin-top: auto;
  padding-top: var(--e3);
  border-top: 1px solid var(--borda);
  color: var(--texto-3);
  line-height: var(--lh-densa);
}


/* --------------------------------------------------------------------------
   LD2.6 CARTAO SEM CONTEUDO

   "Nenhuma consulta registrada." e "Sem eventos registrados." eram
   <p class="pequeno t2"> soltos dentro do corpo do cartao: um risco de
   cinza encostado no canto superior esquerdo, que o olho le como sobra de
   texto e nao como resposta. O estado vazio de tela inteira (.vazio, secao
   6.2) e grande demais para caber num cartao de coluna.

   O meio termo: centralizado, com o ar de um estado vazio e o tamanho de um
   cartao. Nao ganha borda tracejada propria — o cartao ja e a moldura, e
   moldura dentro de moldura sempre parece remendo.
   -------------------------------------------------------------------------- */
.vazio-cartao {
  padding: var(--e10) var(--e5);
  text-align: center;
  color: var(--texto-2);
  font-size: var(--t-sm);
  line-height: var(--lh-normal);
}


/* ==========================================================================
   DIRECAO DE ARTE — PASSADA FINAL  (secao DA)

   Ultima passada, feita com as 19 telas abertas no navegador nos dois temas,
   em 1440, 1280 e 375px, com a base de demonstracao carregada. As secoes
   anteriores resolveram cor, contraste, respiro e celular; nenhuma delas
   estava errada e nenhuma foi reescrita. O que sobrou e o que so aparece
   quando voce olha as telas LADO A LADO:

     1. a mesma coisa dita de tres jeitos (a faixa de ambiente);
     2. a mesma coisa desenhada de dois jeitos (link de tabela, barra de
        lote, sombra de cartao);
     3. cor semantica gasta onde nao ha semantica (o semaforo do painel);
     4. glifo de texto e emoji fazendo papel de icone;
     5. alvo de toque pequeno no celular em links que sao o alvo principal
        do cartao.

   Tudo aqui e ADITIVO e vem no fim de proposito: apagar esta secao devolve
   o sistema ao estado da rodada anterior sem quebrar layout nenhum.
   ========================================================================== */


/* --------------------------------------------------------------------------
   DA.1 FAIXA DE AMBIENTE — o maior ganho visual desta passada

   O QUE HAVIA. Toda tela abria assim:

       [ barra de topo ]  Painel — ConectaOn   (Modo simulado) (desenvolvimento)
       ┌──────────────────────────────────────────────────────────────┐
       │ (!)  Fornecedor em modo simulado: nada é enviado para fora.  │  70px
       └──────────────────────────────────────────────────────────────┘
       Painel

   Tres problemas de uma vez:
     - o mesmo fato dito em tres lugares (dois selos + a caixa);
     - a caixa de recado AMBAR, com disco de alerta, e a primeira coisa da
       tela em TODAS as 19 telas — a pagina comeca com um alarme em vez de
       comecar com o proprio nome dela;
     - no telefone os dois selos nao cabiam ao lado do titulo, entao a folha
       escondia o TITULO. Na tela menor, a unica em que o menu esta fechado
       e a pessoa nao ve onde esta, sobrava "onde nao estamos" e sumia
       "onde estamos".

   O QUE E AGORA. Uma faixa de uma linha so, com os selos na ponta direita.
   O texto e a familia de cor de atencao sao os mesmos: mudou o PESO. A
   barra de topo ficou com menu · nome da tela · tema, e o nome da tela
   voltou a aparecer no celular.

   E o ganho que nao se ve aqui: em producao, sem modo simulado, a faixa
   nao existe. O sistema abre sem chrome de aviso nenhum, que e o estado
   normal e o que o cliente vai ver.
   -------------------------------------------------------------------------- */
.faixa-ambiente {
  display: flex; align-items: center; flex-wrap: wrap;
  gap: var(--e3) var(--e5);
  padding: var(--e3) var(--e5);
  margin-bottom: var(--e6);
  background: var(--at-fundo);
  border: 1px solid var(--at-borda);
  border-left: 3px solid var(--at-solido);
  border-radius: var(--r2);
  font-size: var(--t-sm);
  line-height: var(--lh-densa);
  color: var(--at-txt);
}
.faixa-ambiente-recados { flex: 1 1 22rem; min-width: 0; display: grid; gap: var(--e2); }
.faixa-ambiente-recados p { display: flex; align-items: baseline; gap: var(--e3); }

/* O ponto no lugar do disco de alerta. O disco com "!" dentro tinha o peso
   de um erro; o ponto tem o peso de um estado. E fica na cor cheia da
   familia, entao continua sendo a mesma sinalizacao.                     */
.faixa-ambiente .ponto {
  flex: none; width: 7px; height: 7px; border-radius: 50%;
  background: var(--at-solido);
  transform: translateY(-1px);
}
.faixa-ambiente-selos { display: flex; flex-wrap: wrap; gap: var(--e2); margin-left: auto; }

/* No telefone os selos passam para a linha de baixo em vez de espremer o
   recado: texto de aviso cortado ao meio nao avisa nada.                 */
@media (max-width: 560px) {
  .faixa-ambiente { gap: var(--e3); }
  .faixa-ambiente-selos { margin-left: 0; }
}


/* --------------------------------------------------------------------------
   DA.2 O NOME DA TELA VOLTA AO TELEFONE

   Consequencia direta da DA.1: sem os selos disputando a linha, sobram 223
   dos 375px para o titulo depois do botao de menu e do botao de tema.
   Medido, nao estimado. A regra da secao 7 que escondia o titulo perde o
   motivo de existir.
   -------------------------------------------------------------------------- */
@media (max-width: 560px) {
  .topo > strong {
    display: block;
    flex: 1 1 auto; min-width: 0;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
}

/* O nome da tela na barra e CHROME, nao manchete: o <h1> da propria tela
   repete a palavra 40px abaixo dele. Com os dois no mesmo preto e no mesmo
   peso, a barra competia com o titulo. Um degrau abaixo resolve, e o
   titulo da pagina volta a ser o comeco da leitura.                      */
.topo > strong { color: var(--texto-2); font-weight: var(--p-medio); }


/* --------------------------------------------------------------------------
   DA.3 LINK QUE ABRE UM REGISTRO: UM DESENHO SO, EM TODA TABELA

   O mesmo lote aparecia de dois jeitos na mesma sessao:

     /lotes   -> "Planilha Go Live - julho/2026"  preto, negrito, risco cinza
     /painel  -> "Planilha Go Live - julho/2026"  violeta, sublinhado cheio

   E a mesma pessoa aparecia de dois jeitos em telas vizinhas: preta em
   /beneficiarios, violeta em /agenda. No celular era pior: o MESMO link da
   MESMA tela ficava preto no computador e violeta de 18px no cartao.

   A regra da secao OP ja tinha achado metade do desenho certo e explicado
   por que (uma coluna inteira de violeta gasta a cor de acao). Ela so
   estava presa a .tabela-navegavel. Aqui ela passa a valer para qualquer
   link dentro do corpo de qualquer tabela do sistema — que e onde essa
   situacao existe.

   A OUTRA METADE: o sublinhado sai do estado de repouso.

   A regra antiga o mantinha aceso sempre, com este motivo escrito: "o
   sublinhado e o que impede o link de depender so de cor". O motivo estava
   certo para o caso que a WCAG 1.4.1 descreve — link no MEIO de um
   paragrafo, onde so a cor separa o que e clicavel do que nao e. Aqui nao
   e esse caso: a primeira celula de TODA linha e um link, nao existe
   vizinho nao-clicavel para confundir, e o nome fica na cor do texto comum,
   entao nao ha cor nenhuma de que depender.

   O que sobra sao trinta riscos cinzas empilhados numa coluna, e e a
   primeira coisa que faz a lista parecer catalogo de 1998 em vez de
   produto. O que diz "esta linha abre" passa a ser o conjunto que ja
   estava la e nao dependia de cor: a palavra "Abrir" escrita no fim da
   linha, a linha inteira acendendo no hover, a barra violeta entrando na
   borda esquerda, e o cursor. No celular, onde nao ha hover, a linha ja
   virou um cartao com titulo e "Abrir" dentro.
   -------------------------------------------------------------------------- */
.tabela tbody td a:not(.bt):not(.selo) {
  color: var(--texto);
  font-weight: var(--p-forte);
  text-decoration: none;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--transicao);
}
.tabela tbody tr:hover td a:not(.bt):not(.selo),
.tabela tbody td a:not(.bt):not(.selo):hover,
.tabela tbody td a:not(.bt):not(.selo):focus-visible {
  color: var(--acao-txt);
  text-decoration: underline;
}
/* Sem cursor de mao na LINHA inteira, de proposito: a linha nao e clicavel,
   so o nome e o "Abrir" sao. Cursor de mao onde o clique nao faz nada e uma
   promessa que o sistema nao cumpre.                                      */

/* Referencia curta de sistema (o id do lote na auditoria) continua em
   fonte de numero: e um codigo para conferir caractere a caractere, nao um
   nome para ler.                                                          */
.tabela tbody td a.cod, .tabela tbody td.cod a { font-family: var(--fonte-numero); }

/* NO CELULAR NAO EXISTE HOVER, entao o aviso tem de estar parado na tela.

   A folha antiga resolvia pintando o titulo do cartao de VIOLETA — o que
   trazia de volta, na tela pequena, exatamente a parede de cor que a regra
   do computador tinha acabado de tirar, e fazia o MESMO link ser preto no
   computador e violeta no telefone.

   Aqui ele fica preto, igual, e ganha um sinal de direcao no fim: a mesma
   setinha que toda lista de iOS e de Android usa para dizer "isto abre".
   Nao e cor, nao e glifo de fonte (que muda de maquina para maquina) — e um
   desenho, e ele aparece sozinho, sem esperar dedo nenhum.               */
@media (max-width: 860px) {
  .tabela-vira-cartao tbody td:first-child a:not(.bt):not(.selo) {
    color: var(--texto);
    display: inline-flex; align-items: center; gap: var(--e2);
  }
  .tabela-vira-cartao tbody td:first-child a:not(.bt):not(.selo)::after {
    content: "";
    flex: none; width: 15px; height: 15px;
    background: var(--texto-3);
    -webkit-mask: var(--icone-avancar) center / contain no-repeat;
            mask: var(--icone-avancar) center / contain no-repeat;
  }
}
:root {
  --icone-avancar: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 5.5 16 12l-6.5 6.5'/%3E%3C/svg%3E");
}


/* --------------------------------------------------------------------------
   DA.4 O SEMAFORO DO PAINEL

   A fila de quatro numeros do painel tinha TRES gramaticas de destaque ao
   mesmo tempo:

     Vidas ativas    -> fita violeta no topo   (o cartao heroi)
     No fornecedor   -> nada
     Economia        -> barra VERDE a esquerda
     Custo previsto  -> barra AMBAR a esquerda

   Duas dessas cores nao queriam dizer nada. "Custo previsto R$ 34,50" nao e
   uma advertencia: e a conta do mes, e ela sempre existe. Pintar de ambar
   todo mes ensina a pessoa a ignorar o ambar — e o ambar e justamente a cor
   com que esta tela avisa que 2 cadastros estao parados, dez centimetros
   acima. Gastar a cor de alerta num numero de rotina custa o alerta de
   verdade.

   Entao a fila fica com uma gramatica so: o cartao heroi tem a fita violeta,
   os outros sao quietos. Quando aparecer cor ali, ela vai querer dizer
   alguma coisa. (O atributo `data-tom` continua existindo e continua valendo
   nas telas onde o tom E a informacao: /diagnostico, a simulacao da
   importacao e a tela de erro.)
   -------------------------------------------------------------------------- */
.painel-numeros .num-cartao[data-tom] { border-left-width: 1px; border-left-color: var(--borda); }


/* --------------------------------------------------------------------------
   DA.5 A BARRA DO LOTE PARA DE MENTIR

   /lotes desenhava a barra de progresso INTEIRA em vermelho quando o lote
   tinha uma falha qualquer. Com 8 gravados, 2 falhas e 1 incerto de 12, a
   lista dizia "vermelho" e a tela do lote, um clique adiante, dizia
   "verde-vermelho-ambar". Duas respostas para a mesma pergunta, e a
   primeira era a errada.

   A tela do lote ja tinha a peca certa (.progresso-misto, secao 5.10). A
   lista passa a usar a mesma, na altura da linha de tabela. Mesma barra,
   mesmas cores, mesmo significado nos dois lugares.
   -------------------------------------------------------------------------- */
.progresso-linha .progresso-misto {
  flex: none; width: 84px; height: 6px;
  border-radius: var(--r-pilula);
}
@media (max-width: 860px) {
  .tabela-limpa.tabela-vira-cartao .progresso-linha .progresso-misto { flex: 1; width: auto; height: 8px; }
}


/* --------------------------------------------------------------------------
   DA.6 A BARRA DE SALVAR PARAVA DE SER OPACA

   .config-barra tinha `rgba(255,255,255,.9)`. Noventa por cento nao e
   opaco: o paragrafo que passa por baixo dela aparece atraves do fundo e
   fica cortado no meio de uma frase. Em 1440px, com /parametros rolado,
   parecia defeito de desenho da pagina.

   Fundo cheio, e a sombra apontando para CIMA — que e de onde vem o
   conteudo que ela esta cobrindo. Sombra para baixo numa barra de rodape
   nao explica nada, porque nao ha nada embaixo.
   -------------------------------------------------------------------------- */
.config-barra, .barra-decisao {
  background: var(--fundo-cartao);
  box-shadow:
    0 -1px 2px rgba(25, 19, 52, .04),
    0 -8px 24px rgba(25, 19, 52, .10);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) .config-barra,
  :root:not([data-tema="claro"]) .barra-decisao {
    box-shadow: 0 -1px 2px rgba(0,0,0,.5), 0 -10px 28px rgba(0,0,0,.55);
  }
}
:root[data-tema="escuro"] .config-barra,
:root[data-tema="escuro"] .barra-decisao {
  box-shadow: 0 -1px 2px rgba(0,0,0,.5), 0 -10px 28px rgba(0,0,0,.55);
}


/* --------------------------------------------------------------------------
   DA.7 ESTADO VAZIO: TIRAR A BORDA TRACEJADA

   Borda tracejada e vocabulario de rascunho — area de arrastar arquivo,
   moldura de wireframe, componente que ainda nao existe. Numa tela pronta
   ela diz "isto aqui esta faltando", e o que esta faltando e o DADO, nao a
   tela.

   A saida e um painel macio: fundo levemente afastado do cartao, borda
   continua, canto grande. O mesmo objeto, sem o ar de provisorio.

   A borda tracejada continua onde ela quer dizer a verdade: a area de
   soltar arquivo da importacao (.area-arquivo), que E um lugar vazio
   esperando alguma coisa cair dentro.
   -------------------------------------------------------------------------- */
.vazio {
  border-style: solid;
  border-color: var(--borda);
  background: linear-gradient(180deg, var(--fundo-sutil), var(--fundo-cartao) 70%);
  border-radius: var(--r4);
}
@supports not (color: color-mix(in srgb, red, blue)) {
  .vazio { background: var(--fundo-sutil); }
}
.vazio-filtro { background: var(--fundo-sutil); }

/* O SIMBOLO do estado vazio era um glifo de texto: "⇅" no painel, "?" na
   elegibilidade. Mesmo problema que os icones do menu tinham antes de
   virarem SVG — cada sistema operacional escolhe uma fonte, o tamanho
   optico muda, e no Android o "⇅" tem chance de sair como emoji. E dois
   simbolos diferentes para o mesmo papel em duas telas.

   Vira um disco na tinta da acao, bem diluida, com o glifo dentro. O disco
   e desenhado pelo CSS e existe em qualquer maquina; o glifo, quando cai
   para a fonte do sistema, cai DENTRO de uma forma que ja esta certa.   */
.vazio .simbolo {
  display: inline-flex; align-items: center; justify-content: center;
  width: 56px; height: 56px;
  margin-bottom: var(--e2);
  border-radius: 50%;
  background: var(--acao-fundo);
  border: 1px solid var(--acao-borda);
  color: var(--acao-txt);
  font-size: 1.5rem; line-height: 1;
  opacity: 1;                 /* o disco ja e discreto; o glifo nao precisa ser */
}


/* --------------------------------------------------------------------------
   DA.8 O CADEADO DE EMOJI

   `content: "🔒 "` num ::before. Emoji e imagem colorida entregue pelo
   sistema operacional: sai azul e cinza no Windows, dourado no Mac,
   desenhado a mao no Android, e em nenhum deles combina com o traco de 1.8
   dos icones do menu. Numa linha de texto cinza de 13px, ele e a coisa mais
   colorida da tela — para dizer "voce nao pode".

   Trocado por um cadeado desenhado, herdando currentColor como todo o
   resto. Continua zero dependencia externa: e um SVG dentro da propria
   propriedade.
   -------------------------------------------------------------------------- */
:root {
  --icone-cadeado: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='10.5' width='16' height='11' rx='2.2'/%3E%3Cpath d='M7.8 10.5V7.2a4.2 4.2 0 0 1 8.4 0v3.3'/%3E%3C/svg%3E");
}
/* Onde mask nao existe, o cadeado some e sobra o texto — que ja explica o
   motivo sozinho. Nunca cai de volta no emoji.                           */
@supports not ((-webkit-mask: url("")) or (mask: url(""))) {
}


/* --------------------------------------------------------------------------
   DA.9 ALVO DE TOQUE NO CELULAR

   Medido a 375px na base de demonstracao. Quando a tabela vira cartao, o
   link do topo do cartao — o nome da pessoa, a descricao do lote — e o
   alvo PRINCIPAL daquele cartao, e ele tinha 21,5px de altura. O dedo tem
   44. A regra da secao 7 que sobe os alvos para 44px nao conhecia esses
   links porque no computador eles vivem dentro de uma celula.

   As migalhas tinham 20,8px, abaixo ate dos 24px que a WCAG 2.5.8 pede
   para alvo pequeno. Elas sao o unico caminho de volta em /beneficiarios/N
   e em /agenda/nova.
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  .tabela-vira-cartao tbody td a:not(.bt):not(.selo) {
    display: inline-flex; align-items: center;
    min-height: var(--toque);
  }
  /* Nas OUTRAS celulas o link nao e o alvo principal do cartao — e o nome
     do paciente na linha "Paciente" da agenda, a referencia do lote na
     linha "Sobre" da auditoria. Empurrar essas para 44px dobraria a altura
     de cada linha do cartao. Ficam nos 24px que a WCAG 2.5.8 pede para
     alvo pequeno, que e mais do que os 18px que tinham.                   */
  .tabela-vira-cartao tbody td:not(:first-child) a:not(.bt):not(.selo) {
    min-height: 24px;
  }

  /* A marca da tela de erro e o unico caminho de volta dali, e tinha 28,8px.
     Ela e um link de tamanho de titulo, entao o que falta e so a folga.   */
  .erro-marca { min-height: var(--toque); }
}
.migalhas a {
  display: inline-flex; align-items: center;
  min-height: 24px;                      /* WCAG 2.5.8, alvo minimo */
  padding-inline: var(--e1);
  margin-inline: calc(var(--e1) * -1);   /* o recuo nao desloca o texto */
}
@media (max-width: 860px) {
  .migalhas { gap: var(--e3); }
  .migalhas a { min-height: var(--toque); }
}

/* Caixa de marcar: outra suspeita medida e ARQUIVADA. O varredor acusou
   `input` de 18x18px em /importar e /integracoes, abaixo dos 44. So que
   quem responde ao toque nesses dois lugares e o <label> em volta
   (.marcar e .opcao-marcavel), e os dois ja passam de 60px de altura
   porque o texto deles tem duas ou tres linhas. A secao 7 ja sobe .marcar
   para 44px quando o texto e curto.

   Nao ha nada a fazer aqui, e ha algo a NAO fazer: alinhar esses rotulos
   pelo centro. Eles usam align-items: flex-start de proposito, para a
   caixinha ficar na altura da PRIMEIRA linha do texto. Centralizada, ela
   flutua no meio de um paragrafo de tres linhas.                         */


/* --------------------------------------------------------------------------
   DA.10 SITUACAO DA CONSULTA NA FICHA

   A ficha do beneficiario escrevia "realizada" — a palavra crua do banco,
   em minuscula, em texto comum. A mesma informacao, em /consultas, e um
   selo verde escrito "Realizada". Duas escritas para o mesmo dado em duas
   telas que a operacao abre uma atras da outra.

   O selo agora e o mesmo dos dois lados (a macro selo_agendamento de
   pecas.html). Esta regra so cuida do espaco: dentro da tabela compacta da
   ficha, o selo nao precisa da folga que ele tem numa lista de tela cheia.
   -------------------------------------------------------------------------- */
.ficha-consultas .selo { white-space: nowrap; }


/* --------------------------------------------------------------------------
   DA.11 SOMBRA: MEDIDO, E ESTAVA CERTO

   Registro de uma suspeita que NAO se confirmou, para ninguem gastar a
   proxima rodada com ela. A olho, parecia que uns cartoes flutuavam e
   outros ficavam colados no fundo. Varri as 15 telas por script, listando
   toda superficie branca de mais de 200x40px e a sombra calculada de cada
   uma: .cartao, .num-cartao, .tabela-caixa, .filtros, .config-lista e
   .config-forma usam TODAS a mesma --sombra1, com o mesmo raio de 12px.

   As unicas sem sombra sao .entrada, .selecao e .opcao-marcavel — que sao
   CONTROLES de formulario, nao superficies apoiadas no fundo. Campo com
   sombra parece cartao, e cartao nao se digita dentro.

   O sistema estava consistente. O que faltava era o hover.
   -------------------------------------------------------------------------- */

/* O hover do cartao clicavel estava em dois lugares: o .num-cartao subia
   2px e trocava a sombra, o .cartao clicavel nao fazia nada. Quem sobe,
   sobe igual.                                                            */
.cartao[href]:hover, a.cartao:hover {
  border-color: var(--borda-forte);
  box-shadow: var(--sombra2);
  transform: translateY(-2px);
}
@media (prefers-reduced-motion: reduce) {
  .cartao[href]:hover, a.cartao:hover, a.num-cartao:hover { transform: none; }
}


/* --------------------------------------------------------------------------
   DA.12 ULTIMO LOTE: CARTAO QUE ESTICA E NAO PREENCHE

   No painel, "Como fecha a conta" e "Últimos lotes" ficam lado a lado numa
   grade. A grade esticava os dois para a altura do mais alto, e o da
   direita, com um lote so, ficava com 155px de branco no pe (medido a
   1440px). Cartao com um vao grande no fim parece conteudo que nao
   carregou — e o vao cresce junto com a diferenca entre os dois.

   `align-items: start` faz cada cartao ter a altura do que ele tem dentro.
   Dois cartoes de alturas diferentes lado a lado sao normais; um cartao com
   um buraco dentro nao e. Vale so para .grade-2, que e a grade de cartoes
   irmaos — a .grade-auto continua esticando, porque la os cartoes sao
   comparaveis entre si e altura igual ajuda a comparar.
   -------------------------------------------------------------------------- */
.grade-2 { align-items: start; }


/* --------------------------------------------------------------------------
   DA.13 TEXTO CRU QUE VAZAVA PARA A TELA

   /lotes mostrava "provisionamento" na coluna Tipo: a palavra do banco, em
   minuscula, no meio de uma tabela em que todo o resto tem inicial
   maiuscula. Uma palavra so, mas e o tipo de detalhe que separa produto de
   ferramenta interna.

   Resolvido no template com a macro `nome_tipo_lote` (pecas.html). Aqui
   fica so a forma: a coluna e uma classificacao, nao um titulo, entao ela
   e um rotulo discreto e nao concorre com a descricao ao lado.
   -------------------------------------------------------------------------- */
.tabela .classificacao {
  color: var(--texto-2);
  white-space: nowrap;
}


/* --------------------------------------------------------------------------
   DA.14 VERMELHO CHEIO SO NA CONFIRMACAO

   O unico .bt-perigo do sistema e o "Interromper" da tela do lote, e ele
   era um retangulo VERMELHO CHEIO, o primeiro botao do cabecalho. Numa tela
   cujo trabalho e dizer "esta rodando, pode fechar", o objeto mais forte da
   pagina era "pare".

   E interromper nem e o passo perigoso: o lote volta de onde parou, e o
   "Reprocessar as N falhas" ao lado desfaz o estrago. Vermelho cheio ali
   gasta o vermelho, do mesmo jeito que o ambar do painel gastava o ambar.

   A regra que fica: vermelho CONTORNADO no botao que abre a acao, vermelho
   CHEIO so no botao que confirma dentro do modal — o clique do qual nao se
   volta. Contraste medido: #9e1a2b sobre branco da 8,1:1; no escuro,
   #f87788 sobre o cartao da 6,7:1. Os dois passam com folga no AA.
   -------------------------------------------------------------------------- */
.bt-perigo {
  background: transparent;
  color: var(--erro-txt);
  border-color: var(--erro-borda);
  box-shadow: var(--sombra1);
}
.bt-perigo:hover:not([disabled]) {
  filter: none;
  background: var(--erro-fundo);
  border-color: var(--erro-solido);
  box-shadow: var(--sombra2);
}
.bt-perigo:focus-visible { outline-color: var(--erro-solido); }

/* Dentro do modal ele volta a ser cheio: ali o botao E o ponto sem volta. */
.bt-perigo[data-carregando="true"]::after { border-color: currentColor; border-top-color: transparent; }


/* --------------------------------------------------------------------------
   DA.15 A FILA DE NUMEROS: TRES GRAMATICAS VIRAM UMA

   A "fila de numeros" — aquela linha de cartoes com rotulo pequeno em cima,
   numero grande no meio e nota embaixo — aparece em cinco telas, e estava
   desenhada de tres jeitos:

     painel               .painel-numeros     folga 28, coluna min 216,
                                              rotulo com duas linhas
                                              reservadas, numero fluido de
                                              34 a 52px, nota separada por
                                              um fio
     consultas            .grade .grade-auto  folga 24, coluna min 250,
     empresas                                 numero fixo em 40px, nota
     diagnostico                              colada no numero, sem fio
     simulacao            .grade-auto +       igual a de cima, mais o
                          .simulacao-numeros  alinhamento das notas no pe

   Efeito pratico em /consultas: dois cartoes de 600px de largura para
   mostrar o algarismo "2". Cartao de numero grande demais nao impressiona,
   so deixa o numero perdido no meio de um campo branco. E em /empresas e
   /diagnostico a mesma fila do painel tinha outro respiro e outra escala.

   A do painel e a mais trabalhada das tres (foi medida cartao a cartao numa
   rodada anterior, e a de simulacao tinha chegado sozinha na mesma solucao
   de nota com fio). Entao ela vira a do sistema, e a .grade-auto passa a
   seguir a mesma regra.

   A .simulacao-numeros fica de fora do ajuste de ESCALA de proposito: as
   notas dela estao alinhadas numa medida conferida (as seis comecam no
   mesmo pixel), e mexer no espaco entre numero e nota desmancharia isso.
   Ela ja tem a mesma folga e o mesmo fio; o que sobra de diferente e so o
   tamanho do numero.
   -------------------------------------------------------------------------- */
/* A LARGURA DE COLUNA nao vale para a simulacao, e o motivo e aritmetica.

   `auto-fit` some com as colunas vazias, entao trocar 250px por 216px so
   muda alguma coisa quando ha cartoes o bastante para encher a fila. Com
   dois (consultas) ou tres (empresas, diagnostico) o resultado e o mesmo de
   antes. Com SEIS, que e o caso da simulacao, nao e: a 1225px cabem 5
   colunas de 216 contra 4 de 250, e a fila de seis passaria de 4 + 2 para
   5 + 1 — um cartao orfao na segunda linha. A fila da simulacao foi medida
   cartao a cartao numa rodada anterior; nao e minha para reflow.        */
.grade-auto:not(.simulacao-numeros) {
  grid-template-columns: repeat(auto-fit, minmax(216px, 1fr));
}
.grade-auto { gap: var(--e6); }
.grade-auto > .num-cartao {
  gap: 0;
  padding: var(--e7);
  justify-content: flex-start;
}
.grade-auto > .num-cartao .rotulo {
  display: block;
  line-height: 1.4;
  /* Duas linhas reservadas: sem isso, um rotulo de uma linha e outro de
     duas deixam os numeros vizinhos em alturas diferentes, e a fila deixa
     de ser comparavel de relance — que e a unica coisa que ela faz.     */
  min-height: calc(2 * 1.4 * var(--t-xs));
  margin-bottom: var(--e3);
}
.grade-auto > .num-cartao .nota {
  padding-top: var(--e3);
  border-top: 1px solid var(--borda);
  color: var(--texto-3);
  line-height: var(--lh-densa);
}
.grade-auto:not(.simulacao-numeros) > .num-cartao .valor {
  font-size: clamp(2.125rem, 1.35rem + 2.4vw, 3.25rem);
  margin-bottom: var(--e3);
}
/* .em-reais e .compacto sao a MESMA ideia com dois nomes: "este valor tem
   caracteres demais para o tamanho cheio". O painel usava um, /empresas
   usava o outro, e por isso "R$ 34,50" saia em 36px numa tela e em 30px na
   outra. Agora as duas grafias levam ao mesmo tamanho — quem escrever
   qualquer uma das duas acerta.                                          */
.grade-auto:not(.simulacao-numeros) > .num-cartao .valor.em-reais,
.grade-auto:not(.simulacao-numeros) > .num-cartao .valor.compacto,
.painel-numeros .num-cartao .valor.compacto {
  font-size: clamp(1.625rem, 1.1rem + 1.5vw, 2.25rem);
  white-space: nowrap;
}
/* Palavra no lugar do numero (/diagnostico: "Produção", "Simulado"). Nao
   cabe na escala de um algarismo — ela tem oito vezes mais caracteres.   */
.grade-auto > .num-cartao .valor.palavra { font-size: var(--t-2xl); white-space: normal; }
@media (max-width: 860px) {
  .grade-auto { gap: var(--e5); }
  .grade-auto > .num-cartao { padding: var(--e6); }
  /* Sozinho na linha, o cartao nao tem vizinho com quem alinhar: reservar
     duas linhas de rotulo so abriria um buraco.                          */
  .grade-auto > .num-cartao .rotulo { min-height: 0; }
}


/* --------------------------------------------------------------------------
   DA.16 O CANTO DIREITO DA BARRA DE TOPO

   Quem empurrava os botoes de canto para a direita era o grupo de selos, que
   tinha .linha-fim (margin-left: auto). Com os selos fora da barra (DA.1),
   o botao de tema passou a flutuar colado no nome da tela, no meio da faixa,
   e o canto direito ficou vazio. Controle de canto mora no canto.
   -------------------------------------------------------------------------- */
.topo-botoes { margin-left: auto; }

/* Lista de dependentes na ficha: nome à esquerda, ação à direita, sem tabela.
   São duas ou três linhas na prática, e uma tabela para isso traz cabeçalho,
   zebra e rolagem que não servem a nada. */
.lista-limpa { list-style: none; margin: 0; padding: 0; }
.linha-entre {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 0;
  border-bottom: 1px solid var(--n200);
}
.linha-entre:last-child { border-bottom: 0; }


/* CONFIRMACAO EMBUTIDA (macro `pecas.confirmar`).
   O `summary` faz o papel do botao: sem o triangulo do navegador, que num
   botao de acao le como "expandir uma lista" em vez de "vou apertar isto". */
.confirma > summary { list-style: none; cursor: pointer; }
.confirma > summary::-webkit-details-marker { display: none; }
.confirma > summary::marker { content: ""; }

/* A CONFIRMACAO GANHA A PROPRIA LINHA QUANDO ABRE.
   Na ficha do beneficiario ela mora dentro de um `li.linha-entre`, que e
   flex e NAO quebra linha. Aberta, a caixa disputava a largura com o nome
   do dependente, e num celular de 320px empurrava a PAGINA INTEIRA para
   362px — rolagem horizontal de verdade, na tela mais estreita que existe,
   sem nenhum container que rolasse: a pessoa arrastava a pagina de lado.
   Medido: caixa terminando em 438px numa janela de 320px.
   Espremer a caixa foi a primeira tentativa e piorou (passou a estourar
   ate em 1440). O certo e deixar a LINHA quebrar: o nome em cima, a
   confirmacao inteira embaixo. */
.linha-entre:has(> .confirma) { flex-wrap: wrap; }
.linha-entre > .confirma { min-width: 0; }
.linha-entre > .confirma[open] { flex-basis: 100%; }
.confirma-corpo {
  margin-top: var(--e2);
  padding: var(--e3);
  border: 1px solid var(--borda);
  border-radius: var(--r2);
  background: var(--fundo-elevado);
  min-width: 15rem;

  /* A FRASE PRECISA QUEBRAR, E A CAIXA PRECISA DE TETO.
     A coluna de acoes e `.apertado`, que tem `white-space: nowrap` para os
     botoes nao quebrarem no meio (linha 1275). A confirmacao nasceu dentro
     dela e HERDOU o nowrap — so que aqui dentro nao ha botao, ha uma FRASE
     inteira explicando o que vai acontecer. Sem quebrar, ela virava uma
     linha unica de 797px, empurrava a celula para 855px e a tabela para
     1523px numa janela de 1440: quem clicava em "Tirar acesso" via a
     confirmacao abrir FORA da area visivel, e so a encontrava se soubesse
     arrastar a tabela de lado.
     Medido no navegador, nao deduzido. O `max-width` e o teto que impede a
     frase de crescer de novo por outro caminho. */
  white-space: normal;
  max-width: 22rem;
}
.confirma-corpo > * + * { margin-top: var(--e2); }

/* O BOTAO DE CONFIRMAR NAO E UM BOTAO DE LINHA DE TABELA.
   A regra `.tabela-limpa td.apertado .bt` (secao do computador) da
   `margin-block: -6px` para o botao de acao caber na altura apertada da
   linha. Ela e mais especifica que a minha, entao o botao "Sim, tirar o
   acesso" — que mora DENTRO da confirmacao, e nao na linha — subia 6px e
   passava POR CIMA da ultima linha da frase. Medido: o paragrafo terminava
   em 548px e o botao comecava em 544px.
   Aqui ele volta a ser um botao normal, com o respiro que a peca desenhou. */
.confirma-corpo .bt {
  margin-block: 0;
  min-height: 36px;
}
