/* =========================================================
   PuffHub, folha de estilo
   Paleta: preto + roxo escuro metálico + aço
   ========================================================= */

:root{
  /* Sem isto o navegador trata a página como clara: no Windows a barra de
     rolagem saía branca ao lado do fundo preto, e a lista do "Ordenar
     por" abria cinza. */
  color-scheme:dark;
  scrollbar-color:rgba(183,157,255,.24) transparent;
  --bg:        #08070b;
  --bg-2:      #0f0d15;
  --panel:     rgba(183,157,255,.045);
  --line:      rgba(183,157,255,.11);
  --line-2:    rgba(183,157,255,.24);
  --ink:       #ecebf3;
  --ink-2:     #c6c1d6;    /* texto corrido: 10:1 no fundo */
  --ink-3:     #a8a2bb;    /* legenda e rótulo: 7:1 no fundo; era #878199 */
  --roxo:      #7d5cc6;    /* o roxo do dia a dia */
  --roxo-2:    #c3aaff;    /* o brilho, ponto alto do metal */
  --roxo-3:    #2a1d45;    /* a sombra do metal */
  --aco:       #8b90a6;    /* aco, para o detalhe que nao e roxo */

  /* Metal nao e uma cor, e uma rampa: sombra, cor, brilho, cor, sombra.
     E o brilho fora do centro que faz a superficie parecer curva. Cor
     chapada no lugar disso vira plastico roxo. */
  --metal:     linear-gradient(135deg,#241a3d 0%,#4d3789 26%,#8f74d8 50%,#4d3789 74%,#1e152f 100%);
  --metal-2:   linear-gradient(120deg,var(--roxo-3) 0%,var(--roxo) 38%,var(--roxo-2) 52%,var(--roxo) 66%,var(--roxo-3) 100%);
  --radius:    18px;
  --maxw:      1180px;
  --ease:      cubic-bezier(.22,.61,.36,1);
  --ease-out:  cubic-bezier(.16,1,.3,1);      /* entradas: comeca rapido e assenta */
  --ease-io:   cubic-bezier(.65,.05,.28,1);   /* idas e voltas */
  --t1:        .2s;                           /* cor, borda, detalhe */
  --t2:        .3s;                           /* hover, chips, nav */
  --t3:        .62s;                          /* paineis e cards */
  --t4:        .72s;                          /* revelacao no scroll */
  --sans:      "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --display:   "Space Grotesk", "Inter", system-ui, sans-serif;
}

*,*::before,*::after{ box-sizing:border-box; }

html{ scroll-behavior:smooth; }

/* A barra de cima é fixa e tem 79px. Sem esta folga, todo link de âncora
   para o conteúdo exatamente embaixo dela: a pessoa clica em "Produtos" e
   o título de Produtos fica escondido atrás da barra. */
[id]{ scroll-margin-top:6rem; }

body{
  margin:0;
  background:var(--bg);
  color:var(--ink);
  font-family:var(--sans);
  font-weight:300;
  line-height:1.6;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
/* `--sbw` é a largura da barra de rolagem, medida pelo catalog.js antes
   de travar: o espaço dela é devolvido, senão a página inteira anda uns
   15px para o lado ao abrir e fechar ficha ou comparação. */
body.is-locked{ overflow:hidden; padding-right:var(--sbw,0px); }
body.is-locked .nav{ right:var(--sbw,0px); }
/* A bandeja é centrada pela janela (left:50%): devolve meia barra. */
body.is-locked .bandeja{ margin-left:calc(var(--sbw,0px) / -2); }

img{ max-width:100%; display:block; }

/* `hidden` sempre esconde.

   O navegador da `display:none` para [hidden], mas qualquer regra
   nossa que declare `display` ganha dele. Isso ja tinha acontecido
   tres vezes neste arquivo (a bandeja, o campo de autonomia, a janela
   da comparacao), cada uma consertada com uma regra propria. Aqui fica
   a regra que vale para tudo, inclusive para o que ainda vai ser
   escrito. */
[hidden]{ display:none !important; }
a{ color:inherit; text-decoration:none; }
h1,h2,h3,h4{
  font-family:var(--display); font-weight:500; line-height:1.06;
  letter-spacing:-.022em; margin:0; text-wrap:balance;
}
p{ margin:0; }
ul{ margin:0; padding:0; list-style:none; }

::selection{ background:var(--roxo); color:#fff; }

/* Um estilo de foco só para toda a página, para quem navega no teclado. */
:where(a,button,[tabindex]):focus-visible{
  outline:2px solid var(--roxo);
  outline-offset:3px;
  border-radius:6px;
}

/* ---------- fundo global ---------- */
body::before{
  content:"";
  position:fixed; inset:0; z-index:-3;
  background:
    radial-gradient(60rem 40rem at 80% 0%, rgba(125,92,198,.10), transparent 62%),
    #09090c;
}

/* =========================================================
   PALCO 3D
   ========================================================= */
.stage{ position:fixed; inset:0; z-index:-1; pointer-events:none; }

/* Com a ficha aberta, a cena sobe para a frente do conteúdo.

   A pilha da página é: cena em -1, conteúdo em 0, gaveta da ficha em 90.
   A peça voltava a ser desenhada quando a ficha abria, mas continuava
   em -1: ela aparecia ATRÁS dos cards da página, cortada e sem sentido
   nenhum. Em 89 ela fica acima do conteúdo e abaixo da gaveta, que é
   onde o véu da ficha a alcança e a escurece junto com o resto.

   O grão sai de cena aqui: ele é uma textura de fundo em mix-blend-mode
   e, subindo junto, tingiria a página inteira. */
body.peca-na-frente .stage{ z-index:89; }

/* O escuro da ficha de pod mora na CENA, nao no veu da gaveta.

   O veu (.ficha__scrim) e filho da gaveta, que esta em 90: ele fica
   por cima da peca, qualquer que seja o z-index dela. Com 34 a 56% de
   preto na altura em que a peca aparece, todo pod saia fosco -- o rosa
   do 5000 virava um rosa acinzentado ao lado da foto dele na mesma
   ficha, e nenhum ajuste de luz resolvia, porque a luz nao era o
   problema. Aqui o fundo escuro vai para tras da peca, na propria
   camada da cena, e o veu fica transparente: continua recebendo o
   clique que fecha a ficha, so nao pinta mais nada. De quebra o fundo
   ficou mais escuro do que era, que e o que faz a cor da peca saltar. */
.stage{ transition:background-color var(--t3) var(--ease-io); }
body.peca-na-frente .stage{ background-color:rgba(4,3,6,.88); }
body.peca-na-frente .ficha__scrim{ background:transparent; }
body.peca-na-frente .stage__grain{ display:none; }
.stage canvas{ width:100%; height:100%; display:block; }
.stage__grain{
  position:absolute; inset:0; opacity:.28; mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/></filter><rect width='160' height='160' filter='url(%23n)' opacity='.5'/></svg>");
}

/* =========================================================
   BARRA DE PROGRESSO
   ========================================================= */
.scrollbar{ position:fixed; top:0; left:0; right:0; height:2px; z-index:60; background:rgba(255,255,255,.05); }
/* A barra anda por `transform`, nao por `width`: largura e layout, e
   ela se mexe a cada quadro da rolagem. Com a origem a esquerda, um
   `scaleX` de 0 a 1 desenha exatamente a mesma barra, so que a placa de
   video resolve sozinha. */
.scrollbar span{
  display:block; height:100%; width:100%;
  transform:scaleX(0); transform-origin:left center;
  will-change:transform;
  background:var(--metal-2);
}

/* =========================================================
   BOTÕES
   ========================================================= */
.btn{
  display:inline-flex; align-items:center; justify-content:center; gap:.5rem;
  padding:.95rem 1.6rem; border:0; cursor:pointer;
  border-radius:100px; font-family:var(--sans); font-size:.94rem; font-weight:500;
  letter-spacing:.01em; transition:transform var(--t2) var(--ease-out), background var(--t1) linear,
              color var(--t1) linear, box-shadow var(--t2) var(--ease-out);
  will-change:transform;
}
.btn--sm{ padding:.62rem 1.15rem; font-size:.85rem; }
.btn--solid{
  background:var(--metal);
  color:#f2ecff;
  box-shadow:0 10px 30px -12px rgba(125,92,198,.75);
}
.btn--solid:hover{ transform:translateY(-2px); box-shadow:0 18px 40px -14px rgba(125,92,198,.9); }
.btn--line{ background:transparent; color:var(--ink); box-shadow:inset 0 0 0 1px var(--line-2); }
.btn--line:hover{ background:var(--panel); transform:translateY(-2px); }
.btn--ghost{ background:transparent; color:var(--ink-2); }
.btn--ghost:hover{ color:var(--ink); }
/* "Comparar" com um produto só fica desligado, e tem que parecer: sem
   isto ele era idêntico ao ligado, subia no hover e o clique não fazia
   nada. */
.btn:disabled,.btn:disabled:hover{
  opacity:.4; cursor:not-allowed; transform:none;
  background:transparent; box-shadow:inset 0 0 0 1px var(--line);
}

/* =========================================================
   NAVEGAÇÃO
   ========================================================= */
.nav{
  position:fixed; top:0; left:0; right:0; z-index:50;
  display:flex; align-items:center; gap:2rem;
  padding:1.15rem clamp(1.1rem,4vw,3rem);
  /* filter e opacity entram AQUI, junto das outras. Estavam numa regra
     mais abaixo (`main,.foot,.nav`), que por vir depois trocava a lista
     inteira: a barra encolhia e ganhava fundo de estalo. */
  transition:background var(--t2) var(--ease-io), backdrop-filter var(--t2),
              padding var(--t2) var(--ease-io), border-color var(--t2),
              filter var(--t3) var(--ease-io), opacity var(--t3) var(--ease-io);
  border-bottom:1px solid transparent;
}
.nav.is-stuck{
  background:rgba(9,9,12,.86);
  backdrop-filter:blur(14px) saturate(140%);
  border-bottom-color:var(--line);
  padding-top:.75rem; padding-bottom:.75rem;
}
.nav__logo{
  display:inline-flex; align-items:center; gap:.6rem;
  font-family:var(--display); font-weight:700; letter-spacing:.14em; font-size:.95rem;
}
.nav__logo em{ font-style:normal; font-weight:400; letter-spacing:.24em; font-size:.7rem; color:var(--ink-3); text-transform:uppercase; margin-left:.15rem; }
.nav__glyph{
  width:22px; height:22px; border-radius:50%;
  background:radial-gradient(circle at 30% 26%, #d9c9ff 0%, var(--roxo) 42%, #1d1433 100%);
  box-shadow:0 0 22px -4px var(--roxo);
}
.nav__links{ display:flex; gap:1.9rem; margin-left:auto; font-size:.9rem; color:var(--ink-2); }
.nav__links a{ position:relative; padding:.2rem 0; transition:color var(--t1) linear; }
.nav__links a::after{
  content:""; position:absolute; left:0; bottom:-2px; height:1px; width:0;
  background:var(--roxo); transition:width var(--t2) var(--ease-out);
}
.nav__links a:hover{ color:var(--ink); }
.nav__links a:hover::after{ width:100%; }
.nav__links a.is-atual{ color:var(--ink); }
.nav__links a.is-atual::after{ width:100%; }

/* O WhatsApp dentro do menu existe so no celular: no desktop ele ja
   esta na barra, como botao. */
.nav__zap{ display:none; }
.nav__zap::after{ display:none; }
.nav__burger{
  display:none; background:none; border:0; cursor:pointer;
  width:44px; height:44px; padding:0; place-items:center;
}
.nav__burger span{ display:block; width:22px; height:1.5px; background:var(--ink); margin:4px 0; transition:transform var(--t2) var(--ease-io), opacity var(--t1); }
/* 11px, medido no navegador e nao estimado. O botao e uma grade de
   44px de altura com duas linhas, e linha de grade estica: cada barra
   fica centrada na sua metade de 22px, entao os centros das duas estao
   a 22px um do outro e cada uma anda 11px para se encontrarem no meio.

   Com os 2,75px que estavam aqui elas paravam a 16,5px de distancia: no
   celular, o botao de fechar o menu nao era um X, eram dois riscos
   inclinados um longe do outro. */
.nav.is-open .nav__burger span:nth-child(1){ transform:translateY(11px) rotate(45deg); }
.nav.is-open .nav__burger span:nth-child(2){ transform:translateY(-11px) rotate(-45deg); }

/* ---------- idioma ----------
   Uma pílula pequena com o globo e a sigla. O <select> de verdade fica
   por cima, transparente: o toque abre a lista nativa do aparelho (a
   melhor que existe no celular) e a pílula continua do tamanho da
   sigla, não do nome mais comprido da lista. */
.idioma{
  position:relative; flex:none;
  display:inline-flex; align-items:center; gap:.4rem;
  height:36px; padding:0 .8rem; border-radius:999px;
  border:1px solid var(--line-2); color:var(--ink-2);
  font-family:var(--sans); font-size:.76rem; font-weight:500; letter-spacing:.12em;
  transition:color var(--t1) linear, border-color var(--t1) linear;
}
.idioma:hover,.idioma:focus-within{ color:var(--ink); border-color:var(--roxo); }
.idioma:focus-within{ outline:2px solid var(--roxo); outline-offset:3px; }
.idioma svg{ width:15px; height:15px; fill:none; stroke:currentColor; stroke-width:1.6; }
.idioma__sel{
  position:absolute; inset:0; width:100%; height:100%;
  opacity:0; cursor:pointer; font-size:16px;   /* 16px: o iOS nao da zoom */
  -webkit-appearance:none; appearance:none; border:0;
}
.idioma__sel option{ background:#14111a; color:var(--ink); }
.agegate__card{ position:relative; }
.agegate__card .idioma{ position:absolute; top:1rem; right:1rem; }

/* Enquanto o dicionário chega, a página não aparece em português para
   trocar de idioma na frente da pessoa. i18n.js tira a classe. */
.traduzindo body{ visibility:hidden; }

/* =========================================================
   TIPOGRAFIA UTIL
   ========================================================= */
.eyebrow{
  font-size:.74rem; letter-spacing:.28em; text-transform:uppercase;
  color:var(--roxo-2); font-weight:500; margin-bottom:1.4rem;
}
.lede{
  color:var(--ink-2); font-size:clamp(1rem,1.4vw,1.14rem);
  line-height:1.65; max-width:52ch; text-wrap:pretty;
}
/* O trecho colorido do titulo.

   O degrade comecava quase branco porque a frase antiga era "sem
   chute." e as duas palavras dividiam a rampa: "sem" saia clara e
   "chute" saia roxa. Com "3 perguntas." sozinho no lugar, comecar no
   branco deixava metade da frase sem cor -- justo a metade que a frase
   existe para destacar. Agora ele comeca ja no roxo claro. */
.grad{
  background:linear-gradient(103deg,var(--roxo-2) 4%,var(--roxo) 92%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}

/* =========================================================
   HERO
   ========================================================= */
.hero{
  min-height:100svh; display:flex; align-items:center;
  padding:6rem clamp(1.1rem,4vw,3rem) 4rem;
  position:relative;
}
.hero__inner{ width:100%; max-width:var(--maxw); margin:0 auto; }
.hero h1{
  /* Três linhas pedem um corpo um pouco menor que o de duas, senão o
     hero estoura a altura da tela em notebook. As quebras são manuais,
     por isso o balanceamento automático fica desligado aqui. */
  font-size:clamp(2.4rem, min(6.8vw, 10.2vh), 5.6rem);
  line-height:1.02;
  margin:0 0 1.1rem;
  max-width:13ch;
  text-wrap:wrap;
}
.hero__cta{ display:flex; flex-wrap:wrap; gap:.85rem; margin-top:1.7rem; }

/* A linha abaixo dos botões. Existe para tirar do caminho a dúvida que
   trava o clique: quanto trabalho isso vai dar. */
.hero__nota{
  margin-top:1rem; font-size:.86rem; color:var(--ink-3); max-width:34ch;
}
.hero__facts{
  display:flex; flex-wrap:wrap; gap:clamp(1.5rem,5vw,3.5rem);
  margin-top:2.25rem; padding-top:1.4rem; border-top:1px solid var(--line);
  max-width:40rem;
}
.hero__facts strong{ display:block; font-family:var(--display); font-size:1.6rem; font-weight:500; color:var(--ink); }
.hero__facts span{ font-size:.82rem; color:var(--ink-3); letter-spacing:.04em; }

/* =========================================================
   SEÇÕES
   ========================================================= */
.section{
  max-width:var(--maxw); margin:0 auto;
  padding:clamp(5rem,9vw,8rem) clamp(1.1rem,4vw,3rem);
}
.section__head{ max-width:44rem; margin-bottom:4rem; }
.section__head--center{ margin-inline:auto; text-align:center; }
.section h2{ font-size:clamp(2.1rem,5vw,3.7rem); margin-bottom:1.3rem; }
.section__head--center .lede{ margin-inline:auto; }

/* ---------- catálogo: filtros ---------- */
.filters{
  display:flex; flex-wrap:wrap; gap:.5rem;
  margin-bottom:2rem; padding-bottom:1.6rem;
  border-bottom:1px solid var(--line);
}
.chip{
  display:inline-flex; align-items:center; gap:.5rem;
  padding:.55rem 1rem; cursor:pointer;
  font-family:var(--sans); font-size:.86rem; color:var(--ink-2);
  background:rgba(24,22,31,.7); border:1px solid var(--line);
  border-radius:100px;
  transition:color var(--t1) linear, border-color var(--t1) linear,
             background var(--t1) linear, transform var(--t2) var(--ease-out);
}
.chip em{ font-style:normal; font-size:.72rem; color:var(--ink-3); }
.chip:hover{ color:var(--ink); border-color:var(--line-2); transform:translateY(-1px); }
.chip.is-on{ background:var(--roxo); border-color:var(--roxo); color:#fff; }
.chip.is-on em{ color:#fff; }

/* ---------- catálogo: grade ---------- */
.grid{
  display:grid; gap:1rem;
  grid-template-columns:repeat(auto-fill,minmax(268px,1fr));
}
.prod{
  position:relative; overflow:hidden; cursor:pointer; text-align:left;
  display:flex; flex-direction:column; gap:.45rem;
  padding:1.5rem 1.4rem 1.3rem; font:inherit; color:inherit;
  border-radius:var(--radius);
  background:linear-gradient(180deg, #17151e, #121118);
  border:1px solid var(--line);
  /* Sem `backdrop-filter` aqui de proposito.

     Sao 43 cards na prateleira, e cada desfoque de fundo e recalculado
     enquanto a pagina rola. O que havia atras deles para desfocar era o
     degrade liso do fundo: o efeito custava caro e nao dava para ver.
     O desfoque fica no que flutua sobre conteudo de verdade -- a barra
     de cima, a bandeja da selecao, o botao de fechar a ficha. O fundo
     do card ganhou um tico de opacidade no lugar. */
  transition:transform var(--t2) var(--ease-out), border-color var(--t2), background var(--t2);
}
.prod::after{
  content:""; position:absolute; inset:0; opacity:0; pointer-events:none;
  transition:opacity var(--t3) var(--ease-out);
  background:radial-gradient(18rem 14rem at var(--mx,70%) var(--my,0%), rgba(125,92,198,.16), transparent 70%);
}
.prod:hover,.prod:focus-visible{ transform:translateY(-3px); border-color:var(--line-2); outline:none; }
.prod:hover::after,.prod:focus-visible::after{ opacity:1; }
.prod:focus-visible{ box-shadow:0 0 0 2px var(--roxo); }

.prod__art{
  position:relative; overflow:hidden;
  display:grid; place-items:center; height:132px; margin-bottom:.6rem;
  border-radius:12px; border:1px solid var(--line);
  /* Uma luz parada atrás da peça, na paleta: aparelho preto sumia no
     quadro preto chapado. */
  background:radial-gradient(62% 78% at 50% 52%, rgba(195,170,255,.17), rgba(125,92,198,.07) 58%, transparent 100%), rgba(0,0,0,.3);
}
/* Com a foto no lugar, o desenho de reserva sai: ele vazava em volta dos
   aparelhos finos. */
.prod__art.tem-foto svg{ visibility:hidden; }

/* A foto cobre o desenho quando existe. Fica por cima, não no lugar:
   assim, se a imagem falhar e se remover, o desenho já está ali. */
/* `contain`, nao `cover`.

   Foto de produto e recortada em silhueta, com fundo transparente: o
   aparelho aparece inteiro sobre o fundo escuro do card. `cover` corta
   para preencher, e como quase todo vaporizador e alto e estreito, o
   que ele cortava era o bocal e a base -- justo o que identifica a
   peca. `contain` encaixa a peca dentro do quadro e deixa o fundo do
   card aparecer em volta. */
.prod__foto{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:contain; border-radius:inherit;
  transition:transform var(--t2) var(--ease-out);
}
.prod:hover .prod__foto{ transform:scale(1.04); }
.prod__art svg{
  width:52px; height:52px; fill:none;
  stroke:var(--roxo); stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round;
  transition:transform var(--t2) var(--ease-out), stroke var(--t2);
}
.prod:hover .prod__art svg{ transform:translateY(-2px) scale(1.05); stroke:var(--roxo-2); }

/* Pilula, nao texto solto: e o que faz a categoria ler como etiqueta e
   nao como mais uma linha de texto do card. */
.prod__cat{
  display:inline-flex; align-items:center; align-self:flex-start;
  padding:.3rem .62rem; border-radius:999px;
  border:1px solid var(--line); background:rgba(0,0,0,.35);
  font-size:.62rem; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-2);
}
.prod__name{ font-family:var(--display); font-size:1.14rem; line-height:1.2; }
.prod__blurb{ color:var(--ink-2); font-size:.9rem; line-height:1.5; }
.prod__foot{
  display:flex; align-items:baseline; justify-content:space-between; gap:1rem;
  margin-top:.7rem; padding-top:.8rem; border-top:1px solid var(--line);
}
.prod__foot b{ font-family:var(--display); font-weight:500; color:var(--roxo-2); }

.grid__hint{ margin-top:1.6rem; font-size:.84rem; color:var(--ink-3); }

/* ---------- ficha: gaveta ---------- */
.sprite{ position:absolute; width:0; height:0; overflow:hidden; }

.ficha{ position:fixed; inset:0; z-index:90; display:flex; justify-content:flex-end; }
.ficha[hidden]{ display:none; }
/* Sem backdrop-filter aqui de proposito: ele borraria a peca 3D, que e
   justamente o que a gente quer que continue nitida. Quem recua e o
   conteudo da pagina, logo abaixo. */
.ficha__scrim{
  position:absolute; inset:0;
  background:linear-gradient(90deg, rgba(5,4,4,.34) 0%, rgba(5,4,4,.56) 45%, rgba(5,4,4,.86) 100%);
}
main,.foot{ transition:filter var(--t3) var(--ease-io), opacity var(--t3) var(--ease-io); }
body.is-locked main,body.is-locked .foot,body.is-locked .nav{ filter:blur(3px); opacity:.45; }
.ficha__panel{
  position:relative; width:min(620px,100%); height:100%; overflow-y:auto;
  background:linear-gradient(180deg,#16141c,#0e0d12);
  border-left:1px solid var(--line-2);
  box-shadow:-30px 0 80px -30px #000;
}
.ficha__panel:focus{ outline:none; }
/* `--barra` é a altura medida da barra de pedido (catalog.js). A folga de
   rolagem impede que o Tab leve o foco para baixo da barra, e a altura
   mínima do corpo segura a barra no pé da gaveta quando a ficha é curta.

   A folga fica nos alvos do CORPO, não no painel: como scroll-padding do
   painel, os botões da própria barra (presa, dentro da faixa de folga)
   faziam o navegador rolar a ficha centenas de pixels ao receber foco. */
.ficha__body :is(a,button,input,select,textarea,[tabindex]){
  scroll-margin-bottom:calc(var(--barra, 6rem) + .75rem);
}
.ficha__body{ min-height:calc(100% - var(--barra, 6rem)); }
.ficha__x{
  position:sticky; top:0; float:right; z-index:2;
  width:44px; height:44px; margin:.8rem .8rem 0 0;
  display:grid; place-items:center; cursor:pointer;
  font-size:1.5rem; line-height:1; color:var(--ink-2);
  background:rgba(24,22,31,.85); border:1px solid var(--line); border-radius:50%;
  backdrop-filter:blur(10px); transition:color var(--t1), border-color var(--t1), transform var(--t2) var(--ease-io);
}
.ficha__x:hover{ color:var(--ink); border-color:var(--line-2); transform:rotate(90deg); }
.ficha__body{ padding:2.4rem clamp(1.3rem,4vw,2.6rem) 3rem; }
/* Capa da ficha: proporção fixa para o corte não depender do que a
   pessoa subiu, e a gaveta não pular de altura entre um produto e outro. */
.ficha__foto{
  margin:0 0 1.5rem; border-radius:14px; overflow:hidden;
  border:1px solid var(--line);
  background:radial-gradient(55% 70% at 50% 52%, rgba(195,170,255,.15), rgba(125,92,198,.06) 58%, transparent 100%), rgba(0,0,0,.3);
}
.ficha__foto img{ display:block; width:100%; aspect-ratio:16 / 10; object-fit:contain; }

.ficha__cat{ font-size:.7rem; letter-spacing:.24em; text-transform:uppercase; color:var(--roxo-2); }
.ficha__head h3{ font-size:clamp(1.6rem,3.6vw,2.2rem); margin:.7rem 0 .9rem; }
.ficha__resumo{ color:var(--ink-2); font-size:1rem; }

/* ---------- diagrama ---------- */
.ficha__diag{
  margin:2rem 0;
  border:1px solid var(--line); border-radius:var(--radius);
  background:radial-gradient(circle at 50% 30%, rgba(125,92,198,.07), rgba(0,0,0,.32) 70%);
  overflow:hidden;
}
.diagram{ padding:1.6rem 1.4rem; }
.diagram__box{
  position:relative;
  height:360px; width:calc(360px * var(--r,1));
  max-width:100%; margin-inline:auto;
}
.diagram__svg{
  display:block; width:100%; height:100%;
  fill:none; stroke:var(--ink-3); stroke-width:2.4;
  stroke-linecap:round; stroke-linejoin:round;
}
.diagram__svg g{ transition:stroke var(--t3) var(--ease-out), opacity var(--t3) var(--ease-out); opacity:.45; }
.diagram__svg g.is-on{ stroke:var(--roxo-2); opacity:1; }
.diagram__svg .d-fill path{ fill:rgba(125,92,198,.10); }
.diagram__svg g.is-on.d-fill path{ fill:rgba(125,92,198,.24); }
.diagram__svg .d-hot{ fill:rgba(125,92,198,.35); }
.diagram__svg g.is-on .d-hot{ fill:var(--roxo); }
.diagram__svg .d-thin{ stroke-dasharray:3 4; }

.spot{
  position:absolute; transform:translate(-50%,-50%);
  width:26px; height:26px; cursor:pointer;
  display:grid; place-items:center;
  font-family:var(--display); font-size:.74rem; color:var(--ink-2);
  background:rgba(12,10,9,.9); border:1px solid var(--line-2); border-radius:50%;
  transition:color var(--t1), background var(--t1), border-color var(--t1),
             box-shadow var(--t2) var(--ease-out);
}
.spot:hover{ color:var(--ink); border-color:var(--roxo); }
.spot.is-on{
  color:#fff; background:var(--roxo); border-color:var(--roxo);
  box-shadow:0 0 0 6px rgba(125,92,198,.18);
}

/* ---------- tour guiado ---------- */
.tour{ padding:1.3rem 1.4rem 1.5rem; border-top:1px solid var(--line); background:rgba(0,0,0,.25); }
.tour__head{ display:flex; align-items:baseline; gap:.8rem; margin-bottom:.5rem; }
.tour__n{ font-size:.72rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3); }
.tour__n b{ color:var(--roxo-2); font-weight:500; }
.tour__head h4{ font-size:1.1rem; }
.tour p{ color:var(--ink-2); font-size:.94rem; min-height:4.2em; }
.tour__ctrl{ display:flex; align-items:center; gap:.5rem; margin-top:.9rem; }
.tour__btn{
  width:36px; height:36px; cursor:pointer; display:grid; place-items:center;
  font-size:1.2rem; line-height:1; color:var(--ink-2);
  background:transparent; border:1px solid var(--line); border-radius:50%;
  transition:color var(--t1), border-color var(--t1);
}
.tour__btn:hover{ color:var(--ink); border-color:var(--line-2); }
.tour__play{
  padding:.5rem 1.1rem; cursor:pointer;
  font-family:var(--sans); font-size:.82rem; color:var(--ink-2);
  background:transparent; border:1px solid var(--line-2); border-radius:100px;
  transition:color var(--t1), background var(--t1), border-color var(--t1);
}
.tour__play:hover{ color:var(--ink); }
.tour__play.is-on{ background:var(--roxo); border-color:var(--roxo); color:#fff; }

/* ---------- ficha: texto e specs ---------- */
.ficha__cols{ display:grid; gap:1.6rem; margin-bottom:2rem; }
.ficha__cols h5{
  font-family:var(--display); font-size:.74rem; font-weight:500;
  letter-spacing:.2em; text-transform:uppercase; color:var(--roxo-2);
  margin-bottom:.7rem;
}
.ficha__cols p,.ficha__cols li{ color:var(--ink-2); font-size:.94rem; }
.ficha__cols ul{ display:grid; gap:.55rem; }
.ficha__cols li{ position:relative; padding-left:1.1rem; list-style:none; }
.ficha__cols li::before{
  content:""; position:absolute; left:0; top:.62em;
  width:5px; height:5px; border-radius:50%; background:var(--roxo);
}
/* flex, não grid: a última linha estica para fechar a caixa. Em grade
   sobrava uma célula vazia mostrando o fundo (que faz de linha). */
.ficha__specs{
  display:flex; flex-wrap:wrap; gap:1px;
  margin:0 0 2rem; background:var(--line); border:1px solid var(--line);
  border-radius:14px; overflow:hidden;
}
.ficha__specs div{ flex:1 1 140px; background:#100e0c; padding:.9rem 1rem; }
.ficha__specs dt{ font-size:.7rem; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-3); }
.ficha__specs dd{ margin:.2rem 0 0; font-family:var(--display); font-size:1rem; }
.ficha__preco{ display:flex; align-items:baseline; gap:.6rem; }
.ficha__preco s{ color:var(--ink-3); }
.ficha__preco b{ font-family:var(--display); font-size:1.8rem; color:var(--roxo-2); }


/* ---------- depoimentos ---------- */
.quotes{ display:grid; gap:1.1rem; grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); margin-top:1.1rem; }
.quote{ margin:0; padding:1.8rem 1.6rem; border-radius:var(--radius); border:1px solid var(--line); background:rgba(0,0,0,.55); backdrop-filter:blur(14px); }
.quote blockquote{ margin:0 0 1rem; font-family:var(--display); font-size:1.02rem; line-height:1.5; }
.quote figcaption{ font-size:.8rem; color:var(--ink-3); letter-spacing:.05em; }

/* =========================================================
   RODAPÉ
   ========================================================= */
.foot{ border-top:1px solid var(--line); background:rgba(0,0,0,.35); }
.foot__top{
  max-width:var(--maxw); margin:0 auto; padding:4rem clamp(1.1rem,4vw,3rem) 3rem;
  display:grid; gap:2.5rem; grid-template-columns:2fr 1fr 1fr;
}
.foot__note{ color:var(--ink-3); font-size:.88rem; margin-top:1rem; max-width:32ch; }
.foot h4{ font-size:.75rem; letter-spacing:.2em; text-transform:uppercase; color:var(--ink-3); margin-bottom:1.1rem; }
.foot nav a{ display:block; color:var(--ink-2); font-size:.92rem; padding:.3rem 0; transition:color var(--t1) linear; }
.foot nav a:hover{ color:var(--roxo-2); }
.foot__bar{
  border-top:1px solid var(--line);
  max-width:var(--maxw); margin:0 auto; padding:1.4rem clamp(1.1rem,4vw,3rem);
  display:flex; flex-wrap:wrap; gap:1rem; justify-content:space-between;
  color:var(--ink-3); font-size:.76rem;
}

/* =========================================================
   PORTA DE IDADE
   ========================================================= */
.agegate{
  position:fixed; inset:0; z-index:100;
  display:grid; place-items:center; padding:1.5rem;
  background:rgba(6,5,5,.86); backdrop-filter:blur(16px);
}
.agegate[hidden]{ display:none; }

/* A porta é levantada pelo CSS, não pelo JavaScript. Se o script falhar ou
   estiver desligado, o site continua fechado em vez de abrir sozinho. */
:root[data-age="ok"] .agegate{ display:none; }
:root:not([data-age="ok"]) body{ overflow:hidden; }
:root:not([data-age="ok"]) main,
:root:not([data-age="ok"]) .foot,
:root:not([data-age="ok"]) .nav{ filter:blur(3px); opacity:.45; }

/* Na saída ela some com calma, mesmo já tendo liberado a página. */
.agegate.is-out{
  display:grid !important; opacity:0; pointer-events:none;
  transition:opacity var(--t2) var(--ease-io);
}
.agegate__card{
  max-width:430px; text-align:center;
  padding:2.6rem 2rem; border-radius:22px;
  background:linear-gradient(180deg,#16130f,#0d0b0a);
  border:1px solid var(--line-2);
  box-shadow:0 40px 90px -30px #000;
  animation:pop .5s var(--ease) both;
}
@keyframes pop{ from{ opacity:0; transform:translateY(18px) scale(.97); } }
.agegate__mark{
  display:inline-block; font-family:var(--display); font-size:2.4rem; font-weight:700;
  color:var(--roxo-2); letter-spacing:-.03em; margin-bottom:1rem;
}
.agegate__mark span{ color:var(--ink-3); }
.agegate h2{ font-size:1.45rem; margin-bottom:.9rem; }
.agegate p{ color:var(--ink-2); font-size:.94rem; }
.agegate__actions{ display:grid; gap:.6rem; margin:1.8rem 0 1.2rem; }
.agegate small{ color:var(--ink-3); font-size:.74rem; }

/* =========================================================
   REVELAÇÃO NO SCROLL
   ========================================================= */
/* Revelacao no scroll. Dois cuidados que mudam muito a sensacao:

   O deslocamento e curto de proposito. Elemento que sobe muito chama
   atencao para a animacao; subindo pouco, o olho so registra que a
   coisa assentou.

   E o atraso em cascata tem teto. Com 15 cards na prateleira e 60 ms
   por item, o ultimo esperava quase um segundo depois do primeiro, e
   isso le como lentidao, nao como elegancia. Travado no decimo item, a
   cascata inteira fecha em pouco mais de 300 ms. */
.reveal{
  opacity:0; transform:translateY(9px);
  transition:opacity var(--t4) var(--ease-out), transform var(--t4) var(--ease-out);
  transition-delay:calc(min(var(--i,0), 9) * 36ms);
}
.reveal.is-in{ opacity:1; transform:none; }

/* =========================================================
   RESPONSIVO
   ========================================================= */
@media (max-width:900px){
  .foot__top{ grid-template-columns:1fr; }
  .nav__wa{ display:none; }
  .nav__burger{ display:grid; margin-left:auto; }
  /* O idioma fica visível ao lado do menu, que é onde se procura. */
  .nav .idioma{ margin-left:auto; }
  .nav .idioma ~ .nav__burger{ margin-left:-1rem; }
  .nav__links{
    position:fixed; inset:64px 0 auto 0; margin:0;
    flex-direction:column; gap:0; padding:1rem clamp(1.1rem,4vw,3rem) 2rem;
    background:rgba(9,9,12,.97); backdrop-filter:blur(16px);
    border-bottom:1px solid var(--line);
    transform:translateY(-120%); transition:transform var(--t3) var(--ease-io);
  }
  .nav__links a{ padding:1rem 0; border-bottom:1px solid var(--line); font-size:1.05rem; }
  .nav.is-open .nav__links{ transform:none; }

  /* Ultimo item do menu, e o unico com cor: e a acao, nao mais um
     destino. Sem borda embaixo porque fecha a lista. */
  .nav__links .nav__zap{
    display:flex; align-items:center; justify-content:center; gap:.5rem;
    margin-top:1rem; padding:1rem 1.4rem; border-bottom:0;
    border-radius:100px; background:var(--metal); color:#f2ecff;
    font-size:1rem; font-weight:500;
    box-shadow:0 10px 30px -12px rgba(125,92,198,.75);
  }
  .hero__facts{ gap:1.6rem; }
  .hero__facts li{ min-width:8rem; }
}
@media (max-width:640px){
  .ficha__panel{ width:100%; border-left:0; }
  .tour p{ min-height:5.6em; }
  .diagram__box{ height:260px; width:calc(260px * var(--r,1)); }
}


@media (prefers-reduced-motion:reduce){
  html{ scroll-behavior:auto; }
  *,*::before,*::after{ animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; }
  .reveal{ opacity:1; transform:none; }
  .mascara .w > *{ transform:none; }
  .hero__inner{ transform:none; opacity:1; }
  .stage__aurora{ animation:none; }
}


/* =========================================================
   PREÇO POR MIL PUFFS, SELOS E COMPARADOR
   ========================================================= */

/* A conta que decide a compra. Fica logo acima do preço, em fonte
   menor: quem só quer o preço lê o preço, quem está comparando acha
   o número sem abrir nada. */
.prod__unit{
  display:block; margin-top:.55rem;
  font-size:.78rem; color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.prod__unit b{ color:var(--ink-2); font-weight:500; }

/* Selos no canto do card. */
/* Empilhados: a largura é a do maior selo, não a soma deles. Lado a
   lado, "novo" mais "últimas unidades" já não cabiam ao lado da caixa
   "comparar" num card comum. */
.prod__selos{
  position:absolute; top:.9rem; right:.9rem;
  display:flex; flex-direction:column; align-items:flex-end; gap:.35rem;
}
/* Card estreito com selo: a caixa "comparar" fica só com o quadradinho.
   Com o texto, ela cobria o começo do selo. As contas, no celular: 14px
   de margem + 127px da caixa + 8px de folga + 136px de "últimas
   unidades" + 14px = 300px de card. A consulta mede o conteúdo, sem os
   22px de padding de cada lado: 300 - 45 - 2 = 254px. Acontece com 2
   colunas entre 600 e 640px, celular de 320px e janela estreita no
   computador. O nome continua para o leitor de tela, no aria-label. */
.prod{ container-type:inline-size; }
@container (max-width:256px){
  /* Irmão, não :has(): os selos entram no card antes da caixa "comparar"
     (catalog.js), e o Firefox 110 a 120 entende @container sem :has(). */
  .prod__selos ~ .prod__cmp span{ display:none; }
}
.prod__selo{
  font-size:.62rem; letter-spacing:.14em; text-transform:uppercase;
  padding:.3rem .5rem; border-radius:999px; border:1px solid var(--line-2);
  background:rgba(0,0,0,.45); color:var(--ink-2);
}
.prod__selo--novo{ color:#fff; background:var(--roxo); border-color:var(--roxo); }
.prod__selo--pouco{ color:#ffd9a0; border-color:rgba(255,190,110,.45); }


/* =========================================================
   FERRAMENTAS DO CATÁLOGO
   ========================================================= */
.tools{
  display:flex; flex-wrap:wrap; align-items:flex-end; gap:1.4rem;
  margin:1.4rem 0 2.2rem; padding-top:1.4rem;
  border-top:1px solid var(--line);
}
.tools__campo{ display:flex; flex-direction:column; gap:.5rem; min-width:11rem; }
/* `display:flex` aqui vence o `display:none` que o navegador da a
   [hidden], entao esconder o campo pelo atributo nao funcionava:
   ele continuava na tela. Esta linha devolve o comportamento. */
.tools__campo[hidden]{ display:none; }
.tools__campo > span{
  font-size:.72rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3);
}
.tools__campo > span b{ color:var(--roxo-2); font-weight:500; letter-spacing:0; text-transform:none; font-size:.85rem; }
.tools select{
  appearance:none; font:inherit; font-size:.92rem; color:var(--ink);
  background:rgba(0,0,0,.45); border:1px solid var(--line-2);
  border-radius:999px; padding:.6rem 2.2rem .6rem 1rem; cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,var(--ink-2) 50%),linear-gradient(135deg,var(--ink-2) 50%,transparent 50%);
  background-position:calc(100% - 1.1rem) 55%,calc(100% - .8rem) 55%;
  background-size:5px 5px,5px 5px; background-repeat:no-repeat;
  transition:border-color var(--t2);
}
.tools select:hover{ border-color:var(--roxo); }
.tools select option,.tools select optgroup{ background:#14111a; color:var(--ink); }
/* O <input type=range> tinha `height:2px`, que era a espessura do trilho.
   Só que isso é a altura do elemento inteiro: a área de toque tinha dois
   pixels, e no celular o controle era praticamente impossível de pegar.
   O trilho passa a ser desenhado no pseudo-elemento e o input fica com
   altura de dedo. */
.tools input[type=range]{
  appearance:none; -webkit-appearance:none;
  width:100%; height:22px; background:transparent; cursor:pointer;
}
.tools input[type=range]::-webkit-slider-runnable-track{
  height:2px; border-radius:2px; background:var(--line-2);
}
.tools input[type=range]::-moz-range-track{
  height:2px; border-radius:2px; background:var(--line-2);
}
.tools input[type=range]::-webkit-slider-thumb{
  appearance:none; -webkit-appearance:none;
  width:18px; height:18px; border-radius:50%;
  background:var(--roxo-2); border:none; cursor:pointer;
  margin-top:-8px;   /* centra o botao num trilho de 2px */
}
.tools input[type=range]::-moz-range-thumb{
  width:18px; height:18px; border-radius:50%; background:var(--roxo-2);
  border:none; cursor:pointer;
}
.tools input[type=range]:focus-visible::-webkit-slider-thumb{
  outline:2px solid var(--roxo-2); outline-offset:2px;
}
.tools__campo--busca{ min-width:13rem; flex:1 1 13rem; }
.tools input[type=search]{
  width:100%; padding:.6rem .8rem; border-radius:10px; font:inherit; font-size:.9rem;
  color:var(--ink); background:rgba(0,0,0,.35); border:1px solid var(--line);
  transition:border-color .2s ease;
}
.tools input[type=search]::placeholder{ color:var(--ink-3); }
.tools input[type=search]:hover{ border-color:var(--roxo); }
.tools input[type=search]:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:2px; }
/* o X nativo do campo de busca some no escuro; melhor nao ter */
.tools input[type=search]::-webkit-search-cancel-button{ -webkit-appearance:none; }
.tools__limpar{
  font:inherit; font-size:.85rem; color:var(--ink-3); background:none;
  border:none; cursor:pointer; padding:.6rem 0; text-decoration:underline;
  text-underline-offset:3px; transition:color var(--t1) linear;
}
.tools__limpar:hover{ color:var(--ink); }
.grid__vazio{ color:var(--ink-2); padding:2rem 0; }

/* ---------- abrir e comparar dentro do card ---------- */
/* O botao de abrir cobre o card inteiro por pseudo-elemento: o card
   segue clicavel em qualquer ponto, mas agora e um <article>, entao
   cabe controle proprio dentro dele. */
.prod__abrir{
  font:inherit; font-size:.75rem; letter-spacing:.16em; text-transform:uppercase;
  color:var(--ink-3); background:none; border:none; padding:0; cursor:pointer;
  transition:color var(--t1) linear;
}
.prod__abrir::after{ content:""; position:absolute; inset:0; border-radius:inherit; }
.prod:hover .prod__abrir{ color:var(--ink-2); }
.prod__abrir:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:3px; }

.prod__cmp{
  position:absolute; left:.9rem; top:.9rem; z-index:2;
  display:flex; align-items:center; gap:.45rem; cursor:pointer;
  font-size:.7rem; letter-spacing:.1em; text-transform:uppercase;
  color:var(--ink-3); padding:.35rem .6rem .35rem .45rem;
  border-radius:999px; border:1px solid transparent;
  background:rgba(0,0,0,.5); opacity:0;
  transition:opacity var(--t2), color var(--t2), border-color var(--t2);
}
.prod:hover .prod__cmp,
.prod__cmp:focus-within,
.prod__cmp.is-on{ opacity:1; }
.prod__cmp.is-on{ color:var(--roxo-2); border-color:var(--roxo); }
.prod__cmp input{ accent-color:var(--roxo); width:14px; height:14px; cursor:pointer; }

/* ---------- primeira compra, na ficha ---------- */
.ficha__primeira{ margin:.35rem 0 0; font-size:.8rem; color:var(--ink-2); }
.ficha__primeira b{ color:var(--roxo-2); font-family:var(--display); font-weight:500; }

/* ---------- bandeja da selecao ---------- */
.bandeja{
  position:fixed; left:50%; bottom:1.4rem; transform:translateX(-50%);
  z-index:60; display:flex; align-items:center; gap:1.4rem;
  padding:.7rem .8rem .7rem 1.3rem; border-radius:999px;
  border:1px solid var(--line-2); background:rgba(14,12,20,.92);
  backdrop-filter:blur(18px) saturate(120%);
  box-shadow:0 18px 50px -18px rgba(0,0,0,.9);
}
/* `display:flex` na regra acima ganha do `display:none` que o navegador
   dá para [hidden], então a barra aparecia vazia assim que a página
   abria. Sempre que uma regra nossa declara display, o hidden precisa
   ser declarado junto. */
.bandeja[hidden]{ display:none; }
/* A bandeja é fixa e cobria o aviso de saúde no fim da página também no
   computador. `--bandeja` é a altura medida (catalog.js). */
body.tem-bandeja{ padding-bottom:calc(var(--bandeja, 4.5rem) + 2.8rem); }
.bandeja__n{ font-size:.88rem; color:var(--ink-2); white-space:nowrap; }
.bandeja__n b{ color:var(--ink); font-family:var(--display); }
.bandeja__acoes{ display:flex; align-items:center; gap:.5rem; }
.bandeja .btn{ padding:.6rem 1.1rem; font-size:.85rem; white-space:nowrap; }
.bandeja__x{
  font:inherit; font-size:1.3rem; line-height:1; color:var(--ink-3);
  background:none; border:none; cursor:pointer; padding:0 .4rem;
  transition:color var(--t1) linear;
}
.bandeja__x:hover{ color:var(--ink); }

/* ---------- janela da comparacao ---------- */
.tabela{ position:fixed; inset:0; z-index:70; display:grid; place-items:center; padding:1.2rem; }
.tabela[hidden]{ display:none; }
.tabela__fundo{ position:absolute; inset:0; background:rgba(4,3,8,.8); }
.tabela__caixa{
  position:relative; width:min(860px,100%); max-height:86vh; overflow:auto;
  padding:2.4rem clamp(1.2rem,3vw,2.4rem);
  border-radius:var(--radius); border:1px solid var(--line-2);
  background:rgba(16,14,22,.98);
}
.tabela h3{ font-family:var(--display); font-size:1.5rem; margin:0 0 1.6rem; }
.cmp{ width:100%; border-collapse:collapse; font-size:.92rem; }
.cmp th,.cmp td{ padding:.85rem .7rem; border-bottom:1px solid var(--line); text-align:left; vertical-align:top; }
.cmp thead th{
  font-size:.7rem; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-3); font-weight:400;
}
.cmp tbody th{
  font-weight:400; color:var(--ink-3); font-size:.82rem; white-space:nowrap;
}
.cmp td{ font-variant-numeric:tabular-nums; }
.cmp .melhor{ color:var(--roxo-2); }
.cmp .melhor::after{ content:" melhor"; font-size:.62rem; letter-spacing:.12em; text-transform:uppercase; opacity:.75; }
.cmp__nome{ font-family:var(--display); color:var(--ink); font-size:1rem; }

@media (max-width:640px){
  .bandeja{ left:1rem; right:1rem; transform:none; flex-direction:column; align-items:stretch; gap:.7rem; border-radius:var(--radius); }
  .bandeja__acoes{ justify-content:space-between; }
  /* O X sobe para o canto, ao lado da contagem. Na fileira dos botões
     ele somava 52px a "Comparar" e "Pedir no WhatsApp": em 360px o X
     passava da borda da bandeja, e em 320px saía da tela. Os dois botões
     dividem a fileira e, só se ainda faltar espaço, quebram o texto. */
  .bandeja__x{ position:absolute; top:.2rem; right:.2rem; }
  body.is-locked .bandeja{ margin-left:0; right:calc(1rem + var(--sbw,0px)); }
  .bandeja__acoes .btn{ flex:1 1 auto; white-space:normal; text-align:center; }
  .tools{ gap:1rem; }
  .tools__campo{ min-width:100%; }
}


/* =========================================================
   FERRAMENTAS: QUIZ E CALCULADORA
   ========================================================= */
/* min(320px,100%): numa tela de 320px a caixa não cabe em 320px depois
   das margens, e a página inteira rolava de lado 20px. */
.duo{ display:grid; gap:1.4rem; grid-template-columns:repeat(auto-fit,minmax(min(320px,100%),1fr)); }
.ferr{
  padding:2rem 1.8rem; border-radius:var(--radius);
  border:1px solid var(--line); background:rgba(20,17,26,.82);
}
.ferr h3{ font-family:var(--display); font-size:1.35rem; margin:0 0 .5rem; }
.ferr__sub{ color:var(--ink-2); font-size:.92rem; margin:0 0 1.6rem; }
.ferr__campo{ display:block; margin-bottom:1.4rem; }
.ferr__campo span{ display:block; font-size:.88rem; color:var(--ink-2); margin-bottom:.7rem; }
.ferr__campo b{ color:var(--roxo-2); font-family:var(--display); }
.ferr__campo input[type=range]{
  appearance:none; -webkit-appearance:none;
  width:100%; height:22px; background:transparent; cursor:pointer;
}
.ferr__campo input[type=range]::-webkit-slider-runnable-track{
  height:2px; border-radius:2px; background:var(--line-2);
}
.ferr__campo input[type=range]::-moz-range-track{
  height:2px; border-radius:2px; background:var(--line-2);
}
.ferr__campo input[type=range]::-webkit-slider-thumb{
  appearance:none; -webkit-appearance:none;
  width:18px; height:18px; border-radius:50%;
  background:var(--roxo-2); border:none; cursor:pointer;
  margin-top:-8px;   /* centra o botao num trilho de 2px */
}
.ferr__campo input[type=range]::-moz-range-thumb{
  width:18px; height:18px; border-radius:50%; background:var(--roxo-2);
  border:none; cursor:pointer;
}
.ferr__campo input[type=range]:focus-visible::-webkit-slider-thumb{
  outline:2px solid var(--roxo-2); outline-offset:2px;
}

/* ---------- quiz ---------- */
.q__passo{ font-size:.7rem; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-3); margin-bottom:.8rem; }
.q__t{ font-family:var(--display); font-size:1.1rem; margin:0 0 1.1rem; line-height:1.35; }
.q__ops{ display:flex; flex-direction:column; gap:.55rem; }
.q__op{
  font:inherit; text-align:left; cursor:pointer;
  padding:.85rem 1.1rem; border-radius:12px;
  border:1px solid var(--line-2); background:rgba(0,0,0,.3); color:var(--ink);
  transition:border-color var(--t2), background var(--t2), transform var(--t2) var(--ease-out);
}
.q__op:hover{ border-color:var(--roxo); transform:translateX(3px); }
.q__voltar{
  margin-top:1.2rem; font:inherit; font-size:.85rem; color:var(--ink-3);
  background:none; border:none; cursor:pointer; text-decoration:underline; text-underline-offset:3px;
}
.q__voltar:hover{ color:var(--ink); }
.q__res{ display:flex; flex-direction:column; gap:.8rem; }

/* O resultado do quiz é um botão que abre a ficha. Terminar numa
   recomendação que a pessoa precisa ir procurar na lista à mão joga fora
   o trabalho das três perguntas. */
.q__card{
  font:inherit; text-align:left; cursor:pointer; width:100%;
  display:flex; justify-content:space-between; align-items:flex-start; gap:1rem;
  padding:1rem 1.2rem; border-radius:12px; color:var(--ink);
  border:1px solid var(--line-2); background:rgba(0,0,0,.3);
  transition:border-color var(--t2), background var(--t2),
             transform var(--t2) var(--ease-out);
}
.q__card:hover{ border-color:var(--roxo); background:rgba(0,0,0,.5); transform:translateY(-2px); }
.q__card:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:3px; }
.q__card__txt{ display:block; }
.q__rot{
  display:block; font-style:normal; font-size:.64rem; letter-spacing:.16em;
  text-transform:uppercase; color:var(--roxo-2); margin-bottom:.35rem;
}
.q__card b{ font-family:var(--display); font-weight:500; display:block; margin-bottom:.3rem; }
.q__card small{ color:var(--ink-3); font-size:.83rem; line-height:1.5; display:block; }
.q__card__fim{ display:flex; flex-direction:column; align-items:flex-end; gap:.4rem; }
.q__card i{ font-style:normal; color:var(--roxo-2); font-family:var(--display); white-space:nowrap; }
.q__card u{
  text-decoration:none; font-size:.66rem; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-3); white-space:nowrap; transition:color var(--t1) linear;
}
.q__card:hover u{ color:var(--ink-2); }

/* ---------- calculadora ---------- */
/* Lista ordenada, não tabela: a posição no ranking é parte do que a
   calculadora responde, e cada linha precisa ser clicável de ponta a
   ponta. Dentro de <tr> isso não sai sem posicionamento torto. */
.calc{ list-style:none; margin:0; padding:0; }
.calc li + li{ border-top:1px solid var(--line); }
.calc__linha{
  font:inherit; cursor:pointer; width:100%; text-align:left;
  display:grid; grid-template-columns:1.4rem 1fr auto; align-items:center;
  gap:.9rem; padding:.75rem .3rem; min-height:44px;
  background:none; border:none; color:var(--ink-2);
  transition:color var(--t1) linear, background var(--t2);
  border-radius:8px;
}
.calc__linha:hover{ color:var(--ink); background:rgba(255,255,255,.03); }
.calc__linha:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:2px; }
.calc__pos{
  font-family:var(--display); font-size:.8rem; color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.calc__nome{ display:block; font-size:.9rem; }
/* Na mesma linha, não embaixo. Como segunda linha cada item ficava com
   68px e a lista de cinco crescia 140px sem dizer nada a mais -- o
   "em seis meses" já está no título do painel. */
.calc__nome em{ font-style:normal; font-size:.76rem; color:var(--ink-3); white-space:nowrap; }
.calc__total{
  font-family:var(--display); white-space:nowrap; font-variant-numeric:tabular-nums;
}
/* O primeiro da lista e o mais barato: e a resposta da pergunta. */
.calc li:first-child .calc__linha{ color:var(--ink); }
.calc li:first-child .calc__total,
.calc li:first-child .calc__pos{ color:var(--roxo-2); }
.calc__nota{ color:var(--ink-3); font-size:.82rem; line-height:1.6; margin:1.2rem 0 0; }

/* =========================================================
   BANNERS
   ========================================================= */
.section--promo{ padding-top:0; }
.promos{
  display:grid; gap:1.2rem;
  grid-template-columns:repeat(auto-fit, minmax(260px, 1fr));
}
.promo{
  position:relative;
  display:flex; flex-direction:column; overflow:hidden;
  border:1px solid var(--line); border-radius:var(--radius);
  background:var(--panel);
  transition:border-color var(--t2), transform var(--t2) var(--ease-out);
}
.promo:hover{ border-color:var(--line-2); transform:translateY(-3px); }

/* Proporção fixa: sem ela a faixa muda de altura conforme a arte que
   cada banner recebe, e os três cards deixam de casar. */
.promo__arte{
  position:relative; aspect-ratio:16 / 9; overflow:hidden;
  background:radial-gradient(circle at 50% 35%, rgba(125,92,198,.14), rgba(0,0,0,.4) 70%);
  border-bottom:1px solid var(--line);
  display:grid; place-items:center;
}
.promo__arte img{ width:100%; height:100%; object-fit:cover; display:block; }
.promo__txt{ padding:1.3rem 1.4rem 1.5rem; display:flex; flex-direction:column; flex:1; }
.promo__tag{
  font-size:.66rem; letter-spacing:.18em; text-transform:uppercase;
  color:var(--roxo-2); margin:0 0 .6rem;
}
.promo h3{ font-family:var(--display); font-size:1.15rem; font-weight:500; margin:0 0 .55rem; }
.promo__d{ color:var(--ink-2); font-size:.9rem; line-height:1.6; margin:0 0 1.1rem; }
.promo__cta{
  margin-top:auto; align-self:flex-start;
  font-size:.75rem; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-2); padding:.55rem 0; min-height:44px;
  display:inline-flex; align-items:center; gap:.45rem;
  transition:color var(--t1) linear;
}
.promo__cta::after{ content:"\2192"; transition:transform var(--t2) var(--ease-out); }
/* O link cobre o card: a arte e o título também levam ao destino. */
.promo__cta::before{ content:""; position:absolute; inset:0; }
.promo__cta:hover{ color:var(--roxo-2); }
.promo__cta:hover::after{ transform:translateX(4px); }

/* =========================================================
   TOQUE

   Tudo aqui sai de medir a página a 375px, não de achismo. O celular não
   tem hover e não tem ponteiro fino: as duas coisas mudam o que existe na
   tela, não só o tamanho.
   ========================================================= */
/* O alvo grande vale para o dedo. No mouse, 44px de altura em volta de
   um traço de 2px abre um vão de 21px entre o rótulo e o controle, e o
   traço para de alinhar com a base do campo ao lado. */
@media (pointer:coarse){
  .tools input[type=range],
  .ferr__campo input[type=range]{ height:44px; }
  /* 16px e o limite do Safari no iPhone: abaixo disso ele dá zoom na
     pagina quando o campo recebe o toque, e a pessoa fica com o site
     ampliado e torto so por ter tocado na busca. */
  .tools input[type=search]{ font-size:16px; }
}

@media (hover:none){
  /* Sem esta regra o comparador simplesmente não existe no celular. Ele
     aparecia com `.prod:hover`, e num aparelho de toque esse estado nunca
     acontece: a caixa ficava com opacidade 0 para sempre, e o recurso
     inteiro era invisível para quem entra pelo telefone. */
  .prod__cmp{ opacity:1; }
  .prod__abrir{ color:var(--ink-2); }
}

@media (max-width:640px){
  /* Alvos de toque. O mínimo confortável é 44px de altura; abaixo disso a
     pessoa erra o clique e culpa o site. */
  .chip{ min-height:44px; padding:.55rem 1rem; }
  .prod__cmp{ min-height:44px; padding:.5rem .8rem .5rem .6rem; }
  .prod__cmp input{ width:18px; height:18px; }
  .tools__limpar{ min-height:44px; }
  .bandeja__x{ min-width:44px; min-height:44px; }

  /* O iOS dá zoom na página quando você toca num campo com fonte menor
     que 16px, e depois deixa a página torta. Só o <select> precisa: range
     e checkbox não recebem digitação e não disparam o zoom. */
  .tools select{ font-size:16px; }

  /* A tabela de comparação media 432px dentro de uma caixa de 337px e
     rolava de lado. Comparar lado a lado exigindo rolar para o lado não
     compara nada.

     Diminuir fonte e espaçamento não bastou: sem table-layout fixed a
     tabela adota a largura mínima do conteúdo e ainda passava 28px da
     caixa, que é pouco demais para parecer rolagem de propósito e o
     bastante para parecer quebrado. Com layout fixo as colunas dividem
     a largura que existe e o texto quebra dentro delas. */
  /* Preço e "ver por dentro" saem da coluna da direita e viram uma faixa
     embaixo. Em 375px eles disputavam a largura com o nome do produto, e
     "Elf Bar Duke 35K" quebrava em duas linhas para caber no que sobrava. */
  .q__card{ flex-direction:column; align-items:stretch; gap:.7rem; }
  .q__card__fim{
    flex-direction:row; align-items:baseline; justify-content:space-between;
    padding-top:.7rem; border-top:1px solid var(--line);
  }

  .cmp{ table-layout:fixed; width:100%; }
  /* A fonte aqui é pequena de propósito, e foi calculada, não chutada.
     Em 375px sobram 297px para quatro colunas. As duas palavras mais
     longas são "descartável" e "declarados": a 11,5px elas medem cerca
     de 63px e 58px, e cabem inteiras nas colunas de 68px e 59px de
     conteúdo. Com uma fonte maior elas quebram no meio e sobra letra
     solta na linha de baixo, que é pior de ler do que a fonte menor. */
  .cmp th,.cmp td{ padding:.55rem .25rem; font-size:.72rem; }
  .cmp tbody th{ white-space:normal; width:4.2rem; }
  .cmp .melhor::after{ display:block; content:"melhor"; }

  /* Os links do rodapé tinham 33px de altura. São eles que levam ao
     WhatsApp e ao e-mail: errar o toque aí custa contato. */
  .foot nav a{ padding:.65rem 0; }
  .nav__logo{ display:inline-flex; align-items:center; min-height:44px; }

  /* O aviso de saúde a 10px é pequeno demais para o que ele diz. O
     <small> encolhe de novo por conta própria, então ele volta a 1em. */
  .foot__bar{ font-size:.82rem; }
  .foot__bar small{ font-size:1em; }

  /* A bandeja é fixa e cobre o pé da página. Sem esta folga, a última
     linha do rodapé fica embaixo dela e não dá para ler. `--bandeja` é a
     altura medida (catalog.js): com a linha do kit ela passa de 140px. */
  body.tem-bandeja{ padding-bottom:calc(var(--bandeja, 6rem) + 2.6rem); }
}


/* =========================================================
   ESTÉTICA: FUNDO VIVO, MÁSCARAS, FAIXA, PASSOS, CHAMADA

   O que veio de olhar a Breakr e a Bahtech: fundo com aurora e grade
   de pontos, título que sobe palavra a palavra, passos com coluna fixa e números acendendo, e um fecho
   com chamada grande. Os gestos são os deles; a cor, a letra e o
   texto são os nossos.
   ========================================================= */

/* ---------- fundo: aurora e grade de pontos ----------
   Os dois moram dentro de .stage, ATRÁS do canvas: assim ficam entre
   o fundo da página e a peça 3D. Como filhos do hero eles sairiam por
   cima da peça, que vive numa camada fixa em z -1. Com a ficha aberta
   os dois somem, como o grão: a cena escura da ficha foi acertada sem
   eles e continua igual. */
.stage__aurora{
  position:absolute; left:50%; top:-12%; width:72vmax; height:72vmax;
  margin-left:-36vmax; border-radius:50%; pointer-events:none;
  background:radial-gradient(closest-side, rgba(125,92,198,.30), rgba(125,92,198,.09) 46%, transparent 72%);
  animation:deriva 28s ease-in-out infinite alternate;
  will-change:transform;
}
@keyframes deriva{
  from{ transform:translate3d(-14%,-4%,0) scale(1); }
  to{ transform:translate3d(16%,12%,0) scale(1.18); }
}
.stage__pontos{
  position:absolute; inset:0; pointer-events:none;
  background-image:radial-gradient(rgba(195,170,255,.32) 1px, transparent 1.5px);
  background-size:28px 28px;
  -webkit-mask-image:radial-gradient(70% 80% at 32% 50%, #000 10%, transparent 72%);
          mask-image:radial-gradient(70% 80% at 32% 50%, #000 10%, transparent 72%);
  /* Some conforme a primeira tela rola. `--rolou` e escrita pelo
     app.js no proprio `.stage` (e no `.hero`), nao na raiz do
     documento: na raiz, cada quadro invalidaria o estilo da pagina
     inteira -- inclusive os 43 cards da prateleira, que nem usam isso. */
  opacity:calc(.6 * (1 - var(--rolou, 0)));
  will-change:opacity;
}
body.peca-na-frente .stage__aurora,
body.peca-na-frente .stage__pontos{ display:none; }

/* ---------- hero: o texto recua enquanto a página começa a rolar ---------- */
.hero__inner{
  transform:translateY(calc(var(--rolou, 0) * 3vh));
}

/* ---------- títulos: cada palavra sobe de dentro de uma máscara ----------
   app.js embrulha cada palavra em <span class="w"><i>palavra</i></span>.
   O .w recorta; o filho sobe. O respiro em cima e embaixo (padding com
   margem negativa igual) existe para o recorte não decepar acento nem
   descendente: a altura da linha continua a mesma. */
.mascara .w{
  display:inline-block; overflow:hidden; vertical-align:top;
  padding:.12em 0 .18em; margin:-.12em 0 -.18em;
}
/* A palavra sobe e clareia junto. So subindo, ela aparecia de uma vez
   na linha de corte da mascara -- a borda de cima entregava que ali
   havia um recorte. Com a opacidade entrando na primeira metade da
   subida, a palavra ja chega meio formada e o corte some.

   A cascata e de 42 ms: com 50 ms um titulo de sete palavras levava
   quase um segundo e meio para assentar, e isso le como lentidao. */
.mascara .w > *{
  display:inline-block; font-style:normal;
  transform:translateY(112%); opacity:0;
  transition:transform .92s var(--ease-out), opacity .5s linear;
  transition-delay:calc(var(--n, 0) * 42ms);
}
.mascara.is-in .w > *{ transform:none; opacity:1; }

/* ---------- passos: coluna fixa à esquerda, numerados à direita ---------- */
.passos{
  display:grid; align-items:start; gap:clamp(2rem,5vw,5rem);
  grid-template-columns:minmax(0,5fr) minmax(0,7fr);
}
.passos__fixo{ position:sticky; top:7rem; }
.passos__fixo .section__head{ margin-bottom:2.2rem; }
.passos__indice{ list-style:none; margin:0; padding:0; display:grid; gap:.15rem; }
.passos__indice li{
  display:flex; align-items:center; gap:.75rem; padding:.5rem 0;
  font-size:.72rem; letter-spacing:.2em; text-transform:uppercase; color:var(--ink-3);
  transition:color var(--t2), transform var(--t2) var(--ease-out);
}
.passos__indice li span{
  width:6px; height:6px; border-radius:50%; background:currentColor;
  transition:box-shadow var(--t2);
}
.passos__indice li.is-ativo{ color:var(--roxo-2); transform:translateX(4px); }
.passos__indice li.is-ativo span{ box-shadow:0 0 0 4px rgba(125,92,198,.22), 0 0 14px var(--roxo); }

.passos__lista{ position:relative; padding-left:2.2rem; }
.passos__lista::before{
  content:""; position:absolute; left:4px; top:1rem; bottom:1rem; width:1px;
  background:linear-gradient(transparent, var(--line-2) 8%, var(--line-2) 92%, transparent);
}
.passo{ position:relative; padding:2.6rem 0 2.8rem; border-top:1px solid var(--line); }
.passo:first-child{ border-top:0; padding-top:1rem; }
.passo::before{
  content:""; position:absolute; left:-2.2rem; top:3.55rem; width:9px; height:9px;
  border-radius:50%; background:var(--ink-3);
  transition:background var(--t2), box-shadow var(--t2);
}
.passo:first-child::before{ top:1.95rem; }
.passo.is-ativo::before{
  background:var(--roxo-2);
  box-shadow:0 0 0 5px rgba(125,92,198,.22), 0 0 18px var(--roxo);
}
.passo__n{
  display:block; font-family:var(--display); font-weight:700; line-height:.9;
  font-size:clamp(3.2rem,7vw,5.2rem); letter-spacing:-.04em; margin-bottom:1.1rem;
  background:linear-gradient(135deg, var(--roxo-2), var(--roxo) 70%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
  opacity:.26; transform:translateX(-4px);
  transition:opacity var(--t3) var(--ease-out), transform var(--t3) var(--ease-out);
}
.passo.is-ativo .passo__n{ opacity:1; transform:none; }
.passo b{
  display:block; font-family:var(--display); font-size:.78rem; font-weight:500;
  letter-spacing:.12em; text-transform:uppercase; color:var(--roxo-2); margin-bottom:.6rem;
}
.passo h3{ font-size:clamp(1.35rem,2.4vw,1.8rem); margin-bottom:.7rem; }
.passo p{ color:var(--ink-2); max-width:46ch; }

/* ---------- ferramentas: bloco de borda a borda ----------
   A seção das duas contas ganha chão próprio, como o bloco azul da
   Bahtech: grade de pontos e um tom de roxo que apaga para baixo. */
#ferramentas{ position:relative; isolation:isolate; }
/* `--vw` e a largura util da janela, escrita pelo app.js a cada
   redimensionamento. Aqui estava `100vw`, e `100vw` inclui a barra de
   rolagem: a faixa saia 8px mais larga que a tela dos dois lados e
   dava para arrastar a pagina de lado. O `100vw` fica de reserva, para
   o caso de o script nao rodar -- 8px a mais e melhor que a faixa
   encolhida. */
#ferramentas::before{
  content:""; position:absolute; top:0; bottom:0;
  left:50%; width:var(--vw, 100vw); margin-left:calc(var(--vw, 100vw) / -2);
  z-index:-1; pointer-events:none;
  border-top:1px solid var(--line);
  background:
    linear-gradient(180deg, rgba(125,92,198,.08), transparent 60%);
  -webkit-mask-image:linear-gradient(180deg, #000 55%, transparent);
          mask-image:linear-gradient(180deg, #000 55%, transparent);
}

/* ---------- chamada final ---------- */
.chamada{
  position:relative; isolation:isolate; overflow:hidden; text-align:center;
  padding-block:clamp(6rem,12vw,10rem);
}
.chamada__fundo{ position:absolute; inset:0; z-index:-1; overflow:hidden; pointer-events:none; }
/* A palavra gigante, só contorno. --desl vem de app.js e a faz andar
   de lado conforme a seção atravessa a tela. */
.chamada__fundo span{
  position:absolute; left:50%; top:50%; white-space:nowrap; user-select:none;
  transform:translate(-50%,-50%) translateX(calc(var(--desl, 0) * 1%));
  font-family:var(--display); font-weight:700; line-height:1; letter-spacing:-.05em;
  font-size:clamp(7rem,26vw,24rem); color:transparent;
  -webkit-text-stroke:1px rgba(195,170,255,.15);
}
.chamada__miolo{ max-width:42rem; margin-inline:auto; }
.chamada h2{ font-size:clamp(2.3rem,6vw,4.4rem); }
.chamada .lede{ margin-inline:auto; }
.chamada__acoes{ display:flex; flex-wrap:wrap; justify-content:center; gap:.9rem; margin-top:2rem; }
.btn--grande{ padding:1.15rem 1.9rem; font-size:1rem; }
.btn--seta{ padding-right:.6rem; gap:.9rem; }
.btn__seta{
  display:inline-grid; place-items:center; width:2.3em; height:2.3em; margin:-.6em 0;
  border-radius:50%; background:rgba(255,255,255,.16);
  font-size:1.05em; font-weight:600; line-height:1;
  transition:transform var(--t2) var(--ease-out), background var(--t1) linear;
}
.btn:hover .btn__seta{ transform:translateX(3px); background:rgba(255,255,255,.24); }

.contatos{
  display:flex; flex-wrap:wrap; gap:1px;
  max-width:52rem; margin:3.5rem auto 0; overflow:hidden;
  background:var(--line); border:1px solid var(--line); border-radius:var(--radius);
}
.contato{
  flex:1 1 200px;
  display:flex; flex-direction:column; align-items:flex-start; gap:.25rem;
  padding:1.4rem 1.5rem; text-align:left; background:rgba(12,10,16,.88);
  transition:background var(--t2);
}
.contato:hover{ background:rgba(125,92,198,.14); }
.contato b{ font-family:var(--display); font-weight:500; font-size:1.1rem; color:var(--ink); }
.contato > span:last-child{ font-size:.86rem; color:var(--ink-3); }
.contato__tag{
  display:inline-flex; align-items:center; gap:.4rem; margin-bottom:.7rem;
  padding:.28rem .6rem; border-radius:999px; border:1px solid var(--line-2);
  font-size:.62rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-2);
}

/* ---------- rolagem com inércia (app.js liga a classe) ----------
   Com a inércia ligada, quem anima a ida às âncoras é o app.js; o
   smooth nativo do html brigaria com ele. */
html.rolagem-suave{ scroll-behavior:auto; }

@media (max-width:900px){
  .passos{ grid-template-columns:1fr; }
  .passos__fixo{ position:static; }
  .passos__indice{ display:none; }
}
@media (max-width:640px){
  .chamada__fundo span{ font-size:30vw; }
  .btn--grande{ width:100%; }
}


/* =========================================================
   FICHA: BARRA DE PEDIDO, SABORES, CONDIÇÕES, COMPARTILHAR
   ========================================================= */
/* O corpo termina mais cedo: embaixo dele agora vem a barra presa, que
   ja tem o seu proprio respiro. */
.ficha__body{ padding-bottom:2rem; }

.ficha__topo{ display:flex; flex-wrap:wrap; align-items:center; gap:.6rem 1rem; }
.ficha__partilhar{
  display:inline-flex; align-items:center; min-height:34px; cursor:pointer;
  padding:.35rem .8rem; border-radius:999px;
  font:inherit; font-size:.68rem; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-2); background:transparent; border:1px solid var(--line-2);
  transition:color var(--t1) linear, border-color var(--t1) linear;
}
.ficha__partilhar:hover{ color:var(--ink); border-color:var(--roxo); }
.ficha__partilhar.is-ok{ color:#bfffd6; border-color:rgba(120,230,160,.45); }
.ficha__link{
  flex:1 1 100%; font:inherit; font-size:.84rem; color:var(--ink);
  padding:.6rem .75rem; border-radius:10px;
  background:rgba(0,0,0,.45); border:1px solid var(--line-2);
}

.ficha__sabores{ margin:0 0 2rem; }
.ficha__sabores h5{
  font-family:var(--display); font-size:.74rem; font-weight:500;
  letter-spacing:.2em; text-transform:uppercase; color:var(--roxo-2);
  margin-bottom:.7rem;
}
.ficha__sabores h5 em{ font-style:normal; color:var(--ink-3); margin-left:.3rem; }
.ficha__nota{ color:var(--ink-2); font-size:.92rem; }
.sabores{ display:flex; flex-wrap:wrap; gap:.45rem; margin-top:.9rem; }
.sabor{
  font:inherit; font-size:.86rem; cursor:pointer; min-height:40px;
  padding:.45rem .95rem; border-radius:999px;
  color:var(--ink-2); background:rgba(0,0,0,.3); border:1px solid var(--line-2);
  transition:color var(--t1) linear, background var(--t1) linear,
             border-color var(--t1) linear, transform var(--t2) var(--ease-out);
}
.sabor:hover{ color:var(--ink); border-color:var(--roxo); transform:translateY(-1px); }
.sabor[aria-pressed="true"]{ color:#fff; background:var(--roxo); border-color:var(--roxo); }

.ficha__cond{
  list-style:none; margin:0; padding:0;
  display:grid; gap:1px; background:var(--line);
  border:1px solid var(--line); border-radius:14px; overflow:hidden;
}
.ficha__cond li{
  display:grid; grid-template-columns:9rem 1fr; gap:1rem; align-items:baseline;
  padding:.85rem 1rem; background:#100e0c;
}
.ficha__cond b{
  font-weight:500; font-size:.68rem; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-3);
}
.ficha__cond span{ color:var(--ink-2); font-size:.9rem; }

/* A barra presa no pe da gaveta. Ela flutua sobre o texto que rola por
   baixo, entao e um dos poucos lugares que mantem o desfoque de fundo. */
.ficha__barra{
  position:sticky; bottom:0; z-index:3;
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  padding:.95rem clamp(1.3rem,4vw,2.6rem);
  background:rgba(14,13,19,.94);
  backdrop-filter:blur(14px) saturate(130%);
  border-top:1px solid var(--line-2);
  box-shadow:0 -24px 40px -26px rgba(0,0,0,.95);
}
.ficha__barra .ficha__preco{ flex-wrap:wrap; gap:.15rem .6rem; min-width:0; }
.ficha__barra .ficha__preco b{ font-size:1.55rem; }
.ficha__barra .ficha__preco small{ flex-basis:100%; font-size:.76rem; color:var(--ink-3); }
.ficha__estoque{
  align-self:center; padding:.22rem .55rem; border-radius:999px;
  font-size:.62rem; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-2); border:1px solid var(--line-2);
}
.ficha__estoque--pronta{ color:#bfffd6; border-color:rgba(120,230,160,.4); background:rgba(40,120,70,.3); }
.ficha__estoque--pouco{ color:#ffd9a0; border-color:rgba(255,190,110,.45); }
.ficha__acoes{ display:flex; gap:.5rem; flex:0 0 auto; }
.ficha__acoes .btn{ padding:.85rem 1.25rem; font-size:.9rem; }
.ficha__lista[aria-pressed="true"]{ color:var(--roxo-2); box-shadow:inset 0 0 0 1px var(--roxo); }
/* Aviso curto por cima da barra ("saiu da comparação: ..."). Vazio, não
   ocupa nada e não pega clique; continua no documento para o leitor de
   tela anunciar quando o texto entra. */
.ficha__aviso{
  position:absolute; left:clamp(1.3rem,4vw,2.6rem); right:clamp(1.3rem,4vw,2.6rem); bottom:calc(100% + .6rem);
  margin:0; padding:.6rem .9rem; border-radius:12px;
  font-size:.84rem; color:var(--ink); background:rgba(28,22,40,.96);
  border:1px solid var(--roxo); box-shadow:0 12px 30px -12px #000;
  transition:opacity var(--t2), transform var(--t2) var(--ease-out);
}
.ficha__aviso:empty{ opacity:0; transform:translateY(6px); pointer-events:none; }

/* Fora da tela, dentro da leitura: só para leitor de tela. */
.sr-only{
  position:absolute; width:1px; height:1px; margin:-1px; padding:0; overflow:hidden;
  clip-path:inset(50%); white-space:nowrap; border:0;
}

@media (max-width:640px){
  .ficha__barra{ flex-direction:column; align-items:stretch; gap:.7rem; padding-block:.8rem; }
  .ficha__acoes{ display:grid; grid-template-columns:2fr 3fr; }
  .ficha__acoes .btn{ width:100%; padding-inline:.7rem; }
  .ficha__cond li{ grid-template-columns:1fr; gap:.2rem; }
}

/* =========================================================
   VOCÊ VIU HÁ POUCO
   ========================================================= */
.vistos{ margin:0 0 1.8rem; }
.vistos__topo{ display:flex; align-items:center; justify-content:space-between; gap:1rem; margin-bottom:.6rem; }
.vistos__t{
  font-family:var(--sans); font-size:.72rem; font-weight:500;
  letter-spacing:.2em; text-transform:uppercase; color:var(--ink-3);
}
.vistos__limpar{
  font:inherit; font-size:.8rem; color:var(--ink-3); min-height:44px;
  background:none; border:0; cursor:pointer; padding:0 .2rem;
  text-decoration:underline; text-underline-offset:3px;
  transition:color var(--t1) linear;
}
.vistos__limpar:hover{ color:var(--ink); }
/* Rola de lado dentro da propria caixa: seis itens nao cabem numa linha
   de celular, e quebrar em duas linhas empurraria a prateleira para
   baixo. */
/* Seis pixels de folga em volta, devolvidos pela margem negativa: a
   rolagem lateral corta o que passa da caixa, e sem folga sumia a borda
   de cima no hover e metade do anel de foco do teclado. */
.vistos__lista{
  list-style:none; margin:-6px -6px 0; padding:6px 6px .5rem; scroll-padding-inline:6px;
  display:flex; gap:.6rem; overflow-x:auto;
  scroll-snap-type:x proximity; overscroll-behavior-x:contain;
  scrollbar-width:thin; scrollbar-color:var(--line-2) transparent;
}
.vistos__lista li{ flex:0 0 auto; scroll-snap-align:start; }
.visto{
  display:flex; align-items:center; gap:.75rem; width:15.5rem;
  padding:.5rem .9rem .5rem .5rem; cursor:pointer; text-align:left;
  font:inherit; color:inherit; border-radius:14px;
  border:1px solid var(--line); background:rgba(24,22,31,.9);
  transition:border-color var(--t2), transform var(--t2) var(--ease-out);
}
.visto:hover{ border-color:var(--line-2); transform:translateY(-2px); }
.visto__art{
  flex:0 0 52px; height:52px; display:grid; place-items:center; overflow:hidden;
  border-radius:10px; background:rgba(0,0,0,.35);
}
.visto__art img{ width:100%; height:100%; object-fit:contain; }
.visto__art svg{
  width:26px; height:26px; fill:none; stroke:var(--roxo); stroke-width:1.6;
  stroke-linecap:round; stroke-linejoin:round;
}
.visto__txt{ display:flex; flex-direction:column; gap:.1rem; min-width:0; }
.visto__nome{ font-size:.86rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.visto b{ font-family:var(--display); font-weight:500; font-size:.86rem; color:var(--roxo-2); }

/* =========================================================
   ESTOQUE, KIT E OS LINKS DOS PASSOS
   ========================================================= */
.prod__selo--pronta{ color:#bfffd6; border-color:rgba(120,230,160,.4); background:rgba(40,120,70,.35); }

.tools__check{
  display:inline-flex; align-items:center; gap:.55rem; min-height:44px; cursor:pointer;
  font-size:.88rem; color:var(--ink-2);
}
.tools__check input{ accent-color:var(--roxo); width:18px; height:18px; cursor:pointer; }

.bandeja__kit{ font-size:.84rem; color:var(--ink-2); white-space:nowrap; }
.bandeja__kit s{ color:var(--ink-3); margin-right:.2rem; }
.bandeja__kit b{ color:#bfffd6; font-family:var(--display); font-weight:500; }

.passo__link{
  display:inline-flex; align-items:center; gap:.5rem; margin-top:.9rem; min-height:44px;
  font-size:.74rem; letter-spacing:.14em; text-transform:uppercase; color:var(--roxo-2);
  transition:color var(--t1) linear;
}
.passo__link::after{ content:"\2192"; transition:transform var(--t2) var(--ease-out); }
.passo__link:hover{ color:var(--ink); }
.passo__link:hover::after{ transform:translateX(4px); }

/* =========================================================
   PERGUNTAS FREQUENTES E AVALIAÇÕES
   ========================================================= */
.duvidas__lista{ max-width:50rem; margin:0 auto; border-top:1px solid var(--line); }
.duvida{ border-bottom:1px solid var(--line); }
.duvida summary{
  list-style:none; cursor:pointer;
  display:flex; align-items:center; justify-content:space-between; gap:1.5rem;
  padding:1.3rem .2rem; min-height:44px;
  font-family:var(--display); font-size:clamp(1.02rem,1.7vw,1.22rem); color:var(--ink);
  transition:color var(--t1) linear;
}
.duvida summary::-webkit-details-marker{ display:none; }
.duvida summary:hover{ color:var(--roxo-2); }
/* O "+" vira "x" girando 45 graus: e o mesmo desenho, entao a troca le
   como um gesto so, e nao como um icone sendo trocado por outro. */
.duvida__mais{
  position:relative; flex:0 0 auto; width:34px; height:34px; border-radius:50%;
  color:var(--ink-2); border:1px solid var(--line-2);
  transition:transform var(--t3) var(--ease-out), background var(--t2), border-color var(--t2), color var(--t2);
}
.duvida__mais::before,
.duvida__mais::after{
  content:""; position:absolute; left:50%; top:50%;
  width:12px; height:1.5px; margin:-.75px 0 0 -6px;
  border-radius:2px; background:currentColor;
}
.duvida__mais::after{ transform:rotate(90deg); }
.duvida[open] .duvida__mais{ transform:rotate(45deg); color:#fff; background:var(--roxo); border-color:var(--roxo); }
.duvida__r{ overflow:hidden; }
.duvida__r p{ padding:0 .2rem 1.5rem; max-width:64ch; color:var(--ink-2); }
.duvida__r b{ color:var(--ink); font-weight:500; }
.duvida__r a{ color:var(--roxo-2); text-decoration:underline; text-underline-offset:3px; }

.depoimentos{ margin-top:clamp(4rem,8vw,6rem); }
.depoimentos .eyebrow{ text-align:center; }

@media (max-width:640px){
  .bandeja__kit{ white-space:normal; }
  .visto{ width:13.5rem; }
  .duvida summary{ padding-block:1.1rem; }
}

/* =========================================================
   SACOLA
   ========================================================= */
.nav__sacola{
  position:relative; flex:none; margin-left:-1.2rem;
  display:grid; place-items:center; width:40px; height:36px;
  border-radius:999px; border:1px solid var(--line-2);
  background:none; color:var(--ink-2); cursor:pointer;
  transition:color var(--t1) linear, border-color var(--t1) linear;
}
.nav__sacola:hover{ color:var(--ink); border-color:var(--roxo); }
.nav__sacola:focus-visible{ outline:2px solid var(--roxo); outline-offset:3px; }
.nav__sacola svg{ width:17px; height:17px; fill:none; stroke:currentColor; stroke-width:1.6; stroke-linejoin:round; }
.nav__sacola-n{
  position:absolute; top:-6px; right:-6px; min-width:19px; height:19px; padding:0 5px;
  display:grid; place-items:center; border-radius:999px;
  background:var(--metal); color:#f6f2ff;
  font-family:var(--display); font-size:.68rem; font-weight:500; line-height:1;
  box-shadow:0 4px 12px -4px rgba(125,92,198,.9);
}
.nav__sacola-n[hidden]{ display:none; }

.sacola{ position:fixed; inset:0; z-index:95; display:flex; justify-content:flex-end; }
.sacola[hidden]{ display:none; }
.sacola__fundo{ position:absolute; inset:0; background:rgba(5,4,8,.62); }
.sacola__painel{
  position:relative; width:min(460px,100%); height:100%;
  display:flex; flex-direction:column;
  background:linear-gradient(180deg,#15121c,#0c0a10);
  border-left:1px solid var(--line-2);
  box-shadow:-30px 0 80px -30px #000;
}
.sacola__painel:focus{ outline:none; }
.sacola__topo{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  padding:1rem 1rem 1rem clamp(1.2rem,4vw,1.8rem); border-bottom:1px solid var(--line);
}
.sacola__topo h3{ margin:0; font-family:var(--display); font-weight:500; font-size:1.3rem; }
.sacola .sacola__x{ position:static; float:none; margin:0; flex:none; }
.sacola__corpo{ flex:1 1 auto; overflow-y:auto; padding:.4rem clamp(1.2rem,4vw,1.8rem); }
.sacola__lista{ list-style:none; margin:0; padding:0; }

.item{
  display:grid; grid-template-columns:64px 1fr auto; align-items:center; gap:.9rem;
  padding:1rem 0; border-bottom:1px solid var(--line);
}
.item__art{
  width:64px; height:64px; padding:0; cursor:pointer;
  display:grid; place-items:center; overflow:hidden;
  border-radius:12px; border:1px solid var(--line); background:rgba(183,157,255,.05);
  color:var(--ink-3);
}
.item__art img{ width:100%; height:100%; object-fit:contain; }
.item__art svg{ width:30px; height:30px; fill:none; stroke:currentColor; stroke-width:1.5; }
.item__art:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:2px; }
.item__txt{ display:flex; flex-direction:column; gap:.25rem; min-width:0; }
.item__nome{ font-size:.95rem; color:var(--ink); line-height:1.3; }
.item__preco{ font-size:.8rem; color:var(--ink-3); }
.item__preco b{ font-family:var(--display); font-weight:500; font-size:.92rem; color:var(--roxo-2); margin-left:.2rem; }
.item__preco b:first-child{ margin-left:0; }
.item__sabor{ display:flex; align-items:center; gap:.45rem; font-size:.76rem; color:var(--ink-3); }
.item__sabor select{
  min-width:0; max-width:100%; padding:.3rem .5rem; border-radius:8px;
  font:inherit; font-size:.8rem; color:var(--ink); background:#14111a; border:1px solid var(--line-2);
}
.item__qtd{
  display:flex; align-items:center; border:1px solid var(--line-2); border-radius:999px;
}
.item__qtd button{
  width:34px; height:34px; display:grid; place-items:center; cursor:pointer;
  font:inherit; font-size:1.05rem; line-height:1; color:var(--ink-2);
  background:none; border:0; border-radius:999px;
}
.item__qtd button:hover:not(:disabled){ color:var(--ink); background:rgba(183,157,255,.08); }
.item__qtd button:disabled{ opacity:.35; cursor:default; }
.item__qtd button:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:-2px; }
.item__qtd span{ min-width:1.6rem; text-align:center; font-family:var(--display); font-variant-numeric:tabular-nums; }

.sacola__vazia{ padding:3.5rem 0; text-align:center; color:var(--ink-2); }
.sacola__vazia svg{ width:44px; height:44px; fill:none; stroke:var(--roxo-2); stroke-width:1.2; opacity:.7; }
.sacola__vazia p{ margin:.8rem 0 0; }
.sacola__vazia .sacola__dica{ font-size:.86rem; color:var(--ink-3); margin-bottom:1.6rem; }

.sacola__pe{
  flex:none; display:flex; flex-direction:column; gap:.55rem;
  padding:1rem clamp(1.2rem,4vw,1.8rem) calc(1rem + env(safe-area-inset-bottom));
  border-top:1px solid var(--line-2); background:rgba(14,12,18,.96);
}
.sacola__pe[hidden]{ display:none; }
.sacola__total{ display:flex; align-items:baseline; justify-content:space-between; }
.sacola__total span{ font-size:.78rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3); }
.sacola__total b{ font-family:var(--display); font-weight:500; font-size:1.5rem; }
.sacola__linha{ margin:0; font-size:.84rem; color:var(--ink-2); }
.sacola__linha s{ color:var(--ink-3); margin-right:.2rem; }
.sacola__linha b{ color:#bfffd6; font-family:var(--display); font-weight:500; }
.sacola__pedir{ margin-top:.35rem; justify-content:center; text-align:center; }
.sacola__nota{ margin:0; font-size:.76rem; color:var(--ink-3); text-align:center; }
.sacola__esvaziar{
  align-self:center; font:inherit; font-size:.78rem; color:var(--ink-3);
  background:none; border:0; cursor:pointer; text-decoration:underline; text-underline-offset:3px;
}
.sacola__esvaziar:hover{ color:var(--ink); }

/* Na ficha: "Pôr na sacola" é o botão; pedir só aquele vira um link
   discreto logo embaixo. */
.ficha__acoes{ flex-wrap:wrap; justify-content:flex-end; }
.ficha__so{
  flex-basis:100%; text-align:right; font-size:.78rem; color:var(--ink-3);
  text-decoration:underline; text-underline-offset:3px;
}
.ficha__so:hover{ color:var(--ink); }
@media (max-width:640px){
  .ficha__so{ grid-column:1 / -1; text-align:center; }
  .item{ grid-template-columns:52px 1fr auto; gap:.7rem; }
  .item__art{ width:52px; height:52px; }
}
@media (max-width:900px){
  .nav__sacola{ margin-left:-1rem; }
}
@media (pointer:coarse){
  .item__qtd button{ width:42px; height:42px; }
}

/* =========================================================
   PRATELEIRA: ACIMA DO PREÇO ESCOLHIDO
   Não some: fica no fim, apagado e desfocado. Passar o mouse (ou o
   foco do teclado) devolve o card inteiro.
   ========================================================= */
.grid__acima{
  grid-column:1 / -1; margin:1.2rem 0 .2rem; padding-top:1.2rem;
  border-top:1px dashed var(--line-2);
  font-size:.8rem; letter-spacing:.12em; text-transform:uppercase; color:var(--ink-3);
}
.grid__acima[hidden]{ display:none; }
.prod.is-acima{
  opacity:.42; filter:blur(1.6px) grayscale(.5);
  transition:transform var(--t2) var(--ease-out), border-color var(--t2), background var(--t2),
             opacity var(--t2) var(--ease-io), filter var(--t2) var(--ease-io);
}
.prod.is-acima:hover,.prod.is-acima:focus-within{ opacity:1; filter:none; }
@media (hover:none){
  .prod.is-acima{ filter:blur(1px) grayscale(.5); opacity:.5; }
}

/* Celular estreito: logo, idioma, sacola e menu na mesma linha. O
   "headshop" do logo sai para os quatro caberem (em 375px o menu ficava
   para fora da tela). */
@media (max-width:440px){
  .nav__logo em{ display:none; }
  .nav{ gap:1.4rem; }
  .nav__sacola{ margin-left:-.7rem; }
  .nav .idioma ~ .nav__burger{ margin-left:-.6rem; }
}

/* Sem numero em WHATSAPP (catalog.js): os botoes de WhatsApp somem e os
   textos trocam pela versao "por e-mail". */
.sem-zap [data-whats],
.sem-zap [data-com-zap],
html:not(.sem-zap) [data-sem-zap]{ display:none !important; }

/* Ferramentas com um bloco so (o quiz): centrado, sem esticar. */
.duo--um{ grid-template-columns:minmax(0,640px); justify-content:center; }
.prod__foot b s{ color:var(--ink-3); font-weight:400; font-size:.8em; margin-right:.2rem; }

/* =========================================================
   PAGAMENTO: dados de entrega na sacola e aviso da volta
   ========================================================= */
.com-pagamento [data-sem-pagamento],
html:not(.com-pagamento) [data-com-pagamento]{ display:none !important; }

.checkout{ display:flex; flex-direction:column; gap:.75rem; padding:1rem 0 1.4rem; }
.checkout h4{ margin:.7rem 0 0; font-family:var(--display); font-weight:500; font-size:1rem; color:var(--ink); }
.checkout__voltar{
  align-self:flex-start; padding:.2rem 0; font:inherit; font-size:.82rem; color:var(--ink-2);
  background:none; border:0; cursor:pointer;
}
.checkout__voltar:hover{ color:var(--ink); }
.campo{ display:flex; flex-direction:column; gap:.3rem; font-size:.76rem; color:var(--ink-3); min-width:0; }
.campo input{
  width:100%; min-width:0; font:inherit; font-size:16px; color:var(--ink);
  background:#14111a; border:1px solid var(--line-2); border-radius:10px; padding:.7rem .8rem;
}
.campo input:focus{ outline:2px solid var(--roxo); outline-offset:1px; border-color:var(--roxo); }
.campo input[aria-invalid="true"]{ border-color:#ff8a8a; box-shadow:0 0 0 1px #ff8a8a; }
.campo__par{ display:grid; grid-template-columns:1fr 1fr; gap:.7rem; }
.campo__par--uf{ grid-template-columns:1fr 5rem; }
.checkout__erro{ margin:0; font-size:.84rem; color:#ffb4b4; line-height:1.45; }
.checkout__erro:empty{ display:none; }
.sacola__pedir:disabled{ opacity:.6; cursor:progress; }
.sacola__alt{ align-self:center; font-size:.78rem; color:var(--ink-3); text-decoration:underline; text-underline-offset:3px; text-align:center; }
.sacola__alt:hover{ color:var(--ink); }

.aviso-pedido{
  position:fixed; left:50%; top:5.2rem; transform:translateX(-50%); z-index:120;
  width:min(440px, calc(100% - 2rem)); padding:1.2rem 3rem 1.2rem 1.3rem; border-radius:16px;
  background:rgba(20,17,28,.97); border:1px solid var(--roxo); box-shadow:0 20px 60px -20px #000;
}
.aviso-pedido h4{ margin:0 0 .35rem; font-family:var(--display); font-weight:500; font-size:1.15rem; }
.aviso-pedido p{ margin:0; color:var(--ink-2); font-size:.9rem; line-height:1.5; }
.aviso-pedido--ok{ border-color:rgba(120,230,160,.5); }
.aviso-pedido--ok h4{ color:#bfffd6; }
.aviso-pedido--erro{ border-color:rgba(255,138,138,.5); }
.aviso-pedido--erro h4{ color:#ffb4b4; }
.aviso-pedido button{
  position:absolute; top:.45rem; right:.45rem; width:40px; height:40px; display:grid; place-items:center;
  font:inherit; font-size:1.3rem; color:var(--ink-2); background:none; border:0; border-radius:50%; cursor:pointer;
}
.aviso-pedido button:hover{ color:var(--ink); }

/* =========================================================
   LEITURA (set/2026)
   O dono pediu: "muita fonte opaca, as cores atrapalham". Estava:
   textos que chegavam em fade lento e ficavam meio apagados enquanto a
   pessoa rolava, o topo que apagava ao rolar, mancha roxa andando,
   grade de pontos e granulado atrás do texto. Agora o fundo é liso,
   a entrada é curta e o texto já chega legível.
   ========================================================= */

/* Fundo: sem granulado, sem grade de pontos, sem a mancha que anda. */
.stage__grain,
.stage__pontos{ display:none; }
.stage__aurora{ animation:none; opacity:.45; }

/* Entradas curtas: o texto aparece quase inteiro, sobe pouco e rápido,
   e a cascata dos cards fecha em menos de 0,2 s. */
.reveal{
  opacity:.001; transform:translateY(6px);
  transition:opacity .38s var(--ease-out), transform .38s var(--ease-out);
  transition-delay:calc(min(var(--i,0), 6) * 28ms);
}
.mascara .w > *{
  transition:transform .5s var(--ease-out), opacity .25s linear;
  transition-delay:calc(min(var(--n, 0), 8) * 26ms);
}

/* A palavra gigante da chamada final era contorno a 15%: some de vez
   em tela pequena e vira ruído atrás do título nas grandes. */
.chamada__fundo span{ -webkit-text-stroke:1px rgba(195,170,255,.08); }

/* Movimento reduzido: tudo já nasce no lugar. */
@media (prefers-reduced-motion: reduce){
  .reveal, .mascara .w > *{ opacity:1 !important; transform:none !important; transition:none !important; }
}

/* ---------- pagamento: Pix na tela e os dois botões ---------- */
.sacola__metodos{ display:grid; gap:.55rem; margin-top:.35rem; }
.sacola__metodos .btn{ justify-content:center; text-align:center; }
.pix{ display:flex; flex-direction:column; align-items:center; gap:.8rem; padding:1rem 0 1.6rem; text-align:center; }
.pix .checkout__voltar{ align-self:flex-start; }
.pix h4{ margin:.4rem 0 0; font-family:var(--display); font-weight:500; font-size:1.25rem; }
.pix__valor{ margin:0; font-family:var(--display); font-size:1.8rem; color:var(--ink); }
/* Fundo branco atrás do QR: leitor de banco erra código escuro em
   fundo escuro. */
.pix__qr{
  width:min(240px, 72%); height:auto; aspect-ratio:1; padding:12px;
  background:#fff; border-radius:16px; box-shadow:0 18px 50px -20px rgba(125,92,198,.6);
}
.pix__passos{ margin:0; max-width:34ch; font-size:.86rem; color:var(--ink-2); line-height:1.5; }
.pix__botao{ width:100%; justify-content:center; }
.pix__codigo{
  width:100%; min-width:0; padding:.6rem .7rem; border-radius:10px;
  font:inherit; font-family:ui-monospace, Menlo, Consolas, monospace; font-size:.72rem;
  color:var(--ink-2); background:#14111a; border:1px solid var(--line-2);
}
.pix__estado{ margin:.2rem 0 0; display:flex; align-items:center; gap:.55rem; font-size:.84rem; color:var(--ink); text-align:left; }
.pix__estado--fim{ color:#ffb4b4; justify-content:center; }
.pix__prazo{ margin:0; font-size:.78rem; color:var(--ink-3); }
.pix__roda{
  flex:none; width:16px; height:16px; border-radius:50%;
  border:2px solid rgba(195,170,255,.25); border-top-color:var(--roxo-2);
  animation:pix-roda 1s linear infinite;
}
@keyframes pix-roda{ to{ transform:rotate(360deg); } }
.pix--pago{ padding-top:3rem; }
.pix--pago p{ margin:0; max-width:34ch; color:var(--ink-2); line-height:1.5; }
.pix__ok{
  width:64px; height:64px; display:grid; place-items:center; border-radius:50%;
  font-size:1.8rem; color:#0b2a17; background:#bfffd6; box-shadow:0 0 0 8px rgba(191,255,214,.12);
}
@media (prefers-reduced-motion: reduce){ .pix__roda{ animation:none; } }

/* ---------- sacola com nome, e não só o ícone ---------- */
.nav__sacola{ width:auto; padding:0 .8rem; gap:.45rem; display:inline-flex; align-items:center; }
.nav__sacola-txt{ font-size:.8rem; font-weight:500; letter-spacing:.02em; color:var(--ink); }
.nav__sacola .nav__sacola-n{ position:static; min-width:20px; height:20px; box-shadow:none; }
@media (max-width:440px){ .nav__sacola-txt{ display:none; } }

/* Painel da loja: só no menu do celular (e no rodapé). */
.nav__painel{ display:none; }
@media (max-width:900px){
  .nav__links .nav__painel{ display:block; color:var(--ink-3); font-size:.92rem; }
}

/* ---------- passos da compra, no topo da sacola ---------- */
.compra-passos{
  list-style:none; margin:.9rem 0 .4rem; padding:0;
  display:grid; grid-template-columns:repeat(3,1fr); gap:.4rem;
}
.compra-passos li{
  display:flex; flex-direction:column; align-items:center; gap:.3rem;
  font-size:.72rem; letter-spacing:.06em; text-transform:uppercase; color:var(--ink-3);
  position:relative;
}
.compra-passos li span{
  width:26px; height:26px; display:grid; place-items:center; border-radius:50%;
  font-size:.78rem; font-family:var(--display); border:1px solid var(--line-2); color:var(--ink-2);
  background:#14111a;
}
.compra-passos li.agora{ color:var(--ink); }
.compra-passos li.agora span{ background:var(--roxo); border-color:var(--roxo); color:#fff; }
.compra-passos li.feito span{ background:rgba(191,255,214,.14); border-color:rgba(120,230,160,.5); color:#bfffd6; }
.campo__dica{ font-size:.72rem; color:var(--ink-3); line-height:1.4; }

/* ---------- modo loja: atalhos para editar ---------- */
.ficha__editar{
  margin-left:auto; padding:.3rem .7rem; border-radius:999px; font-size:.74rem;
  color:#1a1030; background:var(--roxo-2); text-decoration:none; white-space:nowrap;
}
.modo-loja{
  position:fixed; left:1rem; bottom:1rem; z-index:55;
  display:flex; flex-wrap:wrap; align-items:center; gap:.4rem .9rem;
  padding:.55rem .9rem; border-radius:999px; font-size:.78rem;
  background:rgba(20,17,28,.96); border:1px solid var(--roxo); box-shadow:0 12px 30px -14px #000;
}
.modo-loja span{ color:var(--roxo-2); }
.modo-loja a{ color:var(--ink); text-decoration:underline; text-underline-offset:3px; }
body.tem-bandeja .modo-loja{ bottom:calc(var(--bandeja, 4.5rem) + 2rem); }

/* ---------- barra de pedido da ficha: preço e primeira compra em
   coluna, botões ao lado. Em linha única, a frase da primeira compra
   espremia entre o preço e os botões e subia por cima do preço. */
.ficha__barra{
  display:grid; grid-template-columns:minmax(0,1fr) auto;
  column-gap:1rem; row-gap:.25rem; align-items:center;
}
.ficha__barra .ficha__preco{ grid-column:1; }
.ficha__barra .ficha__primeira{ grid-column:1; margin:0; }
.ficha__barra .ficha__acoes{ grid-column:2; grid-row:1 / span 2; max-width:19rem; }
.ficha__barra .ficha__preco b{ white-space:nowrap; }
@media (max-width:640px){
  .ficha__barra{ grid-template-columns:minmax(0,1fr); }
  .ficha__barra .ficha__acoes{ grid-column:1; grid-row:auto; max-width:none; }
}

/* Rodapé com a coluna "A loja" (trocas e privacidade). */
.foot__top{ grid-template-columns:2fr 1fr 1fr 1fr; }
@media (max-width:900px){ .foot__top{ grid-template-columns:1fr 1fr; } .foot__top > div:first-child{ grid-column:1 / -1; } }
.ficha__cond a, .duvida__r a{ color:var(--roxo-2); text-decoration:underline; text-underline-offset:3px; }

/* =========================================================
   ENTRAR / MEUS PEDIDOS
   Botão do topo da mesma família da sacola; a gaveta é a da sacola
   (.sacola), só o miolo é daqui.
   ========================================================= */
.nav__conta{
  position:relative; flex:none; margin-left:-1.2rem;
  display:inline-flex; align-items:center; gap:.45rem; height:36px; padding:0 .8rem;
  border-radius:999px; border:1px solid var(--line-2);
  background:none; color:var(--ink-2); font:inherit; cursor:pointer;
  transition:color var(--t1) linear, border-color var(--t1) linear;
}
.nav__conta:hover{ color:var(--ink); border-color:var(--roxo); }
.nav__conta:focus-visible{ outline:2px solid var(--roxo); outline-offset:3px; }
.nav__conta svg{ width:17px; height:17px; fill:none; stroke:currentColor; stroke-width:1.6; stroke-linecap:round; }
.nav__conta-txt{ font-size:.8rem; font-weight:500; letter-spacing:.02em; color:var(--ink); white-space:nowrap; }
@media (max-width:900px){
  .nav__conta{ margin-left:-1rem; }
}
/* No celular estreito fica só o ícone, como a sacola. */
@media (max-width:440px){
  .nav__conta-txt{ display:none; }
  .nav__conta{ width:38px; padding:0; justify-content:center; margin-left:-.7rem; }
}

/* "Meus pedidos" no menu do celular (no computador o botão já está no topo). */
.nav__pedidos{ display:none; }
@media (max-width:900px){
  .nav__links .nav__pedidos{ display:block; }
}

/* ---------- etapas: e-mail, código, senha ---------- */
.conta__passo{ display:flex; flex-direction:column; gap:.85rem; padding:1.3rem 0 1.6rem; }
.conta__intro{ margin:0; color:var(--ink-2); font-size:.92rem; line-height:1.55; }
.conta__intro b{ color:var(--ink); font-weight:500; overflow-wrap:anywhere; }
.conta__botao{ width:100%; justify-content:center; text-align:center; }
.conta__botao:disabled{ opacity:.6; cursor:progress; }
.conta__ok{ margin:0; font-size:.84rem; line-height:1.45; color:#bfffd6; }
.conta__codigo input{
  font-family:var(--display); font-size:1.45rem; font-variant-numeric:tabular-nums;
  letter-spacing:.42em; text-align:center; padding:.6rem .8rem .6rem 1.2rem;
}
.campo input[type="password"]{ letter-spacing:.08em; }
/* O e-mail escondido que acompanha a senha (para o gerenciador de senhas). */
.conta__usuario{ position:absolute; width:1px; height:1px; overflow:hidden; opacity:0; pointer-events:none; }
.conta__links{ display:flex; flex-wrap:wrap; justify-content:center; gap:.2rem 1.4rem; }
.conta__link{
  padding:.55rem 0; font:inherit; font-size:.82rem; color:var(--ink-3);
  background:none; border:0; cursor:pointer; text-decoration:underline; text-underline-offset:3px;
}
.conta__link:hover:not(:disabled){ color:var(--ink); }
.conta__link:disabled{ cursor:default; text-decoration:none; }
.checkout__erro a{ color:inherit; font-weight:500; text-decoration:underline; text-underline-offset:3px; }
.conta__carregando{
  display:flex; align-items:center; justify-content:center; gap:.6rem;
  margin:0; padding:3.5rem 0; font-size:.9rem; color:var(--ink-2);
}

/* ---------- lista de pedidos ---------- */
.conta__topo{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  padding:1.1rem 0 .9rem;
}
.conta__quem{ margin:0; min-width:0; font-size:.84rem; color:var(--ink-3); overflow-wrap:anywhere; }
.conta__quem b{ color:var(--ink); font-weight:500; }
.conta__sair{ flex:none; }
.conta__vazia{ padding-top:2.2rem; }
.pedidos{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:.8rem; }
.pedido-c{
  display:flex; flex-direction:column; gap:.6rem; padding:1rem 1.05rem 1.05rem;
  border-radius:14px; border:1px solid var(--line); background:linear-gradient(180deg,#17151e,#121118);
}
.pedido-c__topo{ display:flex; align-items:center; justify-content:space-between; gap:.5rem .8rem; flex-wrap:wrap; }
.pedido-c__id{ font-family:var(--display); font-weight:500; font-size:1.02rem; letter-spacing:.02em; color:var(--ink); }
.pedido-c__sub{ margin:0; font-size:.8rem; color:var(--ink-3); }
.pedido-c__itens{
  list-style:none; margin:0; padding:.6rem 0 0; border-top:1px solid var(--line);
  display:flex; flex-direction:column; gap:.3rem; font-size:.86rem; color:var(--ink-2);
}
.pedido-c__itens li{ display:flex; justify-content:space-between; align-items:baseline; gap:1rem; }
.pedido-c__itens b{ font-family:var(--display); font-weight:500; color:var(--ink-2); white-space:nowrap; }
.pedido-c__contas{ font-size:.8rem; color:var(--ink-3); }
.pedido-c__contas b{ color:var(--ink-3); }
.pedido-c__total{ display:flex; justify-content:space-between; align-items:baseline; padding-top:.55rem; border-top:1px solid var(--line); }
.pedido-c__total span{ font-size:.72rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3); }
.pedido-c__total b{ font-family:var(--display); font-weight:500; font-size:1.2rem; color:var(--roxo-2); }

/* Situação do pedido: as cores de estado do site. */
.status-pilula{
  display:inline-flex; align-items:center; padding:.24rem .7rem; border-radius:999px; white-space:nowrap;
  font-size:.64rem; font-weight:500; letter-spacing:.12em; text-transform:uppercase;
  color:var(--ink-3); border:1px solid var(--line-2); background:rgba(183,157,255,.04);
}
.status-pilula--pago{ color:#bfffd6; border-color:rgba(120,230,160,.5); background:rgba(191,255,214,.1); }
.status-pilula--pendente{ color:#ffd9a0; border-color:rgba(255,190,110,.45); background:rgba(255,190,110,.08); }
.status-pilula--enviado{ color:var(--roxo-2); border-color:var(--roxo); background:rgba(125,92,198,.2); }

.pedido-c__rastreio{
  display:flex; align-items:center; flex-wrap:wrap; gap:.35rem .7rem;
  padding:.7rem .8rem; border-radius:12px;
  background:rgba(125,92,198,.1); border:1px solid rgba(195,170,255,.24);
}
.pedido-c__rastreio span{ flex-basis:100%; font-size:.66rem; letter-spacing:.14em; text-transform:uppercase; color:var(--roxo-2); }
.pedido-c__rastreio code{
  flex:1 1 auto; min-width:0; overflow-wrap:anywhere;
  font-family:ui-monospace, Menlo, Consolas, monospace; font-size:.95rem; color:var(--ink);
}
.pedido-c__copiar{
  flex:none; min-height:34px; padding:.35rem .9rem; border-radius:999px; cursor:pointer;
  font:inherit; font-size:.78rem; font-weight:500; color:var(--ink);
  background:none; border:1px solid var(--line-2);
  transition:border-color var(--t1) linear;
}
.pedido-c__copiar:hover{ border-color:var(--roxo); }
.pedido-c__pix{ padding:.6rem 0 .3rem; gap:.65rem; }
.pedido-c__pixtit{ margin:0; font-size:.86rem; color:#ffd9a0; }

.conta__legenda{ margin:1.5rem 0 1.4rem; padding-top:1.1rem; border-top:1px solid var(--line); }
.conta__legenda h4{
  margin:0 0 .8rem; font-family:var(--sans); font-weight:500;
  font-size:.7rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3);
}
.conta__legenda ul{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:.6rem; }
.conta__legenda li{ display:flex; flex-wrap:wrap; align-items:baseline; gap:.3rem .6rem; font-size:.8rem; line-height:1.45; color:var(--ink-2); }

/* "Acompanhe em Meus pedidos", depois do pagamento. */
.pix__meus,
.aviso-pedido__link{ color:var(--roxo-2); font-size:.88rem; text-decoration:underline; text-underline-offset:3px; }
.pix__meus:hover,
.aviso-pedido__link:hover{ color:var(--ink); }
.aviso-pedido__link{ display:inline-block; margin-top:.6rem; }
@media (pointer:coarse){
  .conta__link{ padding:.75rem 0; }
  .pedido-c__copiar{ min-height:42px; }
}

/* Celular estreito com o Entrar no topo: logo, idioma, Entrar, sacola e
   menu na mesma linha. Os espaços encolhem para o menu manter os 44px de
   toque (sem isto ele era espremido para 27px). Abaixo de 371px não cabe:
   o Entrar sai do topo e fica o "Meus pedidos" dentro do menu. */
@media (max-width:440px){
  .nav{ gap:1rem; }
  .nav__conta{ margin-left:-.5rem; }
  .nav__sacola{ margin-left:-.5rem; }
  .nav .idioma ~ .nav__burger{ margin-left:-.5rem; }
  .nav__burger{ flex:none; }
}
@media (max-width:370px){
  .nav__conta{ display:none; }
}

/* ---------- celular: dois produtos por linha ----------
   O dono pediu: no celular a prateleira mostrava um aparelho por tela.
   Abaixo de 600px a grade fica em duas colunas e o card encolhe junto:
   menos respiro, foto mais baixa, resumo em duas linhas e preço em cima
   do "ver a ficha". O comparar vira só o quadradinho, que cabe no canto. */
@media (max-width:600px){
  .grid{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:.6rem; }
  .prod{ padding:.7rem .7rem .8rem; gap:.3rem; }
  .prod__art{ height:118px; margin-bottom:.35rem; border-radius:10px; }
  .prod__cat{ font-size:.56rem; letter-spacing:.12em; padding:.22rem .5rem; }
  .prod__name{ font-size:.98rem; }
  .prod__blurb{
    font-size:.8rem; line-height:1.4;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
  }
  .prod__unit{ font-size:.72rem; margin-top:.3rem; }
  .prod__foot{ flex-direction:column; align-items:flex-start; gap:.25rem; margin-top:.4rem; padding-top:.55rem; }
  .prod__foot b{ font-size:1rem; }
  .prod__abrir{ font-size:.66rem; letter-spacing:.12em; }
  .prod__cmp{ left:.45rem; top:.45rem; min-height:36px; min-width:36px; padding:.4rem; justify-content:center; }
  .prod__cmp span{ display:none; }
  .prod__selos{ top:.45rem; right:.45rem; }
  .prod__selo{ font-size:.54rem; padding:.22rem .42rem; letter-spacing:.1em; }
}

/* =========================================================
   SACOLA E ENTREGA NO CELULAR (set/2026)
   O dono: "a tela de pôr os dados está dando umas travadas no mobile"
   e "os botões de pagar com o valor ocupam metade da tela". Estava: o
   pé da sacola, preso, com o total, a primeira compra, o frete, os dois
   botões de pagar e uma nota de três linhas (366 px de 812), e com o
   teclado aberto sobravam uns 30 px de formulário. Agora o pé da etapa
   de dados é uma barra de uma linha (total + "Ir para o pagamento") que
   some com o teclado aberto e quando os botões de pagar já estão à
   vista. O resumo e a escolha do pagamento vão no fim do formulário.
   ========================================================= */

/* A rolagem da gaveta não passa para a página por trás, e o foco
   (Tab, Enter) não deixa o campo colado na borda. */
.sacola__corpo{ overscroll-behavior:contain; -webkit-overflow-scrolling:touch; scroll-padding:1rem 0 1.5rem; }

/* Com o teclado aberto, a gaveta tem a altura do que se vê (catalog.js
   escreve --vv-alt e --vv-topo a partir do visualViewport). */
.sacola.sacola--vv{ inset:auto 0 auto 0; top:var(--vv-topo, 0px); height:var(--vv-alt, 100%); }

/* O botão de fechar da gaveta está sobre fundo opaco: o desfoque dele
   não aparecia e custava uma camada a mais para o navegador. */
.sacola .sacola__x{ backdrop-filter:none; -webkit-backdrop-filter:none; }

/* No celular a gaveta cobre a tela inteira: a página por trás some em
   vez de ficar desfocada. O desfoque de 3px da página inteira era
   refeito a cada mudança de tamanho (o teclado abrindo e fechando).
   Ela some depois que a gaveta termina de entrar (0,52 s) e volta na
   hora em que a gaveta fecha. */
@media (max-width:640px){
  body:has(> .sacola:not([hidden])) :is(main, .foot, .nav, .stage, .scrollbar, .bandeja){
    filter:none; opacity:1; visibility:hidden;
    transition:visibility 0s linear .52s;
  }
}

/* ---------- pé da sacola: só o que decide a compra ---------- */
.sacola__pe{ gap:.45rem; padding-top:.85rem; padding-bottom:calc(.85rem + env(safe-area-inset-bottom)); }
.sacola__pe .sacola__pedir{ margin-top:.2rem; }
.sacola__mais{
  display:flex; flex-direction:column; align-items:center; gap:.65rem;
  padding:1.2rem 0 1.5rem; text-align:center;
}

/* A barra da etapa de dados: uma linha, uns 66 px. */
.sacola__pe.sacola__pe--barra{
  flex-direction:row; align-items:center; justify-content:space-between; gap:1rem;
  padding:.65rem clamp(1.2rem,4vw,1.8rem) calc(.65rem + env(safe-area-inset-bottom));
}
.sacola__pe--oculto{ display:none !important; }
.sacola__barra-total{ display:flex; flex-direction:column; min-width:0; line-height:1.15; }
.sacola__barra-total span{ font-size:.68rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3); }
.sacola__barra-total b{
  font-family:var(--display); font-weight:500; font-size:1.3rem; color:var(--ink);
  font-variant-numeric:tabular-nums; white-space:nowrap;
}
.sacola__irpagar{ flex:none; padding:.8rem 1.25rem; min-height:44px; }
.sacola__irpagar:disabled{ opacity:.6; cursor:progress; }

/* ---------- formulário da entrega ---------- */
.checkout{ gap:1.4rem; padding:.7rem 0 1.8rem; }
.checkout__grupo{
  margin:0; padding:0; border:0; min-width:0;
  display:flex; flex-direction:column; gap:.85rem;
}
/* `float` tira a legenda de cima da borda do fieldset: ela vira um
   item comum da coluna, e a linha que separa os grupos fica inteira. */
.checkout__grupo legend{
  float:left; width:100%; padding:0; margin:0;
  font-family:var(--display); font-weight:500; font-size:1.05rem; color:var(--ink);
}
.checkout__grupo + .checkout__grupo{ padding-top:1.3rem; border-top:1px solid var(--line); }
.campo > label{ color:var(--ink-3); font-size:.76rem; }
.campo__opc{ text-transform:lowercase; }
.campo input::placeholder{ color:rgba(168,162,187,.55); }
.campo input{ transition:border-color var(--t1) linear; }
.campo__erro{ font-size:.76rem; line-height:1.4; color:#ffb4b4; }
.campo__erro:empty{ display:none; }
/* Com erro, a dica sai e fica a mensagem: duas linhas embaixo do campo
   empurravam o formulário. */
.campo input[aria-invalid="true"] ~ .campo__dica{ display:none; }
.campo__cep{ display:flex; align-items:center; gap:.45rem; }
.campo__cep .pix__roda{ width:12px; height:12px; }
.campo__cep--achou{ color:#bfffd6; }
.campo__cep--falhou{ color:var(--ink-2); }

/* Resumo: a mesma conta que o servidor faz. */
.checkout__resumo{
  padding:1rem 1.1rem 1.05rem; border:1px solid var(--line); border-radius:16px;
  background:rgba(183,157,255,.04);
}
.checkout .checkout__resumo h4{
  margin:0 0 .65rem; font-family:var(--sans); font-size:.74rem; font-weight:500;
  letter-spacing:.2em; text-transform:uppercase; color:var(--roxo-2);
}
.checkout__contas{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:.4rem; font-size:.86rem; color:var(--ink-2); }
.checkout__contas li{ display:flex; justify-content:space-between; align-items:baseline; gap:1rem; }
.checkout__contas b{ font-family:var(--display); font-weight:500; color:var(--ink); font-variant-numeric:tabular-nums; white-space:nowrap; }
.checkout__contas .bom b, .checkout__contas b.bom{ color:#bfffd6; }
.checkout__total{
  display:flex; justify-content:space-between; align-items:baseline; gap:1rem;
  margin-top:.75rem; padding-top:.75rem; border-top:1px solid var(--line);
}
.checkout__total span{ font-size:.78rem; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-3); }
.checkout__total b{ font-family:var(--display); font-weight:500; font-size:1.5rem; color:var(--ink); font-variant-numeric:tabular-nums; }
.checkout__nota{ margin:.5rem 0 0; font-size:.76rem; line-height:1.45; color:var(--ink-3); }

/* Como pagar: dois cartões grandes, Pix em metal e cartão em linha. */
.checkout__pagar{ display:flex; flex-direction:column; gap:.75rem; }
.checkout__pagar:focus{ outline:none; }
.checkout .checkout__pagar h4{ margin:0; font-size:1.05rem; }
.checkout__metodos{ display:grid; gap:.65rem; }
.metodo{
  position:relative; width:100%; min-height:68px; padding:.95rem 3rem .95rem 1.2rem;
  display:flex; flex-direction:column; align-items:flex-start; justify-content:center; gap:.2rem;
  text-align:left; font:inherit; cursor:pointer; border-radius:16px;
  transition:transform .3s var(--ease-out), border-color var(--t1) linear, background-color var(--t1) linear;
}
.metodo__tit{ font:500 1rem/1.25 var(--sans); letter-spacing:.01em; }
.metodo__txt{ font-size:.8rem; line-height:1.4; }
.metodo__seta{
  position:absolute; right:1.2rem; top:50%; transform:translateY(-50%);
  font-size:1.1rem; line-height:1; transition:transform .3s var(--ease-out);
}
.metodo--pix{
  border:0; color:#f6f2ff; background:var(--metal);
  box-shadow:0 10px 30px -12px rgba(125,92,198,.75);
  text-shadow:0 1px 2px rgba(20,12,40,.45);
}
.metodo--pix .metodo__txt{ color:#ebe3ff; }
.metodo--cartao{ color:var(--ink); background:transparent; border:1px solid var(--line-2); }
.metodo--cartao .metodo__txt{ color:var(--ink-2); }
.metodo:hover:not(:disabled){ transform:translateY(-2px); }
.metodo:hover:not(:disabled) .metodo__seta{ transform:translate(4px,-50%); }
.metodo--cartao:hover:not(:disabled){ border-color:var(--roxo); background-color:var(--panel); }
.metodo:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:3px; }
.metodo:disabled{ opacity:.6; cursor:progress; }
.metodo[aria-busy="true"]{ opacity:1; }
.metodo[aria-busy="true"] .metodo__seta{
  width:16px; height:16px; margin-top:-8px; font-size:0; border-radius:50%; transform:none;
  border:2px solid rgba(255,255,255,.3); border-top-color:#fff;
  animation:pix-roda 1s linear infinite;
}
.checkout__confia{ margin:.1rem 0 0; font-size:.76rem; line-height:1.45; color:var(--ink-3); text-align:center; }
.checkout__confia a{ color:var(--roxo-2); text-decoration:underline; text-underline-offset:3px; }
.checkout__confia a:hover{ color:var(--ink); }
/* Erro da loja (Pix fora do ar, sem conexão): uma caixa logo acima dos
   botões de pagar, onde a pessoa está olhando. */
.checkout__pagar .checkout__erro{
  padding:.7rem .85rem; border-radius:12px;
  border:1px solid rgba(255,138,138,.5); background:rgba(255,138,138,.06);
}
@media (prefers-reduced-motion: reduce){
  .metodo, .metodo__seta{ transition:none; }
  .metodo[aria-busy="true"] .metodo__seta{ animation:none; }
}

/* ---------- ficha: fotos a mais e vídeo (catalog.js, midiaHTML) ----------
   Fileira de lado logo abaixo da capa. Ela vai até a borda da gaveta
   (margem negativa igual ao respiro do corpo), e cada item ocupa 82% da
   largura: o pedaço do seguinte aparecendo na direita é o que diz "arraste".
   A proporção é fixa (4:3, a mesma da capa do YouTube), então nada pula
   enquanto as fotos chegam. */
.ficha__midia{ margin:0 0 1.8rem; }
.midia{
  --respiro:clamp(1.3rem,4vw,2.6rem);
  display:flex; gap:.6rem;
  margin:0 calc(var(--respiro) * -1); padding:0 var(--respiro) .5rem;
  overflow-x:auto; overflow-y:hidden; overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory; scroll-padding-inline:var(--respiro);
  scrollbar-width:thin; scrollbar-color:rgba(183,157,255,.24) transparent;
}
.midia__item{
  position:relative; flex:0 0 82%; scroll-snap-align:start;
  aspect-ratio:4 / 3; border-radius:14px; overflow:hidden;
  border:1px solid var(--line); background:rgba(0,0,0,.3);
}
.midia__item--video{ background:#000; }
/* No computador a gaveta é larga: dois itens e um pedaço do terceiro. */
@media (min-width:641px){ .midia__item{ flex-basis:calc((100% - 1.2rem) / 2.35); } }
.midia__btn{
  display:block; width:100%; height:100%; padding:0; border:0; cursor:pointer;
  background:none; color:inherit; border-radius:inherit;
}
.midia__btn:focus-visible{ outline:2px solid var(--roxo-2); outline-offset:-3px; border-radius:13px; }
.midia__btn img, .midia__btn video{
  display:block; width:100%; height:100%; object-fit:cover; pointer-events:none;
  transition:transform var(--t2) var(--ease-out);
}
.midia__btn:hover img, .midia__btn:hover video{ transform:scale(1.04); }
.midia__player{ display:block; width:100%; height:100%; border:0; background:#000; object-fit:contain; }
/* Botão de tocar: bolinha em metal, como o botão principal. */
.midia__play{
  position:absolute; left:50%; top:50%; width:58px; height:58px; margin:-29px 0 0 -29px;
  border-radius:50%; background:var(--metal);
  box-shadow:0 10px 30px -12px rgba(125,92,198,.75), 0 0 0 6px rgba(9,9,12,.35);
  transition:transform var(--t2) var(--ease-out);
}
.midia__play::after{
  content:""; position:absolute; left:23px; top:19px;
  border-style:solid; border-width:10px 0 10px 16px;
  border-color:transparent transparent transparent #f2ecff;
}
.midia__btn:hover .midia__play{ transform:scale(1.06); }
@media (hover:none){ .midia{ scrollbar-width:none; } .midia::-webkit-scrollbar{ display:none; } }

/* ---------- as fotos em tela cheia (catalog.js, abrirLuz) ----------
   Por cima da ficha e da sacola, abaixo só da porta de idade. Três
   faixas: o X em cima, a foto no meio (inteira, `contain`) e embaixo as
   setas com o contador, que assim nunca cobrem a foto. */
.luz{ position:fixed; inset:0; z-index:97; background:#060509; }
.luz__caixa{
  display:grid; grid-template-rows:auto minmax(0,1fr) auto;
  width:100%; height:100%;
}
.luz__caixa:focus{ outline:none; }
.luz__topo{ display:flex; justify-content:flex-end; padding:.8rem .8rem 0; }
.luz .luz__x{ position:static; float:none; margin:0; }
.luz__trilho{
  display:flex; min-height:0; overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x mandatory; overscroll-behavior:contain;
  touch-action:pan-x pinch-zoom; scrollbar-width:none;
}
.luz__trilho::-webkit-scrollbar{ display:none; }
.luz__slide{
  flex:0 0 100%; min-width:0; scroll-snap-align:center; scroll-snap-stop:always;
  display:flex; align-items:center; justify-content:center;
  padding:1rem clamp(.6rem,3vw,2rem);
}
.luz__slide img{ display:block; max-width:100%; max-height:100%; width:auto; height:auto; object-fit:contain; border-radius:10px; }
.luz__pe{
  display:flex; align-items:center; justify-content:center; gap:1.2rem;
  padding:.4rem 1rem calc(1rem + env(safe-area-inset-bottom, 0px));
}
.luz__n{
  min-width:4.5rem; text-align:center; font-family:var(--display); font-size:.95rem;
  color:var(--ink-2); font-variant-numeric:tabular-nums; letter-spacing:.06em;
}
.luz__seta{
  width:48px; height:48px; display:grid; place-items:center; cursor:pointer;
  font-size:1.6rem; line-height:1; color:var(--ink);
  background:rgba(24,22,31,.85); border:1px solid var(--line-2); border-radius:50%;
  transition:border-color var(--t1), transform var(--t2) var(--ease-out), opacity var(--t1);
}
.luz__seta:hover{ border-color:var(--roxo); transform:translateY(-2px); }
.luz__seta[aria-disabled="true"]{ opacity:.3; cursor:default; transform:none; border-color:var(--line); }
.luz--uma .luz__seta{ visibility:hidden; }
@media (prefers-reduced-motion: reduce){
  .midia__btn img, .midia__btn video, .midia__play, .luz__seta{ transition:none; }
}

/* ---------- compras recentes (compras.js): so pedido pago de verdade ---------- */
.compras__lista{
  list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:.8rem;
}
.compra{
  display:flex; align-items:center; gap:.85rem; padding:.75rem .9rem;
  border:1px solid var(--line); border-radius:14px; background:var(--panel);
  color:var(--ink); text-decoration:none; min-width:0;
  transition:border-color .25s, background .25s;
}
a.compra[href]:hover{ border-color:var(--line-2); background:rgba(183,157,255,.08); }
.compra__foto{
  flex:0 0 52px; width:52px; height:52px; border-radius:10px; overflow:hidden;
  display:grid; place-items:center; background:rgba(183,157,255,.08);
  font-family:var(--display); color:var(--roxo-2); font-size:1.2rem;
}
.compra__foto img{ width:100%; height:100%; object-fit:contain; }
.compra__txt{ display:flex; flex-direction:column; gap:.1rem; min-width:0; font-size:.86rem; line-height:1.35; }
.compra__txt b{ font-weight:600; color:var(--ink); }
.compra__txt span{ color:var(--ink-2); overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
.compra__txt small{ color:var(--ink-3); font-size:.74rem; }

.compra-aviso{
  position:fixed; left:1rem; bottom:1rem; z-index:58;
  width:min(340px, calc(100vw - 2rem));
  display:flex; align-items:flex-start;
  border-radius:16px; background:rgba(16,13,24,.96);
  border:1px solid var(--line-2); box-shadow:0 18px 50px -18px rgba(0,0,0,.9);
  backdrop-filter:blur(14px);
  opacity:0; transform:translateY(14px);
  transition:opacity .4s var(--ease-io, ease), transform .5s cubic-bezier(.16,1,.3,1);
  pointer-events:none;
}
.compra-aviso.is-on{ opacity:1; transform:none; pointer-events:auto; }
.compra-aviso--alto{ bottom:4.2rem; }
.compra-aviso .compra{ flex:1; border:0; background:none; padding:.7rem .4rem .7rem .75rem; }
.compra-aviso .compra__foto{ flex-basis:46px; width:46px; height:46px; }
.compra-aviso__x{
  flex:0 0 auto; width:34px; height:34px; margin:.3rem .3rem 0 0; border:0; border-radius:50%;
  background:none; color:var(--ink-3); font-size:1.2rem; line-height:1; cursor:pointer;
}
.compra-aviso__x:hover{ color:var(--ink); background:rgba(183,157,255,.1); }
@media (max-width:600px){
  .compra-aviso{ left:.75rem; right:.75rem; bottom:.75rem; width:auto; }
  .compras__lista{ grid-template-columns:1fr; }
}
@media (prefers-reduced-motion: reduce){ .compra-aviso{ transition:none; transform:none; } }
