/* ============================================================
   LEME: a folha da landing page unica da Vero Norte.
   Mundo visual proprio: NAO depende de styles.css nem de css/site.css.
   ============================================================ */
/* ============================================================
     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 {
    --abissal:   #050F1E;
    --profundo:  #182752;
    --neblina:   #DEE5ED;
    --costeiro:  #9CB2BF;
    --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);
  }
  /* 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. */
  .display { text-transform: uppercase; letter-spacing: -0.032em; line-height: 0.94; font-weight: 500; }
  .display .leve { font-weight: 200; color: var(--costeiro); }

  .etiqueta {
    font-size: 10.5px; font-weight: 500; letter-spacing: 0.26em; text-transform: uppercase;
    color: var(--areia); margin: 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. */
  .revela .w { display: inline-flex; overflow: hidden; padding: .05em .02em .09em; }
  .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 o unico lugar da pagina, fora das quatro letras do metodo, onde a terracota
     aparece. E a melhor posicao possivel para um acento: marca a acao. Seta em Branco
     Polar da 3,5:1 sobre a terracota, que passa para elemento grafico. */
  .btn .ponto {
    flex: none; width: 42px; height: 42px; border-radius: 50%;
    background: var(--terracota); color: #FFFFFF;
    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(--terracota); }
  .pre-trilha .fraco { color: rgba(156,178,191,.42); }

  /* 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(--terracota); }
  .pre[hidden] { display: 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; box-shadow: inset 0 0 0 1px var(--fio-forte); background: none; border: 0; }
  .barra .btn::after { display: none; }
  .barra .btn .ponto { width: 32px; height: 32px; }
  .barra .btn .ponto svg { width: 14px; height: 14px; }

  /* ---------- hero ---------- */
  .hero { position: relative; padding: 112px 0 104px; overflow: hidden; }
  /* A maciez NÃO vem de blur. Vem do navegador esticando um bitmap de 120 linhas para a
     altura inteira da seção. Blur aqui só custaria GPU e lavaria o preto. Sem opacity
     também: a parte de baixo do canvas é literalmente a mesma cor do fundo da página, e é
     isso que faz a emenda sumir. */
  #ceu { position: absolute; inset: 0; width: 100%; height: 100%; display: block; pointer-events: none; }
  .hero .wrap { position: relative; z-index: 1; }
  /* 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. */
  .hero h1 { font-size: clamp(36px, 5vw, 68px); margin: 30px 0 0; max-width: 19ch; }
  .lead { max-width: 52ch; margin: 32px 0 0; font-size: 17px; color: var(--costeiro); }
  .lead b { color: var(--neblina); font-weight: 400; }
  .acoes { display: flex; flex-wrap: wrap; gap: 14px; margin: 38px 0 0; }

  /* números: régua fina, tabular, sem cara de barra de métrica */
  .prova { border-top: 1px solid var(--fio); margin-top: 76px; display: grid; grid-template-columns: repeat(3, 1fr); }
  .prova div { padding: 34px 30px 0 0; }
  .prova .n {
    display: block; font-size: clamp(30px, 3.6vw, 46px); font-weight: 200;
    letter-spacing: -0.035em; line-height: 1; font-variant-numeric: tabular-nums;
    color: var(--areia);
  }
  .prova .d { display: block; font-size: 13px; color: var(--costeiro); margin-top: 14px; max-width: 24ch; line-height: 1.55; }


  /* ---------- 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: clamp(30px, 4.6vw, 62px); max-width: 15ch; }
  .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: clamp(58px, 7.6vw, 104px); font-weight: 200; line-height: .78;
    color: var(--terracota); 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: 10.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 ----------
     Tabela de precisao, nao card de depoimento. O que sustenta cada linha nao e o numero
     grande: e a BASE embaixo dele, dizendo de onde o numero saiu. Numero sem base e
     cartaz; numero com base e prova, e e a base que da direito de cobrar caro.
     Os clientes vao sem nome de proposito: o caso e nosso, a marca e deles. */
  .casos { border-top: 1px solid var(--fio); }
  .caso {
    display: grid; grid-template-columns: 210px 1fr; gap: 0 46px; align-items: start;
    padding: 40px 0; border-bottom: 1px solid var(--fio);
  }
  .caso-n {
    font-size: clamp(34px, 4vw, 52px); font-weight: 200; line-height: 1;
    letter-spacing: -.035em; color: var(--areia);
    font-variant-numeric: tabular-nums; display: block;
  }
  .caso-de {
    display: block; margin-top: 10px; font-size: 11px; letter-spacing: .16em;
    text-transform: uppercase; color: var(--costeiro); font-variant-numeric: tabular-nums;
  }
  .caso h3 {
    font-size: 11px; font-weight: 500; letter-spacing: .24em; text-transform: uppercase;
    color: var(--costeiro);
  }
  .caso p { margin: 13px 0 0; font-size: 17px; color: var(--neblina); font-weight: 300; max-width: 46ch; }
  .caso .base {
    margin-top: 14px; font-size: 12.5px; color: var(--costeiro); max-width: 52ch;
    padding-left: 13px; border-left: 1px solid var(--fio-forte);
    font-variant-numeric: tabular-nums; line-height: 1.6;
  }
  @media (max-width: 900px) {
    .caso { grid-template-columns: 1fr; gap: 16px 0; padding: 30px 0; }
    .caso p { font-size: 16px; }
  }


  /* ---------- o que fazemos ----------
     Linha, nao card: letra em terracota 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(--terracota); line-height: 1; }
  .frente h3 { font-size: clamp(24px, 3.4vw, 44px); 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(40px, 4.6vw, 64px); font-weight: 200; line-height: 1;
    letter-spacing: -.045em; color: var(--terracota); 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%); transition: transform .5s cubic-bezier(.16,1,.3,1);
  }
  .barra-fixa[data-ver="1"] { transform: none; }
  .barra-fixa .btn { width: 100%; justify-content: space-between; font-size: 14px; }
  @media (min-width: 861px) { .barra-fixa { display: none; } }

  @media (max-width: 900px) {
    .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: sobre a terracota a UNICA cor da paleta que passa AA para texto corrido
     e o Azul Abissal, com 4,51:1. Branco Polar da 4,26 e reprova. Por isso o palco de
     prova tem texto quase-preto, e nao claro como o da referencia.
     ============================================================ */
  /* 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. */
  section.palco { position: sticky; top: 0; transform-origin: 50% 0%; z-index: 1; will-change: transform; }
  .palco > .sombra {
    content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 3;
    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); }

  .palco-terracota { background: var(--terracota); color: var(--abissal); }
  section.palco { padding: clamp(66px, 7vh, 92px) 0; }
  .palco-terracota .etiqueta { color: var(--abissal); opacity: .72; }
  .palco-terracota .cabeca p { color: var(--abissal); opacity: .82; }
  .palco-terracota .casos { border-top-color: rgba(5,15,30,.22); }
  .palco-terracota .caso { border-bottom-color: rgba(5,15,30,.22); }
  .palco-terracota .caso-n { color: var(--abissal); }
  .palco-terracota .caso-de,
  .palco-terracota .caso h3 { color: var(--abissal); opacity: .66; }
  .palco-terracota .caso p { color: var(--abissal); }
  .palco-terracota .caso .base { color: var(--abissal); opacity: .74; border-left-color: rgba(5,15,30,.3); }
  .palco-terracota .revela .ch { color: var(--abissal); }

  .palco-areia { background: var(--areia); color: var(--abissal); }
  .palco-areia .etiqueta { color: var(--marinho); }
  .palco-areia .revela .ch { color: var(--abissal); }
  .palco-areia .fecho-grade { box-shadow: inset 0 0 0 1px rgba(5,15,30,.16); }
  .palco-areia .fecho-grade::before, .palco-areia .fecho-grade::after,
  .palco-areia .fecho-texto::before, .palco-areia .fecho-texto::after { border-color: var(--abissal); }
  .palco-areia .fecho-texto { border-right-color: rgba(5,15,30,.16); }
  .palco-areia .fecho-lead { color: var(--atlantico); }
  .palco-areia .fecho-passos { border-top-color: rgba(5,15,30,.16); }
  .palco-areia .fecho-passos li { border-bottom-color: rgba(5,15,30,.16); color: var(--abissal); }
  .palco-areia .fecho-passos span { color: var(--marinho); }
  .palco-areia .lead-field > span { color: var(--marinho); }
  .palco-areia .lead-field input { color: var(--abissal); border-bottom-color: rgba(5,15,30,.26); }
  .palco-areia .lead-field input::placeholder { color: rgba(38,54,77,.55); }
  .palco-areia .lead-field input:focus { border-bottom-color: var(--abissal); }
  .palco-areia .lead-consent, .palco-areia .fecho-ou { color: var(--atlantico); }
  .palco-areia .lead-consent a, .palco-areia .fecho-ou a { color: var(--abissal); border-bottom-color: rgba(5,15,30,.3); }
  /* Dentro do palco claro o botao inverte: base escura, luz varrendo continua igual. */
  .palco-areia .btn { --base: #050F1E; --luz: #EADBBE; color: var(--neblina); }

  /* ---------- 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. */
  .luz { position: relative; isolation: isolate; }
  .luz::before {
    content: ""; position: absolute; inset: 0; 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-terracota .luz::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;
    box-shadow: inset 0 0 0 1px var(--fio);
  }
  /* 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; }
  .fecho-texto { border-right: 1px solid var(--fio); }
  .fecho-texto h2 { font-size: clamp(28px, 3.4vw, 46px); margin: 26px 0 0; }
  .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-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 { position: relative; margin-bottom: 22px; }
  .lead-field > span {
    display: block; font-size: 10.5px; letter-spacing: .2em; text-transform: uppercase;
    color: var(--costeiro); margin-bottom: 7px;
  }
  .lead-field input {
    width: 100%; background: none; border: 0; border-bottom: 1px solid var(--fio-forte);
    color: var(--neblina); font: inherit; font-size: 16px; font-weight: 300;
    padding: 9px 0; border-radius: 0;
    transition: border-color .45s ease;
  }
  .lead-field input::placeholder { color: rgba(156, 178, 191, .45); }
  .lead-field input:focus { outline: 0; border-bottom-color: var(--areia); }
  .lead-field input[aria-invalid="true"] { border-bottom-color: var(--terracota); }
  .lead-erro-campo { display: block; margin-top: 7px; font-size: 12.5px; color: var(--terracota); }

  .fecho-form .btn { margin-top: 8px; width: 100%; justify-content: space-between; }
  .lead-erro {
    margin: 16px 0 0; font-size: 13.5px; color: var(--terracota);
    border-left: 1px solid var(--terracota); 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); }

  /* 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 { 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; }

  /* 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); }
  .rodape-legal a { color: var(--costeiro); text-decoration: none; border-bottom: 1px solid var(--fio); }
  .rodape-legal a:hover { color: var(--neblina); border-bottom-color: var(--fio-forte); }

  /* 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 { animation: none !important; }
    .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; }
    .hero { padding: 84px 0 76px; }
    .hero h1 { font-size: clamp(31px, 8.4vw, 44px); 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; }
    .prova { grid-template-columns: 1fr; margin-top: 70px; }
    .prova div { padding: 26px 0 0; border-bottom: 1px solid var(--fio); padding-bottom: 26px; }
    .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) {
    .barra .btn { padding: 9px 12px; gap: 0; }
    .barra .btn .texto { display: none; }
    .marca svg { height: 17px; }
  }
