/* ============================================================
     Mundo visual único e deliberado: escuro, frio, institucional.
     Toda cor sai da paleta fechada da Vero Norte.

     DISCIPLINA DE COR, que é de onde vem o padrão premium:
     - Areia Clara é a luz principal (14,1:1 no Abissal). Creme quente sobre quase-preto.
     - Cinza Neblina é a luz secundária. Cinza Costeiro é o corpo de texto.
     - Terracota aparece SÓ nas quatro letras do método, em corpo grande (4,5:1 não serve
       para texto pequeno).
     - Azul Horizonte só na logo e no brilho de fundo, quase imperceptível.
     Nada de aro arco-íris, nada de bolinha colorida: um acento, usado pouco.
     ============================================================ */
  :root {
    --barra:     85px;
    --abissal:   #050F1E;
    --profundo:  #182752;
    --neblina:   #DEE5ED;
    --costeiro:  #9CB2BF;
    /* Fora de uso desde a virada para monocromatico. Fica declarada porque e cor da
       paleta oficial da marca, nao porque a pagina a use. */
    --terracota: #CC553D;
    --areia:     #EADBBE;
    --horizonte: #5696FB;
    --atlantico: #26364D;
    --marinho:   #264B66;
    --fio:       rgba(222, 229, 237, 0.07);
    --fio-forte: rgba(222, 229, 237, 0.16);
    --apagado:   rgba(222, 229, 237, 0.13);

    /* Escala de display. Antes eram nove corpos soltos e o h1 era o QUARTO maior texto
       da pagina: a letra da etapa dava 104px e o numero do caso 95px contra 64,8px do h1.
       Sem cortina e sem palco terracota, nada mais separava os blocos, e a pagina ficava
       sem comeco. O termo min(vw, vh) tem que estar em TODOS os degraus: com vw puro nos
       de baixo a razao achata em notebook (1366x700 dava 1,12) e inverte no celular. */
    --d1:    clamp(34px, min(6.2vw, 8.6vh), 84px);  /* so o h1 do hero */
    --d2:    clamp(26px, min(4.2vw, 5.9vh), 58px);  /* todo titulo de secao */
    --d3:    clamp(19px, min(2.6vw, 3.7vh), 34px);  /* h3 de bloco */
    --d-num: clamp(26px, min(4.0vw, 5.6vh), 55px);  /* numero e letra decorativos */
  }
  /* Requisito do Lenis, nao decoracao: sem isso o scroll suave briga com o
     scroll-behavior nativo e a rolagem fica travando. */
  html.lenis, html.lenis body { height: auto; }
  .lenis.lenis-smooth { scroll-behavior: auto !important; }
  .lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }

  * { box-sizing: border-box; }
  html { scroll-behavior: smooth; }
  body {
    margin: 0; background: var(--abissal); color: var(--neblina);
    font-family: "IBM Plex Sans", system-ui, sans-serif;
    font-size: 16px; font-weight: 300; line-height: 1.7;
    -webkit-font-smoothing: antialiased; overflow-x: hidden;
  }
  /* O grão saiu. Uma camada position:fixed de tela cheia com mix-blend-mode:overlay por
     cima de canvas e backdrop-filter obriga o navegador a compor a página inteira numa
     camada só, e isso apareceu como falha de pintura em teste. A maciez que ele dava já
     vem do canvas: o bitmap de 200x120 esticado pelo navegador é, ele próprio, a textura. */
  .wrap { max-width: 1120px; margin: 0 auto; padding: 0 30px; }

  h1, h2, h3 { margin: 0; font-weight: 500; text-wrap: balance; }
  /* Display grande, caixa alta, entrelinha curta e tracking negativo de verdade.
     O peso 500 do manual volta: a presença vem do TAMANHO e do ar, não do peso. */
  /* tracking -0.045em, o mesmo da referencia. Como o nosso peso e 500 e o dela 800, o
     que falta de peso tem que ser pago em TAMANHO e em tracking, nao em um so. */
  .display { text-transform: uppercase; letter-spacing: -0.045em; line-height: 0.94; font-weight: 500; }
  .display .leve { font-weight: 200; color: var(--costeiro); }

  .etiqueta {
    /* Piso em 11,5 e nao 10,5: em notebook (1,5vh de 700px) a etiqueta caia para 10,5px,
       e ela e a PRIMEIRA linha da pagina, a que diz a categoria para quem chega do anuncio.
       Caixa alta com 0,26em de tracking nesse corpo ja e limite de leitura. */
    font-size: clamp(11.5px, min(.85vw, 1.5vh), 13px);
    font-weight: 500; letter-spacing: 0.26em; text-transform: uppercase;
    color: var(--areia); margin: 0;
  }
  /* Ponto de radar no rotulo do hero: e o unico movimento de repouso da pagina, e e o
     mesmo orcamento de um elemento que o critico aprovou. */
  .hero .etiqueta { display: flex; align-items: center; gap: 10px; }
  .pulso { position: relative; width: 8px; height: 8px; flex: none; }
  .pulso i { position: absolute; inset: 0; border-radius: 50%; background: var(--areia); font-style: normal; }
  .pulso i:first-child { animation: eco 1800ms cubic-bezier(.16, 1, .3, 1) infinite; }
  @keyframes eco { from { transform: scale(1); opacity: .8; } to { transform: scale(3); opacity: 0; } }

  /* ---------- entrada do título: máscara por palavra ----------
     Antes eu fazia isso acendendo a cor de cada letra. A referência faz outra coisa, e é
     melhor: nenhuma opacidade é animada. Cada PALAVRA é uma janela com overflow:hidden e
     cada letra sobe de dentro dela, chegando girada 3 graus e se endireitando no caminho.

     Três detalhes sustentam o efeito, e cada um quebra sozinho:
     - o overflow fica na PALAVRA, nunca na linha: na linha ele mataria a quebra de texto
       e cortaria acentos;
     - o padding interno dá folga para acento e cedilha não serem decepados pela máscara,
       que nasce rente à caixa do texto;
     - o transform-origin no canto inferior esquerdo faz a letra pivotar como se estivesse
       encostada no chão. No centro vira outro efeito, com cara de carrossel. */
  /* A letra sobe DE BAIXO da janela, entao a janela so precisa cortar EMBAIXO.
     overflow: hidden cortava nos quatro lados, e com line-height .96 a tinta do circunflexo
     sobe acima da caixa: o "E" de AGENCIA aparecia decepado no celular. O clip-path corta so
     a base e libera 0.35em para cima, que e folga de sobra para acento e til em qualquer
     corpo. Nao mexe em padding nem em altura de linha, entao nao desloca nenhuma palavra. */
  .revela .w { display: inline-flex; padding: .05em .02em .09em; clip-path: inset(-0.35em 0 0 0); }
  .revela .ch { display: inline-block; transform-origin: 0% 100%; will-change: transform; }

  /* Reveals de bloco: nascem parados no primeiro quadro e tocam uma vez só. */
  [data-sobe] { will-change: transform, opacity; }

  /* ---------- CTA: borda de luz varrendo ----------
     A tecnica e a mesma da referencia, e o detalhe que eu tinha errado antes esta aqui:
     o conic NAO e um anel colorido inteiro. Ele e quase todo TRANSPARENTE, com uma faixa
     estreita de luz ocupando uns 20% da volta. O que se ve girando e um reflexo correndo
     pela aresta, nao um arco-iris. Era isso que fazia a minha versao anterior parecer
     template barato.

     Duas peças sustentam o efeito:

     1. @property. Custom property sem tipo registrado NAO transiciona: o navegador a trata
        como texto. Registrando como <angle>, <percentage> e <color>, o angulo, a largura da
        faixa e a cor do pico passam a ser animaveis, e o hover vira uma transicao suave em
        vez de um pulo.
     2. Duas animacoes empilhadas com animation-composition: add. A segunda e identica, mas
        2,5x mais rapida, em reverse, e nasce PAUSADA. No hover ela despausa e se soma a
        primeira, entao a luz muda de velocidade e de sentido sem troca de keyframe.

     A base e o proprio Azul Abissal: o botao e um buraco escuro na pagina escura, e so a
     aresta acende. */
  @property --giro     { syntax: "<angle>";      initial-value: 0deg;    inherits: false; }
  @property --giro-off { syntax: "<angle>";      initial-value: 0deg;    inherits: false; }
  @property --faixa    { syntax: "<percentage>"; initial-value: 5%;      inherits: false; }
  @property --pico     { syntax: "<color>";      initial-value: #EADBBE; inherits: false; }

  .btn {
    --base: #050F1E;
    --luz:  #EADBBE;
    --dur:  3.6s;
    --tr:   .8s cubic-bezier(.25, 1, .5, 1);
    position: relative; isolation: isolate; overflow: hidden;
    display: inline-flex; align-items: center; gap: 18px;
    padding: 8px 8px 8px 30px; border-radius: 999px;
    border: 1px solid transparent;
    background:
      linear-gradient(var(--base), var(--base)) padding-box,
      conic-gradient(from calc(var(--giro) - var(--giro-off)),
        transparent,
        var(--luz) var(--faixa),
        var(--pico) calc(var(--faixa) * 2),
        var(--luz) calc(var(--faixa) * 3),
        transparent calc(var(--faixa) * 4)) border-box;
    box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .05);
    color: var(--neblina);
    font: inherit; font-weight: 500; font-size: 15px; letter-spacing: .01em;
    text-decoration: none; cursor: pointer;
    transition: var(--tr);
    transition-property: --giro-off, --faixa, --pico, box-shadow, color;
  }
  .btn > *:not(.respira) { position: relative; z-index: 1; }
  .btn, .btn::after {
    animation-composition: add;
  }
  .btn {
    animation: girar var(--dur) linear infinite,
               girar calc(var(--dur) / .4) linear infinite reverse paused;
  }
  /* Disco girando por tras, mascarado por um radial para so aparecer embaixo: e o que
     faz a luz parecer vir de dentro do botao e nao de uma borda desenhada. */
  .btn::after {
    content: ""; pointer-events: none; position: absolute; z-index: -1;
    left: 50%; top: 50%; translate: -50% -50%;
    width: 100%; aspect-ratio: 1;
    background: linear-gradient(-50deg, transparent, var(--luz), transparent);
    -webkit-mask-image: radial-gradient(circle at bottom, transparent 40%, #000);
            mask-image: radial-gradient(circle at bottom, transparent 40%, #000);
    opacity: .38;
    animation: rodar var(--dur) linear infinite,
               rodar calc(var(--dur) / .4) linear infinite reverse paused;
  }
  /* Respiro: um bloom interno que pulsa e so aparece no hover. */
  .btn .respira {
    pointer-events: none; position: absolute; z-index: -1;
    left: 50%; top: 50%; translate: -50% -50%;
    width: calc(100% + 1rem); height: calc(100% + 1rem);
    box-shadow: inset 0 -1ex 2rem 4px var(--luz);
    opacity: 0; transition: opacity var(--tr);
    animation: respirar calc(var(--dur) * 1.5) linear infinite paused;
  }
  .btn:is(:hover, :focus-visible) .respira { animation-play-state: running; }
  .btn:is(:hover, :focus-visible) {
    --faixa: 19%;
    --giro-off: 95deg;
    --pico: #FFFFFF;
    color: #FFFFFF;
    box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .05),
                0 0 44px -10px rgba(234, 219, 190, .5);
  }
  .btn:is(:hover, :focus-visible),
  .btn:is(:hover, :focus-visible)::after { animation-play-state: running; }
  @supports not (animation-composition: add) {
    .btn  { animation: girar var(--dur) linear infinite; }
    .btn::after { animation: rodar var(--dur) linear infinite; }
  }
  .btn:is(:hover, :focus-visible) .respira { opacity: .5; }
  .btn:active { translate: 0 1px; }

  /* O ponto e onde o acento vive: marca a acao. Azul Horizonte com seta em Azul Abissal,
     que da 4,9:1 e passa com folga para elemento grafico. */
  .btn .ponto {
    flex: none; width: 42px; height: 42px; border-radius: 50%;
    background: var(--horizonte); color: var(--abissal);
    display: flex; align-items: center; justify-content: center;
    transition: transform .55s cubic-bezier(.2, .6, .2, 1);
  }
  .btn .ponto svg { width: 17px; height: 17px; display: block; }
  .btn:hover .ponto { transform: translate(2px, -2px); }

  .btn.fantasma {
    background: none; border: 0; padding: 8px 8px 8px 26px;
    box-shadow: inset 0 0 0 1px var(--fio-forte);
    animation: none; color: var(--costeiro);
  }
  .btn.fantasma::after { display: none; }
  .btn.fantasma:is(:hover, :focus-visible) {
    box-shadow: inset 0 0 0 1px var(--fio-forte); color: var(--neblina);
  }
  .btn.fantasma .ponto { background: transparent; box-shadow: inset 0 0 0 1px var(--fio-forte); color: var(--costeiro); }

  @keyframes girar   { to { --giro: 360deg; } }
  @keyframes rodar   { to { rotate: 360deg; } }
  @keyframes respirar{ 0%, 100% { scale: 1; } 50% { scale: 1.16; } }


  /* ---------- preloader ----------
     Composicao inteira, nao so a logo no meio. A referencia tem quatro camadas e e a soma
     delas que da presenca: barra de rotulos no topo, logo ENORME ocupando quase a largura
     da tela, uma esteira de palavras correndo no meio, e o contador gigante embaixo a
     direita. A minha versao anterior tinha logo pequena e contador de 12px no canto: o
     mesmo gesto, com um decimo da presenca.

     A duracao inteira mora em UMA constante no script (DUR). A da referencia leva 3,3s
     mais 1,1s de saida, quase 4 segundos de espera antes de qualquer conteudo. Em pagina
     de trafego pago isso e custo de conversao, entao aqui comeca em 2,2s. */
  .pre {
    position: fixed; inset: 0; z-index: 200; background: var(--abissal);
    display: grid; grid-template-rows: auto 1fr auto auto; align-content: stretch;
    padding: clamp(18px, 3vw, 34px) 0; will-change: transform; overflow: hidden;
  }
  .pre-topo {
    display: flex; justify-content: space-between; gap: 16px;
    padding: 0 clamp(18px, 4vw, 54px);
    font-size: clamp(9.5px, 1vw, 12px); font-weight: 500; letter-spacing: .26em;
    text-transform: uppercase; color: var(--costeiro);
  }
  /* A largura mora na JANELA, e as duas camadas herdam 100% dela. Quando eu dava a largura
     so a logo e deixava o brilho preso ao inset do pai, as duas ficavam com larguras
     diferentes e a logo aparecia dobrada, com um fantasma deslocado ao lado. */
  .pre-janela {
    align-self: center; position: relative; overflow: hidden;
    width: min(88vw, 1240px); margin: 0 auto; padding: .28em 0;
  }
  .pre-logo { display: block; width: 100%; color: var(--neblina); will-change: transform, clip-path; }
  .pre-logo svg { width: 100%; height: auto; display: block; }
  .pre-brilho {
    position: absolute; left: 0; right: 0; top: .28em; bottom: .28em;
    opacity: 0; pointer-events: none; color: #FFFFFF;
  }
  .pre-brilho svg { width: 100%; height: auto; display: block; }

  /* A esteira de palavras encontrou casa aqui. Fora do preloader ela competiria com a
     faixa de marcas; aqui ela e a unica coisa correndo e da ritmo a espera. */
  .pre-esteira {
    overflow: hidden; border-top: 1px solid var(--fio); border-bottom: 1px solid var(--fio);
    padding: clamp(10px, 1.4vw, 16px) 0; margin-top: clamp(20px, 4vh, 48px);
  }
  .pre-trilha { display: flex; width: max-content; gap: clamp(20px, 2.6vw, 40px); animation: correr 26s linear infinite; }
  .pre-trilha span {
    font-size: clamp(13px, 1.7vw, 22px); font-weight: 500; letter-spacing: .13em;
    text-transform: uppercase; white-space: nowrap; color: var(--costeiro);
  }
  .pre-trilha .sep { color: var(--horizonte); }
  /* .42 dava 2,45:1. Sao separadores decorativos com aria-hidden, entao tecnicamente
     isentos, mas texto visivel a 2,45 e fraco e subir custa nada. .68 da 4,55:1. */
  .pre-trilha .fraco { color: rgba(156, 178, 191, .68); }

  /* Contador do tamanho de um titulo, nao de uma legenda. */
  .pre-conta {
    align-self: end; text-align: right; padding: 0 clamp(18px, 4vw, 54px);
    margin-top: clamp(14px, 3vh, 34px);
    font-size: clamp(54px, 11vw, 150px); font-weight: 500; line-height: .86;
    letter-spacing: -.04em; color: var(--areia); font-variant-numeric: tabular-nums;
  }
  .pre-conta i { font-style: normal; color: var(--horizonte); }
  .pre[hidden] { display: none; }
  #principal:focus, #principal:focus-visible { outline: none; }

  /* ---------- topo ---------- */
  header { position: sticky; top: 0; z-index: 40; background: rgba(5,15,30,.72); backdrop-filter: blur(18px); border-bottom: 1px solid var(--fio); }
  .barra { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding-top: 20px; padding-bottom: 20px; }
  .marca { display: inline-flex; align-items: center; color: var(--neblina); flex: none; }
  .marca svg { height: 19px; width: auto; display: block; }
  .barra .btn {
    padding: 6px 6px 6px 20px; font-size: 13.5px; gap: 12px; animation: none; border: 0;
    background: rgba(222, 229, 237, .06);
    box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .26);
    transition: background .3s ease, box-shadow .3s ease;
  }
  .barra .btn:hover { background: rgba(222, 229, 237, .11); box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .4); }
  .barra .btn::after { display: none; }
  .barra .btn .ponto { width: 32px; height: 32px; }
  .barra .btn .ponto svg { width: 14px; height: 14px; }

  /* ---------- hero ---------- */
  /* O respiro de cima e grande DE PROPOSITO: e ele que da altura para a cortina existir
     antes de o texto comecar. Na referencia o conteudo do hero comeca por volta de 43%
     da altura, e e por isso que a descida da luz tem espaco para ser macia. */
  /* TELA CHEIA. Era esta a diferenca de fundo: o nosso hero era um bloco alto empurrado
     por padding-top, e o da referencia e uma TELA. Sem min-height o conteudo nao se
     reparte pela altura, ele so afunda quanto o padding mandar.
     Os dois espacadores na proporcao 1 para 0,08 jogam o conteudo para ~92% da altura e
     deixam uma fresta proporcional embaixo. Nao trocar por justify-content:flex-end: a
     fresta e o que distingue as duas coisas. */
  .hero {
    position: relative; overflow: hidden;
    display: flex; flex-direction: column;
    min-height: calc(100svh - var(--barra));
    padding: clamp(28px, 3.6vw, 56px) 0 clamp(40px, min(4.4vw, 7vh), 96px);
  }
  /* Proporcao 0,42 para 1: o conteudo sobe para o terco superior. A de antes
     (1 para 0,08) existia para a cortina ter altura, e sem ela era so vazio. */
  .hero-ar-topo { flex: .42; min-height: clamp(12px, 2vh, 40px); }
  .hero-ar-base { flex: 1; min-height: 0; }
  .hero .wrap { position: relative; z-index: 1; width: 100%; }
  /* Conteudo a esquerda, numeros numa coluna a direita. Era o que faltava para o hero
     caber: empilhados embaixo, os tres numeros somavam altura, empurravam o CTA para fora
     da dobra e nao sobrava espaco nenhum para a cortina. */
  /* A virada em 760px sai de max(largura, (760px - 100vw) * 1000): acima de 760 o segundo
     termo e negativo e vence a largura fixa; abaixo ele explode e a coluna vai a 100%.
     Uma media query a menos, e o ponto de virada fica junto do valor que ele controla. */
  .hero-grade {
    display: flex; flex-wrap: wrap;
    justify-content: space-between; align-items: flex-end;
    gap: clamp(28px, 4vw, 88px);
  }
  .hero-texto {
    flex: 1 1 520px; min-width: 0;
    display: flex; flex-direction: column;
    gap: clamp(14px, min(1.7vw, 2.8vh), 30px);
  }
  .hero .wrap { position: relative; z-index: 1; width: 100%; }
  /* A promessa tem 89 caracteres contra 57 da referencia, entao o corpo tem que ser
     menor que o dela para o CTA continuar acima da dobra. Medido em 1440x900: com 104px
     os botoes caiam 451px abaixo da linha. */
  /* min(vw, vh) e a chave: so com vw, um notebook de 1440x780 recebe o mesmo corpo de
     um monitor grande e o hero nao cabe na tela. */
  .hero h1 { font-size: var(--d1); margin: 0; max-width: 22ch; }
  .lead { max-width: 34em; margin: 0; font-size: clamp(16px, min(1.35vw, 2.4vh), 26px);
          line-height: 1.5; color: var(--costeiro); text-wrap: pretty; }
  .lead b { color: var(--neblina); font-weight: 400; }
  .acoes { display: flex; flex-wrap: wrap; gap: 14px; margin: clamp(8px, min(1.8vw, 3.4vh), 44px) 0 0; }

  /* A oferta mais forte da pagina estava enterrada no passo 2 de "como funciona". Quem ja
     foi queimado por agencia chega com uma pergunta so, "o que isso me custa para eu
     descobrir se presta", e ela precisa ser respondida acima da dobra. */
  .sem-risco {
    margin: 0; max-width: 46ch;
    font-size: clamp(13px, min(.95vw, 1.7vh), 15px); line-height: 1.55;
    color: var(--costeiro);
    padding-left: 13px; border-left: 1px solid var(--horizonte);
  }

  /* números: régua fina, tabular, sem cara de barra de métrica */
  .prova {
    flex: none;
    width: min(100%, max(clamp(230px, 17vw, 320px), (760px - 100vw) * 1000));
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(clamp(96px, (100vw - 760px) * 1000, 210px), 1fr));
    gap: clamp(14px, 1.6vw, 26px); margin: 0;
  }
  /* O fio estava em 0.07 e sumia contra o Azul Abissal: as tres estatisticas ficavam
     flutuando sem regua. */
  /* Sem cortina, a prova do hero passa a usar o mesmo vocabulario dos cartoes: superficie
     propria, fio de 1px e o anel de luz no ponteiro. A pagina inteira vira um sistema de
     superficies, e nao um fundo decorado. */
  .prova div {
    position: relative; isolation: isolate; overflow: hidden;
    display: flex; flex-direction: column; gap: 6px;
    padding: clamp(14px, 1.4vw, 20px);
    border-radius: 12px;
    background: rgba(222, 229, 237, .022);
    box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .085);
  }
  .prova div::before {
    content: ""; position: absolute; inset: 0; border-radius: inherit;
    pointer-events: none; z-index: 3; padding: 1.5px;
    opacity: var(--luz-on, 0); transition: opacity .8s cubic-bezier(.16, 1, .3, 1);
    background: radial-gradient(180px circle at var(--luz-x, 50%) var(--luz-y, 50%),
      var(--neblina) 0%, var(--horizonte) 34%, transparent 72%);
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
            mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
  }
  .prova div > * { position: relative; z-index: 1; }
  /* Peso 200 sai. Era a razao de a barra de provas parecer legenda: a referencia tira
     presenca do peso 800, nos tiramos do tamanho, e 38px em peso 200 nao entrega nenhum
     dos dois. Na referencia o numero tem quase o corpo do h1. */
  .prova .n {
    display: block; font-size: clamp(26px, min(2.7vw, 4.4vh), 42px); font-weight: 500;
    white-space: nowrap;
    letter-spacing: -0.045em; line-height: 1; font-variant-numeric: tabular-nums;
    color: var(--areia);
  }
  .prova .d { display: block; margin: 0; font-size: clamp(12px, min(.95vw, 1.7vh), 16px); line-height: 1.3; color: var(--costeiro); }


  /* ---------- prova social ----------
     O sistema vem pronto do site: brightness(0) invert(1) branqueia qualquer logo,
     claro ou escuro, e resolve em um lugar so o que seria um arquivo alternativo por
     marca. Duas excecoes declaradas, as mesmas de la: Giraffas e Vo Carlos sao
     brasoes circulares, nao assinaturas horizontais. O olho compara AREA e nao
     altura, entao marca quadrada precisa de mais altura para pesar igual. O Vo Carlos
     ainda mantem as cores, porque branquear um brasao com fundo proprio apagaria o
     desenho inteiro.

     Grade, e nao esteira: a pagina ja tem uma faixa correndo no rodape, e duas coisas
     deslizando ao mesmo tempo viram ruido. Logo parado e alinhado le mais caro. */
  .marcas { padding: 104px 0; border-top: 1px solid var(--fio); }
  .marcas .wrap { padding: 0; }
  .marcas .etiqueta { padding: 0 30px; }
  /* A esteira sangra de ponta a ponta: cortada no container ela parece uma lista que
     nao coube, e nao uma faixa que corre. As mascaras nas bordas fazem as marcas
     nascerem e morrerem no escuro em vez de baterem na aresta da tela. */
  .marcas-esteira {
    margin-top: 48px; overflow: hidden; max-width: 100vw;
    -webkit-mask-image: linear-gradient(90deg, transparent, #000 9%, #000 91%, transparent);
            mask-image: linear-gradient(90deg, transparent, #000 9%, #000 91%, transparent);
  }
  .marcas-trilha {
    display: flex; align-items: center; width: max-content;
    gap: clamp(46px, 5.5vw, 84px);
    animation: correr 52s linear infinite;
  }
  .marcas-esteira:hover .marcas-trilha,
  .marcas-esteira:focus-within .marcas-trilha { animation-play-state: paused; }
  @keyframes correr { to { transform: translateX(-50%); } }

  .mk { display: flex; align-items: center; gap: 11px; flex: none; opacity: .58; transition: opacity .5s ease; }
  .mk:hover { opacity: 1; }
  .mk img { height: 22px; width: auto; display: block; filter: brightness(0) invert(1); }
  .mk img[src$="giraffas.svg"] { height: 38px; }
  .mk img[src$="vo-carlos-cafe.jpg"] { height: 38px; filter: none; border-radius: 50%; }
  .mk .nome { font-size: 12.5px; color: var(--costeiro); white-space: nowrap; }
  .mk.texto { font-size: 15px; color: var(--neblina); font-weight: 400; letter-spacing: .01em; white-space: nowrap; }
  @media (max-width: 900px) {
    .marcas { padding: 72px 0; }
    .marcas-trilha { gap: 40px; animation-duration: 38s; }
    .mk img { height: 19px; }
    .mk img[src$="giraffas.svg"], .mk img[src$="vo-carlos-cafe.jpg"] { height: 32px; }
  }

  /* ---------- seções, com muito mais ar ---------- */
  section { padding: clamp(78px, 8vh, 108px) 0; scroll-margin-top: 80px; }

  /* O cabecalho de secao era uma coluna de 22ch encostada na esquerda, com a metade
     direita da tela vazia e 150px de respiro em cima e embaixo. Somando as duas coisas
     sobravam trezentos pixels de nada entre uma secao e a proxima, que e exatamente o
     que faz uma pagina escura parecer inacabada em vez de espacosa.

     Agora e uma grade: etiqueta na largura toda, titulo a esquerda e o paragrafo de apoio
     a direita, alinhados pela base. A largura da pagina passa a ser usada, e o respiro
     vertical cai para menos da metade. */
  .cabeca {
    display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
    gap: 22px clamp(36px, 5vw, 76px); align-items: end;
    margin-bottom: clamp(44px, 5vw, 62px);
  }
  .cabeca .etiqueta { grid-column: 1 / -1; }
  .cabeca h2 { font-size: var(--d2); max-width: 15ch; line-height: .96; }
  .cabeca p { margin: 0 0 .35em; color: var(--costeiro); max-width: 44ch; }
  /* Sem paragrafo de apoio o titulo ocupa a linha inteira, senao fica um bloco solto
     de um lado so. Tem que ser p:not(.etiqueta): a propria etiqueta e um <p>, entao
     :has(p) e sempre verdadeiro e a regra nunca pegaria. */
  .cabeca:not(:has(p:not(.etiqueta))) { grid-template-columns: 1fr; }
  .cabeca:not(:has(p:not(.etiqueta))) h2 { max-width: 24ch; }

  /* ---------- as quatro etapas: a assinatura tipográfica da página ---------- */
  .regua { border-top: 1px solid var(--fio); }
  .etapa {
    display: grid; grid-template-columns: 150px 1fr 1.15fr; gap: 0 40px; align-items: start;
    padding: 52px 0; border-bottom: 1px solid var(--fio); position: relative;
  }
  .etapa::after {
    content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px;
    background: var(--areia); transform: scaleX(0); transform-origin: left;
    transition: transform .8s cubic-bezier(.2,.6,.2,1);
  }
  .etapa:hover::after { transform: scaleX(1); }
  .etapa .letra {
    font-size: var(--d-num); font-weight: 200; line-height: .78;
    color: var(--horizonte); letter-spacing: -0.06em;
  }
  .etapa h3 { font-size: clamp(19px, 2vw, 25px); text-transform: uppercase; letter-spacing: 0.01em; line-height: 1.15; }
  .etapa .quando { display: block; font-size: 11.5px; font-weight: 500; letter-spacing: .26em; text-transform: uppercase; color: var(--areia); margin-top: 16px; }
  .etapa p { margin: 0; color: var(--costeiro); font-size: 15.5px; }

  .lista { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--fio); }
  .lista li {
    padding: 22px 0; border-bottom: 1px solid var(--fio);
    display: grid; grid-template-columns: 54px 1fr; gap: 0; align-items: baseline;
    color: var(--neblina); font-weight: 300;
  }
  .lista li span:first-child { font-size: 11px; letter-spacing: .18em; color: var(--costeiro); font-weight: 400; }

  /* ---------- casos: grade de cartoes ----------
     Layout, espacamento e escala vem da referencia. Cor e peso sao nossos: onde ela usa
     800 nos usamos 500 e devolvemos a presenca em TAMANHO e tracking.
     Sem moldura de imagem, porque nao temos imagem: no lugar dela entram as barras de
     antes e depois, que dao corpo ao cartao e ainda sao prova, e nao decoracao. */
  #resultados .wrap { max-width: 1280px; }
  #resultados .cabeca { margin-bottom: clamp(36px, 5vw, 72px); }
  section#resultados.palco { padding: clamp(56px, 8vw, 118px) 0; }

  .casos {
    display: grid; align-items: start;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
    gap: clamp(12px, 1.4vw, 20px);
  }
  /* Com quatro casos o auto-fit larga um orfao na segunda linha. Isto forca 2x2 e a
     leitura fecha. Com tres, nao dispara. */
  @media (min-width: 1040px) {
    .casos:has(> :nth-child(4)) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  }

  .caso {
    display: flex; flex-direction: column; position: relative; isolation: isolate;
    background: var(--abissal); color: var(--neblina);
    border-radius: 18px; overflow: hidden; padding: 0;
    box-shadow: 0 30px 60px -30px rgba(5, 15, 30, .6);
  }
  /* Um cartao claro no meio dos escuros: a referencia alterna, e e o que impede a grade
     de virar quatro retangulos iguais. */
  /* Tres niveis de azul, e e so isso que separa os planos: palco em Azul Profundo,
     cartao em Azul Abissal (mais escuro que o palco, entao le como recorte) e o cartao
     alternado em Azul Atlantico. Nenhuma cor quente, nenhum bloco chapado. */
  .caso--claro { background: var(--atlantico); color: var(--neblina); }

  .caso-corpo { padding: clamp(22px, 2.2vw, 30px); display: flex; flex-direction: column; gap: 18px; }
  .caso-topo {
    display: flex; justify-content: space-between; gap: 12px;
    font-size: 12px; font-weight: 400; letter-spacing: .14em; text-transform: uppercase;
    color: var(--costeiro);
  }
  .caso--claro .caso-topo { color: var(--costeiro); }

  .caso-num { display: flex; flex-direction: column; gap: 6px; }
  .caso-n {
    display: block; font-size: var(--d-num); font-weight: 500;
    line-height: .86; letter-spacing: -.055em; color: inherit;
    font-variant-numeric: tabular-nums;
  }
  /* Guarda para valor longo, do tipo "R$ 2,49": no teto de 118px ele estoura a coluna. */
  .caso-n--longo { font-size: clamp(22px, min(3vw, 4.2vh), 40px); letter-spacing: -.04em; }
  .caso-rotulo { font-size: 16px; font-weight: 500; text-transform: uppercase; letter-spacing: .012em; line-height: 1.2; }

  .caso p { margin: 0; font-size: clamp(16px, 1.1vw, 20px); line-height: 1.5; font-weight: 300; color: var(--costeiro); max-width: none; }
  .caso--claro p { color: var(--costeiro); }

  /* Barras de antes e depois. A largura sai do proprio dado, em style inline, para o
     numero e o desenho nunca poderem discordar. */
  .barras { display: flex; flex-direction: column; gap: 8px; font-size: 13px; }
  /* .caso-barra e NAO .barra: o cabecalho da pagina e <div class="wrap barra">, e a
     regra de grid aqui reescrevia o layout dele. Colisao de nome de classe. */
  .caso-barra { display: grid; grid-template-columns: 52px 1fr auto; gap: 10px; align-items: center; }
  .caso-barra > span:first-child { color: var(--costeiro); }
  .caso--claro .caso-barra > span:first-child { color: var(--costeiro); }
  .caso-barra > span:last-child { min-width: 62px; text-align: right; font-variant-numeric: tabular-nums; }
  .trilho { height: 6px; border-radius: 3px; background: rgba(222, 229, 237, .14); }
  .caso--claro .trilho { background: rgba(5, 15, 30, .35); }
  .trilho i { display: block; height: 100%; border-radius: 3px; background: rgba(222, 229, 237, .32); }
  .caso--claro .trilho i { background: rgba(222, 229, 237, .3); }
  .trilho--fim i { background: var(--areia); }
  .caso--claro .trilho--fim i { background: var(--horizonte); }

  .caso-rodape {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px;
    border-top: 1px solid rgba(222, 229, 237, .12); padding-top: 16px; margin-top: auto;
  }
  .caso--claro .caso-rodape { border-top-color: rgba(222, 229, 237, .12); }
  .caso-rodape b { display: block; font-weight: 500; font-size: 26px; letter-spacing: -.03em; line-height: 1; font-variant-numeric: tabular-nums; }
  .caso-rodape span { display: block; margin-top: 6px; font-size: 13px; line-height: 1.35; color: var(--costeiro); }
  .caso--claro .caso-rodape span { color: var(--costeiro); }

  /* A base continua existindo: e ela que da ao numero o direito de ser levado a serio. */
  .caso .base {
    margin: 0; font-size: 12px; line-height: 1.55; color: var(--costeiro);
    padding-left: 12px; border-left: 1px solid rgba(222, 229, 237, .18);
    font-variant-numeric: tabular-nums; max-width: none;
  }
  .caso--claro .base { color: var(--costeiro); border-left-color: rgba(222, 229, 237, .18); }

  /* Brilho de proximidade do cartao. Diferente do brilho de LINHA: aqui o radial segue o
     cursor nos DOIS eixos e vive em ::after, acima do fundo opaco do cartao. Em ::before,
     atras do fundo, ele simplesmente nao apareceria. */
  .caso::after {
    content: ""; position: absolute; inset: 0; border-radius: inherit;
    pointer-events: none; z-index: 2;
    opacity: var(--luz-on, 0); transition: opacity .8s cubic-bezier(.16, 1, .3, 1);
    background: radial-gradient(320px circle at var(--luz-x, 50%) var(--luz-y, 50%),
      rgba(86, 150, 251, .18), rgba(86, 150, 251, 0) 70%);
  }
  .caso--claro::after {
    background: radial-gradient(320px circle at var(--luz-x, 50%) var(--luz-y, 50%),
      rgba(86, 150, 251, .16), rgba(86, 150, 251, 0) 70%);
  }
  /* ANEL DE LUZ NA BORDA, o efeito assinatura dos cartoes da referencia.
     O truque: o pseudo recebe padding e duas mascaras compostas com xor. A mascara de
     fora cobre a caixa inteira, a de dentro cobre so a caixa de conteudo, e o xor deixa
     visivel exatamente a diferenca entre as duas, que e a moldura do padding. Preenchendo
     essa moldura com um radial posicionado no cursor, so o TRECHO da borda perto do
     ponteiro acende, e ele persegue o cursor pela volta do cartao.
     Sem o padding nao ha diferenca entre as duas caixas e o gradiente toma o cartao
     inteiro em vez de desenhar a borda. */
  .caso::before, .estagio::before {
    content: ""; position: absolute; inset: 0; border-radius: inherit;
    pointer-events: none; z-index: 3; padding: 1.5px;
    opacity: var(--luz-on, 0); transition: opacity .8s cubic-bezier(.16, 1, .3, 1);
    background: radial-gradient(220px circle at var(--luz-x, 50%) var(--luz-y, 50%),
      var(--neblina) 0%, var(--horizonte) 30%, rgba(86, 150, 251, .35) 55%, transparent 75%);
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
            mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
  }

  /* Os cartoes de "como funciona" ganham o mesmo tratamento: sao cartoes tambem. */
  .passo { position: relative; isolation: isolate; overflow: hidden; }
  .passo::before {
    content: ""; position: absolute; inset: 0; border-radius: inherit;
    pointer-events: none; z-index: 3; padding: 1.5px;
    opacity: var(--luz-on, 0); transition: opacity .8s cubic-bezier(.16, 1, .3, 1);
    background: radial-gradient(200px circle at var(--luz-x, 50%) var(--luz-y, 50%),
      var(--neblina) 0%, var(--horizonte) 34%, transparent 72%);
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
            mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
  }
  .passo > * { position: relative; z-index: 1; }

  .caso-corpo { position: relative; z-index: 1; }

  /* A unidade do numero em peso leve: e o que faz "6,8x" ler como grandeza e nao como
     palavra. Na referencia esse detalhe existe e muda o peso visual do cartao. */
  .caso-n i { font-style: normal; font-weight: 200; color: var(--areia); }
  .caso--claro .caso-n i { color: var(--horizonte); }

  /* Titulo da secao em duas linhas, a segunda em peso leve. Areia Clara sobre Terracota
     da 3,12:1, acima do 3:1 exigido para display. */
  #resultados .cabeca h2 { font-size: var(--d2); max-width: 16ch; line-height: .96; }
  #resultados .cabeca h2 .leve { font-weight: 200; color: var(--areia); }

  /* Nota da taxa de cambio, so na /es. Ela era Abissal porque o palco era TERRACOTA, que era
     claro. O palco virou Azul Profundo e a nota ficou invisivel, contraste 1,00 medido no
     navegador. Cinza Costeiro sobre o Profundo da 6,5:1. */
  .nota-taxa {
    margin: clamp(30px, 4vw, 56px) 0 0; max-width: 62ch;
    font-size: 13.5px; line-height: 1.55; font-weight: 300; color: var(--costeiro);
  }

  @media (max-width: 900px) { .caso-corpo { gap: 15px; } }

  .base-rotulo {
    display: block; margin-bottom: 5px;
    font-size: 11.5px; letter-spacing: .18em; text-transform: uppercase;
    color: var(--areia); font-weight: 500;
  }

  /* ---------- o que fazemos ----------
     Linha, nao card: letra em Azul Horizonte a esquerda, titulo grande em caixa alta, e a
     descricao ocupando a largura embaixo. Diferente das quatro etapas de proposito: la a
     letra e gigante e fina porque ELA e a assinatura do metodo; aqui ela e so um indice. */
  .frentes { border-top: 1px solid var(--fio); }
  .frente { padding: 38px 0; border-bottom: 1px solid var(--fio); }
  .frente-topo { display: grid; grid-template-columns: 62px 1fr; gap: 0 22px; align-items: baseline; }
  .frente-letra { font-size: 26px; font-weight: 300; color: var(--horizonte); line-height: 1; }
  .frente h3 { font-size: var(--d3); text-transform: uppercase; letter-spacing: -.02em; line-height: 1; }
  .frente p { margin: 18px 0 0 84px; color: var(--costeiro); font-size: 16px; max-width: 58ch; }

  /* ---------- como funciona ----------
     Card, e nao linha, porque sao ETAPAS DE UM PROCESSO que a pessoa vai percorrer: dar
     corpo proprio a cada uma ajuda a ler como "tres passos", e nao como lista. */
  .passos { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
  .passo {
    border: 1px solid var(--fio); border-radius: 4px; padding: clamp(26px, 2.6vw, 40px);
    background: rgba(222, 229, 237, .016);
    transition: border-color .6s cubic-bezier(.16,1,.3,1);
  }
  .passo:hover { border-color: var(--fio-forte); }
  .passo-n {
    display: block; font-size: clamp(20px, min(2.2vw, 3.1vh), 30px); font-weight: 200; line-height: 1;
    letter-spacing: -.045em; color: var(--horizonte); font-variant-numeric: tabular-nums;
  }
  .passo h3 { margin-top: 26px; font-size: 12px; font-weight: 500; letter-spacing: .22em; text-transform: uppercase; color: var(--areia); }
  .passo p { margin: 14px 0 0; color: var(--costeiro); font-size: 15.5px; }

  /* ---------- barra fixa de CTA no celular ----------
     A referencia tem e faz diferenca: numa pagina longa, no telefone, o botao do topo fica
     a mil pixels de distancia. Aparece so depois que a pessoa desceu, e some quando o
     formulario entra na tela, para nao cobrir o proprio destino. */
  .barra-fixa {
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 60;
    padding: 11px 16px calc(11px + env(safe-area-inset-bottom, 0px));
    background: rgba(5, 15, 30, .88); backdrop-filter: blur(14px);
    border-top: 1px solid var(--fio);
    transform: translateY(105%);
    visibility: hidden;
    transition: transform .5s cubic-bezier(.16,1,.3,1), visibility 0s linear .5s;
  }
  .barra-fixa[data-ver="1"] { transform: none; visibility: visible; transition-delay: 0s, 0s; }
  .barra-fixa .btn { width: 100%; justify-content: space-between; font-size: 14px; }
  @media (min-width: 861px) { .barra-fixa { display: none; } }

  @media (max-width: 900px) {
    /* Em 360 dava duas colunas e um orfao, em 430 tres colunas e "+R$ 30 mi" quebrado em
       duas linhas, em 768 uma tira de 210px com meia tela de vazio ao lado. Uma linha por
       numero resolve os tres. O flex: 0 0 auto e o que impede o corte: sem ele a coluna
       espreme o numero. */
    .prova { width: 100%; grid-template-columns: 1fr; gap: 8px; margin-top: 24px; }
    .prova div { flex-direction: row; align-items: baseline; gap: 14px; padding: 13px 15px; }
    .prova .n { flex: 0 0 auto; font-size: 26px; }
    .prova .d { font-size: 12.5px; line-height: 1.3; }
    .passos { grid-template-columns: 1fr; gap: 12px; }
    .frente-topo { grid-template-columns: 44px 1fr; gap: 0 14px; }
    .frente p { margin-left: 58px; }
  }

  /* ============================================================
     PALCOS QUE EMPILHAM
     O dispositivo de apresentacao da referencia, e o que eu nao tinha entendido antes:
     la os blocos de cor NAO sao cards, sao SECOES INTEIRAS sangrando de ponta a ponta,
     em position:sticky. Elas param no topo e o conteudo escuro seguinte sobe por cima,
     encolhendo e escurecendo a de tras. E o que faz a pagina parecer capitulos que
     viram, e nao uma lista que rola.

     Era essa a diferenca entre o palco dela e o meu retangulo bege boiando no escuro:
     largura total marca mudanca de capitulo, retangulo arredondado marca card.

     CONTRASTE: conferido com auditoria automatica em 1440 e em 375: zero falha.
     */
  /* section.palco e NAO .palco: ".fecho { position: relative }" e declarado depois e,
     com a mesma especificidade, venceria por ordem de cascata e o palco claro nao
     grudaria. O seletor de tipo sobe a especificidade e resolve sem !important. */
  /* top vem do script, nao daqui: uma secao mais alta que a janela tem que grudar pela
     BASE (top negativo), senao o fim dela nunca aparece enquanto esta presa. */
  section.palco { position: sticky; transform-origin: 50% 0%; z-index: 1; will-change: transform; }
  /* O cartao de caso virou contexto de empilhamento proprio (isolation + z-index), entao
     a sombra precisa subir acima dele para continuar escurecendo a secao inteira quando o
     proximo palco passa por cima. section.palco e nao .palco: a regra generica vem antes
     no arquivo e venceria por ordem de cascata. */
  section.palco > .sombra { z-index: 5; }
  .palco > .sombra {
    content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 0;
    border-radius: inherit;
    background: var(--abissal); opacity: 0;
  }
  /* Quem passa por cima precisa de fundo opaco proprio, senao o palco aparece por tras. */
  .sobrepoe { position: relative; z-index: 2; background: var(--abissal); }

  /* O palco deixa de ser bloco de COR e vira superficie ELEVADA. Um degrau de azul acima
     do fundo, com fio em cima e embaixo. A pagina fica monocromatica e a diferenca entre
     secoes passa a vir dos cartoes, nao de uma cor chapada. */
  .palco-fundo {
    background: var(--profundo); color: var(--neblina);
    box-shadow: inset 0 1px 0 rgba(222, 229, 237, .10), inset 0 -1px 0 rgba(222, 229, 237, .10);
  }
  section.palco { padding: clamp(66px, 7vh, 92px) 0; }
  /* ESTAS REGRAS ESTAVAM INVERTIDAS. Quando o palco era terracota, ou seja CLARO, o texto
     dele era Azul Abissal e isso estava certo. Ao virar superficie ESCURA, as regras filhas
     continuaram forcando quase-preto sobre azul escuro: 79 elementos com contraste 1,00,
     literalmente invisiveis. Agora o palco escuro tem texto claro, como o resto da pagina. */
  .palco-fundo .etiqueta { color: var(--areia); }
  .palco-fundo .cabeca p { color: var(--costeiro); }
  .palco-fundo .casos { border-top-color: rgba(222, 229, 237, .12); }
  .palco-fundo .caso-n { color: var(--neblina); }
  .palco-fundo .caso-topo,
  .palco-fundo .caso h3 { color: var(--costeiro); }
  .palco-fundo .caso p { color: var(--costeiro); }
  .palco-fundo .caso .base { color: var(--costeiro); border-left-color: rgba(222, 229, 237, .18); }
  .palco-fundo .revela .ch { color: var(--neblina); }


  /* A prova era a unica secao com pico de desejo e ZERO botao: medido, nao havia nenhum
     class="btn" entre o inicio de #resultados e o formulario. Quem chegava no 6,8x nao
     tinha porta e voltava a rolar. */
  /* ---------- atalho ----------
     Porta lateral para quem ja decidiu na dobra anterior. Faixa curta, fundo proprio,
     sem cartao e sem animacao nova. O fundo sai do --marinho, que o :root ja declarava
     e que nao era usado em nenhum lugar da folha. */
  .atalho { padding: clamp(46px, 5.2vh, 72px) 0; background: var(--marinho); }
  .atalho-grade {
    display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr);
    gap: 24px clamp(32px, 4.5vw, 72px); align-items: center;
  }
  .atalho h2 { font-size: var(--d3); max-width: 20ch; line-height: 1.04; margin: 12px 0 0; }
  /* A metade leve do titulo e Cinza Costeiro por padrao, e sobre o Marinho isso da 4,18:1,
     abaixo do minimo. Vira Azul Ceu, que da 6,98:1 e continua separando as duas metades por
     cor alem do peso, como a secao de resultados ja faz com o Areia Clara. */
  .atalho .display .leve { color: var(--ceu); }
  .atalho-apoio { margin: 14px 0 0; color: var(--neblina); font-size: 15.5px; line-height: 1.6; max-width: 54ch; }
  .atalho-nota { margin: 12px 0 0; color: var(--ceu); font-size: 13px; }
  /* O fantasma padrao e Cinza Costeiro sobre Azul Abissal. Sobre o Marinho, que e bem mais
     claro, esse mesmo cinza cai para 4,18:1 e reprova. Aqui ele sobe para Cinza Neblina, e o
     anel ganha corpo porque o --fio-forte, que e 16% de branco, quase some contra fundo claro. */
  .atalho .btn.fantasma { color: var(--neblina); box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .38); }
  .atalho .btn.fantasma:hover { box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .62); }
  @media (max-width: 900px) {
    .atalho-grade { grid-template-columns: 1fr; gap: 20px; }
  }

  .casos-acao { margin: clamp(26px, 3vw, 44px) 0 0; display: flex; justify-content: flex-start; }
  .casos-acao .btn { min-width: min(100%, 320px); justify-content: space-between; }

  /* ---------- estagios ----------
     Tres cartoes, e a escada e VISUAL antes de ser textual: cada degrau tem mais
     superficie que o anterior. Costeira e um fio sobre o Abissal, Travessia ganha corpo,
     e o Ultramarino e o unico em Azul Profundo chapado, que e o azul mais saturado da
     paleta. Nenhuma cor nova: a hierarquia sai de QUANTA luz cada cartao recebe.
     Nenhum valor aparece. O cartao existe para a empresa se reconhecer, nao para comprar. */
  /* TRES COLUNAS FIXAS no computador, e nao auto-fit. Com auto-fit e piso de 290px os
     cartoes ja caiam para duas colunas abaixo de ~950px, que e largura de notebook: o dono
     viu empilhado. A escada so se le comparando os tres lado a lado, entao ou cabem os
     tres, ou cai para um por linha. Duas colunas nunca. */
  .estagios {
    display: grid; align-items: stretch;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: clamp(10px, 1.1vw, 18px);
  }
  @media (max-width: 860px) { .estagios { grid-template-columns: 1fr; gap: 12px; } }
  .estagio {
    display: flex; flex-direction: column; position: relative; isolation: isolate;
    border-radius: 18px; overflow: hidden;
    padding: clamp(20px, 1.9vw, 32px);
    background: rgba(222, 229, 237, .028);
    box-shadow: inset 0 0 0 1px var(--fio-forte);
  }
  .estagio--meio { background: rgba(222, 229, 237, .055); }
  /* O degrau de cima e o unico com fundo proprio, e nao com veu sobre o fundo da pagina.
     E o que o faz parecer outro produto sem precisar de moldura dourada. */
  .estagio--topo {
    background: var(--profundo);
    box-shadow: inset 0 0 0 1px rgba(86, 150, 251, .34),
                0 34px 64px -34px rgba(5, 15, 30, .8);
  }
  /* wrap obrigatorio: em 900px o cartao tem 273px e o selo somado ao "Estagio 02" vazava
     3px. Sem o wrap ele estoura em vez de descer uma linha. */
  .estagio-topo {
    display: flex; align-items: baseline; justify-content: space-between;
    flex-wrap: wrap; gap: 8px 12px;
  }
  .estagio-n {
    font-size: 11.5px; letter-spacing: .2em; text-transform: uppercase;
    color: var(--costeiro); font-variant-numeric: tabular-nums;
  }
  .estagio-selo {
    font-size: 11.5px; letter-spacing: .14em; text-transform: uppercase;
    color: var(--abissal); background: var(--areia); font-weight: 500;
    padding: 5px 9px; border-radius: 999px; white-space: nowrap;
  }
  .estagio h3 {
    margin: 16px 0 0; font-size: var(--d3); line-height: 1;
    text-transform: uppercase; letter-spacing: -.02em; color: var(--neblina);
  }
  .estagio--topo h3 { color: var(--areia); }
  .estagio-rota { margin: 8px 0 0; font-size: 13px; color: var(--horizonte); }
  /* O cartao NAO lista entregavel. Listar "o que esta incluso" em checklist contradiz a
     frase que vem logo abaixo dos tres, "nenhum estagio e vendido do jeito que esta escrito
     aqui": a pagina mostrava o pacote e em seguida pedia para descontar o que acabou de ser
     lido. Agora cada cartao explica UM MOMENTO da empresa e o que muda quando estamos la.
     Os fatos continuam todos, so param de ser menu e passam a ser consequencia. */
  .estagio-para {
    margin: 18px 0 0; font-size: 15.5px; line-height: 1.5; color: var(--neblina);
    font-weight: 300;
  }
  .estagio-porque {
    margin: 16px 0 0; padding-top: 18px; border-top: 1px solid var(--fio-forte);
    font-size: 14.5px; line-height: 1.55; color: var(--costeiro);
  }
  .estagio-porque b { font-weight: 500; color: var(--areia); }
  .estagio--topo .estagio-porque b { color: var(--neblina); }
  /* A escada honesta desta pagina nao e quantidade de item, e PRESENCA: de quanto em quanto
     tempo nos sentamos junto. E isso que uma parceria vende, e um pacote nao. */
  .estagio-ritmo {
    margin: 22px 0 0; padding: 14px 0 0; border-top: 1px solid var(--fio-forte);
    display: grid; gap: 5px;
  }
  .estagio-ritmo > span {
    font-size: 11.5px; letter-spacing: .18em; text-transform: uppercase; color: var(--costeiro);
  }
  .estagio-ritmo > b { font-size: 15px; font-weight: 400; color: var(--areia); line-height: 1.35; }
  .estagio--topo .estagio-ritmo > b { color: var(--neblina); }
  .estagio .btn { margin-top: auto; width: 100%; justify-content: space-between; font-size: 14px; }
  /* A regra que o dono repete desde agosto, e ela vale mais que os tres cartoes juntos. */
  .estagios-regra {
    margin: clamp(26px, 3vw, 40px) 0 0; padding-left: 14px;
    border-left: 1px solid var(--areia);
    font-size: 14.5px; line-height: 1.6; color: var(--costeiro); max-width: 64ch;
  }
  .estagios-regra b { color: var(--neblina); font-weight: 400; }
  @media (max-width: 900px) {
    .estagio .btn { font-size: 13.5px; }
  }

  /* ---------- posicionamento: o que nao somos ----------
     Duas linhas curtas e uma tabela de comportamento. A negacao sozinha e adjetivo; o que
     sustenta ela e a coluna da direita, que so fala do que acontece todo mes. */
  .contra { border-top: 1px solid var(--fio-forte); margin-top: clamp(30px, 4vw, 52px); }
  .contra-linha {
    display: grid; grid-template-columns: minmax(96px, 150px) 1fr 1fr; gap: 0 clamp(14px, 2vw, 32px);
    padding: 20px 0; border-bottom: 1px solid var(--fio);
    font-size: 15px; line-height: 1.45;
  }
  .contra-eixo {
    font-size: 11.5px; letter-spacing: .18em; text-transform: uppercase;
    color: var(--costeiro); font-weight: 500;
  }
  .contra-eles { color: var(--costeiro); font-weight: 300; }
  .contra-nos { color: var(--neblina); font-weight: 400; }
  .contra-cabeca {
    display: grid; grid-template-columns: minmax(96px, 150px) 1fr 1fr; gap: 0 clamp(14px, 2vw, 32px);
    padding-bottom: 14px;
    font-size: 11.5px; letter-spacing: .18em; text-transform: uppercase; font-weight: 500;
  }
  .contra-cabeca span:nth-child(2) { color: var(--costeiro); }
  .contra-cabeca span:nth-child(3) { color: var(--areia); }
  @media (max-width: 700px) {
    .contra-cabeca { display: none; }
    .contra-linha { grid-template-columns: 1fr; gap: 6px; padding: 18px 0; }
    .contra-eles::before { content: "Agência: "; color: var(--costeiro); }
    .contra-nos::before  { content: "Nós: "; color: var(--areia); }
  }

  /* ---------- brilho que segue o ponteiro ----------
     Radial posicionado por variavel CSS que o JS reescreve no pointermove. Fica atras do
     conteudo, com z-index -1 e isolation no pai, e morre sozinho quando o ponteiro sai.
     So responde a gesto: nao acrescenta nada ao movimento ocioso da pagina. */
  /* O brilho de ponteiro so alcancava .caso, .estagio e a prova do hero. Com a #frentes
     fundida na #etapas e a #como cortada, TRES secoes inteiras ficaram inertes: o problema,
     o quadro comparativo da parceria e o FAQ novo. As tres sao feitas de LINHAS, nao de
     cartoes, entao recebem a lavagem suave e nao o anel de luz. */
  .luz,
  .lista li,
  .contra-linha,
  .faq details { position: relative; isolation: isolate; }
  .luz::before,
  .lista li::before,
  .contra-linha::before,
  .faq details::before {
    content: ""; position: absolute; inset: 0 -14px; z-index: -1; pointer-events: none;
    opacity: var(--luz-on, 0); transition: opacity .7s cubic-bezier(.16,1,.3,1);
    background: radial-gradient(58% 190% at var(--luz-x, 50%) 50%,
      rgba(234,219,190,.10) 0%, rgba(234,219,190,.03) 45%, rgba(234,219,190,0) 80%);
  }
  .palco-fundo .luz::before,
  .palco-fundo .lista li::before {
    background: radial-gradient(58% 190% at var(--luz-x, 50%) 50%,
      rgba(5,15,30,.13) 0%, rgba(5,15,30,.04) 45%, rgba(5,15,30,0) 80%);
  }

  /* ---------- fecho: o instrumento ----------
     A lajota bege saiu. Um bloco claro chapado no meio de uma pagina escura le como
     "secao clara de template", e nao como tecnologia. Aqui o fecho e um INSTRUMENTO:
     fio de 1px em vez de area preenchida, marcas nos quatro cantos, campos sublinhados
     em vez de caixas, e numeros tabulares. A leitura e de painel de bordo, que e
     exatamente o que uma marca chamada Vero Norte, com metodo chamado LEME, deveria
     parecer. Nada de preenchimento: o que desenha e a luz na aresta. */
  .fecho { position: relative; }
  .fecho-grade {
    display: grid; grid-template-columns: 1fr 1fr; gap: 0;
    position: relative; isolation: isolate;
    border-radius: 2px;
    box-shadow: inset 0 0 0 1px var(--fio-forte);
  }
  /* Marcas de canto: quatro cantoneiras de 1px que nao fecham o retangulo. E o detalhe
     que separa "caixa" de "instrumento". */
  .fecho-grade::before, .fecho-grade::after,
  .fecho-texto::before, .fecho-texto::after {
    content: ""; position: absolute; width: 11px; height: 11px; pointer-events: none;
    border: 1px solid var(--areia); z-index: 2;
  }
  .fecho-grade::before { top: -1px; left: -1px; border-right: 0; border-bottom: 0; }
  .fecho-grade::after  { top: -1px; right: -1px; border-left: 0; border-bottom: 0; }
  .fecho-texto::before { bottom: -1px; left: -1px; border-right: 0; border-top: 0; }
  .fecho-texto::after  { bottom: -1px; right: -1px; border-left: 0; border-top: 0;
                         left: auto; right: -1px; }

  .fecho-texto, .fecho-form { padding: clamp(34px, 4.2vw, 62px); position: relative; }
  /* O painel era rgba(5,15,30,.45), ou seja MAIS ESCURO que a secao atras dele: ele afundava
     no fundo em vez de vir para a frente, e no computador, onde ele ocupa so metade da
     largura, o bloco inteiro lia como desligado. Superficie que pede acao sobe, nao desce.
     Agora ele e a coisa mais clara da secao, tem aresta de verdade e uma luz no topo. */
  .fecho-form {
    background:
      linear-gradient(180deg, rgba(222, 229, 237, .085) 0%, rgba(222, 229, 237, .04) 220px,
                              rgba(222, 229, 237, .04) 100%);
    box-shadow: inset 1px 0 0 var(--fio-forte);
  }
  .fecho-texto { border-right: 1px solid var(--fio-forte); }
  .fecho-texto h2 { font-size: var(--d2); margin: 26px 0 0; line-height: .96; }
  .fecho-lead { margin: 26px 0 0; color: var(--costeiro); font-size: 16px; max-width: 34ch; }

  /* Os tres passos sao uma SEQUENCIA de verdade: acontecem nessa ordem e a ordem
     importa. Por isso numerados, e nao com marcador. */
  .fecho-nota { margin: 18px 0 0; color: var(--costeiro); font-size: 13.5px; line-height: 1.55; max-width: 52ch; }
  .fecho-passos { list-style: none; margin: 34px 0 0; padding: 0; border-top: 1px solid var(--fio); }
  .fecho-passos li {
    display: grid; grid-template-columns: 40px 1fr; gap: 0; align-items: baseline;
    padding: 15px 0; border-bottom: 1px solid var(--fio);
    font-size: 14.5px; color: var(--neblina); font-weight: 300;
  }
  .fecho-passos span {
    font-size: 11px; letter-spacing: .14em; color: var(--areia);
    font-variant-numeric: tabular-nums;
  }

  /* ---------- formulário ----------
     Campo sublinhado, nao caixa. Caixa com borda nos quatro lados empilha retangulo
     sobre retangulo e traz de volta a cara de formulario de banco. O fio embaixo
     acende quando o campo recebe foco, e e a unica coisa que se move aqui. */
  .fecho-form .etiqueta { margin-bottom: 30px; }
  .lead-field { display: block; position: relative; margin-bottom: 22px; }
  .lead-field > span {
    display: block; font-size: 11px; letter-spacing: .16em; text-transform: uppercase;
    color: var(--neblina); margin-bottom: 8px; font-weight: 500;
  }
  /* O campo era um fio de 16% de opacidade sobre fundo escuro: some. Um formulario que
     parece desligado nao recebe preenchimento. Agora ele e SUPERFICIE, como o resto da
     pagina: fundo proprio, borda inteira e foco que acende de verdade. */
  .lead-field input {
    width: 100%; font: inherit; font-size: 16px; font-weight: 300;
    color: var(--neblina);
    background: rgba(5, 15, 30, .38);
    border: 1px solid rgba(222, 229, 237, .26);
    border-radius: 10px;
    padding: 13px 14px;
    transition: border-color .3s ease, background .3s ease, box-shadow .3s ease;
  }
  .lead-field input::placeholder { color: rgba(222, 229, 237, .60); }
  .lead-field input:hover { border-color: rgba(222, 229, 237, .42); }
  .lead-field input:focus {
    outline: 0;
    background: rgba(5, 15, 30, .55);
    border-color: var(--horizonte);
    box-shadow: 0 0 0 3px rgba(86, 150, 251, .16);
  }
    .lead-field input[aria-invalid="true"] { border-color: var(--horizonte); border-bottom-width: 2px; }
  /* O seletor precisa empatar com .lead-field > span (0,1,1), senao o rotulo impoe caixa
     alta, tracking e cor ao erro, e o aviso sai identico a mais um nome de campo. */
  .lead-field > span.lead-erro-campo {
    display: block; margin: 7px 0 0; font-size: 12.5px; font-weight: 400;
    letter-spacing: 0; text-transform: none; color: var(--horizonte);
  }
  /* .erro era um gancho morto: o script.js marcava a classe e a folha nao tinha regra. */
  .lead-field.erro > span:first-child { color: var(--horizonte); }

  .fecho-form .btn { margin-top: 8px; width: 100%; justify-content: space-between; }
  /* O SUBMIT, e so ele. O .btn preenche com --base: #050F1E, o azul mais escuro da paleta:
     no hero isso funciona, porque o fundo e escuro igual e o botao le como aresta de luz.
     Dentro do formulario, que agora e a superficie mais CLARA da secao, o mesmo tratamento
     vira buraco, e o anel de 5% deixava o clique mais importante da pagina mais apagado que
     o botao secundario do cabecalho, que tem 26%. Aqui ele passa a ser superficie cheia em
     Azul Marinho, que e da paleta, com anel de 30%. A varredura de luz do conico continua. */
  .fecho-form .lead-submit {
    --base: #264B66;
    box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .30);
  }
  .fecho-form .lead-submit:hover { box-shadow: inset 0 0 0 1px rgba(222, 229, 237, .48); }
  .lead-erro {
    margin: 16px 0 0; font-size: 13.5px; color: var(--horizonte);
    border-left: 1px solid var(--horizonte); padding-left: 12px;
  }
  .fecho-ou { margin: 22px 0 0; font-size: 13.5px; color: var(--costeiro); }
  .fecho-ou a { color: var(--neblina); text-decoration: none; border-bottom: 1px solid var(--fio-forte); }
  .fecho-ou a:hover { border-bottom-color: var(--areia); color: var(--areia); }

  /* Segundo caminho de conversao, e nao nota de rodape. Tem gente que nao preenche
     formulario nenhum, e para essa pessoa o WhatsApp precisa ser um botao do mesmo
     tamanho do outro, nao um link no rodape. */
  .ou-entao {
    margin-top: 26px; padding-top: 22px; border-top: 1px solid var(--fio);
    display: flex; flex-direction: column; gap: 12px; align-items: flex-start;
  }
  .ou-entao > span { font-size: 12.5px; letter-spacing: .02em; color: var(--costeiro); }
  .ou-entao .btn { width: 100%; justify-content: space-between; }

  .form-titulo {
    font-size: clamp(19px, 2vw, 25px); font-weight: 300; line-height: 1.25;
    color: var(--neblina); margin: -18px 0 0; max-width: 26ch;
  }
  .form-sub { margin: 12px 0 26px; font-size: 14.5px; color: var(--costeiro); max-width: 34ch; }
  /* So aparece quando a pessoa chegou por um cartao de estagio. E a confirmacao de que a
     escolha dela nao se perdeu no caminho. */
  .fecho-estagio-linha {
    margin: -14px 0 26px; font-size: 13px; letter-spacing: .04em;
    color: var(--costeiro); text-transform: uppercase;
  }
  .fecho-estagio-linha b { color: var(--areia); font-weight: 500; }
  .lead-promessa {
    margin: 16px 0 0; font-size: 13.5px; line-height: 1.55; color: var(--neblina);
    padding-left: 13px; border-left: 1px solid var(--horizonte);
  }

  /* campo-armadilha: fora da tela, fora do foco, fora do leitor de tela */
  .isca { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; }

  @media (max-width: 900px) {
    .fecho-grade { grid-template-columns: 1fr; }
    .fecho-texto { border-right: 0; border-bottom: 1px solid var(--fio); }
  }

  footer { padding: 110px 0 54px; }
  .assinatura { margin: 0 0 46px; color: var(--neblina); opacity: .93; }
  .assinatura svg { width: 100%; height: auto; display: block; }
  /* Rodape enxuto. O CNPJ e a linha de fundacao sairam a pedido do dono; o link da
     politica FICA, porque a pagina coleta dado pessoal e roda GTM, Pixel e Clarity, e
     isso e exigencia de LGPD e nao decoracao. */
  .rodape-linha { margin: 0 0 26px; color: var(--costeiro); font-size: 13.5px; line-height: 1.6; max-width: 56ch; }
  .rodape {
    display: flex; flex-wrap: wrap; gap: 12px 30px; justify-content: space-between;
    border-top: 1px solid var(--fio); padding-top: 26px;
    font-size: 12.5px; color: var(--costeiro); letter-spacing: .02em;
  }
  .rodape a { color: var(--costeiro); text-decoration: none; border-bottom: 1px solid var(--fio); }
  .rodape a:hover { color: var(--neblina); border-bottom-color: var(--fio-forte); }

  /* Consentimento. A frase e a mesma ja usada no resto do site, de proposito: texto de
     consentimento nao e lugar de variacao criativa. E o unico lugar da pagina que fala
     "voce", porque quem consente e a pessoa, nao a empresa dela. */
  .lead-consent { margin: 14px 0 0; font-size: 12px; line-height: 1.55; color: var(--costeiro); }
  .lead-consent a { color: var(--neblina); text-decoration: none; border-bottom: 1px solid var(--fio-forte); }
  .lead-consent a:hover { border-bottom-color: var(--areia); }


  /* Pular para o conteudo: existe no layout de producao e precisa de estilo, senao fica
     uma ancora solta no canto superior esquerdo de toda pagina. */
  .pular-conteudo {
    position: absolute; left: -9999px; top: 0; z-index: 300;
    background: var(--areia); color: var(--abissal); padding: 11px 18px;
    font-size: 13px; font-weight: 500; text-decoration: none; border-radius: 2px;
  }
  .pular-conteudo:focus { left: 12px; top: 12px; }

  a:focus-visible, button:focus-visible { outline: 1px solid var(--areia); outline-offset: 4px; }

  @media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
    .marcas-trilha, .pre-trilha, .btn, .btn::after, .btn .respira, .pulso i { animation: none !important; }
    section.palco, .palco { position: static; transform: none !important; }
    .palco > .sombra { display: none; }
    .btn { transition: none; }
    /* Sem movimento o conteúdo tem que nascer visível. O script nem chega a criar as
       animações nesse caso, e o preloader não aparece. */
    .revela .w { overflow: visible; }
    .pre { display: none; }
  }
  @media (max-width: 900px) {
    section { padding: 92px 0; }
    /* O botao tem overflow:hidden por causa do anel de luz, entao o que nao cabe some em
       vez de vazar. A 375px o rotulo estourava a caixa em 8px e o texto era cortado. */
    .btn { padding: 7px 7px 7px 20px; gap: 12px; font-size: 14.5px; }
    .btn .ponto { width: 38px; height: 38px; }
    .acoes .btn { flex: 1 1 100%; justify-content: space-between; }
    /* 10,5px e pequeno demais para etiqueta em caixa alta com tracking largo no celular. */
    .etiqueta { font-size: 11.5px; letter-spacing: .2em; }
    .etapa .quando { font-size: 11px; }
    /* Alvo de toque: o link da logo e os do rodape tinham 17px de altura. */
    .marca { padding: 13px 0; }
    .rodape a, .lead-consent a, .ou-entao > span { display: inline-block; padding: 13px 0; }
    .hero h1 { margin-top: 24px; }
    .lead { margin-top: 26px; font-size: 16px; }
    .acoes { margin-top: 32px; }
    .etapa { grid-template-columns: 92px 1fr; gap: 0 26px; padding: 38px 0; }
    .etapa p { grid-column: 2; margin-top: 16px; }
    .cabeca { grid-template-columns: 1fr; margin-bottom: 40px; gap: 18px; }
    .cabeca h2, .cabeca:not(:has(p:not(.etiqueta))) h2 { max-width: none; }
  }
  @media (max-width: 560px) {
    /* Em 360x740 o CTA do hero fechava com 5px de folga ate a dobra, o que passa no teste e
       quebra no primeiro celular com fonte um pouco maior. Os tres respiros abaixo somam 22px
       e nao mudam o desenho: e o unico lugar da pagina onde o aperto vale mais que o ar. */
    .hero h1 { margin-top: 18px; }
    .hero .lead { margin-top: 20px; }
    .hero .acoes { margin-top: 26px; }
    .barra .btn { padding: 9px; gap: 0; }
    /* [a11y] display:none tirava o unico texto do link e o CTA do cabecalho ficava sem
       nome nenhum na arvore de acessibilidade abaixo de 560px. O .btn ja tem
       overflow: hidden, entao o elemento de 1px nao vaza nem cria rolagem lateral. */
    .barra .btn .texto {
      position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
      border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
    }
    .marca svg { height: 17px; }
    /* A coluna da letra deixava 182px para o texto, cerca de 22 caracteres por linha. */
    .etapa { grid-template-columns: 1fr; gap: 0; padding: 30px 0; }
    .etapa .letra { line-height: 1; letter-spacing: 0; margin-bottom: 8px; }
    .etapa p { grid-column: 1; margin-top: 14px; }
  }

  /* ---------- dúvidas (sanfona nativa) ----------
     <details name="faq"> resolve "uma aberta por vez" sem JS, com <summary> inteiro
     clicável e teclado funcionando. Esta folha não tinha nenhuma regra de details/summary,
     e a sanfona pronta mora em css/site.css, que esta página não carrega. */
  .faq { border-top: 1px solid var(--fio); }
  /* O FAQ virou o fecho da pagina, entao precisa entregar a pessoa em algum lugar. */
  .faq-fecho { margin: clamp(30px, 3.4vw, 46px) 0 0; color: var(--neblina); font-weight: 300;
               font-size: clamp(17px, min(1.7vw, 2.4vh), 21px); }
  .faq details { border-bottom: 1px solid var(--fio); }
  .faq summary {
    list-style: none; cursor: pointer;
    display: grid; grid-template-columns: 1fr 22px; align-items: center; gap: 20px;
    padding: 24px 0; color: var(--neblina);
    font-size: clamp(16px, 1.5vw, 18.5px); font-weight: 400; line-height: 1.32;
    transition: color .2s ease;
  }
  .faq summary::-webkit-details-marker { display: none; }
  .faq summary::after {
    content: ""; justify-self: end; width: 11px; height: 11px;
    border-right: 1px solid var(--areia); border-bottom: 1px solid var(--areia);
    transform: translateY(-3px) rotate(45deg); transition: transform .25s ease;
  }
  .faq summary:hover { color: var(--areia); }
  .faq details[open] summary { color: var(--areia); }
  .faq details[open] summary::after { transform: translateY(2px) rotate(225deg); }
  .faq-resposta {
    margin: 0 0 28px; max-width: 68ch; padding-right: clamp(0px, 6vw, 90px);
    color: var(--costeiro); font-size: 16px; line-height: 1.6;
  }
  @media (max-width: 560px) {
    .faq summary { padding: 20px 0; gap: 14px; }
    .faq-resposta { font-size: 15.5px; padding-right: 0; }
  }
  @media (prefers-reduced-motion: reduce) {
    .faq summary, .faq summary::after { transition: none; }
  }
