/* Estilos anteriores ao redesenho noturno. Os blocos saem daqui a medida
   que cada tela e refeita nos arquivos novos desta pasta. */
/* A CASCA ADIANTADA.

   O cedo.js marca o <html> ainda no <head>, e o #app aparece na primeira
   pintura sem esperar o servidor. O !important nao e preguica: o #app nasce
   com display:none no ATRIBUTO style, e um atributo so perde para uma regra
   marcada assim. Quando /api/inicio responde, o app.js poe o proprio valor no
   atributo e tira a classe, nessa ordem — dai em diante quem manda e ele.

   Fica aqui em cima, fora de qualquer @media: vale para toda tela. */
html.casca-adiantada #app{display:flex !important}

  /* Bolha do MENTRE enquanto a traducao da conversa esta a caminho. */
  .bolha.traduzindo{opacity:.55;transition:opacity .2s}
  /* MENTRE e SEMPRE escuro — sem seletor de tema, sem variavel condicional. */
  :root{
    --bg:#0b1117; --panel:#111a22; --input:#17232d; --border:#2a3b48;
    --gold:#b08d57; --gold-soft:#d1ab74; --text:#ece7da; --dim:#8a9690;
    --bubble-user:#1b2731; --success:#5f9873;
    /* Superficies em degraus de luz: fundo, cartao, controle, controle ativo.
       --linha e o fio que separa DENTRO de uma superficie (grade, tabela,
       lista); --border fica para contorno de campo e de botao. */
    --sup-1:#101920; --sup-2:#16212a; --sup-3:#1d2a35;
    --linha:#1d2a34; --txt-2:#b3bab4;
    --ouro-tinta:rgba(176,141,87,.14);
    --raio:12px; --raio-ctl:10px;
    /* Financas: series validadas no fundo escuro (entradas 4,8:1, saidas 4,5:1),
       estados reservados (atencao, critico) e a linha de grade recessiva. */
    --fin-s1:#3987e5; --fin-s2:#d95926; --fin-atencao:#fab219; --fin-critico:#e0524f;
    --fin-grade:#1f2c36;
    --rule:rgba(176,141,87,.07);
  }
  *{box-sizing:border-box}
  /* Controles de formulario NAO herdam fonte por padrao — o navegador impoe a
     dele (Arial, no Chrome). Sem esta linha, o campo do chat, os botoes da
     barra, os seletores das Configuracoes e o campo de reclamacao renderizavam
     todos em Arial enquanto o resto do app estava em Onest.
     Alem de destoar, custava LARGURA: Arial e mais larga que 'Geist', e foi por
     isso que "Escreva para o MENTRE" aparecia cortado no celular de um beta
     tester mesmo depois de o texto ja ter sido encurtado. */
  button,input,select,textarea{font-family:inherit}

  body{margin:0;background:var(--bg);color:var(--text);font-family:'Geist',system-ui,sans-serif;
       height:100vh;display:flex;flex-direction:column;overflow:hidden;
       background-image:repeating-linear-gradient(to bottom,transparent 0,transparent 27px,var(--rule) 28px);
       transition:background-color .2s,color .2s}

  #btnLateral{background:transparent;border:1px solid transparent;color:var(--dim);
    font-size:1.1rem;padding:6px 10px;border-radius:8px;cursor:pointer;margin-right:2px}
  #btnLateral:hover{color:var(--gold);background:var(--input);border-color:var(--border)}
  #btnLateral.ativo{color:var(--gold);border-color:var(--border);background:var(--input)}
  /* Cabecalho compacto. Ele consumia perto de 20% da altura util antes de a
     conversa comecar — num celular isso e uma tela inteira de mensagens
     perdida por dia. Logo menor, titulo menor, menos padding. */
  header{background:var(--bg);border-bottom:1px solid var(--linha);
         padding:10px 20px;display:flex;align-items:center;gap:12px;
         flex-shrink:0}
  /* NAO existe mais "esconder ao rolar".

     A ideia era ganhar altura de conversa, e o comentario antigo aqui dizia
     que nao havia reflow porque a casca e fixa. Estava errado: <header> e item
     de um flex column e <main> e o flex:1 dele. Puxar o cabecalho com
     margin-top negativa faz o <main> CRESCER os mesmos 64px — e crescer um
     container ja rolado desloca o conteudo debaixo do dedo. No celular isso
     aparecia como a tela "tremendo"/saltando para cima a cada mudanca de
     direcao do scroll, e ao voltar o cabecalho o navegador grampeava o
     scrollTop e comia a ultima mensagem.

     Alem disso o pedido explicito era cabecalho e rodape ESTRITAMENTE fixos.
     O cabecalho agora e uma linha so de 44px no celular (icones no lugar dos
     rotulos), entao a altura que isso economizava deixou de fazer falta. */
  html.sem-animacao header{transition:none}

  /* --- Bussola: TAMANHO ESTRITO, so a agulha gira ---------------------
     O tamanho mora SO aqui. width/height escritos no proprio elemento SVG sao
     presentation attributes: perdem para qualquer regra CSS. */
  /* --logo: o anel de uso se dimensiona por ela, entao logo e anel nunca
     saem de sincronia quando um dos dois muda. */
  :root{--logo:50px}
  svg.logo-mentre       {width:var(--logo); height:var(--logo)}
  svg.mini-bussola      {width:28px;  height:28px}
  svg.bussola-carregando{width:56px;  height:56px}
  svg.logo-login        {width:124px; height:124px}
  .logo-mentre,.mini-bussola,.bussola-carregando{display:block;flex:0 0 auto}

  /* A ROSA fica sempre parada. So a AGULHA gira, como num relogio.
     Por padrao NAO existe animacao declarada; ela nasce no hover. Menos
     estados, menos jeito de quebrar. */
  .compass-rose,.compass-rosa{transform-origin:200px 200px}
  /* fill-box + center: as quatro pontas da agulha sao simetricas em torno de
     (32,32), entao o centro da caixa E o centro da bussola. Antes o grupo
     .compass-needle continha dois pedacos da PROPRIA rosa, sem atributo fill
     — herdavam preto e sumiam no fundo escuro. A agulha girava; ninguem via. */
  /* A agulha nova e ASSIMETRICA (155px de ponta longa contra 77,5 da curta),
     entao a caixa dela tem centro em (200,161) e nao em (200,200). Com
     transform-box:fill-box + center o eixo caía nesse 161 e ela girava torta,
     descrevendo um circulo em vez de rodar no lugar. O eixo agora e escrito
     em coordenadas do viewBox, que e onde ele de fato esta. */
  .compass-needle{transform-origin:200px 200px;will-change:transform}
  @keyframes sia-girar{from{transform:rotate(0deg)} to{transform:rotate(360deg)}}

  /* Cabecalho: parada em repouso, gira enquanto o mouse estiver em cima.
     A classe .girando vem do JS (mouseenter/mouseleave + toque), entao
     funciona tambem onde :hover nao existe, como no celular. */
  .marca-header:hover  .logo-mentre .compass-needle,
  .marca-header:focus-within .logo-mentre .compass-needle,
  .marca-header.girando .logo-mentre .compass-needle{
    animation:sia-girar 4s linear infinite}

  /* Carregando: a MESMA agulha, so que apressada. Ligado por classList. */
  .is-thinking .compass-needle,
  .loading-active .compass-needle,
  svg.is-thinking .compass-needle{animation:sia-girar 1.6s linear infinite}

  /* Nada alem da agulha se mexe: nem escala no SVG, nem a rosa. */
  .logo-mentre:hover,.logo-mentre:hover .compass-rose,.logo-mentre:hover .compass-rosa,
  svg.is-thinking,svg.is-thinking .compass-rose,svg.is-thinking .compass-rosa{transform:none}
      /* O giro do hover ele PEDE, entao continua — so mais devagar. O que some
       e o movimento automatico, que ninguem escolheu ver. */
html.sem-animacao .marca-header:hover .logo-mentre .compass-needle,html.sem-animacao .marca-header.girando .logo-mentre .compass-needle{animation-duration:12s}
html.sem-animacao .is-thinking .compass-needle,html.sem-animacao .loading-active .compass-needle,html.sem-animacao svg.is-thinking .compass-needle{animation:none}
html.sem-animacao svg.is-thinking{animation:sia-pulsa 1.8s ease-in-out infinite}

  /* ---- Bloco da marca ----
     Altura automatica, de proposito: o wordmark cresceu (hierarquia) e
     os subtextos encolheram (easter egg), entao travar em 64px so ia
     voltar a quebrar na proxima vez que um dos tres mudar de tamanho.
     align-items:center no pai centraliza sozinho, sem numero magico. */
  .marca-header{display:flex;align-items:center;gap:16px;cursor:default;position:relative}

  /* --- ANEL DE USO -----------------------------------------------------
     Fica ATRAS da bussola, na mesma caixa: a bussola e desenhada por cima e o
     anel aparece so na borda. O botao e transparente e do tamanho exato do
     logo, entao o alvo de toque e a propria bussola — sem nenhum elemento
     novo competindo por espaco no cabecalho.

     O arco usa stroke-dasharray/offset com pathLength implicito de 2*PI*r:
     preencher e so mudar o offset, o que anima sozinho pela transicao. */
  .anel-uso{position:absolute;left:0;top:50%;transform:translateY(-50%);
            width:var(--logo,40px);height:var(--logo,40px);
            padding:0;margin:0;border:0;background:none;cursor:pointer;
            z-index:1}
  .anel-svg{width:100%;height:100%;display:block;transform:rotate(-90deg)}
  .anel-trilho{fill:none;stroke:var(--border);stroke-width:2}
  .anel-arco{fill:none;stroke:var(--gold);stroke-width:2.5;stroke-linecap:round;
             /* 2*PI*22 = 138.23 */
             stroke-dasharray:138.23;stroke-dashoffset:138.23;
             transition:stroke-dashoffset .6s cubic-bezier(.2,.8,.2,1),stroke .3s}
  /* Cor conta a historia sem texto: dourado normal, ambar avisando, terracota
     no fim. Nada de vermelho puro — o app nao esta com erro, so cheio. */
  /* A cor do arco vem do JS (corDoUso), interpolada — nao ha regra de faixa
     aqui de proposito: ela sobrescreveria o inline e voltaria aos degraus. */
  /* Modo Pro no botao: mesma linguagem do resto, so mais quente. Nao usa
     vermelho — nao e alerta, e um modo mais caro que a pessoa escolheu. */
  #btnModoRaciocinio.modo-pro .ic{color:#E0A63C}
  #btnModoRaciocinio.modo-pro #rotuloModo{color:#E0A63C;font-weight:600}

  .anel-uso:hover .anel-arco{filter:brightness(1.25)}
  .anel-uso:focus-visible{outline:2px solid var(--gold);outline-offset:3px;border-radius:50%}
  html.sem-animacao .anel-arco{transition:none}

  /* Painel de uso: o mesmo vocabulario dos outros popovers do app. */
  .uso-cx{position:absolute;top:calc(100% + 10px);left:0;z-index:200;
          width:min(300px,86vw);padding:16px 18px;
          background:var(--panel);border:1px solid var(--border);border-radius:16px;
          box-shadow:0 14px 40px rgba(0,0,0,.5)}
  .uso-cx[hidden]{display:none}
  .uso-titulo{font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;
              color:var(--dim);margin:0 0 12px}

  /* `block`: o numero grande e a linha de creditos sao duas informacoes de
     pesos diferentes e ficavam coladas na mesma linha, disputando a leitura.
     Empilhadas, o olho pega o percentual primeiro e o detalhe depois. */
  .uso-num small{display:block;font-size:.78rem;font-weight:400;color:var(--dim);
                 margin:7px 0 0;letter-spacing:.01em}
  /* Duas medidas empilhadas: hoje e a semana. A do dia vem primeiro porque e
     a que muda agora — a semana e contexto, o dia e a decisao. */
  /* --- CONVITE DE NOTIFICACAO ---------------------------------------
     Cartao no proprio chat, nao modal: um modal na primeira tela e uma porta
     fechada antes de a pessoa ver o que o app faz. Aqui ela le, entende o
     porque, e decide — com o resto do app visivel atras. */
  .convite-push{border:1px solid color-mix(in srgb, var(--gold) 45%, transparent);
                background:color-mix(in srgb, var(--gold) 8%, var(--panel));
                border-radius:18px;padding:16px 18px;margin:14px 0 18px;
                animation:surge .3s cubic-bezier(.2,.8,.2,1)}
  .convite-topo{display:flex;align-items:center;gap:9px;margin:0 0 8px}
  .convite-topo .ic{width:18px;height:18px;color:var(--gold)}
  .convite-topo h4{margin:0;font-size:.95rem;color:var(--text);font-weight:600}
  .convite-push p{margin:0;font-size:.88rem;line-height:1.55;color:var(--dim)}
  .convite-acoes{display:flex;gap:10px;margin:14px 0 0;flex-wrap:wrap}
  .convite-sim{flex:1 1 auto;min-height:44px;padding:0 18px;border:0;
               border-radius:999px;background:var(--gold);color:var(--bg);
               font-family:inherit;font-size:.88rem;font-weight:600;cursor:pointer;
               transition:transform .12s,filter .16s}
  .convite-sim:hover{filter:brightness(1.08)}
  .convite-sim:active{transform:scale(.97)}
  .convite-nao{min-height:44px;padding:0 16px;border:1px solid var(--border);
               border-radius:999px;background:transparent;color:var(--dim);
               font-family:inherit;font-size:.85rem;cursor:pointer}
  .convite-nao:hover{color:var(--text);border-color:var(--gold-soft)}
  .convite-push small{display:block;margin:10px 0 0;font-size:.76rem;color:var(--dim)}
  .convite-push.ok{border-color:var(--success);
                   background:color-mix(in srgb, var(--success) 10%, var(--panel))}

  .uso-medida{margin:0 0 14px}
  .uso-rot{display:flex;justify-content:space-between;align-items:baseline;
           font-size:.78rem;color:var(--dim);margin:0 0 6px}
  .uso-rot b{color:var(--text);font-weight:600;font-size:.95rem;
             font-variant-numeric:tabular-nums}
  .uso-barra{height:6px;border-radius:3px;background:var(--input);overflow:hidden}
  .uso-barra i{display:block;height:100%;background:var(--gold);border-radius:3px;
               transition:width .6s cubic-bezier(.2,.8,.2,1)}
  .uso-cx[data-faixa="atencao"] .uso-barra i{background:#E0A63C}
  .uso-cx[data-faixa="critico"] .uso-barra i{background:#C2603C}
  .uso-linha{display:flex;justify-content:space-between;gap:12px;
             font-size:.8rem;color:var(--dim);padding:7px 0;
             border-top:1px solid var(--border)}
  .uso-linha b{color:var(--text);font-weight:500;font-variant-numeric:tabular-nums}
  .uso-nota{font-size:.72rem;color:var(--dim);line-height:1.5;margin:10px 0 0}
  .marca-texto{display:flex;flex-direction:column;justify-content:center;
               gap:3px;min-width:0}

  .logo-mentre{opacity:.97;width:40px;height:40px;
            filter:drop-shadow(0 0 11px color-mix(in srgb, var(--gold) 48%, transparent))}
  @keyframes sia-pulsa{50%{opacity:.55}}
  .logo-login{filter:drop-shadow(0 0 26px color-mix(in srgb, var(--gold) 35%, transparent));
              animation:flutua 6s ease-in-out infinite}
  .logo-login .compass-needle{animation:sia-girar 14s linear infinite}
  @keyframes flutua{50%{transform:translateY(-6px)}}

  /* --- Tela de carregamento do historico --- */
  #carregandoConversa{display:none;flex-direction:column;align-items:center;
    justify-content:center;gap:14px;padding:70px 0;color:var(--dim);
    font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.75rem;letter-spacing:1px}
  #carregandoConversa.ativo{display:flex}
  #dialogo:not(.visivel) ~ #carregandoConversa{display:none}
  #lateral.ocupado{pointer-events:none;opacity:.55}

  .eyebrow{font-family:'Geist',system-ui,sans-serif;font-size:.5rem;letter-spacing:.04em;
           line-height:1;height:auto;font-weight:500;color:var(--gold-soft);opacity:.55;
           white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
           /* Easter egg discreto: existe pra quem reparar, nao pra competir
              com o nome MENTRE. */
           margin-right:-1px}

  /* "MENTRE" em ouro escovado. DUAS camadas de fundo, as duas recortadas no
     texto: embaixo o ouro fixo, em cima uma faixa de luz estreita que
     atravessa. Antes o proprio degrade de ouro era deslocado de -180% a 180%
     em 1,5s — o texto INTEIRO trocava de tom de uma vez, e era isso que lia
     como pisca-pisca. Agora o ouro nao se move: so a luz corre por cima. */
  h1{font-family:'Instrument Serif',Georgia,serif;font-weight:400;
     font-size:1.75rem;line-height:1;height:auto;margin:0;padding:0;
     letter-spacing:.15em;display:block;white-space:nowrap;
     /* Cancela a sobra que o letter-spacing deixa depois da ultima letra. */
     margin-right:-.15em;
     /* "MENTRE" e caixa-alta e nao tem descendentes; o baseline do
        Instrument Serif nessa escala pede so 1px de ajuste (era 2px
        numa fonte menor). */
     transform:translateY(1px);
     background-image:
       linear-gradient(102deg, transparent 38%,
                       rgba(255,246,222,.92) 50%, transparent 62%),
       linear-gradient(103deg,
         #6b5320 0%, var(--gold) 18%, #f6e4b4 38%, var(--gold-soft) 52%,
         #8d7034 70%, var(--gold-soft) 86%, #5d4718 100%);
     background-size:280% 100%, 100% 100%;
     background-position:-190% 0, 0 0;
     background-repeat:no-repeat;
     -webkit-background-clip:text;background-clip:text;color:transparent;
     -webkit-text-fill-color:transparent;
     filter:drop-shadow(0 1px 0 rgba(0,0,0,.45))}
  /* 7 segundos, aceleracao simetrica: a luz entra devagar, atravessa e sai.
     Como so a camada de brilho se move, ela comeca e termina FORA do texto —
     nao ha salto ao acabar nem ao tirar o mouse. */
  .marca-header:hover h1{animation:sia-lustro 7s cubic-bezier(.42,0,.32,1) infinite}
  @keyframes sia-lustro{
    0%   {background-position:-190% 0, 0 0}
    62%  {background-position: 290% 0, 0 0}
    100% {background-position: 290% 0, 0 0}   /* respiro antes de repetir */
  }
  html.sem-animacao .marca-header:hover h1{animation:none}

  .sessao{font-size:.72rem;line-height:1.4;color:var(--dim);opacity:.85;
          padding:0 4px 12px;margin-bottom:10px;
          border-bottom:1px solid var(--border);flex-wrap:wrap;
          display:flex;align-items:center;gap:5px;white-space:nowrap}
  nav{margin-left:auto;display:flex;gap:2px;align-items:center;padding:4px;
      background:var(--sup-1);border:1px solid var(--linha);border-radius:999px}
  /* O botao de aba e icone + rotulo. No desktop os dois aparecem; no celular
     o rotulo sai e sobra o icone (ve a media query de 700px). */
  nav button{display:inline-flex;align-items:center;gap:7px}
  nav button .ic{width:17px;height:17px;flex:0 0 auto}
  /* Pilulas: raio alto ecoa o rx:80 dos cantos do simbolo. */
  /* Abas discretas: so a ATIVA tem fundo. Antes as tres tinham caixa e
     borda, e a linha inteira competia com a conversa — quatro retangulos
     desenhados para indicar UMA escolha. Inativa agora e texto cinza. */
  nav button{transition:background .16s,color .16s,box-shadow .16s;
             background:transparent;color:var(--dim);border:none;
             border-radius:999px;font-family:'Geist',system-ui,sans-serif;
             font-size:.86rem;font-weight:500;letter-spacing:.01em;
             padding:8px 16px;cursor:pointer}
  nav button:hover{color:var(--text)}
  /* A aba ativa e um degrau de luz com fio dourado, e nao uma pilula de ouro
     macico: o ouro cheio gritava mais que o conteudo da propria aba e brigava
     com o botao de enviar, que e a acao dourada da tela. */
  nav button.ativo{background:var(--sup-3);color:var(--text);font-weight:600;
                   box-shadow:inset 0 0 0 1px rgba(209,171,116,.24)}
  nav button.ativo .ic{color:var(--gold-soft)}
  nav button:focus-visible{outline:2px solid var(--gold-soft);outline-offset:1px}

  .corpo{flex:1;display:flex;min-height:0}
  main{flex:1;overflow-y:auto;padding:28px 32px 24px}
  /* Ocupa a tela inteira. A assimetria vem do RITMO interno (recuos, pesos),
     nao de espremer o conteudo numa coluna. */
  .aba{display:none;width:100%;margin:0}
  .aba.visivel{display:block;animation:abaEntra .2s ease-out}
  @keyframes abaEntra{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
  html.sem-animacao .aba.visivel{animation:none}
  /* Coluna de leitura. Solta na tela inteira, uma resposta no desktop corria
     1.100px por linha — o dobro do que o olho acompanha sem se perder na
     volta. 760px dao ~85 caracteres; a barra de digitacao usa a mesma
     largura, entao pergunta e resposta ficam no mesmo eixo. Agenda e Financas
     sao paineis de consulta: ganham mais largura, mas com teto. */
  #dialogo{width:100%;max-width:760px;margin:0 auto}
  #agenda,#financas,#documentos{max-width:1200px;margin:0 auto}

  /* --- barra lateral de conversas --- */
  /* Fechada, a lateral tinha 0px de largura mas mantinha a borda de 1px: era
     a linha vertical solta na borda esquerda de todas as telas. Borda
     transparente nao resolve — ela ainda ocupa 1px e o fundo do aside aparece
     por baixo. A borda so existe com a lateral aberta. */
  #lateral{width:0;overflow:hidden;background:var(--sup-1);
           border-right:0 solid var(--linha);transition:width .22s ease;flex-shrink:0}
  #lateral.aberta{width:264px;border-right-width:1px}
  #lateral .cx{padding:14px 12px 12px;width:264px;display:flex;flex-direction:column}
  /* A lista de conversas rola DENTRO da lateral. O aside tem overflow:hidden
     (e o que faz a animacao de largura), e o .cx crescia alem da tela sem ter
     onde rolar: da decima conversa para baixo, nao havia como chegar. contain:
     bater no fim da lista nao arrasta o chat que esta atras. */
  #lateral .cx{height:100%;box-sizing:border-box;overflow-y:auto;
               overscroll-behavior:contain;touch-action:pan-y}
  #btnConfigLateral,#btnDocsLateral{display:flex;align-items:center;gap:10px;width:100%;
    background:transparent;border:none;border-radius:9px;padding:9px 10px;
    color:var(--txt-2);cursor:pointer;font-family:inherit;font-size:.86rem;
    margin-bottom:2px;transition:background .14s,color .14s}
  #btnConfigLateral:hover,#btnDocsLateral:hover{background:var(--sup-2);color:var(--text)}
  #btnConfigLateral .ic,#btnDocsLateral .ic{width:17px;height:17px;flex-shrink:0;color:var(--dim)}

  /* Solido, e nao tracejado: borda pontilhada le como "area vazia, solte algo
     aqui", e nao como o botao principal do menu. */
  #btnNovaConversa{width:100%;display:flex;align-items:center;gap:8px;text-align:left;
    background:var(--sup-2);color:var(--text);border:1px solid var(--linha);border-radius:10px;
    padding:10px 12px;cursor:pointer;font-family:inherit;font-size:.86rem;font-weight:500;
    margin-bottom:12px;transition:border-color .16s,background .16s}
  #btnNovaConversa:hover{border-color:rgba(209,171,116,.45);background:var(--sup-3)}
  #lateral h4{font-family:'Geist',system-ui,sans-serif;font-size:.74rem;font-weight:600;letter-spacing:.01em;
              color:var(--dim);margin:18px 0 6px 10px}
  .conv{position:relative;padding:9px 28px 9px 10px;border-radius:9px;cursor:pointer;
        font-size:.8rem;color:var(--dim);margin-bottom:1px;transition:background .14s}
  .conv:hover{background:var(--sup-2);color:var(--text)}
  .conv.atual{background:var(--sup-3);color:var(--text)}
  .conv b{display:block;color:var(--text);font-size:.84rem;font-weight:500;
          overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .conv small{font-size:.72rem;color:var(--dim)}
  /* Quem esta logado desce para o pe do menu, como em todo app com conta: e
     informacao de referencia, nao a primeira coisa a ler ao abrir o menu. */
  #lateral .sessao{order:9;margin:auto 0 0;padding:14px 10px 2px;border-top:1px solid var(--linha);
                   border-bottom:0;font-size:.8rem;color:var(--txt-2);opacity:1}
  #lateral .sessao b{font-weight:500}
  #lblSessao{display:none}
  #listaConversas{margin-bottom:16px}
  .conv .x{position:absolute;right:6px;top:50%;transform:translateY(-50%);
           opacity:0;background:transparent;border:none;color:var(--dim);
           cursor:pointer;font-size:.85rem;line-height:1;padding:3px 5px;
           border-radius:5px;transition:opacity .14s,color .14s}
  .conv:hover .x{opacity:1}
  .conv .x:hover{color:#e5686d;background:var(--bg)}

  /* --- calendario: headers de mes --- */
  .mes-divisor{display:flex;align-items:baseline;gap:12px;margin:24px 0 10px;
               cursor:pointer;user-select:none}
  .mes-divisor:hover h3{color:var(--gold)}
  .mes-divisor .seta{color:var(--dim);font-size:.7rem;transition:transform .18s}
  .mes-divisor.fechado .seta{transform:rotate(-90deg)}
  .grupo-itens{overflow:hidden;transition:max-height .25s ease, opacity .2s}
  .grupo-itens.fechado{max-height:0!important;opacity:0}
  .mes-divisor h3{font-family:'Geist',system-ui,sans-serif;font-style:normal;font-weight:600;font-size:.88rem;
                  color:var(--txt-2);margin:0}
  .mes-divisor .linha-fina{flex:1;height:1px;background:var(--linha)}
  .mes-divisor small{font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.62rem;
                     letter-spacing:.01em;color:var(--dim)}

  /* 10px entre falas do mesmo lado, 22px quando o remetente muda: o olho
     agrupa o que e do mesmo interlocutor e separa a troca de turno. */
  .linha{display:flex;margin-bottom:10px}
  .linha + .linha.trocou{margin-top:12px}
  @keyframes surge{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
  .bolha code{background:var(--input);padding:1px 5px;border-radius:4px;
              font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.85em}
  .bolha pre{background:var(--input);padding:10px 12px;border-radius:8px;
             overflow-x:auto;font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.82em;margin:6px 0}
  .bolha strong{color:var(--gold-soft);font-weight:600}
  /* Item de lista com recuo pendurado: a segunda linha de um item longo
     alinha com o texto, e nao embaixo do marcador. */
  .bolha .item{display:grid;grid-template-columns:1.3em minmax(0,1fr);margin:3px 0}
  .bolha .item > .m{color:var(--gold-soft);font-variant-numeric:tabular-nums}
  .bolha .par{display:block;height:.7em}
  /* Estado de retomada: o servidor detectou que a resposta era uma promessa
     vazia, apagou o que estava escrito e mandou o MENTRE executar de verdade.
     Enquanto isso, a bolha mostra a legenda do passo atual em vez de texto. */
  .bolha .retomando{display:block;opacity:.55;font-style:italic;font-size:.9em;
                    animation:pulsando 1.5s ease-in-out infinite}
  @keyframes pulsando{0%,100%{opacity:.38}50%{opacity:.72}}
  /* Link dentro da resposta. Antes o markdown [nome](url) aparecia cru na
     tela e a URL solta era texto morto: um roteiro cheio de "reserve aqui"
     sem nada clicavel. */
  .bolha a{color:var(--gold-soft);text-decoration:none;
           border-bottom:1px solid rgba(176,141,87,.42);
           transition:border-color .18s ease,color .18s ease;
           word-break:break-word}
  .bolha a:hover{color:var(--gold);border-bottom-color:var(--gold)}
  .bolha{animation:surge .26s cubic-bezier(.2,.8,.2,1);
         letter-spacing:.1px;line-height:1.62;
         font-size:.95rem;white-space:pre-wrap;word-wrap:break-word}

  /* ------------------------------------------------------------------
     DOIS PESOS, NAO DOIS RETANGULOS.

     Antes os dois lados eram cartao: mesmo raio, mesma sombra, mesma borda,
     so mudando a cor de fundo. Uma conversa vira entao uma pilha de caixas
     alternadas — a leitura fica dura e o app parece formulario, nao dialogo.

     Agora so o que ELE diz e objeto. A resposta do MENTRE nao tem caixa: ela
     e o proprio texto da pagina, do jeito que uma resposta lida deveria ser.
     Isso resolve dois problemas de uma vez — o visual engessado, e o fato de
     que resposta longa dentro de bolha estreita e desconfortavel de ler.

     A distincao de quem falou passa a vir de posicao (dele a direita, do
     MENTRE ocupando a coluna) e de peso, nao de moldura.
     ------------------------------------------------------------------ */
  .user{margin-left:auto;max-width:80%;
        padding:10px 16px;
        background:color-mix(in srgb, var(--gold) 8%, var(--sup-3));
        border:1px solid color-mix(in srgb, var(--gold) 16%, transparent);
        /* Redondo de verdade e sem rabicho: 22px em todos os cantos le como
           balao de conversa, nao como celula de tabela. O canto reto de 6px
           que existia aqui era o que mais puxava a cara de "projeto". */
        border-radius:20px;
        box-shadow:none}

  /* Sem fundo, sem borda, sem sombra, sem teto de largura apertado. */
  .sia{background:none;border:0;border-radius:0;box-shadow:none;
       padding:2px 2px 2px 0;max-width:92%;
       /* Um fio de contraste a mais que a bolha dele: e o texto que a pessoa
          realmente le, e sem caixa ele precisa se sustentar sozinho. */
       color:var(--text);
       font-size:.97rem;line-height:1.68}
  /* Respiro entre turnos. Sem moldura, o espaco em branco e o unico
     separador — apertado ele vira parede de texto. */
  .linha:has(.sia){margin-bottom:14px}
  .linha:has(.user){margin-bottom:16px}

  .audio-wrap{display:inline-flex;align-items:center;gap:8px;padding:4px 8px 4px 4px;
              background:var(--panel);border:1px solid var(--border);border-radius:20px;margin:4px 0 12px}
  .audio-wrap audio{height:34px;width:210px}
  .spd,.ouvir{background:var(--input);color:var(--gold-soft);border:1px solid var(--border);
       border-radius:12px;font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.68rem;font-weight:700;
       padding:4px 10px;cursor:pointer}
  .spd:hover,.ouvir:hover{border-color:var(--gold)}
  .ouvir{margin-bottom:12px}

  /* Botao de ouvir a mensagem: so o icone, sem rotulo e sem emoji.

     Era um "🔊 Ouvir" em caixa-alta que aparecia embaixo de TODA resposta —
     um bloco de texto repetido a cada mensagem, competindo com o conteudo e
     destoando do conjunto de icones de traco usado no resto do app. Como
     acao secundaria e repetitiva, ele deve ser reconhecivel e discreto, nao
     legivel a distancia. O aria-label mantem o nome para leitor de tela. */
  /* Disco preenchido, e nao contorno.
     Antes era uma borda de 1px em cor `--dim` e, no celular, NEM a borda —
     so um triangulo apagado boiando sob o texto. Com a resposta do MENTRE
     agora sem moldura, um contorno fraco no meio de texto corrido nao le
     como botao: e por isso que parte dos testers dizia que o botao "sumiu"
     mesmo com ele na tela. Um disco solido tem forma propria e sobrevive
     tanto ao fundo escuro quanto ao claro. */
  .btn-ouvir{width:32px;height:32px;flex-shrink:0;margin:-4px 0 22px;
             display:inline-flex;align-items:center;justify-content:center;
             background:transparent;border:1px solid var(--border);
             border-radius:50%;color:var(--txt-2);cursor:pointer;padding:0;
             transition:color .16s,border-color .16s,background .16s,transform .12s}
  .btn-ouvir:hover{color:var(--gold-soft);border-color:var(--gold);background:var(--ouro-tinta)}
  .btn-ouvir:active{transform:scale(.94)}
  .btn-ouvir .ic{width:15px;height:15px;margin-left:1px}
  .btn-ouvir[data-ativo="1"]{color:var(--bg);background:var(--gold);border-color:var(--gold)}
  /* No celular o disco cresce ate o minimo confortavel de toque (44px), em
     vez de perder a borda e virar so o icone. */
  @media (max-width:768px){
    .btn-ouvir{width:40px;height:40px}
    .btn-ouvir:hover{color:var(--gold-soft);background:transparent}
    .btn-ouvir .ic{width:17px;height:17px}
  }

  footer{background:var(--bg);padding:6px 24px 12px;position:relative}
  /* A conversa se dissolve antes da barra, em vez de ser cortada a faca na
     borda de cima do rodape. */
  footer::before{content:'';position:absolute;left:0;right:0;top:-28px;height:28px;pointer-events:none;
                 background:linear-gradient(to bottom,rgba(11,17,23,0),var(--bg))}
  /* ==================================================================
     BARRA DE ENTRADA — uma linha só.

     Antes eram duas linhas e todo botao tinha borda propria. No celular
     aquilo virava uma grade de caixinhas competindo com a conversa: seis
     retangulos delimitados empilhados embaixo do texto. Aqui a regra e a
     oposta — um unico objeto (a pilula do campo) e, ao redor dele, icones
     SEM caixa. A area de toque continua com 44px; ela so nao e desenhada.
     ================================================================== */
  /* A barra inteira e o objeto: campo e botoes dentro de uma capsula so, na
     mesma coluna de 760px da conversa. Antes o campo era uma pilula solta de
     1.100px e os icones boiavam do lado de fora, nas duas pontas. */
  .barra{width:100%;max-width:760px;margin:0 auto;display:flex;align-items:center;gap:2px;
         background:var(--sup-2);border:1px solid var(--linha);border-radius:28px;padding:4px;
         transition:border-color .16s,box-shadow .16s}
  .barra:focus-within{border-color:rgba(176,141,87,.5);box-shadow:0 0 0 4px rgba(176,141,87,.08)}

  /* Botao-fantasma: so o icone. O alvo de 44px vem do tamanho do botao, nao
     de uma borda visivel — e a regra da Apple sobre area de toque, nao sobre
     moldura. */
  .acao{
    flex:0 0 auto;width:44px;height:44px;padding:0;
    display:inline-flex;align-items:center;justify-content:center;
    background:transparent;border:none;outline:none;border-radius:50%;
    color:var(--dim);cursor:pointer;-webkit-tap-highlight-color:transparent;
    transition:color .16s,background .16s,transform .12s}
  .acao .ic{width:21px;height:21px;pointer-events:none}
  .acao:hover{color:var(--gold-soft);background:var(--sup-3)}
  .acao:active{transform:scale(.9)}
  .acao:focus-visible{outline:2px solid var(--gold);outline-offset:-2px}

  /* Pilula central: fundo levemente acima do fundo da tela, sem borda. */
  .barra input[type=text]{
    flex:1 1 auto;min-width:0;
    background:transparent;color:var(--text);
    border:none;outline:none;border-radius:22px;
    padding:12px 8px;margin:0 2px;font-size:.95rem;line-height:1.3;
    text-overflow:ellipsis}
  .barra input[type=text]::placeholder{color:var(--dim);opacity:.75}

  .acoes-cluster{flex:0 0 auto;display:flex;align-items:center;gap:2px}

  /* O rodape sobe exatamente a altura que o teclado cobriu (ve
     ajustarAoTeclado). A transicao e curta e so no padding: animar `bottom`
     brigaria com o proprio movimento do teclado e produziria o solavanco que
     queremos evitar. */
  /* `max()`, e nao soma.
     Com viewport-fit=cover o env(safe-area-inset-bottom) deixou de ser 0 e
     passou a valer os ~34px da barra de gestos do iPhone. Somando aos 10px de
     respiro dava 44px de rodape vazio abaixo da barra de digitacao — o
     "espaco morto" que apareceu. O inset JA E o respiro naquele trecho: onde
     ele existe, ele basta; onde nao existe, valem os 10px. */
  /* DUAS propriedades, de proposito.

     `padding-bottom` cuida do safe-area, e `max()` e nao soma: com
     viewport-fit=cover o env(safe-area-inset-bottom) deixou de ser 0 e passou
     a valer os ~34px da barra de gestos do iPhone; somado aos 10px de respiro
     dava 44px de rodape vazio abaixo da barra de digitacao — o "espaco morto".
     O inset JA E o respiro naquele trecho: onde existe, basta; onde nao
     existe, valem os 10px.

     A altura do teclado continua somada aqui, em `padding` e nao em `margin`:
     `margin-bottom` no <footer> computa 0px por mais que se escreva nele,
     inclusive por estilo inline — medido. Padding e o que este layout aceita.

     Cuidado ao testar isto no navegador: mexer no estilo do rodape muda o
     layout, o visualViewport dispara `resize`, ajustarAoTeclado() roda e
     escreve --teclado:0px de volta. Falsifique `visualViewport.height` em vez
     de escrever o estilo na mao, senao o proprio app desfaz o teste. */
  /* 60% do inset, e nao ele inteiro.

     Com viewport-fit=cover de volta (ele voltou para tirar a faixa preta do
     TOPO no PWA — ve o index.html), o env(safe-area-inset-bottom) vale ~34px
     no iPhone. Reservar os 34 inteiros abaixo da barra de digitar reabre a
     faixa vazia que este arquivo ja tinha combatido uma vez. A barra do
     sistema tem ~21px de altura visual e flutua sobre o conteudo: 60% deixa a
     barra de digitar livre dela sem sobrar vazio. */
  /* 10px fixos, e o inset fica de fora da conta.

     Este layout foi desenhado quando o inset valia 0, e 10px era o respiro
     certo. Com viewport-fit=cover (que voltou para tirar a faixa preta do topo
     no PWA) o inset passou a valer ~34px no iPhone; usar o inset inteiro abriu
     uma faixa vazia, e 60% dele ainda deixava o dobro do respiro original. A
     barra do sistema flutua sobre o conteudo e a capsula de digitar tem altura
     de sobra: o campo continua confortavelmente acima dela. */
  footer{padding-bottom:calc(10px + var(--teclado, 0px));
         transition:padding-bottom .18s ease-out}
  html.sem-animacao footer{transition:none}

  /* --- Estado: campo vazio x digitando ---------------------------------
     A troca e so de visibilidade, decidida pela classe `com-texto` que o JS
     poe na .barra. Sem remover nada do DOM: trocar nos por JS a cada tecla
     digitada custaria layout a cada caractere. */
  .barra .so-texto{display:none}
  .barra.com-texto .so-vazio{display:none}
  .barra.com-texto .so-texto{display:inline-flex}
  /* Respondendo: "parar" toma o lugar de voz e Live. Enviar continua
     aparecendo se houver texto — mandar outra mensagem tambem vale. */
  .barra .so-gerando{display:none}
  .barra.gerando .so-vazio{display:none}
  .barra.gerando .so-gerando{display:inline-flex}

  /* Enviar em cor de marca: e a acao afirmativa da tela. */
  .acao-enviar{color:var(--bg);background:var(--gold)}
  .acao-enviar:hover{color:var(--bg);background:var(--gold-soft)}

  /* Divisor dentro do menu "+", entre anexos e a preferencia de raciocinio. */
  .mais-divisor{height:1px;background:var(--border);margin:5px 8px}
  #btnModoRaciocinio.modo-profundo .ic{color:var(--gold)}
  #btnModoRaciocinio.modo-profundo #rotuloModo{color:var(--gold-soft)}
  .barra input[type=text]:focus{outline:none;border-color:var(--gold)}
  /* Icones de traco: herdam a cor do botao, entao seguem tema e estado. */
  .ic{width:20px;height:20px;display:block;fill:none;stroke:currentColor;
      stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;
      pointer-events:none}
  .ic-lg{width:22px;height:22px}
  .icone svg.ic{margin:0 auto}
  #btnMic.gravando{color:#e5686d;background:rgba(229,104,109,.12);animation:pulse 1s infinite}
  #btnLive.live{color:var(--gold)}
  #btnLive.live .ic{stroke-width:2}
  #btnLive.live.ligado{background:var(--gold);color:var(--bg);animation:respira 2s infinite}
  .icone{transition:border-color .16s,color .16s,background .16s;background:var(--input);border:1px solid var(--border);border-radius:8px;
         color:var(--text);padding:11px 14px;cursor:pointer;font-size:1rem}
  .icone:hover{border-color:var(--gold)}
  .icone.live{border-color:var(--gold);color:var(--gold);background:var(--panel)}
  .icone.live.ligado{background:var(--gold);color:var(--bg);animation:respira 2s infinite}
  @keyframes respira{50%{opacity:.65}}

  /* Botao bloqueado por limite de uso — padrao visual OFICIAL e reutilizavel
     para qualquer recurso com cota (Live Chat hoje, o que vier depois).
     Nao usa o atributo disabled de verdade: o clique continua disparando o
     onclick normal, so que a funcao mostra o aviso em vez de agir —
     disabled faria o navegador engolir o clique e o usuario nunca saberia
     por que o botao parou de responder. */
  .recurso-bloqueado{opacity:.4;cursor:not-allowed;filter:grayscale(.4)}
  .recurso-bloqueado:hover{border-color:var(--border);color:var(--text)}


  /* --- Faixa da conversa continua: UMA linha dourada --- */
  #faixaLive{display:none;flex-direction:column;align-items:center;gap:5px;
             padding:9px 14px 7px;background:var(--panel);
             border-bottom:1px solid var(--gold);
             font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.75rem;color:var(--gold-soft)}
  #faixaLive.ativa{display:flex}
  #ondaCanvas{display:block;width:100%;max-width:760px;height:40px;
              opacity:.72;transition:opacity .35s ease}
  #faixaLive.ativo-fala #ondaCanvas{opacity:1}
  .nucleo{display:flex;align-items:center;gap:9px;white-space:nowrap}
  .selo-ruido{display:inline-flex;align-items:center;gap:4px;
              font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.55rem;letter-spacing:.01em;
              color:var(--gold);border:1px solid var(--gold);border-radius:4px;
              padding:1px 5px;opacity:.85}
  #txtLive.trabalhando{color:var(--gold);animation:pulsa 1.2s infinite}
  @keyframes pulsa{50%{opacity:.55}}
  .ponto{width:8px;height:8px;border-radius:50%;background:var(--gold);animation:respira 1.2s infinite}
  .icone.gravando{border-color:#a34a4a;color:#a34a4a;animation:pulse 1s infinite}
  @keyframes pulse{50%{opacity:.5}}

  .card{display:flex;align-items:center;gap:12px;background:var(--sup-1);border:1px solid var(--linha);
        border-radius:10px;padding:12px 14px;margin-bottom:8px;transition:border-color .16s}
  .card:hover{border-color:var(--border)}
  .card-ponto{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--cor,var(--gold))}
  .card .meta{font-size:.76rem;color:var(--dim);margin-top:2px;font-variant-numeric:tabular-nums}
  .card button{background:transparent;color:var(--txt-2);border:1px solid var(--linha);
               border-radius:999px;padding:6px 12px;cursor:pointer;margin-left:6px;font:inherit;font-size:.78rem;
               transition:border-color .15s,color .15s}
  .card button:hover{border-color:var(--gold-soft);color:var(--gold-soft)}
  .card .acoes{margin-left:auto;display:flex}
  @media (hover:hover){
    #listaTarefas .card .acoes{opacity:0;transition:opacity .15s}
    #listaTarefas .card:hover .acoes,#listaTarefas .card:focus-within .acoes{opacity:1}
  }
  .dica{color:var(--dim);font-size:.85rem;margin-bottom:16px}
  .doc-envio{position:relative;display:flex;align-items:center;gap:14px;margin:20px 0 22px;padding:18px 20px;
             background:var(--sup-1);border:1px dashed var(--border);border-radius:var(--raio);cursor:pointer;
             transition:border-color .15s,background .15s,opacity .15s}
  .doc-envio:hover,.doc-envio:focus-within{border-color:var(--gold-soft);background:var(--sup-2)}
  .doc-envio input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
  .doc-envio.enviando{opacity:.55;pointer-events:none}
  .doc-envio-ic{flex:0 0 auto;width:44px;height:44px;border-radius:12px;display:inline-flex;align-items:center;
                justify-content:center;background:var(--ouro-tinta);color:var(--gold-soft)}
  .doc-envio-txt{display:flex;flex-direction:column;gap:3px;min-width:0}
  .doc-envio-txt b{font-weight:600;color:var(--text);font-size:.94rem}
  .doc-envio-txt small{color:var(--dim);font-size:.8rem;line-height:1.45}
  .doc-ic{flex:0 0 auto;width:36px;height:36px;border-radius:9px;background:var(--sup-2);display:inline-flex;
          align-items:center;justify-content:center;color:var(--txt-2)}
  .doc-ic .ic{width:18px;height:18px}
  /* Estado vazio que ensina o proximo passo, e nao so constata a falta. */
  .vazio-bloco{display:flex;flex-direction:column;align-items:center;gap:6px;padding:30px 20px;text-align:center;
               background:var(--sup-1);border:1px solid var(--linha);border-radius:var(--raio);margin-top:10px}
  .vazio-bloco b{font-weight:600;color:var(--text);font-size:.92rem}
  .vazio-bloco span{color:var(--dim);font-size:.84rem;line-height:1.55;max-width:54ch;text-wrap:pretty}
  /* Instrument Serif so existe no peso 400. Sem declarar, o navegador aplica o
     negrito padrao do h3 e FABRICA um negrito borrado — era o "Proximos
     compromissos" e o "Configuracoes" com cara de tinta manchada. */
  h3{font-family:'Instrument Serif',Georgia,serif;font-weight:400;margin:28px 0 12px}
  #agenda > h3{font-family:'Geist',system-ui,sans-serif;font-size:1rem;font-weight:600;color:var(--text);margin:36px 0 2px}
  #documentos > h3{font-size:2rem;line-height:1.1;margin:0 0 6px;color:var(--text)}

  /* ---- Agenda ----
     A grade e UMA superficie cortada por fios, e nao 42 cartoes soltos. Com
     cada dia numa caixa propria o mes virava um mosaico que disputava atencao
     com os compromissos; aqui o fio e recessivo e so tem cor o que esta
     marcado. Navegacao ANTES do titulo: com ela depois, "Maio" e "Setembro"
     tem larguras diferentes e a seta andava debaixo do dedo a cada clique. */
  #calendario{width:100%;margin-bottom:8px}
  .cal-topo{display:flex;align-items:center;justify-content:space-between;gap:12px 16px;
            margin-bottom:18px;flex-wrap:wrap}
  .cal-esq{display:flex;align-items:center;gap:14px;flex-wrap:wrap;min-width:0}
  .cal-titulo{font-family:'Instrument Serif',Georgia,serif;font-weight:400;font-size:2rem;line-height:1.1;
              color:var(--text);margin:0;letter-spacing:0;text-wrap:balance}
  .cal-titulo.cal-titulo-livre{text-transform:none}
  .cal-nav,.cal-vistas{display:inline-flex;align-items:center;background:var(--sup-1);
                       border:1px solid var(--linha);border-radius:999px;padding:3px}
  .cal-nav button{background:transparent;border:0;color:var(--txt-2);border-radius:999px;height:30px;min-width:30px;
                  padding:0 12px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;
                  font:inherit;font-size:.8rem;font-weight:500;transition:background .15s,color .15s}
  .cal-nav button:has(svg){padding:0 7px}
  .cal-nav button:hover{background:var(--sup-3);color:var(--text)}
  .cal-vistas button{background:transparent;border:none;color:var(--dim);border-radius:999px;height:30px;padding:0 14px;
                     font:inherit;font-size:.8rem;font-weight:500;cursor:pointer;transition:background .15s,color .15s}
  .cal-vistas button:hover{color:var(--text)}
  .cal-vistas button.ativo{background:var(--sup-3);color:var(--text);font-weight:600;
                           box-shadow:inset 0 0 0 1px rgba(209,171,116,.24)}
  .cal-vistas button:focus-visible,.cal-nav button:focus-visible,.cal-num:focus-visible,
  .cal-item:focus-visible,.cal-sem-cab:focus-visible,.cal-ev:focus-visible{outline:2px solid var(--gold-soft);outline-offset:1px}

  /* mes */
  .cal-semana{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));margin-bottom:8px}
  .cal-semana span{font-size:.74rem;font-weight:500;color:var(--dim);padding:0 10px}
  .cal-grade{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:1px;background:var(--linha);
             border:1px solid var(--linha);border-radius:var(--raio);overflow:hidden}
  .cal-dia{background:var(--sup-1);min-height:100px;padding:8px 6px 6px;display:flex;flex-direction:column;
           gap:3px;min-width:0}
  .cal-dia.fora{background:#0d151b}
  .cal-dia.fora .cal-num{opacity:.4}
  .cal-num{font-size:.8rem;color:var(--txt-2);font-variant-numeric:tabular-nums;line-height:1}
  button.cal-num{align-self:flex-start;background:transparent;border:none;cursor:pointer;width:26px;height:26px;
                 border-radius:50%;display:inline-flex;align-items:center;justify-content:center;
                 margin:-3px 0 2px -1px;padding:0;transition:background .15s,color .15s}
  button.cal-num:hover{background:var(--sup-3);color:var(--text)}
  .cal-dia.hoje .cal-num{background:var(--gold);color:var(--bg);font-weight:700;opacity:1}
  /* A cor e do usuario ("prova em vermelho"), entao ela fica — mas como tinta
     e ponto, e nao como bloco saturado com texto branco por cima. */
  .cal-ev{--cor:#475569;display:flex;align-items:center;gap:6px;width:100%;min-width:0;text-align:left;
          font:inherit;font-size:.74rem;line-height:1.3;color:var(--text);cursor:pointer;
          background:color-mix(in srgb,var(--cor) 16%,transparent);border:0;border-radius:6px;padding:3px 6px;
          transition:background .15s}
  .cal-ev::before{content:'';flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--cor)}
  .cal-ev:hover{background:color-mix(in srgb,var(--cor) 28%,transparent)}
  .cal-ev .h{flex:0 0 auto;color:var(--txt-2);font-variant-numeric:tabular-nums}
  .cal-ev .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cal-ev.feito{opacity:.55}
  .cal-ev.feito .t{text-decoration:line-through}
  .cal-ev.aberto{box-shadow:inset 0 0 0 1px var(--cor)}
  .cal-mais{font-size:.7rem;color:var(--dim);cursor:pointer;padding:1px 6px}
  .cal-mais:hover{color:var(--gold-soft)}

  /* semana */
  .cal-sem{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:1px;background:var(--linha);
           border:1px solid var(--linha);border-radius:var(--raio);overflow:hidden}
  .cal-sem-col{background:var(--sup-1);padding:10px 8px 12px;min-height:250px;display:flex;flex-direction:column;
               gap:6px;min-width:0}
  .cal-sem-cab{display:flex;align-items:center;justify-content:space-between;background:transparent;border:none;
               color:var(--dim);font:inherit;font-size:.76rem;font-weight:500;padding:0 2px 6px;cursor:pointer}
  .cal-sem-cab b{font-size:.95rem;color:var(--text);font-weight:600;font-variant-numeric:tabular-nums;min-width:28px;
                 height:28px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center}
  .cal-sem-cab:hover b{background:var(--sup-3)}
  .cal-sem-col.hoje .cal-sem-cab span{color:var(--gold-soft)}
  .cal-sem-col.hoje .cal-sem-cab b{background:var(--gold);color:var(--bg)}
  .cal-sem-vazio{display:none}
  .cal-item{--cor:#475569;display:block;width:100%;text-align:left;border:0;border-radius:8px;padding:7px 9px 8px;
            background:color-mix(in srgb,var(--cor) 14%,transparent);color:var(--text);font:inherit;cursor:pointer;
            transition:background .15s}
  .cal-item:hover{background:color-mix(in srgb,var(--cor) 26%,transparent)}
  .cal-item[aria-expanded="true"]{box-shadow:inset 0 0 0 1px var(--cor)}
  .cal-item .h{display:flex;align-items:center;gap:6px;font-size:.72rem;color:var(--txt-2);font-variant-numeric:tabular-nums}
  .cal-item .h::before{content:'';flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--cor)}
  .cal-item .t{display:block;font-size:.84rem;font-weight:500;line-height:1.3;margin-top:2px;overflow-wrap:anywhere}
  .cal-item.feito .t{text-decoration:line-through;opacity:.6}

  /* dia */
  .cal-dia-lista{display:flex;flex-direction:column;gap:10px;background:var(--sup-1);border:1px solid var(--linha);
                 border-radius:var(--raio);padding:16px}
  .cal-dia-linha{display:grid;grid-template-columns:52px minmax(0,1fr);gap:12px;align-items:start}
  .cal-dia-hora{font-size:.8rem;color:var(--dim);font-variant-numeric:tabular-nums;padding-top:8px;text-align:right}
  .cal-dia-vazio{color:var(--dim);font-size:.9rem;padding:48px 16px;text-align:center;margin:0;
                 background:var(--sup-1);border:1px solid var(--linha);border-radius:var(--raio)}

  /* detalhe: pares rotulo/valor espalhados em colunas, e as acoes com peso
     diferente — concluir e a principal, excluir e a que ninguem deve apertar
     sem querer. Antes eram quatro pilulas iguais e um lapis solto. */
  .cal-det{--cor:var(--gold);margin-top:14px;padding:18px 20px;background:var(--sup-1);border:1px solid var(--linha);
           border-radius:var(--raio);font-size:.86rem;animation:calAbre .18s ease-out}
  .cal-dia-linha .cal-det{margin-top:8px}
  @keyframes calAbre{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
  html.sem-animacao .cal-det{animation:none}
  .cal-det-cab{display:flex;align-items:flex-start;gap:12px;margin-bottom:16px}
  .cal-det-ponto{flex:0 0 auto;width:10px;height:10px;border-radius:50%;background:var(--cor);margin-top:6px}
  .cal-det-cab b{display:block;font-size:1.05rem;font-weight:600;color:var(--text);line-height:1.35}
  .cal-det-cab small{display:block;font-weight:400;color:var(--dim);font-size:.8rem;margin-top:2px}
  .cal-det dl{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px 24px;margin:0;padding-left:22px}
  .cal-det dl > div{min-width:0}
  .cal-det dt{color:var(--dim);font-size:.74rem;margin-bottom:3px}
  .cal-det dd{margin:0;color:var(--text);overflow-wrap:anywhere}
  .cal-det-acoes{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px;padding-top:14px;border-top:1px solid var(--linha)}
  .cal-det-acoes button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:999px;
                        height:34px;padding:0 14px;font:inherit;font-size:.8rem;cursor:pointer;
                        transition:border-color .15s,color .15s,background .15s}
  .cal-det-acoes button:hover{border-color:var(--gold-soft);color:var(--gold-soft)}
  .cal-det-acoes .cal-primario{background:var(--gold);border-color:var(--gold);color:var(--bg);font-weight:600}
  .cal-det-acoes .cal-primario:hover{background:var(--gold-soft);border-color:var(--gold-soft);color:var(--bg)}
  .cal-det-acoes .cal-perigo{margin-left:auto;border-color:transparent;color:var(--dim)}
  .cal-det-acoes .cal-perigo:hover{color:#e8807d;border-color:rgba(224,82,79,.4)}
  /* Provas com um pouco mais de tinta. O seletor antigo comparava "#ef4444"
     em minusculas com a cor gravada em MAIUSCULAS (#EF4444): nunca casava. */
  .cal-ev[style*="#ef4444" i]{font-weight:600;background:color-mix(in srgb,var(--cor) 26%,transparent)}
  @media(max-width:700px){
    .cal-titulo{font-size:1.45rem}
    .cal-topo{margin-bottom:14px}
    .cal-esq{gap:10px}
    .cal-semana span{padding:0 4px;font-size:.66rem}
    /* A celula tem ~50px: titulo truncado em "Aula d…" nao se le. Vira ponto
       na cor do compromisso, e o dia inteiro e o alvo do toque — abre a vista
       do dia, com titulo, hora e detalhe completos. */
    .cal-dia{min-height:62px;padding:5px 5px 6px;position:relative;display:grid;
             grid-template-columns:repeat(3,7px);grid-template-rows:22px;grid-auto-rows:7px;
             gap:4px 3px;align-content:start}
    button.cal-num{grid-column:1/-1;width:22px;height:22px;font-size:.72rem;margin:0 0 2px}
    button.cal-num::after{content:'';position:absolute;inset:0}
    .cal-ev,.cal-ev[style*="#ef4444" i]{width:7px;height:7px;padding:0;border-radius:50%;background:var(--cor);
                                        font-size:0;pointer-events:none}
    .cal-ev::before,.cal-ev .h,.cal-ev .t{display:none}
    .cal-mais{grid-column:1/-1;font-size:.56rem;line-height:7px;padding:0;pointer-events:none}
    .cal-sem{grid-template-columns:1fr}
    .cal-sem-col{min-height:0}
    .cal-det{padding:16px}
    .cal-det dl{padding-left:0;grid-template-columns:1fr 1fr}
    .cal-det-acoes{display:grid;grid-template-columns:1fr 1fr}
    .cal-det-acoes button{height:auto;min-height:38px;padding:6px 10px;white-space:normal;line-height:1.2}
    .cal-det-acoes .cal-perigo{margin-left:0}
  }

  /* ---- Financas ----
     Tres andares: o mes (resumo), o que pede acao (atencao + o trabalho) e o
     detalhe (graficos, limites, planilha). Antes os cinco avisos vinham
     PRIMEIRO, cada um numa faixa com trilho colorido, e empurravam o numero do
     mes para baixo da dobra — no celular, para a segunda tela inteira. */
  #financas{position:relative}
  #financas.fin-carregando > :not(.fin-tip){opacity:.6;transition:opacity .15s}
  .fin-ic{width:16px;height:16px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.8;
          stroke-linecap:round;stroke-linejoin:round}

  .fin-topo{display:flex;align-items:center;justify-content:space-between;gap:14px 16px;flex-wrap:wrap;margin-bottom:18px}
  .fin-mes{display:flex;align-items:center;gap:14px;flex-wrap:wrap;min-width:0}
  .fin-mes h2{font-family:'Instrument Serif',Georgia,serif;font-weight:400;font-size:2rem;line-height:1.1;
              color:var(--text);margin:0;text-wrap:balance}
  .fin-mes-nav{display:inline-flex;align-items:center;background:var(--sup-1);border:1px solid var(--linha);
               border-radius:999px;padding:3px}
  .fin-nav{background:transparent;border:0;color:var(--txt-2);border-radius:999px;height:30px;min-width:30px;padding:0 7px;
           cursor:pointer;font:inherit;font-size:.8rem;font-weight:500;display:inline-flex;align-items:center;
           justify-content:center;transition:background .15s,color .15s}
  .fin-nav.fin-nav-txt{padding:0 12px}
  .fin-nav:hover{background:var(--sup-3);color:var(--text)}
  .fin-topo-acoes{display:flex;gap:8px;flex-wrap:wrap}
  .fin-btn{display:inline-flex;align-items:center;gap:7px;background:transparent;border:1px solid var(--border);
           color:var(--text);border-radius:999px;height:36px;padding:0 15px;font:inherit;font-size:.82rem;font-weight:500;
           cursor:pointer;white-space:nowrap;transition:border-color .15s,color .15s,background .15s}
  .fin-btn .fin-ic{width:15px;height:15px;color:var(--dim);transition:color .15s}
  .fin-btn:hover{border-color:var(--gold-soft);color:var(--gold-soft)}
  .fin-btn:hover .fin-ic{color:currentColor}
  .fin-btn:active{transform:translateY(1px)}
  .fin-btn:disabled{opacity:.5;cursor:wait}
  .fin-btn:focus-visible,.fin-nav:focus-visible,.fin-seg:focus-visible,.fin-status:focus-visible,
  .fin-x:focus-visible,.fin-link:focus-visible{outline:2px solid var(--gold-soft);outline-offset:2px}
  .fin-primario{background:var(--gold);border-color:var(--gold);color:var(--bg);font-weight:600}
  .fin-primario .fin-ic{color:var(--bg)}
  .fin-primario:hover{background:var(--gold-soft);border-color:var(--gold-soft);color:var(--bg)}
  .fin-primario:hover .fin-ic{color:var(--bg)}
  .fin-btn-mini{height:30px;padding:0 12px;font-size:.76rem}
  .fin-link{background:none;border:0;padding:10px 0 0;color:var(--gold-soft);font:inherit;font-size:.8rem;cursor:pointer}
  .fin-link:hover{color:var(--gold);text-decoration:underline;text-underline-offset:3px}

  .fin-card{background:var(--sup-1);border:1px solid var(--linha);border-radius:var(--raio);padding:18px 20px;
            margin-bottom:14px;min-width:0}
  .fin-card h3{font-family:'Geist',system-ui,sans-serif;font-size:.94rem;font-weight:600;letter-spacing:0;
               color:var(--text);margin:0 0 12px}
  .fin-card-topo{display:flex;align-items:center;justify-content:space-between;gap:10px 14px;flex-wrap:wrap;margin-bottom:14px}
  .fin-card-topo h3{margin:0;display:flex;align-items:center;gap:8px}
  .fin-contador{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 7px;
                border-radius:999px;background:var(--sup-3);color:var(--txt-2);font-size:.72rem;font-weight:600;
                font-variant-numeric:tabular-nums}
  .fin-nota{color:var(--dim);font-size:.8rem;margin:0 0 12px;line-height:1.5;max-width:70ch}
  .fin-card-topo + .fin-nota{margin-top:-8px}
  .fin-nota-pe{margin:12px 0 0}

  /* resumo do mes: dois grupos com a mesma gramatica — o que ja aconteceu e o
     que ainda vai acontecer — e o resultado de cada um em destaque */
  .fin-card.fin-resumo{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));padding:0;overflow:hidden}
  .fin-grupo{padding:18px 20px 20px;min-width:0}
  .fin-grupo + .fin-grupo{border-left:1px solid var(--linha)}
  .fin-grupo h3{font-size:.76rem;font-weight:500;color:var(--dim);margin:0 0 14px}
  /* subgrid: rotulo, valor e nota de cada numero em tres linhas comuns aos
     tres. Com colunas independentes, a nota embaixo de "Fecha o mes em"
     empurrava "A receber" e "A pagar" para baixo do valor do total. */
  .fin-conta{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1.3fr);
             grid-template-rows:auto auto auto;column-gap:18px;row-gap:0}
  .fin-kpi{display:grid;grid-row:span 3;grid-template-rows:subgrid;min-width:0}
  .fin-kpi > .fin-valor{align-self:end}
  .fin-kpi-rot{font-size:.78rem;color:var(--txt-2);margin-bottom:4px;align-self:end}
  .fin-valor{font-size:1.12rem;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap;
             letter-spacing:-.01em}
  .fin-kpi-total{padding-left:18px;border-left:1px solid var(--linha)}
  .fin-kpi-total .fin-valor{font-size:1.6rem;line-height:1.15}
  .fin-valor.neg{color:var(--fin-critico)}
  .fin-kpi-dica{font-size:.7rem;color:var(--dim);line-height:1.35;margin-top:4px}

  /* atencao + trabalho, lado a lado quando cabem */
  .fin-duplo{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));gap:14px;margin-bottom:14px}
  .fin-duplo > .fin-card{margin-bottom:0}
  .fin-alertas{list-style:none;margin:0;padding:0}
  .fin-alerta{display:flex;align-items:center;gap:12px;padding:10px 0;border-top:1px solid var(--linha);font-size:.84rem}
  .fin-alerta:first-child{border-top:0;padding-top:0}
  .fin-alerta-ic{flex:0 0 auto;width:32px;height:32px;border-radius:50%;display:inline-flex;align-items:center;
                 justify-content:center;background:rgba(250,178,25,.10)}
  .fin-alerta.critico .fin-alerta-ic{background:rgba(224,82,79,.12)}
  .fin-alerta-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
  .fin-alerta-txt b{font-weight:600;color:var(--text)}
  .fin-alerta-txt span{color:var(--dim);font-size:.8rem;overflow-wrap:anywhere}
  .fin-alerta.critico .fin-ic,.fin-meta-estado.critico .fin-ic{color:var(--fin-critico)}
  .fin-alerta.atencao .fin-ic,.fin-meta-estado.atencao .fin-ic,.fin-status.pendente .fin-ic{color:var(--fin-atencao)}
  .fin-meta-estado.ok .fin-ic,.fin-status.pago .fin-ic{color:var(--success)}

  /* o trabalho como demonstrativo: cada linha e a conta da linha de cima */
  .fin-dre{max-width:560px;font-size:.88rem}
  .fin-dre-linha{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:8px 0}
  .fin-dre-rot{display:flex;align-items:baseline;gap:8px;min-width:0;color:var(--txt-2)}
  .fin-dre-op{flex:0 0 auto;width:12px;font-style:normal;text-align:center;color:var(--dim)}
  .fin-dre-linha .fin-valor{font-size:.95rem;font-weight:500}
  .fin-dre-sub{border-top:1px solid var(--linha)}
  .fin-dre-sub .fin-dre-rot{color:var(--text)}
  .fin-dre-sub .fin-valor{font-weight:600}
  .fin-dre-total{border-top:1px solid var(--border);margin-top:4px;padding-top:12px}
  .fin-dre-total .fin-dre-rot{color:var(--text);font-weight:600}
  .fin-dre-total .fin-valor{font-size:1.4rem;font-weight:600;color:var(--gold-soft)}
  .fin-dre-total .fin-valor.neg{color:var(--fin-critico)}

  /* graficos */
  .fin-graficos{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,400px),1fr));gap:14px;margin-bottom:14px}
  .fin-graficos .fin-card{margin-bottom:0}
  .fin-barras{display:flex;flex-direction:column;gap:2px}
  .fin-barra-linha{display:grid;grid-template-columns:minmax(90px,30%) minmax(0,1fr) auto;align-items:center;gap:12px;
                   font-size:.82rem;border-radius:7px;padding:6px 6px;margin:0 -6px;outline:none;transition:background .12s}
  .fin-barra-linha:hover,.fin-barra-linha:focus-visible{background:var(--sup-2)}
  .fin-barra-linha:focus-visible{box-shadow:0 0 0 2px var(--gold-soft)}
  .fin-barra-rot{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .fin-barra-trilho{display:block;height:8px;border-radius:4px;background:rgba(57,135,229,.10)}
  .fin-barra{display:block;height:8px;background:var(--fin-s1);border-radius:4px}
  .fin-barra-val{color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}
  .fin-barra-val small{display:inline-block;min-width:4.2ch;margin-left:8px;color:var(--dim);font-size:.74rem;text-align:right}
  .fin-legenda{display:flex;gap:14px;font-size:.76rem;color:var(--txt-2)}
  .fin-legenda span{display:inline-flex;align-items:center;gap:6px}
  .fin-ch{display:inline-block;width:10px;height:10px;border-radius:3px}
  i.fin-s1{background:var(--fin-s1)} i.fin-s2{background:var(--fin-s2)}
  .fin-svg{width:100%;height:auto;display:block;overflow:visible}
  .fin-svg path.fin-s1{fill:var(--fin-s1)} .fin-svg path.fin-s2{fill:var(--fin-s2)}
  .fin-grade{stroke:var(--fin-grade);stroke-width:1}
  .fin-eixo{fill:var(--dim);font-size:10px;font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums}
  .fin-eixo-atual{fill:var(--text);font-weight:600}
  .fin-rotulo{fill:var(--text);font-size:10px;font-family:'Geist',system-ui,sans-serif}
  .fin-alvo{fill:transparent;outline:none}
  .fin-alvo:hover,.fin-alvo:focus{fill:rgba(255,255,255,.035)}
  .fin-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .fin-tip{position:absolute;z-index:30;pointer-events:none;background:#0b1117;border:1px solid var(--border);
           border-radius:10px;padding:8px 10px;font-size:.74rem;box-shadow:0 10px 28px rgba(0,0,0,.5);min-width:140px}
  .fin-tip-t{color:var(--dim);margin-bottom:4px}
  .fin-tip-l{display:flex;align-items:center;gap:8px;line-height:1.6}
  .fin-tip-l b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
  .fin-tip-l span{color:var(--dim)}
  .fin-tip-k{display:inline-block;width:12px;height:2px;border-radius:1px}
  .fin-tip-k.fin-s1{background:var(--fin-s1)} .fin-tip-k.fin-s2{background:var(--fin-s2)}

  /* limites por categoria */
  .fin-metas{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr));gap:18px 32px}
  .fin-meta{min-width:0}
  .fin-meta-topo{display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:.86rem;margin-bottom:8px}
  .fin-meta-nome{font-weight:500;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .fin-meta-estado{display:inline-flex;align-items:center;gap:5px;font-size:.74rem;color:var(--txt-2);white-space:nowrap}
  .fin-meta-estado .fin-ic{width:14px;height:14px}
  .fin-trilho{height:6px;border-radius:3px;background:var(--sup-3);overflow:hidden}
  .fin-trilho span{display:block;height:100%;border-radius:3px;background:var(--gold)}
  .fin-trilho.atencao span{background:var(--fin-atencao)}
  .fin-trilho.critico span{background:var(--fin-critico)}
  .fin-meta-num{display:flex;justify-content:space-between;gap:10px;margin-top:7px;font-size:.76rem;color:var(--dim);
                font-variant-numeric:tabular-nums}

  /* planilha: texto em repouso, campo so ao passar o mouse ou focar. Com cada
     celula desenhada como campo — seta de lista e icone de calendario em toda
     linha — a tabela parecia um formulario de cadastro. */
  .fin-filtros{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
  .fin-segs{display:inline-flex;background:var(--bg);border:1px solid var(--linha);border-radius:999px;padding:2px}
  .fin-seg{background:transparent;border:0;color:var(--dim);border-radius:999px;height:28px;padding:0 11px;
           font:inherit;font-size:.76rem;font-weight:500;cursor:pointer;transition:background .15s,color .15s}
  .fin-seg:hover{color:var(--text)}
  .fin-seg.ativo{background:var(--sup-3);color:var(--text);box-shadow:inset 0 0 0 1px rgba(209,171,116,.24)}
  /* position:relative e o que faz o quadro recortar TUDO que esta dentro.
     O texto de leitor de tela (.fin-sr) e absoluto; sem um ancestral
     posicionado ele se ancorava no <main>, escapava do recorte e esticava a
     largura rolavel da pagina em 549px numa tela de 375 — o espaco vazio a
     direita das Financas. overflow-x:hidden no <main> escondia o sintoma; esta
     linha tira a causa. */
  .fin-tabela-cx{position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -20px;padding:0 20px}
  .fin-tabela{width:100%;border-collapse:collapse;font-size:.84rem;min-width:880px}
  .fin-tabela select[data-campo=categoria]{min-width:176px}
  .fin-tabela select[data-campo=escopo]{min-width:124px}
  .fin-tabela th{text-align:left;color:var(--dim);font-weight:500;font-size:.74rem;padding:0 8px 10px;
                 border-bottom:1px solid var(--linha);white-space:nowrap}
  .fin-tabela th.fin-num{text-align:right;padding-right:10px}
  .fin-tabela td{padding:5px 4px;border-bottom:1px solid var(--linha);vertical-align:middle}
  .fin-tabela tbody tr{transition:background .12s}
  .fin-tabela tbody tr:hover{background:rgba(255,255,255,.02)}
  .fin-tabela input,.fin-tabela select{width:100%;background-color:transparent;border:1px solid transparent;color:var(--text);
                                       border-radius:7px;padding:6px;font:inherit;font-size:.84rem;color-scheme:dark;
                                       transition:border-color .12s,background-color .12s}
  .fin-tabela select{-webkit-appearance:none;appearance:none;padding-right:24px;cursor:pointer;
                     background-repeat:no-repeat;background-position:right 6px center;background-size:13px}
  .fin-tabela tr:hover select,.fin-tabela select:focus{
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a9690' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")}
  .fin-tabela input[type=date]::-webkit-calendar-picker-indicator{opacity:0;cursor:pointer;transition:opacity .12s}
  .fin-tabela tr:hover input[type=date]::-webkit-calendar-picker-indicator,
  .fin-tabela input[type=date]:focus::-webkit-calendar-picker-indicator{opacity:.55}
  @media (hover:none){
    .fin-tabela select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a9690' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")}
    .fin-tabela input[type=date]::-webkit-calendar-picker-indicator{opacity:.55}
  }
  .fin-tabela input:hover,.fin-tabela select:hover{border-color:var(--border)}
  .fin-tabela input:focus,.fin-tabela select:focus{border-color:var(--gold);background-color:var(--sup-2);outline:none}
  .fin-tabela select option{background:var(--sup-1);color:var(--text)}
  .fin-tabela input[type=date]{min-width:128px;font-variant-numeric:tabular-nums}
  .fin-desc{min-width:210px}
  .fin-tabela td small{display:block;color:var(--dim);font-size:.7rem;padding:0 7px 2px}
  .fin-num,.fin-num input{text-align:right;font-variant-numeric:tabular-nums}
  .fin-valor-cx{display:flex;align-items:center;justify-content:flex-end}
  .fin-sinal{color:var(--dim);font-variant-numeric:tabular-nums;padding-left:4px}
  /* O campo do valor mede o proprio numero: com largura fixa o sinal ficava
     ancorado na borda esquerda do campo, a varios caracteres do valor. */
  .fin-tabela .fin-valor-cel input{width:10ch;min-width:0;padding-left:3px;font-weight:500}
  @supports (field-sizing:content){.fin-tabela .fin-valor-cel input{field-sizing:content;width:auto;min-width:4ch}}
  .fin-valor-cel.receita .fin-sinal{color:#7cc59a}
  .fin-status{display:inline-flex;align-items:center;gap:5px;border:0;border-radius:999px;height:26px;padding:0 10px 0 8px;
              font:inherit;font-size:.76rem;font-weight:500;cursor:pointer;white-space:nowrap;transition:filter .12s}
  .fin-status.pendente{background:rgba(250,178,25,.12);color:#f3cd78}
  .fin-status.pago{background:rgba(95,152,115,.14);color:#a3d2b3}
  .fin-status:hover{filter:brightness(1.18)}
  .fin-status .fin-ic{width:14px;height:14px}
  .fin-acoes-cel{width:40px;text-align:right}
  .fin-x{background:transparent;border:none;color:var(--dim);cursor:pointer;width:30px;height:30px;border-radius:8px;
         display:inline-flex;align-items:center;justify-content:center;opacity:0;
         transition:opacity .12s,color .12s,background .12s}
  .fin-tabela tr:hover .fin-x,.fin-fixa:hover .fin-x,.fin-x:focus-visible{opacity:1}
  @media (hover:none){.fin-x{opacity:.75}}
  .fin-x:hover{color:#e8807d;background:rgba(224,82,79,.1)}
  .fin-x .fin-ic{width:16px;height:16px}
  .fin-vazio-cel{color:var(--dim);font-size:.84rem;padding:28px 8px!important;text-align:center}
  .fin-tabela tfoot td{border-bottom:none;padding:14px 8px 0;color:var(--dim);font-size:.8rem;font-variant-numeric:tabular-nums}
  .fin-tabela tfoot td.fin-num{padding-right:10px}
  .fin-tabela tfoot b{color:var(--text);font-size:.95rem}
  .fin-pos{color:var(--text)}

  /* formularios */
  .fin-form{display:flex;flex-direction:column;gap:14px;border-color:rgba(176,141,87,.32)}
  .fin-seg-grupo{display:inline-flex;background:var(--bg);border:1px solid var(--linha);border-radius:999px;padding:3px;
                 align-self:flex-start}
  .fin-seg-grupo label{position:relative}
  .fin-seg-grupo input{position:absolute;opacity:0;pointer-events:none}
  .fin-seg-grupo span{display:inline-block;padding:6px 18px;border-radius:999px;font-size:.84rem;color:var(--dim);cursor:pointer}
  .fin-seg-grupo input:checked + span{background:var(--sup-3);color:var(--text);font-weight:600;
                                      box-shadow:inset 0 0 0 1px rgba(209,171,116,.24)}
  .fin-seg-grupo input:focus-visible + span{outline:2px solid var(--gold-soft)}
  .fin-campos{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}
  .fin-campos label{display:flex;flex-direction:column;gap:6px;font-size:.76rem;color:var(--txt-2)}
  .fin-campos .fin-largo{grid-column:span 2}
  .fin-campos input,.fin-campos select,.fin-form-fixa input,.fin-form-fixa select{background:var(--bg);
    border:1px solid var(--border);color:var(--text);border-radius:var(--raio-ctl);height:40px;padding:0 12px;font:inherit;
    font-size:.88rem;color-scheme:dark;min-width:0;transition:border-color .15s,box-shadow .15s}
  .fin-campos input:focus,.fin-campos select:focus,.fin-form-fixa input:focus,.fin-form-fixa select:focus{
    border-color:var(--gold);box-shadow:0 0 0 3px rgba(176,141,87,.12);outline:none}
  .fin-form-acoes{display:flex;justify-content:flex-end;gap:8px;grid-column:1/-1}
  .fin-form-fixa{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;margin:0 0 14px;padding:14px;
                 background:var(--sup-2);border-radius:10px}
  .fin-form-fixa label{display:flex;flex-direction:column;font-size:.74rem;color:var(--txt-2);gap:4px}
  .fin-form-fixa input[name=dia]{width:76px}

  /* contas fixas */
  .fin-fixas{border-top:1px solid var(--linha)}
  .fin-fixa{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;gap:14px;align-items:center;padding:10px 0;
            border-bottom:1px solid var(--linha);font-size:.86rem}
  .fin-fixa-dia{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;width:44px;height:44px;
                border-radius:10px;background:var(--sup-2);font-size:1rem;font-weight:600;color:var(--text);
                font-variant-numeric:tabular-nums;line-height:1}
  .fin-fixa-dia small{font-size:.56rem;font-weight:600;color:var(--dim);margin-bottom:3px;text-transform:uppercase;letter-spacing:.08em}
  .fin-fixa-desc{min-width:0;overflow-wrap:anywhere;color:var(--text)}
  .fin-fixa-desc small{display:block;color:var(--dim);font-size:.74rem;margin-top:2px}
  .fin-fixa-val{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:500}
  .fin-fixa-val.receita{color:#a3d2b3}
  .fin-reserva{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px 24px;margin-top:16px;
               padding:14px 16px;background:var(--sup-2);border-radius:10px}
  .fin-reserva > div{display:flex;flex-direction:column;gap:3px;min-width:0}
  .fin-reserva .fin-valor{font-size:1.02rem}

  .fin-ajustes{padding:0}
  .fin-ajustes summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;
                       padding:16px 20px;font-size:.94rem;font-weight:600;color:var(--text);border-radius:var(--raio)}
  .fin-ajustes summary::-webkit-details-marker{display:none}
  .fin-ajustes summary .fin-ic{color:var(--dim);transition:transform .2s}
  .fin-ajustes[open] summary .fin-ic{transform:rotate(90deg)}
  .fin-ajustes summary:hover .fin-ic{color:var(--text)}
  .fin-ajustes summary:focus-visible{outline:2px solid var(--gold-soft);outline-offset:-2px}
  .fin-ajustes form{padding:0 20px 18px}
  .fin-ajustes form + form{padding-top:16px;border-top:1px solid var(--linha)}

  .fin-boas-vindas{padding:28px 28px 24px;background:linear-gradient(180deg,rgba(176,141,87,.07),transparent 70%),var(--sup-1)}
  .fin-boas-vindas h3{font-family:'Instrument Serif',Georgia,serif;font-size:1.75rem;color:var(--text);font-weight:400;
                      margin:0 0 14px;text-wrap:balance}
  .fin-boas-vindas ul{margin:0;padding-left:18px;color:var(--txt-2);font-size:.9rem;line-height:1.7;max-width:70ch}
  .fin-aviso{color:var(--dim);font-size:.74rem;line-height:1.6;max-width:78ch;margin:22px 0 8px}
  .fin-vazio-curto{color:var(--dim);font-size:.84rem;margin:0}
  /* Primeira abertura: a forma da tela antes dos numeros, em vez de a aba
     piscar vazia enquanto o resumo chega. */
  .fin-esqueleto{display:flex;flex-direction:column;gap:14px}
  .fin-esq{border:1px solid var(--linha);border-radius:var(--raio);
           background:linear-gradient(90deg,var(--sup-1) 0%,var(--sup-2) 50%,var(--sup-1) 100%);
           background-size:200% 100%;animation:finBrilho 1.4s ease-in-out infinite}
  .fin-esq-topo{height:38px;width:min(440px,70%);border-radius:999px}
  .fin-esq-resumo{height:154px}
  .fin-esq-duplo{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));gap:14px}
  .fin-esq-duplo .fin-esq{height:280px}
  @keyframes finBrilho{from{background-position:100% 0}to{background-position:-100% 0}}
  html.sem-animacao .fin-esq{animation:none}
  .fin-erro{display:flex;flex-direction:column;align-items:flex-start;gap:12px;padding:28px}
  .fin-erro p{margin:0;color:var(--txt-2)}

  @media(max-width:1100px){
    .fin-card.fin-resumo{grid-template-columns:1fr}
    .fin-grupo + .fin-grupo{border-left:0;border-top:1px solid var(--linha)}
  }
  @media(max-width:700px){
    .fin-topo{margin-bottom:14px}
    .fin-mes{gap:10px}
    .fin-mes h2{font-size:1.45rem}
    .fin-topo-acoes{display:grid;grid-template-columns:1fr 1fr;width:100%}
    .fin-topo-acoes .fin-primario{grid-column:1/-1;order:-1;justify-content:center;height:42px}
    .fin-topo-acoes .fin-btn:not(.fin-primario){justify-content:center;padding:0 10px;white-space:normal;
                                                 height:auto;min-height:38px;line-height:1.2;text-align:center}
    .fin-topo-acoes .fin-btn:not(.fin-primario) .fin-ic{display:none}
    .fin-card{padding:16px}
    .fin-grupo{padding:16px}
    .fin-tabela-cx{margin:0 -16px;padding:0 16px}
    .fin-campos .fin-largo{grid-column:auto}
    .fin-ajustes summary{padding:14px 16px}
    .fin-ajustes form{padding:0 16px 16px}
    .fin-barra-linha{grid-template-columns:minmax(80px,34%) minmax(0,1fr) auto;gap:8px}
    .fin-barra-val small{display:none}
  }
  @media(max-width:560px){
    .fin-conta{grid-template-columns:1fr 1fr}
    .fin-kpi-total{grid-column:1/-1;padding:12px 0 0;margin-top:14px;border-left:0;border-top:1px solid var(--linha)}
    .fin-valor{font-size:1.02rem}
    .fin-kpi-total .fin-valor{font-size:1.45rem}
    .fin-alerta{flex-wrap:wrap;row-gap:8px}
    .fin-alerta-txt{flex:1 1 calc(100% - 44px)}
    .fin-alerta .fin-btn-mini{margin-left:44px}
  }

  /* ---- Mapa: cartao compacto no chat + Modo Cinema ---- */
  .mapa-card{position:relative;margin:8px 0 4px;max-width:72%;cursor:pointer;
             border:1px solid var(--border);border-left:3px solid var(--gold);
             border-radius:10px;overflow:hidden;background:var(--panel);
             transition:border-color .18s, transform .18s}
  .mapa-card:hover{border-color:var(--gold);transform:translateY(-1px)}
  .mapa-card .faixa{display:flex;align-items:center;gap:9px;padding:8px 11px}
  .mapa-card .faixa .txt{flex:1;min-width:0}
  .mapa-card .nome{font-size:.83rem;color:var(--text);white-space:nowrap;
                   overflow:hidden;text-overflow:ellipsis;display:block}
  .mapa-card .meta{font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;
                   font-size:.72rem;color:var(--dim);display:block}
  .mapa-card .lupa{flex:0 0 auto;color:var(--gold-soft);opacity:.75}
  /* PREVIA LEVE: so pixels que nos mesmos desenhamos num canvas. Zero tiles,
     zero requisicoes. A previa antiga instanciava um mapa de verdade e
     disparava de 4 a 8 downloads POR CARTAO — uma conversa com cinco rotas
     abria 40 conexoes, cada uma com 12s de timeout no primeiro acesso. */
  .mapa-previa-leve{background:var(--input);border-bottom:1px solid var(--border);
                    overflow:hidden;position:relative}

  /* Modo Cinema: escurece o app sem sair dele. */
  .cinema{position:fixed;inset:0;z-index:60;display:none;
          align-items:center;justify-content:center;padding:24px;
          background:rgba(0,0,0,.72);backdrop-filter:blur(3px);
          opacity:0;transition:opacity .22s ease}
  .cinema.aberto{display:flex;opacity:1}
  .cinema-caixa{width:min(1040px,100%);max-height:100%;display:flex;
                flex-direction:column;background:var(--panel);
                border:1px solid var(--border);border-radius:14px;
                overflow:hidden;box-shadow:0 24px 70px rgba(0,0,0,.55);
                transform:scale(.965);transition:transform .22s cubic-bezier(.2,.8,.2,1)}
  .cinema.aberto .cinema-caixa{transform:scale(1)}
  .cinema-topo{display:flex;align-items:center;gap:12px;padding:13px 16px;
               border-bottom:1px solid var(--border)}
  .cinema-topo h3{margin:0;font-family:'Instrument Serif',Georgia,serif;font-style:italic;
                  font-size:1.12rem;color:var(--gold-soft);flex:1;
                  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .cinema-fechar{background:transparent;border:1px solid var(--border);
                 color:var(--dim);border-radius:8px;width:32px;height:32px;
                 cursor:pointer;display:flex;align-items:center;
                 justify-content:center;flex:0 0 auto;transition:color .15s,border-color .15s}
  .cinema-fechar:hover{color:var(--gold-soft);border-color:var(--gold)}
  /* ALTURA DEFINIDA, e nao `flex:1;min-height:0`.
     Com flex-basis:0% dentro de uma caixa de altura automatica, o item
     contribui 0 para a altura do pai, o pai fecha no tamanho do topo + rodape,
     e nao sobra espaco nenhum para o item crescer: a area do mapa ficava com
     0px de altura. O Modo Cinema abria e nao vinha nada dentro.
     Com flex-basis:auto o `height` abaixo E o tamanho base — definido. */
  .cinema-img{flex:1 1 auto;background:var(--input);display:block;
              width:100%;height:min(58vh,460px);min-height:180px}
  .cinema-pe{display:flex;gap:9px;padding:13px 16px;flex-wrap:wrap;
             border-top:1px solid var(--border)}
  .rota-btn{flex:1;min-width:130px;display:flex;align-items:center;
            justify-content:center;gap:8px;height:42px;border-radius:9px;
            border:1px solid var(--border);background:var(--input);
            color:var(--text);text-decoration:none;font-size:.82rem;
            font-family:'Geist',system-ui,sans-serif;
            transition:border-color .16s,color .16s,background .16s}
  .rota-btn:hover{border-color:var(--gold);color:var(--gold-soft)}
  .rota-btn .ic{width:17px;height:17px}
  @media(max-width:640px){
    .mapa-card{max-width:100%}
    .cinema{padding:12px}
    .cinema-pe{flex-direction:column}
    .rota-btn{width:100%}
    /* No celular a bolha dele pode ser mais larga; a resposta do MENTRE ja
       usa a coluna inteira porque nao tem moldura para apertar. */
    .user{max-width:86%}
    .sia{max-width:100%}
  }

  /* ---- Mapa interativo (tiles servidos pelo proprio backend) ---- */
  .mapa-vivo{position:relative;overflow:hidden;background:var(--input);
             touch-action:none;cursor:grab;user-select:none}
  .mapa-vivo.arrastando{cursor:grabbing}
  .mapa-vivo img.tile{position:absolute;left:0;top:0;width:256px;height:256px;
                      pointer-events:none;-webkit-user-drag:none;
                      image-rendering:auto}
  .mapa-vivo canvas.tracado{position:absolute;inset:0;pointer-events:none}
  .mapa-vivo .creditos{position:absolute;right:4px;bottom:3px;z-index:3;
                       font-size:.55rem;font-family:'Geist',system-ui,sans-serif;
                       color:#33404a;background:rgba(255,255,255,.72);
                       padding:1px 5px;border-radius:3px;pointer-events:auto}
  .mapa-vivo .creditos a{color:#33404a;text-decoration:none}
  .mapa-zoom{position:absolute;left:9px;top:9px;z-index:3;display:flex;
             flex-direction:column;gap:4px}
  .mapa-zoom button{width:30px;height:30px;border-radius:7px;cursor:pointer;
                    border:1px solid var(--border);background:var(--panel);
                    color:var(--text);font-size:1.05rem;line-height:1;
                    display:flex;align-items:center;justify-content:center;
                    transition:border-color .15s,color .15s}
  .mapa-zoom button:hover{border-color:var(--gold);color:var(--gold-soft)}
  /* Aviso enquanto os quadradinhos do mapa chegam. Sem ele, um mapa lento era
     indistinguivel de um mapa quebrado. */
  .mapa-vivo .aviso{position:absolute;inset:0;z-index:4;display:none;
                    align-items:center;justify-content:center;gap:9px;
                    background:var(--input);color:var(--dim);
                    font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;font-size:.7rem;
                    letter-spacing:.01em;text-align:center;padding:20px}
  .mapa-vivo.carregando .aviso,.mapa-vivo.falhou .aviso{display:flex}
  .mapa-vivo.falhou .aviso{background:transparent;align-items:flex-start;
                           padding-top:14px;pointer-events:none}

  /* ---- Cartao de PDF ---- */
  .pdf-cartao{display:flex;align-items:center;gap:12px;margin:8px 0 4px;
              background:var(--panel);border:1px solid var(--border);
              border-left:3px solid var(--gold);border-radius:10px;
              padding:11px 13px;max-width:72%}
  .pdf-cartao .selo{width:34px;height:34px;flex:0 0 auto;border-radius:8px;
                    background:color-mix(in srgb,var(--gold) 16%,transparent);
                    display:flex;align-items:center;justify-content:center;
                    color:var(--gold-soft)}
  .pdf-cartao .info{flex:1;min-width:0}
  .pdf-cartao .nome{font-size:.86rem;color:var(--text);white-space:nowrap;
                    overflow:hidden;text-overflow:ellipsis;display:block}
  .pdf-cartao .meta{font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;
                    font-size:.72rem;color:var(--dim);display:block}
  .pdf-acoes{display:flex;gap:6px;flex:0 0 auto}
  .pdf-acoes a,.pdf-acoes button{background:var(--input);border:1px solid var(--border);
      color:var(--text);border-radius:8px;height:34px;padding:0 12px;cursor:pointer;
      display:flex;align-items:center;gap:6px;font-size:.74rem;text-decoration:none;
      font-family:'Geist',system-ui,sans-serif;transition:border-color .16s,color .16s}
  .pdf-acoes a:hover,.pdf-acoes button:hover{border-color:var(--gold);color:var(--gold-soft)}
  @media(max-width:640px){
    .pdf-cartao{max-width:100%;flex-wrap:wrap}
    .pdf-acoes{width:100%}
    .pdf-acoes a,.pdf-acoes button{flex:1;justify-content:center}
  }
  .btn-zap{width:100%;margin-top:8px;display:flex;align-items:center;
           justify-content:center;gap:9px}

  /* ---- Botao + ----
     O giro mora no ICONE, nao no botao. Girar o botao arrastaria a borda e o
     fundo junto, e num retangulo de cantos redondos isso aparece como um
     balanco dentro da barra. */
  .mais-cx{position:relative;flex:0 0 auto}
  #btnMais .ic{transition:transform .34s cubic-bezier(.34,1.4,.5,1)}
  #btnMais.aberto{border-color:var(--gold);color:var(--gold)}
  #btnMais.aberto .ic{transform:rotate(135deg)}
  .mais-menu{position:absolute;bottom:calc(100% + 10px);left:0;z-index:40;
             min-width:208px;padding:6px;border-radius:16px;
             background:var(--panel);border:1px solid var(--border);
             box-shadow:0 14px 38px rgba(0,0,0,.5);
             display:flex;flex-direction:column;gap:2px;
             opacity:0;visibility:hidden;transform:translateY(8px) scale(.97);
             transform-origin:bottom left;
             transition:opacity .2s ease, transform .2s cubic-bezier(.2,.8,.2,1),
                        visibility .2s}
  .mais-menu.aberto{opacity:1;visibility:visible;transform:none}
  .mais-menu button{display:flex;align-items:center;gap:11px;width:100%;
                    padding:11px 12px;border:none;border-radius:11px;
                    background:transparent;color:var(--text);cursor:pointer;
                    font-family:'Geist',system-ui,sans-serif;font-size:.88rem;
                    text-align:left;transition:background .14s,color .14s}
  .mais-menu button:hover{background:var(--input);color:var(--gold-soft)}
  .mais-menu button .ic{width:18px;height:18px;flex:0 0 auto;color:var(--gold-soft)}
  .mais-menu .rotulo{flex:1;min-width:0}
  .mais-menu small{display:block;font-size:.72rem;color:var(--dim);margin-top:1px}
  /* A descricao do modo fica VISIVEL, nao no title.
     No celular nao existe hover: um tooltip ali nunca apareceria, e era
     justamente quem esta no celular marcando faltas que precisava ler "para o
     dia a dia" antes de ligar um modo que gasta 7,5x. */
  .desc-modo{font-size:.68rem;line-height:1.35;opacity:.75;margin-top:3px;
             white-space:normal}
  #btnModoRaciocinio.modo-pro .desc-modo{color:#E0A63C;opacity:.9}

  /* ---- Camera ---- */
  .camera{position:fixed;inset:0;z-index:120;display:none;
          flex-direction:column;background:#000}
  .camera.aberto{display:flex}
  .camera video{flex:1;min-height:0;width:100%;object-fit:cover;background:#000}
  .camera-topo{display:flex;align-items:center;gap:12px;padding:14px 16px;
               background:rgba(0,0,0,.55);color:var(--text)}
  .camera-topo h3{margin:0;flex:1;font-family:'Instrument Serif',Georgia,serif;
                  font-size:1.2rem;color:var(--gold-soft)}
  .camera-pe{display:flex;align-items:center;justify-content:center;
             padding:20px 16px 28px;background:rgba(0,0,0,.55)}
  .obturador{width:68px;height:68px;border-radius:50%;cursor:pointer;
             border:3px solid var(--gold);background:var(--gold-soft);
             transition:transform .12s}
  .obturador:active{transform:scale(.9)}
  .camera-btn{background:transparent;border:1px solid rgba(255,255,255,.35);
              color:#fff;border-radius:999px;padding:9px 15px;cursor:pointer;
              font-family:'Geist',system-ui,sans-serif;font-size:.82rem}
  .camera-btn:hover{border-color:var(--gold);color:var(--gold-soft)}
  /* As guias so aparecem quando um documento e RECONHECIDO no quadro. */
  .camera .guias{position:absolute;inset:76px 22px 132px;pointer-events:none;
                 opacity:0;border-radius:8px;transition:opacity .3s;
                 box-shadow:0 0 0 100vmax rgba(0,0,0,.32)}
  .camera.documento .guias{opacity:1}
  .camera .guias i{position:absolute;width:28px;height:28px;border:2px solid var(--gold)}
  .camera .guias i:nth-child(1){top:-2px;left:-2px;border-right:0;border-bottom:0}
  .camera .guias i:nth-child(2){top:-2px;right:-2px;border-left:0;border-bottom:0}
  .camera .guias i:nth-child(3){bottom:-2px;left:-2px;border-right:0;border-top:0}
  .camera .guias i:nth-child(4){bottom:-2px;right:-2px;border-left:0;border-top:0}
  .selo-doc{position:absolute;top:78px;left:0;right:0;margin:0 auto;width:max-content;
            display:flex;align-items:center;gap:7px;padding:6px 14px;
            border-radius:999px;background:rgba(11,17,23,.82);
            border:1px solid var(--gold);color:var(--gold-soft);
            font-family:'Geist',system-ui,sans-serif;font-size:.78rem;
            opacity:0;transform:translateY(-6px);transition:opacity .3s,transform .3s;
            pointer-events:none}
  .camera.documento .selo-doc{opacity:1;transform:none}

  /* Provas em vermelho cheio, com destaque. */
  .card.card-prova{background:linear-gradient(90deg,rgba(239,68,68,.10),var(--sup-1) 55%)}

  /* ---- Configuracoes ---- */
  .overlay{position:fixed;inset:0;background:rgba(3,7,10,.68);display:none;
           align-items:center;justify-content:center;z-index:100;
           -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}
  .overlay.aberto{display:flex}
  .overlay.aberto .modal{animation:modalAbre .2s cubic-bezier(.2,.8,.2,1)}
  @keyframes modalAbre{from{opacity:0;transform:translateY(8px) scale(.985)}to{opacity:1;transform:none}}
  html.sem-animacao .overlay.aberto .modal{animation:none}
  .modal{background:var(--sup-1);border:1px solid var(--linha);border-radius:18px;
         padding:0 24px 22px;width:min(480px,92vw);max-height:88vh;overflow-y:auto;
         box-shadow:0 28px 70px rgba(0,0,0,.55)}
  .modal-memorias{padding-top:22px}
  .modal::-webkit-scrollbar{width:6px}
  .modal::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}
  /* Cabecalho preso no topo, com botao de fechar: antes o unico jeito de sair
     era achar o "Fechar" no meio do formulario, ou clicar fora. */
  .modal-cab{position:sticky;top:0;z-index:2;display:flex;align-items:flex-start;justify-content:space-between;
             gap:12px;margin:0 -24px 4px;padding:22px 24px 16px;background:var(--sup-1);
             border-bottom:1px solid var(--linha)}
  .modal-cab .dica{margin:4px 0 0;font-size:.84rem}
  .modal-fechar{flex:0 0 auto;width:34px;height:34px;border-radius:50%;border:1px solid var(--linha);
                background:transparent;color:var(--txt-2);cursor:pointer;display:inline-flex;
                align-items:center;justify-content:center;transition:background .15s,color .15s,border-color .15s}
  .modal-fechar:hover{background:var(--sup-3);color:var(--text);border-color:var(--border)}
  .modal-fechar:focus-visible{outline:2px solid var(--gold-soft);outline-offset:2px}
  .modal h2{font-family:'Instrument Serif',Georgia,serif;font-weight:400;margin:0 0 4px;font-size:1.75rem;line-height:1.1}
  .modal-cab h2{margin:0}
  .modal label{display:block;font-size:.82rem;font-weight:600;color:var(--text);margin:24px 0 8px;
               font-family:'Geist',system-ui,sans-serif;letter-spacing:0}
  .modal input,.modal select,.modal textarea{width:100%;background:var(--bg);color:var(--text);
         border:1px solid var(--border);border-radius:10px;padding:11px 12px;font-size:.9rem;
         transition:border-color .15s,box-shadow .15s}
  .modal textarea{font-family:inherit;resize:vertical;min-height:72px;line-height:1.5}
  .modal input:focus,.modal select:focus,.modal textarea:focus{outline:none;border-color:var(--gold);
         box-shadow:0 0 0 3px rgba(176,141,87,.12)}
  .modal .linha-btn{display:flex;gap:8px;margin-top:26px}
  .btn-ouro{background:var(--gold);color:var(--bg);border:none;border-radius:10px;min-height:42px;
            padding:10px 18px;cursor:pointer;font:inherit;font-size:.88rem;font-weight:600;flex:1;transition:background .15s}
  .btn-ouro:hover{background:var(--gold-soft)}
  .btn-vazio{background:transparent;color:var(--text);border:1px solid var(--border);min-height:42px;
             border-radius:10px;padding:10px 18px;cursor:pointer;font:inherit;font-size:.88rem;
             transition:border-color .15s,color .15s,background .15s}
  .btn-vazio:hover{border-color:var(--gold-soft);color:var(--gold-soft)}
  .btn-sair{color:#e38b88;border-color:rgba(227,139,136,.4)}
  .btn-sair:hover{color:#f0a3a0;border-color:#e38b88}
  /* Mais enfatico que o "Encerrar sessao": aqui os dados somem de verdade,
     entao o botao precisa parecer mais serio que um logout comum — mas
     sem gritar feito um alerta de sistema operacional. */
  .btn-perigo{color:#e38b88;border-color:rgba(227,139,136,.4);background:transparent}
  .btn-perigo:hover{background:#a34a4a;color:var(--text);border-color:#a34a4a}
  .hr{height:1px;background:var(--linha);margin:24px 0}

  .modal-memorias{width:min(480px,92vw)}
  .lista-memorias{display:flex;flex-direction:column;gap:6px;max-height:50vh;overflow-y:auto;margin-top:4px}
  .lista-memorias .vazio{color:var(--dim);font-size:.88rem;padding:20px 4px;text-align:center}
  .item-memoria{display:flex;gap:10px;align-items:center;padding:10px 12px;
                 background:var(--input);border:1px solid var(--border);border-radius:8px}
  .item-memoria span{flex:1;font-size:.88rem;line-height:1.4}
  .item-memoria button{flex-shrink:0;width:26px;height:26px;border-radius:50%;
                 background:transparent;border:1px solid var(--border);color:var(--dim);
                 cursor:pointer;font-size:.85rem;line-height:1;display:flex;align-items:center;justify-content:center}
  .item-memoria button:hover{border-color:#a34a4a;color:#a34a4a}

  /* Nota de confianca, e nao alerta: embaixo das sugestoes, sem caixa. Numa
     caixa dourada no topo, com cadeado de emoji, ela lia como aviso de risco
     antes mesmo do "Boa noite". */
  .aviso-privacidade{display:flex;align-items:flex-start;justify-content:center;gap:8px;
    max-width:560px;margin:22px auto 8px;padding:0 16px;
    font-size:.76rem;line-height:1.5;color:var(--dim);text-align:left}
  .aviso-privacidade .ic{flex:0 0 auto;width:15px;height:15px;color:var(--gold-soft);margin-top:1px}
  .aviso-privacidade b{color:var(--txt-2);font-weight:600}
  .selo-local{display:none;align-items:center;gap:6px;font-size:.68rem;
    font-family:'Geist',system-ui,sans-serif;font-variant-numeric:tabular-nums;color:var(--gold-soft);
    background:var(--panel);border:1px solid var(--border);
    border-radius:14px;padding:3px 10px;margin-left:10px}
  .selo-local.ativo{display:inline-flex}
  .selo-local .pin{width:7px;height:7px;border-radius:50%;background:var(--gold);
    animation:respira 2s infinite}
  .modal .explica{font-size:.76rem;color:var(--dim);line-height:1.55;margin-top:8px}
  /* Link dentro da explicacao: no azul padrao do navegador, sublinhado, era o
     unico elemento do app fora da paleta. */
  .modal .explica a{color:var(--gold-soft);text-decoration:none;border-bottom:1px solid rgba(209,171,116,.4)}
  .modal .explica a:hover{color:var(--gold);border-bottom-color:var(--gold)}
  /* Rodape legal: existe, mas nao compete com mais nada no modal — por
     isso vem por ultimo, sem fundo, com o mesmo peso visual do eyebrow
     do cabecalho. */
  .rodape-legal{margin-top:18px;text-align:center;font-size:.68rem;
    letter-spacing:.02em;color:var(--dim);opacity:.7}
  .rodape-legal a{color:var(--dim);text-decoration:none}
  .rodape-legal a:hover{color:var(--gold-soft);text-decoration:underline}
  .rodape-legal span{margin:0 8px;opacity:.6}
  .switch{display:flex;align-items:center;gap:12px;background:var(--bg);
    border:1px solid var(--linha);border-radius:10px;padding:12px 14px}
  /* Chave de verdade no lugar da caixinha branca nativa, que era o unico
     controle do app desenhado pelo navegador do jeito dele. */
  .switch input{-webkit-appearance:none;appearance:none;flex:0 0 auto;position:relative;cursor:pointer;
    width:40px;height:24px;margin:0;padding:0;border-radius:999px;background:var(--sup-3);
    border:1px solid var(--border);transition:background .18s,border-color .18s}
  .switch input::before{content:'';position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;
    background:var(--txt-2);transition:transform .18s cubic-bezier(.2,.8,.2,1),background .18s}
  .switch input:checked{background:var(--gold);border-color:var(--gold)}
  .switch input:checked::before{transform:translateX(16px);background:var(--bg)}
  .switch input:focus{box-shadow:none;border-color:var(--border)}
  .switch input:checked:focus{border-color:var(--gold)}
  .switch input:focus-visible{outline:2px solid var(--gold-soft);outline-offset:2px}
  .modal .switch label{font-weight:400;flex:1}
  .selo-breve{margin-left:auto;flex:0 0 auto;font-size:.72rem;font-weight:500;color:var(--gold-soft);
    background:var(--ouro-tinta);border-radius:999px;padding:3px 9px}
  /* avisos temporarios */
  /* O cabecalho tem ~91px de altura; com top:70px os avisos nasciam POR CIMA
     dele. calc() a partir do safe-area resolve os dois casos de uma vez:
     desce o suficiente para limpar o header e ainda respeita o notch quando
     o app roda instalado no iPhone. */
  #toasts{position:fixed;top:calc(96px + env(safe-area-inset-top));right:20px;
          z-index:200;display:flex;flex-direction:column;gap:8px;max-width:320px}
  .toast{display:flex;align-items:center;gap:10px;background:var(--sup-2);border:1px solid var(--linha);
         border-radius:12px;padding:11px 14px 11px 12px;font-size:.84rem;line-height:1.4;
         box-shadow:0 12px 32px rgba(0,0,0,.4);animation:surge .2s ease-out;transition:opacity .3s}
  .toast::before{content:'';flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--gold)}
  .toast.erro::before{background:#e0524f}
  .toast.ok::before{background:var(--success)}
  /* Faixa de "sem conexao". Fixa no topo, acima de tudo, e some sozinha
     quando a rede volta — o usuario precisa saber POR QUE o app parou de
     responder, senao ele conclui que o app quebrou. */
  #avisoOffline{position:fixed;top:0;left:0;right:0;z-index:400;
                background:#a34a4a;color:#fff;text-align:center;
                font-size:.8rem;letter-spacing:.02em;
                padding:calc(6px + env(safe-area-inset-top)) 12px 6px;
                transform:translateY(-100%);transition:transform .25s ease-out}
  #avisoOffline.visivel{transform:translateY(0)}
  /* A faixa e fixa, entao sem isto ela ficaria POR CIMA do cabecalho e
     cobriria a marca. Empurrar o app para baixo pela mesma altura mantem
     tudo legivel enquanto ela estiver no ar. */
  body.offline #app{padding-top:34px}
  body.offline #avisoOffline{padding-top:calc(6px + env(safe-area-inset-top))}
  /* Selo na propria bolha: o usuario ve QUAL mensagem ficou para tras, em
     vez de so um aviso geral de "sem conexao". */
  .selo-pendente{display:block;margin-top:6px;font-size:.62rem;letter-spacing:.03em;
                 text-transform:uppercase;color:var(--gold-soft);opacity:.75}
  .selo-pendente::before{content:'';display:inline-block;width:5px;height:5px;
                 border-radius:50%;background:currentColor;margin-right:6px;
                 vertical-align:middle;animation:pulsaPendente 1.6s ease-in-out infinite}
  @keyframes pulsaPendente{50%{opacity:.25}}
  html.sem-animacao .selo-pendente::before{animation:none}
  /* Carregando: a bussola sozinha, centralizada, sem balao nem palavra. */
  .carregando-chat{display:flex;justify-content:center;align-items:center;
                   gap:10px;
                   background:none;border:none;padding:10px 0;margin-bottom:12px}
  .mini-bussola{flex-shrink:0;opacity:.85}
  /* Legenda do que esta sendo feito. Discreta de proposito: informa sem
     roubar a atencao do texto que ja comecou a aparecer acima dela. */
  .legenda-passo{font-size:.78rem;color:var(--dim);opacity:.85;
                 letter-spacing:.01em;min-height:1em}
  .legenda-passo.entrando{animation:legendaEntra .28s ease-out}
  @keyframes legendaEntra{
    from{opacity:0;transform:translateY(3px)}
    to{opacity:.85;transform:none}
  }
  html.sem-animacao .legenda-passo.entrando{animation:none}
  /* Bolhas de capacidades: chips clicaveis numa conversa vazia, cada uma
     ja e uma mensagem pronta — mostrar fazendo em vez de explicar. */
  /* Grade de cartoes do mesmo tamanho. Como pilulas centralizadas, cada uma
     tinha a largura do proprio texto e a pilha saia em escadinha. */
  .bolhas-capacidades{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;
                       max-width:640px;margin:26px auto 4px}
  .bolha-capacidade{display:flex;align-items:flex-start;gap:12px;text-align:left;background:var(--sup-1);
         border:1px solid var(--linha);border-radius:14px;padding:14px 16px;
         color:var(--text);font-size:.86rem;line-height:1.4;font-family:inherit;cursor:pointer;
         transition:border-color .15s,background .15s,transform .12s}
  .bolha-capacidade:hover{border-color:rgba(209,171,116,.5);background:var(--sup-2)}
  .bolha-capacidade:active{transform:scale(.99)}
  .bolha-capacidade:focus-visible{outline:2px solid var(--gold-soft);outline-offset:2px}
  .bolha-capacidade .ic{width:18px;height:18px;flex-shrink:0;color:var(--gold-soft);margin-top:1px}
  @media (max-width:560px){.bolhas-capacidades{grid-template-columns:1fr;margin-top:20px}}

  /* Saudacao de boas-vindas. O MENTRE faz muita coisa, e uma tela vazia com
     um campo de texto nao conta nada disso — a pessoa fica sem saber o que
     pedir e conclui que e "mais um chat". */
  .saudacao{max-width:640px;margin:12vh auto 4px;text-align:center;padding:0 8px}
  .saudacao h2{font-family:'Instrument Serif',Georgia,serif;font-weight:400;
               font-size:clamp(2rem,4.2vw,2.75rem);line-height:1.1;margin:0 0 14px;color:var(--text);text-wrap:balance}
  .saudacao p{font-size:.95rem;line-height:1.6;color:var(--txt-2);margin:0 auto 4px;max-width:54ch;text-wrap:pretty}
  .saudacao .dica{font-size:.78rem;color:var(--dim);opacity:.75;margin-top:12px}
  /* Depois da primeira vez: uma pergunta so, no meio da tela vazia. */
  /* A data (do relogio dele, dado real) em cima, e a pergunta em tamanho de
     titulo. Pequena e cinza no meio do vazio, ela lia como placeholder
     esquecido, e nao como o app falando com ele. */
  .inicio-limpo{max-width:620px;margin:19vh auto 0;text-align:center;padding:0 16px;
                animation:surge .4s cubic-bezier(.2,.8,.2,1)}
  .inicio-limpo .inicio-data{margin:0 0 12px;font-size:.82rem;color:var(--gold-soft);letter-spacing:.02em}
  .inicio-limpo h2{font-family:'Instrument Serif',Georgia,serif;font-weight:400;
                   font-size:clamp(2rem,4.2vw,2.75rem);line-height:1.1;margin:0;color:var(--text);text-wrap:balance}
  html.sem-animacao .inicio-limpo{animation:none}
  .nota-interrompida{font-size:.75rem;color:var(--dim);opacity:.8;margin:2px 0 10px 4px}
  .cancelar-envio{margin-left:10px;background:transparent;border:1px solid var(--border);
    color:var(--dim);border-radius:999px;padding:3px 12px;font:inherit;font-size:.75rem;cursor:pointer}
  .cancelar-envio:hover{color:var(--gold-soft);border-color:var(--gold)}

  /* Opcoes guiadas que o MENTRE oferece no meio da conversa. Mesma linguagem
     visual das bolhas de capacidade, mas alinhadas a esquerda porque
     pertencem a UMA resposta, e nao a tela toda. */
  .opcoes-guiadas{margin:2px 0 14px;max-width:min(560px,100%)}
  .opcoes-guiadas .titulo{font-size:.76rem;color:var(--dim);margin:0 0 8px;
                          letter-spacing:.02em}
  .opcoes-guiadas .lista{display:flex;flex-wrap:wrap;gap:7px}
  .opcao-guiada{display:inline-flex;align-items:center;gap:7px;text-align:left;
        background:var(--panel);border:1px solid var(--border);border-radius:18px;
        padding:9px 15px;color:var(--text);font-size:.82rem;font-family:inherit;
        cursor:pointer;line-height:1.35;
        transition:border-color .15s,color .15s,background .15s}
  .opcao-guiada:hover{border-color:var(--gold);color:var(--gold-soft)}
  .opcao-guiada:active{transform:scale(.98)}
  .opcao-guiada.outro{border-style:dashed;color:var(--dim)}
  .opcoes-guiadas.usada{opacity:.5;pointer-events:none}

  /* --- Tutorial em bolhas -------------------------------------------
     Estilo tutorial de jogo: em vez de despejar tudo que o MENTRE faz num
     texto de cinco paragrafos que ninguem le, cada recurso se apresenta na
     PRIMEIRA vez que a pessoa chega perto dele. Uma dica por vez, ancorada
     no proprio elemento, e nunca de novo depois de lida. */
  .dica-tutorial{
    position:fixed;z-index:500;max-width:min(310px,calc(100vw - 28px));
    background:var(--panel);border:1px solid var(--gold);border-radius:12px;
    padding:14px 16px;box-shadow:0 10px 34px rgba(0,0,0,.5);
    animation:dicaEntra .22s ease-out}
  @keyframes dicaEntra{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
  html.sem-animacao .dica-tutorial{animation:none}
  .dica-tutorial h4{margin:0 0 5px;font-size:.86rem;font-weight:600;color:var(--gold-soft)}
  .dica-tutorial p{margin:0;font-size:.82rem;line-height:1.5;color:var(--text)}
  .dica-tutorial .pe{display:flex;justify-content:space-between;align-items:center;
                     gap:12px;margin-top:12px}
  .dica-tutorial .passo{font-size:.68rem;color:var(--dim);
                        font-variant-numeric:tabular-nums;letter-spacing:.04em}
  .dica-tutorial button{background:var(--gold);color:var(--bg);border:none;
    border-radius:16px;padding:7px 16px;font-size:.78rem;font-weight:600;
    font-family:inherit;cursor:pointer;min-height:32px}
  .dica-tutorial button:active{transform:scale(.97)}
  /* Anel no elemento que a dica esta explicando: liga o texto ao objeto sem
     escurecer a tela inteira, que seria pesado para uma dica de uma linha. */
  .alvo-tutorial{position:relative;z-index:501;
    box-shadow:0 0 0 2px var(--gold),0 0 0 8px rgba(212,175,55,.16);
    border-radius:12px}
  @media (max-width:480px){
    .opcao-guiada{width:100%;justify-content:flex-start}
  }
  /* A casca do app e position:fixed (ve a secao CASCA FIXA), entao a tela de
     login precisa do proprio scroll — senao a vitrine abaixo do botao ficaria
     inalcancavel. */
  #login{text-align:center;height:100%;overflow-y:auto;overscroll-behavior:contain;
         padding:clamp(28px,7vh,72px) 20px calc(40px + env(safe-area-inset-bottom))}

  /* ---------- Vitrine da tela de entrada ---------- */
  .vitrine{
    display:grid;grid-template-columns:1fr 1fr;gap:26px;
    max-width:900px;margin:44px auto 0;text-align:left;align-items:start}
  .vitrine-col{min-width:0}
  .vitrine-titulo{
    font-family:'Instrument Serif',Georgia,serif;font-weight:400;
    font-size:1.5rem;line-height:1.1;margin:0 0 4px;color:var(--gold-soft)}
  .vitrine-sub{font-size:.78rem;color:var(--dim);margin:0 0 16px}

  .capacidades{display:flex;flex-direction:column;gap:7px}
  /* Cada capacidade e um <details>: abre e fecha sem uma linha de JS, funciona
     com teclado e leitor de tela de graca, e continua funcionando se o script
     falhar — nesta tela, que e a primeira coisa que um visitante ve, isso
     importa mais do que em qualquer outra. */
  .cap{
    background:var(--panel);border:1px solid var(--border);border-radius:12px;
    overflow:hidden;transition:border-color .16s}
  .cap[open]{border-color:var(--gold)}
  .cap > summary{
    list-style:none;cursor:pointer;padding:12px 14px;display:flex;
    align-items:center;gap:11px;font-size:.88rem;color:var(--text);
    min-height:46px}
  .cap > summary::-webkit-details-marker{display:none}
  .cap > summary:hover{color:var(--gold-soft)}
  .cap > summary .ic{width:17px;height:17px;flex-shrink:0;color:var(--gold)}
  .cap > summary .seta{
    margin-left:auto;flex-shrink:0;color:var(--dim);font-size:.7rem;
    transition:transform .18s}
  .cap[open] > summary .seta{transform:rotate(90deg);color:var(--gold)}
  .cap-corpo{
    padding:0 14px 14px 42px;font-size:.83rem;line-height:1.62;color:var(--dim);
    animation:capAbre .18s ease-out}
  .cap-corpo b{color:var(--text);font-weight:600}
  @keyframes capAbre{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
  html.sem-animacao .cap-corpo{animation:none}
html.sem-animacao .cap[open] > summary .seta{transition:none}

  .tutorial-visual{
    margin:0 0 16px;background:var(--panel);border:1px solid var(--border);
    border-radius:12px;overflow:hidden;line-height:0}
  .tutorial-visual img{width:100%;height:auto;display:block}

  .passos-instalar{display:flex;flex-direction:column;gap:12px}
  .passo-so{
    background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:13px 15px}
  .passo-so h4{
    margin:0 0 7px;font-size:.76rem;font-weight:600;color:var(--gold-soft);
    letter-spacing:.04em;text-transform:uppercase}
  .passo-so ol{margin:0;padding-left:18px;font-size:.82rem;line-height:1.6;color:var(--dim)}
  .passo-so li{margin-bottom:3px}
  .passo-so b{color:var(--text);font-weight:600}
  .nota-instalar{font-size:.76rem;color:var(--dim);opacity:.8;margin:12px 0 0;line-height:1.55}

  .rodape-vitrine{
    max-width:900px;margin:34px auto 0;font-size:.74rem;color:var(--dim);opacity:.7}
  .rodape-vitrine a{color:var(--dim);text-decoration:none;border-bottom:1px solid var(--border)}
  .rodape-vitrine a:hover{color:var(--gold-soft);border-color:var(--gold)}

  @media (max-width:768px){
    /* Uma coluna: em 375px, duas colunas dariam 170px cada e nenhum dos dois
       lados seria legivel. As capacidades vem primeiro — e o que responde
       "por que eu instalaria isso?". */
    .vitrine{grid-template-columns:1fr;gap:30px;margin-top:34px}
  }
  #botoesLogin{display:flex;flex-direction:column;align-items:center;gap:14px;margin-top:28px}
  #botoesLogin a{padding:12px 28px;border-radius:12px;
           text-decoration:none;font-weight:600;display:inline-block;min-width:220px}
  #botoesLogin a:not(.btn-login-google){background:transparent;color:var(--gold-soft);
           border:1px solid var(--gold)}
  /* Botao do Google no dourado do app, nao no branco oficial do Google —
     o "G" mantem as quatro cores dele (recolorir o logo e desaconselhado
     pelas guidelines da marca), mas dentro de um selo branco: preserva o
     simbolo reconhecivel sem quebrar a linguagem visual do MENTRE. */
  .btn-google-oficial{
    background:var(--gold); color:var(--bg); border:1px solid var(--gold);
    display:inline-flex!important; align-items:center; justify-content:center; gap:12px;
    min-width:280px; padding:9px 26px 9px 9px; font-size:.95rem; letter-spacing:.01em;
    font-weight:600; box-shadow:0 4px 14px rgba(176,141,87,.3);
    transition:filter .15s ease, transform .1s ease;
  }
  .btn-google-oficial:hover{filter:brightness(1.08)}
  .btn-google-oficial:active{transform:translateY(1px)}
  .btn-google-oficial .selo-google{
    width:34px;height:34px;border-radius:50%;background:#fff;flex-shrink:0;
    display:flex;align-items:center;justify-content:center;
  }
  .btn-google-oficial .selo-google svg{width:19px;height:19px}

  /* ==================================================================
     MOBILE — o app precisa parecer nativo no celular, nao um site
     espremido.

     Antes desta secao havia apenas tres media queries (700px e 640px) e
     nenhuma delas tocava no cabecalho, no nav, no rodape ou no main. O
     resultado, medido num iPhone de 375px: a pagina inteira ficava com
     751px de largura — o DOBRO da tela. O <nav> comecava em x=368, ou
     seja, Agenda, Documentos e Configuracoes ficavam INTEIRAMENTE fora
     da tela, sem nem barra de rolagem que denunciasse. O campo de
     digitacao era cortado no meio e o botao de enviar nao existia para
     quem estava no celular.

     A regra geral aqui: nada de largura fixa, tudo que e linha pode
     quebrar, e todo elemento colado numa borda respeita o safe-area do
     aparelho (o recorte da camera em cima, a barra de gestos embaixo).
     ================================================================== */

  /* Rede de seguranca: se QUALQUER coisa voltar a vazar na horizontal, a
     pagina nao rola de lado — o vazamento vira um bug visivel de layout,
     em vez de uma aba que some sem explicacao. */
  /* [hidden] TEM que ganhar de qualquer display.
     A folha do navegador aplica `[hidden]{display:none}` com especificidade de
     seletor de atributo — e QUALQUER regra de classe que declare `display`
     vence dela. Foi o que aconteceu com `.mais-menu button{display:flex}`:
     esconderRecurso() marcava hidden=true e o botao de Raciocinio continuava
     na tela, entao o Estudante (que nao tem raciocinio profundo nem modo Pro)
     via um botao que nao deveria existir para ele.
     Sem !important a regra abaixo empataria com as outras e perderia pela
     ordem — e esconder algo e sempre mais importante que o layout dele. */
  [hidden]{display:none !important}

  html,body{max-width:100%;overflow-x:hidden}

  /* ==================================================================
     CASCA FIXA — cabecalho e rodape nunca se mexem.

     O layout ja era flex com overflow:hidden no body, o que em teoria basta.
     Na pratica, no celular, nao bastava: ao arrastar o chat alem do fim, o
     navegador aplicava o "rubber-band" na PAGINA INTEIRA e levava cabecalho e
     barra de digitacao junto. E cada vez que isso acontece o app se denuncia
     como site — que e exatamente a sensacao que queremos eliminar.

     position:fixed com inset:0 tira o documento do fluxo de rolagem: nao
     existe mais pagina para arrastar, so o <main> rola por dentro.
     overscroll-behavior:none mata o efeito elastico e, de quebra, o
     "puxar para recarregar" do Android — que num PWA de chat so serve para
     recarregar sem querer no meio de uma conversa.
     ================================================================== */
  html{overscroll-behavior:none}
  body{position:fixed;inset:0;overscroll-behavior:none}
  /* `none`, e nao `contain`.
     `contain` so impede a rolagem de VAZAR para o elemento de tras; o efeito
     elastico DENTRO do proprio <main> continua valendo. E ele o "recoil" que
     os testers relatam numa conversa longa: puxar para baixo no topo estica o
     conteudo e o solta de volta com um tranco que parece a tela sendo puxada
     para cima. `none` remove o elastico tambem, que e o comportamento de app
     nativo — a lista simplesmente para na borda.
     -webkit-overflow-scrolling saiu junto: e o que liga o momentum do iOS
     antigo, e e o momentum que alimenta o estica-e-volta. O Safari moderno ja
     rola suave sem ele. */
  main{overscroll-behavior:none}
  /* pan-y: permite rolar na vertical e mata o resto — duplo toque para zoom,
     pinca e o arrasto horizontal que dispara "voltar pagina" no Android. */
  main,body{touch-action:pan-y}
  header,footer{flex-shrink:0}

  /* 100dvh acompanha a barra de endereco do Safari no iOS, que aparece e
     some conforme voce rola; com 100vh o rodape fica escondido abaixo da
     dobra justamente quando o teclado abre. A linha do 100vh fica antes
     como reserva para navegador antigo. */
  body{height:100vh;height:100dvh}
  /* No app INSTALADO nao ha barra de endereco para o dvh acompanhar, e com
     viewport-fit=cover algumas versoes do iOS calculam 100dvh sem a faixa da
     barra de gestos — a casca termina antes da borda e sobra uma faixa morta
     abaixo do rodape que nenhum padding consegue tirar. Sem altura explicita,
     o position:fixed + inset:0 ja estica o body ate a borda real da tela. */
  /* PWA INSTALADO NO iPHONE: a casca vai ate a borda FISICA da tela.

     Medido no aparelho (iOS 18.7, via /api/diag/layout): tela de 844pt,
     innerHeight de 797pt, safe-area-inset-top de 47pt. Com a status bar
     black-translucent o WebKit posiciona a pagina a partir do topo fisico —
     por baixo do relogio — mas desconta a altura dessa barra do tamanho da
     pagina. Os ultimos 47pt embaixo ficam FORA do documento e o iOS pinta de
     preto: era a faixa morta abaixo da barra de digitar.

     Por isso tres rodadas de ajuste de padding nao mudaram nada: elas mexiam
     na barra dentro dos 797pt, e a faixa estava fora deles. A casca passa a
     medir a pagina + o que falta ate a borda. --falta-tela vem MEDIDA pelo
     script do <head> (tela fisica - innerHeight), so no iPhone/iPad instalado
     e so ate 64pt; em qualquer outro caso vale 0 e esta regra nao muda nada.
     Nao da para usar 100vh + env(): o WebKit nao garante o que 100vh vale em
     standalone, e errar para mais empurraria a barra para fora da tela. */
  /* SEGUNDA TENTATIVA (a primeira esticou o body e piorou: a barra de digitar
     passou a ser cortada pela faixa). O iOS RECORTA todo elemento
     position:fixed na altura errada de 797pt — e o body aqui e fixed. Esticar
     o body so empurrou a barra para dentro do corte.

     O que funciona, documentado em outros PWAs com exatamente este defeito: o
     DOCUMENTO cresce (html com a altura medida) e o que precisa chegar a borda
     deixa de ser fixed. O body vira absolute sobre o html, com a mesma altura;
     o ceu e as janelas, absolute sobre o body. So com a classe ios-faixa, que
     o <head> liga quando mediu falta maior que zero; nos outros aparelhos nada
     disto existe. A rolagem de 47pt que o documento maior ganharia e travada
     no mesmo script. */
  html.ios-faixa{position:relative;height:calc(100% + var(--falta-tela, 0px))}
  html.ios-faixa body{position:absolute;top:0;right:0;bottom:auto;left:0;height:100%}

  /* --- ABAS EM ICONE ------------------------------------------------
     Em 375px a fila escrita (Diálogo + Agenda + Documentos = ~246px) mais a
     marca (~143px) dava 417px numa tela de 375: a primeira aba ficava atras
     do "MENTRE". Em icone a fila cai para 132px e sobra folga de verdade.
     O rotulo nao some da acessibilidade — vira aria-label/title no proprio
     botao, que aplicarIdioma() mantem traduzido. */
  @media (max-width:700px){
    /* O ICONE e que sai, nao o nome.
       Eu tinha feito ao contrario — icone no celular, rotulo so no aria-label
       — e o pedido era justamente ver "Chat", "Agenda" e "Docs" escritos. Os
       nomes foram encurtados exatamente para caberem: a fila escrita ocupa
       ~150px contra os 246px de "Diálogo/Agenda/Documentos", que era o que
       nao cabia em 375px. */
    nav button .ic{display:none}
    nav button{padding:0 9px;font-size:.78rem;font-weight:600}
  }

  @media (max-width:768px){
    /* --- CABECALHO --------------------------------------------------
       Vira duas linhas: marca em cima, navegacao embaixo. Empilhar e o
       unico jeito honesto — logo + titulo + 4 botoes nao cabem lado a
       lado em 375px sem virar tudo ilegivel. */
    /* UMA linha: bussola + MENTRE + as tres abas. O nav nao quebra mais para
       baixo — ele encolhe e, no limite, rola de lado. Cada linha a menos aqui
       e uma linha a mais de conversa. */
    header{flex-wrap:nowrap;gap:6px;
           padding:calc(6px + env(safe-area-inset-top)) 8px 6px}
    .marca-header{flex:0 0 auto;min-width:0;gap:8px}
    /* Some no celular: e um easter egg decorativo (ve o comentario da
       propria classe) e aqui custaria uma linha inteira de altura. */
    .eyebrow{display:none}
    /* A MARCA OCUPA O BURACO DO MEIO.
       Medido em 390px: a marca terminava em x=190 e as abas comecavam em 238
       — 48px de espaco morto no meio, enquanto a direita ja estava no limite
       (8px). Nao dava para empurrar as abas; dava para a marca crescer ate
       elas. O nome do produto merece esse espaco mais do que o vazio merece.

       Ainda "mais larga, nao mais alta": a altura do cabecalho e ditada pelos
       botoes de aba (44px), entao a bussola cresce ate 44 sem empurrar nada, e
       o resto do ganho vem do entreletras, que alonga na horizontal. */
    header h1{font-size:1.2rem;letter-spacing:.12em;margin-right:-.12em}
    /* `svg.logo-mentre` e nao `.logo-mentre`: a regra de tamanho la em cima e
       type+classe (0,1,1) e ganhava desta aqui, que era so classe (0,1,0). Na
       pratica a bussola continuava com 66px no celular — o cabecalho media
       79px de altura em vez de 56, e os 36px de largura a mais eram o que
       empurrava a fila de abas para fora da tela. */
    :root{--logo:40px}


    /* `flex:0 0 auto` e nao `1 1 auto`: o nav agora tem a largura do proprio
       conteudo e o margin-left:auto cola ele na direita. Com `justify-content:
       flex-end` num container que rola, o que transborda vaza pelo INICIO —
       inalcancavel — e era por isso que "Diálogo" sumia atras de MENTRE em vez
       de dar qualquer sinal de que existia. */
    nav{flex:0 0 auto;margin-left:auto;justify-content:flex-start;gap:0;padding:3px}
    nav button{padding:0 10px;height:36px;flex:0 0 auto;white-space:nowrap}

    /* --- CORPO ------------------------------------------------------ */
    main{padding:16px 14px}

    /* A lateral SOBREPOE em vez de empurrar. Empurrando, os 250px dela
       deixavam 125px para o conteudo — a conversa virava uma coluna
       ilegivel. */
    .corpo{position:relative}
    #lateral{position:absolute;top:0;bottom:0;left:0;z-index:120;
             box-shadow:8px 0 24px rgba(0,0,0,.45)}
    #lateral.aberta{width:min(84vw,290px)}
    #lateral .cx{width:min(84vw,290px)}

    /* --- RODAPE -----------------------------------------------------
       Duas linhas: acoes em cima, digitacao embaixo. O campo e o botao de
       enviar ficam na linha de baixo de proposito — e a mais perto do
       polegar e do teclado quando ele abre. */
    /* Sem repetir o padding-bottom aqui: esta regra vinha DEPOIS da de cima e
       ganhava dela, e como ela nao mencionava var(--teclado), o rodape parava
       de subir quando o teclado abria — justamente no aparelho onde isso
       importa. Agora so as laterais mudam no celular. */
    footer{padding-left:12px;padding-right:12px;padding-top:6px}

    /* A barra ja e uma linha so em qualquer largura (ve BARRA DE ENTRADA).
       No celular resta garantir o essencial do teclado: 16px no campo, que e
       o limite abaixo do qual o Safari do iOS amplia a pagina inteira ao
       focar — e a pagina "pulando" no primeiro toque le como app quebrado. */
    .barra input[type=text]{font-size:16px;height:44px;padding:10px 6px}
    .acao{width:44px;height:44px}
    .barra{padding:3px}

    /* --- LISTAS (Agenda/Documentos) ---------------------------------
       Sem min-width:0 o bloco de titulo se recusa a encolher e empurra os
       botoes de acao para fora do cartao. */
    .card{flex-wrap:wrap;gap:8px}
    .card > div:not(.acoes){min-width:0;flex:1 1 0}
    .card .acoes{flex:1 1 100%;justify-content:flex-end}
    .card:nth-child(even){margin-left:0}

    #toasts{top:auto;bottom:calc(90px + env(safe-area-inset-bottom));
            right:12px;left:12px;max-width:none}
  }

  /* Telas estreitas: 380px e abaixo (Android popular, iPhone SE).
     A marca cheia ocupa 151px e, somada aos 144px das abas, ao botao do menu e
     aos respiros, estoura 360: medido, "Docs" ficava cortado por 1px em 360 e
     por 41px em 320. Quem encolhe e o NOME — aba cortada e funcao perdida,
     marca menor e so marca menor.
     Esta query vem DEPOIS da de 768px de proposito: as duas casam em telas
     pequenas, e a ultima a aparecer vence no empate de especificidade. */
  @media (max-width:380px){
    :root{--logo:36px}
    header h1{font-size:1.16rem;letter-spacing:.08em}
    header{gap:5px;padding-left:6px;padding-right:6px}
    nav button{padding:0 7px;font-size:.74rem}
  }

  /* Telas bem estreitas (iPhone SE e afins). */
  @media (max-width:400px){
    nav button{font-size:.7rem;padding:0 8px}
    nav{padding:2px}
    #btnLateral{padding:6px 8px}
    .marca-header{gap:6px}
    main{padding:14px 12px}
  }

/* No iPhone instalado a casca agora chega ate a borda fisica, e a barra de
   gestos (34pt) passa a ficar DENTRO da pagina, por cima do rodape. A barra de
   digitar sobe 24pt — o suficiente para nao ficar sob o traco de gesto — e o
   espaco abaixo dela mostra o ceu, nao uma faixa preta fora do documento. A
   classe so existe no app instalado em iOS; navegador e Android nao mudam. */
html.ios-instalado footer{
  padding-bottom:calc(max(10px, env(safe-area-inset-bottom, 0px) - 10px) + var(--teclado, 0px))
}
/* Teclado aberto cobre o traco de gesto: a folga dele nao faz mais sentido. */
html.ios-instalado.teclado-aberto footer{padding-bottom:calc(10px + var(--teclado, 0px))}
/* As camadas que cobrem a tela inteira acompanham a casca: sem isto, o fundo
   escurecido de uma janela parava 47pt acima da borda e deixava o rodape aceso
   por baixo dela. */
html.ios-faixa .overlay,
html.ios-faixa .cinema,
html.ios-faixa .camera{position:absolute}
