/* =========================================================
   GLOBAL DISTRIBUIDORA, Design System v3
   Branco + azul elétrico · ilha flutuante · marca real
   ========================================================= */

:root{
  --bg:#FFFFFF;
  --bg-grad:#F4F7FC;
  --bg-soft:#F4F7FC;
  --surface:#FFFFFF;
  --surface-2:#F0F4FA;
  --border:#E4E9F2;
  --border-soft:#EEF2F8;

  --accent:#0E5AE6;       /* azul elétrico primário */
  --accent-hi:#2E74FF;    /* hover */
  --accent-ink:#FFFFFF;   /* texto sobre azul */
  --blue-deep:#0A2E86;
  --navy:#0A2447;
  --blue-soft:#EAF1FE;

  --ok:#12B76A;
  --ok-dim:#E6F7EF;

  --ink:#0F1A2E;
  --ink-2:#566079;
  --ink-3:#8A93A6;

  --radius:16px;
  --radius-sm:12px;
  --shadow:0 6px 24px rgba(16,40,80,.08);
  --shadow-sm:0 3px 12px rgba(16,40,80,.06);
  --glow:0 10px 30px rgba(14,90,230,.18);

  --maxw:1200px;
  --font-d:'Sora',system-ui,sans-serif;
  --font-b:'Inter',system-ui,sans-serif;
}

/* =========================================================
   A RÉGUA — matemática de design (09/07/2026)
   Antes disso o site tinha 52 tamanhos de fonte (incluindo meio-pixel:
   12.5px usado 25×) e 57 valores de espaçamento. Não era um sistema,
   era sedimento. Aqui ficam as ÚNICAS medidas permitidas.

   LEI: código novo usa var(--fs-*) e var(--sp-*). Número solto em
   font-size/padding/margin/gap/border-radius é reprovado pelo
   `node _dev/gate-regua.js`.

   Não normalizado de propósito (o gate conhece as exceções):
   - font-size > 56px  → display/assinatura (marquee, 404, chrome do hero)
   - espaço > 48px     → calibragem de colisão (folga do CNPJ no rodapé,
                          cenas do menu e do hero derivadas de --mw)
   - border-width      → `0 0 13px 13px` é triângulo em CSS, não traço
   ========================================================= */
:root{
  /* tipografia — razão ~1.2, ancorada no corpo de 16px.
     8/10px existem só pro micro-lettering de rua (comanda, plaqueta, selo). */
  --fs-4xs:8px;   --fs-3xs:10px;  --fs-2xs:11px;  --fs-xs:12px;
  --fs-sm:14px;   --fs-base:16px; --fs-lg:18px;   --fs-xl:20px;
  --fs-2xl:24px;  --fs-3xl:30px;  --fs-4xl:36px;  --fs-5xl:44px;
  --fs-6xl:56px;  --fs-7xl:72px;  --fs-8xl:96px;  --fs-9xl:128px;

  /* espaço — base 4. --sp-hair é o fio de 2px (fresta, lamela). */
  --sp-hair:2px;  --sp-1:4px;   --sp-2:8px;   --sp-3:12px;  --sp-4:16px;
  --sp-5:20px;    --sp-6:24px;  --sp-8:32px;  --sp-10:40px; --sp-12:48px;
  --sp-16:64px;   --sp-20:80px; --sp-24:96px; --sp-32:128px;

  /* raio — --r-full é a pílula (antes havia 99px E 999px pra mesma coisa) */
  --r-2xs:2px; --r-xs:4px; --r-sm:8px; --r-md:12px; --r-lg:16px;
  --r-xl:24px; --r-full:999px;

  /* traço */
  --bw-1:1px; --bw-2:2px; --bw-3:3px;
}

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  font-family:var(--font-b);
  background:var(--bg);
  color:var(--ink);
  font-size:16px;
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
h1,h2,h3,h4{font-family:var(--font-d);font-weight:800;line-height:1.08;letter-spacing:-.02em;color:var(--ink)}
::selection{background:var(--accent);color:#fff}
svg{display:block}

.wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}
.eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent);margin-bottom:16px;
}
.eyebrow::before{content:"";width:22px;height:2px;background:var(--accent);border-radius:2px}
.muted{color:var(--ink-2)}

/* ---------- LOGO (assets reais) ---------- */
.logo-wrap{display:inline-flex;align-items:center;line-height:0;flex-shrink:0}
.logo-img{height:42px;width:auto;display:block;transition:opacity .15s}
.logo-wrap:hover .logo-img{opacity:.85}
.logo-img.foot{height:120px}
.logo-img.side{height:48px;margin-bottom:8px}
@media(max-width:520px){.logo-img{height:34px}}
@media(max-width:560px){.logo-img.foot{height:96px}}

/* ---------- botões ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:16px 24px;border-radius:var(--radius-sm);
  font-weight:600;font-size:16px;
  transition:transform .15s ease, box-shadow .2s ease, background .2s ease;
  white-space:nowrap;
}
.btn-primary{background:var(--accent);color:#fff;box-shadow:0 6px 16px rgba(14,90,230,.20)}
.btn-primary:hover{background:var(--accent-hi);transform:translateY(-2px);box-shadow:0 10px 30px rgba(14,90,230,.32)}
.btn-ghost{border:1px solid var(--border);color:var(--ink);background:#fff}
.btn-ghost:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-2px)}
.btn:active{transform:translateY(0) scale(.98)}
.btn-block{width:100%}
.btn-lg{padding:16px 32px;font-size:16px}
.btn-sm{padding:12px 16px;font-size:14px}
.btn svg{width:18px;height:18px;flex-shrink:0}
@media(max-width:560px){.btn{white-space:normal;text-align:center}}

/* ---------- badges ---------- */
.badge{
  display:inline-flex;align-items:center;gap:8px;
  font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  padding:4px 12px;border-radius:999px;
}
.badge-accent{background:var(--blue-soft);color:var(--accent)}
.badge-ok{background:var(--ok-dim);color:var(--ok)}
.badge-dark{background:var(--surface-2);color:var(--ink-2);border:1px solid var(--border)}
.dot-ok{width:7px;height:7px;border-radius:50%;background:var(--ok)}

/* =========================================================
   HEADER, ILHA FLUTUANTE (pílula de vidro)
   ⚠️ LEGADO — APOSENTADA NA R4 (09/07/2026).
   Nenhuma página de cliente usa mais `.nav-island`, `.burger` nem
   `.mobile-menu`: a navegação virou o HUD + porta-menu (bloco "R4 · MODO
   RADICAL", no fim deste arquivo). Estes seletores continuam aqui só porque
   os labs históricos (lab-hero-3..8.html) têm o markup da ilha e ainda
   precisam renderizar. Não estender; não usar em página nova.
   ========================================================= */
.nav-island{
  position:fixed;top:14px;left:50%;transform:translateX(-50%) translateZ(0);z-index:120;
  width:min(1180px,calc(100% - 24px));
  background:rgba(255,255,255,.8);
  -webkit-backdrop-filter:blur(12px) saturate(1.4);
  backdrop-filter:blur(12px) saturate(1.4);
  border:1px solid rgba(255,255,255,.75);
  box-shadow:0 6px 30px rgba(10,36,71,.12), inset 0 1px 0 rgba(255,255,255,.85);
  border-radius:999px;
  will-change:top;
  transition:top .25s ease, box-shadow .25s ease, background .25s ease;
}
.nav-island.scrolled{
  top:8px;
  background:rgba(255,255,255,.92);
  box-shadow:0 14px 40px rgba(10,36,71,.18), inset 0 1px 0 rgba(255,255,255,.9);
}
.nav-island .nav{display:flex;align-items:center;gap:20px;height:62px;padding:0 12px 0 24px}
.nav-links{display:flex;gap:4px;margin:0 auto}
.nav-links a{
  font-size:14px;color:var(--ink-2);font-weight:600;
  padding:8px 16px;border-radius:999px;transition:.18s;
}
.nav-links a:hover{color:var(--ink);background:rgba(14,90,230,.07)}
.nav-links a.active{color:var(--accent);background:var(--blue-soft)}
.nav-right{display:flex;align-items:center;gap:8px;flex-shrink:0}
.icon-btn{
  width:42px;height:42px;border-radius:999px;
  display:flex;align-items:center;justify-content:center;color:var(--ink-2);
  transition:.15s;position:relative;background:transparent;border:none;
}
.icon-btn:hover{color:var(--accent);background:var(--blue-soft)}
.icon-btn svg{width:20px;height:20px}
.cart-count{
  position:absolute;top:2px;right:0;background:var(--accent);color:#fff;
  font-size:11px;font-weight:700;min-width:18px;height:18px;border-radius:999px;
  display:none;align-items:center;justify-content:center;padding:0 4px;
  box-shadow:0 3px 8px rgba(14,90,230,.4);
}
.burger{display:none;flex-direction:column;gap:4px;width:42px;height:42px;border-radius:999px;align-items:center;justify-content:center}
.burger span{width:17px;height:2px;background:var(--ink);border-radius:2px;transition:.2s}
.burger.x span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.burger.x span:nth-child(2){opacity:0}
.burger.x span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
@media(max-width:940px){
  .nav-links{display:none}
  .burger{display:flex}
  .nav-island .nav{height:56px;padding:0 8px 0 20px}
}

/* menu mobile (injetado pelo main.js) */
.mobile-menu{
  position:fixed;top:82px;left:12px;right:12px;z-index:118;
  background:#fff;border-radius:24px;border:1px solid var(--border-soft);
  box-shadow:0 30px 70px rgba(10,36,71,.28);
  padding:12px;display:none;
}
.mobile-menu.open{display:block;animation:mm .22s ease}
@keyframes mm{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.mobile-menu a{
  display:flex;align-items:center;justify-content:space-between;
  padding:16px 16px;border-radius:16px;font-weight:600;font-size:16px;color:var(--ink);
}
.mobile-menu a svg{width:16px;height:16px;color:var(--ink-3);flex-shrink:0}
.mobile-menu a:hover{background:var(--blue-soft);color:var(--accent)}
.mobile-menu .mm-wa svg{width:18px;height:18px;color:#57D97E}
.mobile-menu .mm-wa{
  margin-top:8px;background:var(--navy);color:#fff;justify-content:center;gap:12px;
}
.mobile-menu .mm-wa:hover{background:var(--blue-deep);color:#fff}

/* offset do conteúdo sob a ilha */
.page-pad{padding-top:112px}
@media(max-width:940px){.page-pad{padding-top:96px}}

/* =========================================================
   BUSCA, overlay
   ========================================================= */
.search-overlay{
  position:fixed;inset:0;z-index:220;display:none;
  background:rgba(7,20,48,.5);
  -webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);
  align-items:flex-start;justify-content:center;padding:96px 20px 32px;
}
.search-overlay.open{display:flex}
.search-panel{
  width:min(620px,100%);background:#fff;border-radius:24px;overflow:hidden;
  box-shadow:0 46px 110px rgba(3,10,30,.5);
  animation:sp .2s ease;
}
@keyframes sp{from{opacity:0;transform:translateY(-10px) scale(.98)}to{opacity:1;transform:none}}
.search-head{display:flex;align-items:center;gap:12px;padding:20px 20px;border-bottom:1px solid var(--border)}
.search-head svg{width:20px;height:20px;color:var(--accent);flex-shrink:0}
.search-head input{flex:1;border:none;outline:none;font-size:18px;font-family:inherit;color:var(--ink);background:transparent}
.search-head input::placeholder{color:var(--ink-3)}
.search-close{width:32px;height:32px;border-radius:12px;background:var(--surface-2);color:var(--ink-2);font-size:14px;font-weight:700;flex-shrink:0}
.search-close:hover{background:var(--blue-soft);color:var(--accent)}
.search-results{max-height:430px;overflow:auto;padding:12px}
.search-label{font-size:12px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);padding:8px 12px 8px}
.s-item{display:flex;align-items:center;gap:16px;padding:12px 12px;border-radius:16px;cursor:pointer}
.s-item:hover{background:var(--blue-soft)}
.s-item .s-ic{width:44px;height:44px;border-radius:12px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;color:#4E7FE0;flex-shrink:0}
.s-item .s-ic svg{width:26px;height:26px}
.s-item .s-tx{min-width:0}
.s-item b{display:block;font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.s-item span{font-size:12px;color:var(--ink-3)}
.s-item .s-price{margin-left:auto;font-family:var(--font-d);font-weight:800;font-size:14px;white-space:nowrap;color:var(--ink)}
/* chips rápidos na busca (upgrade da busca existente) */
.gd-schips{display:flex;gap:8px;flex-wrap:wrap;padding:8px 12px 12px}
.gd-schip{padding:8px 16px;border-radius:999px;border:1px solid var(--border);background:#fff;
  font-size:14px;font-weight:600;color:var(--ink-2);cursor:pointer;font-family:var(--font-b);transition:.15s}
.gd-schip:hover{border-color:var(--accent);color:var(--accent);background:var(--blue-soft)}
.search-empty{text-align:center;padding:24px 20px 32px}
.search-empty img{height:150px;margin:0 auto 12px}
.search-empty h4{font-size:16px;margin-bottom:8px}
.search-empty p{font-size:14px;color:var(--ink-2);margin-bottom:16px}

/* =========================================================
   TOAST (feedback do carrinho)
   ========================================================= */
.toast{
  position:fixed;left:50%;bottom:24px;z-index:300;
  transform:translateX(-50%) translateY(16px);
  background:var(--navy);color:#fff;
  padding:12px 16px 12px 20px;border-radius:16px;
  display:flex;gap:16px;align-items:center;
  box-shadow:0 20px 50px rgba(4,16,44,.45);
  opacity:0;pointer-events:none;transition:.28s ease;
  font-size:14px;max-width:calc(100% - 32px);
}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto}
.toast .t-ok{width:22px;height:22px;border-radius:50%;background:var(--ok);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.toast .t-ok svg{width:12px;height:12px;color:#fff}
.toast a{color:#8FC4FF;font-weight:700;white-space:nowrap}

/* =========================================================
   HERO
   ========================================================= */
.hero{
  position:relative;overflow:hidden;
  background:
    radial-gradient(1100px 460px at 82% -10%, rgba(14,90,230,.1), transparent 62%),
    linear-gradient(180deg,#fff,var(--bg-soft));
  border-bottom:1px solid var(--border);
}
.hero .wrap{display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center;padding-top:104px;padding-bottom:70px}
.hero .wrap>*{min-width:0}
.hero h1{font-size:clamp(36px,4.6vw,56px);margin-bottom:24px;overflow-wrap:break-word}
.hero h1 em{font-style:normal;color:var(--accent)}
.hero p.lead{font-size:18px;color:var(--ink-2);max-width:520px;margin-bottom:32px}
.hero-cta{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:32px}
.hero-trust{display:flex;gap:24px;flex-wrap:wrap}
.hero-trust .ht{display:flex;flex-direction:column}
.hero-trust .ht b{font-family:var(--font-d);font-size:24px;font-weight:800;color:var(--ink)}
.hero-trust .ht span{font-size:12px;color:var(--ink-3)}
.hero-trust .ht-mob{display:none}
@media(max-width:900px){.hero-trust .ht-mob{display:flex}.hero-trust .ht-mob b{font-size:16px;color:var(--ok)}}

.hero-visual{position:relative;height:430px}
.hero-card{
  position:absolute;background:var(--surface);border:1px solid var(--border);
  border-radius:var(--radius);box-shadow:var(--shadow);padding:20px;
}
.hero-card.main{inset:0;border:none;overflow:hidden;background:#0A2153;
  box-shadow:0 24px 60px rgba(10,46,134,.35)}

/* ---------- HERO · foto de showroom seca + boneco + sombreado (versão calma) ---------- */
.hero-scene{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;border-radius:inherit}
/* foto real da loja de Santos ocupando o fundo inteiro, seca (sem piso/listra) */
.hs-photo{position:absolute;inset:0;background:url('../img/loja-santos.jpg') 50% 38%/cover;
  filter:brightness(.8) contrast(1.05) saturate(1.04)}
/* leve sombreado embaixo — aterra o boneco e dá leitura pro preço/badges */
.hs-shade{position:absolute;inset:0;background:
  linear-gradient(to top,rgba(4,10,32,.72),rgba(5,12,40,.16) 38%,transparent 58%)}
.hero-badges{position:absolute;top:18px;left:18px;right:18px;z-index:3;display:flex;justify-content:space-between;align-items:flex-start}
.hero-card.main::after{content:"";position:absolute;left:50%;bottom:3%;transform:translateX(-50%);width:58%;height:12%;border-radius:50%;background:radial-gradient(closest-side,rgba(2,8,26,.6),transparent 74%);z-index:0;filter:blur(5px)}
.hero-mascote{position:absolute;bottom:0;left:50%;transform:translateX(-50%);height:96%;width:auto;object-fit:contain;object-position:bottom;z-index:1;filter:drop-shadow(0 16px 20px rgba(6,20,54,.42))}
.hero-price-tag{position:absolute;right:15px;bottom:15px;z-index:3;display:flex;align-items:center;gap:12px;text-align:left;max-width:72%;background:rgba(6,24,72,.52);backdrop-filter:blur(7px);padding:8px 16px;border-radius:12px;box-shadow:0 8px 18px rgba(6,20,54,.32);border:1px solid rgba(255,255,255,.16)}
.hpt-thumb{width:54px;height:54px;border-radius:12px;background:#fff;padding:4px;flex-shrink:0}
.hpt-thumb img{width:100%;height:100%;object-fit:contain}
.hpt-tx{min-width:0}
.hpt-name{font-family:var(--font-d);font-weight:700;font-size:14px;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hpt-price{display:flex;align-items:baseline;gap:8px;justify-content:flex-start;margin-top:2px}
.hpt-price b{font-family:var(--font-d);font-size:20px;font-weight:800;color:#fff;letter-spacing:-.02em}
.hpt-price span{color:#9FE8C3;font-size:12px;font-weight:600}
.hero-card.main .badge-accent{background:rgba(255,255,255,.2);color:#fff}
.hero-card.main .badge-ok{background:rgba(255,255,255,.2);color:#fff}
.hero-card.main .badge-ok .dot-ok{background:#7CF0B4}
.hero-card.chip{
  width:210px;padding:16px 16px;bottom:-18px;left:-24px;
  display:flex;align-items:center;gap:12px;background:#fff;box-shadow:var(--shadow);
}
.hero-card.chip .ci{width:40px;height:40px;border-radius:12px;background:var(--ok-dim);color:var(--ok);display:flex;align-items:center;justify-content:center}
.hero-card.chip .ci svg{width:19px;height:19px}
.hero-card .ct b{display:block;font-size:14px;color:var(--ink);font-family:var(--font-d)}
.hero-card .ct span{font-size:12px;color:var(--ink-3)}
@media(max-width:900px){
  .hero .wrap{grid-template-columns:1fr;gap:40px;padding-top:118px}
  .hero-visual{height:330px;order:-1}
  .hero-card.chip{display:none}
  .hero-price-tag{right:10px;bottom:10px;padding:8px 12px;max-width:82%;gap:8px}
  .hero-price-tag .hpt-thumb{width:42px;height:42px}
  .hpt-price b{font-size:16px}
  .hero-mascote{height:99%}
  .hero h1{font-size:30px}
  .hero p.lead{font-size:16px}
}

/* ---------- HERO · produto vivo (retoque, volume baixo) ---------- */
/* luz de estúdio que segue o cursor (--mx/--my setados via JS) */
.hero-card.main{--mx:62%;--my:16%}
.hero-card.main::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;mix-blend-mode:screen;
  background:radial-gradient(300px 240px at var(--mx) var(--my),rgba(255,255,255,.18),transparent 70%);
  transition:background .12s linear}

/* bolhas/espuma subindo atrás do mascote */
.hero-bubbles{position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none}
.hero-bubbles i{position:absolute;bottom:-20px;border-radius:50%;opacity:0;
  background:radial-gradient(circle at 32% 30%,rgba(255,255,255,.85),rgba(255,255,255,.14) 60%,transparent 72%)}
.hero-bubbles i:nth-child(1){left:26%;width:9px;height:9px;--x:10px;animation:heroRise 8s ease-in 0s infinite}
.hero-bubbles i:nth-child(2){left:40%;width:6px;height:6px;--x:-8px;animation:heroRise 9.5s ease-in 1.6s infinite}
.hero-bubbles i:nth-child(3){left:52%;width:12px;height:12px;--x:12px;animation:heroRise 7.5s ease-in 3s infinite}
.hero-bubbles i:nth-child(4){left:63%;width:7px;height:7px;--x:-6px;animation:heroRise 10s ease-in 4.2s infinite}
.hero-bubbles i:nth-child(5){left:72%;width:5px;height:5px;--x:9px;animation:heroRise 8.5s ease-in 2.2s infinite}
.hero-bubbles i:nth-child(6){left:34%;width:8px;height:8px;--x:-10px;animation:heroRise 9s ease-in 5.4s infinite}
@keyframes heroRise{0%{transform:translateY(0) translateX(0);opacity:0}12%{opacity:.7}70%{opacity:.5}100%{transform:translateY(-330px) translateX(var(--x));opacity:0}}

/* selo "Mais vendido" com micro-pulse discreto */
.hero-card.main .badge-accent{position:relative;animation:heroBadge 2.8s ease-in-out infinite}
.hero-card.main .badge-accent::after{content:"";position:absolute;inset:0;border-radius:999px;border:1.5px solid rgba(255,255,255,.6);opacity:0;animation:heroBadgeRing 2.8s ease-out infinite}
@keyframes heroBadge{0%,100%{transform:scale(1)}50%{transform:scale(1.04)}}
@keyframes heroBadgeRing{0%{opacity:.5;transform:scale(1)}70%,100%{opacity:0;transform:scale(1.3)}}

/* price tag: tilt 3D no mouse (transform via JS) */
.hero-price-tag{transition:transform .35s cubic-bezier(.2,.8,.3,1);transform-style:preserve-3d;will-change:transform}

/* thumb do produto: brilho de estúdio passando + gotas hidrofóbicas escorrendo */
.hpt-thumb{position:relative;overflow:hidden}
.hpt-gloss{position:absolute;top:-20%;left:-70%;width:48%;height:140%;pointer-events:none;
  background:linear-gradient(105deg,transparent,rgba(255,255,255,.8),transparent);transform:skewX(-16deg);
  opacity:0;animation:hptGloss 5s ease-in-out infinite}
@keyframes hptGloss{0%,20%{left:-70%;opacity:0}32%{opacity:.9}46%,100%{left:180%;opacity:0}}
.hpt-drop{position:absolute;border-radius:50%;pointer-events:none;opacity:0;
  background:radial-gradient(circle at 34% 28%,rgba(255,255,255,.95),rgba(255,255,255,.25) 42%,rgba(120,150,200,.14) 70%,transparent 78%);
  box-shadow:inset -1px -1px 2px rgba(30,60,120,.25)}
.hpt-drop.d1{width:6px;height:6px;left:24%;top:18%;animation:hptDrop 5.5s ease-in .5s infinite}
.hpt-drop.d2{width:4px;height:4px;left:60%;top:30%;animation:hptDrop 6s ease-in 2s infinite}
.hpt-drop.d3{width:5px;height:5px;left:42%;top:50%;animation:hptDrop 6.5s ease-in 3.4s infinite}
@keyframes hptDrop{0%{opacity:0;transform:translateY(0) scale(.6)}14%{opacity:.9;transform:translateY(0) scale(1)}55%{opacity:.9;transform:translateY(0) scale(1)}100%{opacity:0;transform:translateY(26px) scale(.85)}}

/* botão "Ver a loja": seta cutucando */
.btn-arw{display:inline-block;animation:btnArw 2s ease-in-out infinite}
@keyframes btnArw{0%,100%{transform:translateX(0)}45%{transform:translateX(4px)}}

/* =========================================================
   HERO · assinatura Global — placas chanfradas + malha técnica
   O canto cortado ecoa o wordmark angular da marca; a malha
   ecoa o piso de LED do showroom de Santos (a foto do card).
   Grande continua macio (cards), pequeno vira "peça" (chanfro).
   Escopo section.hero: só a home (CRM tem .hero próprio em div).
   ========================================================= */

/* malha técnica no fundo, concentrada atrás do card e sumindo nas bordas */
section.hero::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:
    linear-gradient(to right,rgba(14,90,230,.07) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(14,90,230,.07) 1px,transparent 1px);
  background-size:44px 44px;
  -webkit-mask-image:radial-gradient(760px 560px at 74% 46%,#000,transparent 72%);
          mask-image:radial-gradient(760px 560px at 74% 46%,#000,transparent 72%);
}
@media(max-width:900px){
  section.hero::before{
    -webkit-mask-image:radial-gradient(480px 420px at 60% 26%,#000,transparent 74%);
            mask-image:radial-gradient(480px 420px at 60% 26%,#000,transparent 74%);
  }
}

/* eyebrow → etiqueta de sistema (placa com canto cortado + LED) */
section.hero .eyebrow{
  background:var(--blue-soft);border:1px solid rgba(14,90,230,.18);
  padding:8px 16px 8px 12px;gap:8px;margin-bottom:20px;
  clip-path:polygon(0 0,calc(100% - 12px) 0,100% 12px,100% 100%,0 100%);
}
section.hero .eyebrow::before{
  width:6px;height:6px;border-radius:2px;background:var(--accent);
  box-shadow:0 0 8px rgba(14,90,230,.55);
  flex-shrink:0;
}
@media(max-width:560px){
  section.hero .eyebrow{font-size:11px;letter-spacing:.08em;padding:8px 12px 8px 12px;gap:8px;white-space:nowrap}
}

/* selos do card (Mais vendido / Em estoque) → placas de inspeção */
section.hero .hero-badges .badge{
  border-radius:0;padding:8px 12px;
  clip-path:polygon(0 0,calc(100% - 10px) 0,100% 10px,100% 100%,0 100%);
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
section.hero .hero-badges .badge-ok{
  clip-path:polygon(10px 0,100% 0,100% 100%,0 100%,0 10px);
}
section.hero .hero-card.main .badge-accent::after{
  border-radius:0;
  clip-path:polygon(0 0,calc(100% - 10px) 0,100% 10px,100% 100%,0 100%);
}

/* etiqueta de preço → placa chanfrada (sombra via filter pra seguir o corte) */
section.hero .hero-price-tag{
  border-radius:0;padding:12px 20px 12px 16px;box-shadow:none;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 12px),calc(100% - 12px) 100%,0 100%);
  filter:drop-shadow(0 8px 18px rgba(6,20,54,.35));
}
section.hero .hpt-thumb{border-radius:4px}

/* chip "Compra protegida" → placa parafusada no canto do card */
section.hero .hero-card.chip{
  border-radius:0;border:1px solid var(--border);box-shadow:none;
  clip-path:polygon(0 0,100% 0,100% 100%,14px 100%,0 calc(100% - 14px));
  filter:drop-shadow(0 10px 24px rgba(16,40,80,.16));
}
section.hero .hero-card.chip .ci{
  border-radius:0;
  clip-path:polygon(0 0,calc(100% - 8px) 0,100% 8px,100% 100%,0 100%);
}

/* CTAs do hero → mesma família de placa (chanfro no canto de baixo) */
section.hero .hero-cta .btn{
  border-radius:0;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 13px),calc(100% - 13px) 100%,0 100%);
}
section.hero .hero-cta .btn-primary{
  box-shadow:none;filter:drop-shadow(0 6px 16px rgba(14,90,230,.28));
}
section.hero .hero-cta .btn-primary:hover{
  box-shadow:none;filter:drop-shadow(0 10px 26px rgba(14,90,230,.40));
}

/* régua de confiança → ficha técnica (hairline por item, 1º em azul) */
section.hero .hero-trust{gap:0;row-gap:16px}
section.hero .hero-trust .ht{border-left:2px solid var(--border);padding:2px 16px 2px 12px}
section.hero .hero-trust .ht b{font-size:20px}
section.hero .hero-trust .ht span{font-size:12px}
section.hero .hero-trust .ht:first-child{border-left-color:var(--accent)}

/* =========================================================
   HERO DARK · pivô "pegada jovem / preto e azul" (Renan, 08/07)
   PROVA de direção — escopo só a home (section.hero). NÃO toca
   :root nem o resto do site; o branco continua no resto até
   aprovar. Reverter = apagar este bloco inteiro.
   ========================================================= */
section.hero{
  background:
    radial-gradient(1150px 520px at 80% -12%, rgba(26,79,224,.32), transparent 60%),
    radial-gradient(820px 480px at 4% 116%, rgba(34,211,238,.10), transparent 58%),
    linear-gradient(180deg,#070B14 0%,#080D1E 100%);
  border-bottom:1px solid rgba(255,255,255,.07);
}
/* malha técnica: azul-claro pra respirar no escuro */
section.hero::before{
  background:
    linear-gradient(to right,rgba(96,160,255,.07) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(96,160,255,.07) 1px,transparent 1px);
  background-size:44px 44px;
}
/* texto claro */
section.hero h1{color:#fff}
section.hero h1 em{color:#3B8CFF;text-shadow:0 0 24px rgba(59,140,255,.35)}
section.hero p.lead{color:#AEB8D4}
/* etiqueta de sistema → vidro azul */
section.hero .eyebrow{
  background:rgba(26,79,224,.16);border:1px solid rgba(96,160,255,.28);color:#8FB8FF;
}
section.hero .eyebrow::before{background:#5EA0FF;box-shadow:0 0 10px rgba(94,160,255,.8)}
/* ficha de confiança */
section.hero .hero-trust .ht{border-left-color:rgba(255,255,255,.14)}
section.hero .hero-trust .ht b{color:#fff}
section.hero .hero-trust .ht span{color:#8A95B4}
section.hero .hero-trust .ht:first-child{border-left-color:#3B8CFF}
/* botão fantasma no escuro */
section.hero .hero-cta .btn-ghost{
  color:#fff;border:1px solid rgba(255,255,255,.22);background:rgba(255,255,255,.03);
}
section.hero .hero-cta .btn-ghost:hover{
  border-color:rgba(255,255,255,.5);background:rgba(255,255,255,.07)
}
/* chip flutuante → placa de vidro escuro */
section.hero .hero-card.chip{
  background:rgba(15,25,48,.72);border:1px solid rgba(255,255,255,.1);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  filter:drop-shadow(0 14px 30px rgba(0,0,0,.55));
}
section.hero .hero-card.chip .ct b{color:#fff}
section.hero .hero-card.chip .ct span{color:#8A95B4}

/* =========================================================
   SEÇÕES GENÉRICAS
   ========================================================= */
section{padding:80px 0}
.sec-head{max-width:640px;margin-bottom:48px}
.sec-head.center{margin:0 auto 48px;text-align:center}
.sec-head h2{font-size:clamp(24px,3.4vw,44px);margin-bottom:16px}
.sec-head p{color:var(--ink-2);font-size:16px}
.sec-head .line{display:flex;align-items:flex-end;justify-content:space-between;gap:20px}
.sec-alt{background:var(--bg-soft);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}
@media(max-width:640px){section{padding:52px 0}.sec-head{margin-bottom:32px}}

/* ---------- faixa de marcas ---------- */
.brands-strip{padding:32px 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--bg-soft)}
.brands-strip .wrap{display:flex;align-items:center;gap:40px;flex-wrap:wrap;justify-content:center}
.brands-strip .bl-label{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--accent);flex-basis:100%;text-align:center;margin-bottom:-16px}
@media(min-width:961px){.brands-strip .bl-label{flex-basis:auto;text-align:left;margin-bottom:0;margin-right:8px}}
.brands-strip .bl{font-family:var(--font-d);font-weight:800;font-size:20px;color:var(--ink-2);letter-spacing:.02em;transition:.2s}
.brands-strip .bl:hover{color:var(--accent)}
.brands-strip .bl .ex{font-size:10px;color:var(--accent);vertical-align:super;letter-spacing:.1em}
.brands-strip .bl-more{font-size:14px;font-weight:600;color:var(--ink-3);font-family:var(--font-b)}

/* =========================================================
   PRODUTOS (card + grid)
   ========================================================= */
.prod-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px}
.prod-grid.g3{grid-template-columns:repeat(3,1fr)}
@media(max-width:1040px){.prod-grid,.prod-grid.g3{grid-template-columns:repeat(3,1fr)}}
@media(max-width:820px){.prod-grid,.prod-grid.g3{grid-template-columns:repeat(2,1fr);gap:16px}}

.card-prod{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  overflow:hidden;transition:transform .18s ease, box-shadow .2s ease, border-color .2s ease;
  display:flex;flex-direction:column;position:relative;box-shadow:var(--shadow-sm);
}
.card-prod:hover{transform:var(--tilt,translateY(-5px));box-shadow:var(--glow);border-color:rgba(14,90,230,.35)}
/* Tempero (Atlas lv170 + lv175, provadas 06/08/2026): com mouse de verdade o
   card inclina em 3D seguindo o cursor (o JS em products.js escreve --tilt) e
   os irmãos dão um passo atrás — fraco de propósito: foco, não apagão.
   No toque nada disso existe (hover:hover) e o hover clássico segue de base. */
@media(hover:hover){
  .card-prod{transition:transform .16s ease-out, box-shadow .2s ease, border-color .2s ease, opacity .25s ease, filter .25s ease}
  .prod-grid:has(.card-prod:hover) .card-prod:not(:hover){opacity:.8;filter:saturate(.86)}
}
.card-prod .thumb{
  aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(220px 160px at 50% 32%, var(--blue-soft), transparent 66%),var(--surface-2);
  position:relative;
}
.card-prod .thumb>svg{width:104px;height:104px;color:#4E7FE0}
/* D2 (04/08): o respiro do tile chapado virou % em vez de 16px. Em px ele mudava
   de tamanho aparente a cada breakpoint (88,6% do tile no desktop de 280px ×
   82,9% no celular de 187px) — a foto de catálogo nascia colada na borda e cada
   tela mostrava um tamanho. Em %, os 29 produtos que caem neste fallback (sem
   recorte aprovado) ficam no MESMO tamanho em qualquer tela. */
.card-prod .thumb img.prod-photo{position:absolute;inset:0;z-index:0;width:100%;height:100%;object-fit:contain;padding:12%;mix-blend-mode:multiply;transform:scale(var(--pz,1));transition:transform .35s cubic-bezier(.2,.8,.3,1)}
.card-prod:hover .thumb img.prod-photo{transform:scale(calc(var(--pz,1)*1.05))}
/* ⚠️ D2 (04/08) · z-index 2 → 5. O comentário abaixo sempre disse "por cima da
   foto", mas a vitrine (`.card-prod.vt`) subiu o produto pra z-index:2 e o
   boneco pra 3 — empate no 2, e quem pinta por último no DOM ganha: a <img> vem
   DEPOIS do `.p-badges`. Resultado: o galão de 5L cobria o "Em estoque" (medido:
   8 de 55 cards, o pior com 1.558px² de badge tapado). A intenção estava no
   comentário e não no número. Agora o badge fica acima do produto E do boneco. */
.card-prod .thumb .p-badges{position:absolute;top:12px;left:12px;z-index:5;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
/* badges por cima da foto — fortes e legíveis em qualquer imagem */
.card-prod .thumb .badge{box-shadow:0 2px 8px rgba(15,26,46,.20)}
.card-prod .thumb .badge-ok{background:rgba(255,255,255,.92);color:#0A7A43;border:1px solid rgba(255,255,255,.7);backdrop-filter:blur(6px) saturate(1.3);-webkit-backdrop-filter:blur(6px) saturate(1.3)}
.card-prod .thumb .badge-ok .dot-ok{background:var(--ok)}
.card-prod .thumb .badge-dark{background:var(--ink);color:#fff;border:none}
.card-prod .thumb .badge-accent{background:var(--accent);color:#fff}
/* 17/08 · O SELO DE VÍDEO — canto OPOSTO aos badges (que moram em cima à
   esquerda) pra nunca disputar espaço com "Em estoque". z-index 5 pela mesma
   razão dos badges: o galão de 5L passa por cima de quem fica no 2. */
.card-prod .thumb .thumb-vid{
  position:absolute;bottom:12px;right:12px;z-index:5;
  display:inline-flex;align-items:center;gap:4px;
  padding:4px 8px;
  /* ⚠️ cor CRAVADA e não var(--ink): o tile da foto é CLARO nos dois temas, mas o
     --ink vira tinta clara no tema escuro — o selo sumiria em cima da foto. */
  background:rgba(9,14,26,.88);color:#fff;
  border-radius:999px;
  font-family:var(--font-b);font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  box-shadow:0 2px 8px rgba(15,26,46,.24);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}
.card-prod .thumb .thumb-vid svg{width:12px;height:12px}
/* 18/08 · O CORAÇÃO DE FAVORITO (Conta v2) — canto de cima à DIREITA: os badges
   moram à esquerda e o selo de vídeo embaixo à direita; este era o canto vago.
   Cor cravada pela mesma razão do selo de vídeo (o tile é claro nos 2 temas).
   Ativo = ciano (a faísca da casa marca o que é "meu", não vermelho de rede social). */
.card-prod .thumb .fav-btn{
  position:absolute;top:12px;right:12px;z-index:5;
  width:36px;height:36px;display:flex;align-items:center;justify-content:center;
  border-radius:999px;border:1px solid rgba(255,255,255,.2);
  background:rgba(9,14,26,.72);color:#fff;cursor:pointer;padding:0;
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  transition:transform .18s,border-color .18s,color .18s;
}
.card-prod .thumb .fav-btn svg{width:18px;height:18px}
.card-prod .thumb .fav-btn:hover{transform:scale(1.08);border-color:rgba(56,225,242,.55)}
.card-prod .thumb .fav-btn.on{color:#38E1F2;border-color:rgba(56,225,242,.55)}
.card-prod .thumb .fav-btn.on svg path{fill:currentColor}
.card-prod .body{padding:16px 16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}
.card-prod .cat{font-size:12px;color:var(--ink-3);font-weight:600;letter-spacing:.04em;text-transform:uppercase}
.card-prod .cat b{color:var(--accent);font-weight:700}
.card-prod .name{font-family:var(--font-b);font-weight:600;font-size:16px;line-height:1.3;color:var(--ink);min-height:39px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.card-prod .rating{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--ink-2)}
.card-prod .rating .stars{color:#F5A623;letter-spacing:1px}
.card-prod .price-row{margin-top:auto;display:flex;align-items:flex-end;justify-content:space-between;gap:8px}
.price b{font-family:var(--font-d);font-weight:800;font-size:20px;color:var(--ink);letter-spacing:-.02em;display:block;white-space:nowrap}
.price .old{font-size:12px;color:var(--ink-3);text-decoration:line-through;display:block}
.price .pix{font-size:12px;color:var(--ok);font-weight:600;margin-top:2px;display:block;white-space:nowrap}
.add-btn{
  width:44px;height:44px;border-radius:var(--radius-sm);background:var(--accent);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0;
  transition:.15s;box-shadow:0 6px 16px rgba(14,90,230,.3);
}
.add-btn svg{width:20px;height:20px}
.add-btn:hover{background:var(--accent-hi);transform:scale(1.06)}
.add-btn:active{transform:scale(.92)}
.add-btn.ok{background:var(--ok)}

/* estado vazio do grid (mascote da lupa) */
.empty-state{grid-column:1/-1;text-align:center;padding:40px 20px 48px}
.empty-state img{height:180px;margin:0 auto 16px}
.empty-state h3{font-size:20px;margin-bottom:8px}
.empty-state p{color:var(--ink-2);font-size:16px;margin-bottom:20px}
/* Tempero (Atlas lv1122, provada 06/08/2026): estado vazio parado é beco sem
   saída — o mascote flutua e a sombra respira junto. Vale pra lupa da loja e
   pro carrinho vazio do checkout (.co-empty vive no CSS inline de lá). */
.empty-state img,.co-empty img{animation:esFloat 3.4s ease-in-out infinite}
.es-sombra{width:120px;height:14px;margin:calc(-1*var(--sp-2)) auto var(--sp-4);border-radius:50%;
  background:radial-gradient(ellipse,rgba(0,0,0,.55),transparent 70%);animation:esSombra 3.4s ease-in-out infinite}
@keyframes esFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-9px)}}
@keyframes esSombra{0%,100%{transform:scaleX(1);opacity:1}50%{transform:scaleX(.8);opacity:.55}}
@media(prefers-reduced-motion:reduce){.empty-state img,.co-empty img,.es-sombra{animation:none}}

/* =========================================================
   DIFERENCIAIS / FEATURES
   ========================================================= */
.feat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
@media(max-width:900px){.feat-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:520px){.feat-grid{grid-template-columns:1fr}}
.feat{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px 24px;transition:.2s;box-shadow:var(--shadow-sm)}
.feat:hover{border-color:var(--accent);transform:translateY(-3px);box-shadow:var(--glow)}
.feat .fi{width:50px;height:50px;border-radius:12px;background:var(--blue-soft);color:var(--accent);display:flex;align-items:center;justify-content:center;margin-bottom:16px}
.feat .fi svg{width:24px;height:24px}
.feat h3{font-size:18px;margin-bottom:8px}
.feat p{font-size:14px;color:var(--ink-2)}

/* =========================================================
   MARCA DESTAQUE (Jaça), painel azul
   ========================================================= */
.spotlight{
  background:
    radial-gradient(700px 340px at 85% 15%, rgba(255,255,255,.16), transparent 60%),
    linear-gradient(140deg,#1E6BFF,#0A2E86);
  border-radius:24px;overflow:hidden;box-shadow:0 20px 50px rgba(10,46,134,.28);
}
.spotlight .wrap-in{display:grid;grid-template-columns:1.1fr .9fr;gap:40px;align-items:center;padding:50px}
.spotlight .eyebrow{color:#BcD5FF}
.spotlight .eyebrow::before{background:#BcD5FF}
.spotlight h2{font-size:clamp(24px,3vw,36px);margin-bottom:16px;color:#fff}
.spotlight p{color:rgba(255,255,255,.85);margin-bottom:24px;font-size:16px}
.spotlight .btn-primary{background:#fff;color:var(--accent)}
.spotlight .btn-primary:hover{background:#EAF1FE}
.spotlight .sp-visual{
  position:relative;height:330px;border-radius:var(--radius);
  background:radial-gradient(closest-side,rgba(255,255,255,.22),rgba(255,255,255,.04));
  border:1px solid rgba(255,255,255,.18);
  display:flex;align-items:flex-end;justify-content:center;overflow:hidden;
}
.sp-mascote{height:90%;width:auto;object-fit:contain;object-position:bottom;filter:drop-shadow(0 14px 22px rgba(4,16,48,.4))}
@media(max-width:820px){.spotlight .wrap-in{grid-template-columns:1fr;padding:32px}.spotlight .sp-visual{height:250px;order:-1}}

/* =========================================================
   PROVA SOCIAL
   ========================================================= */
.reviews{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
@media(max-width:820px){.reviews{grid-template-columns:1fr}}
.review{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;box-shadow:var(--shadow-sm)}
.review .stars{color:#F5A623;letter-spacing:2px;margin-bottom:16px}
.review p{color:var(--ink);font-size:16px;margin-bottom:20px;line-height:1.6}
.review .who{display:flex;align-items:center;gap:12px}
.review .av{width:42px;height:42px;border-radius:50%;background:var(--blue-soft);display:flex;align-items:center;justify-content:center;font-weight:700;color:var(--accent);font-family:var(--font-d)}
.review .who b{display:block;font-size:14px}
.review .who span{font-size:12px;color:var(--ink-3)}

/* =========================================================
   CTA FINAL, faixa azul com mascote
   ========================================================= */
.cta-band{
  position:relative;overflow:hidden;
  display:grid;grid-template-columns:1fr auto;align-items:center;gap:40px;
  background:
    radial-gradient(600px 300px at 18% 20%, rgba(255,255,255,.14), transparent 60%),
    linear-gradient(120deg,#0E5AE6,#0A2E86);
  border-radius:24px;padding:54px 60px 0 60px;
  box-shadow:0 20px 50px rgba(10,46,134,.28);
}
.cta-copy{padding-bottom:54px}
.cta-band .eyebrow{color:#BcD5FF}
.cta-band .eyebrow::before{background:#BcD5FF}
.cta-band h2{font-size:clamp(24px,3.2vw,36px);margin-bottom:16px;color:#fff}
.cta-band p{color:rgba(255,255,255,.85);max-width:480px;margin-bottom:32px;font-size:16px}
.cta-band .btn-primary{background:#fff;color:var(--accent)}
.cta-band .btn-primary:hover{background:#EAF1FE}
.cta-band .btn-ghost{background:transparent;border-color:rgba(255,255,255,.4);color:#fff}
.cta-band .btn-ghost:hover{background:rgba(255,255,255,.1);border-color:#fff;color:#fff}
/* T2·S5 (20/07): o megafone cresceu um degrau e centrou na própria coluna
   (pedido: "aumenta ele um pouquinho e centraliza") — o pé segue no chão do card */
.cta-mascote{height:290px;width:auto;align-self:end;justify-self:center;filter:drop-shadow(0 12px 20px rgba(4,16,48,.35))}
@media(max-width:760px){
  .cta-band{grid-template-columns:1fr;padding:40px 32px 0 32px;text-align:left}
  .cta-copy{padding-bottom:40px}
  .cta-mascote{display:none}
}

/* =========================================================
   FOOTER v3, navy editorial · cantos retos · social
   ========================================================= */
footer.site{
  position:relative;overflow:hidden;
  background:linear-gradient(165deg,#0C2C55,#061630);
  border-top:3px solid var(--accent-hi);
  color:rgba(255,255,255,.72);
  padding:66px 0 32px;margin-top:24px;
}
footer.site::before{
  content:"";position:absolute;top:-160px;right:-110px;width:480px;height:480px;
  background:radial-gradient(closest-side,rgba(46,116,255,.30),transparent 70%);
  pointer-events:none;
}
footer.site::after{
  content:"";position:absolute;left:-130px;bottom:-170px;width:430px;height:430px;
  background:radial-gradient(closest-side,rgba(14,90,230,.14),transparent 70%);
  pointer-events:none;
}
footer.site .wrap{position:relative}
.foot-top{display:grid;grid-template-columns:1.5fr 1fr 1fr 1.35fr;gap:40px;margin-bottom:48px}
@media(max-width:960px){.foot-top{grid-template-columns:1fr 1fr;gap:32px}}
@media(max-width:560px){.foot-top{grid-template-columns:1fr;gap:32px}}
.foot-brand .logo-wrap{margin-bottom:20px}
.foot-brand p{max-width:315px;font-size:14px;margin:0 0 24px;line-height:1.65}
.foot-social{display:flex;flex-wrap:wrap;gap:12px}
.fsoc{
  display:inline-flex;align-items:center;gap:12px;
  border:1px solid rgba(255,255,255,.20);
  padding:12px 16px;font-size:14px;font-weight:600;color:#fff;transition:.2s;
}
.fsoc svg{width:18px;height:18px;flex-shrink:0}
.fsoc-wa svg{color:#57D97E}
.fsoc:hover{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.45);transform:translateY(-1px)}
.fsoc-ig:hover{border-color:rgba(224,101,126,.75)}
.foot-col h4{
  position:relative;padding-left:16px;
  font-size:12px;letter-spacing:.16em;text-transform:uppercase;
  color:#7FA8E8;margin-bottom:20px;font-family:var(--font-b);font-weight:700;
}
.foot-col h4::before{content:"";position:absolute;left:0;top:2px;width:8px;height:8px;background:var(--accent-hi)}
.foot-col a{display:block;color:rgba(255,255,255,.72);font-size:14px;margin-bottom:12px;transition:.18s;width:fit-content}
.foot-col a:hover{color:#fff;transform:translateX(3px)}
.unit-card{
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.10);
  border-left:2px solid var(--accent-hi);padding:12px 16px;margin-bottom:12px;
}
.unit-card b{color:#fff;font-size:14px;display:block;margin-bottom:2px}
.unit-card span{font-size:12px;color:rgba(255,255,255,.6);display:block;line-height:1.45}
.unit-card a{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;color:#7FB0FF;margin-top:8px}
.unit-card a:hover{color:#fff}
.foot-bottom{
  border-top:1px solid rgba(255,255,255,.12);padding-top:24px;
  display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;
  font-size:12px;color:rgba(255,255,255,.48);
}
.foot-bottom .fb-left span{display:block;line-height:1.6}
.pay-icons{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.pay-icons .pi{
  height:26px;padding:0 12px;
  border:1px solid rgba(255,255,255,.16);background:transparent;
  display:flex;align-items:center;font-size:11px;font-weight:700;
  color:rgba(255,255,255,.7);letter-spacing:.06em;
}
.foot-sator{font-size:12px;color:rgba(255,255,255,.4)}
.foot-sator b{color:rgba(255,255,255,.7);font-weight:700}
a.foot-sator{text-decoration:none}
a.foot-sator:hover{color:rgba(255,255,255,.65)}
a.foot-sator:hover b{color:#fff}

/* =========================================================
   LOJA, vitrine por objetivo
   ========================================================= */
.shop-hero{
  background:
    radial-gradient(900px 380px at 88% -20%, rgba(14,90,230,.1), transparent 60%),
    linear-gradient(180deg,#fff,var(--bg-soft));
  border-bottom:1px solid var(--border);
  padding-bottom:32px;
}
.shop-hero h1{font-size:clamp(30px,3.8vw,44px);margin-bottom:12px}
.shop-hero .sh-sub{color:var(--ink-2);font-size:16px;max-width:560px}
/* D9: eram 4 placas (com uma delas segurando 99% da loja); agora são 8 — os 6
   corredores reais + Tudo + o atalho pro Mercado Livre. 4 colunas dá 2 fileiras
   redondas no desktop e o nome curto entra no lugar do longo no celular. */
.goal-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:32px 0 20px}
@media(max-width:960px){.goal-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.goal-grid{grid-template-columns:repeat(2,1fr);gap:8px}}
.goal{
  position:relative;border-radius:16px;padding:20px 16px 16px;cursor:pointer;
  border:1px solid var(--border);background:#fff;transition:.2s;text-align:left;
}
.goal svg{width:28px;height:28px;color:var(--accent);margin-bottom:12px}
.goal b{display:block;font-family:var(--font-d);font-size:14px;font-weight:700;letter-spacing:-.01em;color:var(--ink);line-height:1.25}
/* ⚠️ `>` de propósito: `.goal span` pegava TAMBÉM os dois spans de nome dentro
   do <b> (a versão longa e a curta do celular) e, com specificity maior que
   `.g-curto`, forçava as duas a aparecer — a placa saía "Lavar & limpar / Lavar"
   empilhado. Só o filho direto é a linha de apoio. */
.goal > span{font-size:12px;color:var(--ink-3);display:block;line-height:1.35}
.goal:hover{transform:translateY(-3px);box-shadow:var(--shadow);border-color:rgba(14,90,230,.3)}
a.goal{display:block;text-decoration:none}
.goal.on{
  background:linear-gradient(150deg,#1E6BFF,#0A2E86);border-color:transparent;
  box-shadow:0 14px 32px rgba(14,90,230,.35);
}
.goal.on b{color:#fff}
.goal.on > span{color:#BcD5FF}
.goal.on svg{color:#fff}
/* o selo de contagem no canto: a placa diz o que tem dentro, o selo diz quanto */
.goal .g-n{position:absolute;top:var(--sp-2);right:var(--sp-2);font-style:normal;
  font-size:var(--fs-3xs);font-weight:800;letter-spacing:.04em;line-height:18px;
  padding:0 var(--sp-2);border-radius:var(--r-full);color:var(--ink-3);
  background:rgba(120,140,175,.12);border:1px solid var(--border)}
.goal.on .g-n{background:rgba(255,255,255,.20);border-color:rgba(255,255,255,.34);color:#fff}
.g-curto{display:none}
@media(max-width:560px){
  .goal{padding:var(--sp-4) var(--sp-3) var(--sp-3)}
  .goal svg{width:24px;height:24px;margin-bottom:var(--sp-2)}
  .goal > span{font-size:var(--fs-3xs)}
  .g-full{display:none}
  .g-curto{display:inline}
}

.trust-strip{
  display:flex;gap:8px 32px;flex-wrap:wrap;align-items:center;
  padding:12px 20px;background:var(--blue-soft);
  border:1px solid #D9E6FB;border-radius:16px;
  font-size:14px;color:var(--ink-2);font-weight:500;
}
.trust-strip .ti{display:flex;gap:8px;align-items:center}
.trust-strip .ti svg{width:15px;height:15px;color:var(--accent);flex-shrink:0}

/* D9: o topo era 32px EM CIMA dos 80px (52 no celular) que a `.shop-wall` já dá
   — 112px de vazio entre a placa de corredor e a barra de filtros, e o filtro é
   justamente o que a pessoa procura assim que decide o corredor. O respiro da
   seção continua sendo o do muro; aqui não se soma um segundo. */
.shop-body{padding:0 0 56px}
.shop-toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;gap:16px;flex-wrap:wrap}
.shop-toolbar .count{font-size:14px;color:var(--ink-2)}
.shop-toolbar .count b{color:var(--ink)}
.chips{display:flex;gap:8px;flex-wrap:wrap}
.chip-f{padding:8px 16px;border-radius:999px;border:1px solid var(--border);font-size:14px;color:var(--ink-2);background:#fff;cursor:pointer;transition:.15s;font-weight:600}
.chip-f:hover{border-color:var(--accent);color:var(--accent)}
.chip-f.on{background:var(--accent);color:#fff;border-color:var(--accent)}

.wa-block{
  margin-top:48px;padding:32px;text-align:center;
  background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius);
}
.wa-block .muted{margin-bottom:8px}
.wa-block b{display:block;font-weight:600;margin-bottom:16px}

/* =========================================================
   CHECKOUT, barra própria (padrão, confiável)
   ========================================================= */
.co-top{border-bottom:1px solid var(--border);background:var(--bg)}
.co-top .wrap{display:flex;align-items:center;justify-content:space-between;height:66px;gap:16px}
.co-back{display:inline-flex;align-items:center;gap:8px;font-size:14px;color:var(--ink-2);font-weight:500}
.co-back:hover{color:var(--accent)}
.co-back svg{width:15px;height:15px}
.co-secure{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--ok);font-weight:600}
.co-secure svg{width:15px;height:15px}
@media(max-width:640px){.co-back span{display:none}}

/* =========================================================
   PÁGINAS INTERNAS, hero de página (Sobre / Contato)
   ========================================================= */
.page-hero{
  position:relative;overflow:hidden;
  background:
    radial-gradient(1000px 420px at 86% -20%, rgba(14,90,230,.10), transparent 60%),
    linear-gradient(180deg,#fff,var(--bg-soft));
  border-bottom:1px solid var(--border);
}
.page-hero .wrap{display:grid;grid-template-columns:1.02fr .98fr;gap:50px;align-items:center;padding-top:150px;padding-bottom:66px}
.page-hero .wrap>*{min-width:0}
.page-hero h1{font-size:clamp(30px,4.4vw,56px);margin-bottom:20px;overflow-wrap:break-word}
.page-hero h1 em{font-style:normal;color:var(--accent)}
.page-hero .lead{font-size:18px;color:var(--ink-2);max-width:520px;margin-bottom:32px}
.ph-cta{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:32px}
.ph-mini{display:flex;gap:24px;flex-wrap:wrap}
.ph-mini .m{display:flex;flex-direction:column}
.ph-mini .m b{font-family:var(--font-d);font-size:20px;font-weight:800;color:var(--ink)}
.ph-mini .m span{font-size:12px;color:var(--ink-3)}
.ph-photo{
  position:relative;border-radius:24px;overflow:hidden;border:1px solid var(--border);
  box-shadow:0 26px 60px rgba(10,46,134,.22);aspect-ratio:4/5;background:var(--surface-2);
}
.ph-photo img{width:100%;height:100%;object-fit:cover}
.ph-photo::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 52%,rgba(6,20,54,.55));pointer-events:none}
.ph-tag{
  position:absolute;left:16px;right:16px;bottom:16px;z-index:2;
  display:flex;align-items:center;gap:12px;
  background:rgba(8,26,68,.42);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  border:1px solid rgba(255,255,255,.2);border-radius:16px;padding:12px 16px;
}
.ph-tag .pt-ic{width:38px;height:38px;border-radius:12px;background:rgba(255,255,255,.16);display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}
.ph-tag .pt-ic svg{width:20px;height:20px}
.ph-tag b{display:block;color:#fff;font-family:var(--font-d);font-size:14px;font-weight:700;line-height:1.2}
.ph-tag span{display:block;color:rgba(255,255,255,.8);font-size:12px}
.page-hero.compact .wrap{padding-bottom:52px}
@media(max-width:900px){
  .page-hero .wrap{grid-template-columns:1fr;gap:32px;padding-top:118px}
  .ph-photo{aspect-ratio:16/11;order:-1}
}

/* ---------- faixa de números ---------- */
.stat-strip{background:var(--bg-soft);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}
.stat-strip .wrap{display:grid;grid-template-columns:repeat(4,1fr);gap:24px;padding-top:40px;padding-bottom:40px}
.stat{display:flex;flex-direction:column;gap:4px}
.stat b{font-family:var(--font-d);font-size:clamp(24px,3.2vw,36px);font-weight:800;color:var(--accent);letter-spacing:-.02em;line-height:1}
.stat span{font-size:14px;color:var(--ink-2);font-weight:500}
/* T3·S1 (20/07) · A CAUSA do "números muito pequenos" que o Anthony reportou:
   o odômetro (initOdometer) monta os dígitos em <span class="odx/od"> DENTRO do
   <b>, e o `.stat span` de 14px acima os encolhia pra tamanho de rótulo. Dentro
   do <b>, span herda o tamanho do número. */
.stat b span{font-size:inherit;letter-spacing:0;text-transform:none;color:inherit;font-weight:inherit}
@media(max-width:640px){.stat-strip .wrap{grid-template-columns:repeat(2,1fr);gap:24px}}
/* T3·S1 (20/07) · O PLACAR DE RUA — decisão S1-A do Anthony: cada número numa
   placa de metal parafusada (o mesmo material da .tl-placa/FX.05), número grande
   em Bungee que CONTA no scroll. O fundo sólido "texto jogado" morreu. */
.stat.placa{position:relative;gap:var(--sp-2);align-items:flex-start;
  background:linear-gradient(160deg,#39414E,#20262F);
  border:var(--bw-1) solid rgba(255,255,255,.16);border-radius:var(--r-xs);
  padding:var(--sp-5) var(--sp-6);
  box-shadow:inset 0 var(--bw-1) 0 rgba(255,255,255,.16),0 var(--sp-2) var(--sp-5) rgba(0,0,0,.5)}
.stat.placa::before,.stat.placa::after{content:"";position:absolute;width:7px;height:7px;border-radius:var(--r-full);
  background:radial-gradient(circle at 35% 30%,#C6CDD8,#5A6270);box-shadow:inset 0 -1px 1px rgba(0,0,0,.6)}
.stat.placa::before{left:7px;top:7px}
.stat.placa::after{right:7px;bottom:7px}
.stat.placa b{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;color:#EAF2FF;
  font-size:var(--fs-4xl);letter-spacing:.02em;line-height:1;
  text-shadow:0 2px 0 rgba(0,0,0,.45)}
/* > span, e NÃO span: o odômetro (initOdometer) constrói <span class="odx/od">
   DENTRO do <b> — um `span` solto encolhia os dígitos pra tamanho de rótulo */
.stat.placa > span{font-size:var(--fs-2xs);letter-spacing:.12em;text-transform:uppercase;
  color:#96A2B4;font-weight:600}
@media(max-width:640px){.stat.placa{padding:var(--sp-4) var(--sp-5)}.stat.placa b{font-size:var(--fs-3xl)}}

/* ---------- história ---------- */
.story{display:grid;grid-template-columns:1.12fr .88fr;gap:52px;align-items:center}
.story .story-copy p{color:var(--ink-2);font-size:16px;margin-bottom:16px;line-height:1.75}
.story .story-copy p:last-child{margin-bottom:0}
.story .story-copy b{color:var(--ink);font-weight:700}
.story .quote{font-family:var(--font-d);font-weight:700;font-size:clamp(20px,2.4vw,24px);color:var(--ink);line-height:1.3;letter-spacing:-.01em;border-left:3px solid var(--accent);padding-left:20px;margin:4px 0 24px}
.story-panel{
  position:relative;border-radius:24px;overflow:hidden;height:100%;min-height:360px;
  background:radial-gradient(600px 320px at 78% 12%, rgba(255,255,255,.12), transparent 60%),linear-gradient(150deg,rgba(30,107,255,.5),rgba(10,46,134,.6));
  border:1px solid rgba(255,255,255,.14);
  box-shadow:0 20px 50px rgba(10,46,134,.28);
  /* T2·S2 (20/07): o joinha ficava afundado no rodapé do card ("tá muito pra
     baixo") — agora ele CENTRA no painel, com respiro igual em cima e embaixo */
  display:flex;align-items:center;justify-content:center;
}
.story-panel img{height:84%;width:auto;object-fit:contain;object-position:center;filter:drop-shadow(0 16px 22px rgba(4,16,48,.42));position:relative;z-index:1}
.story-panel .sp-badge{
  position:absolute;top:20px;left:20px;z-index:2;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.24);
  border-radius:16px;padding:12px 16px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
}
.story-panel .sp-badge b{display:block;font-family:var(--font-d);font-size:24px;font-weight:800;color:#fff;line-height:1}
.story-panel .sp-badge span{font-size:12px;color:#BcD5FF;font-weight:600}
@media(max-width:820px){.story{grid-template-columns:1fr;gap:32px}.story-panel{min-height:300px;order:-1}}

/* ---------- as 2 unidades (cards com foto) ---------- */
.units{display:grid;grid-template-columns:1fr 1fr;gap:24px}
@media(max-width:820px){.units{grid-template-columns:1fr}}
.unit{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  overflow:hidden;box-shadow:var(--shadow-sm);transition:.2s;display:flex;flex-direction:column;
}
.unit:hover{box-shadow:var(--glow);border-color:rgba(14,90,230,.3);transform:translateY(-3px)}
.unit .u-photo{aspect-ratio:16/10;overflow:hidden;position:relative;background:var(--surface-2)}
.unit .u-photo img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}
.unit:hover .u-photo img{transform:scale(1.04)}
.unit .u-pill{
  position:absolute;top:13px;left:13px;z-index:2;
  display:inline-flex;align-items:center;gap:8px;
  background:rgba(8,26,68,.5);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  border:1px solid rgba(255,255,255,.2);border-radius:999px;padding:8px 12px;
  font-size:12px;font-weight:700;color:#fff;letter-spacing:.02em;
}
.unit .u-pill .dot{width:7px;height:7px;border-radius:50%;background:#7CF0B4}
.unit .u-body{padding:24px 24px 24px;display:flex;flex-direction:column;flex:1}
.unit .u-body h3{font-size:20px;margin-bottom:12px}
.u-line{display:flex;gap:12px;align-items:flex-start;font-size:14px;color:var(--ink-2);margin-bottom:12px;line-height:1.5}
.u-line svg{width:17px;height:17px;color:var(--accent);flex-shrink:0;margin-top:2px}
.u-line b{color:var(--ink);font-weight:600}
.u-line a{color:var(--ink-2)}
.u-line a:hover{color:var(--accent)}
.u-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:auto;padding-top:16px}
.u-row .btn{flex:1;min-width:140px}

/* ---------- parede de marcas (Sobre) ---------- */
.brandwall{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
@media(max-width:760px){.brandwall{grid-template-columns:repeat(2,1fr)}}
.bw-item{
  background:var(--surface);border:1px solid var(--border);border-radius:16px;
  padding:20px 16px;text-align:center;transition:.2s;
}
.bw-item:hover{border-color:rgba(14,90,230,.35);box-shadow:var(--shadow-sm);transform:translateY(-2px)}
.bw-item b{display:block;font-family:var(--font-d);font-weight:800;font-size:18px;color:var(--ink);letter-spacing:.01em}
.bw-item span{font-size:12px;color:var(--ink-3);font-weight:500}
.bw-item.excl{background:linear-gradient(150deg,#1E6BFF,#0A2E86);border-color:transparent;box-shadow:0 12px 30px rgba(14,90,230,.3)}
.bw-item.excl b{color:#fff}
.bw-item.excl span{color:#BcD5FF;font-weight:700;letter-spacing:.06em;text-transform:uppercase}

/* =========================================================
   CONTATO, métodos, mapa-card, formulário
   ========================================================= */
.cmethods{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
@media(max-width:900px){.cmethods{grid-template-columns:repeat(2,1fr)}}
@media(max-width:480px){.cmethods{grid-template-columns:1fr}}
.cmethod{
  display:flex;flex-direction:column;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  padding:24px 24px;box-shadow:var(--shadow-sm);transition:.2s;
}
.cmethod:hover{border-color:var(--accent);transform:translateY(-3px);box-shadow:var(--glow)}
.cmethod .cm-ic{width:48px;height:48px;border-radius:12px;background:var(--blue-soft);color:var(--accent);display:flex;align-items:center;justify-content:center;margin-bottom:16px}
.cmethod.wa .cm-ic{background:var(--ok-dim);color:var(--ok)}
.cmethod .cm-ic svg{width:23px;height:23px}
.cmethod h3{font-size:16px;margin-bottom:4px}
.cmethod p{font-size:14px;color:var(--ink-2);margin-bottom:16px;flex:1}
.cmethod .cm-val{font-family:var(--font-d);font-weight:700;font-size:16px;color:var(--ink);display:inline-flex;align-items:center;gap:8px}
.cmethod .cm-val:hover{color:var(--accent)}
.cmethod .cm-val svg{width:15px;height:15px;flex-shrink:0}

/* mapa-card (localização sem iframe externo) */
.map-card{
  position:relative;border-radius:var(--radius);overflow:hidden;
  border:1px solid var(--border);min-height:190px;
  background:
    linear-gradient(135deg, rgba(14,90,230,.06), rgba(14,90,230,0) 40%),
    repeating-linear-gradient(0deg, #EAF1FE, #EAF1FE 1px, transparent 1px, transparent 26px),
    repeating-linear-gradient(90deg, #EAF1FE, #EAF1FE 1px, transparent 1px, transparent 26px),
    #F4F8FF;
}
.map-card::before{content:"";position:absolute;left:0;top:38%;width:100%;height:12px;background:#DCE7FB;transform:rotate(-4deg)}
.map-card::after{content:"";position:absolute;left:24%;top:0;width:13px;height:100%;background:#DCE7FB;transform:rotate(3deg)}
.map-card.photo::before,.map-card.photo::after{display:none} /* fachada real no lugar do mapa desenhado */
/* T2·C1 (20/07): o nome da cidade era pill branca com texto claro NO MEIO da
   fachada — ilegível ("branco igual o fundo"). Virou TARJA no rodapé da foto:
   scrim escuro, texto branco, pin pequeno do lado — lê em qualquer fachada. */
.map-card.photo .map-pin{left:14px;right:auto;top:auto;bottom:14px;transform:none;
  flex-direction:row;align-items:center;gap:8px}
.map-card.photo .map-pin .pin{width:30px;height:30px;box-shadow:0 6px 14px rgba(4,10,26,.5)}
.map-card.photo .map-pin .pin svg{width:14px;height:14px}
.map-card.photo .pin-label{margin-top:0;background:rgba(6,10,20,.82);color:#fff;
  border-color:rgba(255,255,255,.18);box-shadow:0 6px 16px rgba(4,10,26,.45)}
.map-pin{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-100%);z-index:2;
  display:flex;flex-direction:column;align-items:center;
}
.map-pin .pin{
  width:44px;height:44px;border-radius:50% 50% 50% 0;background:var(--accent);transform:rotate(-45deg);
  box-shadow:0 10px 22px rgba(14,90,230,.4);display:flex;align-items:center;justify-content:center;
}
.map-pin .pin svg{width:20px;height:20px;color:#fff;transform:rotate(45deg)}
.map-pin .pin-label{margin-top:12px;background:#fff;border:1px solid var(--border);border-radius:999px;padding:4px 12px;font-size:12px;font-weight:700;color:var(--ink);box-shadow:var(--shadow-sm);white-space:nowrap}

/* formulário de contato */
.contact-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:32px;align-items:start}
@media(max-width:860px){.contact-grid{grid-template-columns:1fr;gap:32px}}
.form-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:32px;box-shadow:var(--shadow-sm)}
.form-card h3{font-size:20px;margin-bottom:8px}
.form-card .fc-sub{font-size:14px;color:var(--ink-2);margin-bottom:24px}
.cf-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
.cf-field{margin-bottom:16px}
.cf-field.full{grid-column:1/-1}
.cf-field label{display:block;font-size:14px;font-weight:600;color:var(--ink);margin-bottom:8px}
.cf-field input,.cf-field textarea,.cf-field select{
  width:100%;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:12px 16px;color:var(--ink);font-size:14px;font-family:inherit;transition:.15s;
}
.cf-field select{appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23566079' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;background-size:16px;padding-right:40px}
.cf-field textarea{resize:vertical;min-height:120px;line-height:1.5}
.cf-field input:focus,.cf-field textarea:focus,.cf-field select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(14,90,230,.12)}
.cf-field input.err,.cf-field textarea.err{border-color:#E5484D;background:#FFF7F7}
.cf-field input::placeholder,.cf-field textarea::placeholder{color:var(--ink-3)}
.form-note{font-size:12px;color:var(--ink-3);margin-top:8px;display:flex;gap:8px;align-items:flex-start;line-height:1.5}
.form-note svg{width:14px;height:14px;color:var(--ok);flex-shrink:0;margin-top:2px}
.form-success{display:none;text-align:center;padding:16px 12px 8px}
.form-success.show{display:block;animation:mm .25s ease}
.form-success img{height:150px;margin:0 auto 12px}
.form-success h3{font-size:20px;margin-bottom:8px}
.form-success p{font-size:14px;color:var(--ink-2);margin-bottom:20px}
/* aside do contato */
.contact-aside .co-card,.contact-aside .aside-card{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  padding:24px;box-shadow:var(--shadow-sm);margin-bottom:20px;
}
.aside-card h4{font-size:16px;margin-bottom:16px}
.hours{list-style:none}
.hours li{display:flex;justify-content:space-between;gap:16px;padding:8px 0;border-bottom:1px solid var(--border-soft);font-size:14px}
.hours li:last-child{border-bottom:none}
.hours li span{color:var(--ink-2)}
.hours li b{color:var(--ink);font-weight:600}
.hours li.closed b{color:var(--ink-3);font-weight:500}
.aside-wa{
  background:linear-gradient(160deg,#0C2C55,#071B39);border-radius:var(--radius);
  padding:24px;color:#fff;position:relative;overflow:hidden;
}
.aside-wa h4{color:#fff;font-size:18px;margin-bottom:8px}
.aside-wa p{color:rgba(255,255,255,.75);font-size:14px;margin-bottom:20px}
.aside-wa .btn{width:100%}

/* =========================================================
   PÁGINAS DE POLÍTICA & FAQ (ajuda / legal)
   ========================================================= */
.legal-hero{
  position:relative;overflow:hidden;
  background:
    radial-gradient(900px 380px at 84% -30%, rgba(14,90,230,.10), transparent 60%),
    linear-gradient(180deg,#fff,var(--bg-soft));
  border-bottom:1px solid var(--border);
}
.legal-hero .wrap{max-width:860px;padding-top:112px;padding-bottom:48px}
.legal-hero h1{font-size:clamp(30px,4vw,44px);margin:16px 0 16px;line-height:1.12}
.legal-hero h1 em{font-style:normal;color:var(--accent)}
.legal-hero .lead{font-size:18px;color:var(--ink-2);max-width:660px;line-height:1.6}
.legal-wrap{max-width:860px;margin:0 auto;padding:54px 24px 84px}
.legal-updated{font-size:14px;color:var(--ink-3);margin-bottom:32px;padding-bottom:24px;border-bottom:1px solid var(--border)}
.legal h2{font-size:20px;margin:40px 0 16px;scroll-margin-top:100px;letter-spacing:-.01em}
.legal h2:first-of-type{margin-top:0}
.legal h3{font-size:16px;margin:24px 0 12px;color:var(--ink)}
.legal p{color:var(--ink-2);font-size:16px;line-height:1.78;margin-bottom:16px}
.legal ul{margin:0 0 20px;padding:0;list-style:none}
.legal li{position:relative;padding-left:24px;color:var(--ink-2);font-size:16px;line-height:1.68;margin-bottom:12px}
.legal li::before{content:"";position:absolute;left:2px;top:9px;width:7px;height:7px;border-radius:2px;background:var(--accent)}
.legal b,.legal strong{color:var(--ink);font-weight:700}
.legal a:not(.btn){color:var(--accent);font-weight:600}
.legal a:not(.btn):hover{text-decoration:underline}
.legal-hl{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:12px;padding:20px 20px;margin:20px 0}
.legal-hl p:last-child{margin-bottom:0}
.legal-hl b{color:var(--ink)}
.legal-cta{margin-top:40px;padding-top:32px;border-top:1px solid var(--border);display:flex;gap:16px;flex-wrap:wrap;align-items:center}
.legal-cta p{margin:0;font-size:16px;color:var(--ink-2)}
/* FAQ, acordeão nativo (<details>) */
.faq-list{max-width:860px;margin:0 auto}
.faq-cat{display:flex;align-items:center;gap:8px;font-family:var(--font-b);font-weight:700;font-size:12px;letter-spacing:.14em;color:var(--accent);text-transform:uppercase;margin:32px 0 16px}
.faq-cat::before{content:"";width:22px;height:2px;background:var(--accent);border-radius:2px}
.faq-cat:first-child{margin-top:0}
.faq-item{border:1px solid var(--border);border-radius:16px;background:var(--surface);margin-bottom:12px;overflow:hidden;transition:border-color .2s,box-shadow .2s;box-shadow:var(--shadow-sm)}
.faq-item[open]{border-color:rgba(14,90,230,.35);box-shadow:var(--shadow-sm)}
.faq-item summary{list-style:none;cursor:pointer;padding:20px 24px;font-family:var(--font-d);font-weight:700;font-size:16px;color:var(--ink);display:flex;justify-content:space-between;align-items:center;gap:16px}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary .fq-ic{width:22px;height:22px;flex-shrink:0;color:var(--accent);transition:transform .2s}
.faq-item[open] summary .fq-ic{transform:rotate(45deg)}
.faq-item .fq-body{padding:0 24px 20px;color:var(--ink-2);font-size:16px;line-height:1.72}
.faq-item[open] .fq-body{animation:gdUp .24s ease}
.faq-item .fq-body p{margin:0 0 12px}
.faq-item .fq-body p:last-child{margin-bottom:0}
.faq-item .fq-body a{color:var(--accent);font-weight:600}

/* =========================================================
   KIT DE LOADING, micro-interações e overlays temáticos
   (aprovado no lab-loading: Wash & Shine no splash, robô no
   caminho do carrinho, kit micro em tudo)
   ========================================================= */

/* ---- barrinha de topo (troca de página) ---- */
#gd-topbar{position:fixed;top:0;left:0;right:0;height:3px;z-index:4000;pointer-events:none}
#gd-topbar i{display:block;height:100%;width:0;opacity:0;border-radius:0 999px 999px 0;
  background:linear-gradient(90deg,var(--accent),var(--accent-hi));
  box-shadow:0 0 8px rgba(46,116,255,.65);
  transition:width .5s cubic-bezier(.3,.6,.3,1),opacity .25s}
#gd-topbar.go i{opacity:1;width:72%}
#gd-topbar.done i{opacity:1;width:100%;transition:width .3s ease,opacity .25s}
#gd-topbar.fade i{opacity:0;width:100%}

/* ---- spinner G (micro, herda contexto) ---- */
.gd-spin{width:15px;height:15px;border-radius:50%;flex:none;display:inline-block;vertical-align:-2px;
  border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:gdspin .7s linear infinite}
.gd-spin.dark{border-color:var(--blue-soft);border-top-color:var(--accent)}
@keyframes gdspin{to{transform:rotate(360deg)}}
.btn.is-loading,button.is-loading{pointer-events:none;opacity:.92}
.btn .gd-spin{margin-right:8px}

/* ---- skeleton de card da vitrine ---- */
.sk-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  overflow:hidden;position:relative}
.sk-card::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(14,90,230,.08) 50%,transparent);
  animation:gdshimmer 1.4s ease infinite}
@keyframes gdshimmer{to{transform:translateX(100%)}}
.sk-card .sk-th{aspect-ratio:1/1;background:var(--surface-2)}
.sk-card .sk-b{padding:16px;display:flex;flex-direction:column;gap:8px}
.sk{display:block;background:var(--surface-2);border-radius:8px}

/* ---- skeleton de LINHA da busca (22/08) ----
   Nas páginas que não vendem, o catálogo desce sob demanda: abrir a busca tem
   um instante de espera de verdade. Rótulo solto num vazio de 800px não é
   resposta. A espera usa a MESMA geometria da linha de resultado, então a lista
   não pula quando o produto chega — ela só ganha conteúdo. */
.s-item.sk-row{cursor:default;position:relative;overflow:hidden}
.s-item.sk-row::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(14,90,230,.08) 50%,transparent);
  animation:gdshimmer 1.4s ease infinite}
.s-item.sk-row .s-ic{background:var(--surface-2)}
.s-item.sk-row .sk-l1{height:14px;width:62%}
.s-item.sk-row .sk-l2{height:11px;width:34%;margin-top:8px}
.s-item.sk-row .sk-lp{height:14px;width:64px;margin-left:auto;flex-shrink:0}

/* ---- foto de produto entra com fade ---- */
img.prod-photo{animation:gdImgIn .38s ease}
@keyframes gdImgIn{from{opacity:0}to{opacity:1}}

/* ---- badge do carrinho dá um pulso ao adicionar ---- */
.cart-count.bump{animation:gdBump .5s cubic-bezier(.2,1.6,.4,1)}
@keyframes gdBump{0%{transform:scale(1)}35%{transform:scale(1.5)}100%{transform:scale(1)}}

/* ---- resultados da busca entram em cascata ---- */
.search-results .s-item{animation:gdUp .26s ease backwards}
.search-results .s-item:nth-child(3){animation-delay:.04s}
.search-results .s-item:nth-child(4){animation-delay:.08s}
.search-results .s-item:nth-child(5){animation-delay:.12s}
.search-results .s-item:nth-child(6){animation-delay:.16s}
.search-results .s-item:nth-child(7){animation-delay:.2s}
.search-results .s-item:nth-child(8){animation-delay:.24s}
@keyframes gdUp{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}

/* ---- resumo do checkout recalculando ---- */
.sum-wait{opacity:.45;transition:opacity .2s;position:relative}
.sum-wait::after{content:"";position:absolute;top:16px;right:16px;width:16px;height:16px;border-radius:50%;
  border:2px solid var(--blue-soft);border-top-color:var(--accent);animation:gdspin .7s linear infinite}

/* ---- A PORTA DE AÇO — abertura da loja E cortina de navegação (R4) ----
   Toda loja de rua fecha com porta de enrolar — e toda porta de aço do Brasil
   amanhece grafitada. A nossa tá pintada com a marca da casa. O ritual:
   a arte "chacoalha" pra vida, a fresta de luz embaixo mostra que a loja JÁ
   tá acesa, o cadeado destrava e cai, a porta dá o tranco de porta real e
   sobe enrolando no cilindro do topo — revelação física, sem fade.
   Clique em qualquer lugar = puxar a porta direto.

   Desde a R4 o mesmo objeto tem DOIS papéis (o splash deixou de existir
   como coisa separada):
   · `.abre` — abertura da loja: 1ª entrada da sessão, com cadeado e bilhete.
   · `.tr`   — transição do porta-menu: desce na página que sai, sobe na que
               entra. A troca de cena acontece ATRÁS da porta fechada.
   Estados: .down (descendo) · .landed (encostada) · .rattle (tranco) · .lift (sobe). */
html.gd-splash-hold::before,html.gd-cartload-hold::before{content:"";position:fixed;inset:0;z-index:4999}
html.gd-splash-hold::before{background:
  repeating-linear-gradient(180deg,#1B2642 0 4px,#243154 10px,#141E38 36px,#0A1226 42px,#070D1C 46px)}
html.gd-cartload-hold::before{background:linear-gradient(180deg,#fff 30%,var(--blue-soft) 130%)}
#gd-porta{position:fixed;inset:0;z-index:5000;overflow:hidden;cursor:pointer;background:transparent}
#gd-porta.lift{cursor:default;pointer-events:none}
.gdd-door{position:absolute;inset:0;will-change:transform;
  background:
    radial-gradient(120% 90% at 50% 28%,rgba(46,116,255,.06),transparent 62%),
    repeating-linear-gradient(90deg,rgba(255,255,255,.015) 0 2px,transparent 2px 9px),
    repeating-linear-gradient(180deg,#1B2642 0 4px,#243154 10px,#141E38 36px,#0A1226 42px,#070D1C 46px);
  box-shadow:0 22px 44px rgba(0,0,0,.7)}
.gdd-rail{position:absolute;top:0;bottom:0;width:clamp(12px,2.4vw,24px);z-index:2;
  background:linear-gradient(90deg,#040810,#101A30 55%,#040810)}
.gdd-rail.l{left:0;border-right:1px solid rgba(255,255,255,.07)}
.gdd-rail.r{right:0;border-left:1px solid rgba(255,255,255,.07)}
.gdd-art{position:absolute;left:0;right:0;top:38%;transform:translateY(-50%);
  display:flex;flex-direction:column;align-items:center;gap:2px;text-align:center;z-index:3}
.ga-word{font-family:var(--font-gt,'Pirata One',cursive);font-size:clamp(64px,15vw,128px);line-height:1;letter-spacing:.02em;
  background:linear-gradient(180deg,#FFFFFF 0%,#D7E1EF 28%,#93A7C4 46%,#F2F7FF 52%,#5E7291 68%,#CBD8E9 86%,#8FA3C0 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 3px 0 rgba(0,0,0,.6)) drop-shadow(0 0 22px rgba(127,179,255,.25));
  animation:gddPop .5s cubic-bezier(.2,1.2,.35,1) .08s both}
.ga-tag{font-family:var(--font-tag,'Sedgwick Ave Display',cursive);font-size:clamp(24px,4.5vw,36px);color:#38E1F2;
  transform:rotate(-3deg);text-shadow:0 0 22px rgba(56,225,242,.5);animation:gddSpray .45s ease .45s both}
.ga-est{margin-top:16px;font-family:var(--font-d);font-weight:700;font-size:10px;letter-spacing:.34em;
  color:rgba(245,248,255,.42);animation:gddSpray .45s ease .7s both}
@keyframes gddPop{from{opacity:0;transform:scale(1.08)}to{opacity:1;transform:none}}
@keyframes gddSpray{from{opacity:0;filter:blur(9px)}to{opacity:1;filter:blur(0)}}
.gdd-lock{position:absolute;left:50%;bottom:11.5%;transform:translateX(-50%);z-index:3;width:34px;height:44px}
.gdd-lock .hasp{position:absolute;left:50%;top:0;width:20px;height:19px;transform:translateX(-50%);
  border:4px solid #93A2C2;border-bottom:none;border-radius:12px 12px 0 0;
  transition:transform .28s cubic-bezier(.3,1.6,.4,1)}
.gdd-lock .body{position:absolute;left:2px;right:2px;top:15px;height:26px;border-radius:8px;
  background:linear-gradient(160deg,#C3CFE6,#7C8BA9 55%,#4A5670);box-shadow:0 3px 8px rgba(0,0,0,.55)}
.gdd-lock .body::after{content:"";position:absolute;left:50%;top:8px;width:5px;height:9px;transform:translateX(-50%);
  border-radius:4px 4px 2px 2px;background:#232D45}
#gd-porta.unlock .hasp{transform:translateX(-50%) translateY(-7px) rotate(-32deg)}
#gd-porta.unlock .gdd-lock{animation:gddLockDrop .5s ease-in .22s forwards}
@keyframes gddLockDrop{to{transform:translateX(-50%) translateY(30px) rotate(-16deg);opacity:0}}
.gdd-handle{position:absolute;left:50%;bottom:6%;transform:translateX(-50%);width:132px;height:11px;border-radius:999px;z-index:2;
  background:linear-gradient(180deg,#3A4A72,#111B33);
  box-shadow:0 3px 8px rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.25)}
.gdd-sub{position:absolute;left:0;right:0;bottom:2.4%;z-index:3;text-align:center;
  font-family:var(--font-d);font-weight:600;font-size:12px;letter-spacing:.24em;text-transform:uppercase;
  color:rgba(198,208,230,.6);transition:opacity .16s}
.gdd-sub.tag{font-family:var(--font-tag,'Sedgwick Ave Display',cursive);font-weight:400;text-transform:none;
  letter-spacing:.02em;font-size:24px;color:#38E1F2;text-shadow:0 0 18px rgba(56,225,242,.55)}
.gdd-fresta{position:absolute;left:0;right:0;bottom:-2px;height:4px;z-index:4;
  background:linear-gradient(90deg,transparent,rgba(56,225,242,.9) 18%,#EAFDFF 50%,rgba(56,225,242,.9) 82%,transparent);
  box-shadow:0 0 22px 4px rgba(56,225,242,.5),0 0 60px 14px rgba(46,116,255,.32);
  animation:gddFresta 1.5s ease-in-out infinite}
@keyframes gddFresta{0%,100%{opacity:.55}50%{opacity:1}}
.gdd-roll{position:absolute;top:0;left:0;right:0;height:36px;z-index:6;transform:translateY(-102%);
  transition:transform .28s ease .1s;
  background:
    repeating-linear-gradient(90deg,rgba(0,0,0,.25) 0 2px,transparent 2px 26px),
    linear-gradient(180deg,#2A3760,#0D1528 72%,#05090F);
  border-bottom:2px solid #040810;box-shadow:0 10px 26px rgba(0,0,0,.55)}
/* o cilindro aparece assim que a porta existe: é dele que ela desenrola */
#gd-porta.lift .gdd-roll,#gd-porta.down .gdd-roll,#gd-porta.landed .gdd-roll{transform:translateY(0)}
#gd-porta.rattle .gdd-door{animation:gddRattle .2s ease-in-out 2}
@keyframes gddRattle{0%,100%{transform:translateY(0)}30%{transform:translateY(2.5px)}70%{transform:translateY(-2px)}}
#gd-porta.lift .gdd-door{animation:gddLift 1.02s cubic-bezier(.62,.04,.22,1) forwards}
@keyframes gddLift{0%{transform:translateY(0)}15%{transform:translateY(-15%)}25%{transform:translateY(-12.5%)}100%{transform:translateY(-104%)}}
/* a porta DESCENDO (só no modo transição): você VÊ ela chegar e encostar */
#gd-porta.down .gdd-door{animation:gddDown .62s cubic-bezier(.45,.05,.25,1) both}
@keyframes gddDown{0%{transform:translateY(-104%)}84%{transform:translateY(1.8%)}100%{transform:translateY(0)}}
#gd-porta.landed .gdd-door{transform:translateY(0)}
/* modo transição: sem cadeado/bilhete; a arte entra COM a porta, não antes dela */
#gd-porta.tr .ga-word,#gd-porta.tr .ga-tag{animation:none}
#gd-porta.tr .gdd-art{opacity:0;transition:opacity .26s}
#gd-porta.tr.down .gdd-art,#gd-porta.tr.landed .gdd-art{opacity:1}
#gd-porta.tr.lift .gdd-art{opacity:0}

/* ---- ROBÔ NO CORRE · chegada ao carrinho/checkout ---- */
#gd-cartload{position:fixed;inset:0;z-index:5000;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,#fff 30%,var(--blue-soft) 130%);transition:opacity .32s ease}
#gd-cartload.out{opacity:0;pointer-events:none}
.gc-inner{width:min(560px,84vw);position:relative;height:190px}
.gc-runner{position:absolute;left:0;bottom:58px;width:92px;
  animation:gcRun .85s cubic-bezier(.4,.12,.5,.95) forwards}
@keyframes gcRun{from{left:0}to{left:calc(100% - 92px)}}
.gc-runner img{width:92px;display:block;animation:gcTrot .36s ease-in-out infinite;transform-origin:50% 92%}
@keyframes gcTrot{0%,100%{transform:translateY(0) rotate(-1.4deg)}50%{transform:translateY(-3.5px) rotate(1.6deg)}}
.gc-track{position:absolute;left:0;right:0;bottom:40px;height:8px;border-radius:999px;
  background:var(--surface-2);border:1px solid var(--border);overflow:hidden}
.gc-track i{position:absolute;inset:0;width:0;border-radius:999px;
  background:linear-gradient(90deg,var(--accent),var(--accent-hi));
  box-shadow:0 0 10px rgba(14,90,230,.35);animation:gcFill .85s cubic-bezier(.4,.12,.5,.95) forwards}
@keyframes gcFill{to{width:100%}}
.gc-dash{position:absolute;left:0;right:0;bottom:26px;height:3px;
  background:repeating-linear-gradient(90deg,var(--border) 0 20px,transparent 20px 40px);
  animation:gcDash .5s linear infinite}
@keyframes gcDash{to{background-position:-40px 0}}
.gc-lbl{position:absolute;left:0;right:0;bottom:0;text-align:center;font-size:14px;color:var(--ink-2);
  transition:opacity .15s}

/* ---- reveal on scroll (marcado pelo initReveal do main.js) ---- */
.rv{opacity:0;transform:translateY(16px);transition:opacity .55s cubic-bezier(.16,1,.3,1),transform .55s cubic-bezier(.16,1,.3,1);transition-delay:var(--rvd,0s)}
.rv.in{opacity:1;transform:none}

/* ---- cards da vitrine entram em cascata (--i setado no renderGrid) ---- */
.prod-grid .card-prod{animation:gdUp .3s ease backwards;animation-delay:calc(var(--i,0)*.04s)}
/* durante o morph do filtro (View Transitions) a cascata cala a boca:
   card que desliza pro novo lugar não pode nascer de novo por cima */
.prod-grid.vt-swap .card-prod{animation:none}

/* ---- mascote respira + aceno de boas-vindas (sutil) ---- */
.hero-mascote{animation:gdFloatX 5.5s ease-in-out infinite;transform-origin:58% 100%}
@keyframes gdFloatX{
  0%,100%{transform:translateX(-50%) translateY(0) rotate(-1deg)}
  30%{transform:translateX(-50%) translateY(-6px) rotate(1.3deg)}
  60%{transform:translateX(-50%) translateY(-4px) rotate(-.5deg)}
}
.sp-mascote{animation:gdFloat 6s ease-in-out 1.2s infinite}
.cta-mascote{animation:gdFloat 6.5s ease-in-out .6s infinite}
@keyframes gdFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}

/* ---- acessibilidade: usuário pediu menos movimento ---- */
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  #gd-porta,#gd-cartload,#gd-topbar{display:none!important}
  html.gd-splash-hold::before,html.gd-cartload-hold::before{display:none!important}
  .sk-card::after,.s-item.sk-row::after{animation:none}
  img.prod-photo,.search-results .s-item{animation:none}
  .cart-count.bump{animation:none}
  .rv{opacity:1;transform:none;transition:none}
  .prod-grid .card-prod{animation:none}
  .hero-mascote,.sp-mascote,.cta-mascote{animation:none}
  .hero-bubbles i,.hpt-gloss,.hpt-drop,.btn-arw,.hero-card.main .badge-accent,.hero-card.main .badge-accent::after{animation:none!important}
  .hero-card.main::before{display:none}
  .hero-price-tag{transition:none}
  .mobile-menu.open,.faq-item[open] .fq-body{animation:none}
  .skip-link{transition:none}
}

/* ============================================================
   FASE 12 — Acessibilidade & responsivo (foco de teclado, skip-link)
   ============================================================ */
html{scroll-padding-top:96px}
img,svg,video{max-width:100%}

/* foco visível pra navegação por teclado (sem afetar clique de mouse) */
a:focus-visible,button:focus-visible,[tabindex]:focus-visible,
.icon-btn:focus-visible,.burger:focus-visible,.card-prod:focus-visible{
  outline:3px solid var(--accent,#0E5AE6);
  outline-offset:2px;
  border-radius:8px;
}
input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--accent,#0E5AE6);
  outline-offset:1px;
}

/* skip-link: pular direto pro conteúdo (visível só ao focar via Tab) */
.skip-link{
  position:fixed;top:10px;left:10px;z-index:9999;
  background:var(--accent,#0E5AE6);color:#fff;
  padding:12px 20px;border-radius:12px;font-weight:700;font-size:14px;
  text-decoration:none;box-shadow:0 8px 24px rgba(14,90,230,.28);
  transform:translateY(-160%);transition:transform .16s ease;
}
.skip-link:focus{transform:translateY(0);outline:2px solid #fff;outline-offset:2px}
[tabindex="-1"]:focus{outline:none}

/* ============================================================
   COMPONENTES VIVOS (curadoria das 13 ideias · lab-componentes)
   Doutrina: pouco movimento, muita precisão · 1 assinatura por
   tela · scroll anima 1× · hover = resposta · reduced-motion off.
   .gd-go é setado pelo IntersectionObserver do components.js.
   ============================================================ */

/* ---------- card de produto: coreografia de hover (upgrade in-place) ---------- */
.card-prod::after{content:"";position:absolute;left:16px;right:16px;bottom:0;height:3px;border-radius:999px;z-index:2;
  background:linear-gradient(90deg,var(--accent-hi),var(--blue-deep));
  transform:scaleX(0);transform-origin:left;transition:transform .42s cubic-bezier(.2,.8,.3,1)}
.card-prod:hover::after{transform:scaleX(1)}
.card-prod .price .pix{transition:transform .3s ease,color .2s}
.card-prod:hover .price .pix{transform:scale(1.04);transform-origin:left}
@media(prefers-reduced-motion:reduce){.card-prod::after{transition:none}.card-prod:hover .price .pix{transform:none}}

/* ---------- 2 · barra de confiança viva (home, após o hero) ---------- */
.gd-trustbar{background:var(--bg-soft);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}
.gd-trustbar .wrap{padding:32px 24px 24px}
.gd-tb-row{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
@media(max-width:640px){.gd-tb-row{grid-template-columns:repeat(2,1fr);row-gap:24px}}
.gd-tb{text-align:center}
.gd-tb .n{font-family:var(--font-d);font-weight:800;font-size:clamp(24px,3.4vw,36px);color:var(--blue-deep);letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums}
.gd-tb .n em{font-style:normal;color:var(--accent)}
.gd-tb .l{font-size:12px;color:var(--ink-2);margin-top:8px;line-height:1.35}
.gd-tb-line{height:3px;border-radius:999px;background:var(--border);margin-top:24px;overflow:hidden}
.gd-tb-line i{display:block;height:100%;width:0;border-radius:999px;background:linear-gradient(90deg,var(--accent-hi),var(--blue-deep))}
.gd-go .gd-tb-line i{animation:gdTbLine 1.5s cubic-bezier(.3,.7,.3,1) forwards}
@keyframes gdTbLine{to{width:100%}}

/* ---------- 3 · AS SAÍDAS DA 01 · vitrine por objetivo (home) ----------
   Cada card é uma PLACA DE SERVIÇO rodoviário — o azul de placa É o azul da
   marca: campo azul, orla branca, parafusos (a técnica da prateleira do
   FX.05), tarja SAÍDA em Bungee parafusada por cima da borda.
   A assinatura: quando a seção entra na tela (.gd-muro.in do initMuro), o
   FAROL varre a fileira e cada placa ACENDE como retrorrefletivo — em
   cascata, 1×, forwards. Sem JS as placas ficam "apagadas": azul fundo,
   100% legíveis. Hover = o teu farol bate de novo (flash + brilho).
   (As físicas da era clean — bolhas, verniz, polidor, faísca — morreram
   aqui em 11/07: eram a assinatura do site branco.) */
.gd-vitrine{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
@media(max-width:900px){.gd-vitrine{grid-template-columns:repeat(2,1fr)}}
@media(max-width:480px){.gd-vitrine{grid-template-columns:1fr}}

.gd-placa{position:relative;border-radius:var(--r-lg);color:#DAE4F8;
  padding:var(--sp-6) var(--sp-5) var(--sp-5);min-height:210px;
  display:flex;flex-direction:column;text-align:left;
  background:linear-gradient(165deg,#14295F 0%,#0C1B42 58%,#091430 100%);
  border:var(--bw-1) solid rgba(198,216,248,.22);
  box-shadow:0 12px 30px rgba(0,0,0,.44);
  transition:filter .25s cubic-bezier(.2,.8,.3,1),border-color .25s,color .55s ease var(--pld,0s)}
/* cascata: a luz chega numa placa de cada vez */
.gd-placa:nth-child(1){--pld:0s}
.gd-placa:nth-child(2){--pld:.14s}
.gd-placa:nth-child(3){--pld:.28s}
.gd-placa:nth-child(4){--pld:.42s}

/* a película refletiva ACESA: gradiente vivo + trama fina da película (some layer) */
.pl-luz{position:absolute;inset:0;z-index:0;border-radius:var(--r-lg);overflow:hidden;pointer-events:none;
  background:
    repeating-linear-gradient(0deg,rgba(255,255,255,.035) 0 1px,transparent 1px 9px),
    repeating-linear-gradient(90deg,rgba(255,255,255,.035) 0 1px,transparent 1px 9px),
    radial-gradient(120% 90% at 50% -10%,rgba(120,180,255,.32),transparent 60%),
    linear-gradient(165deg,#2E74FF 0%,#1443B8 55%,#0A2E86 100%);
  box-shadow:0 18px 44px rgba(46,116,255,.28);
  opacity:0;transition:opacity .55s cubic-bezier(.2,.8,.3,1) var(--pld,0s)}

/* o FAROL: lâmina de luz quente que varre a placa (::before = seção entra,
   ::after = hover). Translate, não `left` — sem layout por frame. */
.pl-luz::before,.pl-luz::after{content:"";position:absolute;top:-20%;left:0;width:44%;height:140%;
  transform:translateX(-130%) skewX(-18deg);opacity:0;
  background:linear-gradient(100deg,transparent,rgba(255,246,224,.38) 42%,rgba(255,250,238,.85) 50%,rgba(255,246,224,.38) 58%,transparent)}
@keyframes plFarol{0%{transform:translateX(-130%) skewX(-18deg);opacity:0}
  14%{opacity:1}
  100%{transform:translateX(300%) skewX(-18deg);opacity:0}}

/* orla branca de placa */
.gd-placa::before{content:"";position:absolute;inset:var(--sp-2);z-index:1;pointer-events:none;
  border:var(--bw-2) solid rgba(233,241,255,.30);border-radius:var(--r-sm);
  transition:border-color .55s ease var(--pld,0s)}
/* os 2 parafusos que prendem a placa (mesma técnica da prateleira do FX.05) */
.gd-placa::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    radial-gradient(circle 3.5px at 14px 14px,#C8D6EF 0 1.8px,rgba(4,10,24,.6) 2.3px,transparent 3.5px),
    radial-gradient(circle 3.5px at calc(100% - 14px) 14px,#C8D6EF 0 1.8px,rgba(4,10,24,.6) 2.3px,transparent 3.5px)}

/* tarja SAÍDA — plaquinha branca montada por cima da borda superior */
.pl-saida{position:absolute;top:-10px;left:var(--sp-4);z-index:2;
  font-family:var(--font-lt);font-weight:400;font-size:var(--fs-3xs);letter-spacing:.14em;line-height:1;
  color:#0A2E86;background:linear-gradient(180deg,#FFFFFF,#DCE6F6);
  padding:var(--sp-1) var(--sp-2);border-radius:var(--r-xs);
  box-shadow:0 2px 6px rgba(0,0,0,.5),inset 0 -1px 0 rgba(10,46,134,.18)}

/* pictograma direto no campo azul (placa de verdade não tem "chip") */
.pl-ico{width:56px;height:56px;margin-bottom:auto;position:relative;z-index:2;display:block}
.pl-ico svg{width:100%;height:100%;stroke:rgba(232,240,255,.78);stroke-width:3;fill:none;
  stroke-linecap:round;stroke-linejoin:round;
  filter:drop-shadow(0 0 0 rgba(180,215,255,0));
  transition:stroke .55s ease var(--pld,0s),filter .55s ease var(--pld,0s)}

.gd-placa b{font-family:var(--font-d);font-size:var(--fs-lg);font-weight:800;line-height:1.15;
  margin-top:var(--sp-4);position:relative;z-index:2;color:#E4ECFC;transition:color .55s ease var(--pld,0s)}
.pl-sub{font-size:var(--fs-xs);opacity:.8;margin-top:var(--sp-1);position:relative;z-index:2}
.pl-go{margin-top:var(--sp-3);font-size:var(--fs-xs);font-weight:700;display:inline-flex;align-items:center;
  gap:var(--sp-2);position:relative;z-index:2;color:#9FC0FF;transition:color .55s ease var(--pld,0s)}
.pl-go i{font-style:normal;transition:transform .3s}
.gd-placa:hover .pl-go i,.gd-placa:focus-visible .pl-go i{transform:translateX(4px)}

/* V11 (18/07) · o ATALHO DE MARCA sob as SAÍDAS (a ponte Renan × Anthony):
   as placas vendem pelo RESULTADO; quem já sabe a marca corta caminho nos
   stickers — todos clicáveis, direto pro filtro da loja. */
.gd-marcas-atalho{margin-top:var(--sp-6);text-align:center}
.ma-label{display:inline-block;font-family:var(--font-tag);font-size:var(--fs-lg);
  color:var(--cyan);transform:rotate(-1.2deg);margin-bottom:var(--sp-3);
  text-shadow:0 0 14px rgba(56,225,242,.3)}
.ma-row{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--sp-3) var(--sp-2)}
/* T4·H1-A (20/07) · decisão do Anthony: a fileira virou FOLHA DE STICKER die-cut
   com os LOGOS REAIS — base branca de adesivo, rotação alternada de quem colou
   na mão, canto descolando no hover. Logo quando existe; wordmark honesto quando
   não (o asset decide, não o gosto). */
.ma-row a{--rot:-2deg;position:relative;display:inline-flex;align-items:center;justify-content:center;
  min-height:44px;min-width:64px;padding:var(--sp-2) var(--sp-4);text-decoration:none;
  background:linear-gradient(172deg,#FDFEFF,#EDF1F8);border-radius:8px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 5px 12px rgba(2,8,20,.5);
  transform:rotate(var(--rot));
  /* overflow: o canto que descola (::after) tem que ser cortado pelo raio do
     adesivo, senão a aba vaza como um quadrado fora do sticker */
  overflow:hidden;
  transition:transform .18s ease,box-shadow .18s ease,opacity .22s ease,filter .22s ease}
.ma-row a:nth-child(2n){--rot:1.6deg}
.ma-row a:nth-child(3n){--rot:-1.1deg}
.ma-row a:nth-child(5n){--rot:2.4deg}
/* ✂️ 10/08 · MOVIMENTO C+A (escolhido pelo Anthony na prova de roupa
   `site/_lab/fx01-movimento.html`, entre 4 candidatos codados na fileira real).

   A · DESCOLA O CANTO — era um triangulozinho de sombra que crescia; virou uma
   aba de vinil que DOBRA e mostra o verso, com sombra caindo por baixo. É a
   leitura literal do conceito que já estava no código pela metade: adesivo
   die-cut colado na mão.
   C · FOCO — passar o mouse na fileira apaga as 39 e deixa só a apontada acesa.
   São 39 marcas competindo; competição demais vira ruído. É o mesmo "foco" que
   ele aprovou dosado fraco no card de produto, aqui numa dose maior porque aqui
   há muito mais concorrência visual.

   A fileira é TEMPERO (camada 3 do `producao/aplicacao-de-movimento.md`), não
   assinatura: se roubar a cena do Drop, está errada mesmo bonita. */
.ma-row a::after{content:"";position:absolute;right:0;bottom:0;width:0;height:0;
  border-radius:8px 0 8px 0;
  background:linear-gradient(315deg,#FFF 0%,#E6ECF6 42%,#AEBACE 58%,#8C99AE 100%);
  box-shadow:-3px -3px 7px rgba(2,8,20,.34);
  transition:width .26s cubic-bezier(.2,.8,.3,1),height .26s cubic-bezier(.2,.8,.3,1)}
/* --lh = altura calculada pelo fitStickerLogos (components.js): peso visual igual
   por área — quadrada cresce, comprida encolhe. Sem JS, vale o 24px de sempre. */
.ma-row a img{display:block;height:var(--lh,24px);width:auto;max-width:118px;object-fit:contain}
.ma-row a b{font-family:var(--font-d);font-weight:800;font-size:var(--fs-xs);letter-spacing:.06em;color:#0B1626}

/* ---- 16/08 · A PLACA DE AÇO (a base escura pro logo que some no branco) ----
   Logo de press kit vem, muita vez, na versão VAZADA: tinta branca sobre fundo
   transparente. Sobre a base branca do adesivo isso não é logo discreto, é
   RETÂNGULO VAZIO — o Anthony abriu "Marcas" na loja e não conseguia ler
   Alcance, MaxPro, Sagola nem SGT Tools. Amarelo e laranja (Cadillac, Kers)
   reprovam pelo mesmo motivo, só que mais devagar.

   Quem escolhe a base é a MEDIÇÃO, não uma lista chumbada por marca (isso é
   dívida que ninguém lembra de pagar quando o painel sobe marca nova): o
   `initPlacaEscura` do components.js rasteriza o logo, mede quanta tinta
   separa de cada base e pendura `.selo-escuro` quando o branco reprova. A
   régua e a semente vivem em `_dev/medir-contraste-marcas.js`.

   Vale nas DUAS superfícies que usam o sticker — a fileira da home e a parede
   de marcas da loja. O rim claro de 1px existe porque a placa escura anda em
   cima de página escura: sem ele o die-cut se dissolve no fundo. */
.ma-row a.selo-escuro,.bw-selo.selo-escuro{
  background:linear-gradient(172deg,#1D2839,#080E1A);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.15),inset 0 1px 0 rgba(255,255,255,.22),0 4px 10px rgba(2,8,20,.55)}
.ma-row a.selo-escuro b,.bw-selo.selo-escuro b{color:#EEF3FF}
/* a aba do canto descolando mostra o VERSO do adesivo — o desta folha é escuro */
.ma-row a.selo-escuro::after{background:linear-gradient(315deg,#3A4A63 0%,#22304A 42%,#131E31 58%,#0A121F 100%)}
.ma-row a.selo-escuro:hover,.ma-row a.selo-escuro:focus-visible{
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22),inset 0 1px 0 rgba(255,255,255,.3),0 14px 26px rgba(2,8,20,.6)}
/* C · o vizinho recua. Só no ponteiro fino: no celular `:hover` gruda no toque
   e a fileira ficaria apagada depois do tap, sem nada pra reacender. */
@media (hover:hover) and (pointer:fine){
  .ma-row:hover a{opacity:.34;filter:saturate(.55)}
}
.ma-row a:hover,.ma-row a:focus-visible{opacity:1;filter:none;
  transform:rotate(var(--rot)) translateY(-4px) scale(1.09);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 14px 26px rgba(2,8,20,.6)}
/* A · a aba do canto abre junto */
.ma-row a:hover::after,.ma-row a:focus-visible::after{width:22px;height:22px}
@media(max-width:560px){
  .ma-row a{min-height:40px;min-width:52px;padding:var(--sp-1) var(--sp-3)}
  .ma-row a img{height:calc(var(--lh,24px)*.82);max-width:96px}
  .ma-row a b{font-size:var(--fs-2xs)}
  .ma-label{font-size:var(--fs-md)}
}

/* ✦ o sticker da crew — só na placa do ML, torto, meio pra fora (die-cut) */
.pl-stk{position:absolute;right:-6px;top:44px;z-index:2;transform:rotate(-7deg);
  font-family:var(--font-tag);font-size:var(--fs-2xs);line-height:1;letter-spacing:.04em;
  color:var(--cyan,#38E1F2);background:#0B1526;border:var(--bw-1) solid rgba(56,225,242,.55);
  padding:var(--sp-1) var(--sp-2);border-radius:var(--r-xs);
  box-shadow:0 4px 10px rgba(0,0,0,.5),0 0 14px rgba(56,225,242,.22)}

/* === ACENDE: o farol chega (initMuro põe .in no .gd-muro da própria seção) === */
.sec-vitrine .gd-muro.in~.wrap .gd-placa{border-color:rgba(198,220,255,.42);color:#EAF0FC}
.sec-vitrine .gd-muro.in~.wrap .pl-luz{opacity:1}
.sec-vitrine .gd-muro.in~.wrap .pl-luz::before{animation:plFarol .6s cubic-bezier(.2,.8,.3,1) var(--pld,0s) 1 both}
.sec-vitrine .gd-muro.in~.wrap .gd-placa::before{border-color:rgba(244,249,255,.78)}
.sec-vitrine .gd-muro.in~.wrap .pl-ico svg{stroke:#fff;filter:drop-shadow(0 0 7px rgba(160,205,255,.6))}
.sec-vitrine .gd-muro.in~.wrap .gd-placa b{color:#fff}
.sec-vitrine .gd-muro.in~.wrap .pl-go{color:#EAF3FF}

/* hover/focus = o TEU farol bate: flash rápido + a placa brilha mais */
.gd-placa:hover,.gd-placa:focus-visible{filter:brightness(1.12);border-color:rgba(214,231,255,.6)}
.gd-placa:hover .pl-luz::after,.gd-placa:focus-visible .pl-luz::after{animation:plFarol .45s ease-out 1}

@media(prefers-reduced-motion:reduce){
  .gd-placa,.pl-luz,.gd-placa::before,.pl-ico svg,.gd-placa b,.pl-go{transition:none}
  .pl-luz::before,.pl-luz::after{animation:none!important}
}

/* ---------- 6 · monte seu kit · Balcão (perfil → objetivos → kit vivo) ---------- */
.kb{max-width:820px;margin:0 auto;background:var(--surface);border:1px solid var(--border);border-radius:24px;
  padding:24px 32px 32px;box-shadow:var(--shadow)}
@media(max-width:560px){.kb{padding:20px 16px 24px;border-radius:24px}}

/* trilho de progresso */
.kb-rail{display:flex;align-items:center;gap:8px;margin-bottom:24px}
.kb-rs{display:flex;align-items:center;gap:8px;background:none;border:0;padding:0;cursor:default;font-family:var(--font-b);
  color:var(--ink-3);font-size:14px;font-weight:600;white-space:nowrap;min-width:0}
.kb-rs i{width:26px;height:26px;flex:none;border-radius:50%;display:grid;place-items:center;font-style:normal;
  font-size:14px;font-weight:700;background:var(--surface-2);color:var(--ink-3);
  border:1.5px solid var(--border);transition:background .3s,color .3s,border-color .3s}
.kb-rs.on{color:var(--ink)}
.kb-rs.on i{background:var(--accent);color:#fff;border-color:var(--accent)}
.kb-rs.done{cursor:pointer;color:var(--ink-2)}
.kb-rs.done i{background:var(--blue-soft);color:var(--accent);border-color:var(--blue-soft)}
.kb-rs span{overflow:hidden;text-overflow:ellipsis}
.kb-rl{flex:1;height:2px;background:var(--border);border-radius:2px;min-width:12px;transition:background .3s}
.kb-rl.done{background:var(--accent)}
@media(max-width:520px){
  .kb-rail{gap:8px}
  .kb-rs{font-size:12px;gap:8px}
  .kb-rs i{width:23px;height:23px;font-size:12px}
  .kb-rs:not(.on) span{display:none}
}

/* passos */
.kb-step{display:none}
.kb-step.on{display:block;animation:gdUp .42s cubic-bezier(.2,.8,.3,1)}
.kb-q{font-family:var(--font-d);font-weight:800;font-size:clamp(18px,2.4vw,24px);letter-spacing:-.01em;margin-bottom:16px}
.kb-q em{font-style:normal;font-size:14px;font-weight:600;color:var(--ink-3);margin-left:4px}
@media(max-width:520px){.kb-q em{display:block;margin:4px 0 0}}

/* ATO 1 · perfil */
.kb-opts{display:flex;flex-direction:column;gap:12px}
.kb-opt{display:flex;align-items:center;gap:12px;padding:16px 16px;border:1.5px solid var(--border);border-radius:16px;
  background:#fff;cursor:pointer;font-size:16px;font-weight:600;color:var(--ink);text-align:left;font-family:var(--font-b);
  transition:border-color .22s,box-shadow .22s,transform .22s,background .22s}
.kb-opt:hover{border-color:var(--accent);box-shadow:0 8px 20px rgba(14,90,230,.12);transform:translateX(3px)}
.kb-opt.on{border-color:var(--accent);background:var(--blue-soft)}
.kb-ot{display:flex;flex-direction:column}
.kb-ot em{font-style:normal;font-size:12px;font-weight:500;color:var(--ink-3);margin-top:1px}
.kb-oi{width:40px;height:40px;flex:none;border-radius:12px;background:var(--blue-soft);display:grid;place-items:center;color:var(--accent)}
.kb-opt.on .kb-oi{background:#fff}
.kb-oi svg{width:22px;height:22px;stroke:currentColor;stroke-width:2.6;fill:none;stroke-linecap:round;stroke-linejoin:round}

/* ATO 2 · objetivos (múltipla escolha) */
.kb-goals{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
@media(max-width:520px){.kb-goals{grid-template-columns:1fr}}
.kb-goal{position:relative;display:flex;align-items:center;gap:12px;padding:16px 16px;border:1.5px solid var(--border);
  border-radius:16px;background:#fff;cursor:pointer;text-align:left;font-family:var(--font-b);
  transition:border-color .22s,box-shadow .22s,transform .22s,background .22s}
.kb-goal:hover{border-color:var(--accent);box-shadow:0 8px 20px rgba(14,90,230,.12);transform:translateY(-2px)}
.kb-goal.on{border-color:var(--accent);background:var(--blue-soft)}
.kb-gi{width:38px;height:38px;flex:none;border-radius:12px;background:var(--surface-2);display:grid;place-items:center;color:var(--accent);transition:background .22s}
.kb-goal.on .kb-gi{background:#fff}
.kb-gi svg{width:21px;height:21px;stroke:currentColor;stroke-width:2.4;fill:none;stroke-linecap:round;stroke-linejoin:round}
.kb-gt{flex:1;min-width:0;font-size:14px;font-weight:700;color:var(--ink);line-height:1.2}
.kb-gt em{display:block;font-style:normal;font-size:12px;font-weight:500;color:var(--ink-3);margin-top:2px}
.kb-adv{display:inline-block;font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--accent);background:var(--blue-soft);border-radius:8px;padding:1px 8px;margin-top:8px}
.kb-goal.on .kb-adv{background:#fff}
.kb-gk{width:22px;height:22px;flex:none;border-radius:8px;border:1.6px solid var(--border);display:grid;place-items:center;transition:background .2s,border-color .2s}
.kb-gk svg{width:13px;height:13px;stroke:#fff;stroke-width:3;fill:none;stroke-linecap:round;stroke-linejoin:round;opacity:0;transform:scale(.6);transition:opacity .2s,transform .2s}
.kb-goal.on .kb-gk{background:var(--accent);border-color:var(--accent)}
.kb-goal.on .kb-gk svg{opacity:1;transform:scale(1)}
.kb-nav{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:20px}
.kb-ghost{background:none;border:none;font-family:var(--font-b);font-size:14px;font-weight:600;color:var(--ink-3);cursor:pointer;padding:8px 4px;transition:color .2s}
.kb-ghost:hover{color:var(--accent)}
#kb-go[disabled]{opacity:.45;pointer-events:none}

/* ATO 3 · kit vivo */
.kb-reshead{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:16px}
.kb-rt{font-family:var(--font-d);font-weight:800;font-size:20px;letter-spacing:-.01em;display:flex;align-items:baseline;gap:8px}
.kb-cnt{font-family:var(--font-b);font-size:12px;font-weight:600;color:var(--ink-3)}
.kb-levels{display:inline-flex;background:var(--surface-2);border:1px solid var(--border);border-radius:12px;padding:4px}
.kb-levels button{border:none;background:none;font-family:var(--font-b);font-size:12px;font-weight:600;color:var(--ink-2);
  padding:8px 12px;border-radius:8px;cursor:pointer;transition:background .2s,color .2s,box-shadow .2s;white-space:nowrap}
.kb-levels button.on{background:#fff;color:var(--accent);box-shadow:var(--shadow-sm)}
@media(max-width:400px){.kb-levels button{padding:8px 12px;font-size:12px}}

.kb-groups{display:flex;flex-direction:column;gap:20px}
.kb-gh{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.kb-ghi{width:26px;height:26px;flex:none;border-radius:8px;background:var(--blue-soft);display:grid;place-items:center;color:var(--accent)}
.kb-ghi svg{width:16px;height:16px;stroke:currentColor;stroke-width:2.6;fill:none;stroke-linecap:round;stroke-linejoin:round}
.kb-gh b{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-2)}
.kb-glist{display:flex;flex-direction:column;gap:8px}

/* item do kit */
.kb-item{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:12px;border:1px solid var(--border);border-radius:16px;background:#fff;
  transition:border-color .2s,box-shadow .2s}
.kb-item:hover{border-color:rgba(14,90,230,.32);box-shadow:var(--shadow-sm)}
.kb-thumb{width:54px;height:54px;flex:none;border-radius:12px;background:var(--surface-2);display:grid;place-items:center;overflow:hidden}
.kb-thumb img{max-width:84%;max-height:84%;mix-blend-mode:multiply}
.kb-mid{flex:1 1 130px;min-width:0}
.kb-mid b{display:block;font-size:14px;font-weight:700;color:var(--ink);line-height:1.25}
.kb-why{display:block;font-size:12px;color:var(--ink-3);line-height:1.35;margin-top:2px}
.kb-swap{margin-top:4px;background:none;border:none;padding:0;font-family:var(--font-b);font-size:12px;font-weight:600;color:var(--accent);cursor:pointer;display:inline-flex;align-items:center;gap:4px}
.kb-swap svg{width:12px;height:12px;stroke:currentColor;stroke-width:2.4;fill:none;stroke-linecap:round;stroke-linejoin:round}
.kb-swap:hover{text-decoration:underline}
.kb-tail{flex:none;display:flex;align-items:center;gap:12px;margin-left:auto}
.kb-qty{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:8px;overflow:hidden}
.kb-qty button{width:28px;height:28px;border:none;background:#fff;color:var(--ink-2);font-size:16px;cursor:pointer;display:grid;place-items:center;transition:background .15s,color .15s}
.kb-qty button:hover{background:var(--blue-soft);color:var(--accent)}
.kb-qty i{min-width:22px;text-align:center;font-style:normal;font-size:14px;font-weight:700;color:var(--ink)}
.kb-price{font-family:var(--font-d);font-size:16px;font-weight:700;color:var(--blue-deep);letter-spacing:-.01em;min-width:74px;text-align:right}
.kb-rm{width:26px;height:26px;flex:none;border:none;background:none;color:var(--ink-3);cursor:pointer;border-radius:8px;font-size:18px;line-height:1;display:grid;place-items:center;transition:background .15s,color .15s}
.kb-rm:hover{background:#FDECEC;color:#E5484D}
.kb-swaps{flex:1 1 100%;display:none;flex-wrap:wrap;gap:8px;margin-top:2px;padding-top:12px;border-top:1px dashed var(--border)}
.kb-swaps.on{display:flex;animation:gdUp .3s cubic-bezier(.2,.8,.3,1)}
.kb-swapopt{display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid var(--border);border-radius:12px;background:#fff;cursor:pointer;font-family:var(--font-b);text-align:left;transition:border-color .18s,background .18s}
.kb-swapopt:hover{border-color:var(--accent)}
.kb-swapopt.cur{border-color:var(--accent);background:var(--blue-soft)}
.kb-swapopt img{width:26px;height:26px;object-fit:contain;mix-blend-mode:multiply;flex:none}
.kb-swapopt b{font-size:12px;font-weight:700;color:var(--ink);line-height:1.15;display:block}
.kb-swapopt em{font-style:normal;font-size:12px;color:var(--ink-3);font-weight:600}
@media(max-width:520px){
  .kb-tail{width:calc(100% - 67px);margin-left:67px;justify-content:space-between;gap:8px}
  .kb-price{min-width:0}
}

/* sugestão de completar o kit */
.kb-suggest{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:16px;padding:12px 16px;border:1px dashed var(--accent);border-radius:16px;background:var(--blue-soft)}
.kb-suggest[hidden]{display:none}
.kb-sph{width:40px;height:40px;flex:none;border-radius:8px;background:#fff;display:grid;place-items:center;overflow:hidden}
.kb-sph img{max-width:82%;max-height:82%;mix-blend-mode:multiply}
.kb-stx{flex:1 1 150px;min-width:0}
.kb-stx b{display:block;font-size:14px;font-weight:700;color:var(--ink)}
.kb-stx span{font-size:12px;color:var(--ink-2)}
.kb-sadd{flex:none;border:1.5px solid var(--accent);background:#fff;color:var(--accent);font-family:var(--font-b);font-weight:700;font-size:12px;border-radius:8px;padding:8px 12px;cursor:pointer;transition:background .18s,color .18s}
.kb-sadd:hover{background:var(--accent);color:#fff}

/* rodapé */
.kb-foot{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:20px;padding-top:20px;border-top:1px solid var(--border);flex-wrap:wrap}
.kb-tot{line-height:1.2}
.kb-tot b{font-family:var(--font-d);font-size:24px;color:var(--blue-deep);letter-spacing:-.02em;display:block}
.kb-tot>span{font-size:12px;color:var(--ink-2)}
.kb-tot em{font-style:normal;color:var(--ok);font-weight:700}
.kb-acts{display:flex;align-items:center;gap:16px}
@media(max-width:420px){
  .kb-acts{width:100%;justify-content:space-between}
  .kb-acts .btn{flex:1;justify-content:center}
}
.kb-empty{text-align:center;color:var(--ink-3);font-size:14px;padding:24px 12px}

@media(prefers-reduced-motion:reduce){
  .kb-step.on,.kb-swaps.on{animation:none}
  .kb-opt,.kb-goal,.kb-item{transition:none}
}

/* ---------- 5 · rota "direto da fábrica" (home, após spotlight Jaça) ---------- */
.gd-rota{background:var(--surface);border:1px solid var(--border);border-radius:24px;padding:32px 32px;box-shadow:var(--shadow-sm);overflow:hidden}
.gd-rota .rota-head{text-align:center;margin-bottom:8px}
.gd-rota .rota-head .eyebrow{justify-content:center}
.gd-rota .rota-head h3{font-family:var(--font-d);font-size:clamp(20px,2.6vw,24px);font-weight:800;letter-spacing:-.01em}
.gd-rt-svg{width:100%;height:auto;display:block;overflow:visible;max-width:720px;margin:8px auto 0}
.gd-rt-path{stroke:var(--border);stroke-width:2.5;fill:none}
.gd-rt-fill{stroke:url(#gdRtGrad);stroke-width:2.5;fill:none;stroke-linecap:round;stroke-dasharray:560;stroke-dashoffset:560}
.gd-go .gd-rt-fill{animation:gdRtDraw 2.4s cubic-bezier(.4,.2,.2,1) forwards}
@keyframes gdRtDraw{to{stroke-dashoffset:0}}
.gd-rt-node{opacity:0;transform:translateY(6px)}
.gd-go .gd-rt-node{animation:gdRtPop .5s cubic-bezier(.2,.8,.3,1) forwards}
.gd-go .gd-rt-node.n1{animation-delay:.05s}.gd-go .gd-rt-node.n2{animation-delay:.7s}
.gd-go .gd-rt-node.n3{animation-delay:1.35s}.gd-go .gd-rt-node.n4{animation-delay:2.05s}
@keyframes gdRtPop{to{opacity:1;transform:none}}
.gd-rt-lbl{font-family:var(--font-d);font-weight:700;font-size:12px;fill:var(--ink)}
.gd-rt-sub{font-size:10px;fill:var(--ink-3);font-family:var(--font-b)}

/* ---------- marquee de marcas (home, substitui a brands-strip) ---------- */
.gd-mq-sec{padding:32px 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--bg-soft);overflow:hidden}
/* carrossel + depoimentos = um bloco de confiança só: mata a borda dupla no encontro (sem costura de dois bandões) */
.gd-mq-sec + .sec-alt{border-top:none}
.gd-mq-sec .mq-label{text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:16px}
.gd-mq{position:relative;overflow:visible;padding-top:12px}
.gd-mq::before,.gd-mq::after{content:"";position:absolute;top:0;bottom:0;width:90px;z-index:2;pointer-events:none}
.gd-mq::before{left:0;background:linear-gradient(90deg,var(--bg-soft),transparent)}
.gd-mq::after{right:0;background:linear-gradient(270deg,var(--bg-soft),transparent)}
.gd-mq-track{display:flex;gap:16px;width:max-content;animation:gdMq 48s linear infinite}
.gd-mq:hover .gd-mq-track{animation-play-state:paused}
@keyframes gdMq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.gd-bcard{position:relative;width:178px;flex:none;min-height:86px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;
  border:1px solid var(--border);border-radius:16px;background:#fff;
  padding:16px;transition:border-color .25s,box-shadow .25s,transform .25s}
.gd-bcard:hover{border-color:rgba(14,90,230,.35);box-shadow:0 10px 24px rgba(14,90,230,.13);transform:translateY(-3px)}
.gd-bcard .bw{font-family:var(--font-d);font-weight:800;font-size:18px;letter-spacing:.02em;color:var(--blue-deep)}
.gd-bcard .bt{position:absolute;left:0;right:0;bottom:10px;width:max-content;margin:0 auto;
  font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--accent);background:var(--blue-soft);border-radius:999px;padding:4px 8px;
  opacity:0;transform:translateY(5px);transition:opacity .28s,transform .28s}
.gd-bcard:hover .bt{opacity:1;transform:none}
/* marcas-herói: SCAPEX (exclusivo) e Jaça (preferida do dono) ganham cartão azul cheio pra saltar das demais */
.gd-bcard.bx{border-color:transparent;background:linear-gradient(158deg,var(--accent-hi),var(--blue-deep));box-shadow:0 10px 24px rgba(10,46,134,.28)}
.gd-bcard.bx .bw{color:#fff}
.gd-bcard.bx .bt{color:var(--blue-deep);background:#fff}
.gd-bcard.bx:hover{border-color:transparent;box-shadow:0 14px 30px rgba(10,46,134,.4)}
.gd-bcard.bx .selo{position:absolute;top:-9px;right:12px;z-index:3;font-size:10px;font-weight:800;letter-spacing:.08em;color:var(--accent);
  background:#fff;padding:4px 8px;border-radius:999px;box-shadow:0 4px 10px rgba(8,32,95,.45)}
/* varredura de brilho (mesma do "Polir & detalhar"): faixa de gloss diagonal cruza o cartão sozinha, com descanso.
   fica num wrapper próprio com overflow:hidden pra clipar o gloss sem cortar o selo que sai pra fora do card */
.gd-bcard.bx .glow{position:absolute;inset:0;border-radius:12px;overflow:hidden;z-index:1;pointer-events:none}
.gd-bcard.bx .glow::after{content:"";position:absolute;top:-30%;left:-62%;width:42%;height:170%;
  transform:skewX(-18deg);opacity:0;
  background:linear-gradient(105deg,transparent,rgba(255,255,255,.22) 30%,rgba(255,255,255,.85) 50%,rgba(255,255,255,.22) 70%,transparent);
  animation:bcardGloss 5.4s ease-in-out infinite}
.gd-bcard.bx .bw{position:relative;z-index:2}
.gd-bcard.bx .bt{z-index:2}
@keyframes bcardGloss{0%,52%{left:-62%;opacity:0}60%{opacity:.9}78%{left:150%;opacity:.9}86%,100%{left:150%;opacity:0}}
.gd-mq:hover .gd-bcard.bx .glow::after{animation-duration:2.7s}
@media(prefers-reduced-motion:reduce){.gd-mq-track{animation:none;transform:none}.gd-bcard.bx .glow::after{animation:none}}

/* ---------- selo de exclusividade SCAPEX (home compacto + sobre) ---------- */
.gd-selo-band{display:flex;justify-content:center;padding:8px 0}
.gd-selo{position:relative;border-radius:24px;padding:24px 40px;text-align:center;color:#fff;max-width:400px;
  background:linear-gradient(155deg,#12328F,#08205F);box-shadow:0 20px 48px rgba(8,32,95,.4);
  transform-style:preserve-3d;transition:transform .3s cubic-bezier(.2,.8,.3,1);overflow:hidden;will-change:transform}
.gd-selo::before{content:"";position:absolute;inset:0;border-radius:24px;padding:1.6px;pointer-events:none;
  background:conic-gradient(from var(--hg,0deg),rgba(143,193,255,0),rgba(143,193,255,.9),rgba(255,255,255,.95),rgba(46,116,255,.7),rgba(143,193,255,0) 62%);
  -webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.gd-go .gd-selo::before{animation:gdSeloEdge 4.5s linear infinite}
@keyframes gdSeloEdge{to{--hg:360deg}}
@property --hg{syntax:'<angle>';initial-value:0deg;inherits:false}
.gd-selo::after{content:"";position:absolute;top:-40%;left:-60%;width:40%;height:180%;transform:skewX(-18deg);opacity:0;pointer-events:none;
  background:linear-gradient(105deg,transparent,rgba(255,255,255,.32),transparent)}
.gd-go .gd-selo::after{animation:gdSeloSweep 3.8s ease-in-out infinite}
@keyframes gdSeloSweep{0%,14%{left:-60%;opacity:0}26%{opacity:1}54%,100%{left:160%;opacity:0}}
.gd-selo .h-k{font-size:10px;font-weight:800;letter-spacing:.22em;opacity:.78}
.gd-selo .h-b{font-family:var(--font-d);font-weight:800;font-size:clamp(24px,4vw,30px);letter-spacing:.04em;margin:4px 0 4px}
.gd-selo .h-s{font-size:12px;font-weight:600;letter-spacing:.06em;color:#9FC3FF}
.gd-selo .h-chip{display:inline-flex;align-items:center;gap:8px;margin-top:12px;font-size:11px;font-weight:800;letter-spacing:.1em;
  background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);padding:8px 16px;border-radius:999px}
.gd-selo .h-chip svg{width:13px;height:13px;stroke:#8FF0BE;stroke-width:3;fill:none;stroke-linecap:round;stroke-linejoin:round}
@media(prefers-reduced-motion:reduce){.gd-selo::before,.gd-selo::after{animation:none!important}.gd-selo{transition:none}}

/* ---------- timeline-estrada (sobre) ---------- */
.gd-tl{position:relative;max-width:760px;margin:0 auto;padding:8px 0}
.gd-tl-road{position:absolute;left:50%;top:8px;bottom:8px;width:10px;transform:translateX(-50%);
  border-radius:999px;background:var(--surface-2);overflow:hidden}
.gd-tl-fill{position:absolute;left:0;right:0;top:0;height:0;border-radius:999px;
  background:linear-gradient(180deg,var(--accent-hi),var(--blue-deep))}
.gd-tl-fill::after{content:"";position:absolute;left:50%;top:0;bottom:0;width:1.6px;transform:translateX(-50%);
  background:repeating-linear-gradient(180deg,rgba(255,255,255,.85) 0 8px,transparent 8px 18px)}
.gd-go .gd-tl-fill{animation:gdTlFill 2.6s cubic-bezier(.4,.2,.25,1) forwards}
@keyframes gdTlFill{to{height:100%}}
.gd-tl-row{position:relative;display:grid;grid-template-columns:1fr 40px 1fr;align-items:center;min-height:96px}
.gd-tl-dot{grid-column:2;justify-self:center;width:16px;height:16px;border-radius:50%;z-index:2;
  background:#fff;border:3.5px solid var(--accent);box-shadow:0 0 0 4px rgba(14,90,230,.14);transform:scale(0)}
.gd-go .gd-tl-dot{animation:gdTlDot .45s cubic-bezier(.2,.8,.3,1) forwards}
@keyframes gdTlDot{to{transform:scale(1)}}
.gd-tl-card{opacity:0}
.gd-tl-row.l .gd-tl-card{grid-column:1;text-align:right;transform:translateX(-10px)}
.gd-tl-row.r .gd-tl-card{grid-column:3;transform:translateX(10px)}
.gd-go .gd-tl-card{animation:gdTlIn .55s cubic-bezier(.2,.8,.3,1) forwards}
@keyframes gdTlIn{to{opacity:1;transform:translateX(0)}}
.gd-tl-card b{font-family:var(--font-d);font-size:16px;font-weight:800;color:var(--blue-deep);display:block}
.gd-tl-card b em{font-style:normal;color:var(--accent)}
.gd-tl-card span{font-size:14px;color:var(--ink-2);line-height:1.45;display:block;margin-top:4px}
@media(max-width:560px){
  .gd-tl-road{left:19px}
  .gd-tl-row{grid-template-columns:40px 1fr;min-height:auto;margin-bottom:24px}
  .gd-tl-dot{grid-column:1}
  .gd-tl-row.l .gd-tl-card,.gd-tl-row.r .gd-tl-card{grid-column:2;text-align:left;transform:translateX(10px)}
}
@media(prefers-reduced-motion:reduce){.gd-tl-fill{height:100%!important}.gd-tl-dot{transform:scale(1)}.gd-tl-card{opacity:1;transform:none}}

/* ---------- status vivo das lojas (sobre/contato · upgrade da u-pill) ---------- */
.u-pill.live .dot{animation:gdStorePulse 2s ease-out infinite}
.u-pill.live.off{background:rgba(20,30,54,.6)}
.u-pill.live.off .dot{background:var(--ink-3);animation:none}
@keyframes gdStorePulse{0%{box-shadow:0 0 0 0 rgba(124,240,180,.55)}70%,100%{box-shadow:0 0 0 6px rgba(124,240,180,0)}}
@media(prefers-reduced-motion:reduce){.u-pill.live .dot{animation:none}}

/* ---------- scanner de inspeção (PDP · varre a foto 1×) ---------- */
.gd-scan-line{position:absolute;left:10px;right:10px;top:-8%;height:2.5px;border-radius:999px;opacity:0;z-index:3;pointer-events:none;
  background:linear-gradient(90deg,transparent,var(--accent-hi) 22%,#8FC1FF 50%,var(--accent-hi) 78%,transparent);
  box-shadow:0 0 14px 3px rgba(46,116,255,.5)}
.gd-scan-glow{position:absolute;left:0;right:0;top:-30%;height:26%;opacity:0;z-index:2;pointer-events:none;
  background:linear-gradient(180deg,transparent,rgba(46,116,255,.1))}
.gd-scan .gd-scan-line{animation:gdScanSweep 1.25s cubic-bezier(.45,.1,.35,1) .2s}
.gd-scan .gd-scan-glow{animation:gdScanSweep 1.25s cubic-bezier(.45,.1,.35,1) .2s}
@keyframes gdScanSweep{0%{top:-8%;opacity:0}8%{opacity:1}92%{opacity:1}100%{top:106%;opacity:0}}
.gd-scan-stamp{position:absolute;left:50%;bottom:16px;transform:translate(-50%,10px);opacity:0;z-index:4;
  display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid #C9EEDD;border-radius:999px;
  padding:8px 16px;font-size:12px;font-weight:700;color:#0B8A50;box-shadow:0 8px 20px rgba(16,40,80,.14);white-space:nowrap}
.gd-scan .gd-scan-stamp{animation:gdScanStamp .5s cubic-bezier(.2,.8,.3,1) 1.45s forwards}
@keyframes gdScanStamp{to{opacity:1;transform:translate(-50%,0)}}
.gd-scan-stamp svg{width:14px;height:14px;stroke:#0B8A50;stroke-width:3.4;fill:none;stroke-linecap:round;stroke-linejoin:round}
@media(max-width:560px){.gd-scan-stamp{font-size:11px;padding:8px 12px}}
@media(prefers-reduced-motion:reduce){.gd-scan-line,.gd-scan-glow{display:none}.gd-scan-stamp{opacity:1;transform:translate(-50%,0);animation:none}}

/* ---------- "pediu, postou": envio honesto (PDP) ---------- */
.gd-cut{display:flex;align-items:center;gap:12px;background:var(--surface-2);border:1px solid var(--border);border-radius:16px;
  padding:16px 16px;margin-top:16px}
.gd-cut .co-i{width:42px;height:42px;flex:none;border-radius:12px;background:var(--blue-soft);display:grid;place-items:center;color:var(--accent)}
.gd-cut .co-i svg{width:25px;height:25px;stroke:currentColor;stroke-width:2.4;fill:none;stroke-linecap:round;stroke-linejoin:round}
.gd-cut b{font-size:14px;font-weight:700;display:block;line-height:1.3;color:var(--ink)}
.gd-cut span{font-size:12px;color:var(--ink-2);display:block;margin-top:2px}
.gd-cut span em{font-style:normal;font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums}

/* ---------- 9 · antes/depois (slider de resultado · demo estilizado) ----------
   Painéis sintéticos em CSS (lataria apagada × pintura com brilho) enquanto não
   chegam as FOTOS REAIS do Renan. Troca demo→foto = Fase 13.5 (Ativação). */
.gd-ba-wrap{max-width:720px;margin:0 auto}
.gd-ba{position:relative;width:100%;aspect-ratio:16/9;border-radius:24px;overflow:hidden;
  cursor:ew-resize;touch-action:none;user-select:none;box-shadow:0 20px 50px rgba(8,25,60,.28)}
.gd-ba-l{position:absolute;inset:0}
.gd-ba-after{background:url("../img/audi-antes.webp") center center/cover no-repeat}
.gd-ba-after::after{content:"";position:absolute;top:-30%;left:-40%;width:34%;height:160%;transform:skewX(-18deg);
  background:linear-gradient(105deg,transparent,rgba(255,255,255,.18),transparent);animation:gdBaSheen 4.6s ease-in-out infinite;pointer-events:none}
@keyframes gdBaSheen{0%,20%{left:-40%}60%,100%{left:150%}}
.gd-ba-before{clip-path:inset(0 calc(100% - var(--cut,50%)) 0 0);
  background:url("../img/audi-depois.webp") center center/cover no-repeat}
.gd-ba-tag{position:absolute;top:14px;font-size:11px;font-weight:800;letter-spacing:.09em;padding:4px 12px;border-radius:999px;z-index:3;color:#fff}
.gd-ba-tag.a{left:14px;background:rgba(20,26,40,.55);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}
.gd-ba-tag.b{right:14px;background:rgba(14,90,230,.85)}
.gd-ba-bar{position:absolute;top:0;bottom:0;left:var(--cut,50%);width:2.5px;background:#fff;z-index:4;box-shadow:0 0 12px rgba(0,0,0,.35)}
.gd-ba-knob{position:absolute;top:50%;left:var(--cut,50%);transform:translate(-50%,-50%);z-index:5;
  width:46px;height:46px;border-radius:50%;background:#fff;display:grid;place-items:center;
  box-shadow:0 6px 18px rgba(4,14,50,.4);color:var(--blue-deep);font-weight:800;font-size:16px;pointer-events:none}
.gd-ba-note{text-align:center;font-size:12px;color:var(--ink-3);margin-top:12px;display:flex;align-items:center;justify-content:center;gap:8px}
.gd-ba-note svg{width:15px;height:15px;stroke:var(--accent);stroke-width:2.2;fill:none;stroke-linecap:round;stroke-linejoin:round}
@media(prefers-reduced-motion:reduce){.gd-ba-after::after{animation:none}}

/* ---------- 12 · WhatsApp contextual (FAB site-wide, injetado) ---------- */
.gd-wafab{position:fixed;right:20px;bottom:20px;z-index:130;display:flex;align-items:center;
  background:#fff;border:1px solid #C9EEDD;border-radius:999px;box-shadow:0 12px 30px rgba(11,138,80,.28);
  overflow:hidden;cursor:pointer;text-decoration:none;
  transform:translateY(120%);opacity:0;transition:transform .45s cubic-bezier(.2,.8,.25,1),opacity .3s}
.gd-wafab.in{transform:translateY(0);opacity:1}
.gd-wafab.hide{transform:translateY(120%);opacity:0;pointer-events:none}
.gd-wafab .wa-ic{width:54px;height:54px;flex:none;display:grid;place-items:center;background:#25D366;color:#fff;border-radius:999px;margin:4px}
.gd-wafab .wa-ic svg{width:27px;height:27px;stroke:currentColor;stroke-width:2.1;fill:none;stroke-linecap:round;stroke-linejoin:round}
.gd-go-wa .gd-wafab .wa-ic{animation:gdWaPop 5s ease-in-out infinite}
@keyframes gdWaPop{0%,86%,100%{transform:scale(1)}92%{transform:scale(1.07)}}
.gd-wafab .wa-tx{max-width:0;opacity:0;white-space:nowrap;overflow:hidden;
  transition:max-width .5s cubic-bezier(.2,.8,.3,1),opacity .35s,padding .5s;
  font-size:14px;font-weight:600;color:var(--ink);padding:0}
.gd-wafab.open .wa-tx{max-width:240px;opacity:1;padding:0 20px 0 8px}
.gd-wafab .wa-tx em{font-style:normal;display:block;font-size:11px;font-weight:500;color:var(--ink-3)}
@media(max-width:860px){
  .gd-wafab{right:14px;bottom:14px}
  /* Trilho M (20/07): na PDP mobile o zap SAI de cena — a página já tem o link
     "pergunta rápida no WhatsApp" no buy-box, e três flutuantes + barra de compra
     era chrome demais brigando com o preço. Menos moldura, mais palco. */
  body[data-page="produto"] .gd-wafab{display:none}
}
/* Celular: o FAB fica só no círculo verde (padrão universal do WhatsApp).
   A frase larga que auto-abre cobria o preço/hero em tela estreita — no toque abre
   o WhatsApp direto. Trilho M rodada 2: subiu de 600→760 (o teto do chip escuro):
   entre 601-760 o balão abria com TEXTO ESCURO sobre o chip escuro — ilegível. */
@media(max-width:760px){
  .gd-wafab.open .wa-tx{max-width:0;opacity:0;padding:0}
}
@media(prefers-reduced-motion:reduce){.gd-wafab .wa-ic{animation:none}}

/* ---------- 13 · drawer do carrinho (injetado, site-wide) ---------- */
.gd-scrim{position:fixed;inset:0;background:rgba(8,25,60,.4);opacity:0;pointer-events:none;transition:opacity .35s;z-index:240}
.gd-scrim.on{opacity:1;pointer-events:auto}
.gd-drawer{position:fixed;top:0;bottom:0;right:0;width:min(360px,90%);background:#fff;z-index:250;
  box-shadow:-16px 0 44px rgba(8,25,60,.24);transform:translateX(105%);
  transition:transform .45s cubic-bezier(.2,.8,.25,1);display:flex;flex-direction:column}
.gd-drawer.on{transform:none}
.gd-drawer .dw-h{display:flex;align-items:center;justify-content:space-between;padding:20px 20px;border-bottom:1px solid var(--border)}
.gd-drawer .dw-h b{font-family:var(--font-d);font-size:16px;display:flex;align-items:center;gap:8px;color:var(--ink)}
.gd-drawer .dw-h b svg{width:18px;height:18px;stroke:var(--ok);stroke-width:3.2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.gd-dw-x{width:32px;height:32px;border-radius:8px;border:1px solid var(--border);background:#fff;cursor:pointer;font-size:14px;color:var(--ink-2)}
.gd-dw-x:hover{background:var(--surface-2);color:var(--accent)}
.gd-dw-body{padding:20px 20px;overflow:auto;flex:1}
.gd-dw-item{display:flex;gap:12px;align-items:center;border:1px solid var(--border);border-radius:16px;padding:12px}
.gd-dw-item .i-ph{width:54px;height:58px;flex:none;display:grid;place-items:center}
.gd-dw-item .i-ph img{max-height:54px;max-width:48px;mix-blend-mode:multiply}
.gd-dw-item b{font-size:14px;font-weight:600;line-height:1.3;display:block;color:var(--ink)}
.gd-dw-item span{font-size:12px;color:var(--ink-2)}
.gd-dw-item span em{font-style:normal;color:var(--ok);font-weight:700}
.gd-dw-more{font-size:12px;color:var(--ink-3);text-align:center;margin-top:12px}
.gd-dw-opts{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:16px 0}
.gd-dw-opt{border:1.5px solid var(--border);border-radius:12px;padding:12px 8px;text-align:center;font-size:11px;font-weight:600;
  color:var(--ink-2);cursor:pointer;transition:.2s;background:#fff;font-family:var(--font-b)}
.gd-dw-opt.on{border-color:var(--accent);color:var(--accent);background:var(--blue-soft)}
.gd-dw-opt b{display:block;font-size:12px;color:inherit;margin-bottom:1px}
.gd-dw-foot{padding:16px 20px calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--border)}
.gd-dw-sum{display:flex;justify-content:space-between;align-items:baseline;font-size:14px;color:var(--ink-2);margin-bottom:12px}
.gd-dw-sum b{font-family:var(--font-d);font-size:20px;color:var(--blue-deep)}
.gd-dw-keep{margin-top:8px;width:100%;background:none;border:none;font-family:var(--font-b);font-size:12px;font-weight:600;color:var(--ink-2);cursor:pointer;text-decoration:underline}

/* ============================================================
   TEMA ESCURO — pivô "pegada jovem / preto + azul" (Renan, 08/07/2026)
   Aprovado no hero, agora no site inteiro. BLOCO ÚNICO no fim do CSS:
   re-declara os tokens do :root e corrige os brancos cravados na mão.
   Vence por ordem de fonte (é o último). Reverter = apagar este bloco.
   Decisões travadas:
   · header fica CLARO de propósito (o logo colorido horizontal só lê
     bem em fundo claro; texto do menu é fixado escuro aqui embaixo);
   · tiles de foto de produto ficam CLAROS (mix-blend-mode:multiply
     exige fundo claro, senão a foto sobre fundo branco some no escuro).
   ============================================================ */
:root{
  --bg:#070B14;
  --bg-grad:#0A1322;
  --bg-soft:#0C1526;
  --surface:#111A2E;
  --surface-2:#18233B;
  --border:rgba(255,255,255,.09);
  --border-soft:rgba(255,255,255,.055);
  --accent:#3F84FF;
  --accent-hi:#6EA8FF;
  --blue-soft:rgba(46,116,255,.14);
  --ok:#1FC776;
  --ok-dim:rgba(31,199,118,.15);
  --ink:#EEF2FA;
  --ink-2:#AEB8D4;
  --ink-3:#7E8AA6;
  --shadow:0 10px 34px rgba(0,0,0,.45);
  --shadow-sm:0 3px 14px rgba(0,0,0,.34);
  --glow:0 14px 36px rgba(46,116,255,.30);
}

/* HEADER — ilha vira VIDRO ESCURO + logomarca branca (filtro no logo horizontal) */
.nav-island{background:rgba(10,16,28,.72);border:1px solid rgba(255,255,255,.08);box-shadow:0 10px 34px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.05)}
.nav-island.scrolled{background:rgba(10,16,28,.9);box-shadow:0 16px 44px rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.06)}
.logo-img:not(.foot){filter:brightness(0) invert(1)}
.nav-links a{color:var(--ink-2)}
.nav-links a:hover{color:#fff;background:rgba(255,255,255,.07)}
.nav-links a.active{color:#7FB0FF;background:rgba(63,132,255,.16)}
.icon-btn{color:var(--ink-2)}
.icon-btn:hover{color:#fff;background:rgba(255,255,255,.07)}
.burger span{background:#EEF2FA}

/* BOTÃO FANTASMA no escuro */
.btn-ghost{background:transparent;border-color:rgba(255,255,255,.22);color:var(--ink)}
.btn-ghost:hover{border-color:rgba(255,255,255,.5);background:rgba(255,255,255,.06);color:#fff}

/* CARD DE PRODUTO — tile da foto FICA CLARO (multiply precisa de fundo claro) */
.card-prod .thumb{background:radial-gradient(220px 160px at 50% 32%, #E9F0FC, transparent 66%), #EDF2FB}
.card-prod .thumb .badge-dark{background:#0B1220;color:#fff}
.card-prod:hover{border-color:rgba(46,116,255,.45)}

/* BUSCA · MENUS · CHIPS · CARDS que eram brancos cravados */
.mobile-menu{background:var(--surface);border-color:var(--border-soft)}
.search-panel{background:var(--surface)}
.gd-schip{background:var(--surface-2);border-color:var(--border);color:var(--ink-2)}
.goal{background:var(--surface-2);border-color:var(--border)}
.chip-f{background:var(--surface-2);border-color:var(--border);color:var(--ink-2)}
.trust-strip{border-color:rgba(46,116,255,.28)}

/* MONTE SEU KIT — botões/tiles brancos → escuros (thumbs de foto ficam claros) */
.kb-opt,.kb-goal,.kb-item{background:var(--surface-2)}
.kb-qty button{background:var(--surface-2);color:var(--ink-2)}
.kb-thumb{background:#EDF2FB}
.kb-swapopt{background:var(--surface-2)}
.kb-swapopt img{mix-blend-mode:normal;background:#fff;padding:2px;border-radius:4px}
.kb-rm:hover{background:rgba(229,72,77,.16);color:#FF8A8E}

/* anti-flash do robô-no-corre — mata o flash branco no carregamento
   (o splash da porta de aço já nasce escuro no bloco base, não precisa de override) */
html.gd-cartload-hold::before{background:linear-gradient(180deg,#070B14 30%,#0A1322 130%)}
#gd-cartload{background:linear-gradient(180deg,#070B14 30%,#0C1730 130%)}

/* CONTATO — faixa decorativa, pin do mapa, campo com erro, hero das legais */
.map-card::after{background:rgba(46,116,255,.16)}
.map-pin .pin-label{background:var(--surface);color:var(--ink);border-color:var(--border)}
.cf-field input.err,.cf-field textarea.err{background:rgba(229,72,77,.12)}
.legal-hero{background:radial-gradient(900px 380px at 84% -30%, rgba(46,116,255,.14), transparent 60%),linear-gradient(180deg,#0A1322,#070B14)}
/* HEROS de página (loja/contato/sobre) — tinham linear-gradient(#fff,...) */
.shop-hero,.page-hero{background:radial-gradient(1000px 420px at 86% -18%, rgba(46,116,255,.16), transparent 60%),linear-gradient(180deg,#0B1526,#070B14)}

/* CHECKOUT · barra do topo vira ESCURA (logo branco via filtro acima) */
.co-top{background:rgba(10,16,28,.86);border-bottom-color:rgba(255,255,255,.08);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}
.co-back{color:var(--ink-2)}
.co-back:hover{color:#7FB0FF}
.co-secure{color:#1FC776}

/* FAB WhatsApp — pílula branca fica (alto contraste no escuro), texto fixado escuro */
.gd-wafab .wa-tx{color:#0E1A2E}
.gd-wafab .wa-tx em{color:#5A6480}

/* DRAWER DO CARRINHO — painel branco → escuro (texto já vira claro via tokens) */
.gd-drawer{background:var(--surface)}
.gd-dw-x{background:var(--surface-2)}
.gd-dw-opt{background:var(--surface-2)}
.gd-dw-item .i-ph{background:#EDF2FB;border-radius:8px}

/* BLOG · cada artigo tem <style> inline (que vence o style.css por ordem de fonte);
   subo a especificidade com `body` pra corrigir os claros cravados em TODOS de uma vez. */
body .art-cat{background:rgba(46,116,255,.16);color:#8FB8FF}
body .art-callout{background:rgba(46,116,255,.10);border-left-color:var(--accent);color:var(--ink-2)}
body .art-callout strong,body .art-callout b{color:var(--ink)}
body .art-prod{background:var(--surface);box-shadow:none}
body .art-prod img{mix-blend-mode:normal;background:#fff;padding:4px;border-radius:8px}

/* ============================================================
   A 01 DO LITORAL — v3 (08/07/2026 · APROVADO TUDO pelo Anthony)
   Direção completa em site/direcao-dark.html. Sistema:
   · 3 vozes: GÓTICA Pirata One (atitude, máx 3 palavras) ·
     TAG Sedgwick Ave (assinaturas) · SORA/INTER (100% transação)
   · materiais: chrome GTA, neon, LED, placa, fita, stickers
   · medidor rua×loja: home 70% → checkout 5% → CRM 0% (sem street)
   · bordão oficial: "A 01 DO LITORAL" (grafia da camiseta)
   Regra de ouro: a rua assina, a loja vende. Grafite NUNCA em
   preço/frete/form. Reverter = apagar este bloco + v2 acima.
   ============================================================ */
:root{
  /* tokens finais da direção (afinados sobre o PASS 2) */
  --bg:#080B16;
  --bg-grad:#0B1120;
  --bg-soft:#0B1120;
  --surface:#101827;
  --surface-2:#18233A;
  --accent:#2E74FF;         /* elétrico: botão/CTA (preenchimento) */
  --accent-hi:#5B90FF;
  --blue-txt:#7FB3FF;       /* azul CLARO: todo texto/link azul (~7:1) */
  --cyan:#38E1F2;           /* a faísca jovem: ativo, exclusivo, borda */
  --cyan-soft:rgba(56,225,242,.13);
  --ink:#F5F8FF;
  --ink-2:#C6D0E6;
  --ink-3:#93A0BC;
  --ok:#2FD08A;
  --font-gt:'Pirata One',cursive;          /* voz 1 · gótica (GTA) */
  --font-tag:'Sedgwick Ave Display',cursive; /* voz 2 · tag (grafite) */
}
/* fundo com focos de luz (showroom à noite) + textos azuis re-apontados */
/* sangria horizontal: cada elemento sangrante tem seu PRÓPRIO wrapper com overflow:hidden
   (.gd-fita-wrap, section.hero, footer.site). NUNCA pôr overflow-x:clip no html/body —
   mata position:sticky no Chromium (a galeria da PDP para de acompanhar). O body segue
   com o overflow-x:hidden original da base (propaga pro viewport e preserva sticky). */
body{background:
  radial-gradient(1200px 700px at 82% -4%, rgba(46,116,255,.13), transparent 54%),
  radial-gradient(800px 520px at 0% 30%, rgba(56,225,242,.05), transparent 55%),
  #080B16}
.eyebrow,.faq-cat,.brands-strip .bl-label{color:var(--blue-txt)}
.eyebrow::before{background:var(--blue-txt)}
.card-prod .cat b{color:var(--blue-txt)}
.gd-tb .n em{color:var(--blue-txt)}
.kb-price,.kb-tot b,.gd-dw-sum b{color:var(--blue-txt)}

/* ---------- VOZ 1 · gótica chrome (o metal do GTA) ---------- */
.gt-chrome{
  font-family:var(--font-gt);font-weight:400;letter-spacing:.02em;
  background:linear-gradient(180deg,#FFFFFF 0%,#D7E1EF 28%,#93A7C4 46%,#F2F7FF 52%,#5E7291 68%,#CBD8E9 86%,#8FA3C0 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.55)) drop-shadow(0 0 18px rgba(127,179,255,.2));
}
h1 .gt-chrome,h2 .gt-chrome{font-size:1.16em;line-height:1}

/* ---------- VOZ 2 · assinatura em tag ---------- */
.st-tag{font-family:var(--font-tag);font-weight:400;color:var(--cyan);
  transform:rotate(-2deg);display:inline-block;text-shadow:0 0 18px rgba(56,225,242,.35)}
.hero-ass{font-size:clamp(16px,2.2vw,20px);margin:2px 0 8px}

/* tag fantasma (a parede grafitada) — sutil, atrás do hero */
section.hero .wrap{position:relative}
section.hero .wrap::before{content:"a 01 do litoral";position:absolute;right:-40px;top:34px;z-index:0;
  font-family:var(--font-tag);font-size:clamp(60px,9vw,120px);color:#fff;opacity:.03;
  transform:rotate(-6deg);white-space:nowrap;pointer-events:none}
section.hero .wrap>*{position:relative;z-index:1}

/* ---------- faixas de mixtape (sec-heads numerados) ---------- */
.fxn{font-family:var(--font-gt);font-weight:400;font-size:1.5em;letter-spacing:.03em;
  background:linear-gradient(180deg,#FFFFFF,#D7E1EF 30%,#93A7C4 48%,#F2F7FF 54%,#5E7291 72%,#CBD8E9 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;margin-right:2px}
.eyebrow .fxn{text-transform:none}
/* linha-player (1 assinatura, usada só na seção Destaques) */
.fx-player{display:flex;align-items:center;gap:12px;margin:12px 0 0}
.fx-player .tri{width:0;height:0;border-left:9px solid var(--cyan);border-top:6px solid transparent;border-bottom:6px solid transparent;filter:drop-shadow(0 0 8px rgba(56,225,242,.7));flex-shrink:0}
.fx-player .ln{flex:1;height:2.5px;border-radius:999px;background:var(--surface-2);position:relative}
.fx-player .ln i{position:absolute;left:0;top:0;bottom:0;width:34%;border-radius:999px;background:linear-gradient(90deg,var(--accent),var(--cyan))}
.fx-player .ln i::after{content:"";position:absolute;right:-4px;top:50%;transform:translateY(-50%);width:9px;height:9px;border-radius:50%;background:#fff;box-shadow:0 0 10px rgba(127,179,255,.9)}
.fx-player span{font-size:10px;letter-spacing:.14em;color:var(--ink-3);font-family:var(--font-d);font-weight:700;flex-shrink:0}

/* ---------- fita de oficina (1 por página, momento raro) ----------
   Vive no LACRE DA ENTRADA (logo abaixo do hero). Duas vozes na tinta: escura =
   identidade, .claro = fato de serviço (praças, frete, exclusividade) — fita que
   trabalha, não só canta. O loop é garantido pelo components.js (dobra o conteúdo
   até ≥2× a tela e calibra a duração pela largura); o -50% aqui é só o motor. */
.gd-fita-wrap{overflow:hidden;margin:8px 0;padding:16px 0} /* clipa a rotação/sangria sem criar scroll lateral */
.gd-fita{transform:rotate(-1.3deg) scale(1.04);background:linear-gradient(180deg,#2E74FF,#1B54D8);
  box-shadow:0 10px 28px rgba(46,116,255,.28);overflow:hidden;
  border-top:2px solid rgba(255,255,255,.25);border-bottom:2px solid rgba(4,10,26,.5)}
.gd-fita .frail{display:flex;align-items:center;width:max-content;animation:gdFitaRolar 34s linear infinite;padding:8px 0}
.gd-fita span{font-family:var(--font-d);font-weight:800;font-size:14px;letter-spacing:.3em;color:#05122E;white-space:nowrap;margin-right:20px}
.gd-fita span.gt2{font-family:var(--font-gt);font-weight:400;letter-spacing:.1em;font-size:16px}
.gd-fita span.claro{color:#EAF2FF;text-shadow:0 1px 0 rgba(4,10,26,.35)}
.gd-fita .fsep{font-style:normal;font-size:11px;line-height:1;color:rgba(5,18,46,.5);margin-right:20px}
@keyframes gdFitaRolar{to{transform:translateX(-50%)}}

/* ---------- letreiro LED: reestilo do marquee de marcas existente ---------- */
.gd-mq-sec{position:relative}
.gd-mq{position:relative;background:#080C15;border-top:1px solid rgba(255,255,255,.08);border-bottom:1px solid rgba(255,255,255,.08);
  box-shadow:inset 0 2px 18px rgba(0,0,0,.7)}
.gd-mq::before{content:"";position:absolute;inset:0;pointer-events:none;
  background-image:radial-gradient(rgba(127,179,255,.2) 1.1px,transparent 1.2px);background-size:12px 12px;opacity:.5}
.gd-mq::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(180deg,transparent 0 3px,rgba(0,0,0,.22) 3px 4.5px)}
.gd-bcard{background:transparent;border:none;box-shadow:none}
.gd-bcard .bw{color:var(--blue-txt);text-shadow:0 0 16px rgba(46,116,255,.7)}
.gd-bcard.bx{background:transparent;box-shadow:none;border:1px solid rgba(56,225,242,.35)}
.gd-bcard.bx .bw{color:var(--cyan);text-shadow:0 0 8px rgba(56,225,242,.9),0 0 30px rgba(56,225,242,.4)}
.gd-bcard.bx .bt{color:#04121e;background:var(--cyan)}
.mq-label{color:var(--ink-3)}

/* ---------- placa da casa (Mercosul rebaixada · rodapé/PDP) ---------- */
.placa-gd{width:200px;border-radius:8px;overflow:hidden;border:3px solid #E8EEF8;
  box-shadow:0 8px 22px rgba(0,0,0,.5),inset 0 0 0 1.5px #0B1220;flex-shrink:0}
.placa-gd .topo{background:linear-gradient(180deg,#1450D8,#0A2E86);display:flex;justify-content:space-between;align-items:center;
  padding:4px 8px;font-family:var(--font-d);font-weight:700;font-size:8px;letter-spacing:.22em;color:#EAF1FF}
.placa-gd .num{background:#0D1322;text-align:center;padding:8px 8px 12px;font-family:var(--font-d);font-weight:800;
  font-size:24px;letter-spacing:.14em;color:#F5F8FF;text-shadow:0 2px 0 rgba(0,0,0,.65)}
.placa-gd .num i{font-style:normal;color:var(--cyan);text-shadow:0 0 14px rgba(56,225,242,.6)}

/* ---------- footer: a tag assina, a placa carimba ---------- */
.foot-ass{font-family:var(--font-tag);font-size:24px;color:#fff;transform:rotate(-2deg);display:inline-block;margin:12px 0 4px}
.foot-ass small{display:block;font-family:var(--font-tag);font-size:14px;color:var(--cyan);margin-top:2px}
.foot-lit{font-family:var(--font-d);font-weight:700;font-size:10px;letter-spacing:.2em;color:rgba(255,255,255,.55)}
footer.site{border-top-color:var(--accent)}
.foot-col h4{color:var(--cyan)}
.foot-col h4::before{background:var(--cyan)}

/* O CHIP "NA RÉGUA ✓" da PDP FOI REMOVIDO (Anthony, 13/07: "simplista e genérico").
   Único uso era o card de curadoria do produto.html — o CSS foi embora com ele.
   O bordão "NA RÉGUA" continua onde SIGNIFICA: o carimbo do antes/depois na home
   (FX.04) e a fita do rodapé. Não confundir com `.gd-regua-pico`, que é a régua
   desenhada (SVG) do laudo e segue viva. */

/* ---------- stamps carimbados nos cards de produto ---------- */
.card-prod .thumb .badge{border-radius:0;clip-path:none;transform:rotate(-3deg);
  border:1.5px solid rgba(255,255,255,.3);box-shadow:0 4px 10px rgba(0,0,0,.3)}
.card-prod .thumb .badge-ok{transform:rotate(2deg)}

/* ---------- neon "acende" 1× (títulos com .gd-neon-in, via .gd-go do observer) ---------- */
@keyframes gdNeonIn{0%{opacity:.25}8%{opacity:1}12%{opacity:.3}17%{opacity:1}24%{opacity:.45}30%,100%{opacity:1}}
.gd-anim .gt-chrome{animation:none}
.gd-go .gt-chrome,.gd-neon-run .gt-chrome{animation:gdNeonIn 1.1s linear 1}

/* ---------- kit: card ancorado (o visual street dele vive no bloco RODADA FINAL) ---------- */
.kb{position:relative}

/* ============ ROUND 2 · refinos do Anthony (08/07) ============ */

/* CHROME LEGÍVEL v2 — mais luz no metal + contorno + glow (feedback: "bonita mas ruim de ler") */
.gt-chrome,.fxn{
  background:linear-gradient(180deg,#FFFFFF 0%,#EDF3FE 30%,#C6D6F0 46%,#FFFFFF 52%,#A6BBDD 66%,#F1F6FF 84%,#CCDAF2 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2.5px 0 rgba(0,0,0,.72)) drop-shadow(0 0 14px rgba(127,179,255,.4));
}
/* neon acende 1×: no load (h1) e ao entrar na tela (sec-heads via .rv.in do initReveal) */
h1 .gt-chrome{animation:gdNeonIn 1.15s linear .35s 1 both}
.rv.in .gt-chrome,.rv.in .fxn{animation:gdNeonIn 1.05s linear 1}

/* assinatura do hero: assina os CTAs (era "deslocada" entre h1 e lead) */
.hero-ass{font-size:clamp(14px,1.9vw,18px);margin:0 0 16px;opacity:.95}

/* (a vitrine de objetivos virou AS SAÍDAS DA 01 — placas de serviço, bloco
   próprio na seção 3; os overrides dark do card antigo morreram com ele) */

/* SPOTLIGHT Jaça — legível: fundo mais fundo, texto mais claro */
.spotlight{background:
  radial-gradient(700px 340px at 85% 15%, rgba(56,225,242,.10), transparent 60%),
  linear-gradient(140deg,#123B9E,#081B4D)}
.spotlight p{color:#DCE6FA}
.spotlight .eyebrow{color:#7FEAF6}
.spotlight .eyebrow::before{background:#7FEAF6}
.sp-exclu{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-d);font-weight:800;font-size:11px;
  letter-spacing:.12em;color:#04121e;background:var(--cyan);padding:4px 12px;transform:rotate(-2deg);
  border:2px solid rgba(255,255,255,.85);box-shadow:3px 4px 0 rgba(0,0,0,.45);margin-bottom:16px}

/* REVIEWS — aspas góticas gigantes + estrelas neon + avatar gradiente */
.review{position:relative;overflow:hidden;background:linear-gradient(180deg,var(--surface),#0C1524)}
.review::before{content:"\201C";position:absolute;top:-18px;right:8px;font-family:var(--font-gt);
  font-size:120px;line-height:1;color:rgba(127,179,255,.09);pointer-events:none}
.review .stars{color:var(--cyan);text-shadow:0 0 12px rgba(56,225,242,.45)}
.review .av{background:linear-gradient(135deg,var(--accent),var(--cyan));color:#fff}
.review:hover{border-color:rgba(46,116,255,.4);box-shadow:var(--glow);transform:translateY(-3px)}
.review{transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease}

/* FOOTER — "//" no lugar do quadrado + unidades street + tag GIGANTE de fundo à direita */
.foot-col h4{padding-left:24px}
.foot-col h4::before{content:"//";width:auto;height:auto;background:none;top:-1px;
  color:var(--cyan);font-weight:800;letter-spacing:-.08em;text-shadow:0 0 9px rgba(56,225,242,.55)}
.unit-card{border-left:2px solid var(--cyan);background:rgba(56,225,242,.05)}
.unit-card b{font-family:var(--font-d)}
.unit-card a{color:#7FEAF6}
footer.site .wrap::before{content:"a 01 do litoral";position:absolute;right:-40px;top:26px;z-index:0;
  font-family:var(--font-tag);font-size:clamp(80px,11vw,170px);color:#fff;opacity:.045;
  transform:rotate(-5deg);white-space:nowrap;pointer-events:none}
footer.site .wrap>*{position:relative;z-index:1}
.foot-placa{display:flex;justify-content:flex-start}

/* PDP · scanner CONTIDO + palco claro REVELADO pela luz (o produto clareia na passagem) */
.gal-main{overflow:hidden}
.gal-main::before{content:"";position:absolute;inset:0;z-index:0;border-radius:inherit;
  background:radial-gradient(120% 84% at 50% 32%,#F5F8FD,#E2E9F4 58%,#D2DBEB 100%);
  clip-path:inset(0 0 100% 0)}
.gal-main.gd-scan::before{animation:gdScanReveal 1.25s cubic-bezier(.45,.1,.35,1) .2s forwards}
@keyframes gdScanReveal{to{clip-path:inset(0 0 0 0)}}
.gal-main img.prod-photo{position:relative;z-index:1}
.gal-main>svg{position:relative;z-index:1}
.gal-main .p-badges{z-index:2}
@media(prefers-reduced-motion:reduce){
  .gal-main::before{clip-path:none;animation:none}
}

/* VITRINE · fundo = PISO DE LED do showroom de Santos em perspectiva.
   O grid de luz foge pro horizonte e o brilho sobe do chão — os 4 cards
   ficam "estacionados" na loja. (feedback: a seção tava apagada) */
.sec-vitrine{position:relative;overflow:hidden}
.sec-vitrine::before{content:"";position:absolute;left:-12%;right:-12%;top:16%;bottom:-4%;z-index:0;pointer-events:none;
  background:
    linear-gradient(to right, rgba(63,132,255,.20) 1.5px, transparent 1.5px),
    linear-gradient(to bottom, rgba(63,132,255,.16) 1.5px, transparent 1.5px);
  background-size:58px 58px;
  transform:perspective(640px) rotateX(58deg) scale(2.1);
  transform-origin:50% 100%;
  -webkit-mask-image:linear-gradient(180deg,transparent 2%,#000 34%,#000 82%,transparent 100%);
          mask-image:linear-gradient(180deg,transparent 2%,#000 34%,#000 82%,transparent 100%);
  animation:gdPisoLed 9s ease-in-out infinite}
@keyframes gdPisoLed{0%,100%{opacity:.55}50%{opacity:1}} /* o LED respira, como na loja */
.sec-vitrine::after{content:"";position:absolute;left:0;right:0;bottom:-40px;height:220px;z-index:0;pointer-events:none;
  background:radial-gradient(58% 130% at 50% 100%, rgba(46,116,255,.22), rgba(56,225,242,.06) 55%, transparent 75%)}
.sec-vitrine .wrap{position:relative;z-index:1}
@media(max-width:640px){.sec-vitrine::before{background-size:44px 44px;transform:perspective(520px) rotateX(56deg) scale(2.3)}}
@media(prefers-reduced-motion:reduce){.sec-vitrine::before{animation:none}}

/* MURO DE GRAFITE — asset real do Anthony na "Nossa história" (sobre).
   v2: muro mais visível e menos cortado (scrim leve, enquadramento central,
   mais respiro) + o texto ganha um véu próprio de vidro pra ficar legível. */
.sec-muro{position:relative;overflow:hidden;padding:96px 0}
.sec-muro::before{content:"";position:absolute;inset:0;
  background:url('../img/muro-grafite.jpg') 50% 38%/cover no-repeat}
.sec-muro::after{content:"";position:absolute;inset:0;background:
  linear-gradient(90deg, rgba(7,10,18,.9) 0%, rgba(7,10,18,.66) 34%, rgba(7,11,20,.2) 62%, rgba(7,11,20,.14) 100%),
  linear-gradient(180deg,#080B16 0%,transparent 14%,transparent 86%,#080B16 100%)}
.sec-muro .wrap{position:relative;z-index:1}
.sec-muro .story-copy{background:rgba(7,10,18,.55);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  border:1px solid rgba(255,255,255,.06);border-radius:16px;padding:24px 32px}
@media(max-width:820px){
  .sec-muro{padding:64px 0}
  .sec-muro::after{background:
    linear-gradient(180deg, rgba(7,10,18,.8) 0%, rgba(7,10,18,.68) 55%, rgba(7,11,20,.4) 100%),
    linear-gradient(180deg,#080B16 0%,transparent 16%,transparent 84%,#080B16 100%)}
}

/* TESTE reprovado 08/07 ("muito forte") — guardado desligado; pra reativar,
   é só pôr a classe .hero-muro no <section class="hero"> da home */
section.hero.hero-muro{background:
  linear-gradient(90deg, rgba(8,11,22,.86) 0%, rgba(8,11,22,.5) 42%, rgba(8,11,22,.14) 72%, rgba(8,11,22,.3) 100%),
  linear-gradient(180deg, rgba(8,11,22,.55) 0%, transparent 26%, transparent 72%, rgba(8,11,22,.94) 100%),
  url('../img/muro2-grafite.jpg') 50% 30%/cover no-repeat}
@media(max-width:900px){
  section.hero.hero-muro{background:
    linear-gradient(180deg, rgba(8,11,22,.72) 0%, rgba(8,11,22,.5) 40%, rgba(8,11,22,.9) 100%),
    url('../img/muro2-grafite.jpg') 50% 22%/cover no-repeat}
}

/* cameo do elenco em heros de página (Corre no frete, DJ no blog) */
.blog-hero{position:relative;overflow:hidden}
.gd-cameo{position:absolute;right:3vw;bottom:0;height:min(170px,22vw);width:auto;z-index:0;
  pointer-events:none;filter:drop-shadow(0 10px 20px rgba(0,0,0,.5))}
/* Trilho M rodada 2: o cameo é FUNDO — sem esta linha o texto do hero do blog
   ficava ATRÁS do boneco em ~760px (o .wrap do blog-hero não tinha z-index). */
.blog-hero .wrap{position:relative;z-index:1}
@media(max-width:640px){.gd-cameo{opacity:.35}}

/* ============ PACOTE OUSADIA (08/07 · "pode aplicar tudo") ============ */

/* 1 · BARRA DE DROP — APOSENTADA na G1 (10/07/2026, pedido do Renan: "pode tirar").
   Com o HUD flutuante ela virou ruído acima da dobra, e a informação dela já mora
   onde trabalha: o drop no hero e no cartaz do menu; o envio, na barra de confiança.
   A classe do <body> sobreviveu com o nome certo — `gd-hashud` — porque ela marca
   as páginas que ganham o HUD (e é dela que sai a folga legal do rodapé, lá embaixo). */

/* 2 · O SELO GIRATÓRIO "01" DO RODAPÉ FOI REMOVIDO (Anthony, 13/07).
   O `initSeloFooter()` que o injetava saiu junto (main.js) — sem ele, nenhuma
   página monta `.gd-selo-row`/`.gd-selo01`, e o CSS foi embora com o componente.
   Não confundir com `.gd-selo` (certificado SCAPEX, página A empresa) nem com
   `.gd-selo-fab` (o "SÓ NA GLOBAL" da home): esses dois seguem vivos. */

/* UNIDADES do footer — cards de verdade: monograma gótico, endereço completo, horário
   ⚠️ SEM `:hover` aqui. No trilho G o card deixou de ser uma caixa e virou uma
   POLAROID solta sobre o muro (§ "O FIM DA RUA"): fundo, borda e padding foram a
   zero. O `:hover` com borda ciano + box-shadow sobreviveu ao reset e passou a
   desenhar um retângulo fantasma em volta de foto+endereço+horário — um quadro
   que não existe, brilhando. Quem destaca a unidade agora é a própria polaroid
   (ela endireita e sobe 3px). Objeto físico não acende. */
.unit-card{position:relative;border:1px solid rgba(56,225,242,.22);border-left:2px solid var(--cyan);
  border-radius:12px;padding:12px 16px;background:linear-gradient(180deg,rgba(56,225,242,.06),rgba(255,255,255,.02))}
.unit-card .uc-tag{position:absolute;right:12px;top:9px;font-family:var(--font-gt);font-size:20px;line-height:1;
  color:transparent;-webkit-text-stroke:1px rgba(56,225,242,.55)}
.unit-card b{color:#fff;font-size:14px;display:block;margin-bottom:4px;font-family:var(--font-d)}
.unit-card span{font-size:12px;color:rgba(255,255,255,.62);display:block;line-height:1.5}
.unit-card .uc-h{margin-top:8px;font-size:11px;font-weight:700;letter-spacing:.05em;color:#2FD08A}
.unit-card .uc-zap{color:rgba(255,255,255,.72);font-size:12px}
.unit-card a{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;color:#7FEAF6;margin-top:8px}
.unit-card a:hover{color:#fff}

/* 3 · NEON ABERTO/FECHADO — pele de letreiro no status vivo das lojas */
[data-store-status].live{font-family:var(--font-d);font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  color:#2FD08A;border:1.5px solid rgba(47,208,138,.55);border-radius:12px;padding:8px 12px;
  background:rgba(47,208,138,.06);text-shadow:0 0 7px rgba(47,208,138,.9),0 0 22px rgba(47,208,138,.4);
  box-shadow:0 0 18px rgba(47,208,138,.15),inset 0 0 12px rgba(47,208,138,.07);
  animation:gdNeonIn 1.2s linear 1}
[data-store-status].live .dot{background:#2FD08A;box-shadow:0 0 8px rgba(47,208,138,.9)}
[data-store-status].live.off{color:#E8A23D;border-color:rgba(232,162,61,.4);background:rgba(232,162,61,.05);
  text-shadow:0 0 6px rgba(232,162,61,.55);box-shadow:none;animation:none}
[data-store-status].live.off .dot{background:#E8A23D;box-shadow:none}

/* 4 · ODÔMETRO — dígitos rolam como painel de carro (initOdometer no main.js) */
.odx{display:inline-flex;overflow:hidden;vertical-align:bottom}
.odx .od{display:inline-block;height:1.06em;overflow:hidden}
.odx .od i{display:flex;flex-direction:column;font-style:normal;transform:translateY(0);line-height:1.06}
.odx.go .od i{transform:translateY(calc(var(--n) * -1.06em));transition:transform 1.4s cubic-bezier(.2,.85,.25,1);transition-delay:var(--d,0s)}

/* 6 · TILT 3D + GLARE nos cards de produto (initTilt no main.js, só pointer fino) */
.card-prod{transform-style:preserve-3d}
.card-prod .thumb::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;opacity:0;transition:opacity .25s;
  background:radial-gradient(340px 240px at var(--gx,50%) var(--gy,40%),rgba(255,255,255,.32),transparent 58%)}
.card-prod:hover .thumb::after{opacity:1}

/* 9 · STICKER PEEL — a badge de OFERTA descola no hover do card */
.card-prod .thumb .badge-accent{position:relative;transition:transform .3s cubic-bezier(.2,.8,.3,1)}
.card-prod:hover .thumb .badge-accent{transform:rotate(-6deg) translateY(-1px)}
.card-prod .thumb .badge-accent::after{content:"";position:absolute;right:-2px;bottom:-2px;width:0;height:0;
  border-style:solid;border-width:0;border-color:transparent;transition:border-width .28s cubic-bezier(.2,.8,.3,1);
  filter:drop-shadow(-2px -2px 2px rgba(0,0,0,.3))}
.card-prod:hover .thumb .badge-accent::after{border-width:0 0 13px 13px;border-color:transparent transparent #DCE6F8 transparent}

/* 10 · FX FANTASMA — número da faixa gigante atravessa o fundo no scroll */
section[data-fx]{position:relative;overflow:hidden}
section[data-fx]::before{content:attr(data-fx);position:absolute;right:-30px;top:8px;z-index:0;pointer-events:none;
  font-family:var(--font-gt);font-size:clamp(120px,17vw,230px);line-height:1;
  color:transparent;-webkit-text-stroke:1.5px rgba(127,179,255,.10);opacity:.9}
@supports (animation-timeline: view()){
  section[data-fx]::before{animation:gdFxSlide linear both;animation-timeline:view();animation-range:entry 0% exit 100%}
  @keyframes gdFxSlide{from{transform:translateX(6%)}to{transform:translateX(-10%)}}
}
section[data-fx] .wrap{position:relative;z-index:1}

/* 7 · MARQUEE OUTLINE GIGANTE — o bordão vazado rolando antes do footer (só home) */
.gd-outline-mq{overflow:hidden;padding:40px 0 32px;position:relative}
.gd-outline-mq .rail{display:flex;width:max-content;animation:rolar 60s linear infinite}
.gd-outline-mq span{font-family:var(--font-gt);font-size:clamp(64px,10vw,130px);line-height:1;white-space:nowrap;
  color:transparent;-webkit-text-stroke:1.6px rgba(127,179,255,.32);margin-right:70px}
.gd-outline-mq span.solid{-webkit-text-stroke:0;
  background:linear-gradient(180deg,#FFFFFF,#C6D6F0 46%,#FFFFFF 52%,#A6BBDD 70%,#EFF5FF 100%);
  -webkit-background-clip:text;background-clip:text}
.gd-outline-mq:hover .rail{animation-play-state:paused}

/* 8 · EASTER EGG v2 — 3 taps no logo: TEMPESTADE de stickers (~3s) + carimbo GIGANTE + flash */
.gd-egg-flash{position:fixed;inset:0;z-index:4999;pointer-events:none;
  background:radial-gradient(60% 60% at 50% 42%,rgba(56,225,242,.28),rgba(46,116,255,.12) 55%,transparent 78%);
  animation:gdEggFlash 3.4s ease-out forwards}
@keyframes gdEggFlash{0%{opacity:0}8%{opacity:1}70%{opacity:.5}100%{opacity:0}}
.gd-egg-stk{position:fixed;top:-90px;z-index:5000;pointer-events:none;
  font-family:var(--font-tag);font-size:18px;color:#fff;background:linear-gradient(120deg,#2E74FF,#0A2E86);
  border:2px solid #F2F6FF;box-shadow:3px 4px 0 rgba(0,0,0,.5);padding:8px 12px;white-space:nowrap;
  animation:gdEggFall var(--t,2.6s) cubic-bezier(.3,.1,.6,1) forwards}
.gd-egg-stk.c2{background:radial-gradient(circle at 32% 28%,#18243E,#0B1220);color:var(--cyan);font-family:var(--font-gt);font-size:24px}
.gd-egg-stk.c3{background:var(--ok);color:#0A2818;font-family:var(--font-d);font-weight:800;font-size:12px;letter-spacing:.1em}
.gd-egg-stk.c4{background:#fff;color:#0A1428;font-family:var(--font-gt);font-size:24px}
.gd-egg-stk.c5{background:linear-gradient(120deg,var(--cyan),#12B8D6);color:#04121e;font-family:var(--font-d);font-weight:800;font-size:11px;letter-spacing:.12em}
@keyframes gdEggFall{0%{transform:translateY(0) rotate(var(--r0,-8deg))}100%{transform:translateY(122vh) rotate(var(--r1,14deg))}}
.gd-egg-stamp{position:fixed;left:50%;top:44%;z-index:5001;pointer-events:none;text-align:center;
  transform:translate(-50%,-50%) scale(2.6) rotate(-6deg);opacity:0;
  animation:gdEggStamp 3.6s cubic-bezier(.16,1.3,.3,1) forwards}
.gd-egg-stamp .l1{display:block;font-family:var(--font-gt);font-size:clamp(56px,11vw,120px);line-height:.95;
  background:linear-gradient(180deg,#FFFFFF,#C6D6F0 46%,#FFFFFF 52%,#A6BBDD 70%,#EFF5FF 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 4px 0 rgba(0,0,0,.7)) drop-shadow(0 0 34px rgba(127,179,255,.5))}
.gd-egg-stamp .l2{display:block;font-family:var(--font-tag);font-size:clamp(20px,3.4vw,36px);color:var(--cyan);
  transform:rotate(-2deg);margin-top:8px;text-shadow:0 0 26px rgba(56,225,242,.7)}
@keyframes gdEggStamp{8%{opacity:1;transform:translate(-50%,-50%) scale(1) rotate(-6deg)}86%{opacity:1}100%{opacity:0;transform:translate(-50%,-52%) scale(.96) rotate(-6deg)}}

@media (prefers-reduced-motion: reduce){
  .gd-fita .frail{animation:none}
  .gd-go .gt-chrome,.gd-neon-run .gt-chrome,.rv.in .gt-chrome,.rv.in .fxn,h1 .gt-chrome{animation:none}
  .gd-outline-mq .rail{animation:none}
  .odx.go .od i{transition:none}
  [data-store-status].live{animation:none}
  section[data-fx]::before{animation:none}
  .gd-egg-stk,.gd-egg-stamp{display:none}
}

/* ============================================================
   PASS 2 — COESÃO (08/07 · feedback Renan: "hero bom, abaixo não
   acompanha, ficou chapado"). Desce a linguagem do hero pro resto:
   header escuro, vitrine em vidro-glow, texto azul legível, profundidade.
   ============================================================ */
/* profundidade ambiente — glow azul do topo descendo do hero */
body{background:radial-gradient(1200px 720px at 82% 0, rgba(63,132,255,.12), transparent 52%) no-repeat, #070B14}

/* texto azul legível — sobe eyebrows/labels e conserta os --blue-deep invisíveis */
.eyebrow{color:#6EA8FF}
.eyebrow::before{background:#6EA8FF}
.faq-cat,.brands-strip .bl-label{color:#6EA8FF}
.card-prod .cat b{color:#7FB0FF}
.gd-tb .n{color:#EEF2FA}
.gd-tb .n em{color:#6EA8FF}
.kb-price,.kb-tot b,.gd-dw-sum b{color:#7FB0FF}
.gd-bcard .bw,.gd-tl-card b{color:#EEF2FA}

/* (a vitrine virou AS SAÍDAS DA 01 — o restyle dark do card antigo saiu junto) */

/* CARD DE PRODUTO — mais profundidade + tile vira "palco" (spotlight), não bloco branco */
.card-prod{box-shadow:0 8px 24px rgba(0,0,0,.34)}
.card-prod .thumb{background:radial-gradient(120% 84% at 50% 32%, #F5F8FD 0%, #E5EBF5 58%, #D4DCEB 100%)}
.gd-dw-keep:hover{color:var(--accent)}
.gd-fly{position:fixed;z-index:260;width:56px;height:56px;border-radius:12px;background:#fff;border:1px solid var(--border);will-change:transform;
  display:grid;place-items:center;box-shadow:0 10px 26px rgba(16,40,80,.26);pointer-events:none;
  transition:transform .75s cubic-bezier(.3,.7,.3,1),opacity .2s .58s,width .75s,height .75s}
.gd-fly img{max-width:80%;max-height:80%;mix-blend-mode:multiply}
@media(prefers-reduced-motion:reduce){.gd-drawer{transition:none}.gd-fly{display:none}}

/* ============================================================
   RODADA FINAL DE OUSADIA (08/07 · noite) — 3 momentos-assinatura
   1) FX.03 "O Lambe do Balcão": o card do kit é um cartaz lambe-lambe
      colado na parede da rua (fita crepe, tag atrás, seta de spray, sticker)
   2) Spotlight Jaça "A Caixa da Fábrica": exclusividade vira carga estampada
      + carimbo EXCLUSIVA que BATE quando a seção entra na tela
   3) FX.04 "CAM 02 do Box": moldura de câmera de segurança (REC, relógio
      vivo, cantoneiras) + selo NA RÉGUA carimbado quando revela o carro limpo
   (a porta de aço do load vive no bloco SPLASH, lá em cima)
   ============================================================ */

/* ---------- 1 · FX.03 · O LAMBE DO BALCÃO ---------- */
.sec-alt[data-fx="FX.03"]{position:relative;overflow:hidden}
.sec-alt[data-fx="FX.03"] .wrap{position:relative;z-index:1}
.kb-wall{position:absolute;inset:0;z-index:0;pointer-events:none}
.kw-tag{position:absolute;left:-1%;top:7%;font-family:var(--font-tag);font-size:clamp(44px,7vw,92px);
  line-height:1;color:transparent;-webkit-text-stroke:1.5px rgba(56,225,242,.17);transform:rotate(-7deg);white-space:nowrap}
.kw-pg{position:absolute;right:2%;bottom:6%;font-family:var(--font-tag);font-size:clamp(30px,4vw,56px);
  color:transparent;-webkit-text-stroke:1.2px rgba(255,255,255,.07);transform:rotate(4deg)}
.kw-arrow{position:absolute;left:calc(50% - 610px);bottom:16%;width:190px;height:150px}
.kw-arrow path{stroke:rgba(56,225,242,.55);stroke-width:3.5;fill:none;
  filter:drop-shadow(0 0 8px rgba(56,225,242,.35))}
.kw-arrow .kwa-ln{stroke-dasharray:340;stroke-dashoffset:340}
.kw-arrow .kwa-tip{opacity:0}
.gd-go .kwa-ln{animation:kwDraw 1s cubic-bezier(.5,.05,.4,1) .25s forwards}
.gd-go .kwa-tip{animation:kwTip .3s ease 1.1s forwards}
@keyframes kwDraw{to{stroke-dashoffset:0}}
@keyframes kwTip{to{opacity:1}}
@media(max-width:1300px){.kw-arrow{display:none}}
@media(max-width:640px){.kw-tag{top:4%;-webkit-text-stroke-width:1.2px}.kw-pg{display:none}}

/* o cartaz: torto de colar na pressa, endireita quando o cliente chega */
.kb{transform:rotate(-.45deg);transition:transform .35s cubic-bezier(.2,.8,.3,1);
  box-shadow:0 18px 44px rgba(0,0,0,.5),0 2px 0 rgba(255,255,255,.04) inset}
.kb:hover,.kb:focus-within{transform:none}
.kb-tape{position:absolute;width:104px;height:26px;z-index:3;pointer-events:none;
  background:linear-gradient(180deg,rgba(233,239,250,.22),rgba(233,239,250,.13));
  border-left:1px solid rgba(255,255,255,.12);border-right:1px solid rgba(255,255,255,.12);
  box-shadow:0 2px 6px rgba(0,0,0,.25);-webkit-backdrop-filter:blur(1.5px);backdrop-filter:blur(1.5px)}
.kb-tape.t1{top:-12px;left:7%;transform:rotate(-5deg)}
.kb-tape.t2{top:-12px;right:7%;transform:rotate(4deg)}
.kb-sticker{position:absolute;right:-8px;bottom:-14px;z-index:3;pointer-events:none;
  font-family:var(--font-d);font-weight:800;font-size:11px;letter-spacing:.12em;
  color:#04121E;background:var(--cyan);padding:8px 12px;transform:rotate(3deg);
  border:2px solid rgba(255,255,255,.85);box-shadow:3px 4px 0 rgba(0,0,0,.45)}
@media(max-width:640px){
  /* o FAB do zap mora embaixo à direita — o sticker muda de canto pra não sumir atrás dele */
  .kb-sticker{right:auto;left:10px;bottom:-12px;font-size:10px;padding:4px 8px;transform:rotate(-2deg)}
  .kb-tape{width:76px;height:20px}
}

/* ---------- 2 · SPOTLIGHT · A CAIXA DA FÁBRICA ---------- */
/* o "Jaça" chrome afoga no azul do spotlight — mais corpo e mais sombra pra ler */
.spotlight h2 .gt-chrome{font-size:1.32em;
  filter:drop-shadow(0 2.5px 0 rgba(0,0,0,.75)) drop-shadow(0 0 18px rgba(127,179,255,.5))}

/* texto só pra leitor de tela/SEO (o título virou arte) */
.gd-vh{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}

/* V2c (18/07) · a fonte do GTA saiu do título (decisão final): o h2 do spotlight
   fala inteiro a voz do FX.04 (regra html.st-a .spotlight h2, na camada de dosagem).
   O .gd-vh fica — é utilitária. */

/* rota da exclusividade: fábrica → balcão → teu carro (tracejado corre) */
.sp-route{display:flex;align-items:center;gap:12px;margin:2px 0 16px;flex-wrap:wrap}
.spr-n{font-family:var(--font-d);font-weight:800;font-size:11px;letter-spacing:.14em;color:#BFD3F7;
  border:1px solid rgba(191,211,247,.35);border-radius:8px;padding:4px 8px;background:rgba(8,16,38,.35)}
.spr-n.hi{color:#04121E;background:var(--cyan);border-color:var(--cyan);box-shadow:0 0 14px rgba(56,225,242,.4)}
.spr-ln{flex:0 1 46px;min-width:22px;height:2px;
  background:repeating-linear-gradient(90deg,rgba(56,225,242,.9) 0 6px,transparent 6px 12px);
  background-size:12px 2px;animation:sprFlow 1.1s linear infinite}
@keyframes sprFlow{to{background-position:12px 0}}

/* a caixa em si (o painel de vidro do .sp-visual sai de cena: a caixa É o visual) */
.spotlight .sp-visual{height:auto;background:none;border:none;overflow:visible;display:block;padding:8px 0}
.sp-crate{position:relative;width:min(340px,100%);aspect-ratio:1/1.02;margin:0 auto;
  background:
    radial-gradient(120% 90% at 30% 0%,rgba(127,179,255,.08),transparent 55%),
    repeating-linear-gradient(90deg,rgba(255,255,255,.02) 0 3px,transparent 3px 30px),
    linear-gradient(160deg,#101E40,#0A1226 70%);
  border:1px solid rgba(127,179,255,.28);border-radius:12px;
  box-shadow:0 24px 50px rgba(2,8,24,.6),inset 0 1px 0 rgba(255,255,255,.08);
  transform:rotate(1.2deg)}
.spc-riv{position:absolute;width:7px;height:7px;border-radius:50%;
  background:radial-gradient(circle at 34% 30%,#C8D6EF,#5B6C8F 70%);box-shadow:0 1px 2px rgba(0,0,0,.6)}
.spc-riv.r1{top:8px;left:8px}.spc-riv.r2{top:8px;right:8px}
.spc-riv.r3{bottom:8px;left:8px}.spc-riv.r4{bottom:8px;right:8px}
/* a marca da fábrica serigrafada na caixa (logo REAL da Jaça) — o vermelho aqui
   é da Jaça, dona da caixa; o azul do lacre e o ciano do carimbo são da Global */
.spc-ink{position:absolute;left:2%;right:2%;top:6%;height:54%;
  background:radial-gradient(58% 62% at 50% 54%,rgba(255,45,58,.26),transparent 70%);
  filter:blur(6px)}
.spc-logo{position:absolute;left:50%;top:15%;width:80%;height:auto;
  transform:translateX(-50%) rotate(-2deg);
  filter:drop-shadow(0 4px 14px rgba(0,0,0,.5))}
.spc-meta{position:absolute;left:8%;top:56%;font-family:var(--font-d);font-weight:700;font-size:10px;
  letter-spacing:.22em;line-height:2;color:rgba(214,226,248,.55);text-transform:uppercase}
.spc-code{position:absolute;left:8%;bottom:9%;display:flex;flex-direction:column;gap:4px}
.spc-code i{display:block;width:118px;height:30px;
  background:repeating-linear-gradient(90deg,#DCE6F8 0 2px,transparent 2px 4px,#DCE6F8 4px 7px,transparent 7px 8px,#DCE6F8 8px 9px,transparent 9px 13px);
  opacity:.75}
.spc-code span{font-family:var(--font-d);font-weight:700;font-size:10px;letter-spacing:.3em;color:rgba(214,226,248,.55)}
/* lacre da Global atravessado no canto (a fita da casa, versão embalagem).
   T2·H3 (20/07): a fita cruzava EXATAMENTE a faixa do logo da Jaça (top 15–50% do
   crate) e o texto com .26em estourava a janela. Agora ela sela o CANTO superior
   direito — acima do logo — mais curta e com tracking que cabe. */
.spc-tape{position:absolute;top:1.5%;right:-16%;width:56%;overflow:hidden;transform:rotate(21deg);z-index:2;
  background:linear-gradient(180deg,#2E74FF,#1B54D8);padding:8px 0;
  border-top:1.5px solid rgba(255,255,255,.3);border-bottom:1.5px solid rgba(4,10,26,.5);
  box-shadow:0 6px 16px rgba(46,116,255,.35)}
.spc-tape span{display:block;white-space:nowrap;font-family:var(--font-d);font-weight:800;font-size:8px;
  letter-spacing:.16em;color:#05122E}
/* o carimbo que BATE (dispara com o .rv.in que o initReveal já põe no .spotlight) —
   aterrissa no canto da logo, como carimbo por cima da serigrafia da fábrica */
.spc-stamp{position:absolute;right:-7%;top:43%;z-index:3;padding:8px 12px;transform:rotate(-7deg);
  border:3px solid var(--cyan);border-radius:8px;background:rgba(4,18,30,.55);
  box-shadow:0 0 22px rgba(56,225,242,.3),inset 0 0 14px rgba(56,225,242,.08);
  -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
.spc-stamp i{display:block;font-style:normal;font-family:var(--font-d);font-weight:800;font-size:18px;
  letter-spacing:.13em;color:var(--cyan);text-shadow:0 0 14px rgba(56,225,242,.6)}
.spc-stamp em{display:block;font-style:normal;font-family:var(--font-b);font-weight:600;font-size:10px;
  letter-spacing:.04em;color:#9FEFF9;margin-top:2px}
.spotlight.rv.in .spc-stamp{animation:spcSlam .55s cubic-bezier(.15,1.4,.3,1) .35s both}
@keyframes spcSlam{0%{opacity:0;transform:rotate(-16deg) scale(2.1)}62%{opacity:1;transform:rotate(-6deg) scale(.95)}100%{opacity:1;transform:rotate(-7deg) scale(1)}}
/* o produto de verdade, pendurado como etiqueta de carga */
.spc-prod{position:absolute;right:-6%;bottom:-7%;width:96px;height:112px;z-index:3;padding:8px;
  background:#fff;border-radius:12px;transform:rotate(5deg);
  box-shadow:0 14px 30px rgba(0,0,0,.5),0 0 0 1px rgba(0,0,0,.08)}
.spc-prod img{width:100%;height:100%;object-fit:contain}
@media(max-width:820px){
  .spotlight .sp-visual{height:auto;order:0;margin-top:8px}
  .sp-crate{width:min(300px,88%)}
  /* no crate pequeno o carimbo e a etiqueta brigavam — cada um pro seu canto */
  .spc-prod{right:-2%;width:82px;height:96px}
  .spc-meta{top:60%}
  .spc-stamp{right:-4%;top:40%}
  .spc-stamp i{font-size:14px}
}

/* ---------- 3 · FX.04 · CAM 02 DO BOX ---------- */
.gd-ba{touch-action:none}
.ba-scan{position:absolute;inset:0;z-index:2;pointer-events:none;opacity:.45;
  background:repeating-linear-gradient(180deg,transparent 0 3px,rgba(0,0,0,.16) 3px 4.5px)}
.ba-hud{position:absolute;left:0;right:0;top:0;z-index:6;display:flex;align-items:center;gap:12px;
  padding:12px 32px;pointer-events:none;font-family:var(--font-d);font-weight:700;font-size:10px;
  letter-spacing:.14em;color:rgba(255,255,255,.9);text-shadow:0 1px 4px rgba(0,0,0,.85)}
.ba-rec{display:inline-flex;align-items:center;gap:4px;color:#FF7A7E}
.ba-rec i{width:7px;height:7px;border-radius:50%;background:#FF4D52;box-shadow:0 0 8px rgba(255,77,82,.9);
  animation:baBlink 1.1s steps(2,start) infinite}
@keyframes baBlink{to{visibility:hidden}}
.ba-cam{opacity:.85}
/* T3·H4-B: o chip do REPLAY — acende quando a câmera está varrendo sozinha */
.ba-replay{display:none;align-items:center;gap:4px;color:#9BE8F2;letter-spacing:.22em}
.ba-replay i{font-style:normal;color:var(--cyan,#38E1F2);animation:baRep 1.6s steps(2,start) infinite}
.gd-ba.auto .ba-replay{display:inline-flex}
@keyframes baRep{to{visibility:hidden}}
.ba-time{margin-left:auto;opacity:.9}
.ba-time b{font-weight:700}
.ba-corner{position:absolute;width:15px;height:15px;z-index:6;pointer-events:none;
  border:2.5px solid rgba(56,225,242,.85);filter:drop-shadow(0 0 6px rgba(56,225,242,.45))}
.ba-corner.c1{top:9px;left:9px;border-right:none;border-bottom:none}
.ba-corner.c2{top:9px;right:9px;border-left:none;border-bottom:none}
.ba-corner.c3{bottom:9px;left:9px;border-right:none;border-top:none}
.ba-corner.c4{bottom:9px;right:9px;border-left:none;border-top:none}
/* tags descem pro rodapé do frame (o HUD mora em cima) e ganham voz;
   afastadas das cantoneiras pra ninguém pisar em ninguém */
.gd-ba-tag{top:auto;bottom:13px;border-radius:4px;font-family:var(--font-d);letter-spacing:.13em}
.gd-ba-tag.a{left:32px;background:rgba(8,12,22,.72);border:1px dashed rgba(255,255,255,.4);color:#C7CFE0}
.gd-ba-tag.b{right:32px;background:rgba(56,225,242,.92);color:#04121E;box-shadow:0 0 14px rgba(56,225,242,.5)}
/* régua de luz + rodo */
.gd-ba-bar{width:3px;background:linear-gradient(180deg,#EAFDFF,#38E1F2 55%,#128FA0);
  box-shadow:0 0 12px rgba(56,225,242,.75)}
.gd-ba-knob{width:32px;height:48px;border-radius:12px;color:#EAFDFF;font-size:16px;
  background:linear-gradient(180deg,#12233E,#0A1426);border:2px solid rgba(56,225,242,.85);
  box-shadow:0 0 16px rgba(56,225,242,.4),0 6px 14px rgba(0,0,0,.5)}
/* o carimbo NA RÉGUA (bate quando o cliente revela o carro limpo · classe .hit via JS) */
.ba-selo{position:absolute;left:50%;top:50%;z-index:7;opacity:0;pointer-events:none;
  transform:translate(-50%,-50%) rotate(-8deg) scale(.4);
  display:inline-flex;align-items:center;gap:8px;font-family:var(--font-d);font-weight:800;
  font-size:clamp(16px,3vw,24px);letter-spacing:.13em;color:#0A2818;background:var(--ok);
  padding:12px 20px;border:2.5px solid #F2F6FF;box-shadow:5px 7px 0 rgba(0,0,0,.5)}
.ba-selo svg{width:22px;height:22px;stroke:#0A2818;stroke-width:3;fill:none;stroke-linecap:round;stroke-linejoin:round}
.gd-ba.hit .ba-selo{animation:baSlam .55s cubic-bezier(.15,1.5,.3,1) forwards}
/* T3·H4-B: depois do carimbo o selo DOCA no rodapé do quadro (overlay pequeno) —
   era ele parado no meio da tela que dava a sensação de "régua travada" */
.gd-ba.selo-doca .ba-selo{animation:none;opacity:1;top:78%;
  transform:translate(-50%,-50%) rotate(-4deg) scale(.6);
  transition:top .5s cubic-bezier(.2,.8,.3,1),transform .5s cubic-bezier(.2,.8,.3,1)}
@keyframes baSlam{0%{opacity:0;transform:translate(-50%,-50%) rotate(-18deg) scale(2.2)}
  62%{opacity:1;transform:translate(-50%,-50%) rotate(-7deg) scale(.95)}
  100%{opacity:1;transform:translate(-50%,-50%) rotate(-8deg) scale(1)}}
.gd-ba.hit::before{content:"";position:absolute;inset:0;background:#fff;z-index:5;pointer-events:none;
  animation:baFlash .45s ease forwards}
@keyframes baFlash{0%{opacity:.5}100%{opacity:0}}
@media(max-width:480px){
  .ba-cam{display:none}
  .ba-hud{font-size:10px;padding:8px 12px}
}

/* ---------- 4 · FX.05 · O LADO PESADO (catalisadores = bancada de aço) ----------
   A estética é vidro e neon; peça é METAL. A seção vira bancada de oficina:
   chapa cruzada ao fundo, plaqueta de máquina gravada (com parafusos de fenda),
   prateleira de aço com faixa zebrada onde os 3 produtos ficam apoiados. */
.sec-pesado{position:relative;overflow:hidden}
.sec-pesado::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;opacity:.55;
  background:
    repeating-linear-gradient(45deg,rgba(127,179,255,.05) 0 2px,transparent 2px 15px),
    repeating-linear-gradient(-45deg,rgba(127,179,255,.04) 0 2px,transparent 2px 15px);
  -webkit-mask-image:radial-gradient(92% 84% at 50% 32%,#000 26%,transparent 76%);
          mask-image:radial-gradient(92% 84% at 50% 32%,#000 26%,transparent 76%)}
.sec-pesado .wrap{position:relative;z-index:1}
.sec-pesado .sec-head{max-width:none} /* a bancada usa a largura toda */
.pes-headrow{display:flex;align-items:flex-end;justify-content:space-between;gap:32px;margin-top:16px}
.pes-headrow p{max-width:640px;margin:0}
.pes-ass{display:inline-block;font-size:clamp(16px,1.8vw,18px);margin-top:8px}

/* plaqueta de identificação de máquina — gravada no metal, parafusada */
.pes-plaqueta{position:relative;flex-shrink:0;display:flex;flex-direction:column;gap:4px;
  padding:12px 20px 12px;border-radius:8px;transform:rotate(-.6deg);
  background:linear-gradient(160deg,#26314F,#131C33 55%,#0C1424);
  border:1px solid rgba(151,170,205,.4);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16),inset 0 -8px 16px rgba(0,0,0,.4),0 10px 22px rgba(0,0,0,.45)}
.pes-plaqueta b{font-family:var(--font-d);font-weight:800;font-size:12px;letter-spacing:.22em;
  color:#DCE6F8;text-shadow:0 1px 0 rgba(0,0,0,.85)}
.pes-plaqueta span{font-family:var(--font-d);font-weight:700;font-size:8px;letter-spacing:.2em;
  color:#8FA0C2;text-shadow:0 1px 0 rgba(0,0,0,.7)}
.pp-par{position:absolute;top:50%;width:9px;height:9px;margin-top:-4px;border-radius:50%;
  background:radial-gradient(circle at 34% 30%,#D6E1F4,#6B7C9E 62%,#3A4560);box-shadow:0 1px 2px rgba(0,0,0,.7)}
.pp-par::after{content:"";position:absolute;left:1px;right:1px;top:50%;height:1.3px;margin-top:-.65px;
  background:rgba(8,14,28,.85)}
.pp-par.p1{left:6px;transform:rotate(38deg)}
.pp-par.p2{right:6px;transform:rotate(-24deg)}
@media(max-width:980px){
  .pes-headrow{flex-direction:column;align-items:flex-start;gap:16px}
  .pes-plaqueta{display:inline-flex}
}

/* a prateleira de aço: os cards apoiam nela; faixa zebrada + parafusos na face */
.pes-bancada{position:relative}
.pes-bancada .prod-grid{position:relative;z-index:1}
.pes-prateleira{position:relative;height:17px;margin-top:8px;border-radius:4px;
  background:linear-gradient(180deg,#2A3757,#141E38 55%,#0A1122);
  border-top:1.5px solid rgba(200,214,239,.45);
  box-shadow:0 16px 30px rgba(0,0,0,.55)}
.pes-prateleira::before{content:"";position:absolute;left:12px;right:12px;top:5px;height:7px;border-radius:4px;
  opacity:.6;background:repeating-linear-gradient(45deg,rgba(56,225,242,.5) 0 9px,rgba(6,10,20,.9) 9px 18px)}
.pes-prateleira::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(circle 3px at 5px 50%,#C8D6EF 0 1.6px,rgba(0,0,0,.55) 2px,transparent 3px),
    radial-gradient(circle 3px at calc(50% - 1px) 50%,#C8D6EF 0 1.6px,rgba(0,0,0,.55) 2px,transparent 3px),
    radial-gradient(circle 3px at calc(100% - 5px) 50%,#C8D6EF 0 1.6px,rgba(0,0,0,.55) 2px,transparent 3px)}

/* ============================================================
   RUA NO SITE · LOTE 2 (08/07 · madrugada) — aprovados pelo Anthony
   1) Porta viva: bilhete colado na porta quando a loja física tá fechada
   2) FX.06: reviews viram bilhetes/polaroids colados no mural do balcão
   3) PDP: sticker bombing discreto no palco da foto
   4) Drawer: o resumo vira COMANDA de balcão (papel térmico serrilhado)
   (o 404 do beco vive inline no 404.html, padrão da página)
   ============================================================ */

/* ---------- 1 · o bilhete na porta de aço (só fora do horário da física) ---------- */
.gdd-aviso{position:absolute;left:50%;top:56%;z-index:3;width:max-content;max-width:82vw;
  transform:translateX(-50%) rotate(-2deg);transform-origin:top center;
  background:#F2F4F8;color:#1A2233;padding:16px 24px 12px;border-radius:4px;text-align:center;
  box-shadow:0 12px 26px rgba(0,0,0,.55);animation:gddNote 4.5s ease-in-out infinite}
.gdd-aviso::before{content:"";position:absolute;top:-11px;left:50%;transform:translateX(-50%) rotate(2deg);
  width:88px;height:24px;background:linear-gradient(180deg,rgba(226,233,246,.6),rgba(226,233,246,.38));
  border-left:1px solid rgba(255,255,255,.5);border-right:1px solid rgba(255,255,255,.5);
  box-shadow:0 2px 5px rgba(0,0,0,.3)}
.gdd-aviso span{display:block;font-family:var(--font-tag);font-size:16px;color:#39434F}
.gdd-aviso b{display:block;font-family:var(--font-tag);font-weight:400;font-size:20px;color:#0E5AE6}
@keyframes gddNote{0%,100%{transform:translateX(-50%) rotate(-2.4deg)}50%{transform:translateX(-50%) rotate(-1.1deg)}}

/* ---------- 2 · FX.06 · O MURAL DO BALCÃO (reviews = bilhetes colados) ---------- */
.review{background:#F3F5F9;border:none;border-radius:4px;color:#222B3E;
  transform:rotate(-1.7deg);box-shadow:0 16px 34px rgba(0,0,0,.5)}
.review:nth-child(2){transform:rotate(1.4deg)}
.review:nth-child(3){transform:rotate(-.8deg)}
.review:hover{transform:rotate(0) translateY(-3px);border:none;box-shadow:0 22px 44px rgba(0,0,0,.6)}
.review::before{color:rgba(14,90,230,.12)} /* as aspas góticas, agora tinta no papel */
.review::after{content:"";position:absolute;top:-11px;left:50%;transform:translateX(-50%) rotate(-2.5deg);
  width:92px;height:24px;background:linear-gradient(180deg,rgba(233,239,250,.55),rgba(233,239,250,.35));
  border-left:1px solid rgba(255,255,255,.6);border-right:1px solid rgba(255,255,255,.6);
  box-shadow:0 2px 5px rgba(0,0,0,.28)}
.review:nth-child(2)::after{transform:translateX(-50%) rotate(2deg)}
.review p{color:#39435C}
.review .stars{color:#0FA3B5;text-shadow:none}
.review .who>div{display:flex;flex-direction:column;align-items:flex-start} /* assinatura em cima, papel embaixo */
.review .who b{font-family:var(--font-tag);font-weight:400;font-size:20px;color:#101A2E;letter-spacing:.01em;
  display:inline-block;transform:rotate(-1.5deg)} /* assinado à mão */
.review .who span{color:#6B7690;margin-top:1px}

/* O AVATAR É O MASCOTE, e cada depoimento pega a pose do OFÍCIO de quem assina
   (detalhista → estética · joinha → hobista · chave → oficina). A inicial numa
   bolinha era prova social genérica de template.
   Rosto humano inventado aqui seria FORJAR prova: o nome é real, a cara não seria.
   O mascote resolve — é a casa que assina o recado, não um estranho de banco de imagem.

   A ARTE É DE CORPO INTEIRO e as 3 estão enquadradas IGUAL: cabeça centrada em
   (50%, 18%), ~29% da largura, e o ADEREÇO (flanela · joinha · chave) na altura
   do peito, à esquerda. Por isso um enquadramento só serve as três.
   O corte pega o QUADRADO de cima da arte (x 20–80%, y 2–62%): cabeça + ombros
   + a mão com o aderéço. Fechar só no rosto era mais limpo — mas aí as 3 viravam
   a MESMA cabeça, e a pose (que é o que liga cada depoimento ao ofício de quem
   assina) sumia. O aderéço é o ponto. Trocou a arte? Re-medir. */
.review .av{position:relative;width:64px;height:64px;flex:none;border-radius:50%;overflow:hidden;
  background:radial-gradient(120% 120% at 50% 20%,#1A3366,#0A1730);
  box-shadow:0 3px 10px rgba(10,20,40,.35),inset 0 0 0 2px #fff,inset 0 0 0 3.5px rgba(14,90,230,.55)}
.review .av img{position:absolute;top:-3%;left:-33%;width:167%;max-width:none;height:auto;display:block}
@media(prefers-reduced-motion:reduce){.review,.review:hover{transform:none}}

/* ---------- 3 · PDP · sticker bombing (canto oposto ao selo do scanner) ---------- */
.p-stickers{position:absolute;left:16px;bottom:16px;z-index:3;display:flex;flex-direction:column;
  gap:8px;align-items:flex-start;pointer-events:none}
.pst{display:inline-block;border:2.5px solid #fff;border-radius:4px;box-shadow:0 6px 14px rgba(10,20,40,.35)}
.pst-tag{background:var(--cyan);color:#04121E;font-family:var(--font-d);font-weight:800;font-size:10px;
  letter-spacing:.13em;padding:4px 8px;transform:rotate(-5deg)}
.pst-placa{background:#0D1322;color:#F5F8FF;font-family:var(--font-d);font-weight:800;font-size:12px;
  letter-spacing:.12em;padding:4px 8px 4px;transform:rotate(3deg) translateX(10px)}
.pst-placa i{font-style:normal;color:var(--cyan)}
@media(max-width:560px){.p-stickers{left:12px;bottom:12px;gap:8px}.pst-tag{font-size:8px}.pst-placa{font-size:11px}}

/* ---------- 4 · drawer · A COMANDA DO BALCÃO DIGITAL ---------- */
.gd-dw-comanda{position:relative;background:#F4F6FA;border-radius:8px 8px 0 0;padding:12px 16px 16px;
  margin-bottom:20px;box-shadow:0 8px 20px rgba(0,0,0,.3)}
.gd-dw-comanda::after{content:"";position:absolute;left:0;right:0;bottom:-7px;height:7px; /* serrilha */
  background:
    linear-gradient(-45deg,#F4F6FA 5.5px,transparent 0) 0 0/11px 7px repeat-x,
    linear-gradient(45deg,#F4F6FA 5.5px,transparent 0) 0 0/11px 7px repeat-x}
.cmd-top{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  border-bottom:1.5px dashed #C4CDDF;padding-bottom:8px;margin-bottom:8px}
.cmd-top b{font-family:var(--font-d);font-weight:800;font-size:10px;letter-spacing:.18em;color:#39434F}
.cmd-top span{font-family:var(--font-d);font-weight:700;font-size:11px;letter-spacing:.1em;color:#8A93A6}
.gd-dw-comanda .gd-dw-sum{margin-bottom:0}
.gd-dw-comanda .gd-dw-sum span{color:#5A6480}
.gd-dw-comanda .gd-dw-sum b{color:#0E1A2E}

/* ---------- respeito ao reduced-motion (rodada final) ---------- */
@media(prefers-reduced-motion:reduce){
  .kb{transform:none}
  .kw-arrow .kwa-ln{stroke-dashoffset:0;animation:none}
  .kw-arrow .kwa-tip{opacity:1;animation:none}
  .spr-ln{animation:none}
  .spotlight.rv.in .spc-stamp,.gd-ba.hit .ba-selo{animation:none;opacity:1}
  .ba-rec i{animation:none}
  .gd-ba.hit::before{animation:none;opacity:0}
  .gdd-fresta,.ga-word,.ga-tag,.ga-est,.gdd-aviso{animation:none}
}

/* ============================================================
   R3v2 · O TOUR — o mascote te leva pra dentro (12/07/2026)

   Os 2 vídeos do Renan chegaram e viraram o R3 do avesso. NÃO é imagem
   de câmera de segurança: é o MASCOTE fazendo o tour da loja — anda pelo
   corredor, aponta o produto e ACENA PRA LENTE. Filmado EM PÉ (9:16),
   como Reels.

   O que fica e o que sai da moldura de câmera aprovada em 09/07:
   · FICA a cantoneira ciano + o scrim (é o "quadro", e é o que amarra
     com o resto do site);
   · SAI o relógio em tempo real — sobre vídeo GRAVADO ele mente;
   · SAI o "REC" piscando e a scanline — no instante em que o mascote
     acena pra lente, "CFTV" desmonta, e a scanline só suja um vídeo bom.
   · ENTRA a barra de progresso (linguagem de story): é ela que prova que
     o vídeo TÁ RODANDO — sem precisar de um botão de play no meio da cara
     do mascote.

   VERTICAL manda no layout: o card deixa de ser foto-em-cima/texto-embaixo
   e vira LINHA PARTIDA (vídeo de pé + texto ao lado), alternando o lado a
   cada loja. É o texto que ocupa a largura que o vídeo vertical sobra —
   senão um 9:16 esticado na coluna viraria um poço de 1000px.

   Autoplay de verdade: mudo + playsinline + só quando entra na tela. Som e
   tela cheia são OFERTA (chip), nunca pedágio. Quem tem Save-Data/reduced-
   motion não recebe autoplay — recebe o pôster e um play honesto.
   Reverter = apagar este bloco + voltar as <img> no sobre.html.
   ============================================================ */
.tours{display:flex;flex-direction:column;gap:var(--sp-16)}
.tour{display:grid;grid-template-columns:320px minmax(0,1fr);gap:var(--sp-12);align-items:center}
.tour.flip{grid-template-columns:minmax(0,1fr) 320px}
.tour.flip .tour-cam{grid-column:2;grid-row:1}
.tour.flip .tour-info{grid-column:1;grid-row:1}

/* o quadro de pé */
.tour-cam{position:relative;aspect-ratio:9/16;overflow:hidden;cursor:pointer;
  border-radius:var(--r-lg);background:#05080F;border:var(--bw-1) solid rgba(56,225,242,.22);
  box-shadow:0 24px 64px rgba(0,0,0,.5);
  transition:transform .5s cubic-bezier(.2,.8,.3,1),box-shadow .5s ease,border-color .5s ease}
.tour-cam:hover{transform:translateY(-4px);border-color:rgba(56,225,242,.5);
  box-shadow:0 32px 80px rgba(0,0,0,.62),0 0 0 1px rgba(56,225,242,.16)}
.tour-cam video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
/* o vídeo NÃO ganha zoom-no-hover: zoom em imagem que já se mexe embrulha o estômago */

/* scrim: sem ele a pill e os chips somem quando o quadro clareia (a fachada
   de Santos é sol aberto). Um elemento, dois gradientes. */
.tour-cam .tc-scrim{position:absolute;inset:0;z-index:2;pointer-events:none;
  background:linear-gradient(180deg,rgba(3,7,14,.72),transparent 24%),
             linear-gradient(0deg,rgba(3,7,14,.82),transparent 28%)}
/* cantoneira: o resto de câmera que o Anthony aprovou. Abre um tico no hover. */
.tour-cam .tc-fr{position:absolute;width:14px;height:14px;z-index:4;pointer-events:none;opacity:.75;
  border:var(--bw-2) solid rgba(56,225,242,.85);filter:drop-shadow(0 0 5px rgba(56,225,242,.4));
  transition:inset .5s cubic-bezier(.2,.8,.3,1),opacity .5s ease}
.tour-cam .tc-fr.c1{top:10px;left:10px;border-right:none;border-bottom:none}
.tour-cam .tc-fr.c2{top:10px;right:10px;border-left:none;border-bottom:none}
.tour-cam .tc-fr.c3{bottom:10px;left:10px;border-right:none;border-top:none}
.tour-cam .tc-fr.c4{bottom:10px;right:10px;border-left:none;border-top:none}
.tour-cam:hover .tc-fr{opacity:1}
.tour-cam:hover .tc-fr.c1{top:7px;left:7px}
.tour-cam:hover .tc-fr.c2{top:7px;right:7px}
.tour-cam:hover .tc-fr.c3{bottom:7px;left:7px}
.tour-cam:hover .tc-fr.c4{bottom:7px;right:7px}

/* pill viva: ABERTO / FECHADO de verdade (mesmo motor do resto do site) */
.tour-cam .tc-pill{position:absolute;top:var(--sp-4);left:var(--sp-4);z-index:5;
  display:inline-flex;align-items:center;gap:var(--sp-2);
  font-family:var(--font-d);font-weight:700;font-size:var(--fs-2xs);letter-spacing:.08em;color:#EAF2FF;
  background:rgba(4,10,20,.72);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  border:var(--bw-1) solid rgba(255,255,255,.16);border-radius:var(--r-full);
  padding:var(--sp-2) var(--sp-3)}
.tour-cam .tc-pill .dot{width:7px;height:7px;border-radius:var(--r-full);background:#2FD08A;
  box-shadow:0 0 8px rgba(47,208,138,.9);flex:none}
.tour-cam .tc-pill.off .dot{background:#FF6B6F;box-shadow:0 0 8px rgba(255,107,111,.9)}
/* a tag de rua: diz a VERDADE do que é (um tour), no lugar onde antes mentia um relógio */
.tour-cam .tc-tag{position:absolute;top:var(--sp-4);right:var(--sp-4);z-index:5;pointer-events:none;
  font-family:var(--font-tag,'Sedgwick Ave Display',cursive);font-size:var(--fs-lg);line-height:1;
  color:var(--cyan);text-shadow:0 2px 10px rgba(0,0,0,.8);transform:rotate(-4deg)}

/* barra de story: a prova de que roda sozinho.
   Vai colada NO PÉ do quadro (borda a borda), e não flutuando 16px acima: ali
   ela cruzava as cantoneiras de baixo e o encontro parecia acidente. No pé é
   onde o olho já procura barra de progresso — e as cantoneiras ficam livres. */
.tour-cam .tc-bar{position:absolute;left:0;right:0;bottom:0;z-index:5;
  height:3px;background:rgba(255,255,255,.18);overflow:hidden;pointer-events:none}
.tour-cam .tc-bar i{display:block;height:100%;width:100%;background:var(--cyan);
  box-shadow:0 0 10px rgba(56,225,242,.8);transform:scaleX(0);transform-origin:left center}

/* chips: som e tela cheia. 44px = alvo de dedo (o gate mobile cobra isso). */
.tour-cam .tc-acts{position:absolute;right:var(--sp-3);bottom:var(--sp-5);z-index:6;
  display:flex;gap:var(--sp-2)}
.tour-cam .tc-act{width:44px;height:44px;border-radius:var(--r-full);display:grid;place-items:center;
  color:#EAF2FF;background:rgba(4,10,20,.66);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  border:var(--bw-1) solid rgba(255,255,255,.18);transition:.25s ease}
.tour-cam .tc-act svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}
.tour-cam .tc-act:hover,.tour-cam .tc-act:focus-visible{background:var(--cyan);color:#04121E;
  border-color:var(--cyan);transform:scale(1.06)}
.tour-cam .tc-act:focus-visible{outline:var(--bw-2) solid #fff;outline-offset:2px}
/* o alto-falante conta o estado: mudo = X, com som = a ondinha */
.tour-cam .tc-act .mute-x{opacity:1;transition:opacity .2s ease}
.tour-cam .tc-act .som-on{opacity:0;transition:opacity .2s ease}
.tour-cam.som .tc-act .mute-x{opacity:0}
.tour-cam.som .tc-act .som-on{opacity:1}
.tour-cam.som .tc-act[data-tour-som]{background:var(--cyan);color:#04121E;border-color:var(--cyan)}
/* sem autoplay não há o que "desmutar" na moldura: o som mora na tela cheia */
.tour-cam.manual .tc-act[data-tour-som]{display:none}

/* sem autoplay (Save-Data / reduced-motion): o pôster fica, e o play é honesto */
.tour-cam .tc-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:6;
  display:none;align-items:center;gap:var(--sp-2);
  font-family:var(--font-d);font-weight:800;font-size:var(--fs-2xs);letter-spacing:.13em;color:#04121E;
  background:var(--cyan);padding:var(--sp-3) var(--sp-4);border-radius:var(--r-full);
  box-shadow:0 0 30px rgba(56,225,242,.5)}
.tour-cam .tc-play svg{width:13px;height:13px;fill:#04121E;stroke:none}
.tour-cam.manual .tc-play{display:inline-flex}
.tour-cam.manual .tc-bar{display:none}

/* o lado do texto */
/* V4 (16/07) · OS NÚMEROS ACENDERAM: eram numerais apagados (.32); agora são o
   neon da fachada de cada loja — tubo ciano ligado, com o engasgo idle da casa.
   Os dois nunca piscam juntos (delays diferentes: neon de rua não é coreografia). */
.tour-info .tour-n{display:block;font-family:var(--font-gt,'Pirata One',cursive);
  font-size:var(--fs-5xl);line-height:1;color:var(--cyan);margin-bottom:var(--sp-1);
  text-shadow:0 0 7px rgba(56,225,242,.55),0 0 22px rgba(56,225,242,.36),0 0 48px rgba(46,116,255,.30);
  animation:hdNeonIdle 9.4s linear 4.1s infinite}
.tour.flip .tour-n{animation-delay:7.3s}
@media(prefers-reduced-motion:reduce){.tour-info .tour-n{animation:none}}
.tour-info h3{font-size:var(--fs-3xl);margin-bottom:var(--sp-2)}
.tour-info .t-diz{color:var(--ink-2);margin-bottom:var(--sp-5);max-width:44ch}
.tour-info .u-line{display:flex;align-items:flex-start;gap:var(--sp-3);margin-bottom:var(--sp-3);
  color:var(--ink-2);font-size:var(--fs-sm)}
.tour-info .u-line svg{width:18px;height:18px;flex:none;color:var(--cyan);margin-top:var(--sp-hair)}
.tour-info .u-line b{color:var(--ink)}
.tour-info .u-row{display:flex;gap:var(--sp-3);flex-wrap:wrap;margin-top:var(--sp-6)}

@media(max-width:900px){
  .tours{gap:var(--sp-12)}
  /* empilha: o vídeo de pé em cima (é assim que se vê Reels), o texto embaixo.
     O flip morre no celular — não existe "lado" numa coluna só. */
  .tour,.tour.flip{grid-template-columns:minmax(0,1fr);gap:var(--sp-6);justify-items:center}
  .tour.flip .tour-cam{grid-column:1;grid-row:1}
  .tour.flip .tour-info{grid-column:1;grid-row:2}
  .tour-cam{width:100%;max-width:340px}
  .tour-info{text-align:center;width:100%}
  .tour-info .t-diz{margin-inline:auto}
  .tour-info .u-line{justify-content:center;text-align:left}
  .tour-info .u-row{justify-content:center}
}

/* lightbox: agora nasce EM PÉ. O antigo era 1180px de largura — num 9:16 isso
   daria 2100px de altura e o vídeo sairia pela tela. Manda a ALTURA. */
.gd-lb{position:fixed;inset:0;z-index:900;display:none;place-items:center;padding:24px;
  background:rgba(3,6,12,.9);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.gd-lb.open{display:grid}
.gd-lb-box{position:relative;display:flex;flex-direction:column;align-items:center;max-width:100%}
.gd-lb-box video{display:block;width:auto;max-width:100%;height:min(calc(100dvh - 150px),860px);
  border-radius:var(--r-lg);background:#000;
  border:var(--bw-1) solid rgba(56,225,242,.32);box-shadow:0 30px 80px rgba(0,0,0,.7)}
.gd-lb-cap{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;justify-content:center;
  margin-top:var(--sp-4);text-align:center;
  font-family:var(--font-d);font-weight:700;font-size:var(--fs-xs);letter-spacing:.1em;color:var(--ink-2)}
.gd-lb-cap b{color:#EEF2FA;font-size:var(--fs-sm);letter-spacing:.02em}
.gd-lb-close{position:absolute;top:-46px;right:0;width:44px;height:44px;border-radius:var(--r-full);cursor:pointer;
  background:rgba(255,255,255,.1);border:var(--bw-1) solid rgba(255,255,255,.2);color:#EEF2FA;
  font-size:var(--fs-lg);line-height:1;display:grid;place-items:center;transition:.2s}
.gd-lb-close:hover{background:var(--cyan);color:#04121E;border-color:var(--cyan)}
@media(max-width:640px){.gd-lb{padding:16px}.gd-lb-close{top:-50px}}

@media(prefers-reduced-motion:reduce){
  .tour-cam,.tour-cam .tc-fr,.tour-cam .tc-act{transition:none}
  .tour-cam:hover{transform:none}
}

/* ============================================================
   R4 · MODO RADICAL — HUD + PORTA-MENU (09/07/2026)
   A ilha flutuante SAIU. A navegação virou dois objetos:
   · HUD — 4 chips flutuantes (logo · lupa · comanda · símbolo-porta)
   · MENU — a Empena: o muro grafitado real sob a luz do poste
   Referência de construção: site/lab-porta-menu.html (Modo B, aprovado na R1).
   A porta de transição é o #gd-porta (bloco "A PORTA DE AÇO", acima).

   PILHA (de baixo pra cima): dropbar 121 · wafab 130 · menu 200 · HUD 300 ·
   toast 305 · scrim 460 · drawer 470 · fly 480 · busca 500 · porta 5000.
   O HUD fica ACIMA do menu de propósito: o símbolo-porta continua clicável
   sobre o muro (é o botão de fechar). Os chips de cima somem com .gd-menu-on.
   ============================================================ */
:root{
  --font-lt:'Bungee',cursive;   /* 4ª voz · o letreiro: índices, nº de drop, stamps */
}

/* a navegação é fullscreen: o menu aberto trava o scroll da página */
html.gd-menu-on{overflow:hidden}

/* ---------- HUD ---------- */
#gd-hud{position:fixed;inset:0;z-index:300;pointer-events:none;--hud-top:16px}
#gd-hud > *{pointer-events:auto}
/* ao rolar, os chips sobem — mesma régua da ilha antiga. */
#gd-hud.scrolled{--hud-top:8px}
.hud-chip{position:fixed;display:flex;align-items:center;justify-content:center;border-radius:16px;
  border:1px solid rgba(255,255,255,.13);cursor:pointer;background:rgba(10,15,28,.72);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  box-shadow:0 10px 30px rgba(0,0,0,.5);
  transition:transform .18s,border-color .18s,box-shadow .18s,opacity .26s,top .25s ease}
.hud-chip:hover{transform:translateY(-2px);border-color:rgba(56,225,242,.5);box-shadow:0 14px 36px rgba(0,0,0,.6)}
/* com o muro na tela o HUD de cima SOME — o menu é a tela inteira. Eles voltam
   atrás da porta fechada e reaparecem junto com a página. */
html.gd-menu-on .hud-logo,html.gd-menu-on .hud-lupa,html.gd-menu-on .hud-conta,
html.gd-menu-on .hud-comanda,html.gd-menu-on .gd-wafab{opacity:0;pointer-events:none}

/* G1 · a marca precisa LER. O logo saiu de 19px de altura (silhueta ilegível a um
   braço de distância) pra 26px, com o chip mais alto, mais opaco e mais contrastado.
   No celular ele encolhe pra 22px e a plaqueta "01" some — senão o chip alcança a
   lupa a 360px (medido: sobrava 4px). A logo é 4.1:1, então cada px de altura custa
   4.1px de largura: crescer aqui é decisão de COLISÃO, não de gosto. */
.hud-logo{top:var(--hud-top);left:20px;height:56px;padding:0 20px;gap:12px;background:rgba(10,15,28,.82)}
.hud-logo img{height:26px;width:auto;filter:brightness(0) invert(1);opacity:1}
.hud-logo .pl{font-family:var(--font-lt);font-size:8px;color:var(--cyan);
  border:1px solid rgba(56,225,242,.4);border-radius:4px;padding:2px 4px;line-height:1}
/* Conta v2 (18/08): o chip "Minha conta" entrou DO LADO DA COMANDA (pedido do
   Anthony) e a lupa recuou. A conta de colisão refeita:
   desktop → comanda 74 (right:20) · conta 48 (right:106 = 20+74+12) ·
             lupa 48 (right:166 = 106+48+12);
   mobile  → comanda 64 (right:20) · conta 48 (right:96 = 20+64+12) ·
             lupa 48 (right:156 = 96+48+12); logo termina ~134px a 360 → sobra. */
.hud-lupa{top:var(--hud-top);right:166px;width:48px;height:48px}
.hud-lupa svg{width:20px;height:20px;color:#F5F8FF}
.hud-conta{top:var(--hud-top);right:106px;width:48px;height:48px}
.hud-conta svg{width:20px;height:20px;color:#F5F8FF}

/* --- O CARRINHO: o MASCOTE SENTADO DENTRO do carrinho, acenando (15/07 — era a
   comanda de papel "BALCÃO DIGITAL Nº XXXX", depois o boneco empurrando). A arte É o
   botão: o carrinho dele é o teu carrinho. A arte é recortada no ROSTO (sem os tênis)
   pra cara ler grande a 64px — que era o pedido ("aumentar o tamanho / fazer a cara").
   O fly-to-cart continua mirando aqui (ele busca `.hud-comanda`) e o badge segue sendo
   `.cart-count` — quem trocou foi a pele, não o contrato.
   ⚠️ Ele transborda pra BAIXO, nunca pra cima: o chip sobe de 16px→8px no scroll
   (--hud-top), e uma cabeça saindo por cima seria decapitada pela borda da janela. */
.hud-comanda{top:var(--hud-top);right:20px;width:74px;height:56px;border-radius:16px;overflow:visible;
  padding:0;background:rgba(10,15,28,.82);
  border:1px solid rgba(255,255,255,.13);box-shadow:0 10px 30px rgba(0,0,0,.5)}
/* V7 · a comanda PEGA o produto que chega voando: squash & stretch + um flash
   ciano na borda. Dispara no pouso do .gd-fly (openCartDrawer). */
.hud-comanda.gd-pega{animation:gdPega .46s cubic-bezier(.34,1.56,.64,1)}
@keyframes gdPega{
  0%{transform:scale(1)}
  28%{transform:scale(1.16,.84);border-color:rgba(56,225,242,.8);box-shadow:0 10px 30px rgba(0,0,0,.5),0 0 22px rgba(56,225,242,.45)}
  62%{transform:scale(.94,1.08)}
  100%{transform:scale(1)}
}
@media(prefers-reduced-motion:reduce){.hud-comanda.gd-pega{animation:none}}
.hud-comanda:hover{border-color:rgba(56,225,242,.5)}
/* o piso: um facho de luz onde ele anda (senão o boneco flutua no vidro) */
.hud-comanda::after{content:"";position:absolute;left:8px;right:8px;bottom:5px;height:8px;border-radius:50%;
  background:radial-gradient(ellipse at 50% 50%,rgba(56,225,242,.4),transparent 70%);
  opacity:.7;pointer-events:none;transition:opacity .22s}
.hud-comanda:hover::after{opacity:1}
/* a arte é quase quadrada (aspect ~1.04): sizing por ALTURA, largura resolve. 66px de
   alto = ~69px de largura, cabe nos 74px do chip sem vazar na lupa nem à direita.
   Ancorado embaixo e transbordando ~6px: a cara fica alta (dentro da janela do chip) e
   o aro do carrinho + rodinhas escapam por baixo. */
.hud-comanda .cm-masc{position:absolute;left:50%;bottom:-6px;height:66px;width:auto;pointer-events:none;
  transform:translateX(-50%);
  filter:drop-shadow(0 5px 10px rgba(0,0,0,.6));
  transition:transform .22s cubic-bezier(.3,1.3,.4,1)}
/* ele está SENTADO acenando — no hover dá um pulinho alegre (não "anda", ele não empurra) */
.hud-comanda:hover .cm-masc{transform:translateX(-50%) translateY(-3px) scale(1.05)}
.hud-comanda:active .cm-masc{transform:translateX(-50%) translateY(0) scale(.99)}
/* o contador reusa .cart-count (updateBadges pinta todos) — aqui ele é a etiqueta neon
   pendurada na cestinha do carrinho (canto de cima, do lado do carrinho dele) */
.hud-comanda .cart-count{position:absolute;top:-9px;right:-9px;min-width:24px;height:24px;border-radius:999px;
  background:var(--cyan);color:#04121E;font-family:var(--font-lt);font-size:11px;font-weight:400;
  transform:rotate(-9deg);padding:0;align-items:center;justify-content:center;z-index:2;
  box-shadow:0 0 0 2px #080B16,0 0 0 3.5px rgba(56,225,242,.35),0 0 18px rgba(56,225,242,.6)}
.hud-comanda .cart-count.bump{animation:cmBump .44s cubic-bezier(.3,1.5,.4,1)}
@keyframes cmBump{0%{transform:rotate(-9deg) scale(1)}40%{transform:rotate(4deg) scale(1.55)}100%{transform:rotate(-9deg) scale(1)}}

/* --- o SÍMBOLO DO MENU: a porta de aço em miniatura (centro inferior) ---
   Nenhuma palavra "menu" fixa na tela: lê como hambúrguer no instinto e é
   literalmente a porta da loja. O logo continua indo pra home (convenção). */
.hud-porta{position:fixed;left:50%;bottom:26px;transform:translateX(-50%);width:76px;height:58px;
  border-radius:12px;border:1px solid rgba(255,255,255,.17);cursor:pointer;overflow:hidden;
  background:linear-gradient(180deg,#1D2949,#0A1226);
  box-shadow:0 14px 34px rgba(0,0,0,.65),inset 0 1px 0 rgba(255,255,255,.16);
  transition:transform .16s cubic-bezier(.3,1,.4,1),box-shadow .2s,bottom .25s ease}
.hud-porta:hover{box-shadow:0 16px 40px rgba(0,0,0,.7),0 0 26px rgba(56,225,242,.28),inset 0 1px 0 rgba(255,255,255,.2)}
.hud-porta:active{transform:translateX(-50%) translateY(4px)}
.hud-porta .sl{position:absolute;left:10px;right:10px;height:7px;border-radius:2px;
  background:linear-gradient(180deg,#3D4E78,#161F3A);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 2px 0 rgba(0,0,0,.45);
  transition:transform .26s cubic-bezier(.2,.8,.3,1),opacity .26s}
.hud-porta .sl:nth-child(1){top:9px}   .hud-porta .sl:nth-child(2){top:20px}
.hud-porta .sl:nth-child(3){top:31px}  .hud-porta .sl:nth-child(4){top:42px}
.hud-porta:hover .sl:nth-child(1){transform:translateY(-2.5px)}
.hud-porta:hover .sl:nth-child(2){transform:translateY(-2px)}
.hud-porta:hover .sl:nth-child(3){transform:translateY(-1.5px)}
.hud-porta:hover .sl:nth-child(4){transform:translateY(-1px)}
.hud-porta .fr{position:absolute;left:6px;right:6px;bottom:4px;height:2.5px;border-radius:999px;
  background:linear-gradient(90deg,transparent,#EAFDFF,transparent);
  box-shadow:0 0 12px 2px rgba(56,225,242,.7);opacity:.7;transition:opacity .24s,height .24s,box-shadow .24s}
.hud-porta:hover .fr{opacity:1;height:3.5px;box-shadow:0 0 18px 4px rgba(56,225,242,.9)}
.hud-porta.on .sl{transform:translateY(-9px) scaleY(.55);opacity:.35}
.hud-porta.on .fr{opacity:1;height:5px;box-shadow:0 0 22px 6px rgba(56,225,242,.95)}
/* a dica vive FORA do botão: ele tem overflow:hidden (pras lamelas) e cortaria um ::after */
.hud-tip{position:fixed;left:50%;bottom:88px;transform:translateX(-50%);z-index:300;pointer-events:none;
  font-family:var(--font-tag);font-size:16px;color:var(--cyan);white-space:nowrap;opacity:0;
  text-shadow:0 0 14px rgba(56,225,242,.6);transition:opacity .22s,bottom .22s}
.hud-porta:hover ~ .hud-tip{opacity:1;bottom:92px}

@media(max-width:760px){
  .hud-tip{display:none}
  /* o chip encolhe, mas o ALVO segue ≥44px (WCAG 2.5.5) — 64×52 sobra. A lupa recua
     junto: right = 20 (margem) + 64 (chip) + 12 (folga) = 96. */
  .hud-comanda{width:64px;height:52px}
  .hud-comanda .cm-masc{height:60px;bottom:-6px}
  .hud-conta{right:96px}
  .hud-lupa{right:156px}
  .hud-logo{height:50px;padding:0 12px}
  .hud-logo img{height:22px}
  .hud-logo .pl{display:none}          /* a plaqueta cede o espaço; a marca fica */
  .hud-porta{bottom:20px;width:68px;height:52px}
  .hud-porta .sl:nth-child(1){top:8px}.hud-porta .sl:nth-child(2){top:18px}
  .hud-porta .sl:nth-child(3){top:28px}.hud-porta .sl:nth-child(4){top:38px}
}
/* PDP no celular: a porta só sobe QUANDO a barra de compra existe (body.bs-on,
   ligado pelo observer da própria página). Antes ela subia SEMPRE (bottom:86px
   estático) e ficava flutuando no meio do conteúdo — o print de 20/07 pegou o
   preço R$ 24,90 atrás do chrome. Sem barra, dock no chão (Trilho M). */
@media(max-width:860px){
  /* 84px = barra (~66px + safe-area) + folga. Validado por _dev/gate-r4-colisao.js. */
  body[data-page="produto"].bs-on .hud-porta{bottom:calc(84px + env(safe-area-inset-bottom))}
}

/* ============================================================
   O MENU — a Empena (muro real) sob a luz do poste
   --mw = tamanho do mascote, a MEDIDA-MÃE da cena. 58vh: uma figura ancorada
   na borda lê como "presente, não dominante" entre 55% e 65% da altura.
   Abaixo de 45% vira enfeite; acima de 75% ela vira o assunto — e o assunto
   do menu são os links. Print, cartaz e tipografia derivam de --mw.
   ============================================================ */
/* --lux/--luy = ONDE A LUZ ESTÁ (centro da poça, em px de viewport). O gdLight()
   move só esses dois valores; a poça E a máscara do muro aceso derivam deles —
   uma fonte, dois efeitos, sempre em sincronia. Registrar com @property é o que
   deixa a MÁSCARA transicionar junto (custom property crua não anima: o muro
   pularia enquanto a poça desliza). Sem @property, o muro só troca seco.
   Nome comprido de propósito: @property registra no DOCUMENTO INTEIRO — um
   `--px` genérico atropelaria qualquer outro componente que use esse nome. */
@property --lux{syntax:"<length>";inherits:true;initial-value:-999px}
@property --luy{syntax:"<length>";inherits:true;initial-value:-999px}

#gd-menu{--mw:clamp(300px,58vh,620px);--stand-r:clamp(10px,2.5vw,54px);--lux:-999px;--luy:-999px;
  position:fixed;inset:0;z-index:200;display:none;background:#04070E;overflow:hidden;
  transition:--lux .34s cubic-bezier(.2,.8,.3,1),--luy .34s cubic-bezier(.2,.8,.3,1)}
#gd-menu.open{display:block;animation:mnIn .38s cubic-bezier(.2,.8,.3,1) both}
@keyframes mnIn{from{opacity:0;transform:scale(1.035)}to{opacity:1;transform:none}}
.mn-wall{position:absolute;inset:0;z-index:0;background:url("../img/muro-grafite.jpg") center bottom/cover no-repeat}
.mn-scrim{position:absolute;inset:0;z-index:1;background:
  linear-gradient(90deg,rgba(3,6,12,.94) 0%,rgba(3,6,12,.74) 40%,rgba(3,6,12,.2) 76%,rgba(3,6,12,.38)),
  linear-gradient(180deg,rgba(3,6,12,.62),transparent 30%,transparent 66%,rgba(3,6,12,.55))}

/* a luz do poste: cone fixo + poça que desliza até o link apontado.
   `screen` faz o muro CLAREAR de verdade onde a luz bate (não é glow por cima).
   T2·M1 (20/07, pedido do Anthony): a luz tinha "cara de CSS" — borda de clip-path
   viva demais, branco puro e queda linear. Receita da suavização: (1) o miolo da
   luz esquenta (255,244,224 — vapor de sódio, não LED de editor), (2) a queda vira
   multi-stop com cauda longa, (3) blur sobe pra comer a aresta do polígono e
   (4) a opacidade final cai — quem carrega a cena é o MURO ACESO (.mn-lit),
   a luz artificial é só o ar. */
.mn-cone{position:absolute;left:-6%;top:-16%;width:60%;height:120%;z-index:3;pointer-events:none;
  clip-path:polygon(26% 0,42% 0,92% 100%,-12% 100%);
  background:
    radial-gradient(120% 42% at 34% 0%,rgba(255,244,224,.14),transparent 62%),
    linear-gradient(180deg,rgba(255,248,235,.11),rgba(255,244,224,.05) 34%,rgba(56,225,242,.04) 58%,transparent 88%);
  filter:blur(22px);mix-blend-mode:screen;opacity:0}
#gd-menu.open .mn-cone{animation:coneOn 1.05s ease .12s both}
@keyframes coneOn{0%{opacity:0}10%{opacity:.55}17%{opacity:.1}30%{opacity:.5}42%{opacity:.22}55%{opacity:.46}100%{opacity:.44}}
.mn-pool{position:absolute;left:0;top:0;width:60vw;height:230px;z-index:3;pointer-events:none;opacity:0;
  background:radial-gradient(50% 50% at 50% 50%,rgba(255,246,228,.2),rgba(255,244,224,.08) 38%,rgba(56,225,242,.05) 58%,transparent 82%);
  filter:blur(9px);mix-blend-mode:screen;
  transform:translate3d(var(--lux),var(--luy),0) translate(-50%,-50%);
  transition:opacity .3s}
/* .38, não 1: quem carrega a luz agora é o MURO ACESO (.mn-lit). A poça vira o
   ar em volta da lâmpada — no cheio ela virava neblina branca por cima da tinta. */
#gd-menu.lit .mn-pool{opacity:.38}

/* A LUZ REVELA O MURO — a MESMA imagem do muro, em brilho normal, mascarada no
   formato da luz. Onde a luz bate, o grafite ACENDE (tinta, escorrido, textura);
   fora dela, o muro segue apagado sob o scrim. Não é glow por cima: é revelação.
   (Mesmo truque do hero, `.hd-wall.lit`. Custo de asset: zero — a imagem já
   está carregada no .mn-wall, o navegador reusa.)
   z2: acima do scrim (z1), abaixo do cone/poça (z3) e dos links (z5).
   Só em ponteiro fino: no celular não há hover, e uma 2ª camada de tela cheia
   com máscara + filtro é peso à toa. */
.mn-lit{display:none}
@media (hover:hover) and (pointer:fine){
  .mn-lit{display:block;position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;
    background:url("../img/muro-grafite.jpg") center bottom/cover no-repeat;  /* MESMO enquadramento do .mn-wall — se mudar lá, muda aqui */
    filter:brightness(1.18) saturate(1.2) contrast(1.04);
    /* T2·M1: máscara maior e com queda mais longa — o aceso se mistura no apagado
       em vez de terminar em círculo legível (o círculo era metade da "cara de CSS") */
    -webkit-mask-image:radial-gradient(540px 360px at var(--lux) var(--luy),#000 0 8%,rgba(0,0,0,.58) 36%,rgba(0,0,0,.2) 62%,transparent 90%);
            mask-image:radial-gradient(540px 360px at var(--lux) var(--luy),#000 0 8%,rgba(0,0,0,.58) 36%,rgba(0,0,0,.2) 62%,transparent 90%);
    transition:opacity .35s}
  #gd-menu.lit .mn-lit{opacity:.88}
}

.mn-inner{position:relative;z-index:5;height:100%;display:flex;flex-direction:column;justify-content:center;
  gap:4px;padding:104px min(9vw,110px) 104px;max-width:900px}

/* os links: a voz da rua, FLUTUANDO sobre o scrim (NÃO são pichação do muro) */
.mn-links{display:flex;flex-direction:column;gap:2px;width:max-content;max-width:100%}
.mn-link{display:flex;align-items:center;gap:16px;width:max-content;max-width:100%;position:relative;
  padding:4px 0;background:none;border:none;cursor:pointer;text-align:left;opacity:0;
  min-height:44px; /* alvo de toque (WCAG 2.5.5). NÃO depender do padding: a régua
                      levou 5px→4px e o alvo caiu pra 39px a 360px. */
  transition:opacity .24s,filter .24s}
#gd-menu.open .mn-link{animation:mnStamp .42s cubic-bezier(.2,1.1,.3,1) both;animation-delay:calc(.16s + var(--i)*.06s)}
@keyframes mnStamp{0%{opacity:0;transform:translateX(-14px)}100%{opacity:1;transform:none}}
/* palco: quem está sob a luz fala, o resto escuta */
.mn-links:hover .mn-link{opacity:.42;filter:saturate(.5)}
.mn-links:hover .mn-link:hover{opacity:1;filter:none}
.mn-link .idx{font-family:var(--font-lt);font-size:11px;color:var(--cyan);flex-shrink:0;line-height:1;
  border:1px solid rgba(56,225,242,.32);border-radius:4px;padding:4px 8px;background:rgba(4,12,22,.62);
  box-shadow:0 0 14px rgba(56,225,242,.18)}
.mn-link .lb{font-family:var(--font-tag);font-weight:400;letter-spacing:.005em;
  font-size:clamp(30px,5.5vh,56px);line-height:1.14;color:#F2F6FF;
  text-shadow:0 2px 0 rgba(0,0,0,.6),0 0 30px rgba(4,9,20,.95);transition:color .2s,text-shadow .2s}
.mn-link:hover .lb,.mn-link:focus-visible .lb{color:#fff;
  text-shadow:0 2px 0 rgba(0,0,0,.6),0 0 34px rgba(56,225,242,.8);animation:neonFlick .3s both}
@keyframes neonFlick{0%{opacity:.3}16%{opacity:1}28%{opacity:.45}44%{opacity:1}58%{opacity:.72}100%{opacity:1}}
.mn-link::after{content:"";position:absolute;left:44px;right:-10px;bottom:7px;height:5px;border-radius:999px;
  background:var(--cyan);opacity:.9;filter:drop-shadow(0 0 12px rgba(56,225,242,.85));
  transform:scaleX(0) rotate(-.5deg);transform-origin:left center;
  transition:transform .3s cubic-bezier(.2,.8,.3,1)}
.mn-link:hover::after,.mn-link:focus-visible::after,.mn-link.sel::after{transform:scaleX(1) rotate(-.5deg)}
/* O FOCO DO LINK É O NEON + O TRAÇO CYAN (as duas regras acima) — o outline
   global (a:focus-visible, 3px azul) desenhava um RETÂNGULO DURO em volta da
   palavra toda vez que o menu abria (gdOpenMenu foca o link da página). Segue
   acessível: quem chega de teclado vê a palavra acender e o traço riscar.
   Mesma régua já usada no campo de busca. */
.mn-link:focus-visible{outline:none}
.mn-here{font-family:var(--font-tag);font-size:16px;color:var(--cyan);transform:rotate(-4deg);
  white-space:nowrap;text-shadow:0 0 18px rgba(56,225,242,.55);flex-shrink:0}

/* o destino de FORA (Instagram): o glifo avisa que a porta não é nossa — o cara
   sai da loja em outra aba. Sem ele, "Instagram" parecia mais uma página do site. */
.mn-link.ext .mn-ext{display:flex;align-items:center;flex-shrink:0;color:var(--cyan);opacity:.62;
  transition:opacity .2s,transform .2s}
.mn-link.ext .mn-ext svg{width:22px;height:22px;filter:drop-shadow(0 0 10px rgba(56,225,242,.5))}
.mn-link.ext:hover .mn-ext,.mn-link.ext:focus-visible .mn-ext{opacity:1;transform:translate(2px,-2px)}
@media(max-width:760px){.mn-link.ext .mn-ext svg{width:18px;height:18px}}

.mn-foot{margin-top:32px;display:flex;align-items:center;gap:20px;flex-wrap:wrap;opacity:0}
#gd-menu.open .mn-foot{animation:mnStamp .42s cubic-bezier(.2,1.1,.3,1) .58s both}
.mn-pill{display:inline-flex;align-items:center;gap:8px;padding:8px 16px;border-radius:999px;
  border:1px solid rgba(56,225,242,.35);background:rgba(4,12,22,.65);
  font-family:var(--font-d);font-weight:700;font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-2)}
.mn-pill i{width:8px;height:8px;border-radius:999px;background:var(--ok);box-shadow:0 0 12px var(--ok);
  animation:mnBlink 2.4s ease-in-out infinite}
.mn-pill.off{border-color:rgba(239,74,90,.42)}
.mn-pill.off i{background:#EF4A5A;box-shadow:0 0 12px #EF4A5A}
@keyframes mnBlink{0%,100%{opacity:.5}50%{opacity:1}}
.mn-zap{display:inline-flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;
  background:linear-gradient(180deg,#2FD08A,#1CA96A);color:#04121E;
  font-family:var(--font-d);font-weight:800;font-size:11px;letter-spacing:.13em;
  transform:rotate(1.6deg);box-shadow:0 10px 26px rgba(47,208,138,.28);transition:transform .2s}
.mn-zap:hover{transform:rotate(0) translateY(-2px);color:#04121E}
.mn-zap svg{width:15px;height:15px}
.mn-ass{font-family:var(--font-tag);font-size:24px;color:var(--cyan);transform:rotate(-2.5deg);
  text-shadow:0 0 20px rgba(56,225,242,.4)}

/* CABEÇALHO + CARD DO DROP do menu: SÓ no celular. No desktop o topo é a luz do poste
   e o drop pendura na mão do mascote; no mobile nada disso existe, então estes dois
   preenchem o vazio e devolvem o "prêmio". Estilo mobile no @media(max-width:760px). */
.mn-head,.mn-drop{display:none}

/* ---- o PREVIEW: print REAL da página, colada com fita crepe ----
   Mora no CORREDOR entre os links e a tinta do mascote: a borda direita para
   20px antes da caixa DROP, em qualquer largura. top:36% a mantém ACIMA do
   cartaz pendurado, que ocupa a faixa a partir dos 27% da altura dele. */
.mn-pv{position:absolute;right:calc(var(--stand-r) + var(--mw)*.76 + 20px);top:36%;
  transform:translateY(-50%);z-index:5;width:clamp(280px,26vw,460px);
  opacity:0;pointer-events:none;transition:opacity .3s}
#gd-menu.lit .mn-pv{opacity:1}
.pv-frame{position:relative;background:#F6F2E6;padding:8px 8px 12px;border-radius:2px;
  box-shadow:0 28px 56px rgba(0,0,0,.7),0 2px 0 rgba(0,0,0,.4);transform:rotate(-2.2deg)}
.pv-frame img{display:block;width:100%;height:auto;aspect-ratio:640/410;object-fit:cover;background:#0B1120}
.pv-cur{position:relative;z-index:2}
.pv-prev{position:absolute;left:9px;right:9px;top:9px;z-index:1;opacity:.3;
  transform:rotate(-4deg) translate(-7px,5px);filter:brightness(.5)}
.pv-cur.tack{animation:tack .42s cubic-bezier(.2,.9,.3,1) both}
@keyframes tack{0%{opacity:0;transform:rotate(-6deg) scale(1.09);filter:brightness(.25)}
  45%{opacity:1;filter:brightness(.7)}
  74%{transform:rotate(.8deg) scale(.995)}
  100%{opacity:1;transform:none;filter:brightness(1)}}
.pv-tape{position:absolute;width:78px;height:23px;z-index:3;
  background:linear-gradient(180deg,rgba(232,220,187,.9),rgba(196,183,150,.82));
  box-shadow:0 3px 8px rgba(0,0,0,.45);opacity:.94}
.pv-tape::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(90deg,rgba(255,255,255,.16) 0 2px,transparent 2px 5px)}
.pv-tape.tl{left:-22px;top:-11px;transform:rotate(-38deg)}
.pv-tape.br{right:-22px;bottom:-9px;transform:rotate(-38deg)}
/* o carimbo vive ACIMA da print: embaixo ele sumiria atrás do boné do mascote */
.pv-stamp{margin:0 0 12px 8px;display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border-radius:8px;
  border:1px solid rgba(56,225,242,.4);background:rgba(4,12,22,.78);transform:rotate(1.2deg);
  font-family:var(--font-d);font-weight:800;font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--cyan)}
.pv-stamp b{font-family:var(--font-lt);font-weight:400;font-size:10px;letter-spacing:0;color:#04121E;
  background:var(--cyan);border-radius:4px;padding:2px 8px}
@media(max-width:1100px){.mn-pv{display:none}}

/* ---- o STAND: o cartaz do drop PENDURA na caixa que o mascote ergue ----
   Não é um card ao lado dele: é uma plaquinha de loja, presa por argola e
   gancho na mão dele. Ele balança, ela balança junto — uma peça só.
   z-index 6: o boneco fica NA FRENTE da print (parede → foto colada → mascote).
   Prefixo .ms- (não .st-): .st-tag já é a assinatura Sedgwick da casa. ---- */
.mn-stand{position:absolute;right:var(--stand-r);bottom:0;z-index:6;pointer-events:auto;opacity:0}
#gd-menu.open .mn-stand{animation:mnStamp .5s cubic-bezier(.2,1.1,.3,1) .66s both}
.ms-in{position:relative;width:max-content;animation:msFloat 6s ease-in-out infinite}
@keyframes msFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}
.ms-masc{display:block;position:relative;z-index:2;width:var(--mw);height:auto;cursor:pointer;
  filter:drop-shadow(0 22px 44px rgba(0,0,0,.8));transform-origin:52% 96%;
  -webkit-user-select:none;user-select:none;transition:filter .25s}
.ms-masc:hover{filter:drop-shadow(0 22px 44px rgba(0,0,0,.8)) drop-shadow(0 0 22px rgba(56,225,242,.35))}
/* o cartaz pendura NA CAIXA que ele ergue e cai à ESQUERDA do corpo — nunca
   sobre o rosto. O gancho é o eixo do balanço. */
.ms-hang{position:absolute;z-index:3;right:77.5%;top:27%}  /* re-medido pra arte nova: caixa DROP com centro-x em 22,5% */
.ms-hook{position:absolute;right:calc(var(--mw)*.024);top:calc(var(--mw)*-.05);
  width:calc(var(--mw)*.0055);height:calc(var(--mw)*.05);border-radius:2px;
  background:linear-gradient(180deg,#C8D3E8,#8494B2 58%,#38E1F2);
  box-shadow:0 0 12px rgba(56,225,242,.6),1px 0 2px rgba(0,0,0,.6)}
.ms-ring{position:absolute;right:calc(var(--mw)*.016);top:calc(var(--mw)*-.021);
  width:calc(var(--mw)*.026);height:calc(var(--mw)*.026);
  border:calc(var(--mw)*.004) solid #B4C1D9;border-radius:999px;
  box-shadow:0 0 14px rgba(56,225,242,.55),inset 0 0 4px rgba(0,0,0,.5)}
.ms-plaque{position:relative;display:flex;align-items:center;
  gap:calc(var(--mw)*.021);width:calc(var(--mw)*.44);padding:calc(var(--mw)*.023) calc(var(--mw)*.026);
  border-radius:calc(var(--mw)*.021);cursor:pointer;text-align:left;
  transform-origin:calc(100% - var(--mw)*.029) calc(var(--mw)*-.028);
  background:rgba(7,13,25,.9);border:1px solid rgba(56,225,242,.32);
  -webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);
  box-shadow:0 22px 46px rgba(0,0,0,.7);animation:msSway 6s ease-in-out infinite;
  transition:box-shadow .22s,border-color .22s}
@keyframes msSway{0%,100%{transform:rotate(-1.4deg)}50%{transform:rotate(1.4deg)}}
.ms-plaque:hover{animation-play-state:paused;border-color:var(--cyan);
  box-shadow:0 26px 54px rgba(0,0,0,.78),0 0 30px rgba(56,225,242,.25)}
.ms-plaque .ms-n{position:absolute;top:calc(var(--mw)*-.017);left:calc(var(--mw)*.024);
  font-family:var(--font-lt);font-size:max(10px,calc(var(--mw)*.021));color:#04121E;
  background:var(--cyan);border-radius:4px;padding:calc(var(--mw)*.005) calc(var(--mw)*.012);
  box-shadow:0 0 16px rgba(56,225,242,.55)}
.ms-plaque img{width:calc(var(--mw)*.108);height:calc(var(--mw)*.108);flex-shrink:0;object-fit:contain;
  background:#F0F4FA;border-radius:calc(var(--mw)*.016);padding:calc(var(--mw)*.009)}
.ms-plaque .ms-txt{flex:1;min-width:0}
.ms-plaque .ms-nm{display:block;font-family:var(--font-d);font-weight:700;color:#E6ECF8;
  font-size:max(12px,calc(var(--mw)*.024));line-height:1.25;margin-bottom:calc(var(--mw)*.006)}
.ms-plaque .ms-p{display:block;font-family:var(--font-d);font-weight:800;color:var(--cyan);
  font-size:max(16px,calc(var(--mw)*.031));white-space:nowrap}
.ms-plaque .ms-p i{font-style:normal;font-size:max(10px,calc(var(--mw)*.0195));font-weight:600;color:var(--ink-3)}
.ms-plaque .ms-arw{margin-left:auto;flex-shrink:0;color:var(--ink-3);
  font-size:max(14px,calc(var(--mw)*.03));transition:transform .2s,color .2s}
.ms-plaque:hover .ms-arw{color:var(--cyan);transform:translateX(3px)}

/* ---- EASTER EGG · clicar no mascote: ELE CAI NO SKATE ----
   Cruza o muro riscando o piso de LED e volta. A placa recolhe na corrida
   (o preço fica ilegível em movimento e ela taparia os links). ---- */
.ms-skate{position:absolute;z-index:1;left:50%;bottom:calc(var(--mw)*.006);
  width:calc(var(--mw)*.44);height:calc(var(--mw)*.055);
  transform:translateX(-50%) translateY(10px);opacity:0;transition:opacity .18s,transform .18s}
#gd-menu.skt .ms-skate{opacity:1;transform:translateX(-50%)}
.skt-deck{position:absolute;left:0;right:0;top:0;height:52%;border-radius:999px;
  background:linear-gradient(180deg,#26355A,#0B1224);border:1px solid rgba(255,255,255,.15);
  box-shadow:0 6px 16px rgba(0,0,0,.65),inset 0 1px 0 rgba(56,225,242,.3)}
.skt-w{position:absolute;bottom:0;width:calc(var(--mw)*.036);height:calc(var(--mw)*.036);border-radius:999px;
  background:radial-gradient(circle at 40% 34%,#F2F7FF,#93A7C4 58%,#2E74FF);
  box-shadow:0 0 12px rgba(56,225,242,.5)}
.skt-w.l{left:12%}.skt-w.r{right:12%}
#gd-menu.skt .skt-w{animation:skSpin .2s linear infinite}
@keyframes skSpin{to{transform:rotate(360deg)}}
.mn-trail{position:absolute;z-index:3;pointer-events:none;opacity:0;
  bottom:calc(var(--mw)*.022);right:calc(var(--stand-r) + var(--mw)*.42);
  height:calc(var(--mw)*.018);width:0;border-radius:999px;filter:blur(1px);
  background:linear-gradient(90deg,transparent,rgba(56,225,242,.9));
  box-shadow:0 0 26px 5px rgba(56,225,242,.45)}
#gd-menu.skt .mn-trail{animation:skTrail 2.6s cubic-bezier(.4,0,.35,1) both}
@keyframes skTrail{0%{width:0;opacity:0}9%{opacity:1}46%{width:44vw;opacity:.95}
  62%{width:44vw;opacity:.55}100%{width:44vw;opacity:0}}
.ms-in.ride{animation:skRide 2.6s cubic-bezier(.4,0,.35,1) both}
@keyframes skRide{
  0%{transform:translateX(0) rotate(0)}
  7%{transform:translateX(0) rotate(-4deg)}
  46%{transform:translateX(-44vw) rotate(-2.5deg)}
  54%{transform:translateX(-44vw) rotate(3deg)}
  93%{transform:translateX(0) rotate(1.4deg)}
  100%{transform:translateX(0) rotate(0)}}
#gd-menu.skt .ms-hang{opacity:0;transition:opacity .22s}

@media(max-width:1100px){.ms-hang{display:none}#gd-menu{--mw:300px}.ms-masc{opacity:.45}}
@media(max-width:760px){
  /* --- O VAZIO MORRE: 3 zonas preenchem a tela (cabeçalho / links / drop+rodapé) --- */
  .mn-inner{justify-content:flex-start;gap:0;
    padding:calc(env(safe-area-inset-top,0px) + 56px) 24px calc(env(safe-area-inset-bottom,0px) + 92px)}

  /* CABEÇALHO — dá voz ao topo (antes eram ~354px de parede morta) */
  .mn-head{display:flex;flex-direction:column;gap:4px;flex-shrink:0}
  #gd-menu.open .mn-head{animation:mnStamp .42s cubic-bezier(.2,1.1,.3,1) .08s both}
  .mnh-tag{font-family:var(--font-lt);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--cyan);opacity:.9}
  .mnh-q{font-family:var(--font-tag);font-size:clamp(24px,7.4vw,36px);color:#F2F6FF;line-height:1;
    transform:rotate(-1.4deg);text-shadow:0 2px 0 rgba(0,0,0,.6),0 0 26px rgba(4,9,20,.9)}

  /* LINKS — o herói. space-evenly espalha os 6 na faixa do meio: o vão vira RITMO
     (gaps parelhos entre os links) em vez de um buraco de ~96px antes do card do drop.
     Auto-adapta: tela mais alta = respiro maior, sempre parelho.
     Trilho M (rodada 2): com TETO — numa janela de 1100px+ de altura o space-evenly
     esticava os 6 links com buracos de ~130px (print do Anthony). O max-height trava
     o ritmo do celular e o margin-block:auto centra a faixa no que sobrar. */
  .mn-links{flex:1 1 auto;justify-content:space-evenly;gap:4px;max-height:560px;margin-block:auto}
  .mn-link{gap:12px}
  .mn-link .lb{font-size:clamp(24px,7.8vw,36px)}
  .mn-link::after{left:38px}
  .mn-here{display:none}

  /* CARD DO DROP — o "prêmio" que o mobile jogava fora, de volta e clicável.
     align-self herda o stretch do .mn-inner: vira uma tira de ponta a ponta. */
  .mn-drop{display:flex;align-items:center;gap:12px;flex-shrink:0;margin-bottom:16px;position:relative;
    padding:8px 12px;border-radius:12px;background:rgba(7,13,25,.82);border:1px solid rgba(56,225,242,.3);
    -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 16px 34px rgba(0,0,0,.55)}
  #gd-menu.open .mn-drop{animation:mnStamp .42s cubic-bezier(.2,1.1,.3,1) .5s both}
  .mn-drop:active{transform:scale(.99)}
  .mnd-badge{position:absolute;top:-9px;left:12px;font-family:var(--font-lt);font-size:10px;color:#04121E;
    background:var(--cyan);border-radius:4px;padding:2px 8px;box-shadow:0 0 14px rgba(56,225,242,.5)}
  .mn-drop img{width:52px;height:52px;flex-shrink:0;object-fit:contain;background:#F0F4FA;border-radius:8px;padding:4px}
  .mnd-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
  .mnd-k{font-family:var(--font-tag);font-size:12px;color:var(--cyan);line-height:1;margin-bottom:1px}
  .mnd-nm{font-family:var(--font-d);font-weight:700;font-size:12px;color:#E6ECF8;line-height:1.2;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mnd-p{font-family:var(--font-d);font-weight:800;font-size:14px;color:var(--cyan)}
  .mnd-p i{font-style:normal;font-size:11px;font-weight:600;color:var(--ink-3)}
  .mnd-arw{flex-shrink:0;color:var(--cyan);font-size:18px}

  /* RODAPÉ — ancorado embaixo pelo flex:1 dos links */
  .mn-foot{gap:8px;margin-top:0;flex-shrink:0}
  .mn-ass{display:none}

  /* o mascote-FANTASMA sai: o card do drop faz o trabalho dele, sem o 28% cortado
     por cima do botão do zap. (O easter egg do skate é delícia de desktop.) */
  .mn-stand{display:none}

  /* a parede escurece um tico mais no mobile pra o manuscrito GANHAR dela (o gradiente
     horizontal do desktop não servia num layout de largura cheia) */
  .mn-scrim{background:linear-gradient(180deg,rgba(3,6,12,.9) 0%,rgba(3,6,12,.64) 30%,rgba(3,6,12,.66) 60%,rgba(3,6,12,.93) 100%)}
}

/* o símbolo-porta é fixo no centro inferior: no fim da página ele pousava em
   cima da linha de copyright/CNPJ do rodapé (exigência legal, Decreto 7.962).
   `gd-hashud` marca exatamente as páginas que ganham o HUD. (Chamava-se `gd-hasbar`
   até a G1 tirar a barra do topo — o nome mentia, mas a folga legal é a mesma.) */
body.gd-hashud footer.site{padding-bottom:100px}
@media(max-width:760px){body.gd-hashud footer.site{padding-bottom:88px}}
/* PDP no celular: além da porta (que sobe pra 78px), a barra fixa de compra
   mora no rodapé — as duas juntas comiam a linha do CNPJ. */
@media(max-width:860px){body.gd-hashud[data-page="produto"] footer.site{padding-bottom:150px}}

/* ============================================================
   PILHA NOVA — overlays acima do HUD
   ============================================================ */
.toast{bottom:104px;z-index:305}
.gd-scrim{z-index:460}
.gd-drawer{z-index:470}
.gd-fly{z-index:480}

/* ---------- BUSCA "PROCURA NA 01" (mesma lógica, pele da rua) ---------- */
.search-overlay{z-index:500;background:rgba(4,7,14,.94);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);padding:14vh 20px 32px}
.search-panel{width:min(760px,100%);background:transparent;border-radius:0;box-shadow:none;overflow:visible}
.search-panel::before{content:"procura na 01 ✦";display:inline-block;margin-bottom:16px;
  font-family:var(--font-tag);font-size:clamp(24px,5vw,44px);color:var(--cyan);transform:rotate(-1.6deg);
  text-shadow:0 0 26px rgba(56,225,242,.4)}
.search-head{gap:16px;padding:20px 20px;border:1.5px solid rgba(56,225,242,.4);border-radius:16px;
  background:rgba(10,16,30,.8)}
.search-head svg{width:22px;height:22px;color:var(--cyan)}
/* min-width:0 — sem isso o input NUNCA encolhe abaixo do tamanho intrínseco e
   empurra o "ESC" pra fora do campo (invisível no gate: o body tem overflow-x
   hidden e engole a prova). Mesma armadilha do `.grid>*{min-width:0}` da C2. */
.search-head input{font-size:20px;color:#F5F8FF;flex:1;min-width:0}
.search-head input::placeholder{color:var(--ink-3)}
@media(max-width:560px){
  .search-overlay{padding:12vh 16px 24px}
  .search-head{padding:16px 16px;gap:12px}
  .search-head input{font-size:16px}   /* ≥16px: iOS não dá zoom no foco */
}
/* o campo INTEIRO é o indicador de foco: o outline global desenharia um
   retângulo duro dentro da moldura cyan. Acessível e sem sujeira. */
.search-head:focus-within{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(56,225,242,.18)}
.search-head input:focus-visible{outline:none}
.search-close{background:rgba(255,255,255,.08);color:var(--ink-2);border-radius:8px;width:34px;height:34px}
.search-close:hover{background:var(--cyan);color:#04121E}
.search-results{max-height:52vh;padding:12px 0}
.search-label{color:var(--ink-3)}
.s-item:hover{background:rgba(56,225,242,.08)}
.s-item .s-price{color:var(--cyan)}
.gd-schip{background:transparent;border-color:rgba(255,255,255,.14);color:var(--ink-2)}
.gd-schip:hover{background:var(--cyan);border-color:var(--cyan);color:#04121E}
.search-empty h4{color:#F5F8FF}

/* ---------- reduced motion: corte seco ---------- */
@media (prefers-reduced-motion: reduce){
  #gd-menu.open,#gd-menu.open .mn-link,#gd-menu.open .mn-foot,#gd-menu.open .mn-stand,
  #gd-menu.open .mn-head,#gd-menu.open .mn-drop{animation:none;opacity:1}
  #gd-menu.open .mn-cone{animation:none;opacity:.5}
  .pv-cur.tack{animation:none;opacity:1}
  .ms-in,.ms-masc,.ms-plaque,.mn-pill i,.skt-w,.ms-in.ride{animation:none}
  .ms-skate,.mn-trail{display:none}
  #gd-menu{transition:none}      /* a luz troca de link em corte seco */
  .mn-pool,.mn-lit,.mn-pv,.ms-plaque,.hud-porta .sl,.hud-chip{transition:none}
  .hud-comanda .cart-count.bump{animation:none}
}

/* ============================================================
   R5 · HERO "O DROP NO PAREDÃO"  (a fusão aprovada: Paredão + Drop)
   Portado do lab-hero-drop.html (R2), já NA RÉGUA.

   UMA fonte de luz: o poste. Tudo que brilha deriva dela. O muro nasce
   apagado e a luz é que o REVELA (.hd-wall.lit é o MESMO muro em brilho
   normal, mascarado no formato do cone) — não é glow chapado por cima.

   Coreografia 1× (~1,6s); depois a cena quase para: só o galão respira e
   o anel gira devagar. Doutrina: pouco movimento, muita precisão.

   ARMADILHAS (custaram caro, não reintroduzir):
   - mix-blend-mode:multiply TRAI em camada composta → PNG com alpha.
   - <img> com atributo height + CSS width:100% estica → sempre height:auto.
   - reflexo: transform-origin CENTER (com top ele desenha pra CIMA) e a
     máscara vai invertida junto com o scaleY(-1).
   - cone: conic-gradient + máscara radial. clip-path dá borda dura.
   - steps(1,end) segura o valor até o fim → jump-start pra piscar junto.
   ============================================================ */
.hd{position:relative;min-height:100vh;display:flex;align-items:center;overflow:hidden;
  padding:128px 0 80px;background:#05070E;isolation:isolate;--lx:70%;--ly:82%}

/* 1 · o muro real, apagado (a loja fechada) */
.hd-wall{position:absolute;inset:0;z-index:0;
  background:url("../img/muro-grafite.jpg") center 34%/cover no-repeat;
  filter:brightness(.30) saturate(.55) contrast(1.05);transform:scale(1.03)}
/* 2 · o MESMO muro em brilho normal, mascarado no formato da luz */
.hd-wall.lit{z-index:1;filter:brightness(1.02) saturate(1.02);opacity:0;
  -webkit-mask-image:radial-gradient(52% 82% at var(--lx) var(--ly), #000 0 16%, rgba(0,0,0,.72) 38%, rgba(0,0,0,.22) 62%, transparent 80%);
          mask-image:radial-gradient(52% 82% at var(--lx) var(--ly), #000 0 16%, rgba(0,0,0,.72) 38%, rgba(0,0,0,.22) 62%, transparent 80%)}
.hd.go .hd-wall.lit{animation:hdLight 1.05s ease .18s forwards}

/* 3 · scrim: a esquerda escurece pra copy respirar */
.hd-scrim{position:absolute;inset:0;z-index:2;pointer-events:none;background:
  linear-gradient(90deg,rgba(4,7,14,.96) 0%,rgba(4,7,14,.86) 26%,rgba(4,7,14,.42) 50%,rgba(4,7,14,.10) 68%,rgba(4,7,14,.55) 100%)}
.hd-vig{position:absolute;inset:0;z-index:2;pointer-events:none;background:
  radial-gradient(120% 100% at 50% 42%, transparent 42%, rgba(3,6,12,.72) 100%),
  linear-gradient(180deg,rgba(4,7,14,.85) 0,transparent 22%,transparent 74%,#05070E 99%)}

.hd .wrap{position:relative;z-index:5;width:100%}
/* 1.06fr (não 1.02): a 1.02 a coluna dava 571px, mas a linha "O brilho de showroom"
   precisa de 580px — a gótica .gt-chrome renderiza a 1.16em (~65px), maior que o h1.
   Faltavam 9px e a headline quebrava em 3 linhas com a gótica órfã no meio da 2ª.
   O palco cai de 549→526px; o galão continua em min(292px,47%). */
.hd-grid{display:grid;grid-template-columns:1.06fr .94fr;gap:32px;align-items:center}

/* ---------- copy ---------- */
.hd-copy .eyebrow{color:#9FEFF9}
.hd-copy .eyebrow::before{background:#9FEFF9}
/* text-wrap:balance equilibra as linhas e mata a órfã — a 1024px o ponto final
   caía sozinho numa 3ª linha. Degrada sozinho em navegador antigo (vira normal).
   max-width:14ch segura a medida em telas largas. */
/* G1.1 (10/07, noite — pedido do Renan): o h1 do hero INTEIRO na fonte da rua.
   Faltava: "O brilho de" e "sai do teu carrinho" ainda eram Sora; só "showroom"
   (o `.gt-chrome`) era gótico. Agora a frase toda é Pirata One, e a JOGADA DE
   COR do hero vira o padrão do site: base branca · palavra-assinatura em chrome ·
   fecho em AZUL elétrico. Sobe pra 72px porque a Pirata lê ~16% menor que a Sora
   (a mesma compensação da régua) — e a coluna do hero comporta (medido). */
.hd-copy h1{font-family:var(--font-gt);font-weight:400;font-size:clamp(36px,5.6vw,72px);
  letter-spacing:.01em;line-height:1.02;color:#F5F8FF;margin-bottom:16px;
  max-width:16ch;text-wrap:balance}
.hd-copy h1 em{font-style:normal;
  color:#5B90FF;-webkit-text-fill-color:#5B90FF;
  filter:drop-shadow(0 0 16px rgba(46,116,255,.45))}
/* o `.gt-chrome` do "showroom" era 1.16em pra compensar quando o resto do h1 era
   Sora (mais baixa). Agora o h1 inteiro é Pirata One do mesmo tamanho — 1.16em
   deixaria "showroom" gritando e quebrando a linha. Volta pra 1em. */
.hd-copy h1 .gt-chrome{font-size:1em}
.hd-copy .lead{color:var(--ink-2);font-size:clamp(16px,1.6vw,18px);max-width:48ch;margin-bottom:12px}
.hd-copy .lead b{color:#DCE5F5;font-weight:600}
.hd-ass{font-size:clamp(16px,2vw,20px);margin:0 0 20px}
.hd-cta{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:32px}
.hd-trust{display:flex;gap:24px;flex-wrap:wrap}
.hd-trust .ht b{display:block;font-family:var(--font-d);font-weight:800;font-size:14px;color:#EEF2FA}
.hd-trust .ht span{font-size:12px;color:var(--ink-3)}

/* ============================================================
   O PALCO — tudo que é cena mora aqui (nunca solto na seção, senão o
   mobile desalinha quando a copy empurra o palco pra baixo).
   --ground   = a linha do chão (galão pousa, poça se centra, poste é plantado)
   --lamp-x/y = a LÂMPADA dentro do palco. É daí que o cone nasce.
   Medidos NA ARTE (poste-porteiro.webp, 852×1846): o vidro cai em 72,0%×6,9%
   do PNG, o que dá 28,3%×2,5% do palco.
   ============================================================ */
.hd-stage{position:relative;min-height:600px;--ground:84%;--lamp-x:28.3%;--lamp-y:2.5%}

.hd-poste{position:absolute;left:-4%;top:var(--ground);width:45%;z-index:6;pointer-events:none;
  transform:translateY(-100%);filter:brightness(.26) saturate(.45)}
.hd-poste img{display:block;width:100%;height:auto}
.hd.go .hd-poste{animation:hdPosteOn 1.05s ease .18s forwards}
/* o brilho da lâmpada é do SITE, nunca da arte (senão vira halo dentro de halo) */
.hd-bulb{position:absolute;left:var(--lamp-x);top:var(--lamp-y);width:150px;height:92px;z-index:7;
  transform:translate(-50%,-50%);pointer-events:none;opacity:.12;
  background:radial-gradient(closest-side,rgba(246,254,255,.95),rgba(143,230,246,.42) 34%,rgba(56,225,242,.16) 62%,transparent 80%)}
.hd.go .hd-bulb{animation:hdBulb 1.05s ease .18s forwards}

/* o cone: conic-gradient (clip-path daria borda dura e triângulo chapado) */
.hd-beam{position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;
  background:conic-gradient(from 140deg at var(--lamp-x) var(--lamp-y),
    transparent 0 5deg, rgba(202,240,255,.3) 13deg, rgba(132,202,255,.2) 27deg,
    rgba(56,225,242,.08) 40deg, transparent 48deg);
  -webkit-mask-image:radial-gradient(128% 116% at var(--lamp-x) var(--lamp-y), #000 0 14%, rgba(0,0,0,.72) 46%, transparent 88%);
          mask-image:radial-gradient(128% 116% at var(--lamp-x) var(--lamp-y), #000 0 14%, rgba(0,0,0,.72) 46%, transparent 88%);
  filter:blur(6px)}
.hd.go .hd-beam{animation:hdLight 1.05s ease .18s forwards}

/* o letreiro de neon, MONTADO no muro. -4% (não -7%): a -7% ele encostava no topo. */
.hd-neon{position:absolute;top:-4%;right:-3%;z-index:1;text-align:center;pointer-events:none;
  transform:rotate(-1.6deg)}
.hd-neon .spill{position:absolute;left:50%;top:52%;width:300px;height:180px;transform:translate(-50%,-50%);
  background:radial-gradient(closest-side,rgba(56,225,242,.42),rgba(46,116,255,.14) 58%,transparent 78%);
  filter:blur(12px);mix-blend-mode:screen;opacity:0}
.hd-neon .tubes{position:relative;opacity:0;display:block}
.hd-neon .nw,.hd-neon .nn{display:block;font-family:var(--font-lt);color:transparent;line-height:.94;
  -webkit-text-stroke:2.2px #8FEDF8;
  filter:drop-shadow(0 0 5px rgba(56,225,242,.95)) drop-shadow(0 0 17px rgba(56,225,242,.55)) drop-shadow(0 0 40px rgba(46,116,255,.4))}
.hd-neon .nw{font-size:clamp(20px,2.1vw,24px);letter-spacing:.14em}
.hd-neon .nn{font-size:clamp(44px,5vw,70px);letter-spacing:.02em;-webkit-text-stroke-width:2.9px}
/* sem desconto ativo o drop NÃO tem relógio — só a semana (regra travada da R6) */
.hd-neon .nsub{display:block;margin-top:4px;font-family:var(--font-d);font-weight:800;
  font-size:11px;letter-spacing:.34em;color:#9FEFF9;text-shadow:0 0 12px rgba(56,225,242,.6)}
.hd-neon .conduit{position:absolute;left:50%;top:-16px;width:2px;height:18px;transform:translateX(-50%);
  background:linear-gradient(180deg,transparent,rgba(150,175,210,.5));opacity:0}
.hd-neon .bolt{position:absolute;top:-20px;width:7px;height:7px;border-radius:999px;opacity:0;
  background:radial-gradient(circle at 34% 32%,#8C9AB4,#39445C);box-shadow:0 1px 2px rgba(0,0,0,.7)}
.hd-neon .bolt.l{left:16%}
.hd-neon .bolt.r{right:16%}
.hd.go .hd-neon .tubes,.hd.go .hd-neon .spill{animation:hdNeon 1.15s steps(1,jump-start) .26s forwards}
.hd.go .hd-neon .conduit,.hd.go .hd-neon .bolt{animation:hdFade .5s ease .9s forwards}

/* piso de LED, em perspectiva, só onde a luz alcança */
.hd-floor{position:absolute;left:-16%;right:-16%;bottom:0;height:38%;z-index:2;pointer-events:none;opacity:0;
  background:
    linear-gradient(to right, rgba(120,190,255,.55) 1.5px, transparent 1.5px),
    linear-gradient(to bottom, rgba(120,190,255,.4) 1.5px, transparent 1.5px);
  background-size:56px 56px;
  transform:perspective(620px) rotateX(62deg);transform-origin:50% 100%;
  -webkit-mask-image:radial-gradient(52% 90% at 50% 96%, #000 10%, rgba(0,0,0,.62) 44%, transparent 78%);
          mask-image:radial-gradient(52% 90% at 50% 96%, #000 10%, rgba(0,0,0,.62) 44%, transparent 78%)}
.hd.go .hd-floor{animation:hdFloor 1s ease .5s forwards}

/* a POÇA: halo de ar aceso atrás do galão + a poça achatada na linha do chão */
.hd-pool{position:absolute;left:50%;top:52%;width:min(560px,100%);height:min(620px,108%);z-index:3;pointer-events:none;
  border-radius:999px;transform:translate(-50%,-50%) scale(.55);opacity:0;
  background:radial-gradient(ellipse closest-side at 50% 56%,
    rgba(255,255,255,.92) 0 44%, rgba(222,240,255,.74) 56%, rgba(146,200,255,.4) 70%,
    rgba(56,225,242,.14) 84%, rgba(46,116,255,0) 96%)}
.hd.go .hd-pool{animation:hdPool .78s cubic-bezier(.2,.8,.3,1) .48s forwards}
.hd-wet{position:absolute;left:50%;top:var(--ground);width:min(500px,96%);height:118px;z-index:3;pointer-events:none;
  transform:translate(-50%,-50%) scale(.6);opacity:0;
  background:radial-gradient(closest-side,rgba(230,244,255,.72),rgba(120,190,255,.3) 46%,rgba(56,225,242,.1) 66%,transparent 80%);
  filter:blur(3px)}
.hd-streak{position:absolute;left:50%;top:var(--ground);width:126px;height:120px;z-index:3;pointer-events:none;
  transform:translateX(-50%) scaleY(.7);opacity:0;
  background:linear-gradient(180deg,rgba(214,240,255,.42),transparent 88%);filter:blur(8px);mix-blend-mode:screen}
.hd.go .hd-wet{animation:hdWet .8s cubic-bezier(.2,.8,.3,1) .5s forwards}
.hd.go .hd-streak{animation:hdFade .7s ease .72s forwards}

/* o anel de texto: o wrap centra, o svg só gira (rotate brigaria com o translate) */
.hd-orbitwrap{position:absolute;left:50%;top:52%;width:min(556px,98%);aspect-ratio:1;z-index:4;
  transform:translate(-50%,-50%);pointer-events:none;opacity:0}
.hd.go .hd-orbitwrap{animation:hdFade .8s ease .85s forwards}
.hd-orbit{width:100%;height:100%;display:block;animation:hdOrbit 34s linear infinite}
.hd-orbit text{font-family:var(--font-d);font-weight:800;font-size:12px;letter-spacing:.42em;fill:var(--cyan)}
.hd-orbit .halo{fill:none;stroke:rgba(56,225,242,.16);stroke-width:1;stroke-dasharray:3 9}

/* o produto da semana, gigante, respirando na poça. A BASE pousa em --ground.
   --dscale = a régua do palco (main.js): corrige a LARGURA pra que a ALTURA
   renderizada respeite o GD_TAMANHO — um 500ml nunca mais nasce do tamanho do galão. */
.hd-prodwrap{position:absolute;left:50%;top:var(--ground);width:calc(min(292px,47%)*var(--dscale,1));z-index:5;display:block;
  opacity:0;transform:translate(-50%,calc(-100% + 26px));text-decoration:none}
.hd.go .hd-prodwrap{animation:hdProdIn .72s cubic-bezier(.2,.8,.3,1) .6s forwards}
.hd-prod{position:relative;z-index:2;display:block}
.hd-prod img{display:block;width:100%;height:auto;animation:hdBreathe 7s ease-in-out infinite;
  filter:drop-shadow(0 24px 26px rgba(8,18,40,.45)) drop-shadow(0 0 24px rgba(150,215,255,.3));
  transition:filter .3s}
/* hover = resposta (doutrina): a luz encosta mais forte no galão */
.hd-prodwrap:hover .hd-prod img,.hd-prodwrap:focus-visible .hd-prod img{
  filter:drop-shadow(0 24px 26px rgba(8,18,40,.45)) drop-shadow(0 0 34px rgba(180,230,255,.55))}

/* O CORPO (fake-3D) — o recorte é foto chapada: girar sozinho lê como adesivo.
   Volume é LUZ obedecendo à cena (uma fonte só: o poste, à esquerda):
   · cilindro: flancos escuros, centro aberto — a curvatura que a foto não tem
   · rim: fio ciano no flanco que encara o poste
   · specular: banda de brilho que SEGUE o mouse (--hpx) — o cursor é a luz
     (modelo Apple/Nike): highlight viajando na superfície = o olho aceita 3D.
   · v3: o cilindro também GIRA com a luz (os flancos deslocam com --hpx) e
     entrou o AO vertical (topo/base) — ancoragem genérica pra qualquer drop.
   Tudo mascarado pela PRÓPRIA silhueta (--cut, o main.js aponta pro recorte
   do drop) — qualquer drop futuro ganha corpo de graça. A animação segue no
   img (hdBreathe); a casca acompanha por herdar o mesmo box. */
.hd-sheen{position:absolute;inset:0;z-index:3;pointer-events:none;overflow:hidden;
  -webkit-mask-image:var(--cut,none);-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat;
          mask-image:var(--cut,none);mask-size:100% 100%;mask-repeat:no-repeat;
  animation:hdBreathe 7s ease-in-out infinite;
  background:
    linear-gradient(100deg,
      transparent calc(20% + var(--hpx,0)*26%),
      rgba(255,255,255,.3) calc(32% + var(--hpx,0)*26%),
      transparent calc(45% + var(--hpx,0)*26%)),
    linear-gradient(92deg,rgba(170,225,255,.34) 0,rgba(170,225,255,.1) 6%,transparent 15%),
    linear-gradient(90deg,
      rgba(2,8,20,.34) calc(0% + var(--hpx,0)*9%),
      transparent calc(22% + var(--hpx,0)*9%),
      transparent calc(58% + var(--hpx,0)*9%),
      rgba(2,8,20,.46) calc(96% + var(--hpx,0)*9%)),
    linear-gradient(180deg,rgba(2,8,20,.16) 0,transparent 14%,transparent 78%,rgba(2,8,20,.3) 100%)}
/* o GLINT idle: sem mouse (celular), uma lasca de luz varre a garrafa 1× por
   ciclo — mesma cadência da gota na poça (~11s). Vidro piscando = coisa viva. */
.hd-sheen::after{content:"";position:absolute;inset:-6% -40%;opacity:0;
  background:linear-gradient(115deg,transparent 44%,rgba(255,255,255,.34) 50%,transparent 56%);
  transform:translateX(-62%)}
.hd.go .hd-sheen::after{animation:hdGlint 11s ease-in-out 4.4s infinite}
@keyframes hdGlint{0%,84%{opacity:0;transform:translateX(-62%)}88%{opacity:1}95%,100%{opacity:0;transform:translateX(62%)}}
/* drop sem recorte = cartaz emoldurado: casca de cilindro em foto de catálogo mente */
.hd-prodwrap.sem-cut .hd-sheen{display:none}
.hd-refl{position:absolute;top:100%;left:0;width:100%;z-index:1;pointer-events:none;display:block;
  transform:scaleY(-1);opacity:.26;filter:blur(2.2px);
  -webkit-mask-image:linear-gradient(180deg,transparent 0,rgba(0,0,0,.3) 38%,#000 100%);
          mask-image:linear-gradient(180deg,transparent 0,rgba(0,0,0,.3) 38%,#000 100%)}
.hd-refl img{display:block;width:100%;height:auto;animation:hdBreathe 7s ease-in-out infinite}
.hd-contact{position:absolute;left:50%;bottom:-14px;width:82%;height:34px;z-index:0;pointer-events:none;display:block;
  transform:translateX(-50%);filter:blur(calc(6px + var(--hpa,0)*5px));
  background:radial-gradient(closest-side,rgba(20,42,78,.6),rgba(20,42,78,.18) 58%,transparent 82%)}
/* drop SEM recorte (pintaCena): a foto de catálogo entra EMOLDURADA — JPG de
   fundo branco solto no breu parecia erro; moldura vira "cartaz do produto". */
.hd-prodwrap.sem-cut .hd-prod img{border-radius:12px;border:3px solid rgba(56,225,242,.45);
  box-shadow:0 18px 44px rgba(0,0,0,.55)}
.hd-prodwrap.sem-cut .hd-refl{opacity:.12}

/* o carimbo do preço, que BATE */
.hd-stamp{position:absolute;right:-1%;bottom:12%;z-index:7;padding:12px 16px;opacity:0;
  transform:rotate(-7deg);border:3px solid var(--cyan);border-radius:8px;background:rgba(4,16,26,.62);
  box-shadow:0 0 26px rgba(56,225,242,.32);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}
.hd.go .hd-stamp{animation:hdStamp .5s cubic-bezier(.15,1.4,.3,1) 1.16s both}
.hd-stamp b{display:block;font-family:var(--font-d);font-weight:800;font-size:20px;letter-spacing:.05em;color:var(--cyan);white-space:nowrap}
.hd-stamp span{font-size:11px;letter-spacing:.14em;color:#9FEFF9;font-weight:700}
.hd-stamp::before{content:"";position:absolute;inset:-6px;border:2px solid rgba(56,225,242,.6);border-radius:12px;opacity:0}
.hd.go .hd-stamp::before{animation:hdRing .5s ease 1.34s forwards}
/* o carimbo ERROU a primeira batida: um fantasma da mesma caixa, deslocado e girado,
   espiando por baixo — tinta falhada de quem bateu duas vezes. Nasce um tique
   depois da batida real. z:-1 = atrás do fundo translúcido do carimbo. */
.hd-stamp .ghost{position:absolute;inset:-3px;z-index:-1;padding:12px 16px;border:3px solid var(--cyan);
  border-radius:8px;opacity:0;transform:translate(8px,6px) rotate(2.6deg);filter:blur(.5px);pointer-events:none}
.hd.go .hd-stamp .ghost{animation:hdGhost .35s ease 1.5s forwards}

/* ---------- R11 · produto vivo v2 ----------
   O mouse é a cabeça do visitante: o JS pinta 4 vars no palco e cada camada
   anda uma distância diferente — galão inclina (perto), anel contra-anda
   (fundo), carimbo desliza (vidro). Vars nascem 0: sem mouse (ou com reduce,
   quando o JS nem liga) tudo resolve em identidade, custo zero. */
/* A perspectiva fecha (720→620px): o MESMO ângulo passa a render mais volume.
   E o galão não só gira — ele ANDA (`translate`) contra o anel, que anda pro
   outro lado. É a diferença de leitura entre um adesivo torto e um objeto no
   espaço, e é o que o Anthony pediu em "mais acentuado" (13/07).
   `translate` é propriedade própria: compõe com o `transform` sem brigar. */
/* A HIERARQUIA DA PROFUNDIDADE (pedido de 16/07: "o produto vira MAIS que o
   fundo e que o valor no Pix"). Antes o carimbo andava 24px e o galão 22px —
   colados, a cena lia como UM adesivo. Agora cada plano tem a sua distância:
     galão (herói)    vira 13/19° e anda 26px — o único que ROTACIONA de verdade
     carimbo (vidro)  desliza 8px, giro residual de 3° — perto, mas é etiqueta
     anel (meio)      contra-anda 36px — é o fundo do palco girando atrás
     poste/neon (rua) respiram 7-9px ao CONTRÁRIO — a parede fica, a cabeça anda
   E o reflexo/sombra ACOMPANHAM o pé do galão (paravam parados enquanto ele
   andava — o chão desmentia o 3D). */
/* v3 (20/07, rodada dos designers): as transitions CSS SAÍRAM daqui — o easing
   agora é a MOLA do JS (lerp no rAF), fonte única. CSS + mola = amortecer duas
   vezes, e o palco boiava. A perspectiva ABRIU (620→1000px) e a rotação
   encolheu: girar demais denuncia o cilindro chapado (o rótulo distorce
   errado) — o acento saiu do ÂNGULO e foi pra LUZ (.hd-sheen).
   Novos: --hz/--hs (hover = o produto VEM, translateZ+escala), --hpa (|hpx|,
   a sombra estica/achata/borra pros dois lados), e a POÇA acompanha (o glow
   era pregado no fundo — camada que não anda desmente as que andam). */
.hd-prod{transform:perspective(1000px) translateZ(var(--hz,0px)) rotateX(var(--htx,0deg)) rotateY(var(--hty,0deg));
  translate:calc(var(--hpx,0)*26px) calc(var(--hpy,0)*15px);
  scale:var(--hs,1);will-change:transform,translate}
.hd-refl{translate:calc(var(--hpx,0)*24px) calc(var(--hpy,0)*-6px)}
.hd-contact{translate:calc(var(--hpx,0)*18px) 0px;
  scale:calc(1 + var(--hpa,0)*.24) calc(1 - var(--hpa,0)*.28)}
.hd-orbitwrap{translate:calc(var(--hpx,0)*-36px) calc(var(--hpy,0)*-24px)}
.hd-pool{translate:calc(var(--hpx,0)*12px) calc(var(--hpy,0)*7px)}
.hd-stamp{translate:calc(var(--hpx,0)*8px) calc(var(--hpy,0)*5px)}
.hd-stamp b{display:inline-block;transform:perspective(700px) rotateY(calc(var(--hpx,0)*3deg))}
.hd-poste{translate:calc(var(--hpx,0)*-7px) calc(var(--hpy,0)*-4px)}
.hd-neon{translate:calc(var(--hpx,0)*-9px) calc(var(--hpy,0)*-5px)}

/* neon de VERDADE engasga: o tubo do nº meio-apaga ~1×/9s (o reflexo cai junto,
   mesma duração + mesmo delay = sincronia sem JS) */
.hd.go .hd-neon .nn{animation:hdNeonIdle 9.4s linear 3.7s infinite}
/* o letreiro também molha o chão: coluna ciano esticada na área molhada da direita.
   O "final" do acende é a própria cor do gradiente — por isso opacity anima 0→1. */
.hd-neonrefl{position:absolute;right:5%;top:56%;bottom:5%;width:160px;z-index:3;pointer-events:none;opacity:0;
  background:linear-gradient(180deg,rgba(56,225,242,.30),rgba(46,116,255,.10) 52%,transparent 84%);
  filter:blur(14px);mix-blend-mode:screen;transform:skewX(-7deg) scaleX(.8)}
.hd.go .hd-neonrefl{animation:hdNeon 1.15s steps(1,jump-start) .26s forwards,hdNeonIdle 9.4s linear 3.7s infinite}

/* as mariposas do poste: 3 pontinhos em loop torto na lâmpada. Cada bicho tem
   raio/tempo próprios (nunca coreografia) e o brilho pisca como asa.
   ⚠️ o RAIO é o que faz elas existirem: o halo do bulb tem ~75×46px, e mariposa
   pequena DENTRO do halo é branco no branco (some). Os raios levam o bicho pra
   penumbra da borda, onde ele contrasta — e ele se perde na luz ao cruzar, que
   é o que mariposa de verdade faz. */
.hd-moths{position:absolute;left:var(--lamp-x);top:var(--lamp-y);z-index:7;pointer-events:none;opacity:0}
.hd.go .hd-moths{animation:hdFade .9s ease 1.6s forwards}
.hd-moths i{position:absolute;width:3px;height:3px;border-radius:999px;background:#EAF6FF;
  box-shadow:0 0 7px rgba(214,242,255,.95);
  animation:hdMoth var(--t) ease-in-out var(--dl) infinite alternate,hdMothAsa 1.3s steps(2,jump-none) var(--dl) infinite}
.hd-moths i:nth-child(1){--t:4.6s;--dl:0s;--rx:74px;--ry:46px}
.hd-moths i:nth-child(2){--t:6.2s;--dl:-2.3s;--rx:-92px;--ry:58px;width:2px;height:2px}
.hd-moths i:nth-child(3){--t:5.3s;--dl:-3.7s;--rx:66px;--ry:-40px;width:2px;height:2px}

/* a GOTA na poça: elipse achatada (perspectiva do chão) + eco atrasado = física de gota */
.hd-ripple{position:absolute;left:44%;top:calc(var(--ground) - 1%);width:150px;height:44px;z-index:4;
  pointer-events:none;transform:translate(-50%,-50%)}
.hd-ripple i{position:absolute;inset:0;border-radius:999px;opacity:0;transform:scale(.15);
  border:1.5px solid rgba(216,242,255,.5);filter:blur(.4px)}
.hd.go .hd-ripple i{animation:hdRipple 11s linear 2.9s infinite}
.hd.go .hd-ripple i:nth-child(2){animation-delay:3.32s}

/* ---------- coreografia: 1×, ~1,6s ---------- */
@keyframes hdLight{0%{opacity:0}18%{opacity:.85}26%{opacity:.12}38%{opacity:.95}46%{opacity:.3}60%{opacity:1}72%{opacity:.86}100%{opacity:1}}
@keyframes hdPosteOn{0%{filter:brightness(.26) saturate(.45)}18%{filter:brightness(.95) saturate(.9)}
  26%{filter:brightness(.3) saturate(.5)}38%{filter:brightness(1) saturate(1)}46%{filter:brightness(.45) saturate(.6)}
  60%{filter:brightness(1) saturate(1)}72%{filter:brightness(.9) saturate(.95)}100%{filter:brightness(1) saturate(1)}}
@keyframes hdBulb{0%{opacity:.12}18%{opacity:1}26%{opacity:.14}38%{opacity:1}46%{opacity:.3}60%{opacity:1}72%{opacity:.88}100%{opacity:1}}
@keyframes hdNeon{0%{opacity:0}20%{opacity:1}28%{opacity:0}36%{opacity:1}44%{opacity:.15}52%{opacity:1}64%{opacity:.4}72%{opacity:1}100%{opacity:1}}
@keyframes hdFloor{to{opacity:1}}
@keyframes hdFade{to{opacity:1}}
@keyframes hdPool{to{opacity:1;transform:translate(-50%,-50%) scale(1)}}
@keyframes hdWet{to{opacity:1;transform:translate(-50%,-50%) scale(1)}}
@keyframes hdProdIn{to{opacity:1;transform:translate(-50%,-100%)}}
@keyframes hdBreathe{0%,100%{transform:translateY(0) rotate(-.7deg)}50%{transform:translateY(-11px) rotate(.6deg)}}
@keyframes hdStamp{0%{opacity:0;transform:rotate(-17deg) scale(2)}64%{opacity:1;transform:rotate(-6deg) scale(.96)}100%{opacity:1;transform:rotate(-7deg) scale(1)}}
@keyframes hdRing{0%{opacity:.9;transform:scale(.9)}100%{opacity:0;transform:scale(1.5)}}
@keyframes hdOrbit{to{transform:rotate(360deg)}}
/* R11 · os loops de vida (tudo raro e pequeno — a cena continua quase parada) */
@keyframes hdGhost{to{opacity:.15}}
@keyframes hdNeonIdle{0%,89.6%,91.2%,92%,93.4%,100%{opacity:1}90.2%{opacity:.32}91.6%{opacity:.78}92.8%{opacity:.45}}
@keyframes hdMoth{0%{transform:translate(calc(var(--rx)*-1),calc(var(--ry)*.4))}
  30%{transform:translate(calc(var(--rx)*.5),calc(var(--ry)*-1))}
  55%{transform:translate(var(--rx),calc(var(--ry)*.2))}
  80%{transform:translate(calc(var(--rx)*.1),var(--ry))}
  100%{transform:translate(calc(var(--rx)*-.6),calc(var(--ry)*-.5))}}
@keyframes hdMothAsa{0%,100%{opacity:.95}50%{opacity:.3}}
@keyframes hdRipple{0%,87%{opacity:0;transform:scale(.15)}88.6%{opacity:.6}96.5%,100%{opacity:0;transform:scale(1)}}

/* ---------- mobile: copy primeiro, palco embaixo, carimbo LONGE do CTA ---------- */
@media(max-width:900px){
  .hd{--lx:50%;--ly:78%;padding:128px 0 48px;min-height:0}
  .hd-grid{grid-template-columns:1fr;gap:48px}
  /* Trilho M (rodada 2): o palco tem TETO DE LARGURA na coluna única. O poste mede
     52% da largura do palco × 2.17 de proporção — em 570-860px de viewport ele
     ficava MAIS ALTO que o palco e vazava por cima do "Compra protegida" (print
     do Anthony, 20/07). Com max-width:368px a cena rende exatamente a calibragem
     de celular (a bonita), centrada no muro, em qualquer largura da faixa.
     Conta: poste = 1.129×368 = 415px ≤ 86% de 490 = 421px. Mexeu aqui? Refaça a conta. */
  .hd-stage{min-height:490px;margin:8px auto 0;max-width:368px;width:100%;--ground:86%;--lamp-x:24%;--lamp-y:4%}
  .hd-scrim{background:linear-gradient(180deg,rgba(4,7,14,.94) 0%,rgba(4,7,14,.86) 34%,rgba(4,7,14,.42) 56%,rgba(4,7,14,.24) 74%,rgba(4,7,14,.6) 100%)}
  .hd-poste{left:-10%;width:52%}
  .hd-bulb{width:130px;height:84px}
  .hd-prodwrap{width:calc(min(216px,52%)*var(--dscale,1))}
  .hd-pool{width:min(430px,110%);height:min(500px,104%)}
  .hd-wet{width:min(360px,100%);height:96px}
  .hd-orbitwrap{width:min(384px,96%)}
  .hd-neon{top:-2%;right:-1%}
  .hd-stamp{right:2%;bottom:12%;padding:8px 12px}
  .hd-stamp b{font-size:16px}
  .hd-stamp span{font-size:10px;letter-spacing:.1em}
  .hd-stamp .ghost{padding:8px 12px}
  .hd-neonrefl{right:2%;top:52%;width:120px}
  /* os 2 CTAs com a MESMA largura — no lab um era largo e o outro estreito */
  .hd-cta{display:grid;grid-template-columns:1fr;gap:12px;margin-bottom:24px}
  .hd-cta .btn{width:100%;justify-content:center}
  .hd-trust{gap:0;row-gap:16px;flex-direction:column}
  /* a voz gótica é ASSINATURA (1×/tela): no aperto do celular ela fica com a
     linha só dela, em vez de dividir a linha com a sans. */
  .hd-copy h1 .gt-chrome{display:block}
}
@media(max-width:420px){
  .hd-stage{min-height:430px}
  .hd-prodwrap{width:calc(min(190px,54%)*var(--dscale,1))}
  .hd-neon .nn{font-size:44px}
}

@media(prefers-reduced-motion:reduce){
  .hd-wall.lit,.hd-beam,.hd-floor,.hd-pool,.hd-wet,.hd-streak,.hd-orbit,.hd-prodwrap,
  .hd-stamp,.hd-neon .tubes,.hd-neon .spill,.hd-neon .conduit,.hd-neon .bolt,.hd-bulb{
    animation:none!important;opacity:1!important;transform:none!important}
  .hd-pool,.hd-wet,.hd-orbitwrap{transform:translate(-50%,-50%)!important}
  .hd-streak{transform:translateX(-50%)!important}
  .hd-prodwrap{transform:translate(-50%,-100%)!important}
  .hd-poste{transform:translateY(-100%)!important;filter:none!important}
  .hd-bulb{transform:translate(-50%,-50%)!important}
  .hd-prod img,.hd-refl img{animation:none!important}
  /* a casca de luz é ESTADO (volume), fica — só o glint (movimento) morre */
  .hd-sheen{animation:none!important}
  .hd-sheen::after{animation:none!important;opacity:0!important}
  .hd-refl{opacity:.26!important;transform:scaleY(-1)!important}
  .hd-contact{transform:translateX(-50%)!important}
  .hd-stamp{transform:rotate(-7deg)!important}
  .hd-floor{transform:perspective(620px) rotateX(62deg)!important}
  /* R11: sem movimento, a vida some — mas o que é ESTADO fica (fantasma, reflexo) */
  .hd-moths,.hd-ripple{display:none!important}
  .hd-neon .nn,.hd-stamp .ghost,.hd-neonrefl{animation:none!important}
  .hd-stamp .ghost{opacity:.15!important}
  .hd-neonrefl{opacity:1!important}
  .hd-prod{transform:none!important;transition:none!important;scale:none!important}
  .hd-orbitwrap,.hd-stamp,.hd-pool{translate:none!important}
  .hd-contact{scale:none!important;filter:blur(6px)!important}
}

/* ---------- R5 · o selo "DIRETO DA FÁBRICA" ---------- */
/* Mora na HOME, ao lado do CTA da linha Jaça (a seção que conta a rota
   FÁBRICA→BALCÃO→TEU CARRO) — é lá que o mote significa algo. No rodapé ele
   quebrava linha e virava o 3º objeto girando junto da placa e do selo 01.
   Gira ao CONTRÁRIO do selo 01: dois selos no mesmo sentido viram enfeite;
   opostos leem como engrenagens. */
.sp-actions{display:flex;align-items:center;gap:24px;flex-wrap:wrap}
.gd-selo-fab{position:relative;width:96px;height:96px;flex-shrink:0;pointer-events:none}
.gd-selo-fab svg{width:100%;height:100%;animation:gdGiraInv 30s linear infinite}
.gd-selo-fab text{font-family:var(--font-d);font-weight:700;font-size:11px;letter-spacing:.14em;fill:var(--cyan)}
.gd-selo-fab .mid{position:absolute;inset:0;display:grid;place-items:center;
  font-family:var(--font-d);font-size:20px;color:#7FB3FF;text-shadow:0 0 12px rgba(56,225,242,.5)}
@keyframes gdGiraInv{to{transform:rotate(-360deg)}}
@media(max-width:560px){.sp-actions{gap:16px}.gd-selo-fab{width:80px;height:80px}}

@media(prefers-reduced-motion:reduce){
  .gd-selo-fab svg{animation:none}
}

/* ============================================================
   R7 · TIPOGRAFIA DA RUA v2 — as skins da Pirata One + a Bungee
   como voz de letreiro + o cursor spray.

   REGRA DE CAMADA (LEI, não reabrir): display NUNCA em preço, corpo,
   formulário ou botão de compra. "A rua assina; a loja vende."
   E continua valendo: 1 assinatura por tela.

   As 4 vozes:
     --font-gt   Pirata One          → a gótica. Skins: chrome (padrão), neon, sticker, spray.
     --font-tag  Sedgwick Ave Disp.  → a tag (assinaturas raras)
     --font-lt   Bungee              → o letreiro (índices, nº de drop, stamps, badges)
     Sora/Inter                      → 100% da transação
   ============================================================ */

/* ---------- skin NEON: vazado + glow cyan (o letreiro da noite) ---------- */
.gt-neon{
  font-family:var(--font-gt);font-weight:400;letter-spacing:.02em;
  color:transparent;-webkit-text-stroke:2px #8FEDF8;
  filter:drop-shadow(0 0 4px rgba(56,225,242,.9)) drop-shadow(0 0 16px rgba(56,225,242,.5))
         drop-shadow(0 0 36px rgba(46,116,255,.38));
}
h1 .gt-neon,h2 .gt-neon{font-size:1.16em;line-height:1}
/* o flicker do tubo ligando — 1×, não em loop (doutrina de movimento) */
.rv.in .gt-neon,.gd-neon-run .gt-neon{animation:gtNeonOn .9s steps(1,jump-start) 1 both}
@keyframes gtNeonOn{0%{opacity:0}18%{opacity:1}26%{opacity:.15}38%{opacity:1}48%{opacity:.35}62%{opacity:1}74%{opacity:.8}100%{opacity:1}}

/* ---------- skin STICKER: die-cut branco, borda grossa, sombra dura ---------- */
/* Resolve a pendência anotada em 08/07: "o chrome do h1 da loja ficou discreto
   no tamanho pequeno". O sticker lê forte em qualquer corpo. */
.gt-sticker{
  font-family:var(--font-gt);font-weight:400;letter-spacing:.02em;
  color:#0B1220;background:#F4F8FF;
  padding:0 .18em .06em;border-radius:4px;
  box-shadow:0 0 0 3px #F4F8FF, 3px 3px 0 3px rgba(4,10,22,.85);
  display:inline-block;transform:rotate(-1.6deg);
  /* o adesivo cresce 3px pra fora (box-shadow), então precisa de respiro dos
     vizinhos — senão o "?" da loja encosta na borda branca. */
  margin:0 .1em;
}
h1 .gt-sticker,h2 .gt-sticker{font-size:1.16em;line-height:1.02}

/* ---------- skin SPRAY: stencil com ruído leve (tinta na parede) ---------- */
.gt-spray{
  font-family:var(--font-gt);font-weight:400;letter-spacing:.03em;
  color:#DCE8FF;
  text-shadow:0 0 1px rgba(220,232,255,.5),0 0 6px rgba(150,190,255,.28);
  -webkit-mask-image:radial-gradient(circle at 18% 24%, transparent 0 .6px, #000 .6px),
                     radial-gradient(circle at 72% 68%, transparent 0 .5px, #000 .5px), linear-gradient(#000,#000);
  -webkit-mask-size:5px 5px, 7px 7px, 100% 100%;
          mask-image:radial-gradient(circle at 18% 24%, transparent 0 .6px, #000 .6px),
                     radial-gradient(circle at 72% 68%, transparent 0 .5px, #000 .5px), linear-gradient(#000,#000);
          mask-size:5px 5px, 7px 7px, 100% 100%;
}
h1 .gt-spray,h2 .gt-spray{font-size:1.16em;line-height:1}

/* ---------- a BUNGEE como voz de letreiro ----------
   Índices das faixas (FX.01…), stamps e badges de rua. A Bungee tem números
   desenhados pra letreiro: legíveis pequenos, com peso. A Pirata One não.
   O chrome (background-clip) continua — só a FONTE muda. */
.fxn{font-family:var(--font-lt);font-size:1.05em;letter-spacing:.02em}
.spc-stamp i{font-family:var(--font-lt);letter-spacing:.06em}

/* ============================================================
   CURSOR SPRAY — só no desktop, só com mouse fino, só sem reduced-motion.
   Um pontinho cyan com rastro curto. Micro, nunca protagonista.
   Não usa cursor:none (perder o cursor real é hostil): o ponto ACOMPANHA.
   ============================================================ */
#gd-spray{position:fixed;left:0;top:0;z-index:9999;pointer-events:none;
  width:10px;height:10px;border-radius:999px;opacity:0;
  background:radial-gradient(closest-side,rgba(180,245,255,.95),rgba(56,225,242,.55) 52%,transparent 78%);
  mix-blend-mode:screen;
  transition:opacity .25s;
  will-change:transform}
#gd-spray.on{opacity:1}
#gd-spray i{position:absolute;inset:0;border-radius:999px;
  background:radial-gradient(closest-side,rgba(56,225,242,.5),transparent 72%);
  transform:scale(2.6);opacity:.5}
/* o rastro: pontos que ficam pra trás e somem */
.gd-spray-dot{position:fixed;z-index:9998;pointer-events:none;width:6px;height:6px;border-radius:999px;
  background:radial-gradient(closest-side,rgba(150,235,255,.8),transparent 76%);
  mix-blend-mode:screen;animation:gdSprayFade .5s ease forwards}
@keyframes gdSprayFade{to{opacity:0;transform:scale(.4)}}

@media(hover:none),(pointer:coarse){#gd-spray,.gd-spray-dot{display:none}}
@media(prefers-reduced-motion:reduce){
  #gd-spray,.gd-spray-dot{display:none}
  .rv.in .gt-neon,.gd-neon-run .gt-neon{animation:none}
  .gt-sticker{transform:none}
}

/* ============================================================
   R8 · "O ATENDENTE" na PDP
   O mascote entra pelo CANTO do palco apresentando o produto. Pose por
   categoria: estética=flanela · peças=chave · drop=óculos (modo ATITUDE).

   LEI: ele NUNCA cobre a foto. O palco claro do multiply é sagrado —
   a foto usa mix-blend-mode:multiply e precisa de fundo claro atrás.
   Por isso o Atendente é ANCORADO NO CANTO, com a base fora do quadro,
   e a foto (padding 40px, object-fit:contain) fica no miolo.

   Colisões vigiadas por _dev/gate-r8-atendente.js:
     · não cobre a foto do produto
     · não cobre o selo do scanner (centrado embaixo)
     · não cobre os stickers (canto inferior esquerdo)
   ============================================================ */
.pdp-atend{
  position:absolute;right:-2%;bottom:0;z-index:2;
  height:42%;width:auto;max-width:none;
  pointer-events:none;user-select:none;
  filter:drop-shadow(0 8px 16px rgba(16,40,80,.18));
  opacity:0;transform:translateX(18px);
  transition:opacity .5s ease,transform .5s cubic-bezier(.2,.8,.3,1);
}
/* ele chega junto com a inspeção: a luz varre, o inspetor aparece, o carimbo bate */
.gd-scan .pdp-atend,.pdp-atend.in{opacity:1;transform:translateX(0)}

/* Faixa 861–1100px: o .pdp ainda é 2 colunas, então o palco fica ESTREITO e o
   Atendente encostava no selo do scanner (medido: 2196px² sobrepostos a 900px).
   Encolhe e recua. Abaixo de 860px o grid vira 1 coluna e o palco alarga de novo. */
@media(max-width:1100px){ .pdp-atend{height:30%;right:-7%} }

/* espiadinha no celular: menor e mais recuado, pra não brigar com o selo */
@media(max-width:860px){ .pdp-atend{height:34%;right:-4%} }
@media(max-width:560px){ .pdp-atend{height:28%;right:-6%;opacity:.92} }
/* abaixo disso o palco é pequeno demais: ele sai de cena */
@media(max-width:380px){ .pdp-atend{display:none} }

@media(prefers-reduced-motion:reduce){
  .pdp-atend{opacity:1;transform:none;transition:none}
}

/* ---------- o sticker die-cut do mascote (o slot já estava aberto) ---------- */
.pst-mascote{width:74px;height:auto;display:block;margin-top:8px;
  transform:rotate(-4deg);filter:drop-shadow(2px 3px 0 rgba(4,10,22,.55))}
@media(max-width:560px){.pst-mascote{width:58px}}

/* ============================================================
   R10 · O BOTÃO DJ — "SOM DA LOJA"
   Mora no canto inferior ESQUERDO: o FAB do zap ocupa a direita e o
   símbolo-porta o centro. Os três nunca se encostam (gate-r10-som.js mede).
   OFF por padrão · opt-in · persiste entre páginas.
   Enquanto a faixa não chega, ele fica em .mudo (dica honesta, não finge).
   ============================================================ */
.gd-dj{
  position:fixed;left:20px;bottom:20px;z-index:120;
  display:flex;align-items:flex-end;gap:8px;overflow:visible;
  padding:8px 16px 8px 8px;border-radius:999px;
  background:rgba(6,12,24,.82);border:1px solid rgba(56,225,242,.34);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  box-shadow:0 8px 24px rgba(2,6,16,.5);
  cursor:pointer;transition:transform .2s,border-color .2s,box-shadow .2s;
}
.gd-dj:hover,.gd-dj:focus-visible{transform:translateY(-2px);border-color:var(--cyan);
  box-shadow:0 12px 30px rgba(2,6,16,.6),0 0 24px rgba(56,225,242,.24)}

/* O DJ SAI DA PÍLULA (Anthony, 13/07: "aumenta ali, e ele ficar girando é feio").
   A 32px o boneco era uma mancha azul — não dava pra ver a headphone nem a mesa
   de som, e a única animação era o corpo INTEIRO rodando 360°: num personagem
   EM PÉ isso lê como bug, não como música. Disco gira; gente não.
   Agora ele tem 62px, planta os pés na pílula e a cabeça VAZA por cima
   (`overflow:visible` + margem negativa) — sticker colado no botão, não ícone. */
.gd-dj img{width:62px;height:62px;object-fit:contain;flex-shrink:0;
  margin:-32px 0 -2px;transform-origin:50% 92%;
  filter:drop-shadow(-3px 6px 9px rgba(0,4,12,.55))}
.gd-dj .dj-tx{display:flex;align-items:center;gap:8px;line-height:1;padding-bottom:1px}
.gd-dj .dj-tx b{font-family:var(--font-lt);font-size:10px;letter-spacing:.06em;color:#DCE8FF}
.gd-dj .dj-st{font-style:normal;font-size:12px;color:var(--cyan)}

/* ligado: a borda acende e ele QUEBRA NO BEAT — cabeceada curta, pivô nos pés */
.gd-dj.on{border-color:var(--cyan);box-shadow:0 8px 24px rgba(2,6,16,.5),0 0 20px rgba(56,225,242,.3)}
.gd-dj.on img{animation:djBeat 1.05s ease-in-out infinite}
@keyframes djBeat{
  0%,100%{transform:translateY(0) rotate(0deg)}
  25%{transform:translateY(-3px) rotate(-2.4deg)}
  50%{transform:translateY(0) rotate(0deg)}
  75%{transform:translateY(-2px) rotate(1.8deg)}
}

/* O EQUALIZADOR é o SINAL de que tem som no ar; o ❚❚ é o CONTROLE. O botão
   mostrava só o controle — que diz "dá pra mexer aqui", não "tá tocando".
   No hover as barras somem e o ❚❚ volta: é aí que a pessoa quer pausar. */
.gd-dj .dj-eq{display:none;align-items:flex-end;gap:2px;height:13px}
.gd-dj.on .dj-eq{display:flex}
.gd-dj.on .dj-st{display:none}
.gd-dj.on:hover .dj-eq,.gd-dj.on:focus-visible .dj-eq{display:none}
.gd-dj.on:hover .dj-st,.gd-dj.on:focus-visible .dj-st{display:block}
.gd-dj .dj-eq span{display:block;width:2.5px;height:100%;
  background:var(--cyan);box-shadow:0 0 6px rgba(56,225,242,.55);
  transform-origin:50% 100%;animation:djEq .62s ease-in-out infinite alternate}
.gd-dj .dj-eq span:nth-child(2){animation-duration:.43s;animation-delay:.09s}
.gd-dj .dj-eq span:nth-child(3){animation-duration:.79s;animation-delay:.21s}
@keyframes djEq{from{transform:scaleY(.28)}to{transform:scaleY(1)}}

/* mudo: a faixa ainda não existe. Conta a verdade em vez de fingir que tocou. */
.gd-dj.mudo{opacity:.72;cursor:default}
.gd-dj.mudo:hover{transform:none}
.gd-dj.mudo .dj-tx b::after{content:" · faixa a caminho";color:var(--ink-3);font-weight:400}

/* no celular: só o boneco + o sinal (o rótulo comeria a tela). Ele encolhe pra
   48px — grande o bastante pra ainda ser o DJ, pequeno o bastante pra não virar
   um outdoor em cima do conteúdo. */
@media(max-width:640px){
  .gd-dj{left:12px;bottom:12px;padding:8px 12px 8px 8px;gap:8px}
  .gd-dj img{width:48px;height:48px;margin:-24px 0 -2px}
  .gd-dj .dj-tx b{display:none}
  .gd-dj.mudo .dj-tx b{display:none}
}
/* a PDP tem barra de compra fixa embaixo: o DJ sobe pra não brigar com ela —
   mas só QUANDO ela existe (body.bs-on · Trilho M). Estático, ele flutuava no
   meio do conteúdo cobrindo o preço antes de a barra aparecer. */
@media(max-width:860px){
  body[data-page="produto"].bs-on .gd-dj{bottom:calc(84px + env(safe-area-inset-bottom))}
}

@media(prefers-reduced-motion:reduce){
  .gd-dj.on img{animation:none}
  .gd-dj .dj-eq span{animation:none;transform:scaleY(.7)}
  .gd-dj:hover{transform:none}
}

/* ============================================================
   TRILHO G · O DECRETO TIPOGRÁFICO (G1 · 10/07/2026)

   O pedido do Renan: "quero a fonte descolada (a do 'showroom') no site
   inteiro". A tradução honesta: quando ele bate o olho em qualquer tela,
   a letra que ele vê é a da rua. O que ele NÃO pediu (e destruiria a loja)
   é preço, botão e formulário em gótica.

   Por isso a rua sobe UMA CAMADA, não some com a régua:
     · Pirata One  (--font-gt)  → os TÍTULOS
     · Sedgwick    (--font-tag) → as SUBLINHAS (a anotação de quem pichou ao lado)
     · Bungee      (--font-lt)  → o LETREIRO (índices, números, rótulos de coluna)
     · Sora/Inter               → corpo, preço, form, botão de compra. INEGOCIÁVEL.

   Este bloco é uma CAMADA DE DOSAGEM, escopada em `html.st-a` / `html.st-b`,
   pra rodar o lab `lab-tipografia.html` (o Renan escolhe vendo, no celular).
   A escolha vira uma classe fixa no <html> das 14 páginas, na G2 — nenhuma
   linha daqui muda. `?tipo=a|b` liga a dosagem em qualquer página.

   ⚠️ O h1 do hero da HOME fica FORA das duas dosagens de propósito: ele já é
   a peça de referência (o "showroom" em chrome + a tag em Sedgwick), afinado
   px a px na R5 — a coluna precisa de 580px pra gótica não quebrar. Mexer ali
   é reabrir o hero, não aplicar tipografia.

   COMPENSAÇÃO DE CORPO: a Pirata One tem altura-x baixa — no mesmo font-size
   ela LÊ ~16% menor que a Sora. Todo título que troca de voz sobe um degrau
   da régua junto (24→30, 44→56). Não é gosto: é a mesma mancha de texto.
   ============================================================ */

/* ---------- DOSAGEM A · a rua toma os TÍTULOS ---------- */
/* Títulos de seção e das páginas internas viram gótica em chrome fosco (o mesmo
   metal do "showroom", sem o glow duplo do `.gt-chrome` — 7 títulos com dois
   drop-shadows por tela custa pintura à toa e vira brilho de bijuteria). */
/* ⚠️ São QUATRO classes de hero, não uma: `.page-hero` (sobre, contato),
   `.legal-hero` (faq + as 3 páginas de política), `.shop-hero` (loja) e
   `.blog-hero` (blog, estilizado no <style> da própria página). Escopar só em
   `.page-hero` deixava METADE do site em Sora — e o furo só apareceu quando eu
   olhei o screenshot do FAQ. */
html.st-a .sec-head h2,
html.st-b .sec-head h2,
html.st-a .page-hero h1,
html.st-b .page-hero h1,
html.st-a .legal-hero h1,
html.st-b .legal-hero h1,
html.st-a .shop-hero h1,
html.st-b .shop-hero h1,
html.st-a .blog-hero h1,
html.st-b .blog-hero h1{
  font-family:var(--font-gt);font-weight:400;
  letter-spacing:.02em;line-height:1.06;
  /* A JOGADA DE COR (pedido do Renan, 10/07 noite): "tem que ter branco e azul,
     como o hero". O gradiente prata monocromático (showroom metal) virou um
     gradiente DIAGONAL branco → azul elétrico: cada título nasce branco e termina
     azul, sem precisar marcar palavra por palavra. Em título de 2 linhas a de
     cima lê branca e a de baixo azul — a cara do hero. */
  background:linear-gradient(114deg,#FFFFFF 0%,#EAF1FF 30%,#6FA2FF 66%,#2E74FF 98%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.4));
}
html.st-a .sec-head h2,html.st-b .sec-head h2{font-size:clamp(30px,4.4vw,56px)}
html.st-a .page-hero h1,html.st-b .page-hero h1{font-size:clamp(36px,5.6vw,72px)}
/* os heroes menores sobem UM degrau (44→56), não dois: 72px de gótica num
   título de política de troca é grito, não voz. */
html.st-a .legal-hero h1,html.st-b .legal-hero h1,
html.st-a .shop-hero h1,html.st-b .shop-hero h1,
html.st-a .blog-hero h1,html.st-b .blog-hero h1{font-size:clamp(30px,4.4vw,56px)}
/* o `em` de qualquer título é o realce AZUL FORTE (o "sai do teu carrinho" do
   hero). O gradiente do pai clipa à posição do em; forçar o fill garante o azul
   cheio + glow onde quer que a palavra esteja na frase. */
html.st-a .sec-head h2 em,html.st-b .sec-head h2 em,
html.st-a .page-hero h1 em,html.st-b .page-hero h1 em,
html.st-a .legal-hero h1 em,html.st-b .legal-hero h1 em,
html.st-a .shop-hero h1 em,html.st-b .shop-hero h1 em,
html.st-a .blog-hero h1 em,html.st-b .blog-hero h1 em{
  -webkit-text-fill-color:#5B90FF;color:#5B90FF;
  filter:drop-shadow(0 0 14px rgba(46,116,255,.45))}
/* V2b (16/07) · o card da Jaça fala a MESMA voz do FX.04: o h2 do .spotlight
   entra na dosagem (era a exceção que tinha sobrado em Sora). Pedido do Anthony:
   título na fonte da seção; SÓ a palavra "Jaça" — a marca — na fonte do GTA. */
html.st-a .spotlight h2,html.st-b .spotlight h2{
  font-family:var(--font-gt);font-weight:400;letter-spacing:.02em;line-height:1.06;
  font-size:clamp(30px,4.4vw,56px);
  background:linear-gradient(114deg,#FFFFFF 0%,#EAF1FF 30%,#6FA2FF 66%,#2E74FF 98%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 0 rgba(0,0,0,.4))}
html.st-a .spotlight h2 em,html.st-b .spotlight h2 em{
  -webkit-text-fill-color:#5B90FF;color:#5B90FF;
  filter:drop-shadow(0 0 14px rgba(46,116,255,.45))}

/* uma gótica com skin própria dentro do título (a `.gt-sticker` do h1 da loja,
   o `.gt-chrome` do hero) manda no seu próprio pedaço — não herda o gradiente */
html.st-a h1 .gt-sticker,html.st-b h1 .gt-sticker,
html.st-a h2 .gt-sticker,html.st-b h2 .gt-sticker{-webkit-text-fill-color:#0B1220;font-size:1em}
html.st-a h1 .gt-chrome,html.st-b h1 .gt-chrome,
html.st-a h2 .gt-chrome,html.st-b h2 .gt-chrome,
html.st-a h1 .gt-neon,html.st-b h1 .gt-neon,
html.st-a h2 .gt-neon,html.st-b h2 .gt-neon{font-size:1em}

/* ---------- DOSAGEM B · a rua toma TUDO que não vende ---------- */
/* B = A + as vozes secundárias entram. É o teto: daqui pra frente só sobraria
   invadir preço/form/botão — e aí a loja para de vender. */

/* a sublinha vira anotação de spray ao lado do título (deixa de ser rótulo
   uppercase espaçado e vira caligrafia). Escopo em `.sec-head` de propósito:
   pega TODA sublinha de seção e nenhuma dos heroes — onde a eyebrow não é
   rótulo, é a pílula do DROP (um objeto). Assim não preciso de `:not()` com
   seletor complexo, que ainda quebra em WebView velho de celular. */
html.st-b .sec-head .eyebrow{
  font-family:var(--font-tag);font-weight:400;
  text-transform:none;letter-spacing:0;font-size:20px;
  color:var(--cyan);text-shadow:0 0 16px rgba(56,225,242,.3)}
html.st-b .sec-head .eyebrow::before{background:var(--cyan)}

/* o letreiro: rótulo de coluna do rodapé e categoria do FAQ */
html.st-b .foot-col h4,
html.st-b .faq-cat{font-family:var(--font-lt);font-weight:400;letter-spacing:.06em}
html.st-b .foot-col h4{font-size:14px}

/* as perguntas do FAQ e os títulos dos posts do blog são conteúdo de LEITURA —
   entram na rua, mas em Pirata clara (sem chrome) e um degrau maior, senão
   viram enfeite ilegível no celular. */
html.st-b .faq-item summary,
html.st-b .post-card h2,
html.st-b .gd-rota .rota-head h3{
  font-family:var(--font-gt);font-weight:400;letter-spacing:.02em;
  color:#E7EEFB;line-height:1.1}
html.st-b .faq-item summary{font-size:20px}
html.st-b .gd-rota .rota-head h3{font-size:clamp(24px,3.2vw,30px)}

/* a citação do institucional: a rua fala na primeira pessoa */
html.st-b .story .quote{font-family:var(--font-tag);font-weight:400;
  letter-spacing:0;line-height:1.25;color:#E7EEFB}

/* ---------- A LEI (vale nas duas dosagens, nunca reabrir) ----------
   "A rua assina; a loja vende." Se um seletor acima algum dia encostar
   nestes, o site perde dinheiro. Isto aqui é o cinto de segurança. */
html.st-a .price,html.st-b .price,
html.st-a .price b,html.st-b .price b,
html.st-a .btn,html.st-b .btn,
html.st-a input,html.st-b input,
html.st-a select,html.st-b select,
html.st-a textarea,html.st-b textarea,
html.st-a label,html.st-b label,
html.st-a .card-prod .name,html.st-b .card-prod .name,
html.st-a .sec-head p,html.st-b .sec-head p{
  font-family:var(--font-b);letter-spacing:normal}
html.st-a .price b,html.st-b .price b{font-family:var(--font-d)}

/* ============================================================
   TRILHO G · O MURO CONTÍNUO (G2 · 10/07/2026)

   A tese da rodada: a home é UMA RUA. O scroll é você descendo a 01 à noite,
   passando por uma empena contínua. Cada seção é um ponto da caminhada.

   Duas camadas, e a diferença entre elas é o que separa "site com textura" de
   "site que é a rua":

   1. O MURO BASE — a MESMA parede em todas as seções, mas a que DISTÂNCIA você
      está dela muda. Longe: a textura fica miúda e escura. Colado: ela cresce e
      clareia um tico. É isso que dá profundidade. Só alternar a opacidade do
      mesmo grafite inteiro leria como papel de parede na segunda tela.

   2. A PEÇA — um grafite autoral por seção, todos da mesma crew. Os geométricos
      (setas, régua, stencil, estrelas) são SVG desenhado aqui: o site desenha
      melhor, e eles precisam nascer alinhados com os cards em qualquer largura.
      Os orgânicos (throw-up, monstro, Audi, autorretrato) são arte de fora e
      entram por SLOT — ver `GD_PICHOS` no components.js.

   MATERIAL: a peça é pintada NO muro, nunca colada por cima. Por isso tudo aqui
   entra com blend de LUZ (`screen` / `plus-lighter`): a tinta clareia o concreto
   onde encosta, como spray de verdade. `opacity` sozinha daria adesivo.

   PESO: `muro-tex.webp` = 70KB (o jpg original tem 315KB e vive no menu/sobre,
   onde aparece grande e nítido). Aqui ele nunca passa de 12% de opacidade —
   detalhe é desperdício de banda. Uma requisição serve as 6 seções.
   ============================================================ */

[data-muro]{position:relative;overflow:hidden}
[data-muro] > .wrap{position:relative;z-index:1}

.gd-muro{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;
  /* padrões: --mz distância (maior = mais perto) · --mp o trecho da parede · --mo a luz que bate nela */
  --mz:124%; --mp:50% 40%; --mo:.09}
.gd-muro .tex{position:absolute;inset:0;
  background:url('../img/muro-tex.webp') var(--mp) / var(--mz) no-repeat;
  opacity:var(--mo);filter:grayscale(.4) contrast(1.06) brightness(.85)}
/* o concreto some nas emendas: sem isso as seções viram tijolos empilhados,
   e a rua deixa de ser contínua */
.gd-muro .scrim{position:absolute;inset:0;background:
  linear-gradient(180deg,var(--bg) 0%,transparent 18%,transparent 82%,var(--bg) 100%)}

/* --- a caminhada: longe, perto, longe, perto… --- */
[data-muro="FX.01"] .gd-muro{--mz:112%;--mp:50% 8%;--mo:.06}   /* a parede lá no fundo do showroom */
[data-muro="FX.02"] .gd-muro{--mz:150%;--mp:18% 62%;--mo:.10}  /* você encostou nela */
[data-muro="FX.03"] .gd-muro{--mz:118%;--mp:78% 30%;--mo:.07}  /* afastou pra ler o cartaz */
[data-muro="FX.03B"] .gd-muro{--mz:138%;--mp:56% 22%;--mo:.09} /* parou na frente da caixa da fábrica */
[data-muro="FX.04"] .gd-muro{--mz:164%;--mp:36% 74%;--mo:.11}  /* colado: é o box, a luz da CAM bate */
[data-muro="FX.05"] .gd-muro{--mz:106%;--mp:62% 20%;--mo:.05}  /* o depósito é fundo, o aço manda */
[data-muro="FX.06"] .gd-muro{--mz:142%;--mp:8% 50%;--mo:.09}   /* o mural dos recados, à mão */
/* G8 · a LOJA é outra parada da mesma rua: a parede do galpão onde a prateleira
   está montada. Quem manda no catálogo são os nichos acesos; o muro é o ar entre
   eles, não o herói.
   ⚠️ DUAS ARMADILHAS QUE SÓ ESTA SEÇÃO TEM (e que as da home não têm):
   1. A seção do catálogo é ALTA e ESTREITA (16 cards ≈ 1700px de altura). A foto
      do muro é 16:9 e entra `no-repeat`: em qualquer zoom que caiba na largura,
      ela ACABA no meio da página e deixa uma emenda seca no escuro. Por isso o
      `mask` — a parede dissolve pro breu antes de acabar, e a emenda morre.
   2. Nesse enquadramento o "A 01 DO LITORAL" pichado NA FOTO aparece em pedaços
      atrás dos cards. Pego o TOPO da parede (`--mp` com Y baixo): concreto, sem
      letra picada. A pichação que tem que ler no catálogo é a da CATEGORIA. */
[data-muro="LJ.01"] .gd-muro{--mz:190%;--mp:50% 2%;--mo:.09}
[data-muro="LJ.01"] .gd-muro .tex{
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 34%,transparent 78%);
          mask-image:linear-gradient(180deg,#000 0%,#000 34%,transparent 78%)}

/* V4/V5 (16/07) · A EMPRESA e o CONTATO entram na mesma rua: as 4 seções finais
   do sobre eram um fundo chapado só ("tudo junto"), e o contato não tinha parede
   nenhuma. Cada parada ganha o seu trecho do muro — crops distintos = a caminhada
   continua fora da home.
   ⚠️ A ARMADILHA DA LJ.01 VALE PRA TODOS: a foto-mãe é dominada pelo "A 01 DO
   LITORAL" — crop desavisado põe letra GIGANTE picada atrás do conteúdo (visto
   no 1º screenshot do sobre, 16/07). Por isso todos apontam pro TOPO de
   concreto (Y 6–10%) e dissolvem por máscara antes da letra entrar. */
[data-muro="EMP.02"] .gd-muro{--mz:150%;--mp:36% 6%;--mo:.10}   /* a exclusividade: colado na parede */
[data-muro="EMP.03"] .gd-muro{--mz:140%;--mp:56% 8%;--mo:.08}   /* o "porquê": recuo pra ler */
[data-muro="CT.01"] .gd-muro{--mz:136%;--mp:30% 6%;--mo:.09}    /* contato: a calçada da loja */
[data-muro="CT.02"] .gd-muro{--mz:158%;--mp:46% 8%;--mo:.10}    /* o formulário: perto do balcão */
[data-muro="CT.03"] .gd-muro{--mz:120%;--mp:60% 6%;--mo:.07}    /* as unidades: recuo com as fachadas */
[data-muro="EMP.02"] .gd-muro .tex,[data-muro="EMP.03"] .gd-muro .tex,
[data-muro="CT.01"] .gd-muro .tex,[data-muro="CT.02"] .gd-muro .tex,
[data-muro="CT.03"] .gd-muro .tex{
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 38%,transparent 82%);
          mask-image:linear-gradient(180deg,#000 0%,#000 38%,transparent 82%)}
/* V7 (16/07) · o "Leve junto" da PDP: fundo mais escuro que a página (pedido:
   "ficaria legal mesmo mais escuro") + o seu trecho de muro. O palco do produto
   é o holofote; a vitrine dos relacionados é a parede de trás. */
/* o "leve junto" senta no PISO DE LED da foto: âncora no RODAPÉ (Y 100%) e a
   máscara apaga o topo — as letras da tag morrem antes do título, e o LED azul
   surge atrás dos cards */
[data-muro="PD.02"] .gd-muro{--mz:172%;--mp:50% 100%;--mo:.12}
[data-muro="PD.02"] .gd-muro .tex{
  -webkit-mask-image:linear-gradient(180deg,transparent 0%,transparent 30%,#000 72%);
          mask-image:linear-gradient(180deg,transparent 0%,transparent 30%,#000 72%)}
/* V8 (16/07) · o BLOG entrou na rua: hub (BL.01) e artigos (BL.02) */
[data-muro="BL.01"] .gd-muro{--mz:144%;--mp:56% 44%;--mo:.10}
[data-muro="BL.02"] .gd-muro{--mz:128%;--mp:34% 28%;--mo:.08}
.pdp-rel.sec-alt{background:linear-gradient(180deg,#05080F 0%,#04060C 100%);
  border-top:1px solid rgba(255,255,255,.06)}

/* D9 (06/08) · A BARRA DE FILTROS DA LOJA + A PAREDE DE MARCAS
   ─────────────────────────────────────────────────────────────────────────────
   Substitui o balcão da V6b, que era um toggle "Marcas (41) ▾" solto na toolbar.
   Com 1.107 produtos a loja precisava de busca, ordem, preço e tamanho também —
   e quatro fileiras de chip empilhadas matariam o celular (~80% do tráfego).
   Por isso: DUAS linhas fixas (busca+ordem · três abas) e UM painel por vez. */
.goal-sub{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin:calc(-1*var(--sp-2)) 0 var(--sp-5)}
.goal-sub[hidden]{display:none}
.goal-sub .chip-f.gs{font-size:var(--fs-xs)}
.goal-sub .chip-f.gs i{font-style:normal;opacity:.6;margin-left:var(--sp-1)}

.shop-filtros{margin:0 0 var(--sp-5)}
.sf-topo{display:flex;gap:var(--sp-2);align-items:stretch;margin-bottom:var(--sp-2)}
.sf-busca{position:relative;flex:1;min-width:0;display:flex;align-items:center}
.sf-busca svg{position:absolute;left:var(--sp-3);width:16px;height:16px;color:var(--ink-3);pointer-events:none}
.sf-busca input{width:100%;height:44px;padding:0 var(--sp-10) 0 var(--sp-8);
  border:1px solid var(--border);border-radius:var(--r-full);background:var(--surface-2);
  color:var(--ink);font-size:var(--fs-sm);font-weight:500;font-family:inherit}
.sf-busca input::placeholder{color:var(--ink-3)}
.sf-busca input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(14,90,230,.18)}
.sf-busca input::-webkit-search-cancel-button{display:none}
.sf-qx{position:absolute;right:var(--sp-2);width:28px;height:28px;border:0;border-radius:var(--r-full);
  background:transparent;color:var(--ink-3);font-size:var(--fs-lg);line-height:1;cursor:pointer}
.sf-qx:hover{color:var(--ink);background:rgba(120,140,175,.14)}
.sf-ordem{display:flex;align-items:center;gap:var(--sp-2);flex:none}
.sf-ordem > span{font-size:var(--fs-xs);color:var(--ink-3);white-space:nowrap}
.sf-sel{height:44px;padding:0 var(--sp-3);border:1px solid var(--border);border-radius:var(--r-full);
  background:var(--surface-2);color:var(--ink-2);font-size:var(--fs-sm);font-weight:600;
  font-family:inherit;cursor:pointer;max-width:180px}
.sf-sel:focus{outline:none;border-color:var(--accent)}

.sf-abas{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.sf-aba{display:inline-flex;align-items:center;gap:var(--sp-1);height:38px;padding:0 var(--sp-4);
  border:1px solid var(--border);border-radius:var(--r-full);background:var(--surface-2);
  color:var(--ink-2);font-size:var(--fs-sm);font-weight:600;font-family:inherit;cursor:pointer;
  transition:border-color .15s ease,color .15s ease}
.sf-aba[hidden]{display:none}
.sf-aba i{font-style:normal;font-size:var(--fs-3xs);opacity:.7}
.sf-aba:hover{border-color:var(--accent);color:var(--accent)}
.sf-aba.open{border-color:var(--cyan);color:var(--cyan)}
.sf-aba.on{background:var(--accent);border-color:var(--accent);color:#fff}
.sf-aba.on.open{background:var(--accent);border-color:var(--cyan);color:#fff}
.sf-limpar{border-style:dashed;color:var(--ink-3)}

.sf-painel{margin-top:var(--sp-2);padding:var(--sp-4);border-radius:var(--r-lg);
  background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.10)}
.sf-painel[hidden]{display:none}
.sf-chips{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.sf-chips .chip-f i{font-style:normal;opacity:.6;margin-left:var(--sp-1)}
.sf-chips .chip-f[disabled]{opacity:.35;cursor:not-allowed}
.sf-chips .chip-f[disabled]:hover{border-color:var(--border);color:var(--ink-2)}
.sf-nota{margin:var(--sp-3) 0 0;font-size:var(--fs-2xs);color:var(--ink-3);line-height:1.5;max-width:60ch}

/* o resumo do que está ligado — sem isto o filtro empilhado vira armadilha */
.sf-ativos{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center;margin-top:var(--sp-3)}
.sf-ativos[hidden]{display:none}
.sfa-lbl{font-size:var(--fs-2xs);color:var(--ink-3);text-transform:uppercase;letter-spacing:.08em}
.sfa{display:inline-flex;align-items:center;gap:var(--sp-2);height:28px;padding:0 var(--sp-3);
  border:1px solid rgba(56,225,242,.35);border-radius:var(--r-full);background:rgba(56,225,242,.08);
  color:var(--cyan);font-size:var(--fs-xs);font-weight:600;font-family:inherit;cursor:pointer}
.sfa i{font-style:normal;font-size:var(--fs-sm);line-height:1;opacity:.8}
.sfa:hover{border-color:var(--cyan);background:rgba(56,225,242,.16)}
.sfa-zero{border-style:dashed;border-color:var(--border);background:transparent;color:var(--ink-3)}
.sfa-zero:hover{color:var(--ink);border-color:var(--ink-3);background:transparent}

/* A PAREDE DE MARCAS — mesmo sticker die-cut da fileira da home (T4·H1-A):
   base branca de adesivo, logo real quando existe, wordmark honesto quando não.
   Multi-seleção, porque é assim que se compra ("Vonixx e Kers"). */
.bw-topo{display:flex;gap:var(--sp-2);align-items:center;margin-bottom:var(--sp-4);flex-wrap:wrap}
.bw-busca{flex:1;min-width:180px}
.bw-busca input{height:38px;padding-right:var(--sp-4)}
.bw-grid{display:flex;flex-wrap:wrap;gap:var(--sp-3) var(--sp-2)}
.bw-i{--rot:-1.4deg;position:relative;display:flex;flex-direction:column;align-items:center;gap:var(--sp-1);
  padding:0;border:0;background:transparent;cursor:pointer;font-family:inherit;
  transform:rotate(var(--rot));transition:transform .18s ease}
.bw-i:nth-child(2n){--rot:1.2deg}
.bw-i:nth-child(3n){--rot:-.7deg}
.bw-i:nth-child(5n){--rot:1.8deg}
.bw-selo{display:inline-flex;align-items:center;justify-content:center;min-height:44px;min-width:76px;
  padding:var(--sp-2) var(--sp-4);border-radius:var(--r-sm);
  background:linear-gradient(172deg,#FDFEFF,#EDF1F8);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 4px 10px rgba(2,8,20,.45);
  transition:box-shadow .18s ease,outline-color .18s ease;outline:2px solid transparent;outline-offset:2px}
.bw-selo img{display:block;height:var(--lh,24px);width:auto;max-width:104px;object-fit:contain}
.bw-selo b{font-family:var(--font-d);font-weight:800;font-size:var(--fs-xs);letter-spacing:.06em;color:#0B1626}
.bw-n{font-size:var(--fs-3xs);color:var(--ink-3);letter-spacing:.02em}
.bw-i:hover{transform:rotate(var(--rot)) translateY(-3px) scale(1.04)}
.bw-i.on .bw-selo{outline-color:var(--cyan);box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 6px 16px rgba(56,225,242,.4)}
/* a marca escolhida não pode perder o rim da placa de aço (ver `.selo-escuro`,
   na altura da fileira de stickers): sem ele o die-cut some no painel escuro */
.bw-i.on .bw-selo.selo-escuro{box-shadow:inset 0 0 0 1px rgba(255,255,255,.2),inset 0 1px 0 rgba(255,255,255,.28),0 6px 16px rgba(56,225,242,.4)}
.bw-i.on .bw-n{color:var(--cyan);font-weight:700}
.bw-i.off{opacity:.5}
.bw-i.off .bw-selo{filter:grayscale(1)}
.bw-i.off:hover{opacity:.85}
.bw-balcao{margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:1px solid rgba(255,255,255,.10)}
.bw-tit{display:block;margin-bottom:var(--sp-3);font-size:var(--fs-2xs);color:var(--ink-3);
  text-transform:uppercase;letter-spacing:.08em}
.bw-grid.mini .bw-selo{min-height:36px;min-width:64px;padding:var(--sp-1) var(--sp-3)}
.bw-grid.mini .bw-selo img{height:calc(var(--lh,24px)*.8);max-width:84px}
.bw-zap{display:inline-block;margin-top:var(--sp-4);font-size:var(--fs-xs);color:var(--cyan);
  text-decoration:none;font-weight:600}
.bw-zap:hover{text-decoration:underline}

/* o vazio da grade ganhou dois caminhos: desfazer o filtro OU perguntar */
.es-acoes{display:flex;gap:var(--sp-2);flex-wrap:wrap;justify-content:center;margin-top:var(--sp-4)}

@media(max-width:560px){
  .sf-topo{flex-wrap:wrap}
  .sf-ordem{flex:1;justify-content:space-between}
  .sf-ordem > span{display:none}
  .sf-sel{flex:1;max-width:none}
  .sf-busca{flex:1 1 100%}
  .sf-painel{padding:var(--sp-3)}
  .bw-topo{gap:var(--sp-2)}
}

/* V6a (16/07) · a PORTA da loja: o shop-hero era gradiente chapado — agora é o
   primeiro trecho de parede de quem entra pra comprar */
[data-muro="LJ.00"] .gd-muro{--mz:132%;--mp:50% 6%;--mo:.08}
[data-muro="LJ.00"] .gd-muro .tex{
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 42%,transparent 88%);
          mask-image:linear-gradient(180deg,#000 0%,#000 42%,transparent 88%)}

/* FX.01 tem o PISO DE LED embaixo: o muro tem que morrer antes de encostar nele,
   senão a parede "deita" no chão e a perspectiva quebra. */
[data-muro="FX.01"] .gd-muro .tex{
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 34%,transparent 72%);
          mask-image:linear-gradient(180deg,#000 0%,#000 34%,transparent 72%)}

/* ⚠️ O CELULAR É O SITE (≈80% do tráfego). Numa tela de 390px, `--mz:150%` dá
   585px de foto: o crop cai num trecho liso do muro e a parede SOME — exatamente
   onde ela mais precisa aparecer. No celular a gente chega mais perto da parede
   (zoom maior) e acende um pouco mais a luz. Descoberto olhando o screenshot,
   não o CSS. */
@media(max-width:820px){
  .gd-muro{--mz:280%;--mo:.13}
  [data-muro="FX.01"] .gd-muro{--mz:240%;--mp:50% 10%;--mo:.09}
  [data-muro="FX.02"] .gd-muro{--mz:300%;--mp:20% 58%;--mo:.14}
  [data-muro="FX.03"] .gd-muro{--mz:260%;--mp:74% 32%;--mo:.11}
  [data-muro="FX.03B"] .gd-muro{--mz:300%;--mp:54% 20%;--mo:.12}
  [data-muro="FX.04"] .gd-muro{--mz:320%;--mp:38% 70%;--mo:.15}
  [data-muro="FX.05"] .gd-muro{--mz:230%;--mp:60% 22%;--mo:.07}
  [data-muro="FX.06"] .gd-muro{--mz:290%;--mp:10% 48%;--mo:.13}
  [data-muro="LJ.01"] .gd-muro{--mz:300%;--mp:50% 1%;--mo:.11}
  /* V4/V5/V6a (16/07) · as paradas novas seguem a doutrina (mais perto + mais
     luz) — e a MESMA regra anti-letra do desktop: topo de concreto, nunca o
     miolo da tag (a 300% uma letra picada vira parede inteira). */
  [data-muro="EMP.02"] .gd-muro{--mz:300%;--mp:34% 8%;--mo:.14}
  [data-muro="EMP.03"] .gd-muro{--mz:280%;--mp:56% 10%;--mo:.12}
  [data-muro="CT.01"] .gd-muro{--mz:280%;--mp:30% 8%;--mo:.13}
  [data-muro="CT.02"] .gd-muro{--mz:310%;--mp:46% 10%;--mo:.14}
  [data-muro="CT.03"] .gd-muro{--mz:260%;--mp:60% 8%;--mo:.11}
  [data-muro="LJ.00"] .gd-muro{--mz:280%;--mp:50% 8%;--mo:.12}
  [data-muro="PD.02"] .gd-muro{--mz:330%;--mp:50% 100%;--mo:.15}
  [data-muro="BL.01"] .gd-muro{--mz:290%;--mp:58% 40%;--mo:.13}
  [data-muro="BL.02"] .gd-muro{--mz:300%;--mp:36% 30%;--mo:.13}
}

/* ============================================================
   V9 (18/07) · OS MURAIS CHEGARAM — cada família de seção tem a própria parede.
   Gerados do `identidade/briefing-muros-secoes.md` (masters: identidade/muro-*.png):
     loja = o "01" com a zebra · estética = a espuma · pesado = a chapa/chevron ·
     contato = o aperto de mão · blog = os cartazes rasgados · empresa = o 2005.
   As artes já nascem na paleta da casa: o grayscale cai (.4→.15) e a opacidade
   sobe um degrau — elas foram FEITAS pra aparecer. Os crops apontam pro motivo
   central de cada uma (sem letra fina, a regra anti-letra virou só o fade).
   Este bloco vive DEPOIS do @media dos crops antigos de propósito: ele é a
   palavra final dos slots que ganharam arte, em desktop E mobile.
   ============================================================ */
[data-muro="LJ.00"] .gd-muro .tex,[data-muro="LJ.01"] .gd-muro .tex{
  background-image:url('../img/muro-loja.webp')}
[data-muro="FX.02"] .gd-muro .tex,[data-muro="PD.02"] .gd-muro .tex{
  background-image:url('../img/muro-estetica.webp')}
[data-muro="FX.05"] .gd-muro .tex{background-image:url('../img/muro-pesado.webp')}
[data-muro="CT.01"] .gd-muro .tex,[data-muro="CT.02"] .gd-muro .tex,
[data-muro="CT.03"] .gd-muro .tex{background-image:url('../img/muro-contato.webp')}
[data-muro="BL.01"] .gd-muro .tex,[data-muro="BL.02"] .gd-muro .tex{
  background-image:url('../img/muro-blog.webp')}
[data-muro="EMP.02"] .gd-muro .tex,[data-muro="EMP.03"] .gd-muro .tex{
  background-image:url('../img/muro-empresa.webp')}
[data-muro="LJ.00"] .gd-muro .tex,[data-muro="LJ.01"] .gd-muro .tex,
[data-muro="FX.02"] .gd-muro .tex,[data-muro="PD.02"] .gd-muro .tex,
[data-muro="FX.05"] .gd-muro .tex,
[data-muro="CT.01"] .gd-muro .tex,[data-muro="CT.02"] .gd-muro .tex,
[data-muro="CT.03"] .gd-muro .tex,
[data-muro="BL.01"] .gd-muro .tex,[data-muro="BL.02"] .gd-muro .tex,
[data-muro="EMP.02"] .gd-muro .tex,[data-muro="EMP.03"] .gd-muro .tex{
  filter:grayscale(.15) contrast(1.04) brightness(.9)}

/* os crops (desktop): o motivo central de cada arte no lugar certo do slot */
/* position-X BAIXO empurra a imagem pra DIREITA: o 01 sai de trás do texto e
   ocupa a área vazia à direita do hero (calibrado no screenshot de 18/07) */
[data-muro="LJ.00"] .gd-muro{--mz:125%;--mp:24% 30%;--mo:.20}   /* o 01 na área vazia à direita */
[data-muro="LJ.01"] .gd-muro{--mz:190%;--mp:50% 12%;--mo:.11}   /* o topo do 01 atrás da prateleira */
[data-muro="FX.02"] .gd-muro{--mz:140%;--mp:50% 14%;--mo:.16}   /* a espuma acima dos cards */
[data-muro="PD.02"] .gd-muro{--mz:172%;--mp:50% 100%;--mo:.14}  /* o chão de LED da arte */
[data-muro="FX.05"] .gd-muro{--mz:125%;--mp:50% 30%;--mo:.10}   /* a chapa/chevron no lado pesado */
[data-muro="CT.01"] .gd-muro{--mz:135%;--mp:50% 30%;--mo:.14}   /* o aperto de mão no hero */
[data-muro="CT.02"] .gd-muro{--mz:170%;--mp:12% 45%;--mo:.12}   /* a seta, perto do formulário */
[data-muro="CT.03"] .gd-muro{--mz:150%;--mp:88% 40%;--mo:.11}   /* o coração/setas nas unidades */
[data-muro="BL.01"] .gd-muro{--mz:135%;--mp:50% 60%;--mo:.13}   /* o cartaz mais baixo (não clareia o h1) */
[data-muro="BL.02"] .gd-muro{--mz:140%;--mp:30% 30%;--mo:.10}
[data-muro="EMP.02"] .gd-muro{--mz:150%;--mp:50% 30%;--mo:.16}  /* o 2005 atrás da exclusividade */
[data-muro="EMP.03"] .gd-muro{--mz:130%;--mp:24% 45%;--mo:.10}

/* mobile: a doutrina de sempre — mais perto e um tico mais aceso */
@media(max-width:820px){
  [data-muro="LJ.00"] .gd-muro{--mz:250%;--mp:30% 28%;--mo:.20}
  [data-muro="LJ.01"] .gd-muro{--mz:300%;--mp:50% 10%;--mo:.13}
  [data-muro="FX.02"] .gd-muro{--mz:260%;--mp:50% 12%;--mo:.17}
  [data-muro="PD.02"] .gd-muro{--mz:330%;--mp:50% 100%;--mo:.16}
  [data-muro="FX.05"] .gd-muro{--mz:240%;--mp:50% 30%;--mo:.12}
  [data-muro="CT.01"] .gd-muro{--mz:270%;--mp:50% 28%;--mo:.15}
  [data-muro="CT.02"] .gd-muro{--mz:320%;--mp:14% 42%;--mo:.13}
  [data-muro="CT.03"] .gd-muro{--mz:280%;--mp:86% 38%;--mo:.12}
  [data-muro="BL.01"] .gd-muro{--mz:270%;--mp:50% 58%;--mo:.14}
  [data-muro="BL.02"] .gd-muro{--mz:280%;--mp:32% 28%;--mo:.11}
  [data-muro="EMP.02"] .gd-muro{--mz:290%;--mp:50% 28%;--mo:.15}
  [data-muro="EMP.03"] .gd-muro{--mz:260%;--mp:26% 42%;--mo:.12}
}

/* --- A PEÇA: o slot da arte orgânica (só entra quando o PNG existe) --- */
.gd-pico{position:absolute;pointer-events:none;
  mix-blend-mode:screen;                    /* tinta clara CLAREIA o concreto */
  opacity:0;transition:opacity .8s ease}
.gd-muro.in .gd-pico{opacity:var(--po,.5)}
@media(prefers-reduced-motion:reduce){.gd-pico{transition:none;opacity:var(--po,.5)}}

/* Posições CALIBRADAS com a arte real (10/07, noite). A maquete mentia sobre o
   espaço que cada peça ocupa — todas encolheram e saíram de cima do texto. */

/* FX.01 · "escolhe pelo RESULTADO": sangra pela esquerda, como peça grande que
   continua fora do quadro. Opacidade baixa porque ela REPETE a headline ao lado:
   a 42% virava eco; a 28% vira a versão pichada da mesma frase. */
.gd-pico.p-fx1{left:-3%;top:6%;width:min(42%,520px);--po:.28}

/* FX.02 · "QUERIDINHOS": foi pro lado DIREITO. No centro ela cruzava o h2 e o
   player — a seção tem o título à esquerda e a metade direita vazia. */
.gd-pico.p-fx2{right:1%;top:2%;transform:rotate(-2deg);width:min(44%,520px);--po:.30}

/* FX.03 · o MASCOTE ESPIANDO (15/07). É o único que aparece como PERSONAGEM (blend
   normal, quase opaco), não tinta. Agora é BUSTO peekando por trás da quina do cartaz
   do kit — cabeça+mãos, sem pernas (aspect 0.83). Sobe do pé da seção (bottom:0) e
   espreita pra cima, do jeito que o monstro fazia.
   ⚠️ QUEM MANDA É A ALTURA. E a direita é COLISÃO, não gosto: mantém ele fora do FAB
   do WhatsApp (o gate-r4-colisao reprova se encostar).
   O júri visual (15/07) pegou: a 8% ele flutuava no vão à direita do cartaz, as mãos
   agarrando o AR. A 14% + bottom:8px as luvas caem SOBRE a quina inferior-direita do
   cartaz (sobre a área vazia à direita das opções, nunca sobre texto) — vira "peekando
   por cima do cartaz", não adesivo solto. E ainda abre folga do FAB. */
.gd-pico.p-fx3{right:14%;bottom:8px;height:min(33%,300px);width:auto;mix-blend-mode:normal;--po:.96}

/* FX.04 · o Audi de uma linha: encosta na borda sem ser cortado no nariz */
.gd-pico.p-fx4{right:1%;top:12%;width:min(48%,600px);--po:.32}

/* FX.06 · o autorretrato: metade dele mora atrás do 3º bilhete. É mural — peça
   parcialmente coberta pelos recados é o comportamento certo, não bug. */
.gd-pico.p-fx6{right:0;bottom:9%;width:min(16%,200px);--po:.55}

@media(max-width:820px){
  /* no celular a parede é estreita: peça grande vira sujeira atrás do texto */
  .gd-pico.p-fx1{width:96%;left:50%;top:0;transform:translateX(-50%);--po:.22}
  .gd-pico.p-fx2{width:96%;right:auto;left:50%;transform:translateX(-50%) rotate(-2deg);--po:.24}
  .gd-pico.p-fx4{width:100%;right:auto;left:50%;top:8%;transform:translateX(-50%);--po:.26}
  /* 🔴 NO CELULAR O MASCOTE ESPIANDO NÃO ENTRA — e isso é composição, não desistência.
     A pose vive no PÉ da seção (ele espia por cima da borda de baixo do cartaz). Mas no
     celular o pé da tela é TODO dos três botões fixos — SOM DA LOJA (x 20–105), o
     símbolo-porta (x 161–229) e o FAB do zap (x 312–376). As folgas entre eles (56px e
     83px a 390) são estreitas demais pra um busto de ~120px sem sentar em cima de um
     botão. O cartaz já ocupa a largura toda; não sobra beirada livre pra ele peekar.
     No desktop ele espia lindo (a folga existe). Quer ele no mobile? Aí é repensar a
     composição da seção (ex: peekar por cima do TOPO do cartaz, longe dos botões) —
     outro trabalho, não um ajuste de %. */
  .gd-pico.p-fx3{display:none}
  .gd-pico.p-fx6{width:30%;right:-2%;bottom:4%;--po:.4}
}

/* ============================================================
   AS PEÇAS DESENHADAS AQUI (SVG autoral — geometria é do site)
   ============================================================ */

/* (A seta de spray do FX.01 foi removida quando a arte real chegou — a peça
   "escolhe pelo RESULTADO" já é a sinalização, com handstyle e ✦.) */

/* --- FX.04 · a régua pichada (a seção chama "Na régua") ---
   Mora no PÉ da seção. A 8% do fundo ela cruzava a legenda "arrasta até o carro
   limpo" e virava ruído em cima de texto — grafite nunca passa por cima de instrução. */
.gd-regua-pico{position:absolute;left:0;right:0;bottom:16px;height:32px;z-index:0;pointer-events:none;
  display:none}
@media(min-width:900px){.gd-regua-pico{display:block}}
.gd-regua-pico svg{width:100%;height:100%;opacity:.22}
.gd-regua-pico line{stroke:rgba(56,225,242,.75);stroke-width:2;stroke-linecap:round}
.gd-regua-pico .lg{stroke-width:2.5}

/* --- FX.05 · o stencil industrial (aqui NÃO é spray solto: é caixa de fábrica) ---
   Só a palavra AÇO, deitada na borda direita como marcação de container.
   A 1ª versão dizia "PEÇA ORIGINAL" no canto — mas a PLAQUETA da seção já diz
   isso com todas as letras, e as duas se atropelavam. Grafite que repete a
   legenda ao lado dela não é camada, é eco. */
.gd-stencil{display:none;position:absolute;right:24px;top:50%;transform:translateY(-50%);
  writing-mode:vertical-rl;text-orientation:upright;   /* letra EM PÉ, empilhada */
  z-index:0;pointer-events:none;
  font-family:var(--font-lt);font-size:72px;line-height:.92;letter-spacing:.04em;
  color:transparent;-webkit-text-stroke:2px rgba(56,225,242,.15);
  /* as "pontes" do stencil: faixas que interrompem a letra, como chapa vazada */
  -webkit-mask-image:repeating-linear-gradient(180deg,#000 0 9px,transparent 9px 12px);
          mask-image:repeating-linear-gradient(180deg,#000 0 9px,transparent 9px 12px)}
.gd-stencil b{font-weight:400}
/* Só a partir de 1400px existe MARGEM à direita dos cards (o wrap trava em ~1200px).
   Abaixo disso o aço passava por cima do 3º produto — e `writing-mode` sem
   `text-orientation:upright` deita cada letra, o que virou rabisco ilegível na
   primeira tentativa. Marcação de container é letra EM PÉ, empilhada. */
@media(min-width:1400px){.gd-stencil{display:block}}

/* --- FX.06 · o mural dos recados: estrelas e um coração, à mão --- */
.gd-recados{position:absolute;inset:0;z-index:0;pointer-events:none}
.gd-recados i{position:absolute;font-family:var(--font-tag);font-style:normal;
  color:rgba(56,225,242,.16);text-shadow:0 0 12px rgba(56,225,242,.12)}
.gd-recados i:nth-child(1){left:6%;top:18%;font-size:36px;transform:rotate(-12deg)}
.gd-recados i:nth-child(2){right:8%;top:30%;font-size:24px;transform:rotate(8deg)}
.gd-recados i:nth-child(3){left:14%;bottom:14%;font-size:20px;transform:rotate(-4deg)}
.gd-recados .cor{position:absolute;left:4%;bottom:26%;width:64px;height:60px;opacity:.16}
.gd-recados .cor path{fill:none;stroke:#38E1F2;stroke-width:4;stroke-linecap:round;stroke-linejoin:round}
@media(max-width:820px){.gd-recados i:nth-child(2),.gd-recados .cor{display:none}}

/* ============================================================
   TRILHO G · O BALCÃO NA RUA (G4 · 10/07/2026)

   Ordem direta do Anthony (10/07): **a regra "checkout 5% street" CAIU.**
   A rua entra no checkout inteiro, Pix incluído. Mas "rua no checkout" não é
   licença pra enfeitar o dinheiro: o que muda é a PELE (parede, títulos,
   materiais, divisores). O que NÃO muda — e não se discute — é
   `input`, `label`, `preço`, `total` e o botão que cobra: Inter/Sora, contraste
   alto, zero rotação. Craft é conseguir as duas coisas; timidez é fugir de uma.

   Quatro entregas:
     1. O TILE — a miniatura de produto NUNCA participa de efeito.
     2. A COMANDA v2 — espeto de balcão, carimbo, número de impressora.
     3. O CORRE DA DEVOLUÇÃO — tirar item do carrinho tem consequência física.
     4. OS DIVISORES DA CASA — fita, tinta escorrida, fio-régua (site-wide).
   ============================================================ */

:root{
  --tile:#EDF2FB;                 /* o palco claro da foto de produto — nunca escurece */
  --fita-a:#E3D7B4; --fita-b:#C9BB93;   /* fita crepe: papel e sombra do papel */
}

/* ------------------------------------------------------------
   1. O TILE DA MINIATURA — a lei que mata o "não escaneado"

   O bug: `.sum-item .si-img` no checkout tinha `background:var(--surface-2)`
   (navy #18233B) E `mix-blend-mode:multiply` na foto. Multiply multiplica a
   foto pelo que está ATRÁS: fundo branco × navy = navy. A foto do produto
   virava um fantasma escuro — exatamente a "cara de não escaneado" que o
   Anthony viu. No drawer o mesmo componente estava CERTO (tile #EDF2FB), o
   que provou que era regressão de uma tela só, não decisão de design.

   A cura não é trocar a cor lá: é ter UM tile no sistema. Todo lugar que
   mostra foto de produto pequena usa `.gd-tile`, e o tile:
     · é sempre claro (o multiply precisa de fundo claro pra fundir o branco);
     · `isolation:isolate` → a foto multiplica contra O TILE, nunca contra a
       página escura, aconteça o que acontecer com o pai;
     · mata animação/transform herdados (`gdImgIn`, o zoom de hover do card):
       miniatura de 52px não tem palco pra coreografia — só precisa LER.
   ------------------------------------------------------------ */
.gd-tile{background:var(--tile);isolation:isolate;color:#1650E5}
.gd-tile img.prod-photo{mix-blend-mode:multiply;animation:none;transition:none;transform:none}
.gd-tile img.prod-photo:hover{transform:none}

.gd-dw-item .i-ph{background:var(--tile)}          /* já era claro; agora fala o token */
.gd-fly{background:var(--tile);isolation:isolate}
.gd-fly img{animation:none;transition:none}

/* ------------------------------------------------------------
   2. A COMANDA v2 — o papel do balcão vira objeto

   Já era papel serrilhado. Faltava o que faz um balcão de verdade:
     · O ESPETO — a agulha de aço onde o balconista enfia a comanda. O furo é
       real (sombra interna), a haste sai por cima do papel e tem o botão.
     · O CARIMBO — "A 01 ✦" batido torto em tinta azul. `multiply` no papel
       claro: tinta de carimbo mancha o papel, não flutua sobre ele.
     · O NÚMERO DE IMPRESSORA — `tabular-nums`. Sem isso o "Nº 2820" e o
       "R$ 215,29" dançam a cada re-render, porque 1 é mais estreito que 8.
   ------------------------------------------------------------ */
/* A BANDA DO ESPETO: uma faixa de papel só pro furo e pro carimbo. Sem ela o
   carimbo cai em cima do "Nº 2185" (foi o que aconteceu na 1ª volta) e o
   espeto vira pirulito flutuando. Papel de comanda de verdade tem essa margem
   morta em cima — é por onde ele é espetado. */
.gd-dw-comanda{padding-top:40px;margin-top:24px;overflow:visible}

/* O ESPETO — a física manda no desenho.
   Duas voltas erradas antes de acertar:
     v1: haste flutuando acima do papel, furo solto 10px abaixo → pirulito.
     v2: haste encostando no furo, com BOLINHA no topo → alfinete de mapa.
   O espeto de balcão é o contrário do alfinete: a base pesada fica EMBAIXO, o
   papel é enfiado nele de cima pra baixo, e o que sobra acima da folha é só a
   PONTA da agulha. Então: nada de cabeça — uma ponta de aço que afina até
   sumir, nascendo do furo. A base mora atrás do papel e ninguém vê. */
.cmd-espeto{position:absolute;left:50%;top:-14px;width:14px;height:32px;transform:translateX(-50%);
  pointer-events:none;z-index:2}
.cmd-espeto::before{                            /* a agulha: cônica, do furo até a ponta */
  content:"";position:absolute;left:50%;top:0;width:5px;height:30px;transform:translateX(-50%);
  background:linear-gradient(90deg,#4B5361,#AAB4C2 34%,#F4F7FB 50%,#8B94A3 66%,#3E4553);
  clip-path:polygon(50% 0,100% 26%,86% 100%,14% 100%,0 26%);
  filter:drop-shadow(0 1px 1px rgba(0,0,0,.45))}
.cmd-espeto::after{                             /* o brilho de aço polido na ponta */
  content:"";position:absolute;left:50%;top:2px;width:1px;height:14px;transform:translateX(-50%);
  background:linear-gradient(180deg,#fff,rgba(255,255,255,0));opacity:.9}
.cmd-furo{                                      /* o rasgo que a agulha fez, com o papel levantado */
  position:absolute;left:50%;top:15px;width:11px;height:5px;transform:translateX(-50%);
  border-radius:var(--r-full);
  background:radial-gradient(ellipse at 50% 20%,#4A5261,#161C28 75%);
  box-shadow:0 1px 0 rgba(255,255,255,.95),0 var(--sp-hair) var(--sp-1) rgba(0,0,0,.18);z-index:1}

/* O CARIMBO mora na banda, à esquerda — longe do número. Tinta de carimbo
   MANCHA o papel (`multiply`), não flutua sobre ele. */
.cmd-carimbo{
  position:absolute;left:14px;top:8px;transform:rotate(-8deg);
  font-family:var(--font-lt,'Bungee',cursive);font-weight:400;font-size:var(--fs-3xs);
  letter-spacing:.14em;line-height:1;color:#1B54D8;
  border:var(--bw-2) solid #1B54D8;border-radius:var(--r-xs);padding:var(--sp-1) var(--sp-2);
  opacity:.32;mix-blend-mode:multiply;pointer-events:none;white-space:nowrap}
.cmd-carimbo i{font-style:normal;margin-left:var(--sp-1)}

/* números de impressora: a coluna não dança quando o valor muda.
   Só os DÍGITOS entram na Bungee — o "Nº" nela vira um borrão de 2 glifos. */
.cmd-top span,.gd-dw-comanda .gd-dw-sum b{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.cmd-top span{font-size:var(--fs-2xs);letter-spacing:.06em;color:#6B7488}
.cmd-top span i{font-family:var(--font-lt,'Bungee',cursive);font-style:normal;font-weight:400;
  letter-spacing:.04em;color:#39434F;margin-left:var(--sp-1)}

/* ------------------------------------------------------------
   3. O CORRE DA DEVOLUÇÃO — remover item tem consequência física

   Tirar um item do carrinho era um `innerHTML` novo: o item sumia entre dois
   frames e o olho não registrava O QUE saiu. Agora o item TOMBA e o mascote
   atravessa a linha levando a caixa embora. ~700ms, 1×, e a lista fecha o vão.

   O boneco mora no `#sum-items` (que é `position:relative`), NÃO na linha:
   a linha precisa de `overflow:hidden` pra colapsar a altura, e overflow
   cortaria o mascote no meio da corrida.

   Ele corre da DIREITA (onde está o "×" que você clicou) pra ESQUERDA, no
   sentido em que a arte já corre — `mascote-corre.webp` tem o pé da frente e o
   olhar pra esquerda. Espelhar o boneco pra ele correr "pro lado do botão"
   inverteria o boné e o #VEMSERGLOBAL do moletom.
   ------------------------------------------------------------ */
#sum-items{position:relative}
.sum-item{position:relative;overflow:hidden}

/* A COREOGRAFIA tem uma ordem, e ela não é negociável:
     ele CHEGA → a linha TOMBA → ele SAI com a caixa → o vão FECHA.
   Se o vão fechar enquanto ele ainda corre, o boneco fica pairando sobre a
   linha de baixo e tapa o produto seguinte (foi o que aconteceu aos 380ms na
   1ª volta). Por isso o `gdCorre` termina fora da tela em 68% do tempo, e só
   depois disso o `max-height` começa a colapsar. */
.gd-corre{position:absolute;left:0;z-index:3;pointer-events:none;
  filter:drop-shadow(0 6px 10px rgba(0,0,0,.5));
  animation:gdCorre .72s cubic-bezier(.32,.02,.4,1) both}
@keyframes gdCorre{
  0%  {transform:translateX(var(--x0)) translateY(0);opacity:0}
  8%  {opacity:1}
  24% {transform:translateX(calc(var(--x0) * .6)) translateY(-3px)}
  46% {transform:translateX(calc(var(--x0) * .28)) translateY(1px)}
  68% {transform:translateX(-104px) translateY(-2px);opacity:1}
  100%{transform:translateX(-104px) translateY(-2px);opacity:0}
}
.si-tomba{animation:gdTomba .72s cubic-bezier(.2,.8,.3,1) both}
@keyframes gdTomba{
  0%  {transform:none;opacity:1;max-height:var(--h)}
  22% {transform:rotate(-2deg) translateY(1px);opacity:1}
  50% {transform:rotate(8deg) translateY(20px);opacity:0}
  68% {transform:rotate(8deg) translateY(20px);opacity:0;max-height:var(--h)}
  100%{transform:rotate(8deg) translateY(20px);opacity:0;max-height:0;
       padding-top:0;padding-bottom:0;border-bottom-width:0}
}
@media(prefers-reduced-motion:reduce){
  .gd-corre{display:none}
  .si-tomba{animation:none;display:none}    /* corte seco: o item some, a conta fecha */
}

/* ------------------------------------------------------------
   4. OS DIVISORES DA CASA — três materiais, um sistema

   A rua separa assunto com o que tem na mão: FITA de oficina, TINTA que
   escorreu, e o FIO da régua. Nasce aqui (o checkout precisou) e vale
   site-wide — a G6 aplica nas seções grudadas do "A empresa".

   Todos são `aria-hidden` e `pointer-events:none`: são material, não conteúdo.
   ------------------------------------------------------------ */
.gd-div{position:relative;pointer-events:none;width:100%}

/* FITA de oficina — papel crepe, torto, pontas rasgadas */
.gd-div-fita{height:22px;margin:var(--sp-6) 0}
.gd-div-fita::before{content:"";position:absolute;inset:0;transform:rotate(-.6deg);
  background:
    repeating-linear-gradient(90deg,rgba(0,0,0,.05) 0 1px,transparent 1px 3px),
    linear-gradient(180deg,var(--fita-a),var(--fita-b));
  box-shadow:0 var(--sp-hair) var(--sp-2) rgba(0,0,0,.4);
  opacity:.82;
  /* pontas rasgadas: o crepe não corta reto */
  clip-path:polygon(0 22%,3% 4%,7% 26%,12% 6%,18% 22%,26% 8%,34% 24%,44% 6%,54% 24%,
                    64% 8%,74% 24%,84% 6%,92% 24%,97% 8%,100% 26%,
                    100% 74%,96% 94%,89% 72%,80% 92%,70% 74%,59% 94%,48% 74%,
                    38% 92%,28% 74%,19% 94%,11% 74%,5% 92%,0 76%)}

/* TINTA ESCORRIDA — a linha e o que pingou dela */
.gd-div-tinta{height:20px;margin:var(--sp-6) 0}
.gd-div-tinta::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:var(--cyan);opacity:.5;box-shadow:0 0 12px rgba(56,225,242,.3)}
.gd-div-tinta::after{content:"";position:absolute;left:0;right:0;top:0;height:18px;
  background:var(--cyan);opacity:.4;
  -webkit-mask-image:
    radial-gradient(5px 15px at 9% 0,#000 62%,transparent 64%),
    radial-gradient(3px 8px  at 21% 0,#000 62%,transparent 64%),
    radial-gradient(4px 11px at 38% 0,#000 62%,transparent 64%),
    radial-gradient(3px 6px  at 52% 0,#000 62%,transparent 64%),
    radial-gradient(5px 17px at 67% 0,#000 62%,transparent 64%),
    radial-gradient(3px 9px  at 81% 0,#000 62%,transparent 64%),
    radial-gradient(4px 7px  at 93% 0,#000 62%,transparent 64%);
          mask-image:
    radial-gradient(5px 15px at 9% 0,#000 62%,transparent 64%),
    radial-gradient(3px 8px  at 21% 0,#000 62%,transparent 64%),
    radial-gradient(4px 11px at 38% 0,#000 62%,transparent 64%),
    radial-gradient(3px 6px  at 52% 0,#000 62%,transparent 64%),
    radial-gradient(5px 17px at 67% 0,#000 62%,transparent 64%),
    radial-gradient(3px 9px  at 81% 0,#000 62%,transparent 64%),
    radial-gradient(4px 7px  at 93% 0,#000 62%,transparent 64%)}

/* FIO-RÉGUA — a mesma régua do selo, virada divisor */
.gd-div-fio{height:12px;margin:var(--sp-5) 0}
.gd-div-fio::before{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:rgba(255,255,255,.14)}
.gd-div-fio::after{content:"";position:absolute;left:0;right:0;bottom:0;height:7px;
  background:
    repeating-linear-gradient(90deg,rgba(255,255,255,.22) 0 1px,transparent 1px 60px),
    repeating-linear-gradient(90deg,rgba(255,255,255,.11) 0 1px,transparent 1px 12px);
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 100%);
          mask-image:linear-gradient(180deg,transparent 0,#000 100%)}

/* ------------------------------------------------------------
   5. O CHECKOUT NA RUA (a regra dos "5%" morreu em 10/07)

   O que a rua toma: a PAREDE atrás da página, os TÍTULOS das etapas (gótica),
   as SUBLINHAS (Sedgwick), os ÍNDICES (Bungee), o QR do Pix (vira lambe colado
   na parede) e os DIVISORES.

   O que a rua NÃO toma, nunca:
     · `label`, `input`, `select`  → Inter, contraste alto, sem rotação
     · preço, subtotal, TOTAL      → Sora tabular
     · o botão que cobra           → Inter 600, azul cheio
     · os selos de segurança       → voz de loja (é ali que o medo mora)
   "A rua assina; a loja vende" continua valendo — só que agora a rua assina
   o checkout também.

   ⚠️ A parede é `position:fixed`. Num `body` que rola, um fundo `absolute` de
   1600px de altura obrigaria o compositor a repintar a textura a cada frame de
   scroll no celular. Fixed pinta uma vez.
   ------------------------------------------------------------ */
/* A parede nova (15/07): o muro "A 01 DO LITORAL" com o mascote e o LED azul
   (identidade/muro checkout.png → muro-checkout.webp).
   Pedido do Anthony (15/07, v2): SEM blur — o mesmo escurecimento do hero
   (.hd-wall/.hd-scrim/.hd-vig): muro em opacidade cheia com brightness baixo,
   scrim horizontal e vinheta. Aqui o scrim é ESPELHADO (no hero a copy mora à
   esquerda; no checkout o resumo mora à DIREITA e o mascote à esquerda). */
body.co-page::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:url('../img/muro-checkout.webp?v=p6') center / cover no-repeat;
  filter:brightness(.38) saturate(.7) contrast(1.05)}
body.co-page::after{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background:
  linear-gradient(90deg,rgba(4,7,14,.14) 0%,rgba(4,7,14,.18) 40%,rgba(4,7,14,.5) 68%,rgba(4,7,14,.68) 100%),
  radial-gradient(120% 100% at 50% 42%, transparent 42%, rgba(3,6,12,.72) 100%),
  linear-gradient(180deg,rgba(4,7,14,.55) 0,transparent 20%,transparent 74%,rgba(5,7,14,.9) 100%)}
body.co-page .co-top,body.co-page .wrap,body.co-page .co-empty,
body.co-page .co-success,body.co-page .co-pix{position:relative;z-index:1}

/* --- os títulos das etapas: a voz da rua --- */
/* Pirata One tem altura-x baixa: no mesmo font-size ela LÊ ~16% menor que a
   Sora. Todo título que troca de voz sobe um degrau da régua junto (decreto G1). */
body.co-page .co-card h3{font-family:var(--font-gt,'Pirata One',cursive);font-weight:400;
  font-size:var(--fs-xl);letter-spacing:.01em}
body.co-page .co-card h3 .st{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:var(--fs-2xs);letter-spacing:0}
body.co-page .co-empty h2,body.co-page .co-pix h2{font-family:var(--font-gt,'Pirata One',cursive);
  font-weight:400;font-size:var(--fs-3xl);letter-spacing:.01em}
body.co-page .co-success h2{font-family:var(--font-gt,'Pirata One',cursive);font-weight:400;
  font-size:var(--fs-4xl);letter-spacing:.01em}

/* a anotação de quem pichou ao lado do título */
.co-eyebrow{display:block;font-family:var(--font-tag,'Sedgwick Ave Display',cursive);font-weight:400;
  font-size:var(--fs-sm);line-height:1;color:var(--cyan);opacity:.8;margin-bottom:var(--sp-2);
  letter-spacing:.02em}

/* os índices do passo a passo (1 · 2 · 3) viram letreiro */
body.co-page .co-step .n{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:var(--fs-3xs);letter-spacing:0}

/* --- o QR do Pix vira LAMBE colado na parede --- */
/* O papel é BRANCO e o QR fica reto dentro dele: quem inclina é o papel, não o
   código. Câmera de celular lê QR torto, mas o cliente não sabe disso — e no
   momento de pagar ninguém quer "será que lê?". A rotação é do lambe (-1.2°). */
body.co-page .pix-qr{position:relative;background:#fff;border:none;border-radius:var(--r-2xs);
  padding:var(--sp-4);transform:rotate(-1.2deg);
  box-shadow:0 12px 0 -6px rgba(0,0,0,.25),0 18px 40px rgba(0,0,0,.55)}
body.co-page .pix-qr img{transform:rotate(1.2deg)}   /* o código volta ao prumo */
body.co-page .pix-qr::before,body.co-page .pix-qr::after{content:"";position:absolute;
  width:56px;height:20px;
  background:linear-gradient(180deg,var(--fita-a),var(--fita-b));opacity:.9;
  box-shadow:0 1px 4px rgba(0,0,0,.4)}
body.co-page .pix-qr::before{left:-16px;top:-10px;transform:rotate(-38deg)}
body.co-page .pix-qr::after{right:-16px;bottom:-10px;transform:rotate(-38deg)}

/* --- o resumo é a comanda da casa: número de impressora --- */
body.co-page .si-price,body.co-page .sum-line span,body.co-page .sum-total .vl,
body.co-page .pix-amt{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}

/* o carimbo do balcão no alto do resumo */
.co-stamp{position:absolute;right:16px;top:12px;transform:rotate(-7deg);
  font-family:var(--font-lt,'Bungee',cursive);font-weight:400;font-size:var(--fs-3xs);
  letter-spacing:.14em;line-height:1;color:var(--cyan);
  border:var(--bw-2) solid var(--cyan);border-radius:var(--r-xs);
  padding:var(--sp-1) var(--sp-2);opacity:.3;pointer-events:none;white-space:nowrap}
body.co-page .summary > .co-card:first-child{position:relative}

/* --- o celular: a parede fica, o resto encolhe --- */
@media(max-width:880px){
  body.co-page .co-card h3{font-size:var(--fs-lg)}
  body.co-page .co-success h2{font-size:var(--fs-3xl)}
  .co-stamp{display:none}      /* 375px de largura: o carimbo brigaria com o título */
}
@media(prefers-reduced-motion:reduce){
  body.co-page .pix-qr{transform:none}
  body.co-page .pix-qr img{transform:none}
}

/* ============================================================
   TRILHO G · O PALCO DA PDP (G3 · 10/07/2026)
   "Entregue na tua mão" — pedido do Renan, escolhido no `lab-pdp.html`.

   Uma cena, dois estados, e quem decide é o ASSET:

     .palco-mao      → o produto tem recorte alpha: palco ESCURO, a mão do
                       mascote sobe por baixo e te entrega o produto.
     .palco-vitrine  → o produto só tem JPG de fundo branco: a vitrine acende o
                       tile CLARO e a foto entra no `multiply`, como sempre.

   Por que não é escolha de gosto: `mix-blend-mode:multiply` COME a foto em fundo
   escuro. O tile claro nunca foi preguiça — era física. A vitrine é iluminada
   por dentro; a metáfora resolve o que o CSS não resolve.
   ============================================================ */

.gal-main.palco{background:radial-gradient(90% 70% at 50% 26%, #10203F, #070B14 74%)}
.pl-moldura{position:absolute;inset:0;z-index:0;border-radius:inherit;pointer-events:none;
  background:linear-gradient(180deg,#0B1A3B,#071026 62%,#050A14);
  box-shadow:inset 0 0 0 1px rgba(56,225,242,.18), inset 0 30px 80px rgba(46,116,255,.12)}
/* o grafite da categoria, pichado no fundo da vitrine.
   A 4% do topo ele passava atrás dos badges ("TAMANHO PRO", "EM ESTOQUE"). */
.pl-pico{position:absolute;left:50%;top:9%;transform:translateX(-50%) rotate(-2deg);z-index:1;
  font-family:var(--font-tag);font-size:clamp(20px,3.2vw,36px);line-height:1;color:transparent;
  -webkit-text-stroke:1.4px rgba(56,225,242,.26);white-space:nowrap;pointer-events:none}
/* o PISO DE LED da loja real de Santos, em perspectiva */
.pl-piso{position:absolute;left:-30%;right:-30%;bottom:-6%;height:40%;z-index:1;pointer-events:none;
  background:
    repeating-linear-gradient(90deg,rgba(56,225,242,.30) 0 2px,transparent 2px 34px),
    repeating-linear-gradient(0deg,rgba(56,225,242,.22) 0 2px,transparent 2px 34px);
  transform:perspective(520px) rotateX(64deg);
  -webkit-mask-image:linear-gradient(0deg,#000,transparent 88%);mask-image:linear-gradient(0deg,#000,transparent 88%)}

/* ---------- estado VITRINE (fallback honesto: produto sem recorte) ---------- */
.pl-tile{position:absolute;left:15%;right:15%;top:13%;bottom:24%;z-index:2;border-radius:16px;
  background:radial-gradient(120% 84% at 50% 30%,#F6F9FD,#E4EAF5 60%,#D3DCEB 100%);
  box-shadow:0 0 60px rgba(56,225,242,.16), 0 24px 60px rgba(0,0,0,.5)}
/* ⚠️ largura e altura EXPLÍCITAS: num `<img>` (elemento substituído) posicionado
   absoluto, `width:auto` resolve pro tamanho INTRÍNSECO e o `right`/`bottom` é
   ignorado — a foto estoura o tile. Com `<div>` funcionaria; com `<img>`, não. */
.gal-main.palco-vitrine img.prod-photo{position:absolute;left:15%;top:13%;width:70%;height:63%;
  z-index:3;padding:5%;object-fit:contain;mix-blend-mode:multiply}

/* ---------- estado MÃO (o produto tem recorte) ---------- */
.pl-cena{position:absolute;inset:0;z-index:2;overflow:hidden;border-radius:inherit;pointer-events:none}
/* o punho SANGRA embaixo — é assim que a mão "entra por baixo da tela".
   ⚠️ A LARGURA DA MÃO DEFINE TUDO. A arte NOVA (15/07) é 0.777:1 → altura = largura ÷ 0.777,
   e a palma cai em `--palma` DESSA altura. Com 70% de largura e produto a 88%
   da mão, o produto nascia colado no topo do palco: 1px de folga no desktop e
   **-61px (cortado)** no celular. Medido por `gate-g3-palco.js`, não olhado. */
.pl-mao{position:absolute;left:50%;bottom:-5%;width:56.4%;transform:translate(-50%,32%);transform-origin:50% 100%}
/* 56.4% (era 66%): a arte nova é mais alta (0.777 vs 0.91) — 56.4 ÷ 0.777 devolve os
   mesmos 72.5% de altura renderizada da arte antiga; o palco não muda de geometria. */
.pl-mao > img{display:block;width:100%;height:auto}

/* O PRODUTO SENTA NA PALMA. `--palma` é a altura da concha da mão, em % da arte.
   A BASE do produto ancora nesse ponto (`translate(-50%,-100%)` + origem no pé),
   e é por isso que ele CRESCE a partir da mão em vez de flutuar acima dela. */
.pl-prod{position:absolute;left:50%;top:var(--palma,52%);height:74%;width:58%;
  display:flex;align-items:flex-end;justify-content:center;   /* a BASE cola no fundo da caixa */
  transform:translate(-50%,-100%) scale(.55);transform-origin:50% 100%;
  filter:drop-shadow(0 22px 30px rgba(0,0,0,.62))}
/* A caixa tem ALTURA e LARGURA; a foto se ajusta dentro dela (`max-*`), encostada
   no fundo. Ancorar só pela altura fazia o galão de 5L (proporção 0.70) ficar
   largo demais e encostar nos stickers a 390px. Ancorar só pela largura daria a
   cada produto um tamanho diferente (spray 0.45 × galão 0.70). Precisa dos dois. */
.pl-prod img{display:block;max-height:100%;max-width:100%;width:auto;height:auto}

/* G3.5 · O ENCOSTADO — o mini-ele recostado no produto, na própria palma
   (pedido do Renan 10/07; a emenda da lei "não repete" está no components.js).
   Âncora IGUAL à do produto: base na linha da palma, altura em % da mão.
   A ESCALA é a régua áurea da cena (Renan pediu ele MAIOR, 10/07 à noite):
   cada figura desce um degrau — produto ≈ 54% do palco, boneco = palco/φ²
   ≈ 38% do palco = 52% da mão → boneco/produto ≈ 1/√2 (0,71). A cara dele
   fica ~36px no celular (legível) e o produto segue sendo a estrela.
   O `left` chega por código, do aspect do recorte. A inclinação já vem NA
   ARTE — aqui só a chegada e a respiração. */
.pl-boneco{position:absolute;top:var(--palma,52%);height:52%;opacity:0;
  transform:translate(0,-100%) rotate(4.5deg);transform-origin:70% 100%}
.pl-boneco img{display:block;height:100%;width:auto;
  filter:drop-shadow(-10px 12px 14px rgba(0,0,0,.55))}
/* a sombra de contato sob os tênis — os pés vivem na metade DIREITA da arte */
.pl-boneco::before{content:"";position:absolute;left:44%;right:-6%;bottom:-.9%;height:2.6%;
  background:radial-gradient(50% 50% at 50% 50%, rgba(0,0,0,.5), transparent 72%)}

.gal-main.palco-mao.entregue .pl-mao{animation:plMaoSobe 1.05s cubic-bezier(.2,.8,.3,1) .1s forwards}
.gal-main.palco-mao.entregue .pl-prod{animation:plProdCresce .62s cubic-bezier(.2,.8,.3,1) .72s forwards}
/* o produto assenta em ~1,34s; ele chega um compasso depois e SE AJEITA
   (gira de 4,5°→0 com o pivô no pé de apoio — o corpo cai no encosto) */
.gal-main.palco-mao.entregue .pl-boneco{animation:plEncostaChega .55s cubic-bezier(.2,.8,.3,1) 1.62s forwards}
/* o idle de quem tá de boa (na IMG pra não brigar com a chegada, que anima o pai) */
.gal-main.palco-mao.entregue .pl-boneco img{animation:plEncostaRespira 4.8s ease-in-out 2.6s infinite}
@keyframes plMaoSobe{from{transform:translate(-50%,32%)}to{transform:translate(-50%,0)}}
@keyframes plProdCresce{from{transform:translate(-50%,-100%) scale(.55)}
                          to{transform:translate(-50%,-100%) scale(1)}}
@keyframes plEncostaChega{from{opacity:0;transform:translate(6%,-100%) rotate(4.5deg)}
                            to{opacity:1;transform:translate(0,-100%) rotate(0deg)}}
@keyframes plEncostaRespira{0%,100%{transform:translateY(0)}50%{transform:translateY(-.7%)}}
@media(prefers-reduced-motion:reduce){
  .gal-main.palco-mao .pl-mao{transform:translate(-50%,0);animation:none}
  .gal-main.palco-mao .pl-prod{transform:translate(-50%,-100%) scale(1);animation:none}
  .gal-main.palco-mao .pl-boneco{opacity:1;transform:translate(0,-100%);animation:none}
  .gal-main.palco-mao .pl-boneco img{animation:none}
}

/* ---------- A LUPA (10/08) · inspecionar o rótulo ----------
   Pedido do Anthony: "quando eu coloco o mouse em cima do produto, não abre um
   zoom — eu quero que abra". Não existia mesmo. Três armadilhas de CASCATA
   tiveram que ser resolvidas aqui, e todas as três são invisíveis no código:

   1. `.pl-cena` é `pointer-events:none` — o mouse ATRAVESSA a cena inteira.
      Nenhum `:hover` no produto jamais disparou nesta página. Reaberto abaixo,
      e só em ponteiro fino.
   2. `.pl-prod` roda `plProdCresce` com `fill-mode:forwards`. **Animação com
      forwards ganha de `:hover` no mesmo elemento** — um
      `.gal-main:hover .pl-prod{transform:scale()}` existe e não pinta. Por isso
      quem escala é a `<img>` FILHA, que não tem transform nenhum.
   3. `.pl-boneco` também termina em `opacity:1` por forwards. Apagar ele exige
      mexer na `<img>` dele (cuja animação de respiro só toca `transform`).

   O `overflow:hidden` do `.pl-cena` deixou de ser problema e virou o RECURSO:
   ele é a janela da lupa. E a mão e o boneco RECUAM durante a inspeção — são
   cenário, o rótulo é o assunto. De quebra isso mata a colisão que o zoom
   criaria: com o boneco apagado, o produto cresce à vontade sem deixar o ombro
   dele no ar (ele é posicionado uma vez, com o produto em repouso).
   O `--zx/--zy` chega do `components.js` e segue o ponteiro. */
@media (hover:hover) and (pointer:fine){
  .gal-main.palco-mao .pl-cena{pointer-events:auto}
  .gal-main.palco-mao .pl-prod{cursor:zoom-in}
  .gal-main.palco-mao .pl-prod img{
    transform-origin:var(--zx,50%) var(--zy,50%);
    transition:transform .28s cubic-bezier(.2,.8,.3,1);will-change:transform}
  .gal-main.palco-mao.lupa .pl-prod img{transform:scale(2.1)}
  /* a sombra projetada engorda junto com a escala e vira borrão — encolhe */
  .gal-main.palco-mao .pl-prod{transition:filter .28s ease}
  .gal-main.palco-mao.lupa .pl-prod{filter:drop-shadow(0 12px 18px rgba(0,0,0,.5))}
  .gal-main.palco-mao .pl-mao > img,
  .gal-main.palco-mao .pl-boneco img,
  .gal-main.palco-mao .pl-pico{transition:opacity .28s ease}
  .gal-main.palco-mao.lupa .pl-mao > img{opacity:.16}
  .gal-main.palco-mao.lupa .pl-boneco img{opacity:0}
  .gal-main.palco-mao.lupa .pl-pico{opacity:.3}
}
/* celular não tem hover e um zoom preso no dedo brigaria com o scroll: a lupa
   simplesmente não existe lá (o JS nem escuta). Nada a desfazer. */
@media(prefers-reduced-motion:reduce){
  .gal-main.palco-mao .pl-prod img{transition:none}
  .gal-main.palco-mao .pl-prod{transition:none}
}

/* ---------- o que o palco escuro QUEBRA e como se conserta ---------- */
/* 1. O scanner (R9) revelava um tile CLARO com `clip-path`. Sem tile, ele não
      tem o que revelar — e a luz que varre continua fazendo todo o sentido. */
.gal-main.palco-mao::before{display:none}
/* 2. O selo do scanner e os stickers vivem acima da cena da mão. */
.gal-main.palco .gd-scan-stamp{z-index:5}
.gal-main.palco .p-stickers,.gal-main.palco .p-badges{z-index:6}
.gal-main.palco .gd-scan-line,.gal-main.palco .gd-scan-glow{z-index:4}
/* 3. No escuro, o carimbo verde-sobre-branco do scanner perde contraste. */
.gal-main.palco-mao .gd-scan-stamp{background:rgba(8,14,26,.86);color:#7DF0B6;
  border:1px solid rgba(31,199,118,.4);backdrop-filter:blur(6px)}
.gal-main.palco-mao .gd-scan-stamp svg{stroke:#7DF0B6}
/* 4. O sticker die-cut do mascote SAI da cena da mão. Dois motivos, e o segundo
      só apareceu quando o gate mediu: (a) seria a TERCEIRA aparição do mesmo
      personagem na tela (a mão já é ele); (b) com ele a coluna de stickers tem
      156px e o galão de 5L a invadia a 900px e a 390px. Sem ele são ~80px, e o
      produto passa por cima com folga. A tag e a placa continuam. */
.gal-main.palco-mao .pst-mascote{display:none}

@media(max-width:860px){
  /* a mão NÃO cresce no celular: o palco é quadrado nos dois, e engordar a mão
     empurra a palma pra baixo → o produto sai pelo topo. Mesma matemática. */
  .pl-pico{top:3%}
}

/* ============================================================
   TRILHO G · G8 — A VITRINE DA RUA (o catálogo, 11/07/2026)
   "O boneco encostado em cada produto da loja, sem a mão — e o fundo do
   catálogo com identidade." (Anthony)

   O card deixa de ser um tile branco de e-commerce e vira um NICHO da loja:
   muro atrás, holofote na parede, prateleira de LED, o grafite da categoria —
   e o Encostado apoiado na borda do produto. A geometria (altura do produto
   `--vh`, altura `--bh` e X do boneco) nasce no JS, do aspect do recorte:
   ver a seção G8 do `components.js`.

   ⚠️ A LEI CONTINUA DE PÉ: isto acaba no tile. Nome, preço, Pix e botão de
   comprar (o `.body` do card) NÃO são tocados — a rua nunca entra onde se lê
   número. Craft é conseguir as duas coisas.
   ============================================================ */

.card-prod.vt .thumb{
  --piso:88%;                                   /* a linha da prateleira: produto e boneco ancoram AQUI */
  overflow:hidden;                              /* a prateleira em perspectiva sangraria no nome do produto */
  background:radial-gradient(120% 92% at 50% 30%, #13233F, #080D18 74%)}

/* a parede: a MESMA foto do muro contínuo da home (1 requisição serve a grade
   inteira, e o arquivo já é 70KB — ver o bloco do MURO). Bem fechada, porque o
   herói do card é o produto, não o concreto.
   ⚠️ O CROP É ESCOLHIDO, não é o centro. A 210% de zoom entrava o "A 01 DO
   LITORAL" pichado NA FOTO: letra gigante e picada atrás de cada frasco — 16
   palavras cortadas viram ruído, e ainda brigam com a pichação da CATEGORIA,
   que é a que precisa ler aqui. 700% + o TOPO da parede pega a faixa de concreto
   sem letra nenhuma: vira GRÃO. Mexeu no zoom? Confira que não entrou letra. */
.card-prod.vt .vt-muro{position:absolute;inset:0;z-index:0;
  background:url('../img/muro-tex.webp') 46% 0% / 700% no-repeat;
  opacity:.20;filter:grayscale(.55) contrast(1.08) brightness(.8)}

/* O HOLOFOTE. Não é enfeite: é ele que dá fundo claro pro frasco de rótulo
   preto ler no escuro (a mão branca da PDP fazia esse trabalho lá). Mexeu na
   opacidade daqui? Olhe o Hidrofast e o Tyrex — são os dois mais escuros. */
.card-prod.vt .vt-luz{position:absolute;left:50%;top:46%;width:92%;height:88%;z-index:0;
  transform:translate(-50%,-50%);pointer-events:none;
  background:radial-gradient(50% 50% at 50% 50%, rgba(216,234,255,.26), rgba(120,170,255,.08) 52%, transparent 74%);
  transition:opacity .3s ease}
.card-prod.vt:hover .vt-luz{opacity:1.0;filter:brightness(1.18)}

/* o grafite da categoria, no canto BAIXO-ESQUERDO: é a única quina livre do
   tile (badges no alto-esquerdo, o boneco embaixo-direita, o produto no meio) */
.card-prod.vt .vt-pico{position:absolute;left:7%;bottom:15%;z-index:1;
  transform:rotate(-3deg);transform-origin:0 100%;
  font-family:var(--font-tag);font-size:var(--fs-sm);line-height:1;color:transparent;
  -webkit-text-stroke:1px rgba(56,225,242,.30);white-space:nowrap;pointer-events:none}

/* a PRATELEIRA: o piso de LED da loja de Santos, visto de perto */
.card-prod.vt .vt-piso{position:absolute;left:-24%;right:-24%;top:var(--piso,88%);height:26%;z-index:1;
  pointer-events:none;
  background:repeating-linear-gradient(90deg,rgba(56,225,242,.24) 0 2px,transparent 2px 22px);
  transform:perspective(240px) rotateX(66deg);transform-origin:50% 0;
  -webkit-mask-image:linear-gradient(180deg,#000,transparent 78%);
          mask-image:linear-gradient(180deg,#000,transparent 78%)}
/* o fio de luz da borda da prateleira — é o que faz o produto POUSAR em algo */
.card-prod.vt .vt-piso::before{content:"";position:absolute;left:26%;right:26%;top:0;height:1px;
  background:linear-gradient(90deg,transparent,rgba(56,225,242,.55),transparent)}

/* O PRODUTO. Sai do `inset:0 / multiply` do tile claro e passa a ficar EM PÉ na
   prateleira: a BASE ancora na linha do piso.
   ⚠️ D2 (04/08): o TAMANHO agora é do JS, não do CSS. Os valores abaixo são só o
   estado ANTES do recorte carregar — o `GD_ESCALA_CARD` (products.js) reescreve
   `height` e solta o `max-width` assim que sabe o aspect da imagem. O par
   `height:74%` + `max-width:62%` fixo era justamente o bug: duas travas brigando
   davam 318 produtos no mesmo teto e 106 pares de fator invertidos.
   O `--pz` sobrevive SÓ como o zoom do hover (1 = identidade). */
.card-prod.vt .thumb img.prod-photo{
  inset:auto;left:50%;top:var(--piso,88%);
  width:auto;height:64%;max-width:80%;
  padding:0;object-fit:contain;mix-blend-mode:normal;z-index:2;
  transform:translate(-50%,-100%) scale(var(--pz,1));transform-origin:50% 100%;
  filter:drop-shadow(0 16px 20px rgba(0,0,0,.6))}
.card-prod.vt:hover .thumb img.prod-photo{transform:translate(-50%,-100%) scale(calc(var(--pz,1)*1.05))}

/* O ENCOSTADO. Mesma âncora do produto (base no piso) e a inclinação já vem NA
   ARTE — aqui só o encosto. O `left` e o `--bh` chegam por código. */
.card-prod.vt .vt-boneco{position:absolute;top:var(--piso,88%);height:var(--bh,52%);z-index:3;
  transform:translateY(-100%);transform-origin:72% 100%;pointer-events:none}
.card-prod.vt .vt-boneco img{display:block;height:100%;width:auto;
  filter:drop-shadow(-7px 9px 11px rgba(0,0,0,.55))}
/* a sombra de contato sob os tênis — os pés vivem na metade DIREITA da arte */
.card-prod.vt .vt-boneco::before{content:"";position:absolute;left:42%;right:-8%;bottom:-1.2%;height:3.4%;
  background:radial-gradient(50% 50% at 50% 50%, rgba(0,0,0,.55), transparent 72%)}
/* ele se ajeita no encosto quando você passa o mouse (1×, não é loop: são 16
   bonecos na tela — idle infinito em 16 elementos é bateria de celular à toa) */
.card-prod.vt:hover .vt-boneco{animation:vtAjeita .5s cubic-bezier(.2,.8,.3,1)}
@keyframes vtAjeita{40%{transform:translateY(-100%) rotate(-2.4deg)}
                   100%{transform:translateY(-100%) rotate(0)}}

@media(prefers-reduced-motion:reduce){
  .card-prod.vt:hover .vt-boneco{animation:none}
  .card-prod.vt:hover .thumb img.prod-photo{transform:translate(-50%,-100%) scale(var(--pz,1))}
}

/* O CELULAR (≈80% do tráfego): a grade cai pra 2 colunas e o tile tem ~170px.
   O boneco encolhe junto — e abaixo de ~150px a cara dele vira mancha. Nessa
   faixa o nicho continua, o boneco também, mas o grafite da categoria sai:
   ele brigaria com a perna do boneco num espaço que não existe. */
@media(max-width:820px){
  .card-prod.vt .vt-pico{display:none}
  /* ⚠️ NÃO baixe o zoom do `.vt-muro` aqui. A doutrina do muro da HOME manda o
     contrário (mais zoom no celular, senão o crop cai num trecho liso e a parede
     some) e eu copiei ela INVERTIDA: um `background-size:300%` neste tile trouxe
     o "A 01 DO LITORAL" de volta pra DENTRO de cada card, picado. O zoom da G8 é
     relativo ao TILE, então os 700% já valem em qualquer largura de tela. */
}

/* ============================================================
   TRILHO G · O FIM DA RUA — o rodapé-mural (G5 · 10/07/2026)

   A tese da rodada: a home é uma rua e o scroll é a caminhada. O rodapé é onde
   a rua acaba — o pedaço de muro mais vivido, onde a obra é assinada: pelo
   mascote (que está TERMINANDO de pichar "a 01 do litoral") e pela Sator, do
   jeito que artista de rua assina: sticker + stencil no canto.

   O MAPA DE ZONAS manda no layout (é o coração do briefing). Em % da imagem:
     · 0-38%   ZONA CALMA      — pichação velha, apagada. Os LINKS moram aqui.
     · 38-58%  ZONA SEMI-CALMA — as polaroids REAIS das 2 fachadas, em código.
     · 60-94%  O MOMENTO       — o mascote no caixote. NADA de conteúdo aqui.
     · 84-98%  A ASSINATURA    — o sticker da Sator. Vira o link, mapeado em cima.

   Por isso a imagem é `width:100%` ancorada no RODAPÉ, e não `background:cover`:
   assim a caixa da imagem É o sistema de coordenadas, e o `left:86.5%` do
   hotspot da Sator cai no sticker em QUALQUER viewport. Com `cover` o mapa
   escorrega a cada proporção de tela e a assinatura sai do lugar.

   O topo da imagem já nasce escurecendo pro céu — é onde o site funde. Se o
   conteúdo do rodapé for mais alto que o mural, sobra preto em cima (de graça).
   Se for mais baixo, o `overflow:hidden` corta o mural POR CIMA — e o que se
   perde é justamente o céu. Nunca o mascote, nunca a assinatura.
   ============================================================ */

footer.site{background:var(--bg);border-top:var(--bw-2) solid rgba(56,225,242,.28)}
footer.site::before,footer.site::after{display:none}   /* os 2 glows azuis brigavam com o muro */
footer.site > .wrap{position:relative;z-index:1}

/* ⚠️ SEM `z-index` aqui, de propósito. Com `z-index:0` o mural vira um CONTEXTO
   DE EMPILHAMENTO, e aí o `.fm-sator{z-index:2}` lá dentro não consegue subir
   acima do `.wrap` (z-index:1) — a assinatura da Sator ficava DEBAIXO da barra
   legal e o clique morria. O olho não via: o sticker está pintado na arte, e ele
   parece clicável. Quem viu foi o `gate-g5-sator.js` (elementFromPoint).
   Com `z-index:auto`: o muro e o scrim pintam no nível 0, o `.wrap` no 1, e o
   link sobe pro 2. Cada um no seu lugar. */
.foot-mural{position:absolute;left:0;right:0;bottom:0;line-height:0;pointer-events:none}
.foot-mural picture{display:block}
.fm-base{display:block;width:100%;height:auto}

/* --- o SCRIM por zona: escuro onde o texto mora, transparente onde a arte fala --- */
/* O scrim tem UM chefe: "a tag é o elemento mais claro e vivo da imagem" (§4 do
   briefing). Na 1ª calibragem o véu vertical estava .80→.34 na faixa da tag e
   apagava o farol. Agora ele abre cedo, e quem segura a legibilidade é o véu
   HORIZONTAL (escuro só até 58%, onde o texto mora) + a sombra do texto. */
.fm-scrim{position:absolute;inset:0;
  background:
    linear-gradient(180deg,var(--bg) 0%,rgba(7,11,20,.72) 8%,rgba(7,11,20,.20) 34%,
                    rgba(7,11,20,.18) 66%,rgba(7,11,20,.58) 100%),
    linear-gradient(90deg,rgba(7,11,20,.92) 0%,rgba(7,11,20,.86) 40%,rgba(7,11,20,.60) 52%,
                    rgba(7,11,20,.20) 62%,rgba(7,11,20,.04) 72%,rgba(7,11,20,0) 88%,
                    rgba(7,11,20,.22) 100%)}

/* O texto do rodapé mora em cima de arte. Sombra curta e escura: mantém o
   contraste sem borrar a letra (a alternativa seria escurecer o mural inteiro,
   e aí a tag morre). */
footer.site > .wrap{text-shadow:0 1px 4px rgba(7,11,20,.92),0 0 16px rgba(7,11,20,.55)}

/* ------------------------------------------------------------
   A TAG SENDO PINTADA

   `mural-tag-cover.webp` é um recorte RGBA: o RGB é o MURO reconstruído no
   lugar exato das letras, e o alpha é a forma da tinta (traço + halo). Com ele
   opaco por cima da base, a parede aparece limpa. Uma máscara o varre da
   esquerda pra direita e ele some — a tag nasce letra a letra, na ordem em que
   foi pintada. O mascote nunca é tocado: ele não está no alpha do cover.

   A máscara é `mask-position` (não uma custom property animada): `@property`
   ainda não é universal, e sem ele um `--sweep` animado PULA no meio do
   caminho em vez de deslizar. `mask-position` interpola em todo lugar.

   `mask-size:240%` existe pra que, no início (`position:100%`), a janela caia
   inteira dentro da parte opaca do gradiente. Com 210% a borda esquerda do
   cover já nascia meio transparente e a tag vazava um fio de ciano no 1º frame.
   ------------------------------------------------------------ */
.fm-cover{position:absolute;left:32.829%;top:0%;width:45.72%;height:54.08%;  /* re-medido pro mural novo (15/07) */
  opacity:0;transition:opacity .2s linear;
  -webkit-mask-image:linear-gradient(90deg,transparent 0 46%,#000 54% 100%);
          mask-image:linear-gradient(90deg,transparent 0 46%,#000 54% 100%);
  -webkit-mask-size:240% 100%;          mask-size:240% 100%;
  -webkit-mask-repeat:no-repeat;        mask-repeat:no-repeat;
  -webkit-mask-position:100% 0;         mask-position:100% 0}
.fm-cover img{display:block;width:100%;height:100%}
/* `.ok` = o recorte carregou. Sem ele o cover fica invisível e a tag já nasce
   pintada — nunca aparece a tag e SOME depois (o pior dos mundos). */
.fm-cover.ok{opacity:1}
.foot-mural.pinta .fm-cover.ok{animation:gdPinta 1.6s cubic-bezier(.4,0,.28,1) forwards}
@keyframes gdPinta{
  to{-webkit-mask-position:0% 0;mask-position:0% 0}
}

/* ------------------------------------------------------------
   A ASSINATURA DA SATOR: o sticker pintado VIRA o link

   A 1ª versão punha uma CAIXA em volta: retângulo ciano com glow + o balão "o
   quadro é nosso". Errado por dois motivos. (1) O sticker é pintado na arte —
   um retângulo por cima anuncia que ali existe um `<a>` de 13%×30%, e o que o
   olho vê é a moldura, não a assinatura. (2) Ninguém emoldura pichação: quem
   assina parede ilumina e risca, não encaixota.

   Agora são dois gestos, ambos SEM borda:
     · A LANTERNA — um foco redondo e macio acende o muro naquele ponto
       (`screen`: soma luz na tinta, não pinta um véu por cima dela).
     · O RISCO — um traço de spray se desenha por baixo, da esquerda pra
       direita, no mesmo sentido em que o mascote picha a tag (`mask` recortada
       dá as falhas da tinta; o giro de -1.2° tira a régua da mão).
   ------------------------------------------------------------ */
/* V3 (16/07) · RE-MAPEADO pro desenho novo: a assinatura virou um handstyle
   PEQUENO no canto (x 94–97.6% · y 85.8–92.6% da arte, medido no PNG), sem
   logomarca. O hotspot abraça ela com folga de dedo (≥44px a partir de 1024w). */
.fm-sator{position:absolute;left:93.4%;top:84.5%;width:5.4%;height:10.6%;z-index:2;
  pointer-events:auto;display:block;
  font-size:0;color:transparent}                /* o texto vive na arte, não no DOM */
.fm-sator:focus-visible{outline:var(--bw-2) solid var(--cyan);outline-offset:var(--sp-1);
  border-radius:var(--r-sm)}
.fm-sator b{font-weight:inherit}

.fm-sator::before{                               /* a lanterna */
  content:"";position:absolute;inset:-34% -26%;pointer-events:none;
  background:radial-gradient(circle at 50% 46%,rgba(56,225,242,.30),
             rgba(56,225,242,.12) 40%,rgba(56,225,242,0) 70%);
  mix-blend-mode:screen;opacity:0;
  transform:scale(.86);transform-origin:50% 46%;
  transition:opacity .3s ease,transform .45s cubic-bezier(.2,.8,.3,1)}
.fm-sator:hover::before,.fm-sator:focus-visible::before{opacity:1;transform:scale(1)}

/* O ACENDE — o desenho novo JÁ TEM o traço com a setinha pintado sob "SATOR";
   desenhar um segundo risco por cima duplicava o gesto (era o hover do sticker
   ANTIGO, 3× maior). Agora o hover SOMA LUZ no traço que já existe na arte
   (`screen`): a assinatura acende ciano da esquerda pra direita, como se a
   tinta ainda estivesse fresca. Nada é pintado por cima do desenho. */
.fm-sator::after{
  content:"";position:absolute;left:6%;right:-4%;bottom:8%;height:34%;pointer-events:none;
  background:radial-gradient(closest-side,rgba(56,225,242,.5),rgba(56,225,242,.18) 55%,rgba(56,225,242,0) 82%);
  mix-blend-mode:screen;opacity:0;
  transform:scaleX(.25);transform-origin:12% 50%;
  transition:opacity .32s ease,transform .5s cubic-bezier(.4,0,.28,1)}
.fm-sator:hover::after,.fm-sator:focus-visible::after{opacity:1;transform:scaleX(1)}

@media(prefers-reduced-motion:reduce){
  .fm-sator::before,.fm-sator::after{transition:none}
  .fm-sator:hover::after,.fm-sator:focus-visible::after{transform:scaleX(1)}
}

/* ------------------------------------------------------------
   O CONTEÚDO: encostado na zona calma, longe do mascote

   O mascote ocupa 70-90% da LARGURA DA TELA (a imagem é full-bleed). Uma grade
   de 4 colunas dentro do `.wrap` centralizado joga a 4ª coluna exatamente em
   cima dele. Por isso, no desktop, o rodapé abandona o `.wrap` centralizado e
   passa a ser um bloco ancorado à ESQUERDA com o resto reservado pra arte.
   ------------------------------------------------------------ */
@media(min-width:1240px){
  /* 44vw, não 40: a 40 a coluna das unidades terminava em 60% da tela e o
     endereço de Santos caía em cima da tag. Agora fecha em 56%. */
  footer.site > .wrap{max-width:none;
    padding-left:clamp(24px,6vw,120px);padding-right:44vw}
}
@media(min-width:1100px) and (max-width:1239px){
  footer.site > .wrap{max-width:none;padding-left:clamp(24px,5vw,64px);padding-right:36vw}
}

/* ------------------------------------------------------------
   AS UNIDADES VIRAM FAIXA (G7 · 11/07)

   O rodapé só tem 56% da tela pra texto — o resto é reservado pro mascote e pra
   tag. Quatro colunas nesse vão davam à coluna das unidades a largura de um
   dedo: as duas polaroids empilhavam, o rodapé crescia pra baixo e o endereço
   quebrava em cinco linhas. Coluna estreita é a origem do problema, não a
   solução dele.

   As unidades DESCEM: saem da grade de links e ganham uma faixa própria, com
   filete em cima, ocupando a largura toda da zona de texto — as duas lado a
   lado. O rodapé encolhe de altura, o endereço volta a caber numa linha, e a
   metade direita continua intocada, como manda o mapa de zonas.
   ------------------------------------------------------------ */
@media(min-width:1100px){
  .foot-top{grid-template-columns:1.5fr 1fr 1fr;gap:var(--sp-8) var(--sp-10);
    align-items:start;margin-bottom:var(--sp-10)}
  .foot-top .foot-col:last-child{grid-column:1/-1;
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    gap:var(--sp-4) var(--sp-10);margin-top:var(--sp-2);
    padding-top:var(--sp-6);border-top:var(--bw-1) solid rgba(56,225,242,.16)}
  .foot-top .foot-col:last-child h4{grid-column:1/-1;margin-bottom:0}
  .foot-top .foot-col:last-child .unit-card{margin-bottom:0}
  /* na faixa a polaroid tem espaço: cresce 26px e a legenda respira ao lado da
     placa em vez de quebrar em duas linhas */
  .uc-pol{max-width:236px}
}
@media(max-width:1099px){
  /* o mural fica só no rodapé do rodapé: o conteúdo é mais alto que ele e
     nasce sobre o preto. O véu escurece a ESQUERDA (onde o texto mora) e abre à
     direita, pra a tag e o mascote respirarem ao lado da coluna. */
  .fm-scrim{background:
    linear-gradient(180deg,var(--bg) 0%,rgba(7,11,20,.78) 10%,rgba(7,11,20,.36) 36%,
                    rgba(7,11,20,.26) 70%,rgba(7,11,20,.60) 100%),
    linear-gradient(90deg,rgba(7,11,20,.86) 0%,rgba(7,11,20,.74) 44%,rgba(7,11,20,.34) 60%,
                    rgba(7,11,20,.08) 76%,rgba(7,11,20,.24) 100%)}
}

/* A RUA TERMINA EM ARTE. No celular o conteúdo é 3× mais alto que o mural: sem
   esta folga, o mascote, o caixote e a assinatura da Sator nasceriam ATRÁS do
   CNPJ. Espaço acima de 48px é calibragem de colisão, não ritmo (exceção nº 2
   da régua) — aqui ele reserva o pé do muro pra obra. */
@media(max-width:820px){
  footer.site{padding-bottom:260px}
  body.gd-hasbar footer.site{padding-bottom:300px}
}

/* --- celular: o mural recomposto (9:16) tem OUTRO mapa de zonas --- */
@media(max-width:820px){
  .fm-cover{left:0%;top:19.318%;width:91.923%;height:35.227%}  /* re-medido pro mural-v novo (15/07) */
  /* V3 (16/07) · re-medido pro handstyle novo do mural-v (x 89.8–97.2 · y 74.7–78.3) */
  .fm-sator{left:88%;top:72.5%;width:11.5%;height:8.6%}
  /* (o override do risco antigo saiu — o "acende" novo já escala em % do hotspot) */
}

/* ------------------------------------------------------------
   AS POLAROIDS — as fachadas REAIS, coladas com fita

   A foto real não se repinta em IA (regra do briefing): o mural deixou a zona
   semi-calma sem moldura de propósito, e o site cola as fotos por cima, em
   código. O endereço fica FORA da polaroid, em Inter: NAP de loja física é
   dado, não enfeite — quem procura o balcão precisa ler.
   ------------------------------------------------------------ */
.unit-card{background:none;border:none;padding:0;margin-bottom:var(--sp-8);position:relative}
/* margin-top é o teto da fita: as pontas rasgadas sobem ~26px acima da moldura
   e sem essa folga elas encostavam no "// UNIDADES". 232px de papel: num vão
   de 390 a foto da fachada é assunto, não selo. */
.uc-pol{display:block;background:#EDEAE1;padding:var(--sp-2) var(--sp-2) 0;
  width:100%;max-width:232px;margin-top:var(--sp-4);margin-bottom:var(--sp-3);
  transform:rotate(var(--pol-r,-1.6deg));transform-origin:50% 0;
  box-shadow:0 var(--sp-3) var(--sp-6) rgba(0,0,0,.55),0 var(--sp-hair) 0 rgba(255,255,255,.14);
  transition:transform .3s cubic-bezier(.2,.8,.3,1)}
.unit-card:nth-of-type(2) .uc-pol{--pol-r:1.9deg}
.unit-card:hover .uc-pol{transform:rotate(0deg) translateY(-3px)}
/* o <video> da polaroid usa a MESMA regra da <img>: mesma moldura, mesmo quadrado,
   mesmo tratamento de cor. O que muda é só que ele se mexe. O corte é o CENTRO do
   9:16 (já embutido no arquivo) — medido quadro a quadro: o mascote cabe inteiro. */
.uc-pol img,.uc-pol video{display:block;width:100%;aspect-ratio:1;object-fit:cover;
  filter:saturate(.94) contrast(1.04)}
.uc-pol .uc-cap{display:block;font-family:var(--font-tag,'Sedgwick Ave Display',cursive);
  font-weight:400;font-size:var(--fs-lg);line-height:1.5;color:#1A2233;
  padding:var(--sp-2) var(--sp-1);text-align:center}
/* A FITA-CREPE (retocada 12/07): duas pontas atravessadas nos cantos de cima,
   a mesma língua do print do menu (.pv-tape). TRANSLÚCIDA (rgba, não a
   var(--fita-*) chapada): fita de verdade deixa o papel e o muro aparecerem
   por baixo — opaca, a metade que caía na moldura sumia (bege sobre creme) e
   sobrava um toco cortado com cara de post-it. Pontas rasgadas no clip-path:
   fita se arranca com a mão, não com tesoura. */
.uc-fita{position:absolute;width:66px;height:20px;z-index:3;pointer-events:none;
  background:linear-gradient(180deg,rgba(233,222,190,.80),rgba(201,187,147,.72));
  box-shadow:0 var(--sp-hair) var(--sp-1) rgba(0,0,0,.28);
  clip-path:polygon(3% 0,97% 3%,100% 26%,97% 50%,100% 72%,98% 100%,4% 97%,0 74%,3% 48%,0 24%)}
.uc-fita::after{content:"";position:absolute;inset:0;
  background:repeating-linear-gradient(90deg,rgba(255,255,255,.20) 0 2px,transparent 2px 5px)}
.uc-fita.tl{left:-19px;top:-8px;transform:rotate(-38deg)}
.uc-fita.tr{right:-19px;top:-8px;transform:rotate(38deg)}

/* a plaquinha Mercosul, colada na polaroid */
.uc-placa{position:absolute;right:-6px;top:150px;z-index:3;width:86px;
  border:var(--bw-2) solid #E8EEF8;border-radius:var(--r-xs);overflow:hidden;
  transform:rotate(3deg);box-shadow:0 var(--sp-1) var(--sp-3) rgba(0,0,0,.5);font-size:0}
.uc-placa i{display:block;background:linear-gradient(180deg,#1450D8,#0A2E86);
  font-family:var(--font-b);font-style:normal;font-weight:700;font-size:var(--fs-4xs);
  letter-spacing:.1em;color:#CFE0FF;text-align:center;padding:var(--sp-hair) 0}
.uc-placa b{display:block;background:#0D1322;font-family:var(--font-lt,'Bungee',cursive);
  font-weight:400;font-size:var(--fs-2xs);letter-spacing:.06em;color:#fff;text-align:center;
  padding:var(--sp-1) 0}
@media(max-width:1099px){.uc-placa{top:auto;bottom:64px}}

.unit-card .uc-tag{display:none}                  /* o chip PG/STS virou a placa */
.unit-card b{color:#fff;font-size:var(--fs-sm)}
.unit-card span{color:rgba(255,255,255,.68)}
.unit-card .uc-h{color:var(--cyan);opacity:.85}

/* --- a barra legal: o CNPJ não entra na arte --- */
.foot-bottom{border-top-color:rgba(255,255,255,.16)}
@media(min-width:1100px){.foot-bottom{max-width:920px}}

@media(prefers-reduced-motion:reduce){
  .fm-cover{display:none}                          /* a tag já nasce pintada */
  .uc-pol,.unit-card:hover .uc-pol{transition:none;transform:rotate(var(--pol-r,-1.6deg))}
}

/* --- retoques do rodapé-mural (2ª volta, olhando o screenshot) --- */

/* O FANTASMA MORREU. `footer.site .wrap::before` escrevia "a 01 do litoral" em
   Sedgwick a 170px, 4,5% de opacidade, atravessado no rodapé. Era a melhor
   solução que existia ANTES do mural — um eco tipográfico da tag. Agora o
   mascote picha a frase em tinta de verdade, na parede. Dois "a 01 do litoral"
   na mesma tela, um deles falso, é um a mais. */
footer.site .wrap::before{content:none}

/* a placa grande do bloco da marca sai: as placas agora moram nas polaroids,
   uma por unidade — que é onde placa de carro faz sentido */
.foot-brand .placa-gd{display:none}

/* a legenda da polaroid É o nome da unidade (o mesmo nó <b>, movido pra dentro
   da moldura). Sem cópia: duplicar o nome dava "Praia Grande" duas vezes. */
/* ------------------------------------------------------------
   A LEGENDA É LETREIRO (G7 · 11/07)

   A 1ª versão escrevia o nome à mão (Sedgwick) a 16px, tinta escura, alinhado à
   esquerda e com 76px de padding reservado pra não bater na placa. Três apertos
   somados: a fonte mais difícil do site, no menor corpo, no vão mais estreito.
   Dava pra ler — com esforço. E o nome da unidade não é enfeite: é NAP, o dado
   que manda o cliente ao balcão.

   Agora ele é LETREIRO — Bungee em caixa alta, a mesma voz da placa Mercosul
   logo ao lado (uma margem, uma língua). O que sobra do nome ("Global Express",
   "Cidade Ocian") vira sublinha em Inter, discreta. A margem branca cresce pra
   caber os dois em vez de espremê-los: numa polaroid de verdade a legenda tem
   folga em volta. O clima de rua não estava na letra cursiva — está na foto
   torta, na fita e na placa.
   ------------------------------------------------------------ */
.uc-pol .uc-cap{font-family:var(--font-lt,'Bungee',cursive) !important;
  font-weight:400;font-size:var(--fs-base);line-height:1.06;letter-spacing:.005em;
  text-transform:uppercase;color:#141C2B;
  padding:var(--sp-3) 78px var(--sp-4) var(--sp-3);text-align:left}
/* a sublinha cabe em UMA linha: "GLOBAL EXPRESS" a .16em de tracking estourava
   os ~115px que sobram ao lado da placa e quebrava em duas */
.uc-pol .uc-cap i{display:block;margin-top:var(--sp-2);
  font-family:var(--font-b);font-style:normal;font-weight:700;
  font-size:var(--fs-3xs);letter-spacing:.10em;text-transform:uppercase;
  color:rgba(20,28,43,.72)}

/* O PAPEL NÃO HERDA O MURAL. O rodapé inteiro carrega text-shadow escuro pra
   ler sobre a arte (§ footer.site > .wrap) — e ela vazava pra DENTRO da
   polaroid: tinta escura com sombra escura borrada sobre papel claro vira
   letra fantasma. Papel é opaco; dentro dele, sombra nenhuma. */
.uc-pol,.uc-pol *{text-shadow:none}

/* a plaquinha é colada NA polaroid (não no card), na margem branca de baixo */
.uc-pol{position:relative}
/* 8px é o piso da régua (micro-lettering de rua: comanda, plaqueta, selo).
   A placa cresce 4px pra caber o "BRASIL" nesse degrau — a régua manda no tipo,
   o tipo manda no objeto. Ela desce pro canto (`bottom:sp-3`) e o letreiro fica
   com a linha de cima inteira: os dois moram na margem sem disputar. */
.uc-placa{top:auto;bottom:var(--sp-3);right:var(--sp-3);width:68px;transform:rotate(-2deg)}
.uc-placa i{font-size:var(--fs-4xs);letter-spacing:.08em}
.uc-placa b{font-size:var(--fs-3xs);letter-spacing:.02em}
@media(max-width:1099px){.uc-placa{bottom:var(--sp-3)}}

/* O ZAP RECOLHE NO FIM DA RUA.
   O FAB é `fixed` no canto inferior direito — exatamente onde a Sator assina a
   obra. Chegando ao rodapé ele cobria o sticker E o link. Some ali: a essa
   altura o telefone já está na tela, em texto, duas vezes. (Mesma armadilha do
   símbolo-porta × CNPJ: botão flutuante fixo cobre o rodapé.) */
.gd-wafab.no-fim{opacity:0;transform:translateY(12px) scale(.94);pointer-events:none}

/* ============================================================
   TRILHO G · A EMPRESA v2 (G6 · 10/07/2026)

   Três frentes:
     1. O HERO ganha a parede da casa e, pichado atrás do título, o dado mais
        forte da firma: ela está de pé DESDE 2005.
     2. "NOSSA ESTRADA" é REFEITA. Era uma pista de asfalto em CSS — bonita, mas
        genérica: qualquer timeline do mundo tem uma linha vertical com bolinhas.
        Vira uma linha de SPRAY que se desenha no scroll, e cada marco é feito de
        MATERIAL REAL: a foto da fachada, a plaqueta de máquina, o letreiro.
        É o que mata a cara de IA — fotografia de verdade no meio do desenho.
     3. Os DIVISORES da casa (nascidos na G4) entram nas seções grudadas.

   ⚠️ `grafite-2005.png` ainda não chegou. O slot nasce com FALLBACK em tipo
   (Bungee vazada + escorridos em CSS) — o briefing previu isso: "a página entra
   no ar com um fallback em fonte de spray e troca pela arte quando ela chegar".
   Enquanto o PNG não existe, `GD_2005.pronto` é `false` e NENHUM `<img>` é
   criado — mesma regra do `GD_SOM_PRONTO` (R10) e do `GD_PICHOS` (G2): arquivo
   ausente daria 404, e "0 request quebrado" é gate da casa.
   ============================================================ */

/* --- 1. o hero da empresa encosta no muro --- */
[data-muro="EMPRESA"] .gd-muro{--mz:132%;--mp:72% 28%;--mo:.10}
@media(max-width:820px){[data-muro="EMPRESA"] .gd-muro{--mz:270%;--mp:66% 30%;--mo:.13}}

.ph-copy{position:relative}
/* desce e recua: em `top:-6%` a palavra "desde" caía em cima do eyebrow
   "A EMPRESA". A peça é FUNDO — ela passa ATRÁS do título, não antes dele. */
.gd-2005{position:absolute;left:-5%;top:9%;width:min(560px,92%);z-index:0;
  pointer-events:none;user-select:none;transform:rotate(-2deg)}
.ph-copy > *:not(.gd-2005){position:relative;z-index:1}
.gd-2005 img{display:block;width:100%;height:auto;opacity:.16}

/* o fallback: throw-up vazado. A Bungee é a voz do LETREIRO — números, índices,
   stamps. É a única das quatro que desenha dígito com corpo de bolha. */
.gd-2005 .f-desde{display:block;margin-left:var(--sp-16);
  font-family:var(--font-tag,'Sedgwick Ave Display',cursive);font-size:var(--fs-2xl);
  line-height:1;color:var(--cyan);opacity:.26;transform:rotate(-4deg)}
.gd-2005 .f-num{display:block;position:relative;
  font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:clamp(96px,13vw,180px);line-height:.86;letter-spacing:.02em;
  color:rgba(238,242,250,.07);
  -webkit-text-stroke:3px rgba(46,116,255,.30);
  text-shadow:0 var(--sp-hair) 0 rgba(10,46,134,.22)}
.gd-2005 .f-num i{position:absolute;bottom:2px;width:3px;border-radius:0 0 var(--r-2xs) var(--r-2xs);
  background:linear-gradient(180deg,rgba(46,116,255,.30),rgba(46,116,255,0));font-style:normal}
.gd-2005 .f-num i:nth-child(1){left:14%;height:34px}
.gd-2005 .f-num i:nth-child(2){left:41%;height:20px}
.gd-2005 .f-num i:nth-child(3){left:76%;height:44px}
/* no celular a peça nasce mais baixa (a `-2%` o "2" era cortado pelo topo do
   hero) e mais apagada — a coluna é estreita e ela é FUNDO, não assunto. */
@media(max-width:820px){.gd-2005{opacity:.5;top:7%;left:-8%}}

/* ------------------------------------------------------------
   2. A ESTRADA DE SPRAY

   A linha é UM path com `pathLength="1"`: o dash math independe do tamanho real
   do traço, então a mesma regra serve pro desktop e pro celular sem recalcular
   `stroke-dasharray` a cada breakpoint.

   Desenha 1×, `forwards`, quando a seção entra na tela (`.gd-anim` → `.gd-go`,
   a mesma máquina do resto do site). Doutrina de movimento: scroll anima uma
   vez, nunca em loop.
   ------------------------------------------------------------ */
.tl-spray .gd-tl-road{display:none}          /* o asfalto se aposenta */
.tl-spray{position:relative;padding-bottom:128px}   /* a seta + a lata + a assinatura precisam de chão */

/* A linha PARA antes da seta: sobrepostas, viravam traço duplo e a seta deixava
   de ser a ponta da estrada.
   ⚠️ `top:0; bottom:112px` NÃO FUNCIONA aqui. Um `<svg>` com `viewBox` é um
   elemento SUBSTITUÍDO: ele tem razão de aspecto intrínseca (64:1000), e numa
   caixa sobre-restringida o `height:auto` vence — o `bottom` é ignorado em
   silêncio. A linha nascia com 1000px e atravessava a lata. Altura explícita. */
.tl-linha{position:absolute;left:50%;top:0;height:calc(100% - 150px);width:64px;
  transform:translateX(-50%);overflow:visible;pointer-events:none}
.tl-traco{fill:none;stroke:var(--cyan);stroke-width:5;stroke-linecap:round;
  stroke-dasharray:1;stroke-dashoffset:1;opacity:.62;
  filter:drop-shadow(0 0 6px rgba(56,225,242,.35))}
.gd-go .tl-traco{animation:tlDesenha 2.4s cubic-bezier(.45,.05,.3,1) forwards}
@keyframes tlDesenha{to{stroke-dashoffset:0}}

/* os pingos que a lata deixou cair na descida (aparecem junto com o traço) */
.tl-pingo{fill:var(--cyan);opacity:0}
.gd-go .tl-pingo{animation:tlPingo .5s ease forwards}
.gd-go .tl-pingo:nth-of-type(1){animation-delay:.7s}
.gd-go .tl-pingo:nth-of-type(2){animation-delay:1.3s}
.gd-go .tl-pingo:nth-of-type(3){animation-delay:1.9s}
@keyframes tlPingo{to{opacity:.5}}

/* o marco de spray no lugar da bolinha */
.tl-spray .gd-tl-dot{background:var(--cyan);box-shadow:0 0 0 6px rgba(56,225,242,.10),0 0 18px rgba(56,225,242,.45)}

/* --- o MATERIAL de cada marco (é aqui que a cara de IA morre) --- */
.tl-mat{position:relative;margin-bottom:var(--sp-3)}

/* ⚠️ ESPECIFICIDADE. Os três materiais são `<span>`, e a timeline já tinha
   `.gd-tl-card span{display:block}` (0,1,1). Um `.tl-pol{display:inline-block}`
   (0,1,0) PERDE — a polaroid virava bloco de largura cheia, a plaqueta SCAPEX
   esticava até a borda e o neon virava uma barra. Escopar em `.tl-mat` empata a
   conta e devolve o inline-block. (Mesma armadilha do `.scrolled` do HUD na R4:
   estado novo tem que casar a especificidade do seletor base.) */
.tl-mat .tl-pol{display:inline-block}
.tl-mat .tl-placa{display:inline-flex}
.tl-mat .tl-neon{display:inline-block}

/* polaroid da fachada REAL */
/* largura FIXA, não `width:100%`: como `.tl-mat` herda o `text-align` do card
   (direita nas linhas `l`, esquerda nas `r`), a polaroid só encosta na linha do
   spray se ela não ocupar a coluna inteira. Com 100% ela ficava colada na borda
   oposta e parecia solta da estrada. */
.tl-pol{display:inline-block;background:#EDEAE1;padding:var(--sp-2) var(--sp-2) 0;width:184px;
  transform:rotate(var(--r,-2.2deg));box-shadow:0 var(--sp-3) var(--sp-6) rgba(0,0,0,.55)}
.tl-pol img{display:block;width:100%;aspect-ratio:1;object-fit:cover;filter:saturate(.94) contrast(1.04)}
.tl-pol span{display:block;font-family:var(--font-tag,'Sedgwick Ave Display',cursive);
  font-size:var(--fs-sm);color:#1A2233;padding:var(--sp-2) var(--sp-1)}
.gd-tl-row.r .tl-pol{--r:2.4deg}

/* plaqueta de máquina gravada (o material do lado peças, FX.05) */
.tl-placa{display:inline-flex;flex-direction:column;gap:var(--sp-1);
  background:linear-gradient(160deg,#39414E,#20262F);
  border:var(--bw-1) solid rgba(255,255,255,.16);border-radius:var(--r-xs);
  padding:var(--sp-3) var(--sp-5);box-shadow:inset 0 var(--bw-1) 0 rgba(255,255,255,.16),0 var(--sp-2) var(--sp-5) rgba(0,0,0,.5);
  transform:rotate(-1deg);position:relative}
.tl-placa::before,.tl-placa::after{content:"";position:absolute;width:6px;height:6px;border-radius:var(--r-full);
  background:radial-gradient(circle at 35% 30%,#C6CDD8,#5A6270);box-shadow:inset 0 -1px 1px rgba(0,0,0,.6)}
.tl-placa::before{left:6px;top:6px}
.tl-placa::after{right:6px;bottom:6px}
.tl-placa b{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;font-size:var(--fs-xs);
  letter-spacing:.16em;color:#E6ECF5}
.tl-placa span{font-size:var(--fs-3xs);letter-spacing:.14em;color:#96A2B4;text-transform:uppercase}
/* T2·S3 (20/07): no marco SCAPEX a placa virou o marco INTEIRO (decisão do
   Anthony: "uma placa de metal única", sem texto repetido embaixo) — versão
   maior, gravação em duas linhas, mesmos parafusos */
.tl-mat .tl-placa.solo{padding:var(--sp-4) var(--sp-6);gap:var(--sp-2)}
.tl-placa.solo b{font-size:var(--fs-md);letter-spacing:.2em}
.tl-placa.solo span{font-size:var(--fs-2xs);letter-spacing:.16em;max-width:26ch}

/* letreiro de neon (a loja online é a única coisa aberta 24h — e é verdade) */
.tl-neon{display:inline-block;padding:var(--sp-2) var(--sp-5);border:var(--bw-2) solid var(--cyan);
  border-radius:var(--r-full);font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:var(--fs-xs);letter-spacing:.18em;color:var(--cyan);
  text-shadow:0 0 10px rgba(56,225,242,.75);box-shadow:0 0 14px rgba(56,225,242,.28),inset 0 0 14px rgba(56,225,242,.14);
  transform:rotate(-1.2deg)}

/* --- a ponta: a seta fresca e a lata. A obra não acabou. --- */
.tl-fim{position:absolute;left:50%;bottom:0;transform:translateX(-50%);text-align:center;width:260px}
.tl-fim svg{display:block;margin:0 auto;width:56px;height:56px;overflow:visible}
.tl-fim .lata{width:64px;height:42px;transform:rotate(-12deg) translateY(-6px);margin-top:var(--sp-1)}
.tl-fim .seta{fill:none;stroke:var(--cyan);stroke-width:5;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:1;stroke-dashoffset:1;filter:drop-shadow(0 0 6px rgba(56,225,242,.4))}
.gd-go .tl-fim .seta{animation:tlDesenha .8s ease-out 2.2s forwards}
.tl-fim .lata{opacity:0;transform:translateY(-6px)}
.gd-go .tl-fim .lata{animation:tlLata .5s cubic-bezier(.2,1.4,.4,1) 2.9s forwards}
@keyframes tlLata{to{opacity:1;transform:rotate(-12deg)}}   /* ela CAI e fica deitada */
.tl-fim em{display:block;margin-top:var(--sp-3);font-style:normal;
  font-family:var(--font-tag,'Sedgwick Ave Display',cursive);font-size:var(--fs-lg);
  color:var(--cyan);opacity:0}
.gd-go .tl-fim em{animation:tlPingo .6s ease 3.2s forwards}

@media(max-width:820px){
  .tl-fim{width:200px}
  .tl-pol{width:150px}
}
@media(max-width:560px){
  /* a estrada encosta na régua do mobile (a mesma coluna de 40px dos dots).
     A ponta fica CENTRADA na linha (só a seta e a lata), e a assinatura corre
     pra direita: com `width:200px` + `translateX(-50%)` sobre `left:19px` ela
     nascia metade fora da tela. */
  .tl-linha{left:19px}
  .tl-fim{left:19px;width:64px;transform:translateX(-50%)}
  .tl-fim em{position:absolute;left:50%;top:100%;margin-top:var(--sp-2);
    transform:translateX(-8px);white-space:nowrap;text-align:left}
}
@media(prefers-reduced-motion:reduce){
  .tl-traco,.tl-fim .seta{stroke-dashoffset:0;animation:none}
  .tl-pingo,.tl-fim em{opacity:.5;animation:none}
  .tl-fim .lata{opacity:1;transform:rotate(-12deg);animation:none}
  .gd-2005{transform:rotate(-2deg)}
}

/* ============================================================
   O ATO DO "FECHOU" — o fecho da compra (11/07/2026)

   Compra fechada não termina com um check verde de banco: termina como
   negócio fechado na rua. A porta de aço da casa DESCE sobre o checkout,
   dá o tranco, o CARIMBO bate no aço ("FECHOU. · pedido #1042") e a porta
   SOBE revelando a cena nova — o mascote comemorando, a chuva de sticker e
   a PLACA do pedido, que assenta como documento de carro.

   Nada aqui é vocabulário novo: é a mesma #gd-porta que abre a loja (R4),
   o mesmo carimbo que bate no drop (R7) e o mesmo jeito de chover sticker
   do easter egg do logo (8). O ato só junta as peças da casa no momento em
   que o cliente mais merece. Coreografia no `gdAtoFechou` (main.js).

   ⚠️ A chuva é de PALAVRA, não de boneco: todo sticker do pack real É o
   mascote, e 20 mini-mascotes caindo sobre o mascote grande quebrariam a lei
   G3/R8 ("o personagem não repete na tela") e virariam sopa. Herói da cena
   é UM: o que comemora.
   ------------------------------------------------------------ */

/* --- 1 · a porta em modo FECHO: o aço entrega o centro pro carimbo --- */
#gd-porta.fechou .gdd-art{display:none}
#gd-porta.bateu .gdd-door{animation:fxImpacto .34s cubic-bezier(.2,.9,.3,1)}
@keyframes fxImpacto{
  0%{transform:translateY(0)}   18%{transform:translateY(5px)}
  46%{transform:translateY(-3px)}   72%{transform:translateY(1.5px)}
  100%{transform:translateY(0)}
}

/* --- 2 · o CARIMBO que bate no aço ---
   Mora DENTRO da .gdd-door de propósito: quando a porta sobe, ele sobe junto
   (carimbo é tinta no aço, não legenda flutuando na frente dele). */
.fx-stamp{position:absolute;left:50%;top:42%;z-index:5;width:92%;pointer-events:none;text-align:center;
  opacity:0;transform:translate(-50%,-50%) scale(2.7) rotate(-6deg);
  animation:fxStamp .4s cubic-bezier(.16,1.25,.3,1) forwards}
.fx-stamp .l1{position:relative;z-index:1;display:block;font-family:var(--font-gt);line-height:.95;
  font-size:clamp(56px,13vw,124px);
  background:linear-gradient(180deg,#FFFFFF,#C6D6F0 46%,#FFFFFF 52%,#A6BBDD 70%,#EFF5FF 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 4px 0 rgba(0,0,0,.7)) drop-shadow(0 0 34px rgba(127,179,255,.5))}
.fx-stamp .l2{position:relative;z-index:1;display:block;font-family:var(--font-tag);font-size:var(--fs-2xl);
  color:var(--cyan);transform:rotate(-2deg);margin-top:var(--sp-2);
  text-shadow:0 0 26px rgba(56,225,242,.7);font-variant-numeric:tabular-nums}
@keyframes fxStamp{
  from{opacity:0;transform:translate(-50%,-50%) scale(2.7) rotate(-6deg)}
  to{opacity:1;transform:translate(-50%,-50%) scale(1) rotate(-6deg)}
}
/* o pó da tinta: o halo que abre no impacto e evapora */
.fx-stamp::before{content:"";position:absolute;left:50%;top:50%;z-index:0;width:120%;height:160%;
  border-radius:999px;pointer-events:none;
  background:radial-gradient(circle,rgba(56,225,242,.32),rgba(46,116,255,.1) 46%,transparent 70%);
  animation:fxPo .7s ease-out forwards}
@keyframes fxPo{
  from{opacity:.9;transform:translate(-50%,-50%) scale(.5)}
  to{opacity:0;transform:translate(-50%,-50%) scale(1.3)}
}

/* --- 3 · a CHUVA de sticker (palavra) ---
   Container fixed com overflow:hidden e filhos ABSOLUTE: sticker que vaza pela
   lateral é clipado ali dentro e nunca vira scroll horizontal no celular.

   ⚠️ O z-index 0 é o que faz a peça funcionar: a chuva cai ATRÁS da cena (o
   .wrap do checkout é z-index 1), então mascote, placa e texto ficam SEMPRE por
   cima dela. Na 1ª volta ela caiu na FRENTE (z 4990) e, em 390px, sepultou a
   cara do boneco e o "Tá no corre". Festa no fundo, herói na frente. */
.fx-rain{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.fx-stk{position:absolute;top:-80px;white-space:nowrap;
  font-family:var(--font-tag);font-size:var(--fs-lg);color:#fff;
  background:linear-gradient(120deg,#2E74FF,#0A2E86);
  border:var(--bw-2) solid #F2F6FF;box-shadow:3px 4px 0 rgba(0,0,0,.5);
  padding:var(--sp-2) var(--sp-3);
  animation:fxCai var(--t,2.6s) cubic-bezier(.3,.1,.6,1) forwards}
.fx-stk.v2{background:radial-gradient(circle at 32% 28%,#18243E,#0B1220);color:var(--cyan);
  font-family:var(--font-gt);font-size:var(--fs-2xl)}
.fx-stk.v3{background:var(--ok);color:#0A2818;font-family:var(--font-d);font-weight:800;
  font-size:var(--fs-xs);letter-spacing:.1em}
.fx-stk.v4{background:#fff;color:#0A1428;font-family:var(--font-gt);font-size:var(--fs-2xl)}
.fx-stk.v5{background:linear-gradient(120deg,var(--cyan),#12B8D6);color:#04121E;
  font-family:var(--font-lt);font-size:var(--fs-2xs);letter-spacing:.08em}
@keyframes fxCai{
  0%{transform:translateY(0) rotate(var(--r0,-8deg))}
  100%{transform:translateY(122vh) rotate(var(--r1,14deg))}
}
/* no celular a festa encolhe: sticker de desktop em 390px vira placa de trânsito
   e engole a cena que ele deveria enfeitar. (Onde ele CAI, quem decide é o
   gdChuvaFechou: as faixas laterais deixam o corredor do herói livre.) */
@media(max-width:880px){
  .fx-stk{font-size:var(--fs-sm);padding:var(--sp-1) var(--sp-2);box-shadow:2px 3px 0 rgba(0,0,0,.5)}
  .fx-stk.v2,.fx-stk.v4{font-size:var(--fs-lg)}
  .fx-stk.v3{font-size:var(--fs-3xs)}
}

/* --- 4 · a CENA revelada: a placa assenta e o resto sobe ---
   A porta sobe de baixo pra cima, então o TOPO da cena é o último a aparecer.
   Por isso a coreografia da cena espera (~0,8s) em vez de nascer junto com o
   swap: sem o atraso, o mascote pula atrás do aço e ninguém vê. */
.co-placa{margin:0 auto var(--sp-5)}
#co-success.fx-cena .co-mascote img{
  animation:mascotePop .6s cubic-bezier(.2,1.5,.4,1) .78s both,
            mascoteFloat 3.6s ease-in-out 1.38s infinite}
/* Tempero (Atlas ats26 + shk05, provada 06/08/2026): a placa não assenta mais —
   ela CARIMBA. Entra grande, bate no papel (impacto na cena inteira), e um anel
   de tinta se dissipa. O delay 1.02s respeita a porta: o carimbo do aço é dela. */
#co-success.fx-cena .co-placa{animation:fxPlaca .55s cubic-bezier(.2,1.35,.3,1) 1.02s both,
  fxPlacaRing .5s ease-out 1.36s}
#co-success.fx-cena{animation:fxImpacto .26s linear 1.34s}
#co-success.fx-cena h2{animation:fxSobe .45s ease .92s both}
#co-success.fx-cena #success-msg{animation:fxSobe .45s ease 1.06s both}
#co-success.fx-cena .note{animation:fxSobe .45s ease 1.18s both}
#co-success.fx-cena .btn{animation:fxSobe .45s ease 1.3s both}
@keyframes fxPlaca{
  0%{opacity:0;transform:scale(2.2) rotate(-4deg)}
  60%{opacity:1;transform:scale(.94) rotate(.5deg)}
  100%{opacity:1;transform:none}
}
@keyframes fxPlacaRing{
  0%{box-shadow:0 0 0 0 rgba(14,90,230,.45)}
  100%{box-shadow:0 0 0 16px rgba(14,90,230,0)}
}
@keyframes fxImpacto{0%,100%{transform:none}30%{transform:translate(2px,-2px)}60%{transform:translate(-2px,2px)}80%{transform:translate(1px,-1px)}}
@keyframes fxSobe{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

/* o número do pedido para quem lê com leitor de tela (a placa é decorativa) */
.fx-a11y{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

@media(prefers-reduced-motion:reduce){
  .fx-rain,.fx-stamp{display:none!important}
  #co-success.fx-cena,#co-success.fx-cena .co-mascote img,#co-success.fx-cena .co-placa,
  #co-success.fx-cena h2,#co-success.fx-cena #success-msg,#co-success.fx-cena .note,
  #co-success.fx-cena .btn{animation:none}
}

/* ============================================================================
   TRILHO P · O QG NO SITE (13/07/2026)
   O que o Renan mexe no painel, o site veste aqui.
   ========================================================================= */

/* ---------- A BARRA DE AVISO (P3) ----------
   Nasce no topo de tudo, empurra a página (não cobre nada), tem X e some sozinha
   na validade. Fica ACIMA do HUD: aviso que o HUD tampa não é aviso. */
.gd-aviso{
  position:relative;z-index:400;display:flex;align-items:center;justify-content:center;gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-8) var(--sp-3) var(--sp-4);text-align:center;
  font-size:var(--fs-13);font-weight:600;line-height:1.35;
  background:linear-gradient(90deg,#0E1A2E,#12233D);color:#EAF2FF;
  border-bottom:1px solid rgba(56,225,242,.28);
}
.gd-aviso.urgente{background:linear-gradient(90deg,#3A2405,#5A3A08);border-bottom-color:rgba(245,166,35,.5);color:#FFE9C4}
.gd-aviso.festa{background:linear-gradient(90deg,#05262E,#073A46);border-bottom-color:rgba(56,225,242,.55);color:#D6FBFF}
.gd-aviso-t{max-width:70ch}
.gd-aviso-l{color:var(--cyan);text-decoration:none;font-weight:700;white-space:nowrap}
.gd-aviso-l:hover{text-decoration:underline}
.gd-aviso-x{
  position:absolute;right:var(--sp-2);top:50%;transform:translateY(-50%);
  width:32px;height:32px;border:none;border-radius:var(--r-full);cursor:pointer;
  background:transparent;color:inherit;opacity:.5;font-size:var(--fs-13);line-height:1;
}
.gd-aviso-x:hover{opacity:1;background:rgba(255,255,255,.1)}
@media(max-width:600px){
  .gd-aviso{font-size:var(--fs-12);padding:var(--sp-2) var(--sp-10) var(--sp-2) var(--sp-3);flex-wrap:wrap;gap:var(--sp-1)}
}

/* ---------- AS MOLDURAS (P3) ----------
   Uma moldura, três formas. O ARQUIVO decide qual (o painel mede na hora do
   upload e grava largura/altura). Sem `data-forma`, tudo segue como sempre foi
   (vertical, o padrão dos tours do Renan). */

/* TOTEM (vertical 9:16) — é o default do .tour-cam, nada a fazer. */

/* CINEMA (horizontal 16:9): a moldura ganha a largura toda e o texto desce.
   O grid de 320px+1fr vira uma coluna só — senão o vídeo deitado ficaria
   espremido numa coluna de 320px e a seção inteira ficaria torta. */
.tour[data-forma="horizontal"]{grid-template-columns:minmax(0,1fr);gap:var(--sp-8)}
.tour[data-forma="horizontal"].flip{grid-template-columns:minmax(0,1fr)}
.tour[data-forma="horizontal"].flip .tour-cam,
.tour[data-forma="horizontal"].flip .tour-info{grid-column:1;grid-row:auto}
.tour-cam[data-forma="horizontal"]{aspect-ratio:16/9}
.tour[data-forma="horizontal"] .tour-info{max-width:64ch}

/* CARD (quadrado) */
.tour[data-forma="quadrado"]{grid-template-columns:minmax(0,420px) minmax(0,1fr)}
.tour[data-forma="quadrado"].flip{grid-template-columns:minmax(0,1fr) minmax(0,420px)}
.tour-cam[data-forma="quadrado"]{aspect-ratio:1/1}

/* FOTO na moldura: sem barra de story, sem chips de som — a moldura fica, a
   parafernália de vídeo sai. */
.tour-cam .mold-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.tour-cam.is-foto{cursor:default}
.tour-cam.is-foto:hover{transform:none}

/* a moldura solta (contato.html): mesma linguagem, sem o par de texto ao lado */
.mold-solo{max-width:420px;margin:0 auto var(--sp-10)}
.mold-solo[data-forma="horizontal"]{max-width:820px}
.mold-solo[data-forma="quadrado"]{max-width:520px}
@media(max-width:820px){
  .tour[data-forma="quadrado"],
  .tour[data-forma="quadrado"].flip{grid-template-columns:minmax(0,1fr)}
  .mold-solo{max-width:100%}
}

/* ============================================================================
   TRILHO M · MOBILE COUTURE (20/07/2026)
   ~80% do tráfego é celular, e "responsivo" não é "desenhado pro celular":
   o site cabia na tela mas o chrome brigava com o conteúdo e as seções de
   desktop empilhadas viravam túnel. Quatro fases, um bloco só no fim do CSS
   (vence por ordem de fonte — a mesma técnica do tema escuro):
   · M1 A MOLDURA  — scrims de mergulho, dock alinhado, zap vestindo a casa,
                     PDP com chrome dinâmico (body.bs-on, ver as regras da
                     porta/DJ/zap nos blocos originais).
   · M2 AS SEÇÕES  — placa de SAÍDA deitada, diferenciais em linha, .m-trim
                     (a versão curta do parágrafo no celular). O drop do hero
                     disparado pelo PALCO vive no main.js.
   · M3 O CARD     — categoria em 1 linha, tape sem colisão, preço no lugar.
   · M4 O TOQUE    — o dedo não tem hover: o toque responde com o corpo.
   ========================================================================= */

/* ---------- M1 · SCRIMS DE MERGULHO ----------
   O conteúdo afunda na sombra ANTES de passar sob o chrome — acaba a sopa de
   letra atrás do logo e do dock. z:105 = acima do conteúdo, abaixo de tudo
   que flutua (buy-sticky 110 · DJ 120 · zap 130 · menu 200 · HUD 300).
   `body.gd-street` só existe onde o HUD existe (initHud marca); caixa, painel
   e CRM ficam automaticamente de fora. */
@media(max-width:760px){
  body.gd-street::before{content:"";position:fixed;left:0;right:0;top:0;height:88px;
    z-index:105;pointer-events:none;
    background:linear-gradient(180deg,rgba(5,8,16,.94) 0%,rgba(5,8,16,.5) 52%,transparent 100%);
    opacity:0;transition:opacity .35s ease}
  body.gd-street.gd-scrolled::before{opacity:1}
  body.gd-street::after{content:"";position:fixed;left:0;right:0;bottom:0;height:84px;
    z-index:105;pointer-events:none;
    background:linear-gradient(0deg,rgba(5,8,16,.92) 0%,rgba(5,8,16,.48) 46%,transparent 100%)}

  /* o DOCK: os três moradores do rodapé na mesma linha de base, com a folga
     do gesto do iPhone (safe-area). O alvo da porta segue >=44px (WCAG). */
  .hud-porta{bottom:calc(12px + env(safe-area-inset-bottom))}
  .gd-dj{bottom:calc(12px + env(safe-area-inset-bottom))}
  .gd-wafab{right:12px;bottom:calc(14px + env(safe-area-inset-bottom))}

  /* o ZAP veste a casa: chip de vidro escuro como os irmãos de dock — o balão
     branco era o único objeto fora da paleta na tela. O verde oficial fica
     onde importa: no símbolo. */
  .gd-wafab{background:rgba(10,16,28,.82);border:1px solid rgba(255,255,255,.14);
    -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
    box-shadow:0 10px 26px rgba(0,0,0,.5)}
  .gd-wafab .wa-ic{width:44px;height:44px;margin:var(--sp-1)}
  .gd-wafab .wa-ic svg{width:22px;height:22px}
}

/* ---------- M2 · AS SEÇÕES RE-COREOGRAFADAS ---------- */
/* a versão curta do celular: enumeração vira respiro (o dado que ela carregava
   mora nos trust items / FAQ — nada se perde, só desengorda) */
@media(max-width:560px){ .m-trim{display:none} }

/* AS SAÍDAS deitam: placa de rodovia lida DE LADO (pictograma → destino → vai),
   4 placas de ~100px em vez de 4 slabs de 450px de azul quase vazio.
   Tudo da placa fica: orla, parafusos, tarja SAÍDA, farol, sticker. */
@media(max-width:480px){
  .gd-placa{min-height:0;display:grid;grid-template-columns:44px minmax(0,1fr);
    grid-template-areas:"ico tit" "ico sub" "ico go";
    align-items:center;column-gap:var(--sp-4);row-gap:var(--sp-hair);
    padding:var(--sp-5) var(--sp-5) var(--sp-4) var(--sp-4)}
  .pl-ico{grid-area:ico;width:44px;height:44px;margin:0;align-self:center}
  .gd-placa b{grid-area:tit;margin:0;font-size:var(--fs-base)}
  .pl-sub{grid-area:sub;margin:0}
  .pl-go{grid-area:go;margin-top:var(--sp-1)}
  .pl-stk{top:auto;bottom:-8px;right:var(--sp-3)}
}

/* os DIFERENCIAIS viram linhas de balcão (ícone à esquerda), não 4 caixões
   empilhados de altura cheia */
@media(max-width:520px){
  .feat-grid{gap:var(--sp-3)}
  .feat{display:grid;grid-template-columns:44px minmax(0,1fr);column-gap:var(--sp-4);
    row-gap:var(--sp-1);align-items:start;padding:var(--sp-4)}
  .feat .fi{width:44px;height:44px;margin:0;grid-row:1/span 2}
  .feat h3{font-size:var(--fs-base);margin:0}
}

/* ---------- M3 · O CARD DE PRODUTO COUTURE ----------
   A 390px cada coluna tem ~165px: categoria não pode quebrar (desalinhava os
   pares), tape não pode rodopiar em cima da vizinha, e o preço + carrinho
   precisam caber DENTRO do card. */
@media(max-width:560px){
  .prod-grid,.prod-grid.g3{gap:var(--sp-3)}
  .card-prod .body{padding:var(--sp-3) var(--sp-3) var(--sp-4);gap:var(--sp-2)}
  .card-prod .cat{font-size:var(--fs-3xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .card-prod .name{font-size:var(--fs-sm);min-height:37px}
  .card-prod .rating{font-size:var(--fs-2xs)}
  .card-prod .price{min-width:0}
  .price b{font-size:var(--fs-lg)}
  .price .old,.price .pix{font-size:var(--fs-2xs)}
  .card-prod .price-row{gap:var(--sp-2)}
  .add-btn{width:40px;height:40px;border-radius:var(--r-md)}
  .add-btn svg{width:18px;height:18px}
  /* as tapes: menores, SEM quebra de linha e sempre por cima da foto e do
     boneco (a colisão "DISTRIBUIDOR OFICIAL em cima do EM ESTOQUE" morre aqui) */
  .card-prod .thumb .p-badges{top:var(--sp-2);left:var(--sp-2);gap:var(--sp-1);z-index:4}
  .card-prod .thumb .badge{font-size:var(--fs-3xs);padding:var(--sp-1) var(--sp-2);white-space:nowrap}
}

/* ---------- M4 · O TOQUE RESPONDE ----------
   No dedo não existe hover: o feedback é físico — aperta, cede; solta, volta.
   Só em tela de toque (hover:none), pra não sujar o desktop. */
@media(hover:none) and (pointer:coarse){
  body{-webkit-tap-highlight-color:transparent}
  .card-prod{transition:transform .16s ease}
  .gd-wafab .wa-ic{transition:transform .15s ease}
  .btn:active{transform:scale(.97)}
  .card-prod:active{transform:scale(.985)}
  .gd-placa:active{filter:brightness(1.16)}
  .ma-row a:active{transform:rotate(var(--rot)) scale(1.07)}
  .kb-opt:active,.kb-goal:active{transform:scale(.98)}
  .hud-chip:active{transform:scale(.94)}
  .gd-wafab:active .wa-ic{transform:scale(.92)}
  .gd-dj:active{transform:scale(.95)}
}
@media(prefers-reduced-motion:reduce){
  .btn:active,.card-prod:active,.ma-row a:active,.kb-opt:active,.kb-goal:active,
  .hud-chip:active,.gd-wafab:active .wa-ic,.gd-dj:active{transform:none}
  /* o FOCO da fileira (C) não é decorativo, é leitura: mantém o apagar dos
     vizinhos, mas sem a animação — quem pede menos movimento não pede menos
     contraste. A aba do canto (A) some, que essa sim é enfeite. */
  .ma-row a,.ma-row:hover a{transition:none}
  .ma-row a::after{display:none}
  .ma-row a:hover,.ma-row a:focus-visible{transform:rotate(var(--rot))}
}

/* ============================================================================
   EMP.03 · A TRAJETÓRIA — A ESTRADA (17/08/2026)

   O texto institucional do Renan ("Nossa Trajetória") virou a parte "A empresa"
   do /sobre, em 4 capítulos: fundação → escapamento/catalisador → estética →
   hoje. SUBSTITUI o antigo "Nossa história" (.story no muro) + "Nossa estrada"
   (.gd-tl.tl-spray) — o conteúdo dos dois virou capítulo, e as duas frases de
   exclusividade (SCAPEX no Litoral Sul, linha Jaça na Baixada) mudaram de casa
   pro capítulo 03, sem alteração de texto (decisão dele, 17/08).

   ROUPA ESCOLHIDA: candidato A da prova de roupa `_lab/emp01-trajetoria.html`
   ("a estrada"), entre 4 codadas na seção real. Peça-mãe: Atlas gsp05 + lv1109
   (scroll vertical vira horizontal), REESCRITA sem GSAP — o site não ganha 60KB
   de motor por causa de uma seção (orçamento de movimento, aplicacao-de-movimento.md).
   Camada: ASSINATURA da página (a única da /sobre).

   O trilho tem 480vh: é ele que dá curso pro scrub. A viagem tem DESCANSO
   (36% de cada trecho parado) — sem isso o capítulo vive cortado no meio da
   tela e ninguém lê. Quem move é o initTrajetoria() do main.js.

   Mobile (≤860px) e prefers-reduced-motion NÃO prendem a tela: viram carrossel
   de arrastar (scroll-snap) e pilha vertical. Scroll preso no celular é briga
   com o dedo do cliente — e 80% do tráfego é celular.
   ========================================================================== */
.tjt{position:relative;background:#080B16}
.tjt-head{padding-top:var(--sp-20);padding-bottom:var(--sp-10)}
.tjt-head .sec-head{margin-bottom:0}
.tjt-head .sec-head h2{color:#EAF2FF}
.tjt-head .sec-head p{color:#B9C6DC}

/* no desktop a estrada anda sozinha com o scroll; no celular ela é carrossel de
   arrastar — e carrossel sem aviso é conteúdo escondido, então o convite só
   aparece onde ele é verdade */
.tjt-arrasta{display:none}
.tjt-trilho{position:relative;height:480vh}
.tjt-vp{position:sticky;top:0;height:100vh;overflow:hidden;
  background:linear-gradient(180deg,#080B16 0%,#0B1526 46%,#080B16 100%)}
/* o muro da casa entra como TEXTURA (20%), não como cena: acima disso o grafite
   gigante briga com o texto — foi o furo do 1º screenshot da prova de roupa */
.tjt-vp::before{content:"";position:absolute;inset:0;opacity:.2;
  background:url('../img/muro-empresa.webp') 50% 40%/cover no-repeat}
.tjt-row{position:absolute;inset:0;display:flex;width:400%;will-change:transform}
.tjt-cap{width:25%;height:100%;display:grid;align-content:center;gap:var(--sp-4);
  padding:0 clamp(24px,6vw,110px) 176px;position:relative}
.tjt-num{font-family:var(--font-lt);font-size:clamp(96px,17vw,220px);line-height:.8;
  color:transparent;-webkit-text-stroke:2px rgba(234,242,255,.16);
  position:absolute;left:clamp(16px,4vw,80px);top:8vh;pointer-events:none;user-select:none}
.tjt-kick{font-family:var(--font-tag);font-size:clamp(20px,2.2vw,30px);color:var(--cyan);
  transform:rotate(-1.4deg)}
.tjt-cap h3{font-size:clamp(30px,3.6vw,56px);color:#EAF2FF;max-width:16ch;margin:0}
.tjt-cap h3 em{font-style:normal;color:var(--cyan)}
.tjt-cap p{color:#B9C6DC;font-size:clamp(14px,1.15vw,18px);line-height:1.75;max-width:46ch;margin:0}
.tjt-cap p b{color:#EAF2FF;font-weight:700}
.tjt-selos{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.tjt-sel{display:inline-flex;align-items:center;font-family:var(--font-lt);font-weight:400;
  font-size:var(--fs-3xs);letter-spacing:.14em;text-transform:uppercase;color:var(--cyan);
  background:rgba(56,225,242,.08);border:var(--bw-1) solid rgba(56,225,242,.34);
  border-radius:var(--r-full);padding:var(--sp-1) var(--sp-3)}

/* o material do capítulo: foto de verdade OU placa de metal (a fase do
   escapamento não tem acervo — placa é honesto, foto genérica é enfeite) */
.tjt-mat{position:absolute;right:clamp(16px,5vw,90px);bottom:20vh;width:clamp(150px,21vw,290px);
  margin:0;border-radius:var(--r-md);overflow:hidden;border:var(--bw-1) solid rgba(255,255,255,.14);
  box-shadow:0 24px 60px rgba(2,8,20,.6)}
.tjt-mat img{display:block;width:100%;height:100%;object-fit:cover;aspect-ratio:3/4}
.tjt-mat figcaption{position:absolute;left:0;right:0;bottom:0;padding:var(--sp-8) var(--sp-3) var(--sp-3);
  font-family:var(--font-tag);font-size:var(--fs-sm);color:#EAF2FF;
  background:linear-gradient(180deg,transparent,rgba(4,10,22,.86))}
.tjt-placa{display:grid;place-content:center;gap:var(--sp-2);text-align:center;aspect-ratio:3/4;
  padding:var(--sp-6);background:linear-gradient(168deg,#16203A,#0C1424)}
.tjt-placa b{font-family:var(--font-lt);font-weight:400;font-size:var(--fs-xl);letter-spacing:.2em;color:#EAF2FF}
.tjt-placa span{font-size:var(--fs-2xs);letter-spacing:.14em;text-transform:uppercase;color:#96A2B4}

/* a pista + a régua 2005→hoje: é o que diz "isso é uma estrada, você está
   andando nela" — sem elas o movimento lateral vira só um slide */
/* 140/100px de chão: embaixo moram o chip do SOM, o FAB do zap e a dock do HUD
   — pista colada no bottom passava POR BAIXO deles e virava sujeira */
.tjt-pista{position:absolute;left:0;right:0;bottom:140px;height:10px;overflow:hidden;
  background:linear-gradient(180deg,#151C2C,#0C1220);
  border-top:var(--bw-1) solid rgba(255,255,255,.06);border-bottom:var(--bw-1) solid rgba(0,0,0,.5)}
.tjt-pista i{position:absolute;left:-1400px;right:-1400px;top:4px;height:2px;opacity:.5;
  background:repeating-linear-gradient(90deg,#EAF2FF 0 34px,transparent 34px 74px)}
.tjt-hud{position:absolute;left:0;right:0;bottom:100px;display:flex;align-items:center;
  gap:var(--sp-3);padding:0 clamp(24px,6vw,110px);
  font-family:var(--font-lt);font-size:var(--fs-3xs);letter-spacing:.16em;color:#7C8CA8}
.tjt-hud .bar{flex:1;height:3px;border-radius:var(--r-2xs);background:rgba(255,255,255,.1);overflow:hidden}
.tjt-hud .bar i{display:block;height:100%;width:0;background:var(--cyan);box-shadow:0 0 12px rgba(56,225,242,.7)}
.tjt-hud b{color:var(--cyan);font-weight:400}

.tjt-fecho{font-family:var(--font-tag);font-size:clamp(20px,2.6vw,30px);color:var(--cyan);
  text-align:center;transform:rotate(-1deg);margin:0 auto;max-width:640px;line-height:1.3;
  padding:0 var(--sp-6) var(--sp-24);text-shadow:0 0 18px rgba(56,225,242,.28)}

@media(max-width:860px){
  .tjt-head{padding-top:var(--sp-16);padding-bottom:var(--sp-6)}
  .tjt-arrasta{display:inline-block;margin-top:var(--sp-4);font-family:var(--font-tag);
    font-size:var(--fs-base);color:var(--cyan);transform:rotate(-1deg)}
  .tjt-trilho{height:auto}
  .tjt-vp{position:static;height:auto;overflow:visible}
  .tjt-row{position:static;width:auto;overflow-x:auto;scroll-snap-type:x mandatory;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;transform:none!important}
  .tjt-row::-webkit-scrollbar{display:none}
  /* align-items:flex-start é de propósito: esticar os capítulos pra altura do
     mais alto (o 03, com SCAPEX+Jaça) fazia a foto invadir o texto. Cada
     capítulo tem a altura que precisa; a sobra é fundo, não buraco. */
  .tjt-row{align-items:flex-start}
  .tjt-cap{width:86vw;flex:0 0 86vw;scroll-snap-align:center;height:auto;
    align-content:start;
    padding:var(--sp-10) var(--sp-5);border-right:var(--bw-1) solid rgba(255,255,255,.06)}
  .tjt-num{position:static;font-size:var(--fs-6xl);-webkit-text-stroke:2px rgba(234,242,255,.2)}
  /* relative, NUNCA static: a legenda é absolute dentro da moldura e, sem
     âncora, ela escapa e vai colar no rodapé do capítulo */
  /* ⚠️ trocar absolute por relative NÃO apaga o `right`/`bottom` da regra base:
     o relativo continua deslocado 20vh pra cima e come o parágrafo. Zerar. */
  .tjt-mat{position:relative;inset:auto;width:100%;margin-top:var(--sp-2)}
  .tjt-mat img{aspect-ratio:4/3}
  .tjt-placa{aspect-ratio:4/3}
  .tjt-pista,.tjt-hud{display:none}
  .tjt-fecho{padding-bottom:var(--sp-16)}
}
/* quem pede menos movimento recebe a mesma história empilhada — nada de tela
   presa, nada de conteúdo escondido atrás de um scrub que não vai acontecer */
@media(prefers-reduced-motion:reduce){
  .tjt-trilho{height:auto}
  .tjt-vp{position:static;height:auto;overflow:visible}
  .tjt-row{position:static;width:auto;flex-direction:column;transform:none!important}
  .tjt-cap{width:auto;height:auto;padding:var(--sp-12) var(--sp-6)}
  .tjt-num{position:static}
  .tjt-mat{position:relative;inset:auto;width:min(420px,100%);margin-top:var(--sp-4)}
  .tjt-pista,.tjt-hud{display:none}
}

/* =========================================================
   INF.01 · OS CREDENCIADOS — /influencers (17/08/2026)
   A estreia oficial da Biblioteca de Animações (Atlas) no site.
   Peças decompostas nos tokens da casa (nunca coladas cruas):
   ckt06 marker reveal · fft20 marquee mascarado · uvc17 credencial
   · lv177 spotlight · ats26+shk05 placa que carimba (provada 06/08).
   ========================================================= */

/* — hero: coluna única centrada (sem foto — a estrela aqui é a credencial) — */
.inf-hero .wrap{grid-template-columns:1fr;justify-items:center;text-align:center}
.inf-hero .lead{margin-inline:auto}
.inf-hero .ph-cta{justify-content:center}
.inf-hero .ph-mini{justify-content:center}

/* — hero: o marcador de tinta passa por baixo da palavra (ckt06) — */
/* o h1 do st-a é gradiente CLIPADO (color:transparent): sobre o marcador sólido
   o glifo transparente some. Mesma jogada do `em` da casa: fill branco forçado. */
.inf-hero h1 .mk{position:relative;display:inline;isolation:isolate;white-space:nowrap;
  color:#fff;-webkit-text-fill-color:#fff;filter:drop-shadow(0 2px 0 rgba(0,0,0,.35))}
.inf-hero h1 .mk::after{content:"";position:absolute;z-index:-1;inset:46% -.10em -.02em;
  background:var(--accent);border-radius:var(--r-2xs) var(--r-xs) var(--r-2xs) var(--r-2xs);
  transform:scaleX(0) rotate(-1.5deg);transform-origin:left}
.inf-hero h1.go .mk::after{animation:infMk .8s cubic-bezier(.16,1,.3,1) .35s forwards}
@keyframes infMk{from{transform:scaleX(0) rotate(-1.5deg)}to{transform:scaleX(1) rotate(-1.5deg)}}

/* — o letreiro que corre (fft20): máscara nas bordas, Bungee, sem fim — */
.inf-marq{background:linear-gradient(180deg,#0B1526,#070B14);border-top:var(--bw-1) solid rgba(255,255,255,.06);
  border-bottom:var(--bw-1) solid rgba(255,255,255,.06);overflow:hidden;padding:var(--sp-4) 0;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent)}
.inf-marq .trk{display:flex;width:max-content}
.inf-marq .grp{flex-shrink:0;display:flex;white-space:nowrap;font-family:var(--font-lt,'Bungee',cursive);
  font-weight:400;font-size:var(--fs-2xl);line-height:1;letter-spacing:.06em;color:#EAF2FF;
  padding-right:var(--sp-6);animation:infMarq 26s linear infinite}
.inf-marq .grp i{font-style:normal;color:var(--cyan,#38E1F2);padding:0 var(--sp-4)}
@keyframes infMarq{to{transform:translateX(-100%)}}

/* — o mural: parede da rua, credenciais penduradas — */
.inf-mural{position:relative;padding:var(--sp-24) 0}
.inf-mural .wrap{position:relative;z-index:1}
.inf-mural .sec-head h2{color:#EAF2FF}
.inf-mural .sec-head p{color:rgba(234,242,255,.72)}
.inf-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-8);margin-top:var(--sp-12)}

/* a credencial (uvc17 na roupa da Global): placa escura, respiro neon do azul,
   e a luz do poste seguindo o mouse (lv177) — a mesma linguagem da empena */
.inf-cred{position:relative;display:flex;flex-direction:column;gap:var(--sp-5);
  padding:var(--sp-8);border-radius:var(--r-lg);
  border:var(--bw-1) solid rgba(46,116,255,.35);
  box-shadow:0 0 32px rgba(14,90,230,.22), inset 0 0 40px rgba(14,90,230,.05);
  background-image:radial-gradient(300px circle at var(--mx,70%) var(--my,0%),rgba(46,116,255,.16),transparent 65%),
    linear-gradient(180deg,#0F1D33,#0A1424);overflow:hidden}
.inf-cred .furo{position:absolute;top:var(--sp-3);left:50%;transform:translateX(-50%);
  width:var(--sp-10);height:var(--sp-2);border-radius:var(--r-full);
  background:#05080F;border:var(--bw-1) solid rgba(255,255,255,.12)}
.ic-tag{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-3);
  margin-top:var(--sp-3);font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:var(--fs-3xs);letter-spacing:.22em;color:var(--cyan,#38E1F2);text-transform:uppercase}
.ic-tag em{font-style:normal;color:rgba(234,242,255,.55)}
.ic-nome{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:clamp(24px,3.4vw,36px);line-height:1.08;color:#EAF2FF;
  text-shadow:0 0 18px rgba(46,116,255,.5)}
.ic-quem{font-size:var(--fs-sm);color:rgba(234,242,255,.72);margin-top:calc(-1 * var(--sp-2))}
.ic-quem b{color:#EAF2FF}
.inf-cred .stat{flex-direction:row;align-items:baseline;gap:var(--sp-2)}
.inf-cred .stat b{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:var(--fs-4xl);color:var(--cyan,#38E1F2);line-height:1}
/* filho DIRETO: o odômetro (initOdometer) injeta .odx/.od que também são span —
   um descendente genérico encolhia os rolinhos pra 12px e o número sumia */
.inf-cred .stat > span{font-size:var(--fs-xs);color:rgba(234,242,255,.6);letter-spacing:.04em;text-transform:uppercase}

/* o código de barras da credencial (uvc17) — puro gradiente, zero imagem */
.ic-code{height:var(--sp-6);border-radius:var(--r-2xs);opacity:.8;
  background:repeating-linear-gradient(90deg,#EAF2FF 0 2px,transparent 2px 5px,#EAF2FF 5px 6px,transparent 6px 10px,#EAF2FF 10px 12px,transparent 12px 15px)}
.ic-slug{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;font-size:var(--fs-4xs);
  letter-spacing:.3em;color:rgba(234,242,255,.45);text-transform:uppercase;text-align:center;
  margin-top:calc(-1 * var(--sp-3))}

/* o cupom: placa tracejada que CARIMBA quando copia (ats26+shk05, do fechou) */
.inf-cupom{display:flex;flex-direction:column;gap:var(--sp-1);align-items:center;
  padding:var(--sp-4) var(--sp-5);border-radius:var(--r-md);cursor:pointer;
  border:var(--bw-2) dashed rgba(56,225,242,.55);background:rgba(56,225,242,.06);
  color:inherit;font:inherit;text-align:center;transition:border-color .2s,background .2s}
.inf-cupom:hover{border-color:var(--cyan,#38E1F2);background:rgba(56,225,242,.12)}
.ic-off{font-size:var(--fs-2xs);letter-spacing:.14em;text-transform:uppercase;color:rgba(234,242,255,.72)}
.ic-codigo{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;font-size:var(--fs-3xl);
  line-height:1;color:#EAF2FF;letter-spacing:.04em}
.ic-hint{font-size:var(--fs-2xs);color:var(--cyan,#38E1F2)}
.inf-cupom.stamped{animation:infStamp .55s cubic-bezier(.2,1.35,.3,1) both,infRing .5s ease-out .3s}
@keyframes infStamp{0%{transform:scale(1.16) rotate(-2deg)}60%{transform:scale(.96) rotate(.5deg)}100%{transform:none}}
@keyframes infRing{0%{box-shadow:0 0 0 0 rgba(56,225,242,.45)}100%{box-shadow:0 0 0 16px rgba(56,225,242,0)}}

.ic-acoes{display:flex;gap:var(--sp-3);flex-wrap:wrap}
.ic-acoes .btn{flex:1 1 auto}
.inf-mural .btn-ghost{border-color:rgba(234,242,255,.25);color:#EAF2FF}
.inf-mural .btn-ghost:hover{border-color:rgba(234,242,255,.5);background:rgba(255,255,255,.06)}

/* — como funciona: 3 passos, chão claro — */
.inf-passos{padding:var(--sp-24) 0}
.inf-passos .grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-6);margin-top:var(--sp-10)}
.inf-passo{position:relative;padding:var(--sp-8);border-radius:var(--r-lg);
  background:var(--surface);border:var(--bw-1) solid var(--border);box-shadow:var(--shadow-sm)}
.inf-passo .n{font-family:var(--font-lt,'Bungee',cursive);font-weight:400;
  font-size:var(--fs-3xl);color:var(--accent);line-height:1}
.inf-passo h3{font-size:var(--fs-xl);margin:var(--sp-3) 0 var(--sp-2)}
.inf-passo p{font-size:var(--fs-sm);color:var(--ink-2)}

/* — o chamado: bora rodar com a 01 — */
.inf-cta{padding:0 0 var(--sp-24)}
.inf-cta .box{display:flex;flex-direction:column;gap:var(--sp-4);align-items:center;text-align:center;
  padding:var(--sp-16) var(--sp-8);border-radius:var(--r-xl);
  background:linear-gradient(180deg,#0B1526,#070B14);border:var(--bw-1) solid rgba(46,116,255,.3)}
.inf-cta h2{color:#EAF2FF;font-size:clamp(24px,3.4vw,36px)}
.inf-cta p{color:rgba(234,242,255,.72);max-width:520px}
.inf-cta .st-tag{color:var(--cyan,#38E1F2)}

/* — celular: uma credencial por vez, letreiro mais curto — */
@media(max-width:860px){
  .inf-grid{grid-template-columns:1fr;gap:var(--sp-6);margin-top:var(--sp-8)}
  .inf-mural{padding:var(--sp-16) 0}
  .inf-cred{padding:var(--sp-6)}
  .inf-marq .grp{font-size:var(--fs-lg)}
  .inf-passos{padding:var(--sp-16) 0}
  .inf-passos .grid3{grid-template-columns:1fr;gap:var(--sp-4)}
  .inf-cta{padding:0 0 var(--sp-16)}
  .inf-cta .box{padding:var(--sp-10) var(--sp-5)}
  .ic-acoes{flex-direction:column}
}

/* quem pede menos movimento: marcador pintado, letreiro parado, sem carimbo */
@media(prefers-reduced-motion:reduce){
  .inf-hero h1 .mk::after{animation:none;transform:scaleX(1) rotate(-1.5deg)}
  .inf-marq .grp{animation:none}
  .inf-cupom.stamped{animation:none}
}
