/* ==========================================================================
   DESIGN SYSTEM — portado de greatone.com.br
   Monocromático (preto / creme / branco), com o verde do WhatsApp como único
   ponto de cor, reservado ao CTA.
   Tipografia: Geist + Geist Mono no lugar de RF Dewi + DM Mono (comerciais).
   ========================================================================== */
:root{
  /* --- peles --- */
  --preto:#040508;        /* fundo escuro dominante */
  --preto-2:#0C0C0C;      /* variação sutil */
  --creme:#F5F4F1;        /* fundo claro nº1 */
  --branco:#FFFFFF;       /* fundo claro nº2 */
  --tinta:#0D0A12;        /* texto sobre claro */
  --claro:#F0EEF5;        /* headings sobre escuro */

  /* --- cor única --- */
  --zap:#25D366;
  --zap-escuro:#062812;
  --zap-hover:#1FBA59;

  /* --- tipografia --- */
  --sans:"Geist",system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --mono:"Geist Mono",ui-monospace,"SF Mono",Menlo,Consolas,monospace;

  /* --- ritmo --- */
  --pad:clamp(5rem,10vh,10rem);
  --raio:20px;

  /* --- movimento: mesmas curvas da Great One --- */
  --rapido:.2s ease;
  --medio:.4s cubic-bezier(.16,1,.3,1);
  --lento:.7s cubic-bezier(.16,1,.3,1);

  /* --- camadas --- */
  --z-conteudo:1; --z-flutuante:40; --z-cabecalho:50;
}

/* --- As três peles. Cada seção herda um conjunto completo de papéis, e é a
       alternância entre elas que dá o peso editorial do design da Great One. --- */
.pele-preta{
  --papel:var(--preto); --papel-2:var(--preto-2);
  --sobre:var(--claro); --corpo:#D8D8D8; --fraco:rgba(216,216,216,.62);
  --fio:rgba(255,255,255,.12); --fio-forte:rgba(255,255,255,.30);
  --cartao:rgba(255,255,255,.04); --cartao-fio:rgba(255,255,255,.09);
}
.pele-creme{
  --papel:var(--creme); --papel-2:#EFEEEA;
  --sobre:var(--tinta); --corpo:rgba(13,10,18,.88); --fraco:rgba(13,10,18,.70);
  --fio:rgba(13,10,18,.14); --fio-forte:rgba(13,10,18,.32);
  --cartao:rgba(13,10,18,.035); --cartao-fio:rgba(13,10,18,.11);
}
.pele-branca{
  --papel:var(--branco); --papel-2:#FAFAF9;
  --sobre:var(--tinta); --corpo:rgba(13,10,18,.88); --fraco:rgba(13,10,18,.70);
  --fio:rgba(13,10,18,.13); --fio-forte:rgba(13,10,18,.32);
  --cartao:rgba(13,10,18,.03); --cartao-fio:rgba(13,10,18,.10);
}

/* ==========================================================================
   BASE
   ========================================================================== */
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box;min-width:0}
/* `height: auto` e obrigatorio, nao estetica: todo <img> da pagina tem os atributos
   width/height (que reservam o espaco e matam o pulo do layout), e sem esta linha o
   navegador obedece a altura do atributo e ESMAGA a foto quando a largura e' fluida.
   Ja foi ao ar assim num antes/depois. tests/test_qualidade_sites.py cobra. */
img{max-width:100%;display:block;height: auto}
svg,picture{max-width:100%;display:block}

/* O atributo `hidden` do HTML só esconde por causa da regra `[hidden]{display:none}`
   do próprio navegador — que tem especificidade de ELEMENTO. Qualquer `display`
   declarado numa classe vence e o elemento volta pra tela, em silêncio.
   Mordeu duas vezes nesta página no mesmo dia:
     · `.orc-pronto{display:flex}` deixava "Seu número está aí do lado" visível nas
       quatro perguntas, e não só na última;
     · `.orc-linhas div{display:flex}` deixava a linha "Além do site · sob orçamento"
       visível pra quem não marcou extra nenhum — preço errado na cara do lead.
   Pior: `el.hidden` continua reportando `true` nos dois casos, então teste que olha
   a propriedade passa enquanto a tela mostra o contrário. Só `getComputedStyle` pega.
   `!important` aqui é o uso legítimo: `hidden` significa "não é relevante", e nada
   deveria poder discutir isso. */
[hidden]{display:none!important}
/* `scroll-padding-top` é o que impede o cabeçalho fixo de cobrir o título da seção
   quando alguém chega por âncora. Vale pra tudo — clique, link vindo de fora com
   `#planos`, Tab do teclado — e não depende de JS. Era feito à mão no script (offset
   de -72) e por isso só valia pro clique. */
html{scroll-behavior:smooth;scroll-padding-top:calc(clamp(.8rem,2vw,1.5rem) * 2 + 44px + 1rem);overflow-x:hidden;-webkit-text-size-adjust:100%}
body{
  background:var(--preto); color:#D8D8D8;
  font-family:var(--sans); font-size:1rem; line-height:1.5; font-weight:400;
  -webkit-font-smoothing:antialiased; overflow-x:hidden;
}
::selection{background:var(--zap);color:var(--zap-escuro)}
a{color:inherit;text-decoration:none}
ul{list-style:none}

section{position:relative;background:var(--papel);color:var(--corpo);z-index:var(--z-conteudo)}
.bloco{padding-block:var(--pad)}
.bloco-curto{padding-block:clamp(3.5rem,7vh,6rem)}
.bloco-topo0{padding-top:0}
.wrap{width:min(100%,1180px);margin-inline:auto;padding-inline:clamp(1.25rem,4vw,4rem)}

h1,h2,h3,h4{color:var(--sobre);font-weight:700;letter-spacing:-.02em;text-wrap:balance;
  overflow-wrap:break-word;line-height:1.05}
h1{font-size:clamp(2.25rem,6vw,4.4rem);font-weight:600;line-height:1.03;letter-spacing:-.025em}
h2{font-size:clamp(1.9rem,4.4vw,3.5rem);letter-spacing:-.028em}
h2.h2-media{font-size:clamp(1.65rem,3vw,2.5rem);letter-spacing:-.02em}
h3{font-size:1.4rem;font-weight:600;line-height:1.3;letter-spacing:-.015em}
p{text-wrap:pretty}

/* Ênfase sem cor: num sistema monocromático o realce vem da troca de família,
   não de um destaque colorido. A palavra sai em Geist Mono. */
.em,.serif{font-family:var(--mono);font-style:normal;font-weight:500;letter-spacing:-.02em}

/* --- rótulo de seção: a assinatura tipográfica da Great One --- */
.k{
  display:block; font-family:var(--mono); font-size:.8125rem; font-weight:400;
  text-transform:uppercase; letter-spacing:.15em; color:var(--fraco); margin-bottom:1.25rem;
}
.k::before{content:"/ "}

.sec-h{margin-bottom:clamp(2.5rem,5vw,4rem);max-width:26ch}
.sec-h.larga{max-width:34ch}
.lede{font-size:clamp(1.0625rem,1.6vw,1.25rem);line-height:1.45;color:var(--corpo);max-width:58ch}
.nota{font-size:1rem;line-height:1.6;color:var(--fraco);max-width:68ch}
.rodape-nota{margin-top:clamp(2rem,4vw,3rem)}
.virada{margin-top:clamp(2rem,4vw,3rem);color:var(--sobre);font-weight:600;max-width:30ch}
/* `dialogo-aberto` vale pro menu E pro visor da galeria. Era `menu-aberto` e só o
   menu trancava a rolagem: com o visor aberto, roda do mouse fora dele rolava a
   página por trás do demo. */
html.dialogo-aberto,html.dialogo-aberto body{overflow:hidden}

/* ==========================================================================
   BOTÕES — pílula, como toda a Great One
   ========================================================================== */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.6rem;
  border-radius:9999px;border:1px solid transparent;cursor:pointer;
  font-family:var(--sans);font-size:1rem;font-weight:500;line-height:1.2;
  padding:1rem 1.75rem;min-height:52px;text-align:center;
  transition:background var(--rapido),border-color var(--rapido),color var(--rapido),transform var(--medio);
}
.btn:hover{transform:translateY(-2px)}
.btn:active{transform:translateY(0)}

/* CTA de conversa: o único elemento colorido da página inteira. */
.btn-zap{background:var(--zap);color:var(--zap-escuro);border-color:var(--zap);font-weight:600}
.btn-zap:hover{background:var(--zap-hover);border-color:var(--zap-hover)}
/* Pílula sólida clara — o "Let's Talk" dele. */
.btn-solido{background:var(--sobre);color:var(--papel);border-color:var(--sobre)}
.btn-solido:hover{background:transparent;color:var(--sobre)}
/* Contorno, funciona sobre qualquer pele. */
.btn-linha{background:transparent;color:var(--sobre);border-color:var(--fio-forte)}
.btn-linha:hover{border-color:var(--sobre)}
.btn-mini{font-size:.875rem;padding:.6rem 1.15rem;min-height:44px}
.zap-icone{width:19px;height:19px;flex:0 0 auto}

/* O anel de foco usa --sobre, nao o verde do WhatsApp: sobre a pele creme o verde
   mede ~1,9:1 contra o fundo e um indicador de foco precisa de 3:1. --sobre e' a
   tinta da propria pele, entao vira claro no preto e escuro no creme sozinho. */
a:focus-visible,.btn:focus-visible,button:focus-visible{outline:2px solid var(--sobre);outline-offset:3px}

/* ==========================================================================
   CABEÇALHO FIXO
   ========================================================================== */
.cabecalho{
  position:fixed;inset:0 0 auto 0;z-index:var(--z-cabecalho);
  display:flex;align-items:center;justify-content:space-between;gap:1rem;
  padding:clamp(.8rem,2vw,1.5rem) clamp(1.25rem,4vw,4rem);
  color:var(--claro);border-bottom:1px solid transparent;
  transition:background var(--medio),border-color var(--medio);
}
/* Sem backdrop-filter: a 88% de opacidade o desfoque não aparecia, e mesmo
   assim obrigava o navegador a repintar a faixa borrada a cada frame de
   rolagem. Subindo pra 94% o resultado visual é o mesmo, de graça. */
.cabecalho.colado{background:rgba(4,5,8,.94);border-bottom-color:rgba(255,255,255,.10)}
/* min-height de 44px: o link da marca e' um alvo de toque como qualquer outro, e
   media 26px de altura. Sem padding vertical pra nao empurrar a barra inteira. */
.marca{display:inline-flex;align-items:center;gap:.6rem;min-height:44px;font-size:1rem;font-weight:600;letter-spacing:-.01em;color:var(--claro)}
.marca svg{width:26px;height:26px;flex:0 0 auto}
.cabecalho .btn{color:var(--zap-escuro)}
/* Abaixo de 481px este botão é o CTA PERMANENTE (o flutuante saiu, ⚖️#20): vira só o
   ícone num alvo redondo de 44px, pra caber ao lado da marca e do Menu sem apertar
   nenhum dos dois. Ele não sobrepõe conteúdo por construção — mora no cabeçalho, que
   é uma faixa com fundo próprio, e era exatamente isso que o círculo fixo não tinha. */
@media(max-width:480px){
  .cabecalho .btn-zap{
    width:44px;height:44px;min-height:44px;padding:0;border-radius:50%;
    display:grid;place-items:center;flex:0 0 auto
  }
  .cabecalho .btn-zap .btn-zap-rotulo{
    position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap
  }
  .cabecalho .btn-zap .zap-icone{width:21px;height:21px}
}
.cab-dir{display:flex;align-items:center;gap:.6rem}

/* Relógio local. Tabular-nums é obrigatório: sem ele os dígitos têm larguras
   diferentes e a faixa toda tremula uma vez por segundo, puxando o olho pro
   canto errado da tela. */
.relogio{
  display:none;align-items:baseline;gap:.5rem;
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;
  color:rgba(240,238,245,.66);
}
.relogio time{font-variant-numeric:tabular-nums;color:var(--claro)}
@media(min-width:920px){.relogio:not([hidden]){display:flex}}

/* ==========================================================================
   HERO
   ========================================================================== */
.hero{
  min-height:100svh;display:flex;flex-direction:column;justify-content:flex-end;
  padding-top:clamp(6.5rem,16vh,10rem);overflow:hidden;
}
/* Fundo: brilho radial discreto + grade de fios finíssimos. Substitui a cena
   Three.js da Great One sem custar centenas de KB. */
.hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(120% 78% at 78% -12%, rgba(255,255,255,.10), transparent 58%),
    radial-gradient(80% 55% at 2% 110%, rgba(255,255,255,.05), transparent 62%);
}
.hero::after{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.55;
  background-image:linear-gradient(90deg,rgba(255,255,255,.05) 1px,transparent 1px);
  background-size:clamp(84px,12vw,168px) 100%;
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 28%,#000 72%,transparent);
  mask-image:linear-gradient(180deg,transparent,#000 28%,#000 72%,transparent);
}
.hero .wrap{position:relative;z-index:2;flex:1;display:flex;flex-direction:column;justify-content:center;padding-block:clamp(2rem,5vh,4rem)}
/* Véu entre a malha de pontos e o texto. Medido no celular: os pontos do WebGL cruzavam o
   parágrafo do herói — o único que explica o que eu faço — e no sol isso come a leitura.
   Fica DENTRO do `.wrap` (que já é o z-index 2), então cobre o canvas sem cobrir o texto:
   `z-index:-1` desce só até o fundo do próprio contexto. Máscara nas bordas pra não virar
   um retângulo visível sobre o gradiente. */
.hero .wrap::before{
  content:"";position:absolute;z-index:-1;pointer-events:none;
  inset:-1.5rem -1.5rem -1rem -1.5rem;
  background:radial-gradient(120% 78% at 22% 50%, rgba(4,5,8,.82), rgba(4,5,8,.55) 46%, transparent 72%);
}
.hero-tag{
  font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.15em;
  color:var(--fraco);max-width:44ch;margin-bottom:clamp(1.5rem,4vw,2.5rem);line-height:1.7
}
.hero h1{max-width:17ch}
.hero .lede{margin-top:clamp(1.25rem,3vw,2rem)}
.hero-cta{margin-top:clamp(1.75rem,4vw,2.75rem);display:flex;flex-wrap:wrap;gap:.75rem}

/* As chaves `?sem=marquee` e `?sem=tudo` (script.js, topo) desligam também o que é
   animação de CSS puro — senão bissectar o travamento deixaria metade ligada. */
html.sem-marquee .faixa-trilho,
html.sem-tudo .faixa-trilho{animation:none;width:auto}
html.sem-tudo .letras-set:nth-child(2){display:none}

/* --- faixa correndo: os selos de confiança viram marquee --- */
.faixa{
  position:relative;z-index:2;border-top:1px solid var(--fio);border-bottom:1px solid var(--fio);
  padding-block:1.05rem;overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);
}
.faixa-trilho{display:flex;width:max-content;animation:correr 28s linear infinite}
.faixa-set{display:flex;align-items:center;gap:clamp(2rem,5vw,4rem);padding-right:clamp(2rem,5vw,4rem)}
.faixa-set li{
  display:inline-flex;align-items:center;gap:.55rem;white-space:nowrap;
  font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.12em;color:var(--fraco)
}
.faixa-set li b{color:var(--sobre);font-weight:500}
.faixa-set li::before{content:"✦";font-size:.7em;opacity:.8}
@keyframes correr{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}

/* ==========================================================================
   LISTA COM RÉGUA — o padrão de itens da Great One, no lugar de grade de cards
   ========================================================================== */
.regua{display:grid;gap:0;border-top:1px solid var(--fio)}
.regua > li,.regua > div{
  display:grid;gap:.35rem 2.5rem;padding-block:clamp(1.35rem,2.6vw,1.9rem);
  border-bottom:1px solid var(--fio);
}
@media(min-width:800px){
  .regua.duas > li,.regua.duas > div{grid-template-columns:minmax(0,17rem) minmax(0,1fr);align-items:start}
}
.regua b{display:block;color:var(--sobre);font-size:1.1875rem;font-weight:600;letter-spacing:-.015em;line-height:1.3}
.regua span{color:var(--fraco);font-size:1rem;line-height:1.55;max-width:62ch}

/* --- variante numerada: só onde há sequência real (os 3 passos) --- */
.regua.numerada{counter-reset:passo}
.regua.numerada > div{grid-template-columns:auto minmax(0,1fr);gap:.35rem 1.5rem}
@media(min-width:800px){.regua.numerada > div{grid-template-columns:auto minmax(0,15rem) minmax(0,1fr)}}
.regua.numerada > div::before{
  counter-increment:passo;content:"0" counter(passo);grid-row:span 2;
  font-family:var(--mono);font-size:.8125rem;letter-spacing:.1em;color:var(--fraco);padding-top:.35rem
}
/* Abaixo de 800px o grid é `auto minmax(0,1fr)` e a colocação automática jogava a
   DESCRIÇÃO na coluna `auto`, junto com o número. Como `auto` cresce até caber o
   conteúdo, a frase inteira comia a largura e sobrava **0px** pra coluna do título:
   ele ficava espremido na borda direita, uma letra por linha. (Medido: col1 329px,
   col2 0px, o <b> em left:373 com width:0.)
   Prendendo título e descrição na coluna 2, a coluna 1 volta a medir só o "01".
   Não foi pego pelas checagens de overflow porque nada ultrapassa a janela — o
   texto vaza dentro do próprio grid. */
@media(max-width:799.98px){
  .regua.numerada > div::before{grid-row:auto}
  .regua.numerada > div > b,
  .regua.numerada > div > span{grid-column:2}
}

/* --- variante com check (a seção de checagem) --- */
.regua.checada > li{grid-template-columns:auto minmax(0,1fr);gap:1rem;align-items:start}
.regua.checada svg{width:18px;height:18px;flex:0 0 auto;margin-top:.28rem;color:var(--sobre);opacity:.75}
.regua.checada span{color:var(--corpo);font-size:1.0625rem;max-width:56ch}
@media(min-width:900px){.regua.checada{grid-template-columns:1fr 1fr;column-gap:3.5rem}
  .regua.checada > li:nth-last-child(-n+2){border-bottom:0}}

/* ==========================================================================
   ÂNCORA DE PREÇO
   ========================================================================== */
/* ATENÇÃO À UNIDADE. `ch` resolve contra a fonte do PRÓPRIO elemento, e o `.cx`
   está a 16px — o `max-width:22ch` que estava aqui dava **233px medidos**, com um
   número de 78,75px dentro. Resultado: "R$ 3.000 a R$ 8.000" rachava em quatro
   linhas, e preço partido no meio do valor mata a única função desta seção, que é
   ancorar o preço dele contra o da agência. Se não se lê o número de uma vez, a
   comparação não acontece.
   Aqui o limite é em `rem`, que não depende da fonte do filho. Medido no Geist:
   o número ocupa ~9,8x o tamanho da fonte, então 5rem (80px) pede 783px e cabe
   nos 864px de `54rem`. O `p` perdeu o cap próprio de propósito — quem manda na
   largura é o `.cx`, senão ele volta a espremer o número. */
.ancora .cx{max-width:min(100%,54rem)}
.ancora p:first-child{font-size:clamp(1.5rem,3.4vw,2.5rem);line-height:1.15;letter-spacing:-.02em;color:var(--sobre);font-weight:600}
.ancora .em{display:block;font-size:clamp(1.9rem,7.2vw,5rem);line-height:1;letter-spacing:-.04em;margin-block:.25em .15em;font-weight:400}
.ancora .risco{color:var(--fraco);font-size:1.0625rem;max-width:46ch;margin-top:1.25rem}

/* ==========================================================================
   PLANOS
   ========================================================================== */
.grade{display:grid;gap:1.25rem;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;max-width:920px}
.plano{
  position:relative;display:flex;flex-direction:column;height:100%;
  background:var(--cartao);border:1px solid var(--cartao-fio);border-radius:var(--raio);
  padding:clamp(1.75rem,3vw,2.25rem);
  transition:border-color var(--medio),transform var(--medio);
}
.plano:hover{border-color:var(--fio-forte);transform:translateY(-4px)}
/* O plano indicado inverte a pele: creme sólido no meio do preto. É o contraste
   que a Great One usa entre seções, aplicado a um cartão. */
.plano.top{
  background:var(--creme);border-color:var(--creme);
  --sobre:var(--tinta);--corpo:rgba(13,10,18,.88);--fraco:rgba(13,10,18,.70);
  --fio:rgba(13,10,18,.14);--fio-forte:rgba(13,10,18,.32);--papel:var(--creme);
}
.selo{
  position:absolute;top:1.25rem;right:1.25rem;
  font-family:var(--mono);font-size:.75rem;letter-spacing:.1em;text-transform:uppercase;
  color:var(--fraco);border:1px solid var(--fio-forte);border-radius:9999px;padding:.3rem .7rem;white-space:nowrap
}
.plano h3{padding-right:9rem}
.plano .tag{color:var(--fraco);font-size:1rem;margin-top:.4rem;max-width:34ch}
.preco{margin:clamp(1.5rem,3vw,2rem) 0 .2rem;display:flex;align-items:baseline;gap:.35rem;flex-wrap:wrap}
.preco .cif{font-family:var(--mono);font-size:clamp(2.4rem,5vw,3.25rem);line-height:1;letter-spacing:-.04em;color:var(--sobre);font-weight:400}
.preco .cif .rs{font-size:.42em;letter-spacing:0;color:var(--fraco);margin-right:.2em}
.preco .cif .apart{font-size:.32em;letter-spacing:.02em}
.preco .por{font-family:var(--mono);font-size:.875rem;color:var(--fraco)}
.cond{font-family:var(--mono);font-size:.8125rem;letter-spacing:.02em;color:var(--fraco);min-height:1.4em}
ul.inc{margin:clamp(1.5rem,3vw,1.9rem) 0 0;display:grid;gap:0;flex:1;border-top:1px solid var(--fio)}
ul.inc li{
  display:grid;grid-template-columns:auto minmax(0,1fr);gap:.75rem;align-items:start;
  padding-block:.75rem;border-bottom:1px solid var(--fio);font-size:1rem;line-height:1.5;color:var(--corpo)
}
ul.inc li::before{content:"";width:.44rem;height:.44rem;margin-top:.5rem;border-right:1.5px solid var(--sobre);border-bottom:1.5px solid var(--sobre);transform:rotate(45deg);opacity:.65}
ul.inc li.tudo{color:var(--sobre);font-weight:600}
ul.inc li.obs{color:var(--fraco);font-size:1rem}
ul.inc li.obs::before{opacity:.3}
.plano .btn{margin-top:clamp(1.5rem,3vw,1.9rem);width:100%}
.escolha{color:var(--fraco);font-size:1rem;margin-top:.9rem;text-align:center}
.setup{margin-top:clamp(2rem,4vw,3rem);color:var(--fraco);font-size:1rem;max-width:56ch}
.setup b{color:var(--sobre);font-family:var(--mono);font-weight:400}

/* ==========================================================================
   GARANTIA — o "7" como numeral de display, não como selo dourado
   ========================================================================== */
.garantia .cx{display:grid;gap:clamp(1.5rem,4vw,3.5rem);align-items:center}
@media(min-width:820px){.garantia .cx{grid-template-columns:auto minmax(0,1fr)}}
.selo7{display:flex;align-items:baseline;gap:.5rem;color:var(--sobre)}
.selo7 b{font-family:var(--mono);font-size:clamp(5rem,15vw,10rem);line-height:.85;letter-spacing:-.06em;font-weight:400}
.selo7 span{font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.14em;color:var(--fraco)}
.selo7 span:first-child{align-self:flex-start;padding-top:.6rem}
.garantia .txt h3{font-size:clamp(1.6rem,3.2vw,2.4rem);letter-spacing:-.02em}
.garantia .txt p{color:var(--fraco);margin-top:.75rem;max-width:52ch;font-size:1.0625rem;line-height:1.55}

/* ==========================================================================
   PROVA
   ========================================================================== */
.galeria{display:grid;gap:clamp(1.5rem,3.5vw,2.5rem);grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.cardp{display:flex;flex-direction:column;gap:1rem}
.janela{border:1px solid var(--cartao-fio);border-radius:12px;overflow:hidden;background:var(--papel-2);transition:border-color var(--medio),transform var(--medio)}
.cardp:hover .janela{border-color:var(--fio-forte);transform:translateY(-4px)}
.barra{display:flex;gap:.4rem;padding:.6rem .8rem;border-bottom:1px solid var(--cartao-fio)}
.barra i{width:.6rem;height:.6rem;border-radius:50%;background:var(--fio-forte)}
.janela img{width:100%;height:auto}
.cap{display:flex;align-items:baseline;gap:.75rem;flex-wrap:wrap}
.cap b{color:var(--sobre);font-size:1.4rem;font-weight:600;letter-spacing:-.015em}
.cap .prof{font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.09em;color:var(--fraco)}
.prova-nota{margin-top:clamp(2rem,4vw,3rem)}
.chips{display:grid;gap:0;margin-top:clamp(2.5rem,5vw,4rem);border-top:1px solid var(--fio)}
@media(min-width:760px){.chips{grid-template-columns:repeat(3,1fr);column-gap:2.5rem}}
.chip{padding-block:1.4rem;border-bottom:1px solid var(--fio)}
.chip b{display:block;color:var(--sobre);font-size:1.0625rem;font-weight:600;margin-bottom:.3rem}
.chip span{color:var(--fraco);font-size:1rem;line-height:1.55}

/* ==========================================================================
   ESCOPO — o bento
   Quatro células separadas por fio de 1px (o fundo do grid vaza pelo gap, que é
   como se desenha hairline sem somar bordas). "Site" ocupa a coluna inteira à
   esquerda; "Integração" atravessa embaixo.
   ========================================================================== */
.bento{
  display:grid;gap:1px;background:var(--fio);
  border:1px solid var(--fio);border-radius:var(--raio);overflow:hidden;
}
@media(min-width:820px){
  .bento{grid-template-columns:repeat(2,1fr)}
  .bento > li.grande{grid-row:span 2}
  .bento > li.largo{grid-column:1 / -1}
}
.bento > li{
  background:var(--papel);padding:clamp(1.6rem,3vw,2.4rem);
  display:flex;flex-direction:column;gap:.55rem;transition:background var(--medio);
}
.bento > li.grande{justify-content:space-between;gap:1.5rem}
@media(hover:hover){.bento > li:hover{background:var(--papel-2)}}
.bento b{
  font-family:var(--mono);font-size:.8125rem;font-weight:400;
  text-transform:uppercase;letter-spacing:.15em;color:var(--fraco);
}
.bento .t{
  color:var(--sobre);font-size:clamp(1.25rem,2.2vw,1.6rem);font-weight:600;
  line-height:1.2;letter-spacing:-.02em;text-wrap:balance;
}
.bento > li.grande .t{font-size:clamp(1.6rem,3.2vw,2.35rem)}
.bento .d{color:var(--corpo);font-size:1rem;line-height:1.6;max-width:46ch}
.escopo-leva{margin-top:clamp(2rem,4vw,3rem)}

/* ==========================================================================
   ALÉM DO SITE
   ========================================================================== */
.mais .fecha{
  margin-top:clamp(2.5rem,5vw,4rem);display:flex;flex-wrap:wrap;gap:clamp(1.5rem,4vw,3rem);
  align-items:center;justify-content:space-between
}
.mais .fecha p{color:var(--fraco);font-size:1.0625rem;line-height:1.55;max-width:52ch}
.mais .fecha .btn{flex:0 0 auto}

/* ==========================================================================
   SOBRE
   ========================================================================== */
.sobre .cx{max-width:62ch;display:grid;gap:1.25rem}
.sobre .cx p{font-size:clamp(1.0625rem,1.7vw,1.3125rem);line-height:1.62;color:var(--corpo)}
.sobre .assina{
  font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.15em;
  color:var(--fraco);margin-top:1rem;padding-top:1.5rem;border-top:1px solid var(--fio)
}

/* ==========================================================================
   FECHAMENTO + RODAPÉ
   ========================================================================== */
/* O `24ch` que estava aqui media 255px: `ch` resolve contra a fonte do PRÓPRIO
   elemento, e o `.cx` está a 16px enquanto o h2 dentro dele está a 80px. Numa
   tela de 1990px sobravam 1266px de vazio à direita do título — o fechamento
   virava um amontoado encostado na esquerda.
   Agora são duas colunas: a frase manda na largura e a resposta fica ao lado
   dela. O cap do h2 é em `ch` mas NO PRÓPRIO h2, onde 1ch vale o tamanho dele. */
.fim-grade{display:grid;gap:clamp(2rem,4vw,4rem);align-items:end}
@media(min-width:900px){
  .fim-grade{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr)}
}
.fim-grade h2{max-width:12ch}
.fim-lado{max-width:46ch}
.escassez{
  font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.14em;
  color:var(--fraco);margin-bottom:1.5rem
}
.fim h2{font-size:clamp(2.25rem,7vw,5rem);letter-spacing:-.035em}
.fim-lado p{color:var(--fraco);max-width:44ch;font-size:1.0625rem;line-height:1.6}
.fim .btn{margin-top:clamp(1.5rem,3vw,2.25rem)}

footer{
  background:var(--preto);color:rgba(216,216,216,.62);
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;
  padding-block:2.25rem;border-top:1px solid rgba(255,255,255,.12)
}
/* Três âncoras, não duas. Antes eram dois blocos finos (101px e 202px) separados
   por 850px de nada numa tela larga. A navegação em duas colunas vira um bloco
   com peso, e a marca ancora a esquerda. */
footer .wrap{
  display:grid;gap:2rem 3rem;align-items:start;
  grid-template-columns:1fr;
}
@media(min-width:760px){
  footer .wrap{grid-template-columns:auto minmax(0,1fr) auto;gap:3rem}
}
.pe-marca{display:flex;align-items:center;gap:.55rem;color:var(--claro);letter-spacing:.06em}
.pe-marca svg{width:20px;height:20px;flex:0 0 auto}
.pe-nav{display:grid;gap:.55rem 2.5rem;grid-template-columns:repeat(2,minmax(0,max-content))}
.pe-id{display:flex;flex-direction:column;gap:.55rem}
@media(min-width:760px){.pe-id{text-align:right;align-items:flex-end}}
/* Alvo de toque de 44px sem esticar a altura da linha: o padding vertical é
   compensado pela margem negativa, então o rodapé não incha no celular. */
footer a{
  display:inline-flex;align-items:center;min-height:44px;
  margin-block:-0.7rem;color:rgba(216,216,216,.62);
  transition:color var(--rapido);
}
footer a:hover{color:var(--claro)}
footer a:focus-visible{outline:2px solid var(--claro);outline-offset:3px}
@media(max-width:560px){
  footer .wrap{flex-direction:column;gap:1.5rem}
  .pe-id{text-align:left}
}

/* --------------------------------------------------------------------------
   SEMÁFORO DO macOS nas janelinhas

   As três bolinhas do topo dos mockups eram cinza. Viraram fechar/minimizar/
   maximizar, nas cores do sistema, porque é o sinal que faz o cérebro ler
   "isto é uma janela de navegador de verdade" antes de qualquer legenda.

   DESVIO CONSCIENTE DA PALETA: a página é monocromática com o verde do WhatsApp
   como única cor. Isto acrescenta três. Passa porque não é cor de marca — é
   cromo de sistema operacional, lido como parte do aparelho e não da identidade,
   e vive só dentro da moldura da janelinha, nunca no conteúdo.
   -------------------------------------------------------------------------- */
:root{--mac-fechar:#FF5F57;--mac-minimizar:#FEBC2E;--mac-maximizar:#28C840}
.barra i:nth-child(1),.sv-img .barra i:nth-child(1),.swap-cartao .barra i:nth-child(1){background:var(--mac-fechar)}
.barra i:nth-child(2),.sv-img .barra i:nth-child(2),.swap-cartao .barra i:nth-child(2){background:var(--mac-minimizar)}
.barra i:nth-child(3),.sv-img .barra i:nth-child(3),.swap-cartao .barra i:nth-child(3){background:var(--mac-maximizar)}
/* No card swap do herói os cartões vivem borrados e em perspectiva; a cor cheia
   ali vira três pontos berrantes atrás do H1. Meio tom resolve. */
.swap-cartao .barra i{opacity:.72}

/* ==========================================================================
   FLUTUANTES
   ========================================================================== */
.float{
  position:fixed;right:1rem;bottom:1rem;z-index:var(--z-flutuante);
  width:56px;height:56px;border-radius:50%;background:var(--zap);
  display:grid;place-items:center;box-shadow:0 10px 30px -8px rgba(0,0,0,.7);
  transition:transform var(--medio)
}
.float:hover{transform:scale(1.07)}
.float svg{width:29px;height:29px}
@media(min-width:481px){.float{display:none}}

/* O botão recolhe enquanto a pessoa ROLA e volta quando ela para ou sobe.
   Não é enfeite: medido em 31/08, um círculo de 56px fixo no canto de uma tela de
   360px cai DENTRO da coluna de texto (sobram 16px de margem), e ele tapava a última
   palavra de dois H2, o botão "Ver o que mais eu construo" inteiro e o "ver a página
   inteira" dos painéis do portfólio. Encolher não resolvia: a 48px ele ainda invadia
   ~18px de texto. Recolher resolve os três casos e ainda deixa o CTA MAIS visível na
   hora que importa, que é com a pessoa parada lendo.
   Estado padrão é VISÍVEL: se o script.js não carregar, a classe nunca é posta e o
   botão fica onde sempre esteve. */
.float{transition:transform var(--medio),opacity var(--medio)}
.float.recolhido{transform:translateY(140%);opacity:0;pointer-events:none}
@media (prefers-reduced-motion:reduce){
  .float{transition:none}
}

.topo{
  position:fixed;right:1.5rem;bottom:1.5rem;z-index:var(--z-flutuante);
  width:46px;height:46px;border-radius:50%;background:rgba(4,5,8,.9);
  border:1px solid rgba(240,238,245,.18);color:var(--claro);
  display:grid;place-items:center;cursor:pointer;
  opacity:0;pointer-events:none;transform:translateY(8px);
  transition:opacity var(--medio),transform var(--medio),border-color var(--rapido)
}
.topo.visivel{opacity:1;pointer-events:auto;transform:none}
.topo:hover{border-color:rgba(240,238,245,.45)}
@media(max-width:480px){.topo{display:none}}

/* ==========================================================================
   MOVIMENTO
   Nada aqui nasce invisível: o estado inicial dos reveals é aplicado pelo JS.
   Sem JS (ou com o CDN fora do ar) a página aparece inteira e legível — que é
   o que a seção "O que eu confiro antes de entregar" promete.
   ========================================================================== */
.w{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.14em;margin-bottom:-.14em}
.wi{display:inline-block}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
  html{scroll-behavior:auto}
  .faixa-trilho{animation:none;width:auto}
  .faixa{-webkit-mask-image:none;mask-image:none}
  .faixa-set:nth-child(2){display:none}
  .faixa-set{flex-wrap:wrap;row-gap:.75rem}
}

/* ==========================================================================
   PEÇAS DE COMPOSIÇÃO
   Tudo daqui pra baixo é set-piece: as partes que fazem a página da Great One
   parecer o que é. O que depende de JS fica atrás de `html.js`, então sem
   JavaScript nada disso aparece — e nada disso esconde conteúdo.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. PRELOADER
   -------------------------------------------------------------------------- */
.preloader{display:none}
html.js .preloader{
  display:grid;place-items:center;position:fixed;inset:0;z-index:100;
  background:var(--preto);color:var(--claro);
}
html.js.pronto .preloader{opacity:0;pointer-events:none;transition:opacity .6s cubic-bezier(.16,1,.3,1)}
.preloader[hidden]{display:none!important}
.preloader-cx{display:flex;flex-direction:column;align-items:center;gap:1.75rem;width:min(88vw,320px)}
.preloader svg{width:44px;height:44px;color:var(--claro)}
.preloader-barra{width:100%;height:1px;background:rgba(255,255,255,.16);overflow:hidden}
.preloader-barra i{display:block;height:100%;width:0;background:var(--claro);transition:width .3s linear}
.preloader-num{
  font-family:var(--mono);font-size:.8125rem;letter-spacing:.15em;
  color:rgba(240,238,245,.62);font-variant-numeric:tabular-nums
}
/* trava o scroll só enquanto o preloader está na tela */
html.js:not(.pronto),html.js:not(.pronto) body{overflow:hidden}

/* --------------------------------------------------------------------------
   2. CURSOR — não existe mais, e o motivo fica escrito

   Havia um anel de 36px correndo atrás de um ponto, portado da referência. Saiu
   em 22/08 por escolha do Ewerton, depois de ver seis formatos lado a lado.
   Dois defeitos concretos que o desenho tinha, e que qualquer versão custom
   teria de novo: sobre o botão verde do WhatsApp o anel encobria o texto; e
   `<dialog>` modal vive na top layer, então o anel sumia atrás do visor da
   galeria enquanto o `cursor:none` continuava valendo — ficava sem cursor
   nenhum na tela.

   O cursor do sistema resolve os dois de graça, e o `pointer` que o navegador
   dá em link e botão é affordance que o anel não tinha. O realce fica no alvo:
   os hovers de botão, cartão e painel já estavam lá.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   3. MENU OVERLAY EM TELA CHEIA
   -------------------------------------------------------------------------- */
.menu-btn{display:none}
html.js .menu-btn{
  display:inline-flex;align-items:center;gap:.5rem;background:transparent;
  border:1px solid rgba(255,255,255,.5);color:var(--claro);border-radius:9999px;
  padding:.6rem 1.15rem;min-height:44px;cursor:pointer;
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;
  transition:border-color var(--rapido),background var(--rapido)
}
html.js .menu-btn:hover{border-color:var(--claro);background:rgba(255,255,255,.06)}

.menu{
  border:0;padding:0;margin:0;width:100%;max-width:100%;height:100%;max-height:100%;
  background:var(--preto);color:var(--claro);overflow:hidden
}
.menu::backdrop{background:rgba(4,5,8,.92)}
.menu[open]{display:flex;flex-direction:column}
.menu-topo{
  display:flex;align-items:center;justify-content:space-between;gap:1rem;
  padding:clamp(.8rem,2vw,1.5rem) clamp(1.25rem,4vw,4rem);
  border-bottom:1px solid rgba(255,255,255,.12)
}
.menu-fechar{
  background:transparent;border:1px solid rgba(255,255,255,.5);color:var(--claro);
  border-radius:9999px;padding:.6rem 1.15rem;min-height:44px;cursor:pointer;
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em
}
.menu-fechar:hover{border-color:var(--claro)}
.menu-corpo{
  flex:1;display:flex;flex-direction:column;justify-content:center;gap:.25rem;
  padding:clamp(2rem,6vh,4rem) clamp(1.25rem,4vw,4rem);overflow-y:auto
}
.menu-link{
  display:flex;align-items:baseline;gap:1.25rem;
  padding-block:clamp(.5rem,1.6vh,1rem);border-bottom:1px solid rgba(255,255,255,.10);
  color:var(--claro);font-size:clamp(1.6rem,5vw,3.5rem);font-weight:600;
  letter-spacing:-.03em;line-height:1.05;transition:opacity var(--rapido),padding-left var(--medio)
}
.menu-link:hover{padding-left:.75rem}
.menu-link i{
  font-family:var(--mono);font-size:.75rem;font-style:normal;letter-spacing:.1em;
  color:rgba(240,238,245,.62);flex:0 0 auto
}
.menu-pe{
  display:flex;flex-wrap:wrap;gap:.75rem 2rem;align-items:center;justify-content:space-between;
  padding:clamp(1.25rem,3vh,2rem) clamp(1.25rem,4vw,4rem);
  border-top:1px solid rgba(255,255,255,.12);
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;
  color:rgba(240,238,245,.62)
}
.menu-pe a:hover{color:var(--claro)}

/* --------------------------------------------------------------------------
   4. CENA WEBGL DO HERO
   O canvas é decoração: some sem JS/WebGL e o gradiente de base continua lá.
   -------------------------------------------------------------------------- */
.hero-cena{
  position:absolute;inset:0;width:100%;height:100%;z-index:1;
  pointer-events:none;opacity:0;transition:opacity 1.4s cubic-bezier(.16,1,.3,1)
}
.hero-cena.acesa{opacity:1}

/* --------------------------------------------------------------------------
   5. CARD SWAP 3D — a pilha de cartões que troca sozinha
   -------------------------------------------------------------------------- */
.swap{display:none}

/* Abaixo de 1100px a pilha não cabe flutuando ao lado do texto — ela cobriria o H1.
   Em vez de sumir (era o que fazia), entra no FLUXO, depois dos botões: o `.hero` já
   é flex em coluna, então basta ordenar. Assim o celular tem a mesma peça que o
   desktop, que foi o que o Ewerton pediu, sem atropelar a leitura. */
@media (max-width:1099.98px){
  html.js .swap{
    display:block;position:relative;order:2;
    width:min(330px,78vw);aspect-ratio:330/242;
    margin:clamp(2rem,6vw,3rem) 0 0 clamp(1.25rem,4vw,4rem);
    perspective:1000px;z-index:3;pointer-events:none
  }
  html.js .hero > .wrap{order:1}
  html.js .hero > .faixa{order:3}
}

/* A partir de 1100px ela volta a flutuar: sobra largura à direita do texto e o
   herói ganha a profundidade que a referência tem. */
@media (min-width:1100px){
  html.js .swap{
    display:block;position:absolute;right:clamp(2rem,5vw,4rem);bottom:20%;
    width:330px;height:242px;aspect-ratio:auto;margin:0;
    perspective:1000px;z-index:3;pointer-events:none
  }
}

/* As regras dos CARTÕES valem nas duas larguras; só o posicionamento do
   contêiner `.swap` muda por media query, logo acima. */
.swap-cartao{
  position:absolute;inset:0;border-radius:12px;overflow:hidden;
  background:var(--preto-2);border:1px solid rgba(255,255,255,.45);
  transform-origin:right bottom;
  transition:transform .8s cubic-bezier(.16,1,.3,1),opacity .8s cubic-bezier(.16,1,.3,1)
}
.swap-cartao .barra{
  display:flex;gap:.4rem;padding:.5rem .7rem;background:rgba(4,5,8,.85);
  border-bottom:1px solid rgba(255,255,255,.14)
}
.swap-cartao .barra i{width:.5rem;height:.5rem;border-radius:50%;background:rgba(255,255,255,.28)}
.swap-cartao picture{display:block;height:calc(100% - 29px)}
.swap-cartao img{width:100%;height:100%;object-fit:cover;object-position:top center;opacity:.92}

/* --------------------------------------------------------------------------
   6. FAIXA DE PALAVRAS GIGANTES
   Full bleed, duas linhas correndo em sentidos opostos. As palavras saem da
   própria copy do site — nada inventado.
   -------------------------------------------------------------------------- */
.letras{padding-block:clamp(3rem,8vh,6rem);overflow:hidden;border-block:1px solid var(--fio)}
.letras-linha{
  display:flex;width:max-content;
  font-size:clamp(3rem,12vw,10rem);font-weight:700;letter-spacing:-.045em;line-height:.95;
  color:var(--sobre);white-space:nowrap;
  animation:correr 38s linear infinite;
}
.letras-linha + .letras-linha{margin-top:clamp(.25rem,1vw,.75rem)}
.letras-set{display:flex;gap:clamp(1.5rem,4vw,3.5rem);padding-right:clamp(1.5rem,4vw,3.5rem)}
.letras-set span{display:inline-block}
/* linha vazada: só contorno, cria profundidade entre as duas */
.letras-linha.vazada{
  color:transparent;-webkit-text-stroke:1px var(--fio-forte);
  animation-direction:reverse;animation-duration:46s
}

/* --------------------------------------------------------------------------
   7. FAQ ACORDEÃO — <details> nativo, funciona sem uma linha de JS
   -------------------------------------------------------------------------- */
.faq-lista{border-top:1px solid var(--fio)}
.faq-item{border-bottom:1px solid var(--fio)}
.faq-item summary{
  display:flex;align-items:flex-start;justify-content:space-between;gap:2rem;
  padding-block:clamp(1.25rem,2.4vw,1.75rem);cursor:pointer;list-style:none;
  color:var(--sobre);font-size:clamp(1.0625rem,1.9vw,1.3125rem);font-weight:600;
  letter-spacing:-.015em;line-height:1.35;transition:opacity var(--rapido)
}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary:hover{opacity:.7}
.faq-item summary:focus-visible{outline:2px solid var(--sobre);outline-offset:3px}
.faq-item summary::after{
  content:"+";flex:0 0 auto;font-family:var(--mono);font-size:1.5rem;font-weight:400;line-height:1;
  color:var(--fraco);transition:transform var(--medio)
}
.faq-item[open] summary::after{transform:rotate(45deg)}
.faq-resposta{padding-bottom:clamp(1.25rem,2.4vw,1.75rem);max-width:62ch}
.faq-resposta p{color:var(--fraco);font-size:1.0625rem;line-height:1.6}
.faq-resposta p + p{margin-top:.75rem}
/* abertura animada onde o navegador suporta; sem suporte, abre seco e funciona igual */
@supports (interpolate-size: allow-keywords){
  .faq-item::details-content{
    block-size:0;overflow:hidden;
    transition:block-size .45s cubic-bezier(.16,1,.3,1),content-visibility .45s allow-discrete
}
  .faq-item[open]::details-content{block-size:auto}
}

/* --------------------------------------------------------------------------
   8. ORÇAMENTO EXPRESS
   -------------------------------------------------------------------------- */
.orc-sem-js{display:block}
html.js .orc-sem-js{display:none}
.orc{display:none}
html.js .orc{display:grid;gap:clamp(2rem,4vw,3.5rem)}
@media (min-width:980px){html.js .orc{grid-template-columns:minmax(0,1fr) minmax(0,21rem);align-items:start}}

.orc-passo{display:none}
.orc-passo.ativo{display:block}
.orc-conta{
  font-family:var(--mono);font-size:.8125rem;letter-spacing:.15em;text-transform:uppercase;
  color:var(--fraco);margin-bottom:1rem
}
.orc-passo h3{font-size:clamp(1.4rem,2.8vw,2rem);letter-spacing:-.02em;margin-bottom:.5rem}
.orc-dica{color:var(--fraco);font-size:1rem;margin-bottom:1.75rem;max-width:52ch}
.orc-ops{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fit,minmax(238px,1fr))}
.orc-op{
  position:relative;display:flex;align-items:flex-start;gap:.85rem;cursor:pointer;
  border:1px solid var(--cartao-fio);border-radius:14px;padding:1.1rem 1.25rem;
  background:var(--cartao);transition:border-color var(--rapido),background var(--rapido)
}
.orc-op:hover{border-color:var(--fio-forte)}
.orc-op input{position:absolute;opacity:0;width:1px;height:1px}
.orc-op .marca-op{
  flex:0 0 auto;width:20px;height:20px;margin-top:.15rem;border-radius:50%;
  border:1px solid var(--fio-forte);display:grid;place-items:center;transition:border-color var(--rapido)
}
.orc-op input[type=checkbox] ~ .marca-op{border-radius:6px}
.orc-op .marca-op::after{
  content:"";width:9px;height:9px;border-radius:inherit;background:var(--sobre);
  transform:scale(0);transition:transform var(--medio)
}
.orc-op input:checked ~ .marca-op{border-color:var(--sobre)}
.orc-op input:checked ~ .marca-op::after{transform:scale(1)}
.orc-op:has(input:checked){border-color:var(--sobre);background:rgba(255,255,255,.07)}
.orc-op input:focus-visible ~ .marca-op{outline:2px solid var(--sobre);outline-offset:3px}
.orc-op b{display:block;color:var(--sobre);font-size:1rem;font-weight:600;line-height:1.35}
.orc-op span{display:block;color:var(--fraco);font-size:1rem;line-height:1.5;margin-top:.2rem}

.orc-nav{display:flex;flex-wrap:wrap;gap:.75rem;margin-top:clamp(1.75rem,3.5vw,2.5rem)}
.orc-nav .btn[disabled]{opacity:.35;pointer-events:none}
.orc-progresso{height:1px;background:var(--fio);margin-top:clamp(1.75rem,3.5vw,2.5rem);overflow:hidden}
.orc-progresso i{display:block;height:100%;background:var(--sobre);width:0;transition:width .45s cubic-bezier(.16,1,.3,1)}

.orc-painel{
  border:1px solid var(--cartao-fio);border-radius:var(--raio);
  padding:clamp(1.5rem,3vw,2rem);background:var(--cartao)
}
@media (min-width:980px){.orc-painel{position:sticky;top:6.5rem}}
.orc-pronto{
  display:flex;align-items:center;gap:.5rem;min-height:52px;
  font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.1em;
  color:var(--sobre);
}
.orc-pronto span{font-size:1rem}
.orc-painel .rot{
  font-family:var(--mono);font-size:.75rem;letter-spacing:.12em;text-transform:uppercase;color:var(--fraco)
}
.orc-valor{
  font-family:var(--mono);font-size:clamp(2rem,4.2vw,2.75rem);line-height:1;letter-spacing:-.04em;
  color:var(--sobre);margin:.6rem 0 .3rem;font-variant-numeric:tabular-nums
}
.orc-valor .rs{font-size:.42em;color:var(--fraco);margin-right:.2em}
.orc-obs{color:var(--fraco);font-size:1rem;line-height:1.5}
.orc-linhas{margin-top:1.5rem;border-top:1px solid var(--fio)}
.orc-linhas div{
  display:flex;flex-wrap:wrap;justify-content:space-between;gap:.15rem 1rem;align-items:baseline;
  padding-block:.7rem;border-bottom:1px solid var(--fio);font-size:1rem
}
.orc-linhas div span:first-child{color:var(--fraco)}
.orc-linhas div span:last-child{color:var(--sobre);font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap}
.orc-painel .btn{width:100%;margin-top:1.5rem}
.orc-painel .btn + .btn{margin-top:.6rem}

/* --------------------------------------------------------------------------
   MOVIMENTO REDUZIDO — as peças novas
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion:reduce){
  .letras-linha{animation:none!important;width:auto;flex-wrap:wrap;white-space:normal}
  .letras-set:nth-child(2){display:none}
  html.js .swap{display:none}
  .hero-cena{display:none}
}

/* --------------------------------------------------------------------------
   9. BLOCO DUPLO — cabeça fixa à esquerda, cards entrando pela direita
   A mecânica da seção de Serviços da Great One: a coluna da esquerda fica
   grudada enquanto os cards da direita descem um a um. Medidas dele:
   grid 4fr/8fr, gap 5rem, sticky top 8rem, card raio 1rem, padding 1.75rem.
   -------------------------------------------------------------------------- */
.dupla{display:grid;gap:clamp(2.5rem,5vw,5rem);align-items:start}
@media (min-width:900px){ .dupla{grid-template-columns:4fr 8fr} }

.dupla-cabeca .k{margin-bottom:1.5rem}
.dupla-cabeca h2{
  font-size:clamp(2.25rem,3.5vw,3.25rem);font-weight:700;line-height:1.05;letter-spacing:-.02em
}
.dupla-cabeca .intro{margin-top:1.5rem;max-width:27rem;font-size:1rem;line-height:1.65;color:var(--fraco)}
.dupla-cabeca .btn{margin-top:2rem}
@media (min-width:900px){ .dupla-cabeca{position:sticky;top:8rem} }

.dupla-cartoes{display:flex;flex-direction:column;gap:2rem}

.sv-cartao{
  display:grid;gap:clamp(1.5rem,3vw,2.5rem);
  background:var(--papel-2);border:1px solid var(--cartao-fio);
  border-radius:1rem;padding:clamp(1.25rem,2.6vw,1.75rem);
  transition:border-color var(--medio)
}
.sv-cartao:hover{border-color:var(--fio-forte)}
@media (min-width:1080px){
  .sv-cartao.com-img{grid-template-columns:minmax(0,1fr) 380px}
}
.sv-conteudo{display:flex;flex-direction:column}
.sv-num{
  font-family:var(--mono);font-size:.75rem;letter-spacing:.1em;
  color:var(--fraco);margin-bottom:.75rem
}
.sv-num::before{content:"/ "}
.sv-titulo{
  font-size:clamp(1.4rem,2vw,1.75rem);font-weight:600;color:var(--sobre);
  letter-spacing:-.015em;line-height:1.2;margin-bottom:.5rem
}
.sv-sub{font-size:1rem;line-height:1.55;color:var(--fraco);margin-bottom:2rem;max-width:46ch}
.sv-lista{margin:auto 0 0;padding:0}
.sv-lista li{
  font-family:var(--mono);font-size:.75rem;letter-spacing:.06em;text-transform:uppercase;
  color:var(--fraco);padding:.9rem 0;border-bottom:1px solid var(--fio);line-height:1.5
}
.sv-lista li:last-child{border-bottom:0}

.sv-img{border-radius:.75rem;overflow:hidden;border:1px solid var(--cartao-fio);background:var(--papel)}
.sv-img .barra{
  display:flex;gap:.4rem;padding:.6rem .8rem;border-bottom:1px solid var(--cartao-fio)
}
.sv-img .barra i{width:.6rem;height:.6rem;border-radius:50%;background:var(--fio-forte)}
.sv-img img{
  width:100%;height:auto;display:block;
  filter:none;
  transition:filter .4s ease,transform .4s ease
}
.sv-cartao:hover .sv-img img{filter:grayscale(0) opacity(1);transform:scale(1.025)}

/* sem movimento, os cards nascem no lugar e não deslizam */
@media (prefers-reduced-motion:reduce){
  .dupla-cabeca{position:static}
}

/* --------------------------------------------------------------------------
   10. PISTA HORIZONTAL COM PIN — a seção Trabalhos dele
   O título mora dentro da pista, à esquerda, e sai junto com os projetos.
   Só existe em tela larga e com JS: no celular e sem JS vira pilha vertical.
   -------------------------------------------------------------------------- */
.trilho-h{background:var(--papel);position:relative}
.trilho-h .pista{
  display:flex;flex-direction:column;gap:clamp(2.5rem,5vw,4rem);
  padding:var(--pad) clamp(1.25rem,4vw,4rem);
}
.painel-h{flex:0 0 auto}
.painel-titulo h2{font-size:clamp(2.25rem,5vw,4rem);letter-spacing:-.03em}
.painel-titulo .intro{margin-top:1.5rem;color:var(--fraco);max-width:34ch;font-size:1rem;line-height:1.6}
.painel-pe{display:flex;align-items:baseline;gap:.5rem 1rem;flex-wrap:wrap;margin-top:1.25rem}
.painel-pe h3{font-size:1.5rem;font-weight:600;color:var(--sobre);letter-spacing:-.015em}
.tagm{font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.09em;color:var(--fraco)}
.painel-fim p{
  font-size:clamp(1.25rem,2.4vw,1.75rem);line-height:1.3;letter-spacing:-.02em;
  color:var(--sobre);font-weight:500;max-width:24ch
}
.painel-fim .btn{margin-top:2rem}

/* modo pista: só com JS, em tela larga */
@media (min-width:900px){
  html.js .trilho-h{overflow:hidden}
  html.js .trilho-h .pista{
    flex-direction:row;align-items:center;height:100svh;width:max-content;
    gap:clamp(3rem,5vw,6rem);padding-block:0
}
  html.js .painel-titulo{width:min(46vw,30rem)}
  html.js .painel-projeto{width:min(58vw,40rem)}
  html.js .painel-fim{width:min(40vw,26rem)}
}
@media (prefers-reduced-motion:reduce){
  html.js .trilho-h{overflow:visible}
  html.js .trilho-h .pista{flex-direction:column;height:auto;width:auto;padding-block:var(--pad)}
  html.js .painel-titulo,html.js .painel-projeto,html.js .painel-fim{width:auto}
}

/* --------------------------------------------------------------------------
   10a. PROVA SOCIAL — logos e depoimentos
   As duas seções estão comentadas no index.html enquanto não houver conteúdo
   real. O CSS fica vivo de propósito: assim, ligar a peça é descomentar o
   HTML e nada mais. Regra herdada da própria página: nada inventado.
   -------------------------------------------------------------------------- */
.logos-fila{
  display:flex;flex-wrap:wrap;align-items:center;gap:clamp(2rem,6vw,4.5rem);
  margin-top:1.5rem;
}
/* Todas as logos entram em currentColor com opacidade baixa: cor de marca de
   terceiro numa faixa monocromática vira mancha e rouba o olho do texto. */
.logos-fila img{height:34px;width:auto;opacity:.55;filter:grayscale(1);transition:opacity var(--medio)}
@media(hover:hover){.logos-fila img:hover{opacity:1}}

.depo-cab{display:flex;align-items:flex-end;justify-content:space-between;gap:2rem;flex-wrap:wrap}
.depo-cab .sec-h{margin-bottom:clamp(1.5rem,3vw,2rem)}
.depo-setas{display:flex;gap:.6rem;margin-bottom:clamp(1.5rem,3vw,2rem)}
.depo-seta{
  width:48px;height:48px;border-radius:9999px;cursor:pointer;
  border:1px solid var(--fio-forte);background:transparent;color:var(--sobre);
  font-size:1.125rem;line-height:1;
  transition:background var(--rapido),border-color var(--rapido),opacity var(--rapido);
}
.depo-seta:hover:not(:disabled){background:var(--cartao);border-color:var(--sobre)}
.depo-seta:disabled{opacity:.3;cursor:default}
.depo-seta:focus-visible{outline:2px solid var(--sobre);outline-offset:3px}
/* Rolagem nativa com snap: o arrasto, o teclado e a barra continuam funcionando
   de graça, e sem JS a pista ainda é navegável. */
.depo-pista{
  display:grid;grid-auto-flow:column;grid-auto-columns:min(88%,30rem);
  gap:1.25rem;overflow-x:auto;scroll-snap-type:x mandatory;
  scrollbar-width:none;padding-bottom:.5rem;
}
.depo-pista::-webkit-scrollbar{display:none}
.depo-pista:focus-visible{outline:2px solid var(--sobre);outline-offset:6px}
.depo-cartao{
  scroll-snap-align:start;background:var(--cartao);border:1px solid var(--cartao-fio);
  border-radius:var(--raio);padding:clamp(1.6rem,3vw,2.4rem);
  display:flex;flex-direction:column;justify-content:space-between;gap:1.75rem;
}
.depo-cartao blockquote p{
  color:var(--sobre);font-size:clamp(1.0625rem,1.8vw,1.3rem);line-height:1.45;
  letter-spacing:-.01em;text-wrap:pretty;
}
.depo-cartao blockquote p::before{content:"C"}
.depo-cartao blockquote p::after{content:"D"}
.depo-cartao figcaption b{display:block;color:var(--sobre);font-size:1rem;font-weight:600}
.depo-cartao figcaption span{
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.09em;color:var(--fraco);
}
@media (prefers-reduced-motion:reduce){.depo-pista{scroll-behavior:auto}}

/* --------------------------------------------------------------------------
   10b. PAINEL CLICÁVEL + VISOR DA PÁGINA INTEIRA
   A legenda da pista diz "clica e ela abre inteira". Isto é o que torna a
   frase verdadeira. O alvo de toque é o painel todo, não um link de 14px.
   -------------------------------------------------------------------------- */
.painel-link{display:block;color:inherit}
.painel-link:focus-visible{outline:2px solid var(--sobre);outline-offset:6px;border-radius:.9rem}
.painel-link .sv-img{position:relative;transition:border-color var(--medio)}
@media (hover:hover){
  .painel-link:hover .sv-img{border-color:var(--fio-forte)}
  .painel-link:hover .lupa{opacity:1;transform:none}
}
.lupa{
  position:absolute;left:50%;bottom:1rem;transform:translate(-50%,.5rem);
  padding:.6rem 1.1rem;border-radius:9999px;
  background:var(--sobre);color:var(--papel);
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.09em;
  opacity:0;transition:opacity var(--medio),transform var(--medio);pointer-events:none;
  white-space:nowrap;
}
/* No toque não existe hover: o rótulo do rodapé é a única pista, então ele fica sempre visível. */
.painel-ver{
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.09em;
  color:var(--sobre);margin-left:auto;
}
/* A `.lupa` NÃO acende no toque. Aqui havia `@media (hover:none){.lupa{opacity:1}}`, e o
   efeito medido no celular era uma pílula de 201x37px parada no meio de cada print, tapando
   o miolo da imagem que é a prova do trabalho — nos quatro painéis ao mesmo tempo. E era
   redundante: o `.painel-ver` logo abaixo do título já diz "ver a página inteira". No
   computador ela segue sendo o realce de hover, que é o único lugar onde hover existe. */

dialog.visor{
  border:0;padding:0;margin:auto;background:transparent;
  width:min(96vw,1100px);max-height:92vh;overflow:auto;overscroll-behavior:contain;
}
dialog.visor::backdrop{background:rgba(4,5,8,.9)}
.visor-topo{
  position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;
  gap:1rem;padding:.85rem 1rem;background:var(--preto-2);color:var(--claro);
  border-bottom:1px solid rgba(255,255,255,.12);border-radius:12px 12px 0 0;
}
.visor-topo b{font-family:var(--mono);font-size:.8125rem;text-transform:uppercase;letter-spacing:.12em;font-weight:400}
.visor-topo .fechar{
  border:1px solid rgba(255,255,255,.3);background:transparent;color:var(--claro);cursor:pointer;
  border-radius:9999px;padding:.55rem 1.1rem;min-height:44px;font-family:var(--sans);font-size:.9375rem;
  transition:background var(--rapido),border-color var(--rapido);
}
.visor-topo .fechar:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.55)}
dialog.visor img{display:block;width:100%;border-radius:0 0 12px 12px}

/* --------------------------------------------------------------------------
   11. CARDS DE NÚMERO
   Mesmo formato dos dele (rótulo mono em cima, visual no meio, numeral
   gigante, descrição embaixo). Os números são os seus, não os dele: 4 anos,
   7 dias, 1 site por vez. Todos saem da copy que já está na página.
   -------------------------------------------------------------------------- */
.numeros{
  display:grid;gap:1.25rem;grid-template-columns:repeat(auto-fit,minmax(258px,1fr));
  margin-top:clamp(3rem,6vw,5rem)
}
.num-cartao{
  display:flex;flex-direction:column;min-height:20rem;
  border-radius:1rem;padding:clamp(1.5rem,3vw,2rem);
  background:var(--cartao);border:1px solid var(--cartao-fio);
  transition:border-color var(--medio)
}
.num-cartao:hover{border-color:var(--fio-forte)}
.num-rot{
  font-family:var(--mono);font-size:.75rem;text-transform:uppercase;
  letter-spacing:.12em;color:var(--fraco)
}
.num-vis{flex:1;display:flex;align-items:center;gap:.5rem;padding-block:clamp(1.5rem,4vw,2.5rem)}
.num-grande{
  font-size:clamp(3.75rem,8vw,6rem);font-weight:700;line-height:.88;
  letter-spacing:-.05em;color:var(--sobre)
}
.num-desc{color:var(--fraco);font-size:1rem;line-height:1.55;margin-top:.85rem;max-width:32ch}

/* os tiques contam o próprio número: 4 barras, 7 pontos, 1 aceso entre cinco */
.tique{flex:0 0 auto;border:1px solid var(--fio-forte);border-radius:2px}
.tique.barra-v{width:.5rem;height:3.25rem}
.tique.ponto{width:.6rem;height:.6rem;border-radius:50%}
.tique.on{background:var(--sobre);border-color:var(--sobre)}
