/* ============================================================
   PINPAY · studio build
   Paleta — #2FA7FF · #003A99 · #FFFFFF · #F3F6FA · #B8C2CC · #5A6472
   Direção: deep-blue + soft gradients, storytelling de scroll
   (dashboard que sobe em 3D, números que contam, texto que acende).
   ============================================================ */
:root{
  /* >>> AJUSTE SÓ O DASHBOARD AQUI <<< */
  --dash-w:126%;
  --dash-scale:1;
  --dash-vscale:.92;
  --dash-shift:4%;

  /* superfícies (base clara) */
  --bg:#FFFFFF;
  --bg-elev:#F6F9FD;
  --bg-elev-2:#EDF3FA;
  --line:#E2E9F2;
  --line-strong:#C9D6E6;

  /* marca */
  --blue:#2FA7FF;      /* preenchimento, gradiente, borda, glow — nunca texto sobre branco */
  --blue-ink:#0049D8;  /* azul legível: use este para texto e link sobre fundo claro */
  --navy:#003A99;

  /* texto */
  --text:#0A1830;
  --text-mid:#4A5A73;
  --text-dim:#7A8AA3;

  /* intensidade do halo — a faixa azul sobe esse valor */
  --halo-op:.20;

  --font-display:"Geist",system-ui,sans-serif;
  --font-body:"Inter",system-ui,-apple-system,sans-serif;
  --mono:"Geist Mono",ui-monospace,monospace;

  --container:1320px;
  --pad:24px;
  /* reduzido de clamp(88px,9vw,132px): no desktop tipico (~1440px) a versao
     antiga batia perto do teto de 132px, e a distancia ate o titulo de cada
     secao (ex.: "Liberdade do saldo" em #cripto) ficava grande demais ao
     rolar ate la — sem contar o padding do proprio topo do bloco de cima */
  --sect:clamp(72px,7vw,104px);
  --r-sm:10px; --r-md:14px; --r-lg:20px; --r-xl:28px; --r-pill:999px;

  --ease:cubic-bezier(.22,1,.36,1);
  --ease-out:cubic-bezier(.16,1,.3,1);
}
*,*::before,*::after{box-sizing:border-box}
/* overflow-x:hidden so no body nao travava o scroll horizontal de verdade —
   testado: dava pra arrastar a pagina 165px pros lados mesmo assim (halos com
   offset negativo tipo left:-260px somados ao mask do carrossel de logos).
   overflow-x:hidden tambem no html fecha essa brecha; e o fix padrao pra esse
   quirk especifico de propagacao de overflow pro viewport. */
html{scroll-behavior:smooth;overflow-x:hidden}
body{
  margin:0;
  font-family:var(--font-body);
  color:var(--text-mid);
  background:var(--bg);
  font-size:17px;
  line-height:1.65;
  letter-spacing:-.005em;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
::selection{background:var(--navy);color:#fff}
img,svg,canvas{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
ul{list-style:none;margin:0;padding:0}
button{font:inherit;cursor:pointer}
:focus-visible{outline:2.5px solid var(--blue);outline-offset:3px;border-radius:6px}

h1,h2,h3{
  font-family:var(--font-display);
  color:var(--text);
  font-weight:700;
  margin:0;
}
h1{font-size:clamp(2.9rem,7vw,5.2rem);font-weight:700;letter-spacing:-.045em;line-height:.95}
h2{font-size:clamp(2.1rem,5vw,3.5rem);font-weight:700;letter-spacing:-.04em;line-height:1.02}
h3{font-size:clamp(1.25rem,2vw,1.6rem);font-weight:600;letter-spacing:-.02em;line-height:1.2}
p{margin:0}

.wrap{max-width:var(--container);margin:0 auto;padding:0 var(--pad)}
.wrap-sm{max-width:860px;margin:0 auto;padding:0 var(--pad)}
.section{padding:var(--sect) 0;position:relative}

/* ---------- eyebrow ---------- */
.eyebrow{
  font-family:var(--mono);font-size:12px;font-weight:500;
  letter-spacing:.22em;text-transform:uppercase;color:var(--text-dim);
  margin-bottom:20px;display:block;
}
.eyebrow .n{color:var(--blue-ink);margin-right:8px}

/* ---------- botões ---------- */
.btn{
  display:inline-flex;align-items:center;gap:8px;
  padding:14px 26px;
  border-radius:var(--r-pill);
  font-weight:600;font-size:15px;letter-spacing:-.01em;
  border:1px solid transparent;
  position:relative;overflow:hidden;
  transition:transform .3s var(--ease),background .3s var(--ease),border-color .3s var(--ease),box-shadow .3s var(--ease);
}
.btn:hover{transform:translateY(-2px)}
/* pressionado: volta pro lugar e encolhe um pouco, rapido — o par
   lift-no-hover/encolhe-no-click fecha o ciclo tatil que faltava (so tinha
   o hover, sem feedback nenhum ao efetivamente clicar) */
.btn:active{transform:translateY(0) scale(.97);transition-duration:.12s}
/* brilho que varre o botao no hover — mesma tecnica do sheen do dashboard e
   da navbar (::after com gradiente diagonal), aqui disparado por :hover puro,
   sem JS. overflow:hidden no .btn recorta o brilho na forma do pill. */
.btn::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.55) 48%,transparent 66%);
  transform:translateX(-120%);
}
.btn:hover::after{transition:transform .65s ease-out;transform:translateX(120%)}
@media(prefers-reduced-motion:reduce){.btn:hover::after{transition:none;transform:translateX(-120%)}}
/* chapado de proposito: o gradiente azul-claro -> navy que existia aqui lia como
   borrao, porque as duas pontas tem luminancia muito diferente e o meio virava um
   roxo sujo. cor solida em --blue-ink da 5.9:1 com texto branco. */
.btn-primary{
  background:var(--blue-ink);
  color:#fff;
  box-shadow:0 8px 20px -12px rgba(0,73,216,.9);
}
.btn-primary:hover{background:#0040BC;box-shadow:0 16px 34px -14px rgba(0,73,216,.7)}
.btn-primary:active{box-shadow:0 6px 14px -10px rgba(0,73,216,.8)}
.btn:focus-visible{outline:2px solid var(--blue-ink);outline-offset:3px}
.btn-ghost{
  background:var(--bg-elev);
  color:var(--text);
  border-color:var(--line-strong);
}
.btn-ghost:hover{border-color:var(--blue);background:var(--bg-elev-2);box-shadow:0 0 0 5px rgba(47,167,255,.1)}
.btn-ghost:active{box-shadow:0 0 0 3px rgba(47,167,255,.12)}

/* ---------- card ---------- */
.card{
  background:var(--bg-elev);
  border:1px solid var(--line);
  border-radius:var(--r-xl);
  padding:32px;
  transition:border-color .3s var(--ease),background .3s var(--ease),transform .3s var(--ease);
}
.card:hover{border-color:var(--line-strong);background:var(--bg-elev-2);transform:translateY(-6px)}

/* ---------- halo de gradiente (único ornamento) ---------- */
.halo{
  position:absolute;
  pointer-events:none;
  border-radius:50%;
  filter:blur(80px);
  opacity:var(--halo-op);
  z-index:0;
}
.halo-blue{background:radial-gradient(circle,var(--blue) 0%,transparent 70%)}
.halo-navy{background:radial-gradient(circle,var(--navy) 0%,transparent 70%)}

/* ---------- faixa azul escuro (inversão de tokens) ---------- */
/* Redefine os tokens dentro do próprio bloco: todo componente
   compartilhado (.card, .btn-ghost, .eyebrow, .halo) se adapta sozinho.
   Usada só em duas seções: #cripto (Task 6) e #contato + footer (Task 9). */
.band-navy{
  --bg:#003A99;
  --bg-elev:#0A47AD;
  --bg-elev-2:#1355C2;
  --line:rgba(255,255,255,.14);
  --line-strong:rgba(255,255,255,.28);
  --text:#FFFFFF;
  --text-mid:#C3D6F5;
  --text-dim:#8FAEE0;
  --blue-ink:#7FC7FF;
  --halo-op:.42;
  background:var(--bg);
  color:var(--text-mid);
  overflow:hidden;
}
.band-navy .btn-primary{
  background:#fff;
  color:var(--navy);
  box-shadow:none;
}
.band-navy .btn-ghost:hover{border-color:#fff}

/* ---------- faixa preta + azul elétrico (inversão de tokens) ---------- */
/* Mesma técnica da .band-navy: os tokens são redefinidos no escopo do bloco,
   então .card, .eyebrow e .halo se adaptam sem regra própria. Usada em #cripto. */
.band-black{
  --bg:#050608;
  --bg-elev:#0C0F14;
  --bg-elev-2:#12171F;
  --line:rgba(255,255,255,.10);
  --line-strong:rgba(47,167,255,.55);
  --text:#FFFFFF;
  --text-mid:#9AA6B8;
  --text-dim:#6B7688;
  /* sobre preto o azul elétrico é legível de sobra (contraste ~7:1),
     ao contrário do que acontece sobre branco */
  --blue-ink:#2FA7FF;
  --halo-op:.30;
  background:var(--bg);
  color:var(--text-mid);
  overflow:hidden;
}
/* o halo tem z-index 0 e cria contexto de empilhamento; sem isto ele passaria
   por cima do fundo dos cards */
.band-black .wrap{position:relative;z-index:1}
.halo-elec{background:radial-gradient(circle,#2FA7FF 0%,transparent 68%)}

.cx-hero{display:grid;gap:28px;padding:28px;margin-bottom:16px}
.cx-hero h3{font-size:1.45rem;margin:0 0 12px}
.cx-hero p{color:var(--text-mid);font-size:15.5px;max-width:44ch}
.cx-grid{display:grid;gap:16px}
.cx-card{padding:22px 24px;transition:border-color .3s var(--ease),background .3s var(--ease),transform .3s var(--ease),box-shadow .3s var(--ease)}
.cx-card h3{font-size:1.2rem;margin:0 0 8px}
.cx-card p{color:var(--text-mid);font-size:15px}
/* icone por cima do titulo, mesmo padrao do .pay .ic da secao de meios de
   pagamento — currentColor aqui vira var(--blue-ink), que no escopo do
   .band-black ja resolve pro azul eletrico legivel sobre preto */
.cx-card .ic{
  width:44px;height:44px;border-radius:12px;
  background:var(--bg-elev-2);color:var(--blue-ink);
  display:grid;place-items:center;margin-bottom:16px;
  transition:background .3s var(--ease),transform .3s var(--ease),box-shadow .3s var(--ease);
}
.cx-card .ic svg{width:21px;height:21px}
/* hover mais vivo que o .card generico herdado: o brilho eletrico do
   proprio tema da secao entra no lugar do lift neutro de sempre */
.cx-card:hover{border-color:rgba(47,167,255,.4);box-shadow:0 24px 50px -28px rgba(47,167,255,.4)}
.cx-card:hover .ic{background:rgba(47,167,255,.18);transform:scale(1.08);box-shadow:0 0 0 6px rgba(47,167,255,.08)}

/* ===== hub: o saldo em R$ distribui para as moedas =====
   cada rota tem um --i. o pulso que percorre o fio e o brilho da moeda de destino
   usam a MESMA duracao e o MESMO delay (--i * .7s), entao a moeda so acende quando
   o pulso chega nela. seis rotas x .7s = os 4.2s do ciclo, e o loop nao tem costura. */
/* o svg cresce com a coluna e era ele que ditava a altura do bloco; o teto de 520px
   segura isso sem deixar as moedas pequenas demais */
.cx-hub{width:100%;max-width:520px;justify-self:center}
.cx-hub svg{width:100%;height:auto;display:block;overflow:visible}

.hub-rail{stroke:rgba(255,255,255,.13);stroke-width:1.5}
.hub-flow{
  stroke:#2FA7FF;stroke-width:2.5;
  /* pathLength=100 no HTML: o traco mede 16% da rota, seja ela reta ou em cotovelo */
  stroke-dasharray:16 100;stroke-dashoffset:16;
}
.cx-hero.in .hub-flow{animation:hubFlow 4.2s cubic-bezier(.5,0,.5,1) infinite;animation-delay:calc(var(--i) * .7s)}
/* de 16 a -100 o traco entra pela ponta do hub e sai pela ponta da moeda */
@keyframes hubFlow{0%{stroke-dashoffset:16}30%,100%{stroke-dashoffset:-100}}

.coin-bg{fill:#0E1218;stroke:rgba(255,255,255,.10);stroke-width:1.5}
.coin-sym,.coin-bnb{fill:var(--c);opacity:.55}
.coin-sym{
  font-family:var(--mono);font-size:21px;font-weight:600;
  text-anchor:middle;dominant-baseline:middle;
}
/* o anel e o que pulsa: fica atras do disco e cresce quando o valor chega */
.coin-ring{fill:none;stroke:var(--c);stroke-width:2;opacity:0;transform-box:fill-box;transform-origin:center}
.cx-hero.in .coin-ring{animation:hubRing 4.2s ease-out infinite;animation-delay:calc(var(--i) * .7s)}
.cx-hero.in .coin-bg{animation:hubBg 4.2s ease infinite;animation-delay:calc(var(--i) * .7s)}
.cx-hero.in .coin-sym,
.cx-hero.in .coin-bnb{animation:hubSym 4.2s ease infinite;animation-delay:calc(var(--i) * .7s)}

/* 26% e o instante em que o traco alcanca a ponta da rota */
@keyframes hubRing{
  0%,24%{opacity:0;transform:scale(1)}
  28%{opacity:.85;transform:scale(1)}
  48%{opacity:0;transform:scale(1.42)}
  49%,100%{opacity:0;transform:scale(1)}
}
@keyframes hubBg{
  0%,24%{stroke:rgba(255,255,255,.10)}
  30%,52%{stroke:var(--c)}
  74%,100%{stroke:rgba(255,255,255,.10)}
}
@keyframes hubSym{0%,24%{opacity:.55}30%,52%{opacity:1}74%,100%{opacity:.55}}

/* nucleo agora e o icone oficial (image), nao mais rect+texto R$ */
.hub-core image{filter:drop-shadow(0 6px 18px rgba(47,167,255,.35))}
.cx-hero.in .hub-core image{animation:hubCore 4.2s ease-in-out infinite}
@keyframes hubCore{0%,100%{filter:none}50%{filter:drop-shadow(0 0 16px rgba(47,167,255,.55))}}

@media(min-width:900px){
  /* a copy encolheu ao perder icone e tags: o hub ganha a folga */
  .cx-hero{grid-template-columns:.85fr 1.15fr;align-items:center;padding:32px 36px}
  .cx-grid{grid-template-columns:1fr 1fr;gap:22px}
}
/* com 3 cards (saque instantaneo entrou do lado do Pix 0 MED), a fileira
   unica so cabe confortavel num desktop mais largo — abaixo disso o par de
   colunas acima ja resolve bem (2+1) */
@media(min-width:1080px){
  .cx-grid{grid-template-columns:repeat(3,1fr)}
}
@media(prefers-reduced-motion:reduce){
  /* sem loop: as rotas ficam acesas e as moedas em brilho pleno */
  .hub-flow{stroke-dasharray:none;stroke-dashoffset:0;opacity:.5}
  .coin-sym,.coin-bnb{opacity:1}
}

/* ---- nav ----
   voltou pra barra unica (o experimento de blocos separados foi revertido a
   pedido do usuario, que vai aplicar um fundo ilustrado proprio no hero —
   ver .hero background). */
.nav{
  position:fixed;top:0;left:0;right:0;z-index:100;
  height:72px;
  display:flex;align-items:center;
  background:transparent;
  border-bottom:1px solid transparent;
  transition:background .35s var(--ease),border-color .35s var(--ease),height .35s var(--ease),box-shadow .35s var(--ease);
}
.nav.scrolled{
  height:64px;
  background:linear-gradient(180deg,rgba(255,255,255,.92),rgba(232,244,255,.82));
  backdrop-filter:blur(16px) saturate(1.5);
  -webkit-backdrop-filter:blur(16px) saturate(1.5);
  border-bottom-color:rgba(178,214,255,.5);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.95),
    0 24px 44px -28px rgba(47,167,255,.4);
}
.nav::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(102deg,transparent 42%,rgba(255,255,255,.65) 49%,rgba(160,210,255,.4) 52%,transparent 61%);
  opacity:0;
}
.nav.freeze{animation:navSettle .5s var(--ease-out) both}
.nav.freeze::after{animation:navSheen .68s ease-out both}
@keyframes navSettle{
  0%{transform:translateY(-3px) scaleY(.985)}
  55%{transform:translateY(.5px) scaleY(1.006)}
  100%{transform:translateY(0) scaleY(1)}
}
@keyframes navSheen{
  0%{transform:translateX(-130%) skewX(-11deg);opacity:0}
  10%{opacity:.9}
  60%{opacity:.45}
  100%{transform:translateX(230%) skewX(-11deg);opacity:0}
}
@media(prefers-reduced-motion:reduce){
  .nav.freeze{animation:none}
  .nav.freeze::after{animation:none}
}
.nav .wrap{display:flex;align-items:center;justify-content:space-between;width:100%}
.nav-links{display:flex;align-items:center;gap:34px}
.nav-links a{
  font-size:15px;font-weight:500;color:var(--text-mid);
  padding:7px 3px;border-radius:8px;
  transition:color .2s var(--ease),background .25s var(--ease);
}
/* leve neblina azul atras do link, como um halito de frio numa vidraca */
.nav-links a:hover{color:var(--text);background:rgba(47,167,255,.08)}
.nav-actions{display:flex;align-items:center;gap:14px}
.nav-actions .btn{padding:11px 20px;font-size:14px}
.nav-logo img{height:30px;width:auto}
.nav-actions .btn{padding:11px 20px;font-size:14px}
.nav-logo img{height:30px;width:auto}
.burger{display:none;width:42px;height:42px;border:0;background:transparent;border-radius:10px}
.burger span{display:block;width:20px;height:2px;background:var(--text);margin:4px auto;border-radius:2px;transition:transform .45s cubic-bezier(.6,.2,.2,1.3),opacity .2s ease,width .3s var(--ease)}
.burger.open span:nth-child(1){transform:translateY(6px) rotate(45deg)}
.burger:hover span{width:22px}
.burger.open:hover span{width:20px}
.burger.open span:nth-child(2){opacity:0}
.burger.open span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
.mobile{display:none}

/* ============ HERO · fundo claro ============ */
.hero{
  position:relative;
  padding:110px 0 var(--sect);
  overflow:hidden;
}
/* fundo ilustrado (iglu + mascote) só na primeira tela, a pedido do usuário —
   ele mesmo desenhou o conceito de "bloquinhos de gelo" que eu vinha tentando
   simular só com CSS. imagem e 1774x887 (2:1), com o assunto (iglu+pinguim)
   composto do lado direito e ceu vazio a esquerda — por isso o crop no
   background-position:right prioriza manter o pinguim visivel e sacrifica o
   ceu (area sem informacao) quando a proporcao da secao nao bate 2:1.
   so a partir de 900px: e o mesmo ponto de corte onde o hero vira 2 colunas,
   e o usuario avisou que vai mandar uma versao separada pro mobile —
   enquanto ela nao chega, telas estreitas ficam no fundo claro simples.

   min-height:100vh + flex centraliza o texto principal no meio da tela (era
   so padding-driven antes, o texto ficava colado no topo se o conteudo fosse
   curto). tres camadas de background (a primeira listada fica no topo da
   pilha): esmaece o pe da secao pro branco da pagina (transicao suave pra
   faixa de logos), depois uma cortina da esquerda que protege o texto —
   sem ela, em proporcoes de tela mais quadradas (tipo 1024x768) o cover da
   foto empurra o pinguim/painel de stats pra cima da coluna de texto, ja que
   background-position e cover nao tem nenhuma nocao das colunas do grid CSS
   por baixo. a cortina garante legibilidade sem depender de acertar esse
   alinhamento em toda proporcao possivel de tela. */
@media(min-width:900px){
  .hero{
    min-height:100vh;
    display:flex;
    align-items:center;
    background-image:
      linear-gradient(to bottom,transparent 62%,var(--bg) 96%),
      linear-gradient(100deg,var(--bg) 0%,var(--bg) 40%,rgba(255,255,255,.45) 58%,transparent 74%),
      url(/assets/fundopinguin.png);
    background-repeat:no-repeat,no-repeat,no-repeat;
    background-position:center,center,right 30%;
    background-size:100% 100%,100% 100%,cover;
  }
  .hero .wrap{width:100%}
  /* trava a largura do texto bem aquem da metade da coluna (que teria 50%
     do wrap): a cortina de gradiente sozinha nao dava conta em proporcoes de
     tela mais quadradas (1024x768), onde o cover empurra o pinguim/painel
     mais pra dentro. com isso o texto nunca alcanca essa zona, nao importa
     a matematica exata do cover em cada largura */
  .hero-copy{max-width:520px}
  /* halos redundantes com a atmosfera azul que a propria ilustracao ja traz */
  .hero .halo{display:none}
}
.hero .wrap{position:relative;z-index:1;display:grid;gap:56px;align-items:center}
.hero-badge{
  display:inline-block;
  padding:7px 16px;
  border-radius:var(--r-pill);
  border:1px solid var(--line-strong);
  background:var(--bg-elev);
  font-size:13px;font-weight:500;color:var(--text-mid);
  margin-bottom:28px;
}
.hero-sub{
  margin-top:26px;
  max-width:520px;
  font-size:19px;
  color:var(--text-mid);
}
.hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:38px}
/* no desktop os CTAs do hero ficam mais largos; abaixo de 640px o bloco de
   @media ja aperta o padding para caberem lado a lado */
@media(min-width:981px){
  .hero-cta .btn{padding-left:38px;padding-right:38px}
}

@media (min-width:900px){
  .hero .wrap{grid-template-columns:1fr 1fr}
}

@media (prefers-reduced-motion:reduce){
  .hero .wrap{transition:none}
}

/* TEMPORARIO: o mock do dashboard esta escondido a pedido do usuario ("pode tirar ele
   temporariamente, so vamos manter essas notificacoes flutuantes"). O markup continua no
   index.html; para trazer de volta basta deletar este bloco. */
.tilt{display:none}
@media(min-width:981px){
  .hero-visual{min-height:460px}
}

/* palco do dashboard — perspectiva lateral (robusto: visível por padrão) */
.hero-visual{position:relative;z-index:1;perspective:2600px;perspective-origin:62% 42%}
.hero-visual::before{content:"";position:absolute;inset:-6% -4%;background:radial-gradient(closest-side,rgba(47,167,255,.3),transparent);filter:blur(50px);z-index:-1;animation:glowpulse 5s ease-in-out infinite}
@keyframes glowpulse{0%,100%{opacity:.6}50%{opacity:1}}
.tilt{transform-style:preserve-3d;transition:transform .25s var(--ease)}
.stage-inner{transform-style:preserve-3d;transform:rotateY(-11deg) rotateX(4deg);opacity:1}
body.loaded .stage-inner{animation:dashIn 1.1s var(--ease-out) .25s both}
@keyframes dashIn{from{opacity:0;transform:rotateY(-15deg) rotateX(7deg) translateY(42px) scale(.9)}to{opacity:1;transform:rotateY(-11deg) rotateX(4deg) scale(1)}}
.dash{position:relative;width:var(--dash-w,108%);transform:scale(var(--dash-scale,1)) scaleY(var(--dash-vscale,1));transform-origin:left center;margin-left:var(--dash-shift,-4%);background:#0B1426;border:1px solid rgba(124,198,255,.16);border-radius:clamp(14px,1.8vw,20px);box-shadow:0 50px 100px -30px rgba(0,0,0,.7),0 0 0 1px rgba(124,198,255,.05);overflow:hidden;--mxp:70%;--myp:30%}
.dash::before{content:"";position:absolute;inset:0;z-index:4;pointer-events:none;background:radial-gradient(360px 360px at var(--mxp) var(--myp),rgba(47,167,255,.16),transparent 60%);transition:background .15s ease;opacity:.9}
.dash-accent{height:3px;background:linear-gradient(90deg,#2FA7FF,#0FBF9F)}
/* top bar do app (busca + ícones), fiel ao hub */
.dtopbar{display:flex;align-items:center;gap:14px;padding:11px 22px;border-bottom:1px solid rgba(124,198,255,.1)}
.dsearch{flex:1;display:flex;align-items:center;gap:9px;max-width:300px;font-size:.74rem;color:#7E93BD;background:rgba(255,255,255,.04);border:1px solid rgba(124,198,255,.14);border-radius:10px;padding:8px 12px}
.dsearch svg{width:14px;height:14px;stroke:#7E93BD;fill:none;flex:none}
.dsearch .kbd{margin-left:auto;font-family:var(--mono);font-size:.62rem;color:#6E83AE;background:rgba(255,255,255,.06);border:1px solid rgba(124,198,255,.14);border-radius:6px;padding:2px 6px}
.dtop-r{margin-left:auto;display:flex;align-items:center;gap:9px}
.dtop-ic{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;border:1px solid rgba(124,198,255,.14);background:rgba(255,255,255,.03);position:relative}
.dtop-ic svg{width:16px;height:16px;stroke:#9DB2D8;fill:none}
.dtop-ic.bell::after{content:"";position:absolute;top:6px;right:7px;width:6px;height:6px;border-radius:50%;background:#34E08A;border:2px solid #0B1426}
.dtop-chip{display:inline-flex;align-items:center;gap:6px;font-size:.72rem;font-weight:700;color:#7CC6FF;background:rgba(47,167,255,.12);border:1px solid rgba(47,167,255,.28);border-radius:9px;padding:7px 12px}
.dtop-chip svg{width:14px;height:14px;stroke:#7CC6FF;fill:none}
.dtop-user{display:inline-flex;align-items:center;gap:8px;font-size:.74rem;font-weight:700;color:#E6EEFB;background:rgba(255,255,255,.04);border:1px solid rgba(124,198,255,.14);border-radius:99px;padding:5px 12px 5px 5px}
.dtop-user i{width:26px;height:26px;border-radius:50%;background:linear-gradient(135deg,#2FA7FF,#003A99);display:grid;place-items:center;font-style:normal;font-size:.6rem;font-weight:800;color:#fff}
.dash-body{display:grid;grid-template-columns:188px 1fr;min-height:0}
.dside{background:rgba(255,255,255,.02);border-right:1px solid rgba(124,198,255,.1);padding:18px 14px;display:flex;flex-direction:column}
.dside-logo{height:22px;width:auto;align-self:flex-start;object-fit:contain;margin:2px 8px 18px;filter:brightness(0) invert(1);opacity:1}
.dside-lbl{font-size:.56rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#5E73A0;margin:12px 10px 8px}
.dside a{display:flex;align-items:center;gap:10px;font-size:.8rem;font-weight:600;color:#8EA1C8;padding:8px 11px;border-radius:9px;margin-bottom:2px}
.dside a .di{width:6px;height:6px;border-radius:2px;background:#48597F}
.dside a.on{background:rgba(47,167,255,.14);color:#fff}
.dside-user{margin-top:auto;display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:11px;background:rgba(255,255,255,.04);border:1px solid rgba(124,198,255,.12)}
.dside-user i{width:30px;height:30px;border-radius:50%;background:linear-gradient(135deg,#2FA7FF,#003A99);display:grid;place-items:center;font-style:normal;font-size:.62rem;font-weight:800;color:#fff;flex:none}
.dside-user b{display:block;font-size:.72rem;color:#E6EEFB;font-weight:700;line-height:1.2}
.dside-user small{font-size:.6rem;color:#6E83AE}
.dside a.on .di{background:var(--blue)}
.dmain{padding:0}
.dmain-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}
.dmain-head .t{font-size:.6rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#5E73A0}
.dsub{display:block;font-size:.72rem;color:#7E93BD;margin-top:4px;max-width:340px;line-height:1.35}
.dmain-head h4{font-size:1.28rem;font-weight:800;color:#fff;letter-spacing:-.025em;margin-top:3px}
.dmain-head .chip{font-size:.72rem;font-weight:600;color:#9DB2D8;border:1px solid rgba(124,198,255,.18);border-radius:9px;padding:7px 12px;background:rgba(255,255,255,.03)}
.dkpis{display:grid;grid-template-columns:repeat(3,1fr) 1.2fr;gap:11px;margin-bottom:13px}
.kpi{border:1px solid rgba(124,198,255,.12);border-radius:var(--r-md);padding:13px 14px;background:rgba(255,255,255,.025)}
.kpi .l{font-size:.55rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#5E73A0}
.kpi b{display:block;font-size:1.08rem;font-weight:800;color:#fff;letter-spacing:-.025em;margin-top:5px}
.kpi small{font-size:.64rem;color:#7E93BD}
.kpi-dark{background:linear-gradient(135deg,#1E7DE0,#0B49B8);border-color:transparent}
.kpi-dark .l{color:#BBD6FF}.kpi-dark b{color:#fff}
.kpi-dark .saca{display:inline-block;margin-top:5px;font-size:.6rem;font-weight:700;color:#0B49B8;background:#fff;border-radius:7px;padding:4px 9px}
.dgrid2{display:grid;grid-template-columns:1.5fr 1fr;gap:11px}
.dcard{border:1px solid rgba(124,198,255,.12);border-radius:var(--r-md);padding:15px 16px;background:rgba(255,255,255,.025)}
.dcard .l{font-size:.55rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#5E73A0;display:block;margin-bottom:12px}
.dbars{display:flex;align-items:flex-end;gap:7px;height:92px}
.dbars i{flex:1;border-radius:5px 5px 0 0;background:linear-gradient(180deg,#54B8FF,#0B49B8);transform-origin:bottom;transform:scaleY(.12)}
.dbars i:nth-child(even){opacity:.45}
.lift .dbars i{animation:bar .9s var(--ease-out) forwards;animation-delay:calc(var(--i,0)*55ms + .7s)}
@keyframes bar{to{transform:scaleY(var(--h,.5))}}
.daprv{display:grid;gap:10px}
.daprv .r{display:grid;grid-template-columns:40px 1fr 38px;align-items:center;gap:9px}
.daprv .r span{font-size:.72rem;font-weight:600;color:#AFC0E2}
.daprv .tk{height:6px;border-radius:6px;background:rgba(124,198,255,.12);overflow:hidden}
.daprv .fl{height:100%;border-radius:6px;background:linear-gradient(90deg,#54B8FF,#0B49B8);transform-origin:left;transform:scaleX(0)}
.lift .daprv .fl{animation:gx 1s var(--ease-out) forwards;animation-delay:.9s}
@keyframes gx{to{transform:scaleX(var(--w,1))}}
.daprv .p{font-family:var(--mono);font-size:.7rem;color:#7CC6FF;text-align:right}
/* notificações flutuantes */
.float{position:absolute;z-index:5;display:flex;align-items:center;gap:11px;background:rgba(255,255,255,.72);backdrop-filter:blur(18px) saturate(1.4);-webkit-backdrop-filter:blur(18px) saturate(1.4);border:1px solid var(--line);border-radius:var(--r-md);padding:12px 15px;box-shadow:0 20px 44px -20px rgba(10,24,48,.35)}
body.loaded .float{opacity:0}
.float.in{animation:fl-in .7s var(--ease-out) forwards}
.float.f1{animation-delay:.9s}.float.f2{animation-delay:1.15s}.float.f3{animation-delay:1.4s}
.float.f1.in{animation:fl-in .7s var(--ease-out) .9s forwards,floaty 5.5s ease-in-out 1.7s infinite}
.float.f2.in{animation:fl-in .7s var(--ease-out) 1.15s forwards,floaty 6.2s ease-in-out 2s infinite}
.float.f3.in{animation:fl-in .7s var(--ease-out) 1.4s forwards,floaty 5.8s ease-in-out 2.4s infinite}
@keyframes fl-in{from{opacity:0;transform:translateY(16px) scale(.94)}to{opacity:1;transform:none}}
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-9px)}}
/* os 3 floats usam a logomarca oficial (mesmo PNG do nucleo do hub cripto) em
   vez de icone por categoria — reforca "isso e uma notificacao real da sua
   conta PinPay", nao uma ilustracao generica. a logo ja vem com cantos
   arredondados e fundo em gradiente proprios no arquivo, entao a imagem
   preenche o chip inteiro em vez de ficar pequena dentro de outro fundo —
   duas formas arredondadas aninhadas (chip + logo) lia como redundante */
.float .ic{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;flex:none;position:relative;overflow:hidden}
.float .ic img{width:100%;height:100%;object-fit:cover}
/* line-height:1.65 do body (pensado pra paragrafo longo) deixava o titulo e o
   subtitulo bem mais separados do que devia num par de duas linhas curtas —
   por isso a leitura de "muito distante" */
.float b{display:block;font-size:.82rem;line-height:1.3;color:var(--text);font-weight:700;letter-spacing:-.01em;position:relative}
.float small{display:block;font-size:.7rem;line-height:1.3;color:var(--text-dim);position:relative}
/* sem o mock do dashboard atras, os chips se distribuem em zigue-zague no palco de 460px */
.float.f1{top:26px;left:0}
/* em telas bem largas o fundo ilustrado do hero (background-size:cover)
   escala com menos corte vertical, e o cartao de notificacao passava a
   sobrepor o rotulo "Transacoes aprovadas" do proprio paisagem — sobe um
   pouco menos aqui pra manter os dois legiveis */
@media(min-width:1800px){.float.f1{top:-28px}}
.float.f2{top:auto;bottom:10%;right:-1%}
.float.f3{bottom:26px;left:6%}


/* ===== dashboard premium (hero) ===== */
.dash-body{min-height:0}
.dmain{padding:0}
.dmain-head{display:flex;align-items:flex-start;justify-content:space-between;margin:16px 24px 14px}
.dmh-r{display:flex;align-items:center;gap:8px}
.dlive{display:inline-flex;align-items:center;gap:6px;font-size:.62rem;font-weight:700;letter-spacing:.04em;color:#7FE3A6;background:rgba(52,224,138,.12);border:1px solid rgba(52,224,138,.3);border-radius:99px;padding:5px 10px}
.dlive i{width:6px;height:6px;border-radius:50%;background:#34E08A;box-shadow:0 0 0 0 rgba(52,224,138,.5);animation:livepulse 2.2s ease-out infinite}
.surf{background:linear-gradient(180deg,rgba(255,255,255,.055),rgba(255,255,255,.02));border:1px solid rgba(124,198,255,.14);box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 2px 6px -3px rgba(0,0,0,.5)}
.dtiles{display:grid;grid-template-columns:repeat(3,1fr) 1.25fr;gap:14px;margin:0 24px 12px}
.tile{position:relative;border-radius:14px;padding:13px 16px;display:flex;flex-direction:column;min-height:98px;background:linear-gradient(180deg,rgba(255,255,255,.055),rgba(255,255,255,.02));border:1px solid rgba(124,198,255,.14);box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 2px 6px -3px rgba(0,0,0,.5)}
.tile-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:11px}
.tile-ic{width:34px;height:34px;border-radius:10px;background:rgba(47,167,255,.16);display:grid;place-items:center;color:#7CC6FF}
.tile-ic svg{width:18px;height:18px;stroke:currentColor;fill:none}
.trend{font-size:.6rem;font-weight:700;border-radius:99px;padding:4px 8px;display:inline-flex;align-items:center;gap:3px}
.trend.up{color:#7FE3A6;background:rgba(52,224,138,.14)}
.tile .l{font-size:.55rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#6E83AE}
.tile .val{display:block;font-size:1.2rem;font-weight:800;color:#fff;letter-spacing:-.03em;margin-top:5px}
.tile-sub{font-size:.66rem;color:#7E93BD;margin-top:auto;padding-top:8px}
.tile-num{font-size:1.32rem;font-weight:800;color:#fff;letter-spacing:-.03em}
.stack{display:flex;height:7px;border-radius:99px;overflow:hidden;margin:11px 0 10px;background:rgba(255,255,255,.06)}
.stack .s-ok{background:#34E08A;flex:0 0 84%}.stack .s-pend{background:#FFC34D;flex:0 0 12%}.stack .s-rec{background:#FF6B6B;flex:0 0 4%}
.stack-leg{display:flex;flex-direction:column;gap:5px;margin-top:auto}
.stack-leg span{display:flex;align-items:center;gap:7px;font-size:.64rem;color:#9DB2D8}
.stack-leg i{width:6px;height:6px;border-radius:50%}.stack-leg b{margin-left:auto;color:#fff;font-weight:700}
.d-ok{background:#34E08A}.d-pend{background:#FFC34D}.d-rec{background:#FF6B6B}
.tile-bal{background:linear-gradient(150deg,#1E7DE0,#0B3FA0 70%,#072B73);border:1px solid rgba(124,198,255,.3);overflow:hidden}
.tile-bal::after{content:"";position:absolute;right:-30px;top:-34px;width:130px;height:130px;border-radius:50%;background:radial-gradient(circle,rgba(124,198,255,.4),transparent 65%)}
.tile-bal .l{color:#CFE0FF}.tile-bal .val{position:relative}
.bal-spark{position:absolute;left:0;right:0;bottom:42px;height:28px;opacity:.5}
.bal-spark svg{width:100%;height:100%;overflow:visible}
.bal-spark path{fill:none;stroke:#BBD9FF;stroke-width:2;stroke-linecap:round}
.sacar{position:relative;margin-top:auto;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;font-size:.66rem;font-weight:700;color:#0B3FA0;background:#fff;border:1px solid rgba(124,198,255,.5);border-radius:10px;padding:8px 14px;cursor:pointer;box-shadow:0 4px 12px -4px rgba(0,0,0,.45);transition:transform .15s ease,box-shadow .15s ease,background .15s ease}
.sacar:hover{background:#EEF6FF;transform:translateY(-1px);box-shadow:0 8px 18px -6px rgba(47,167,255,.55)}
.sacar:active{transform:translateY(0)}
.dgrid2{display:grid;grid-template-columns:1.7fr 1fr;gap:14px;margin:0 24px 14px}
.dcard{position:relative;border-radius:16px;padding:16px 18px;background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.02));border:1px solid rgba(124,198,255,.14);box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 2px 6px -3px rgba(0,0,0,.5)}
.dcard-chart{overflow:hidden}
.chart-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}
.l{font-size:.55rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#6E83AE}
.seg{display:inline-flex;background:rgba(255,255,255,.05);border:1px solid rgba(124,198,255,.16);border-radius:9px;padding:3px}
.seg i{font-style:normal;font-size:.62rem;font-weight:600;color:#8EA1C8;padding:4px 11px;border-radius:6px}
.seg i.on{background:rgba(47,167,255,.22);color:#fff}
.achart{position:relative;display:flex;gap:9px;padding-top:14px}
.ylabs{display:flex;flex-direction:column;justify-content:space-between;width:26px;font-family:var(--mono);font-size:.52rem;color:#5E73A0;padding:2px 0 4px;flex:none;text-align:right}
.achart svg.area{flex:1;width:100%;height:96px;display:block;overflow:visible;transform-origin:bottom}
.lift svg.area{animation:chartgrow 7s ease-in-out 2.4s infinite}
@keyframes chartgrow{0%{transform:scaleY(.88)}50%{transform:scaleY(1.06)}100%{transform:scaleY(.88)}}
.gl{stroke:rgba(124,198,255,.09);stroke-width:1}
.area-f{opacity:1}
.lift .area-f{animation:areafade .9s ease 1.5s both}
@keyframes areafade{from{opacity:0}to{opacity:1}}
.area-l{stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:760;stroke-dashoffset:0;filter:drop-shadow(0 4px 7px rgba(47,167,255,.4))}
.lift .area-l{animation:dashdraw 1.8s var(--ease-out) .55s both}
@keyframes dashdraw{from{stroke-dashoffset:760}to{stroke-dashoffset:0}}
.cdot{fill:#fff;stroke:#2FA7FF;stroke-width:3}
.cring{fill:none;stroke:rgba(47,167,255,.55);stroke-width:2;animation:cring 2.6s ease-out infinite}
@keyframes cring{0%{r:5;opacity:.7}100%{r:17;opacity:0}}
.ctip{position:absolute;left:60%;top:-2px;transform:translateX(-50%);background:#0B1426;border:1px solid rgba(124,198,255,.3);border-radius:9px;padding:5px 9px;font-size:.62rem;font-weight:700;color:#fff;white-space:nowrap;box-shadow:0 10px 22px -6px rgba(0,0,0,.6);pointer-events:none;z-index:3}
.ctip small{display:block;font-size:.55rem;font-weight:500;color:#9DB2D8;letter-spacing:.02em}
.ctip::after{content:"";position:absolute;left:50%;bottom:-5px;transform:translateX(-50%) rotate(45deg);width:8px;height:8px;background:#0B1426;border-right:1px solid rgba(124,198,255,.25);border-bottom:1px solid rgba(124,198,255,.25)}
.hours{display:flex;justify-content:space-between;margin-top:8px;padding-left:35px;font-size:.54rem;color:#5E73A0;font-family:var(--mono)}
.ap-geral{font-size:.62rem;color:#7E93BD}.ap-geral em{font-style:normal;color:#7FE3A6;font-weight:700}
.daprv{display:grid;gap:14px;margin-top:2px}
.daprv .r{display:grid;grid-template-columns:26px 44px 1fr 34px;align-items:center;gap:8px}
.mic{width:26px;height:26px;border-radius:8px;background:rgba(47,167,255,.16);display:grid;place-items:center;color:#7CC6FF}
.mic svg{width:13px;height:13px;stroke:currentColor;fill:none}
.daprv .mlbl{font-size:.72rem;font-weight:600;color:#AFC0E2}
.daprv .tk{height:6px;border-radius:6px;background:rgba(124,198,255,.12);overflow:hidden}
.daprv .fl{height:100%;border-radius:6px;background:linear-gradient(90deg,#54B8FF,#0B49B8);transform-origin:left;transform:scaleX(var(--w,1))}
.lift .daprv .fl{animation:gx 1s var(--ease-out) .8s both}
@keyframes gx{from{transform:scaleX(0)}to{transform:scaleX(var(--w,1))}}
.daprv .p{font-family:var(--mono);font-size:.7rem;color:#7CC6FF;text-align:right}
.dtx{display:grid;gap:8px;margin:0 24px 20px}
.dtx-row{display:flex;align-items:center;gap:11px;border-radius:12px;padding:10px 12px;background:linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.018));border:1px solid rgba(124,198,255,.12)}
.dtx-ic{width:30px;height:30px;border-radius:9px;display:grid;place-items:center;flex:none}
.dtx-ic.pix{background:rgba(52,224,138,.2);color:#7FE3A6}.dtx-ic.card{background:rgba(47,167,255,.2);color:#7CC6FF}
.dtx-ic svg{width:15px;height:15px;stroke:currentColor;fill:none}
.dtx-row .info{display:flex;flex-direction:column}
.dtx-row b{font-size:.76rem;font-weight:700;color:#fff;letter-spacing:-.01em}
.dtx-row small{font-size:.62rem;color:#7E93BD}
.dtx-v{margin-left:auto;font-size:.78rem;font-weight:700;color:#fff}
.dtx-tag{font-size:.56rem;font-weight:700;letter-spacing:.06em;border-radius:99px;padding:4px 9px;text-transform:uppercase}
.dtx-tag.ok{background:rgba(52,224,138,.16);color:#7FE3A6}
@media(max-width:980px){.dtiles{grid-template-columns:1fr 1fr}.dgrid2{grid-template-columns:1fr}}
@media(max-width:640px){.dtiles{grid-template-columns:1fr}}

/* ===== mockup mobile (fiel ao app, compacto, premium) ===== */
.phone{display:none;position:relative}
.ph-screen{background:#F4F7FB;border-radius:36px;border:1px solid rgba(255,255,255,.5);box-shadow:0 50px 90px -30px rgba(0,0,0,.65),0 0 0 10px #0B1426,0 0 0 11px rgba(124,198,255,.22);padding:0 0 8px;position:relative;overflow:hidden;max-width:290px;margin:0 auto}
.ph-bar{display:flex;align-items:center;justify-content:space-between;padding:7px 22px 4px;font-size:.64rem;font-weight:700;color:var(--text)}
.ph-bar .ph-dots{display:flex;gap:3px}.ph-bar .ph-dots i{width:4px;height:4px;border-radius:50%;background:var(--text)}
.ph-top{display:flex;align-items:center;justify-content:space-between;padding:4px 16px 10px}
.ph-logo{height:22px;width:auto}
.ph-top-r{display:flex;align-items:center;gap:8px}
.ph-ic-sm{width:30px;height:30px;border-radius:50%;background:#fff;border:1px solid var(--line);display:grid;place-items:center;font-size:.78rem;color:var(--text-mid)}
.ph-av{width:30px;height:30px;border-radius:50%;background:linear-gradient(135deg,#2FA7FF,#003A99);color:#fff;display:grid;place-items:center;font-size:.64rem;font-weight:800}
.ph-fat{padding:0 16px}
.ph-l{font-size:.6rem;font-weight:600;letter-spacing:.04em;color:var(--text-dim);text-transform:uppercase}
.ph-fat-big{font-size:1.5rem;font-weight:800;color:var(--text);letter-spacing:-.03em;line-height:1.05;margin-top:2px}
.ph-fat-big em{font-style:normal;font-size:.95rem;color:var(--text-dim);font-weight:700}
.ph-fat-up{display:block;margin-top:3px;font-size:.66rem;font-weight:700;color:#16A34A}
.ph-fat-up i{font-style:normal;font-weight:500;color:var(--text-dim)}
.ph-divider{height:1px;border-radius:2px;background:linear-gradient(90deg,var(--blue),transparent);margin:9px 16px}
.ph-saldo{margin:0 16px 9px;background:linear-gradient(155deg,#10182E,#0B1426);border-radius:16px;padding:13px 15px 12px;position:relative;overflow:hidden}
.ph-saldo::after{content:"";position:absolute;right:-28px;top:-32px;width:110px;height:110px;border-radius:50%;background:radial-gradient(circle,rgba(47,167,255,.3),transparent 65%)}
.ph-saldo-head{display:flex;align-items:center;justify-content:space-between;position:relative}
.ph-saldo-head>span:first-child{font-size:.58rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#9DB2D8}
.ph-live{display:inline-flex;align-items:center;gap:5px;font-size:.56rem;font-weight:600;color:#7FE3A6}
.ph-live i{width:6px;height:6px;border-radius:50%;background:#34E08A;box-shadow:0 0 0 0 rgba(52,224,138,.5);animation:livepulse 2.2s ease-out infinite}
.ph-saldo .ph-big{font-size:1.55rem;font-weight:800;color:#fff;letter-spacing:-.03em;margin:3px 0 9px;position:relative}
.ph-saldo .ph-big em{font-style:normal;font-size:.9rem;color:#9DB2D8;font-weight:700}
.ph-sacar{display:block;text-align:center;background:#fff;color:#0B1426;font-weight:700;font-size:.74rem;border-radius:10px;padding:8px;position:relative}
.ph-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;padding:0 16px;margin-bottom:9px}
.ph-tile{background:#fff;border:1px solid var(--line);border-radius:11px;padding:7px 7px;text-align:center}
.ph-tile span{display:block;font-size:.5rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-dim);margin-bottom:4px}
.ph-tile b{font-size:.9rem;font-weight:800;color:var(--text);letter-spacing:-.02em}
.ph-actions{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;padding:0 16px;margin-bottom:9px}
.ph-act{display:flex;flex-direction:column;align-items:center;gap:5px;font-size:.56rem;font-weight:600;color:var(--text-mid)}
.ph-aic{width:40px;height:40px;border-radius:12px;background:#fff;border:1px solid var(--line);display:grid;place-items:center;color:var(--navy);transition:transform .2s}
.ph-aic svg{width:18px;height:18px}
.ph-status{margin:0 16px;background:#fff;border:1px solid var(--line);border-radius:13px;padding:10px 13px}
.ph-st-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.ph-st-head span{font-size:.76rem;font-weight:700;color:var(--text)}
.ph-st-head em{font-style:normal;font-size:.62rem;color:var(--text-dim)}
.ph-stack{display:flex;height:6px;border-radius:99px;overflow:hidden;margin-bottom:8px;background:var(--bg-elev-2)}
.ph-stack .s-ok{background:#34E08A;flex:0 0 84%}.ph-stack .s-pend{background:#FFC34D;flex:0 0 12%}.ph-stack .s-rec{background:#FF6B6B;flex:0 0 4%}
.ph-leg{display:flex;justify-content:space-between;gap:6px}
.ph-leg span{display:inline-flex;align-items:center;gap:5px;font-size:.6rem;color:var(--text-mid)}
.ph-leg i{width:6px;height:6px;border-radius:50%}
.ph-leg b{color:var(--text);font-weight:800;margin-left:1px}
.ph-st-row i{width:7px;height:7px;border-radius:50%}
.ph-st-row b{margin-left:auto;font-weight:800;color:var(--text)}
.ph-nav{position:relative;margin:10px auto 2px;width:max-content;display:flex;gap:9px;background:#0B1426;border-radius:99px;padding:7px 12px;box-shadow:0 14px 28px -10px rgba(0,0,0,.5)}
.ph-nav span{width:33px;height:33px;border-radius:50%;display:grid;place-items:center;color:#8EA1C8}
.ph-nav span svg{width:17px;height:17px}
.ph-nav span.on{background:linear-gradient(135deg,#2FA7FF,#0B49B8);color:#fff}


/* sheen: reflexo que varre o dashboard */
.dash::after{content:"";position:absolute;inset:0;z-index:6;pointer-events:none;background:linear-gradient(115deg,transparent 30%,rgba(124,198,255,.14) 47%,rgba(255,255,255,.05) 50%,transparent 64%);transform:translateX(-120%);animation:sheen 6.5s ease-in-out 1.4s infinite}
@keyframes sheen{0%{transform:translateX(-120%)}22%,100%{transform:translateX(120%)}}
@media(prefers-reduced-motion:reduce){.dash::after{display:none}}

.ph-float{position:absolute;z-index:8;display:flex;align-items:center;gap:9px;background:rgba(13,22,42,.62);backdrop-filter:blur(18px) saturate(1.4);-webkit-backdrop-filter:blur(18px) saturate(1.4);border:1px solid rgba(124,198,255,.3);border-radius:13px;padding:9px 12px;box-shadow:0 18px 40px -14px rgba(0,0,0,.7),inset 0 1px 0 rgba(255,255,255,.14)}
.ph-float .ph-fl-ic{width:28px;height:28px;border-radius:8px;background:rgba(47,167,255,.22);display:grid;place-items:center;flex:none}
.ph-float .ph-fl-ic.green{background:rgba(52,224,138,.2)}
.ph-float .ph-fl-ic.amber{background:rgba(255,195,77,.2)}
.ph-float .ph-fl-ic img{width:15px;height:auto;filter:brightness(0) invert(1)}
.ph-float .ph-fl-ic svg{width:15px;height:15px}
.ph-float b{display:block;font-size:.72rem;font-weight:700;color:#fff;letter-spacing:-.01em}
.ph-float small{font-size:.64rem;color:#9DB2D8;font-weight:600}
.pf-a{top:90px;left:-8px;animation:phfl 5s ease-in-out infinite}
.pf-b{top:300px;right:-8px;animation:phfl 5.6s ease-in-out .6s infinite}
.pf-c{bottom:128px;left:-4px;animation:phfl 5.2s ease-in-out 1.1s infinite}
@keyframes phfl{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
@media(prefers-reduced-motion:reduce){.ph-float{animation:none}}

/* ===== LOGOS / integrações ===== */
/* sem overflow:hidden aqui: o halo desta secao (720x420, top:-120px) some pela
   metade porque nasce ACIMA do topo da propria secao — com o corte no nivel da
   secao, o degrade radial (que deveria esmaecer suave em todas as direcoes)
   ficava com uma quina reta exatamente onde a secao comecava, lendo como um
   "corte" em vez de continuar o fundo. quem precisa continuar clipando a
   fileira de logos (que e larga o bastante pra vazar horizontalmente) e'
   .logos-glass, um nivel abaixo — o overflow ficou la, entao a fileira
   continua contida e o halo agora esmaece livre por cima. */
.logos{
  position:relative;
  padding:20px 0;
  background:var(--bg);
}
.logos .wrap{position:relative;z-index:1}
/* sem card: um painel com borda + fundo proprio aqui so criava um retangulo
   com canto duro flutuando sobre o branco da secao — "glass" sem nada
   interessante atras pra desfocar e' so uma caixa que nao combina com nada.
   o marquee agora respira no mesmo fundo do rotulo acima, sem costura;
   quem faz a borda suave e' so a mask-image do .logos-mask (fade nas pontas) */
.logos-glass{
  position:relative;z-index:1;
  padding:26px 0;
  overflow:hidden;
}
.logos-label{
  text-align:center;
  font-family:var(--mono);
  font-size:12px;font-weight:500;
  letter-spacing:.18em;text-transform:uppercase;
  color:var(--text-dim);
  margin-bottom:34px;
}
.logos-track{
  display:flex;align-items:center;gap:60px;width:max-content;
  animation:marquee 42s linear infinite;
}
.logos-track:hover{animation-play-state:paused}
.logos-item{
  display:flex;align-items:center;gap:11px;
  opacity:.72;
  transition:opacity .3s var(--ease);
  white-space:nowrap;
}
/* wordmark: altura fixa e largura livre, para marcas de proporcoes diferentes
   sentarem na mesma linha de base. sem height explicito o SVG cai no 300x150 */
/* --h vem inline do campo h em main.js; --hs e o fator de escala responsivo */
.logos-img{height:calc(var(--h,21) * var(--hs,1) * 1px);width:auto;display:block}
/* Utmify e XTracky nao publicam wordmark: o simbolo entra ao lado do nome */
.logos-img.is-mark{--h:20;width:calc(var(--h) * var(--hs,1) * 1px);border-radius:5px;object-fit:contain}
.logos-item b{
  font-size:16px;font-weight:600;letter-spacing:-.03em;color:var(--text);
}
.logos-item:hover{opacity:1}
.logos-mask{
  position:relative;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* no mobile a fileira anda numa janela estreita: com 60px de respiro so cabia
   uma marca e meia por vez e a leitura virava um desfile lento. */
@media (max-width:720px){
  .logos-track{gap:34px;--hs:.86}
  .logos-item{gap:8px}
  .logos-item b{font-size:14px}
}

@media (prefers-reduced-motion:reduce){
  .logos-track{animation:none;flex-wrap:wrap;width:auto;justify-content:center;gap:28px}
}

/* ===== failover: adquirente 1 recusa, adquirente 2 aprova =====
   ciclo unico de 8s. todos os keyframes rodam com a mesma duracao e se coordenam
   pelos percentuais, entao nao ha delay para dessincronizar.
   so comeca quando .plat-hero recebe .in (scroll reveal). */
/* painel um tom mais frio que o branco do card, pra as linhas brancas de
   dentro (.rt-step, que herda --bg-elev) se destacarem — mesma logica de
   camadas de antes, so invertida (branco fora / palido dentro / branco nas
   linhas, em vez de palido fora / branco dentro / palido nas linhas) */
.rt{--cy:8s;background:#F3F8FE;border:1px solid #E4EDF7;border-radius:8px;padding:16px}
/* uma linha so por caixa: e o que derruba a altura do bloco.
   layout novo: sem borda+cantos+fundo cheio em cada linha (isso lia como 3
   "caixinhas de alerta" empilhadas, cada uma um cartao separado — feedback
   do usuario com screenshot). agora e uma barra de destaque na lateral
   esquerda (a cor do status) + um fundo bem sutil, tudo dentro do MESMO
   painel continuo — mais parecido com uma timeline/feed de status premium
   do que uma lista de alertas. */
.rt-step{
  position:relative;
  display:flex;align-items:center;gap:12px;
  border:0;border-left:3px solid transparent;border-radius:4px;
  padding:12px 14px 12px 13px;background:transparent;
  transition:background .3s var(--ease),border-color .3s var(--ease);
}
.rt-order{border-left-color:rgba(47,167,255,.4);background:rgba(47,167,255,.04)}
.rt-ic{
  flex:none;width:28px;height:28px;border-radius:7px;
  display:grid;place-items:center;position:relative;
  font-family:var(--mono);font-size:.72rem;font-weight:600;
  background:var(--bg-elev-2);color:var(--text-mid);
}
.rt-ic svg{width:14px;height:14px}
/* anel que pulsa enquanto a adquirente esta tentando */
.rt-acq .rt-ic::after{
  content:"";position:absolute;inset:0;border-radius:inherit;
  border:2px solid var(--blue);opacity:0;
}
.rt-step b{font-size:.86rem;font-weight:700;color:var(--text);letter-spacing:-.01em}
/* os estados dividem a mesma celula do grid: a caixa nunca muda de altura */
.rt-st{margin-left:auto;display:grid;text-align:right}
.rt-st em{
  grid-area:1/1;font-style:normal;white-space:nowrap;
  font-family:var(--mono);font-size:.72rem;color:var(--text-dim);
}
.rt-acq .rt-st em{opacity:0}
.rt-tag{
  flex:none;width:21px;height:21px;border-radius:50%;margin-left:10px;
  display:grid;place-items:center;font-size:.65rem;font-weight:700;
  opacity:0;transform:scale(.5);
}
.t-fail{background:rgba(214,69,69,.12);color:#C63B3B}
.t-ok{background:rgba(15,157,99,.14);color:#0F9D63}

/* fio vertical entre as linhas — mais grosso que antes (3px, nao 2px) e com
   leve glow: sem a caixa cheia em cada linha, e o fio que precisa carregar
   a leitura de "isso e um trilho continuo", nao 3 cartoes com conectores */
.rt-wire{height:18px;position:relative;display:grid;place-items:center}
.rt-wire::before{content:"";position:absolute;top:0;bottom:0;width:2px;background:var(--line)}
.rt-wire i{position:absolute;top:0;bottom:0;width:3px;border-radius:2px;background:var(--blue);box-shadow:0 0 8px -1px rgba(47,167,255,.7);transform:scaleY(0);transform-origin:top}
.w2 i{background:#C63B3B}
.w3 i{background:#0F9D63}
/* o pacote que desce o fio da a leitura de que algo esta em transito.
   ::before e o rastro: uma cauda que esmaece na direcao contraria ao
   movimento, como um cometa — o dot sozinho lia como um ponto estatico
   pulando de posicao, o rastro da a sensacao de deslocamento continuo */
.rt-wire .pkt{
  position:absolute;width:6px;height:6px;border-radius:50%;
  background:var(--blue);box-shadow:0 0 0 3px rgba(47,167,255,.18);
  top:0;opacity:0;
}
.rt-wire .pkt::before{
  content:"";position:absolute;left:50%;bottom:100%;width:2px;height:22px;
  transform:translateX(-50%);
  background:linear-gradient(to top,rgba(47,167,255,.55),transparent);
}
.w2 .pkt{background:#C63B3B;box-shadow:0 0 0 3px rgba(214,69,69,.16)}
.w2 .pkt::before{background:linear-gradient(to top,rgba(198,59,59,.55),transparent)}
.w3 .pkt{background:#0F9D63;box-shadow:0 0 0 3px rgba(15,157,99,.18)}
.w3 .pkt::before{background:linear-gradient(to top,rgba(15,157,99,.55),transparent)}
.rt-reroute{
  position:absolute;left:calc(50% + 12px);white-space:nowrap;
  font-family:var(--mono);font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;
  color:#C63B3B;opacity:0;
}
/* fica desligada ate a adquirente 2 gerar o pedido */
.rt-done{border-color:rgba(15,157,99,.3);background:rgba(15,157,99,.07);opacity:0;transform:translateY(6px) scale(.98)}
.rt-done .rt-ic{background:#0F9D63;color:#fff}
.rt-done b{color:#0A6B45}

/* --- o ciclo --- */
.plat-hero.in .rt-wire i,
.plat-hero.in .rt-wire .pkt,
.plat-hero.in .rt-reroute,
.plat-hero.in .rt-acq,
.plat-hero.in .rt-acq .rt-ic::after,
.plat-hero.in .rt-tag,
.plat-hero.in .rt-acq .rt-st em,
.plat-hero.in .w2,
.plat-hero.in .rt-done{
  animation-duration:var(--cy);animation-iteration-count:infinite;
  /* transicoes mais firmes: sai rapido do estado antigo e assenta no novo */
  animation-timing-function:cubic-bezier(.2,.9,.25,1);
}

.plat-hero.in .w1 i{animation-name:rtw1}
.plat-hero.in .w2 i{animation-name:rtw2}
.plat-hero.in .w3 i{animation-name:rtw3}
.plat-hero.in .w1 .pkt{animation-name:rtp1;animation-timing-function:cubic-bezier(.4,0,.6,1)}
.plat-hero.in .w2 .pkt{animation-name:rtp2;animation-timing-function:cubic-bezier(.4,0,.6,1)}
.plat-hero.in .w3 .pkt{animation-name:rtp3;animation-timing-function:cubic-bezier(.4,0,.6,1)}
.plat-hero.in .rt-a .rt-ic::after{animation-name:rtRingA}
.plat-hero.in .rt-b .rt-ic::after{animation-name:rtRingB}
.plat-hero.in .rt-reroute{animation-name:rtReroute}
.plat-hero.in .rt-a{animation-name:rtAcqA}
.plat-hero.in .rt-b{animation-name:rtAcqB}
.plat-hero.in .w2{animation-name:rtWireGlow}
.plat-hero.in .t-fail{animation-name:rtTagFail}
.plat-hero.in .t-ok{animation-name:rtTagOk}
.plat-hero.in .rt-a .s-try{animation-name:rtSA1}
.plat-hero.in .rt-a .s-fail{animation-name:rtSA2}
.plat-hero.in .rt-b .s-wait{animation-name:rtSB1}
.plat-hero.in .rt-b .s-try{animation-name:rtSB2}
.plat-hero.in .rt-b .s-ok{animation-name:rtSB3}
.plat-hero.in .rt-done{animation-name:rtDone}

@keyframes rtw1{0%,4%{transform:scaleY(0)}11%,100%{transform:scaleY(1)}}
@keyframes rtw2{0%,36%{transform:scaleY(0)}45%,100%{transform:scaleY(1)}}
@keyframes rtw3{0%,68%{transform:scaleY(0)}75%,100%{transform:scaleY(1)}}
@keyframes rtp1{0%,4%{top:0;opacity:0}6%{opacity:1}11%{top:100%;opacity:1}13%,100%{opacity:0}}
@keyframes rtp2{0%,36%{top:0;opacity:0}38%{opacity:1}45%{top:100%;opacity:1}47%,100%{opacity:0}}
@keyframes rtp3{0%,68%{top:0;opacity:0}70%{opacity:1}75%{top:100%;opacity:1}77%,100%{opacity:0}}
@keyframes rtReroute{0%,36%{opacity:0}43%,93%{opacity:1}100%{opacity:0}}
@keyframes rtRingA{0%,12%{opacity:0;transform:scale(1)}17%{opacity:.9;transform:scale(1)}25%{opacity:0;transform:scale(1.4)}26%,100%{opacity:0;transform:scale(1)}}
@keyframes rtRingB{0%,46%{opacity:0;transform:scale(1)}51%{opacity:.9;transform:scale(1)}59%{opacity:0;transform:scale(1.4)}60%,100%{opacity:0;transform:scale(1)}}

/* adquirente 1: azul enquanto tenta, vermelha ao recusar. o tranco original
   (±5px) lia como um "erro de senha" de app de consumo — reduzido a um
   deslocamento quase subliminar, mais compativel com um painel de
   monitoramento serio do que com uma animacao de erro chamativa */
@keyframes rtAcqA{
  0%,9%{border-left-color:transparent;background:transparent;transform:translateX(0)}
  14%,25%{border-left-color:var(--blue);background:rgba(47,167,255,.05);transform:translateX(0)}
  27%{transform:translateX(-1.5px)}
  29%{transform:translateX(1.5px)}
  31%{transform:translateX(0)}
  32%,93%{border-left-color:#C63B3B;background:rgba(214,69,69,.045);transform:translateX(0)}
  100%{border-left-color:transparent;background:transparent;transform:translateX(0)}
}
/* adquirente 2: neutro em stand-by, azul ao assumir, verde ao gerar */
@keyframes rtAcqB{
  0%,44%{border-left-color:transparent;background:transparent}
  51%,59%{border-left-color:var(--blue);background:rgba(47,167,255,.05)}
  66%,93%{border-left-color:#0F9D63;background:rgba(15,157,99,.05)}
  100%{border-left-color:transparent;background:transparent}
}
@keyframes rtTagFail{0%,26%{opacity:0;transform:scale(.5)}32%,93%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.5)}}
@keyframes rtTagOk{0%,60%{opacity:0;transform:scale(.5)}66%,93%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.5)}}

@keyframes rtSA1{0%,9%{opacity:0}14%,25%{opacity:1}30%,100%{opacity:0}}
@keyframes rtSA2{0%,26%{opacity:0}32%,93%{opacity:1;color:#C63B3B}100%{opacity:0}}
@keyframes rtSB1{0%,42%{opacity:1}48%,100%{opacity:0}}
@keyframes rtSB2{0%,44%{opacity:0}51%,59%{opacity:1}64%,100%{opacity:0}}
@keyframes rtSB3{0%,60%{opacity:0}66%,93%{opacity:1;color:#0F9D63}100%{opacity:0}}
@keyframes rtDone{0%,74%{opacity:0;transform:translateY(6px)}81%,93%{opacity:1;transform:none}100%{opacity:0;transform:translateY(6px)}}
/* fio do reroteamento com um realce bem discreto enquanto a rota antiga esta
   sendo abandonada — so o suficiente pra guiar o olho, sem competir com o
   resto (a versao anterior, com anel piscando + esse brilho mais forte,
   lia como notificacao de app, nao como painel de infraestrutura) */
@keyframes rtWireGlow{0%,36%{filter:none}42%,82%{filter:drop-shadow(0 0 3px rgba(198,59,59,.28))}93%,100%{filter:none}}

@media(max-width:560px){
  .rt{padding:12px}
  .rt-step{padding:10px 11px;gap:9px}
  .rt-ic{width:25px;height:25px}
  .rt-step b{font-size:.8rem}
  .rt-st em{font-size:.67rem}
  .rt-reroute{left:calc(50% + 9px);font-size:.54rem}
}

@media(prefers-reduced-motion:reduce){
  /* sem loop: mostra so o desfecho, que e a mensagem da secao */
  .rt-wire i{transform:scaleY(1)}
  .rt-a .s-fail,.rt-b .s-ok,.t-fail,.t-ok{opacity:1}
  .rt-tag{transform:none}
  .rt-a .s-try,.rt-b .s-wait,.rt-b .s-try{opacity:0}
  .rt-done{opacity:1;transform:none}
}

/* meios de pagamento */
.pay-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:58px}
.pay{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);padding:30px 28px;transition:box-shadow .4s,border-color .4s,transform .4s}
.pay:hover{border-color:var(--line-strong);transform:translateY(-4px)}
.pay .ic{width:46px;height:46px;border-radius:13px;background:var(--bg-elev-2);display:grid;place-items:center;margin-bottom:18px}
.pay .ic svg{width:23px;height:23px;stroke:var(--navy);fill:none}
.pay h3{margin-bottom:9px}
.pay p{font-size:.94rem;line-height:1.55;margin-bottom:16px}
.pay .tag{font-family:var(--mono);font-size:.74rem;color:var(--navy);background:var(--bg-elev);border-radius:8px;padding:6px 11px;display:inline-block}



/* FAQ */
.faq{max-width:780px;margin:50px auto 0}
.q{border-bottom:1px solid var(--line)}
.q-btn{width:100%;background:none;border:0;text-align:left;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:24px 2px;font-weight:700;font-size:1.06rem;color:var(--text);letter-spacing:-.015em}
.q-btn .pl{flex:none;width:28px;height:28px;border-radius:50%;border:1px solid var(--line-strong);display:grid;place-items:center;position:relative;transition:.3s var(--ease)}
.q-btn .pl::before,.q-btn .pl::after{content:"";position:absolute;background:var(--navy);border-radius:2px;transition:.3s var(--ease)}
.q-btn .pl::before{width:11px;height:2px}.q-btn .pl::after{width:2px;height:11px}
.q.open .pl{background:var(--bg-elev-2);border-color:var(--blue)}
.q.open .pl::after{transform:rotate(90deg);opacity:0}
.q-a{max-height:0;overflow:hidden;transition:max-height .4s var(--ease)}
.q-a p{padding:0 40px 24px 2px;font-size:.96rem;line-height:1.6}

/* CTA */
.cta{position:relative;overflow:hidden;background:linear-gradient(150deg,var(--navy),var(--navy) 55%,#0A52C4);border-radius:var(--r-xl);padding:84px 40px;text-align:center;color:#C9D6EE}
.cta::before{content:"";position:absolute;width:440px;height:440px;border-radius:50%;background:radial-gradient(circle,rgba(47,167,255,.42),transparent 62%);top:-190px;left:-110px}
.cta::after{content:"";position:absolute;width:380px;height:380px;border-radius:50%;background:radial-gradient(circle,rgba(124,192,255,.26),transparent 62%);bottom:-190px;right:-100px}
.cta-in{position:relative;z-index:1}
.cta h2{color:#fff;margin-bottom:14px}
.cta p{max-width:500px;margin:0 auto 32px;color:#BCCDEC;font-size:1.08rem}
.cta-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}

/* ======== */








/* ===== formulário de contato: removido (Task 9 recria no footer) ===== */

/* footer */
/* .band-black no proprio <footer> (HTML): mesma tecnica de token-override do
   #cripto, entao preto + azul eletrico ficam identicos aos "outros lugares" —
   antes era var(--text) (um navy escuro proprio, #0A1830) com cinza-azulado
   hardcoded, uma paleta parecida mas nao a mesma fonte. */
footer{padding:74px 0 36px}
.foot-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:40px;padding-bottom:48px;border-bottom:1px solid var(--line)}
.foot-grid img{height:28px;width:auto;margin-bottom:16px}
.foot-grid .about{font-size:.88rem;max-width:280px;line-height:1.6}
.foot-social{display:flex;gap:10px;margin-top:20px}
.foot-social a{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:var(--text-dim);background:rgba(255,255,255,.06);border:1px solid var(--line);transition:transform .25s var(--ease),background .25s,color .25s,border-color .25s}
.foot-social a:hover{transform:translateY(-3px);background:var(--blue-ink);border-color:var(--blue-ink);color:#fff;box-shadow:0 10px 22px -8px rgba(47,167,255,.5)}
.foot-social svg{width:19px;height:19px}
.foot-col h4{font-size:.74rem;font-weight:700;letter-spacing:.13em;text-transform:uppercase;color:var(--text);margin-bottom:16px}
.foot-col ul{display:grid;gap:10px;font-size:.91rem}
.foot-col a{transition:color .2s}.foot-col a:hover{color:var(--blue-ink)}
.foot-base{display:flex;flex-wrap:wrap;gap:14px;justify-content:space-between;padding-top:30px;font-size:.78rem;color:var(--text-dim)}


/* botão flutuante WhatsApp — agora um avatar do mascote (fav-chamada.png,
   ja vem redondo com fundo proprio) em vez do icone verde generico do
   WhatsApp, com uma bolha de ajuda que aparece sozinha depois de um tempo
   (nao de cara — senao vira intrusivo assim que a pagina carrega). */
.wa-widget{position:fixed;right:22px;bottom:34px;z-index:80;display:flex;flex-direction:column;align-items:flex-end;gap:12px}
.wa-fab{position:relative;width:70px;height:70px;border-radius:50%;background:#0B3FA0;display:grid;place-items:center;overflow:hidden;box-shadow:0 12px 30px -8px rgba(11,63,160,.55);transition:transform .25s var(--ease),box-shadow .25s;animation:wapop .5s var(--ease-out) 1.2s both}
.wa-fab:hover{transform:scale(1.08);box-shadow:0 16px 38px -8px rgba(11,63,160,.65)}
.wa-fab img{width:100%;height:100%;object-fit:cover}
.wa-fab::before{content:"";position:absolute;inset:0;border-radius:50%;border:2px solid #2FA7FF;animation:waring 2.4s ease-out infinite}
@keyframes waring{0%{transform:scale(1);opacity:.6}100%{transform:scale(1.6);opacity:0}}
@keyframes wapop{from{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}

/* bolha de ajuda: escondida por padrao (opacity+scale via JS adiciona .show
   depois do timeout), com uma leve mola no assentamento pra nao parecer so
   um fade piscando */
.wa-tip{
  position:relative;max-width:216px;
  background:#171A2E;color:#fff;
  border-radius:16px;padding:14px 32px 14px 16px;
  font-size:13.5px;line-height:1.4;
  box-shadow:0 24px 48px -18px rgba(0,0,0,.5);
  opacity:0;transform:translateY(10px) scale(.94);transform-origin:bottom right;
  pointer-events:none;
  transition:opacity .4s var(--ease-out),transform .4s var(--ease-out);
}
.wa-tip.show{opacity:1;transform:none;pointer-events:auto}
.wa-tip b{display:block;font-weight:700;margin-bottom:2px;letter-spacing:-.01em}
.wa-tip span{color:rgba(255,255,255,.72)}
.wa-tip-close{
  position:absolute;top:8px;right:8px;width:20px;height:20px;border-radius:50%;
  display:grid;place-items:center;background:rgba(255,255,255,.12);color:#fff;
  border:0;padding:0;transition:background .2s;
}
.wa-tip-close:hover{background:rgba(255,255,255,.22)}
.wa-tip-close svg{width:10px;height:10px}

@media(max-width:640px){.wa-widget{right:16px;bottom:26px}.wa-fab{width:64px;height:64px}}
@media(prefers-reduced-motion:reduce){
  .wa-fab{animation:none}.wa-fab::before{display:none}
  .wa-tip{transition:opacity .3s}
}



/* telas baixas: garante o hero dentro da viewport */
@media(min-width:981px) and (max-height:900px){
  .hero{padding:84px 0 36px}
  .stage-inner{transform:rotateY(-11deg) rotateX(4deg) scale(.94)}
  /* override intencional: em laptop 1440x900 o h1 cheio (5.2rem) empurra o CTA para fora
     da viewport. Reduz sem abrir mao da escala grande da nova tipografia. */
  .hero h1{font-size:clamp(2.6rem,5.2vw,4.2rem)}
  /* .hero .lead removido: seletor fantasma (elemento renomeado para .hero-sub) */
  .hero-cta{margin-bottom:24px}
}
@media(min-width:981px) and (max-height:760px){
  .hero{padding:78px 0 28px}
  .stage-inner{transform:rotateY(-11deg) rotateX(4deg) scale(.84)}
  .hero h1{margin-bottom:16px}
  /* .hero .lead removido: seletor fantasma (elemento renomeado para .hero-sub) */
}
@media(min-width:981px) and (max-height:670px){
  .stage-inner{transform:rotateY(-11deg) rotateX(4deg) scale(.74)}
}



/* ===== refino premium do dashboard ===== */
.dash{transition:box-shadow .4s var(--ease)}
.tile,.dcard{transition:border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease)}
.tile:hover,.dcard:hover{border-color:rgba(124,198,255,.32)}
.tile-bal{box-shadow:0 12px 30px -10px rgba(11,73,160,.6),inset 0 1px 0 rgba(255,255,255,.14)}
.dmain-head h4{background:linear-gradient(120deg,#fff,#cfe3ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.kpi b,.tile .val{font-variant-numeric:tabular-nums}
.daprv .p,.dtx-v{font-variant-numeric:tabular-nums}
/* leve realce no card do gráfico */
.dcard-chart{background:linear-gradient(180deg,rgba(47,167,255,.06),rgba(255,255,255,.02))}




/* floats do celular: compactos e dentro da tela */
@media(max-width:640px){
  .ph-float{max-width:158px;padding:8px 11px;gap:8px}
  .ph-float b{font-size:.7rem}
  .ph-float small{font-size:.62rem}
  .pf-a{top:84px;left:-6px}
  .pf-b{top:auto;bottom:230px;right:-6px}
  .pf-c{bottom:120px;left:-4px}
}

/* ===== otimização mobile ===== */
@media(max-width:640px){
  /* --sect: clamp global (88px-132px) já entrega escala correta em mobile; override legado removido */
  /* h1/h2: clamp global já responsivo; overrides legados removidos */
  /* .eyebrow margin-bottom: herda do global (20px); override legado removido */
  .sect-head h2{margin-bottom:14px}
  .pill{flex-wrap:wrap;gap:6px;font-size:.72rem;padding:7px 10px}
  .pill b{font-size:.66rem}
  .logos{padding:36px 0}
  .logos-label{margin-bottom:22px;font-size:11px}
  .card{padding:24px 22px}
  .pay-grid{gap:14px;margin-top:40px}
  .foot-grid{gap:30px;padding-bottom:36px}
  .cta{padding:54px 22px}
  .dtx{display:none}
}




/* reveal */

/* so opacity e transform: sao as duas unicas propriedades que o compositor resolve
   sem repintar. o filter:blur que existia aqui forcava um repaint da secao inteira
   a cada frame do scroll. o will-change fica apenas enquanto o elemento espera,
   para nao manter uma camada de GPU viva em toda a pagina depois de revelada.
   o scale(.96) e novo: so subir (translateY) lia como uma cortina abrindo, meio
   mecanico: um leve "assentamento" (cresce enquanto sobe) da a sensacao de a
   secao estar chegando mais perto, nao so aparecendo — ainda so opacity+transform,
   mesmo custo de composicao de antes. */
.reveal{
  opacity:0;transform:translateY(34px) scale(.96);
  transition:opacity 1.1s var(--ease-out),transform 1.1s var(--ease-out);
  transition-delay:var(--d,0s);
}
.reveal:not(.in){will-change:opacity,transform}
.reveal.in{opacity:1;transform:none}
/* variantes direcionais: os blocos de duas colunas (copy + visual) ganham
   entradas de lados opostos em vez do mesmo fade-pra-cima uniforme — lê como
   as duas metades convergindo, nao uma lista generica revelando de baixo */
.reveal-left{transform:translateX(-34px) translateY(18px) scale(.97)}
.reveal-right{transform:translateX(34px) translateY(18px) scale(.97)}
@media(max-width:899px){
  /* no mobile as colunas empilham: a entrada lateral ficaria estranha numa
     coluna so, volta pro fade-pra-cima padrao */
  .reveal-left,.reveal-right{transform:translateY(34px) scale(.96)}
}
/* plat-hero-copy/visual e cx-hero-copy/cx-hub NAO usam .reveal: os pais
   (.plat-hero, .cx-hero) ja tem .reveal e o .in deles dispara as animacoes
   de failover/hub (rt-wire, hub-flow etc) — dar .reveal tambem aos filhos
   duplicaria o observer por cima de um estado que ja existe. em vez disso
   os filhos reagem ao MESMO .in que o pai ja ganha, so que com transform
   direcional (copy da esquerda, visual da direita) em vez do fade-pra-cima
   generico. */
.plat-hero-copy,.cx-hero-copy{
  opacity:0;transform:translateX(-30px);
  transition:opacity 1s var(--ease-out),transform 1s var(--ease-out);
}
.plat-hero-visual,.cx-hub{
  opacity:0;transform:translateX(30px);
  transition:opacity 1s var(--ease-out) .12s,transform 1s var(--ease-out) .12s;
}
.plat-hero.in .plat-hero-copy,.plat-hero.in .plat-hero-visual,
.cx-hero.in .cx-hero-copy,.cx-hero.in .cx-hub{
  opacity:1;transform:none;
}
@media(prefers-reduced-motion:reduce){
  .plat-hero-copy,.cx-hero-copy,.plat-hero-visual,.cx-hub{opacity:1;transform:none}
}

/* responsivo */
@media(max-width:980px){
  /* hero: padding correto para coluna única; overflow:hidden preservado (definido no base).
     padding-top reduzido de 168px (copiado do desktop, onde sobra espaco pro
     mockup do dashboard) — no mobile isso deixava um vao vazio grande entre
     o cabecalho (72px) e a primeira pill de texto */
  .hero{min-height:auto;height:auto;padding-top:104px;padding-bottom:64px}
  .hero-visual{perspective:none;margin-right:0}
  .stage-inner{transform:none!important;animation:none!important;opacity:1!important}
  .tilt{transform:none!important}
  /* dash: escala para caber na coluna única sem transbordar (Achado 1) */
  .dash{min-width:0;width:100%;margin-left:0;transform:scale(1) scaleY(var(--dash-vscale,1));transform-origin:top center}
  .dash-body{grid-template-columns:1fr}
  .dside{display:none}
  .dkpis{grid-template-columns:1fr 1fr}
  .float{display:none}
  .pay-grid{grid-template-columns:1fr 1fr}
  .foot-grid{grid-template-columns:1fr 1fr}
}
/* fundo ilustrado no mobile — versao retrato dedicada que o usuario mandou
   (853x1844, ceu vazio em cima, iglu+pinguim+painel na metade de baixo), nao
   um recorte da versao paisagem do desktop.
   max-width:639px, NAO 899px: testado em tablet (768px) e a imagem retrato
   cobria uma largura tao maior que a altura do container que o cover cortava
   os numeros do painel dos dois lados ("2,548,430" virava so "48,430").
   639px alinha com o breakpoint de coluna unica que o resto do hero ja usa
   (@media max-width:640px). de 640-899px (tablet largo/paisagem) fica sem
   fundo ilustrado — melhor um hero mais simples ali do que uma composicao
   quebrada; nenhuma das duas imagens foi desenhada pra essa faixa. */
@media(max-width:639px){
  .hero{
    /* voltou pro cover (uma imagem so, preenchendo o container inteiro de
       forma previsivel) depois que a versao "100% auto + ancorada embaixo"
       criou duas camadas com limites DIFERENTES — a cortina esmaecia num
       ponto, a imagem de verdade comecava em outro (a altura dela e
       calculada pela propria proporcao, nao bate com as porcentagens da
       cortina), e a costura entre os dois virava um corte visivel duro.
       com cover a imagem sempre cobre 100% do container de forma previsivel
       — "descer a ilustracao" agora e so questao de esticar a zona opaca da
       cortina (0-62%) antes dela comecar a esmaecer: um jeito so de
       controlar a transicao, sem duas camadas pra alinhar. */
    /* min-height e as paradas do degrade em PX fixo, nao vh/%: o texto (badge+
       h1+p+botoes) tem altura intrinseca fixa, que nao muda com a altura da
       janela — usar vh/% aqui fazia a cortina desalinhar dos botoes toda vez
       que a janela de teste era mais alta ou mais baixa que a usada pra
       calibrar os valores. em px fixo o degrade sempre cola no mesmo lugar,
       janela alta ou baixa. */
    min-height:1015px;
    display:flex;
    align-items:flex-start;
    background-image:
      linear-gradient(to bottom,var(--bg) 0,var(--bg) 630px,rgba(255,255,255,.35) 650px,transparent 662px,transparent 980px,var(--bg) 1010px),
      url(/assets/fundo-mobilev2.png);
    background-repeat:no-repeat,no-repeat;
    background-position:center,center top;
    background-size:100% 100%,cover;
  }
  .hero .halo{display:none}
  /* notificacoes flutuantes voltam no mobile agora que ha uma ilustracao por
     tras pra elas pousarem em cima — antes ficavam escondidas porque so
     faziam sentido junto do mockup do dashboard (tambem escondido no
     mobile). posicionam relativas ao .hero (nao ao .hero-visual, que so
     ocupa uma fatia pequena da coluna) pra caberem no mesmo sistema de
     coordenadas da imagem de fundo — por isso hero-visual vira static aqui. */
  /* .wrap tambem e position:relative (pro z-index do halo, que aqui ja esta
     display:none — seguro neutralizar so neste breakpoint): sem isso as
     porcentagens do .float ficavam relativas a altura do .wrap (so o
     conteudo de texto, bem mais baixo que o .hero inteiro), nao do .hero */
  .hero .wrap{position:static}
  .hero-visual{position:static;min-height:0}
  .float{display:flex;position:absolute;max-width:76vw;padding:9px 12px}
  .float b{font-size:.7rem}
  .float small{font-size:.6rem}
  .float .ic{width:26px;height:26px}
  /* em % do topo do .hero (que agora e bem mais alto, min-height:145vh) —
     56%/76% caem logo apos os CTAs (~54% do total), onde a ilustracao
     comeca de verdade */
  /* recalculado pro hero voltar a min-height:100vh (nao mais 145vh) — 68%/85%
     caem depois da zona opaca da cortina (0-62%), onde a ilustracao ja
     esta visivel de verdade */
  .float.f1{top:80%;bottom:auto;left:16px;right:auto}
  .float.f2{top:92%;bottom:auto;right:16px;left:auto}
  .float.f3{display:none}
}
@media(max-width:640px){
  /* body font-size:17px herda do global; override 16px legado removido */
  .nav-links,.nav-actions .btn-ghost,.nav-actions .btn-primary{display:none}
  .burger{display:block}
  /* mesmo material de gelo da navbar scrolled (mesma curvatura fria de
     gradiente), mas 100% opaco de proposito: e um menu funcional sobre o
     hero, e mesmo com o gradiente a 97-99% de alfa o texto do hero
     (backdrop-filter com saturate amplifica o pouco que vaza) continuava
     legivel por baixo dos links reais — testado em screenshot. translucidez
     era um "nice to have" aqui, nao o sinal principal do conceito; a cor fria
     sozinha ja carrega o material, e legibilidade de menu nao se negocia. */
  .mobile{display:block;position:fixed;inset:76px 12px auto;z-index:89;background:linear-gradient(165deg,#FFFFFF,#EAF4FF);backdrop-filter:blur(20px) saturate(1.5);-webkit-backdrop-filter:blur(20px) saturate(1.5);border:1px solid rgba(178,214,255,.55);border-radius:var(--r-lg);padding:16px;opacity:0;transform:translateY(-14px) scale(.97);transform-origin:top right;pointer-events:none;box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 30px 60px -24px rgba(10,24,48,.35);transition:opacity .32s var(--ease),transform .4s var(--ease)}
  .mobile.open{opacity:1;transform:none;pointer-events:auto}
  .mobile .m-cta{display:block;text-align:center;font-weight:700;border-radius:12px;padding:14px;background:var(--navy);color:#fff;margin-top:8px}
  .mobile .m-login{display:block;text-align:center;font-weight:700;border-radius:12px;padding:13px;border:1px solid var(--line-strong);color:var(--text)}
  .mobile .m-sep{display:block;height:1px;background:var(--line);margin:10px 2px}
  .mobile .m-link{display:block;padding:12px 10px;font-weight:600;color:var(--text-mid);border-radius:9px;transition:background .2s,color .2s}
.mobile .m-link:hover{background:var(--bg-elev-2);color:var(--blue-ink)}
.mobile>*{opacity:0;transform:translateY(8px);transition:opacity .3s var(--ease),transform .3s var(--ease)}
.mobile.open>*{opacity:1;transform:none}
.mobile.open>*:nth-child(1){transition-delay:.05s}.mobile.open>*:nth-child(2){transition-delay:.09s}.mobile.open>*:nth-child(3){transition-delay:.13s}.mobile.open>*:nth-child(4){transition-delay:.17s}.mobile.open>*:nth-child(5){transition-delay:.21s}.mobile.open>*:nth-child(6){transition-delay:.25s}.mobile.open>*:nth-child(7){transition-delay:.29s}.mobile.open>*:nth-child(8){transition-delay:.33s}
  .pay-grid,.foot-grid{grid-template-columns:1fr}
  .hero-cta{flex-direction:row;flex-wrap:wrap;gap:10px}
  .hero-cta .btn{flex:1 1 auto;width:auto;padding:14px 18px;font-size:.98rem}
  .hero-cta .btn-lg{padding:14px 20px}
  .dash{display:none}
  /* .float NAO entra em display:none aqui (era o padrao antigo, pensado pra
     sumir junto do mockup do dashboard) — a regra nova esta no bloco
     @media(max-width:899px) logo acima, porque agora as notificacoes pousam
     na ilustracao de fundo em vez do dashboard. o mockup .phone tambem sai:
     com a ilustracao + as notificacoes ja ocupando a cena, um SEGUNDO mockup
     de celular ali virava poluicao visual, dois produtos ilustrados
     disputando o mesmo espaco. */
  .phone{display:none}
  .hero-visual{margin-top:8px}
  .cta{padding:62px 24px}
}
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
  html{scroll-behavior:auto}
  .reveal{opacity:1;transform:none}
  .stage-inner{opacity:1!important}
  .tilt{transform:none!important}
  .dbars i{transform:scaleY(var(--h,.5))}
  .daprv .fl{transform:scaleX(var(--w,1))}
  .float{opacity:1}
  .phone{animation:none}
}

/* ============ #plataforma (Task 5) ============ */
/* o halo tem 700px e comeca em left:-300px: em 375px ele chega a 400px e criava
   25px de scroll horizontal. overflow:hidden clipa (mesma solucao da .band-navy). */
#plataforma{overflow:hidden}
/* o halo e position:absolute z-index:0; sem contexto proprio o .wrap (estatico)
   pintaria ABAIXO dele. z-index:1 mantem a copy por cima do gradiente. */
#plataforma .wrap{position:relative;z-index:1}

.sect-head{max-width:720px;margin-bottom:72px}
.sect-head.center{margin-left:auto;margin-right:auto;text-align:center}
.sect-head.center .sect-sub{margin-left:auto;margin-right:auto}
/* o <br> do titulo so ajuda na versao alinhada a esquerda; centrado ele produz
   linhas de larguras muito diferentes, entao vira espaco simples */
.sect-head.center h2 br{display:none}
.sect-sub{margin-top:22px;font-size:19px;color:var(--text-mid);max-width:560px}

/* ===== plat-hero: painel escuro "infra" =====
   mesma tecnica de .band-navy/.band-black (redefine os tokens no escopo do
   bloco: .card, .plat-tags, .eyebrow, h3 se adaptam sozinhos via var()).
   so este card fica escuro — o resto da secao #plataforma continua clara.
   e o bloco com a maior ambicao visual da pagina: o motivo e de conteudo, nao
   so estetico — e o unico card com "(destaque)" no comentario, mas antes
   tinha exatamente o mesmo tratamento visual dos cards genericos da grid
   abaixo. um painel escuro tipo rack de infraestrutura acerta o alvo: o
   produto aqui e literalmente redundancia de rede de pagamento. */
/* card claro (nao navy): a versao escura ficava pesada demais pro resto da
   secao, que e toda clara — o "destaque" agora vem de shell branco + brilho
   azul suave na sombra + fio superior iluminado, nao de inverter o tema.
   --bg-elev/--bg-elev-2 sobem pra branco/quase-branco (a tecnica de token
   continua a mesma do .band-navy: .card, .rt-step etc se adaptam sozinhos),
   entao o card fica mais premium que o cinza-palido generico de antes sem
   virar uma faixa azul. */
/* glow vivido atras do card — o "algo colorido pra desfocar" que faltava pro
   backdrop-filter do .plat-hero ler como vidro de verdade, nao so cor fria
   estatica. dois blobs saturados (azul da marca + navy) por baixo do card. */
/* fica no fluxo normal (nao position:absolute) com margin-bottom negativo
   igual a propria altura: assim ele "puxa" o .plat-hero (que vem logo
   depois no HTML) por cima dele, sempre exatamente atras do card — nao
   importa a altura do .sect-head antes, que varia por viewport. posicionar
   via position:absolute;top:Npx exigiria adivinhar essa altura e quebraria
   em qualquer largura onde o titulo quebra linha diferente. */
.plat-glow{
  position:relative;z-index:0;pointer-events:none;
  height:460px;margin-bottom:-460px;
  overflow:visible;
}
.plat-glow::before{
  content:"";position:absolute;left:50%;top:0;width:min(900px,92vw);height:100%;
  transform:translateX(-50%);
  background:
    radial-gradient(circle at 25% 30%,rgba(47,167,255,.55),transparent 55%),
    radial-gradient(circle at 78% 65%,rgba(0,58,153,.4),transparent 60%);
  filter:blur(60px);
}
/* painel de vidro gelado de verdade: translucido + backdrop-filter, pra o
   glow atras aparecer desfocado ATRAVES do card — e isso que faz ler como
   gelo/vidro, nao a cor sozinha (testado: sem o glow atras, o card so parecia
   "branco com tom azul", porque nao havia nada colorido pra desfocar). */
.plat-hero{
  /* --bg-elev/--bg-elev-2 continuam SOLIDOS de proposito (nao translucidos):
     sao o que .rt-step/.rt-ic usam por baixo — o diagrama de failover tem
     texto pequeno mudando de estado o tempo todo, e ele fica em cima do
     vidro (que ja e translucido por si), nao TAMBEM translucido — duas
     camadas de blur empilhadas so deixariam os numeros dificeis de ler */
  --bg-elev:#FFFFFF;
  --bg-elev-2:#EAF5FF;
  --line:#D9EBFC;
  --line-strong:#B8DCFA;
  display:grid;gap:44px;padding:48px;padding-bottom:56px;margin-bottom:32px;
  position:relative;z-index:1;overflow:visible;
  background:rgba(255,255,255,.72);
  backdrop-filter:blur(22px) saturate(1.7);
  -webkit-backdrop-filter:blur(22px) saturate(1.7);
  border-width:1.5px;
  border-color:rgba(255,255,255,.8);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.95),
    inset 0 0 40px rgba(255,255,255,.4),
    0 40px 90px -46px rgba(15,60,140,.45);
}
/* aro superior iluminado: a face do bloco que pega luz — o brilho mais forte
   que o resto do site porque aqui o "gelo" e literal, nao so uma pista fria */
/* faixa de gelo DE VERDADE (foto, nao gradiente simulado): recorte do proprio
   arco do iglu na ilustracao do hero (assets/ice-texture-strip.png — blocos
   e juntas reais, luz e sombra reais). depois de 4 tentativas so com CSS
   (navy escuro, gradiente claro, grade de linhas, glassmorphism) que nao
   convenceram, a textura fotografica e o que realmente fecha a leitura de
   "gelo" — nao da pra fingir refração/porosidade do gelo com gradientes.
   mask-image esmaece o rodape da faixa pro corpo de vidro do card, em vez de
   cortar seco numa linha reta. */
.plat-hero::before{
  content:"";position:absolute;top:0;left:0;right:0;height:72px;
  border-radius:27px 27px 0 0;
  background-image:url(/assets/ice-texture-strip.png);
  background-size:cover;background-position:center 35%;
  -webkit-mask-image:linear-gradient(to bottom,#000 50%,transparent 96%);
  mask-image:linear-gradient(to bottom,#000 50%,transparent 96%);
}
/* pingentes de gelo na borda inferior — o mesmo detalhe da plataforma de
   gelo na ilustracao do hero, em miniatura. tira e nao clipa o conteudo do
   card (overflow:visible acima) por ficar FORA da caixa, pendurada. */
.plat-hero::after{
  content:"";position:absolute;left:16px;right:16px;bottom:-11px;height:16px;
  background:linear-gradient(180deg,#EAF5FF,#fff);
  clip-path:polygon(
    0% 0%,100% 0%,
    100% 25%,94.4% 100%,88.8% 35%,
    83.3% 100%,77.7% 25%,72.2% 100%,
    66.6% 35%,61.1% 100%,55.5% 25%,
    50% 100%,44.4% 35%,38.8% 100%,
    33.3% 25%,27.7% 100%,22.2% 35%,
    16.6% 100%,11.1% 25%,5.5% 100%,
    0% 35%
  );
  box-shadow:0 2px 3px -1px rgba(15,90,180,.15);
}
.plat-hero>*{position:relative;z-index:1}
.plat-hero h3{margin:0 0 18px}

/* badge "monitorado em tempo real": reusa o ponto pulsante do .dlive do
   dashboard (mesma keyframe livepulse), pra fechar a leitura de "isso e uma
   tela real do produto", nao uma ilustracao generica */
.rt-live{
  display:inline-flex;align-items:center;gap:7px;margin-bottom:14px;
  font-family:var(--mono);font-size:.66rem;font-weight:600;letter-spacing:.04em;
  color:#0F9D63;background:rgba(15,157,99,.1);border:1px solid rgba(15,157,99,.22);
  border-radius:99px;padding:6px 12px;
}
.rt-live i{width:6px;height:6px;border-radius:50%;background:#34E08A;box-shadow:0 0 0 0 rgba(52,224,138,.5);animation:livepulse 2.2s ease-out infinite}
/* faltava: .dlive e .ph-live ja chamavam esta animation ha tempos, mas sem a
   @keyframes o ponto "ao vivo" do dashboard nunca pulsou. define aqui e os
   tres badges (dashboard, mobile, e este novo) passam a pulsar juntos. */
@keyframes livepulse{
  0%{box-shadow:0 0 0 0 rgba(52,224,138,.5)}
  70%{box-shadow:0 0 0 8px rgba(52,224,138,0)}
  100%{box-shadow:0 0 0 0 rgba(52,224,138,0)}
}

/* fileira de adquirentes: os dois "on" sao os dois do diagrama, os demais
   apagados sinalizam que a rede homologada e maior sem inventar um numero
   preciso — eco visual do que o FAQ ja afirma em texto ("varias homologadas") */
.rt-pool{display:flex;align-items:center;gap:8px;margin-top:16px;padding:0 2px}
.rt-pool-dot{width:6px;height:6px;border-radius:50%;flex:none;background:rgba(124,198,255,.18);border:1px solid rgba(124,198,255,.32)}
.rt-pool-dot.on{background:var(--blue);border-color:var(--blue);box-shadow:0 0 0 3px rgba(47,167,255,.18)}
.rt-pool em{font-style:normal;font-family:var(--mono);font-size:.66rem;color:var(--text-dim);letter-spacing:.01em;margin-left:2px}
/* os tres diferenciais viram etiquetas: a animacao ao lado ja conta a historia,
   o texto so precisa nomear o que ela mostra */
.plat-tags{margin-top:26px;display:flex;flex-wrap:wrap;gap:9px}
.plat-tags li{
  font-size:13.5px;font-weight:600;color:var(--text-mid);
  border:1px solid var(--line);border-radius:var(--r-pill);
  padding:7px 14px;background:var(--bg-elev);
}

.plat-grid{display:grid;gap:20px;margin-bottom:24px}
.plat-grid .card h3{margin-bottom:14px}
/* hover mais especifico que o .card generico (so lift): um brilho azul sutil
   entra na sombra e a borda esquenta pro azul da marca, ecoando o mesmo
   vocabulario de glow ja usado no .cx-card e nos botoes */
/* fio no topo que "acende" da esquerda pra direita no hover — em vez de so
   trocar cor de borda/sombra, da um gesto de verdade, e reforca que o card
   e o mesmo tipo de peca "com destaque" do plat-hero acima (que tem um fio
   parecido), fechando os dois como parte do mesmo sistema visual */
.plat-grid .card{position:relative;overflow:hidden}
.plat-grid .card::before{
  content:"";position:absolute;top:0;left:0;right:0;height:2px;
  background:linear-gradient(90deg,var(--blue),var(--blue-ink));
  transform:scaleX(0);transform-origin:left;
  transition:transform .4s var(--ease-out);
}
.plat-grid .card:hover::before{transform:scaleX(1)}
.plat-grid .card:hover{border-color:rgba(47,167,255,.35);box-shadow:0 30px 60px -32px rgba(47,167,255,.45)}
.plat-grid .card:hover h3{color:var(--blue-ink)}

/* padding saiu do card e foi so pra coluna de texto (.plat-dev-copy): a
   ilustracao precisa esticar borda a borda (topo/base/direita) pra preencher
   a altura inteira do card, em vez de sobrar respiro em cima/embaixo dela
   (feedback do usuario com screenshot). altura um pouco menor que o que
   estava renderizando antes (min-height mais enxuto). */
.plat-dev{display:grid;gap:0;padding:0;overflow:hidden;min-height:320px}
.plat-dev-copy{padding:40px 32px 40px 48px;display:flex;flex-direction:column;justify-content:center}
/* mesmo respiro do h3 do bloco 1; sem isto o paragrafo cola no titulo */
.plat-dev h3{margin:0 0 18px}
/* abaixo de 1000px (coluna unica) a ilustracao desktop (img-codev2, pensada
   pra sentar do lado do texto) vira fundo do PROPRIO card — mesma tecnica
   do hero: imagem retrato dedicada (imagem-dev-mobilev2, mesmo pinguim/API,
   ceu vazio no topo) cobrindo o card inteiro, com uma cortina de gradiente
   protegendo o texto por cima, em vez de duas secoes empilhadas (texto,
   depois uma caixa de imagem separada). */
@media(max-width:999px){
  .plat-dev{
    min-height:760px;
    background-image:
      linear-gradient(to bottom,var(--bg) 0%,var(--bg) 46%,rgba(255,255,255,.55) 58%,transparent 70%),
      url(/assets/imagem-dev-mobilev2.png);
    background-repeat:no-repeat,no-repeat;
    background-position:center,center top;
    background-size:100% 100%,cover;
  }
  /* justify-content:center (herdado da regra base, pensada pro desktop com
     colunas lado a lado) centralizava o texto verticalmente numa celula de
     grid alta — no mobile, onde o card tem 760px, isso empurrava o texto
     pra baixo com espaco vazio sobrando em cima. flex-start sobe o texto
     pro topo do card. */
  .plat-dev-copy{padding:22px 32px 0 32px;justify-content:flex-start}
  .plat-dev-code{display:none}
}
/* trocou o snippet de codigo em <pre> pela ilustracao img-codev2 (mesma
   familia visual do hero/plat-hero — pinguim, gelo, o mesmo curl que estava
   aqui como texto antes, so que renderizado na cena). SEM moldura/borda
   propria no container: a ilustracao ja tem o painel de codigo com cantos
   arredondados desenhado dentro dela, e emoldurar de novo por fora virava
   uma "caixa dentro da caixa" (feedback do usuario). a imagem fica 100% do
   tamanho dela (sem encolher/esmaecer nos 4 lados via mask radial, testado
   e o usuario preferiu sem isso) — so a lateral esquerda, onde ela encontra
   a coluna de texto, ganha um degrade linear pra incorporar no fundo do
   card em vez de terminar numa borda reta. */
.plat-dev-code{height:100%}
/* abaixo de 1000px o grid empilha (1 coluna): a imagem fica embaixo do
   texto, entao raio nos 4 cantos (nao so a direita) e sem mask lateral
   (nao ha mais texto do lado esquerdo pra fundir) */
.plat-dev-code img{
  width:100%;height:100%;display:block;object-fit:cover;
  border-radius:var(--r-xl);
}
@media(min-width:1000px){
  /* arredonda so os cantos que encostam na borda do proprio card (direita) —
     a esquerda funde com o texto via mask, entao nao precisa de raio ali */
  .plat-dev-code img{
    border-radius:0 var(--r-xl) var(--r-xl) 0;
    -webkit-mask-image:linear-gradient(to right,transparent 0%,#000 16%);
    mask-image:linear-gradient(to right,transparent 0%,#000 16%);
  }
}

@media (min-width:760px){
  .plat-grid{grid-template-columns:repeat(2,1fr)}
}
@media (min-width:1000px){
  .plat-hero{grid-template-columns:1fr 1fr;align-items:center}
  /* stretch (nao center): a ilustracao precisa preencher a altura inteira
     da linha do grid, nao ficar centralizada com sobra em cima/embaixo */
  .plat-dev{grid-template-columns:1fr 1fr;align-items:stretch}
  .plat-grid{grid-template-columns:repeat(3,1fr)}
}
/* 375px: 48px de padding deixaria 231px uteis. Cai para o mesmo padding de card
   que o projeto ja usa em @media(max-width:640px). */
@media (max-width:640px){
  .plat-hero,.plat-dev{padding:24px 22px}
}

/* ============ Página legal (termos + privacidade) ============
   layout de leitura longa: sumário fixo + coluna de texto com largura
   controlada pra linha ficar em 65-75 caracteres. reaproveita os tokens
   de cor/fonte do resto do site, mas nao usa nenhum componente de marketing
   (card, halo, band) — texto denso pede fundo liso, sem ornamento. */
.legal-hero{padding:calc(var(--sect) + 40px) 0 44px;background:linear-gradient(180deg,var(--bg-elev) 0%,var(--bg) 100%);border-bottom:1px solid var(--line)}
.legal-hero h1{font-family:var(--font-display);font-weight:700;font-size:clamp(1.9rem,4vw,2.6rem);letter-spacing:-.02em;color:var(--text);line-height:1.15}
.legal-hero p{color:var(--text-mid);font-size:1.05rem;margin-top:14px;max-width:56ch}
.legal-updated{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:.78rem;color:var(--text-dim);background:var(--bg-elev-2);border:1px solid var(--line);border-radius:var(--r-pill);padding:7px 16px;margin-top:20px}
.legal-updated svg{width:14px;height:14px}

.legal-body{padding:56px 0 var(--sect)}
.legal-grid{display:grid;grid-template-columns:250px 1fr;gap:56px;align-items:start}
.legal-toc{position:sticky;top:96px;max-height:calc(100vh - 120px);overflow-y:auto}
.legal-toc h5{font-family:var(--mono);text-transform:uppercase;letter-spacing:.08em;font-size:.7rem;color:var(--text-dim);margin:0 0 12px}
.legal-toc .toc-doc{margin-bottom:20px}
.legal-toc .toc-doc-title{font-weight:700;color:var(--text);font-size:.9rem;margin-bottom:6px;display:block}
.legal-toc a{display:block;padding:5px 0 5px 13px;border-left:2px solid var(--line);color:var(--text-mid);font-size:.84rem;text-decoration:none;transition:color .18s,border-color .18s}
.legal-toc a:hover{color:var(--blue-ink);border-color:var(--blue)}

.legal-content{max-width:700px}
.legal-doc{scroll-margin-top:90px}
.legal-doc + .legal-doc{margin-top:88px;padding-top:52px;border-top:1px solid var(--line)}
.legal-doc-title{font-family:var(--font-display);font-weight:700;font-size:clamp(1.5rem,3vw,1.9rem);color:var(--text);margin-bottom:10px}
.legal-doc-intro{color:var(--text-mid);line-height:1.7;margin-bottom:36px;font-size:1rem}
.legal-content section{margin-bottom:36px;scroll-margin-top:90px}
.legal-content h3{font-family:var(--font-display);font-weight:700;font-size:1.15rem;color:var(--text);margin-bottom:12px}
.legal-content h3 .n{color:var(--blue-ink);font-family:var(--mono);font-weight:600;margin-right:8px}
.legal-content h4{font-size:.98rem;font-weight:700;color:var(--text);margin:18px 0 8px}
.legal-content p{color:var(--text-mid);line-height:1.75;margin-bottom:14px;font-size:.97rem}
.legal-content ul,.legal-content ol{color:var(--text-mid);line-height:1.75;margin:0 0 14px;padding-left:22px}
.legal-content li{margin-bottom:8px;font-size:.97rem}
.legal-content li::marker{color:var(--blue-ink)}
.legal-content strong{color:var(--text);font-weight:600}
.legal-content a{color:var(--blue-ink);text-decoration:underline;text-decoration-color:var(--line-strong);text-underline-offset:3px}
.legal-content a:hover{text-decoration-color:var(--blue-ink)}
.legal-note{background:var(--bg-elev);border:1px solid var(--line);border-left:3px solid var(--blue);border-radius:var(--r-md);padding:14px 18px;margin:16px 0;font-size:.9rem;color:var(--text-mid)}
.legal-note strong{color:var(--text)}

@media(max-width:900px){
  .legal-grid{grid-template-columns:1fr;gap:0}
  .legal-toc{position:static;max-height:none;border:1px solid var(--line);border-radius:var(--r-lg);padding:18px 20px;margin-bottom:44px;background:var(--bg-elev)}
  .legal-toc .toc-doc{margin-bottom:16px}
  .legal-toc .toc-doc:last-child{margin-bottom:0}
}
@media(max-width:640px){
  .legal-hero{padding:128px 0 32px}
}
