/* ============================================================
   NS WebStudio · Landing V3 — DARK EDITORIAL
   Massive condensed typography · 3D scroll · color sections.
   Built over tokens.css. Mobile-safe · prefers-reduced-motion.
   ============================================================ */

:root {
  --v3-dark:     #0A0909;
  --v3-dark-2:   #131211;
  --v3-dark-3:   #1C1A18;
  --v3-cream:    #F4F1EC;
  --v3-cream-2:  #ECE7DF;
  --v3-peach:    #FCC8A4;
  --v3-peach-deep: #F8B07C;
  --v3-blue:     #3A54F7;
  --v3-blue-deep:#2840CC;
  --v3-on-dark:  #EFEAE3;
  --v3-on-dark-dim: rgba(239, 234, 227, 0.62);
  --v3-on-dark-faint: rgba(239, 234, 227, 0.34);
  --v3-on-cream: #14110E;
  --v3-on-cream-dim: rgba(20, 17, 14, 0.62);
  --v3-line-dark: rgba(239, 234, 227, 0.12);
  --v3-line-cream: rgba(20, 17, 14, 0.10);

  /* === A/B tipografía de encabezados ============================
     PRUEBA ACTUAL: Montserrat Black (la de antes).
     Para volver a Bebas Neue, cambia estos 4 valores a:
       --font-mega: "Bebas Neue", "Montserrat", sans-serif;
       --mega-weight: 400;
       --mega-tracking: 0.005em;
       --mega-scale: 1;
     ============================================================== */
  --font-mega: "Montserrat", -apple-system, sans-serif;
  --mega-weight: 900;
  --mega-tracking: -0.03em;
  --mega-scale: 0.72;

  --ease-reveal: cubic-bezier(0.16, 1, 0.3, 1);
  --nav-h: 76px;
}

/* === Kill the light-theme mesh from tokens.css === */
body.landing-body.v3 {
  /* Background handled by the fixed #scrollFade layer (scroll-driven color).
     Keep a dark fallback on <html> in case JS is off. */
  background: transparent;
  color: var(--v3-on-dark);
  /* The shared tokens.css sets `body { overflow-x: hidden }`, which turns <body>
     into a scroll container and BREAKS position:sticky for all descendants.
     Override it to visible HERE (landing only) and clip horizontally on <html>
     instead — this avoids editing the globally-shared tokens.css. */
  overflow-x: visible;
}
html { background: var(--v3-dark); overflow-x: clip; }
body.landing-body.v3::before,
body.landing-body.v3::after {
  display: none !important;
  content: none !important;
}

body.landing-body.v3 ::selection {
  background: var(--v3-peach);
  color: var(--v3-dark);
}

.mono { font-family: var(--font-mono); }

/* === Film grain canvas === */
.grain-canvas {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 90;
  pointer-events: none;
  opacity: 0.045;
  mix-blend-mode: overlay;
}

/* ============================================================
   BUTTONS
   ============================================================ */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 15px;
  line-height: 1;
  letter-spacing: -0.01em;
  padding: 14px 22px;
  border-radius: var(--r-pill);
  border: 1px solid transparent;
  cursor: pointer;
  text-decoration: none;
  white-space: nowrap;
  transition: transform var(--dur) var(--ease-out),
              background var(--dur) var(--ease-out),
              color var(--dur) var(--ease-out),
              border-color var(--dur) var(--ease-out),
              box-shadow var(--dur) var(--ease-out);
}
.btn:active { transform: translateY(1px) scale(0.99); }
.btn-sm { padding: 10px 16px; font-size: 13.5px; }
.btn-lg { padding: 17px 28px; font-size: 16px; }

/* Featured / primary button — transparent w/ blue outline. Rest: blue circle
   (icon) on the left + centered label. On hover the circle LEADS: a blue fill
   unfurls from it to the right and the new label fades in beside it. The icon
   never covers the text. No glow, no button lift. Sizes via JS (--orb-d/-pad). */
.btn-primary {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  background: transparent;
  color: var(--v3-blue);
  border: 1.5px solid var(--v3-blue);
  box-shadow: none;
  padding-left: calc(var(--orb-pad, 5px) + var(--orb-d, 30px) + 0.6em);
}
/* rest label (centered) */
.btn-primary .btn-label {
  position: relative;
  z-index: 1;
  transition: opacity 0.25s var(--ease-out);
}
/* blue fill that unfurls to the right from under the circle */
.btn-primary .btn-fill {
  position: absolute;
  left: var(--orb-pad, 5px);
  top: var(--orb-pad, 5px);
  width: var(--orb-d, 30px);
  height: var(--orb-d, 30px);
  background: var(--v3-blue);
  border-radius: var(--r-pill);
  z-index: 1;
  overflow: hidden;
}
.btn-primary.orb-ready .btn-fill { transition: width 0.45s var(--ease-out); }
/* new label, revealed in the area to the right of the leading circle */
.btn-primary .btn-hlabel {
  position: absolute;
  left: var(--orb-d, 30px);
  right: 0;
  top: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  white-space: nowrap;
  opacity: 0;
  transition: opacity 0.3s var(--ease-out) 0.1s;
}
/* leading circle holding the icon (always on top) */
.btn-primary .btn-orb {
  position: absolute;
  left: var(--orb-pad, 5px);
  top: var(--orb-pad, 5px);
  width: var(--orb-d, 30px);
  height: var(--orb-d, 30px);
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--r-pill);
  background: var(--v3-blue);
  color: #fff;
  z-index: 2;
}
.btn-primary .btn-orb svg { flex: none; }
.btn-primary:hover .btn-fill,
.btn-primary:focus-visible .btn-fill { width: calc(100% - 2 * var(--orb-pad, 5px)); }
.btn-primary:hover .btn-hlabel,
.btn-primary:focus-visible .btn-hlabel { opacity: 1; }
.btn-primary:hover .btn-label,
.btn-primary:focus-visible .btn-label { opacity: 0; }

.btn-peach {
  background: var(--v3-peach);
  color: var(--v3-dark);
}
.btn-peach:hover {
  background: var(--v3-peach-deep);
  transform: translateY(-2px);
  box-shadow: 0 14px 34px -12px rgba(248, 176, 124, 0.7);
}

/* ghost light — for dark sections */
.btn-ghost-light {
  background: transparent;
  color: var(--v3-on-dark);
  border-color: var(--v3-line-dark);
}
.btn-ghost-light:hover {
  border-color: var(--v3-on-dark);
  background: rgba(239, 234, 227, 0.06);
  transform: translateY(-2px);
}
/* on cream sections, ghost flips dark */
.s-works .btn-ghost-light,
.s-packages .btn-ghost-light {
  color: var(--v3-on-cream);
  border-color: var(--v3-line-cream);
}
.s-works .btn-ghost-light:hover,
.s-packages .btn-ghost-light:hover {
  border-color: var(--v3-on-cream);
  background: rgba(20, 17, 14, 0.05);
}

/* glass dark — secondary on cream */
.btn-glass-dark {
  background: var(--v3-dark);
  color: var(--v3-on-dark);
  border-color: var(--v3-dark);
}
.btn-glass-dark:hover {
  background: var(--v3-dark-3);
  transform: translateY(-2px);
  box-shadow: 0 14px 32px -14px rgba(10, 9, 9, 0.6);
}

/* ============================================================
   NAV
   ============================================================ */
/* Versión B · pill único centrado tipo "isla" */
.ns-nav {
  position: fixed;
  top: clamp(12px, 2vw, 18px); left: 0; right: 0;
  z-index: var(--z-nav);
  display: flex;
  justify-content: center;
  padding: 0 16px;
  pointer-events: none;           /* solo el pill captura clicks */
}
.ns-nav-pill {
  pointer-events: auto;
  display: inline-flex;
  align-items: center;
  gap: clamp(10px, 2.2vw, 26px);
  padding: 8px 8px 8px 14px;
  border-radius: var(--r-pill);
  background: rgba(20, 19, 19, 0.50);
  backdrop-filter: var(--blur-mid);
  -webkit-backdrop-filter: var(--blur-mid);
  border: 1px solid rgba(255, 255, 255, 0.10);
  box-shadow:
    0 14px 44px -14px rgba(0, 0, 0, 0.65),
    inset 0 1px 0 rgba(255, 255, 255, 0.10);
  transition: background var(--dur) var(--ease-out),
              border-color var(--dur) var(--ease-out),
              box-shadow var(--dur) var(--ease-out),
              transform var(--dur) var(--ease-out);
}
.ns-nav.is-scrolled .ns-nav-pill {
  background: rgba(10, 9, 9, 0.80);
  border-color: rgba(255, 255, 255, 0.15);
  box-shadow:
    0 18px 52px -16px rgba(0, 0, 0, 0.75),
    inset 0 1px 0 rgba(255, 255, 255, 0.12);
}

.ns-brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  text-decoration: none;
  color: var(--v3-on-dark);
}
.ns-brand-badge {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: 11px;
  background: var(--v3-blue);
  color: #ffffff;
  font-family: var(--font-sans);
  font-weight: 900;
  font-size: 13px;
  letter-spacing: -0.04em;
}
.ns-brand-text {
  font-family: var(--font-sans);
  font-weight: 700;
  font-size: 16px;
  letter-spacing: -0.02em;
}

.ns-nav-links {
  display: flex;
  gap: clamp(14px, 2.4vw, 30px);
  padding: 0 4px;
}
.ns-nav-links a {
  color: var(--v3-on-dark-dim);
  text-decoration: none;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: -0.01em;
  transition: color var(--dur) var(--ease-out);
}
.ns-nav-links a:hover { color: var(--v3-on-dark); }

.ns-nav-cta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

/* ============================================================
   SECTION SHELL
   ============================================================ */
section { position: relative; }

.sec-index {
  display: inline-block;
  font-size: 12px;
  letter-spacing: 0.18em;
  color: var(--v3-peach-deep);
  margin-bottom: 22px;
}
.s-works .sec-index,
.s-packages .sec-index { color: #B6764A; }

.sec-head {
  max-width: 1320px;
  margin: 0 auto;
  padding: 0 clamp(20px, 5vw, 56px);
}
.sec-title {
  font-family: var(--font-mega);
  font-weight: var(--mega-weight);
  font-size: calc(clamp(56px, 11vw, 150px) * var(--mega-scale));
  line-height: 0.94;
  letter-spacing: var(--mega-tracking);
  margin: 0 0 24px;
}
.sec-lead {
  font-size: clamp(16px, 2vw, 21px);
  line-height: 1.45;
  color: var(--v3-on-dark-dim);
  max-width: 560px;
}
.s-works .sec-lead,
.s-packages .sec-lead { color: var(--v3-on-cream-dim); }

/* ============================================================
   1 · HERO
   ============================================================ */
.s-hero {
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: calc(var(--nav-h) + 30px) clamp(20px, 5vw, 56px) 0;
  overflow: hidden;
}
.hero-grid-lines {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(var(--v3-line-dark) 1px, transparent 1px),
    linear-gradient(90deg, var(--v3-line-dark) 1px, transparent 1px);
  background-size: clamp(60px, 8vw, 120px) clamp(60px, 8vw, 120px);
  mask-image: radial-gradient(120% 90% at 50% 30%, #000 30%, transparent 80%);
  -webkit-mask-image: radial-gradient(120% 90% at 50% 30%, #000 30%, transparent 80%);
  opacity: 0.5;
  pointer-events: none;
}
.hero-index {
  position: absolute;
  top: calc(var(--nav-h) + 22px);
  right: clamp(20px, 5vw, 56px);
  font-size: 12px;
  letter-spacing: 0.18em;
  color: var(--v3-on-dark-faint);
}

.hero-inner {
  position: relative;
  z-index: 2;
  max-width: 1320px;
  margin: 0 auto;
  width: 100%;
  padding-bottom: clamp(40px, 7vh, 90px);
}
.hero-kicker {
  font-size: 13px;
  letter-spacing: 0.12em;
  color: var(--v3-peach);
  margin: 0 0 clamp(20px, 4vh, 40px);
}

.hero-headline {
  perspective: 900px;
  margin: 0;
}
.hero-line {
  display: block;
  font-family: var(--font-mega);
  font-weight: var(--mega-weight);
  /* Size by BOTH width and height so the full hero (headline + sub + CTAs +
     marquee) always fits one viewport, even on short / scaled monitors where
     the usable CSS height drops to ~700px (e.g. Windows 125% scaling). */
  font-size: calc(clamp(48px, min(15vw, 24vh), 280px) * var(--mega-scale));
  line-height: 0.86;
  letter-spacing: var(--mega-tracking);
  transform-origin: 50% 100%;
  will-change: transform, opacity;
}
.hero-line--accent { color: var(--v3-peach); }

/* entrance — runs from CSS on load (NOT gated by JS .is-ready) so the LCP
   headline paints immediately instead of waiting for landing.js to download. */
.s-hero .hero-line {
  opacity: 0;
  transform: translateY(60px) rotateX(40deg);
  animation: heroLineIn 0.8s var(--ease-reveal) forwards;
}
.s-hero .hero-line:nth-child(1) { animation-delay: 0.04s; }
.s-hero .hero-line:nth-child(2) { animation-delay: 0.13s; }
.s-hero .hero-line:nth-child(3) { animation-delay: 0.22s; }
@keyframes heroLineIn {
  to { opacity: 1; transform: translateY(0) rotateX(0); }
}

.hero-foot {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 28px;
  margin-top: clamp(28px, 5vh, 56px);
}
.hero-sub {
  font-size: clamp(15px, 1.7vw, 19px);
  line-height: 1.5;
  color: var(--v3-on-dark-dim);
  max-width: 440px;
}
.hero-sub strong { color: var(--v3-on-dark); font-weight: 600; }
.hero-ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

.hero-scroll-hint {
  position: absolute;
  bottom: 96px;
  right: clamp(20px, 5vw, 56px);
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  font-size: 10px;
  letter-spacing: 0.2em;
  color: var(--v3-on-dark-faint);
}
.scroll-arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  border-radius: 16px;
  background: rgba(239, 234, 227, 0.06);
  border: 1px solid var(--v3-line-dark);
  color: var(--v3-peach);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  animation: scrollBounce 1.8s var(--ease) infinite;
}
@keyframes scrollBounce {
  0%, 100% { transform: translateY(0);   opacity: 0.85; }
  50%      { transform: translateY(6px); opacity: 1; }
}

/* Short / scaled monitors: tighten the hero's vertical rhythm so every element
   (kicker → headline → sub → CTAs → marquee) stays inside one viewport. The
   headline already caps by height; this trims the gaps to match. Nothing hidden. */
@media (max-height: 820px) {
  .s-hero { padding-top: calc(var(--nav-h) + 14px); }
  .hero-kicker { margin-bottom: clamp(8px, 2vh, 22px); }
  .hero-foot { margin-top: clamp(14px, 3vh, 34px); }
  .hero-inner { padding-bottom: clamp(18px, 3.2vh, 52px); }
  .hero-scroll-hint { display: none; }
}

/* ============================================================
   HERO · multiplayer editor cursors (Diseño / Código / Copy)
   ============================================================ */
.editor-cursors {
  position: absolute;
  inset: 0;
  z-index: 5;
  pointer-events: none;
  overflow: hidden;
}
.ed-cursor {
  position: absolute;
  display: inline-flex;
  align-items: flex-start;
  gap: 2px;
  opacity: 0;
  will-change: transform, opacity;
}
.s-hero.is-ready .ed-cursor { opacity: 1; transition: opacity 0.6s var(--ease-out); }
.ed-cursor svg { color: var(--c); filter: drop-shadow(0 3px 5px rgba(8, 8, 10, 0.45)); }
.ed-cursor b {
  font-family: var(--font-mono);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: #fff;
  background: var(--c);
  padding: 2px 8px;
  border-radius: 7px 7px 7px 1px;
  white-space: nowrap;
  transform: translateY(-2px);
  box-shadow: 0 3px 8px -2px rgba(8, 8, 10, 0.4);
}
/* ed-c1 (Diseño) is JS-choreographed — no looping nav animation */
.ed-c1 { --c: #3A54F7; top: 24%; left: 8%; }
.ed-c2 { --c: #5BC489; top: 60%; left: 80%; animation: edNav2 9.5s cubic-bezier(0.5,0,0.2,1) infinite; }
.ed-c3 { --c: #F8B07C; top: 32%; left: 86%; animation: edNav3 8.8s cubic-bezier(0.5,0,0.2,1) infinite; }
@keyframes edNav1 {
  0%   { transform: translate(0,0); }
  18%  { transform: translate(120px, 60px); }
  24%  { transform: translate(120px, 60px); }
  46%  { transform: translate(220px, -10px); }
  52%  { transform: translate(220px, -10px); }
  78%  { transform: translate(40px, 90px); }
  84%  { transform: translate(40px, 90px); }
  100% { transform: translate(0,0); }
}
@keyframes edNav2 {
  0%   { transform: translate(0,0); }
  20%  { transform: translate(-90px, -40px); }
  26%  { transform: translate(-90px, -40px); }
  50%  { transform: translate(-180px, 30px); }
  56%  { transform: translate(-180px, 30px); }
  80%  { transform: translate(-50px, -70px); }
  86%  { transform: translate(-50px, -70px); }
  100% { transform: translate(0,0); }
}
@keyframes edNav3 {
  0%   { transform: translate(0,0); }
  22%  { transform: translate(-60px, 70px); }
  28%  { transform: translate(-60px, 70px); }
  52%  { transform: translate(-140px, -30px); }
  58%  { transform: translate(-140px, -30px); }
  82%  { transform: translate(20px, 80px); }
  88%  { transform: translate(20px, 80px); }
  100% { transform: translate(0,0); }
}
.ed-cursor::after {
  content: '';
  position: absolute;
  left: 3px; top: 3px;
  width: 12px; height: 12px;
  border: 2px solid var(--c);
  border-radius: 50%;
  opacity: 0;
  transform: scale(0.3);
  pointer-events: none;
}
.s-hero.is-ready .ed-c2::after { animation: edClick 9.5s ease-out infinite; }
.s-hero.is-ready .ed-c3::after { animation: edClick 8.8s ease-out infinite; }
/* one-shot click ripple for the choreographed Diseño cursor */
.ed-cursor.is-click::after { animation: edClickOnce 0.7s ease-out; }
@keyframes edClickOnce {
  0%   { opacity: 0;    transform: scale(0.3); }
  25%  { opacity: 0.9;  transform: scale(0.5); }
  100% { opacity: 0;    transform: scale(2.6); }
}
@keyframes edClick {
  0%,19%   { opacity: 0; transform: scale(0.3); }
  21%      { opacity: 0.85; transform: scale(0.5); }
  30%      { opacity: 0; transform: scale(2.4); }
  47%      { opacity: 0; transform: scale(0.3); }
  49%      { opacity: 0.85; transform: scale(0.5); }
  58%      { opacity: 0; transform: scale(2.4); }
  79%      { opacity: 0; transform: scale(0.3); }
  81%      { opacity: 0.85; transform: scale(0.5); }
  90%      { opacity: 0; transform: scale(2.4); }
  100%     { opacity: 0; transform: scale(0.3); }
}
.s-hero.is-ready .ed-cursor svg { transform-origin: 5px 4px; }
.s-hero.is-ready .ed-c2 svg { animation: edDip 9.5s ease-out infinite; }
.s-hero.is-ready .ed-c3 svg { animation: edDip 8.8s ease-out infinite; }
@keyframes edDip {
  0%,19%,30%,47%,58%,79%,90%,100% { transform: scale(1); }
  21%,49%,81% { transform: scale(0.78); }
}
@media (max-width: 767px) {
  /* Hide the corner section index — it collided with the kicker on small
     screens once the giant headline pushes the kicker up to the top. */
  .hero-index { display: none; }
  /* Give the kicker a touch more breathing room from the nav. */
  .hero-kicker { margin-bottom: clamp(16px, 3vh, 28px); }
  /* All cursors anchored left so their labels extend inward (never off the
     right edge); c1 is JS-clamped, c2/c3 loop leftward (clipped if needed). */
  .ed-c1 { top: 16%; left: 5%; }
  .ed-c2 { top: 72%; left: 58%; }
  .ed-c3 { display: inline-flex; top: 45%; left: 6%; }
  .ed-cursor b { font-size: 9.5px; padding: 1px 6px; }
}

/* ============================================================
   HERO · "MUEVE." selection → color flip (the Diseño cursor acts)
   ============================================================ */
.hero-select {
  position: relative;
  display: inline-block;
  isolation: isolate;
  color: inherit;
}
.hero-select::before {
  content: '';
  position: absolute;
  inset: 0.04em -0.1em;
  background: rgba(58, 84, 247, 0.22);
  border: 1px solid rgba(58, 84, 247, 0.48);
  border-radius: 8px;
  transform: scaleX(0);
  transform-origin: left center;
  z-index: -1;
  opacity: 0;
}
.s-hero.sel-on .hero-select::before {
  opacity: 1;
  transform: scaleX(1);
  transition: transform 0.4s var(--ease-out), opacity 0.2s;
}
.s-hero.color-on .hero-select {
  color: #3A54F7;
  transition: color 0.35s var(--ease-out);
}
.s-hero.color-on .hero-select::before {
  opacity: 0;
  transition: opacity 0.45s var(--ease-out);
}

/* ============================================================
   Inspector-on-hover · subtle outline only (no label)
   ============================================================ */
@media (hover: hover) and (pointer: fine) {
  .bento-card:hover,
  .pkg-card:hover {
    outline: 2px solid #3A54F7;
    outline-offset: 3px;
  }
}

.hero-marquee {
  position: relative;
  z-index: 2;
  border-top: 1px solid var(--v3-line-dark);
  border-bottom: 1px solid var(--v3-line-dark);
  overflow: hidden;
  padding: 14px 0;
  margin-top: 8px;
}
.hero-marquee-track {
  display: flex;
  white-space: nowrap;
  animation: marquee 28s linear infinite;
}
.hero-marquee-track span {
  font-family: var(--font-sans);
  font-size: 15px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--v3-on-dark-dim);
  padding-right: 12px;
}
@keyframes marquee {
  to { transform: translateX(-50%); }
}

/* --- Hero exit: block fades + zooms out + blurs (driven by JS) --- */
.s-hero .hero-inner { will-change: transform, opacity, filter; }


/* ============================================================
   2 · STATEMENT (peach, word reveal)
   ============================================================ */
.s-statement {
  position: relative;
  z-index: 1;
  /* Section is transparent so #scrollFade (dark→cream) shows behind the
     floating module. Generous vertical room for the parallax/zoom travel. */
  background: transparent;
  color: var(--v3-dark);
  padding: clamp(60px, 12vh, 160px) clamp(16px, 4vw, 48px);
}
/* Full-bleed dark manifesto (no peach card). The #scrollFade layer behind
   provides the dark→cream scroll transition into the Works section. */
.s-statement .statement-module {
  max-width: 1000px;
  margin: 0 auto;
  background: transparent;
  padding: clamp(40px, 7vw, 90px) clamp(20px, 5vw, 56px);
  /* Subtle zoom from scroll (zoom-in → full → zoom-out) via landing.js. */
  transform: scale(var(--mod-scale, 0.96));
  transform-origin: center center;
  will-change: transform;
}
/* Fixed full-viewport layer behind hero + statement; its color is animated
   by scroll progress so the hero's dark melts into the Works cream. */
#scrollFade {
  position: fixed;
  inset: 0;
  z-index: -1;
  background: var(--v3-dark);
  pointer-events: none;
}
.s-statement .sec-index {
  color: rgba(239, 234, 227, 0.5);
  display: block;
  width: auto;
  max-width: 880px;
  margin: 0 auto clamp(18px, 3vh, 30px);
  text-align: left;
}
.statement-text {
  max-width: 880px;
  margin: 0 auto;
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: clamp(22px, 3.1vw, 40px);   /* smaller, like the reference */
  line-height: 1.22;
  letter-spacing: -0.02em;
  text-align: left;
  color: #fff;
}
.statement-text .word {
  display: inline-block;
  opacity: 0.26;                          /* dim white → lights to full white */
  color: #fff;
  transition: opacity 0.3s var(--ease-out);
}
.statement-text .word.is-lit { opacity: 1; }
.statement-tags {
  max-width: 880px;
  margin: clamp(30px, 4.5vh, 50px) auto 0;
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.stat-tag {
  font-size: 13px;
  font-weight: 600;
  padding: 8px 16px;
  border-radius: var(--r-pill);
  border: 1px solid rgba(255,255,255,0.28);
  color: rgba(255,255,255,0.9);
}

/* ============================================================
   3.5 · RESPONSIVE micro-strip (between Works & Process)
   ============================================================ */
.s-adapt {
  background: var(--v3-dark);
  position: relative;
  height: var(--adapt-runway, 260vh);   /* scroll runway (JS) */
}
.adapt-stage {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(24px, 4vh, 44px);
  padding: clamp(60px, 10vh, 110px) clamp(20px, 5vw, 56px);
  text-align: center;
}
.adapt-eyebrow {
  font-size: 12px;
  letter-spacing: 0.2em;
  color: var(--v3-peach-deep);
  margin: 0;
}
/* The morphing conceptual frame */
.adapt-viewport {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: clamp(300px, 48vh, 440px);   /* caps how big the frame area is */
}
.adapt-frame {
  position: relative;
  /* Sized by HEIGHT so the true aspect-ratio is respected; capped so it never
     gets invasive (max height + max width). Styled like a package card. */
  height: var(--fh, 40vh);
  aspect-ratio: var(--ar, 16 / 9);
  max-height: 100%;
  max-width: min(760px, 88vw);
  /* Own subtle border + a separate blue ring sitting OUTSIDE with a gap,
     exactly like the featured package card. */
  border: 1px solid var(--v3-line-cream);
  outline: 2px solid var(--v3-blue);
  outline-offset: 6px;
  border-radius: var(--r-2xl);
  background: var(--v3-cream-2);
  overflow: hidden;
}
.adapt-frame-grid { display: none; }   /* no inner grid */
/* Entrance: fade + scale-up + rise when the section first appears. */
.adapt-frame.adapt-frame-enter {
  opacity: 0;
  transform: translateY(40px) scale(0.92);
  transition: opacity 0.8s var(--ease-reveal), transform 0.9s var(--ease-reveal);
}
.adapt-frame.adapt-frame-enter.is-in {
  opacity: 1;
  transform: translateY(0) scale(1);
}
.adapt-frame-px {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  font-size: clamp(26px, 3.4vw, 52px);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--v3-on-cream);          /* dark text on cream frame */
}
.adapt-frame-px i {
  font-style: normal;
  font-size: 0.42em;
  color: var(--v3-blue);
  margin-left: 4px;
}
.adapt-line {
  margin: 0;
  font-size: clamp(18px, 2.4vw, 28px);
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--v3-on-dark);
}
.adapt-accent { color: var(--v3-peach-deep); }
.adapt-dots {
  display: flex;
  gap: 10px;
}
.adapt-dot {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  padding: 6px 14px;
  border-radius: var(--r-pill);
  border: 1px solid var(--v3-line-dark);
  color: var(--v3-on-dark-faint);
  transition: color 0.3s var(--ease-out), border-color 0.3s var(--ease-out), background 0.3s;
}
.adapt-dot.is-on {
  color: var(--v3-dark);
  background: var(--v3-peach);
  border-color: var(--v3-peach);
}

/* ============================================================
   3 · WORKS (cream bento)
   ============================================================ */
.s-works {
  /* Transparent so the continuous #scrollFade (dark→cream) shows through —
     no hard seam between the manifesto and works backgrounds. */
  background: transparent;
  color: var(--v3-on-cream);
  /* Tall section = scroll runway. JS reads progress across it. Height set
     inline-ish via --runway; fallback below. */
  position: relative;
  height: var(--works-runway, 600vh);
}
/* The stage pins to the full viewport while you scroll through the runway. */
.works-stage {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  padding: clamp(70px, 10vh, 110px) clamp(20px, 5vw, 56px) 0;
}
.works-stage .sec-head {
  position: relative;
  z-index: 30;
  flex-shrink: 0;
  margin-bottom: clamp(16px, 2.5vh, 28px);
}
.works-stage .sec-head .sec-title {
  font-size: clamp(28px, 3.6vw, 46px);
  line-height: 0.95;
  margin-bottom: 6px;
}
.works-stage .sec-head .sec-lead {
  font-size: clamp(13px, 1.4vw, 16px);
  max-width: 520px;
  margin: 0;
}

/* ============================================================
   3 · WORKS — SCROLL-DRIVEN STACK (deterministic, JS transforms)
   ============================================================ */
.stack {
  position: relative;
  flex: 1;                /* fills the area below the header */
  max-width: 1100px;
  width: 100%;
  margin: 0 auto;
}
/* Each card is absolutely centred; JS moves it via translateY by scroll
   progress: starts below the screen, rises to a staggered resting spot, and
   stays there while the next rises over it. */
.stack-card {
  position: absolute;
  left: 0;
  right: 0;
  margin: 0 auto;
  width: 100%;
  padding: 0;
  border: 1px solid var(--v3-line-cream);
  border-radius: clamp(16px, 2vw, 26px);
  background: #fff;
  overflow: hidden;
  cursor: pointer;
  box-shadow: 0 14px 34px -26px rgba(20,17,14,0.5);
  text-align: left;
  /* default off-screen; JS overrides transform per scroll */
  transform: translateY(110vh);
  will-change: transform;
}
.stack-media {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  max-height: 58vh;
  overflow: hidden;
  background: var(--v3-cream-2);
}
.stack-poster {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: top center;
}
.stack-meta {
  display: flex;
  align-items: baseline;
  gap: 12px;
  padding: 16px 22px;
  background: #fff;
  border-top: 1px solid var(--v3-line-cream);
}
.stack-name { font-weight: 700; font-size: 17px; color: var(--v3-on-cream); }
.stack-desc { font-size: 13.5px; color: var(--v3-on-cream-dim); flex: 1; }
.stack-open {
  font-family: var(--font-mono);
  font-size: 12px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--v3-blue);
  flex-shrink: 0;
}

.bento-grid {
  max-width: 1320px;
  margin: 0 auto;
  padding: 0 clamp(20px, 5vw, 56px);
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 230px;
  gap: 16px;
}
.bento-card {
  position: relative;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border-radius: var(--r-2xl);
  border: 1px solid var(--v3-line-cream);
  background: var(--v3-cream-2);
  cursor: pointer;
  padding: 0;
  text-align: left;
  font: inherit;
  color: inherit;
  transition: transform var(--dur) var(--ease-out),
              box-shadow var(--dur) var(--ease-out),
              border-color var(--dur) var(--ease-out);
}
.bento-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 26px 60px -22px rgba(20, 17, 14, 0.32);
  border-color: rgba(20,17,14,0.2);
}
.bento-1x1 { grid-column: span 1; grid-row: span 1; }
.bento-2x1 { grid-column: span 2; grid-row: span 1; }
.bento-2x2 { grid-column: span 2; grid-row: span 2; }
.bento-4x1 { grid-column: span 4; grid-row: span 1; }

/* Trío en una sola fila: ocupa las 4 columnas y reparte en 3 internas. */
.bento-trio {
  grid-column: span 4;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.bento-trio-card { min-height: 230px; }

.bento-preview {
  position: relative;
  flex: 1;
  overflow: hidden;
  background: #fff;
}
.bento-preview-live { min-height: 0; }
.bento-live-frame {
  position: absolute;
  inset: 0;
  overflow: hidden;
}
.bento-iframe {
  position: absolute;
  top: 0; left: 0;
  width: 1280px;
  border: 0;
  transform-origin: top left;
  pointer-events: none;
  background: #fff;
}
/* Static poster image for each portfolio card. The live site loads ONLY
   inside the modal on click — this keeps the grid lightweight and stops
   in-app browsers (Instagram/Facebook) from crashing on 7 live iframes. */
.bento-preview-poster { background: var(--v3-cream-2); }
.bento-poster {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: top center;
  display: block;
}
.bento-live-badge {
  position: absolute;
  top: 12px; left: 12px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 10px;
  letter-spacing: 0.14em;
  padding: 6px 10px;
  border-radius: var(--r-pill);
  background: rgba(10, 9, 9, 0.78);
  color: #fff;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.bento-live-badge::before {
  content: '';
  width: 6px; height: 6px;
  border-radius: 50%;
  background: #5BC489;
  box-shadow: 0 0 0 0 rgba(91,196,137,0.7);
  animation: liveDot 1.8s var(--ease) infinite;
}
@keyframes liveDot {
  0%   { box-shadow: 0 0 0 0 rgba(91,196,137,0.6); }
  70%  { box-shadow: 0 0 0 7px rgba(91,196,137,0); }
  100% { box-shadow: 0 0 0 0 rgba(91,196,137,0); }
}
.bento-meta {
  position: relative;
  z-index: 2;
  padding: 16px 18px;
  display: flex;
  flex-direction: column;
  gap: 3px;
  background: var(--v3-cream-2);
  border-top: 1px solid var(--v3-line-cream);
}
.bento-name {
  font-weight: 700;
  font-size: 16px;
  letter-spacing: -0.01em;
}
.bento-desc {
  font-size: 13px;
  color: var(--v3-on-cream-dim);
}
.bento-open {
  position: absolute;
  bottom: 16px; right: 18px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 13px;
  font-weight: 600;
  color: var(--v3-blue);
  opacity: 0;
  transform: translateY(6px);
  transition: opacity var(--dur) var(--ease-out), transform var(--dur) var(--ease-out);
}
.bento-card:hover .bento-open { opacity: 1; transform: translateY(0); }

/* ============================================================
   4 · PROCESS (dark)
   ============================================================ */
.s-process {
  background: var(--v3-dark);
  color: var(--v3-on-dark);
  position: relative;
  height: var(--proc-runway, 320vh);   /* scroll runway, set by JS */
}
/* Stage pins full-screen while scrolling through the runway. */
.proc-stage {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: space-between;   /* title · steps · chips spread evenly */
  padding: clamp(70px, 11vh, 120px) clamp(20px, 5vw, 56px) clamp(40px, 7vh, 80px);
  max-width: 1320px;
  margin: 0 auto;
}
.proc-grid { align-self: center; width: 100%; }   /* steps block centred */
.proc-stage .proc-chips {
  margin: 0;
  max-width: 100%;
  padding: 0;
  justify-content: center;
}
.proc-head { margin-bottom: clamp(24px, 4vh, 48px); flex-shrink: 0; }
.proc-head .sec-title { font-size: clamp(34px, 5vw, 64px); line-height: 0.95; }

/* Two columns: 1/3 pinned number · 2/3 scrolling content */
.proc-grid {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0,1fr) minmax(0,2fr);
  gap: clamp(20px, 4vw, 64px);
  /* fixed-ish height (panels are absolute) so space-between can distribute */
  height: clamp(300px, 42vh, 440px);
}
/* Left: giant number, top-aligned, crossfading stack */
.proc-numcol {
  position: relative;
  border-top: 1px solid var(--v3-line-dark);
  padding-top: 24px;
  min-height: 200px;
}
.proc-bignum {
  position: absolute;
  top: 24px; left: 0;
  font-family: var(--font-mega);
  font-weight: var(--mega-weight);
  font-size: clamp(90px, 13vw, 200px);
  line-height: 0.9;
  letter-spacing: var(--mega-tracking);
  color: var(--v3-peach);
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.5s var(--ease-out), transform 0.5s var(--ease-out);
  will-change: opacity, transform;
}
.proc-bignum.is-active { opacity: 1; transform: translateY(0); }
.proc-bignum.is-out { opacity: 0; transform: translateY(-28px); }

/* Right: each step panel; JS slides them up through the column */
.proc-track {
  position: relative;
  border-top: 1px solid var(--v3-line-dark);
  padding-top: 24px;
  overflow: hidden;
}
.proc-panel {
  position: absolute;
  top: 24px; left: 0; right: 0;
  opacity: 0;
  transform: translateY(60px);
  will-change: opacity, transform;
}
.proc-panel h3 {
  font-family: var(--font-sans);
  font-size: clamp(22px, 2.4vw, 30px);
  font-weight: 700;
  margin: 0 0 14px;
}
.proc-panel p {
  font-size: clamp(15px, 1.5vw, 18px);
  line-height: 1.55;
  color: var(--v3-on-dark-dim);
  margin: 0;
  max-width: 560px;
}
.proc-chips {
  max-width: 1320px;
  margin: clamp(40px, 6vh, 64px) auto 0;
  padding: 0 clamp(20px, 5vw, 56px);
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.proc-chip {
  font-size: 13px;
  font-weight: 500;
  padding: 9px 16px;
  border-radius: var(--r-pill);
  border: 1px solid var(--v3-line-dark);
  color: var(--v3-on-dark-dim);
}

/* ============================================================
   5 · PACKAGES (cream, star)
   ============================================================ */
.s-packages {
  background: var(--v3-cream);
  color: var(--v3-on-cream);
  padding: clamp(80px, 14vh, 170px) clamp(20px, 5vw, 56px) clamp(80px, 13vh, 150px);
}
.pkg-hero {
  max-width: 1320px;
  margin: 0 auto clamp(36px, 5vh, 56px);
  text-align: center;
}
.pkg-hero .sec-lead { margin: 0 auto; }
.pkg-mega {
  font-family: var(--font-mega);
  font-weight: var(--mega-weight);
  font-size: calc(clamp(60px, 13vw, 200px) * var(--mega-scale));
  line-height: 0.9;
  letter-spacing: var(--mega-tracking);
  margin: 0 0 22px;
}

.pkg-tabs {
  max-width: 560px;
  margin: 0 auto clamp(36px, 5vh, 52px);
  display: flex;
  gap: 6px;
  padding: 6px;
  border-radius: var(--r-pill);
  background: var(--v3-cream-2);
  border: 1px solid var(--v3-line-cream);
}
.pkg-tab {
  flex: 1;
  border: 0;
  background: transparent;
  cursor: pointer;
  font: inherit;
  font-weight: 600;
  font-size: 14px;
  color: var(--v3-on-cream-dim);
  padding: 12px 14px;
  border-radius: var(--r-pill);
  transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.pkg-tab.is-active {
  background: var(--v3-dark);
  color: var(--v3-on-dark);
}

.pkg-grid {
  max-width: 1320px;
  margin: 0 auto;
  display: none;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  align-items: stretch;
}
.pkg-grid.is-active { display: grid; }

.pkg-card {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--v3-cream-2);
  border: 1px solid var(--v3-line-cream);
  border-radius: var(--r-2xl);
  padding: 30px 26px 26px;
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.6s var(--ease-reveal), transform 0.6s var(--ease-reveal),
              box-shadow var(--dur) var(--ease-out);
  transition-delay: var(--pkg-delay, 0ms);
}
.pkg-card.is-revealed { opacity: 1; transform: translateY(0); }
.pkg-card:hover {
  box-shadow: 0 30px 64px -26px rgba(20, 17, 14, 0.34);
}
.pkg-card.is-featured {
  background: var(--v3-dark);
  color: var(--v3-on-dark);
  border-color: var(--v3-dark);
}
.pkg-badge {
  position: absolute;
  top: -11px; left: 50%;
  transform: translateX(-50%);
  font-size: 10px;
  letter-spacing: 0.14em;
  padding: 6px 14px;
  border-radius: var(--r-pill);
  background: var(--v3-peach);
  color: var(--v3-dark);
}
.pkg-tier {
  font-size: 12px;
  letter-spacing: 0.16em;
  color: var(--v3-blue);
  margin: 0 0 14px;
}
.pkg-card.is-featured .pkg-tier { color: var(--v3-peach); }
.pkg-price {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin: 0 0 2px;
}
.pkg-usd {
  font-family: var(--font-mega);
  font-weight: var(--mega-weight);
  font-size: 58px;
  line-height: 0.9;
  letter-spacing: var(--mega-tracking);
}
.pkg-currency {
  font-size: 14px;
  font-weight: 600;
  color: var(--v3-on-cream-dim);
}
.pkg-card.is-featured .pkg-currency { color: var(--v3-on-dark-dim); }
.pkg-mxn {
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--v3-on-cream-dim);
  margin: 0 0 16px;
}
.pkg-card.is-featured .pkg-mxn { color: var(--v3-on-dark-dim); }
.pkg-desc {
  font-size: 14.5px;
  line-height: 1.45;
  color: var(--v3-on-cream-dim);
  margin: 0 0 20px;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--v3-line-cream);
}
.pkg-card.is-featured .pkg-desc {
  color: var(--v3-on-dark-dim);
  border-bottom-color: var(--v3-line-dark);
}
.pkg-feats {
  list-style: none;
  margin: 0 0 24px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 11px;
  flex: 1;
}
.pkg-feats li {
  position: relative;
  padding-left: 26px;
  font-size: 14px;
  line-height: 1.4;
}
.pkg-feats li::before {
  content: '';
  position: absolute;
  left: 0; top: 1px;
  width: 16px; height: 16px;
  border-radius: 50%;
  background: var(--v3-blue) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center / 10px no-repeat;
}
.pkg-card.is-featured .pkg-feats li::before { background-color: var(--v3-peach); }
.pkg-card.is-featured .pkg-feats li::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%230A0909' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E");
}
.pkg-card .btn { width: 100%; margin-bottom: 10px; }
.pkg-ask {
  border: 0;
  background: transparent;
  cursor: pointer;
  font: inherit;
  font-size: 13.5px;
  font-weight: 600;
  color: var(--v3-on-cream-dim);
  padding: 6px;
  transition: color var(--dur) var(--ease-out);
}
.pkg-ask:hover { color: var(--v3-blue); }
.pkg-card.is-featured .pkg-ask { color: var(--v3-on-dark-dim); }
.pkg-card.is-featured .pkg-ask:hover { color: var(--v3-peach); }

.pkg-footer {
  max-width: 1320px;
  margin: clamp(40px, 6vh, 64px) auto 0;
  text-align: center;
}
.pkg-foot-copy {
  font-size: clamp(18px, 2.4vw, 26px);
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0 0 20px;
}
.pkg-foot-ctas {
  display: flex;
  gap: 12px;
  justify-content: center;
  flex-wrap: wrap;
  margin-bottom: 22px;
}
.pkg-foot-note {
  font-size: 12px;
  letter-spacing: 0.02em;
  color: var(--v3-on-cream-dim);
  max-width: 620px;
  margin: 0 auto;
  line-height: 1.5;
}

/* ============================================================
   6 · FAQ (dark)
   ============================================================ */
.s-faq {
  background: var(--v3-dark);
  color: var(--v3-on-dark);
  padding: clamp(80px, 13vh, 160px) 0;
}
.s-faq .sec-head { margin-bottom: clamp(40px, 5vh, 60px); }
.faq-list {
  max-width: 880px;
  margin: 0 auto;
  padding: 0 clamp(20px, 5vw, 56px);
}
.faq-item {
  border-top: 1px solid var(--v3-line-dark);
}
.faq-item:last-child { border-bottom: 1px solid var(--v3-line-dark); }
.faq-summary {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  background: transparent;
  border: 0;
  cursor: pointer;
  font: inherit;
  font-size: clamp(16px, 2vw, 20px);
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--v3-on-dark);
  text-align: left;
  padding: 24px 0;
}
.faq-chev {
  position: relative;
  flex-shrink: 0;
  width: 18px; height: 18px;
}
.faq-chev::before,
.faq-chev::after {
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  background: var(--v3-peach);
  transform: translate(-50%, -50%);
  transition: transform var(--dur) var(--ease-out), opacity var(--dur) var(--ease-out);
}
.faq-chev::before { width: 16px; height: 2px; }
.faq-chev::after  { width: 2px; height: 16px; }
.faq-item.is-open .faq-chev::after { transform: translate(-50%, -50%) scaleY(0); opacity: 0; }
.faq-content {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.4s var(--ease-out);
}
.faq-item.is-open .faq-content { grid-template-rows: 1fr; }
.faq-inner { overflow: hidden; }
.faq-inner p {
  margin: 0;
  padding: 0 0 26px;
  font-size: 15.5px;
  line-height: 1.6;
  color: var(--v3-on-dark-dim);
  max-width: 660px;
}

/* ============================================================
   7 · CTA (dark)
   ============================================================ */
.s-cta {
  position: relative;
  background: var(--v3-dark);
  color: var(--v3-on-dark);
  padding: clamp(90px, 16vh, 200px) clamp(20px, 5vw, 56px);
  text-align: center;
  overflow: hidden;
}
.s-cta .sec-index { position: relative; z-index: 1; }
.cta-mega {
  position: relative;
  z-index: 1;
  font-family: var(--font-mega);
  font-weight: var(--mega-weight);
  font-size: calc(clamp(64px, 15vw, 230px) * var(--mega-scale));
  line-height: 0.9;
  letter-spacing: var(--mega-tracking);
  margin: 0 0 28px;
}
.cta-accent { color: var(--v3-peach); }
.cta-sub {
  position: relative;
  z-index: 1;
  font-size: clamp(16px, 2vw, 21px);
  line-height: 1.5;
  color: var(--v3-on-dark-dim);
  max-width: 560px;
  margin: 0 auto 34px;
}
.cta-ctas {
  position: relative;
  z-index: 1;
  display: flex;
  gap: 12px;
  justify-content: center;
  flex-wrap: wrap;
}

/* ============================================================
   FOOTER
   ============================================================ */
.ns-footer {
  background: var(--v3-dark-2);
  color: var(--v3-on-dark);
  padding: clamp(56px, 8vh, 88px) clamp(20px, 5vw, 56px) 32px;
  border-top: 1px solid var(--v3-line-dark);
}
.footer-grid {
  max-width: 1320px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 2fr 1fr 1fr 1fr;
  gap: 40px;
  padding-bottom: 48px;
  border-bottom: 1px solid var(--v3-line-dark);
}
.footer-brand .ns-brand { margin-bottom: 14px; }
.footer-tag {
  font-size: 14px;
  line-height: 1.5;
  color: var(--v3-on-dark-dim);
  max-width: 280px;
  margin: 0;
}
.footer-col h4 {
  font-family: var(--font-sans);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--v3-on-dark);
  margin: 0 0 16px;
}
.footer-col ul { list-style: none; margin: 0; padding: 0; }
.footer-col li { margin-bottom: 10px; }
.footer-col a {
  font-size: 14px;
  color: var(--v3-on-dark-dim);
  text-decoration: none;
  transition: color var(--dur) var(--ease-out);
}
.footer-col a:hover { color: var(--v3-peach); }
.footer-bottom {
  max-width: 1320px;
  margin: 24px auto 0;
}
.footer-bottom p {
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--v3-on-dark-faint);
  margin: 0;
}

/* ============================================================
   MOBILE STICKY CTA
   ============================================================ */
.mobile-cta {
  position: fixed;
  left: 12px; right: 12px;
  bottom: 12px;
  z-index: var(--z-overlay);
  display: none;
  gap: 10px;
  padding: 10px;
  border-radius: var(--r-pill);
  background: rgba(10, 9, 9, 0.86);
  backdrop-filter: var(--blur-mid);
  -webkit-backdrop-filter: var(--blur-mid);
  border: 1px solid var(--v3-line-dark);
  box-shadow: 0 12px 36px -10px rgba(0,0,0,0.6);
  transform: translateY(140%);
  transition: transform var(--dur-slow) var(--ease-out);
}
.mobile-cta.is-visible { transform: translateY(0); }
.mobile-cta .btn-primary { flex: 1; }
.mobile-cta .btn-peach { flex-shrink: 0; padding: 12px 16px; }

/* ============================================================
   MODALS
   ============================================================ */
.modal {
  position: fixed;
  inset: 0;
  z-index: var(--z-dialog);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(12px, 3vw, 36px);
}
.modal[hidden] { display: none; }
.modal-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(5, 4, 4, 0.72);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  animation: fadeIn 0.3s var(--ease-out);
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }

.modal-shell {
  position: relative;
  z-index: 1;
  width: min(1180px, 96vw);
  height: min(86vh, 820px);
  display: flex;
  flex-direction: column;
  background: var(--v3-dark-2);
  border: 1px solid var(--v3-line-dark);
  border-radius: var(--r-2xl);
  overflow: hidden;
  animation: modalIn 0.4s var(--ease-reveal);
}
@keyframes modalIn {
  from { opacity: 0; transform: translateY(24px) scale(0.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
.modal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 16px 18px;
  border-bottom: 1px solid var(--v3-line-dark);
  flex-shrink: 0;
}
.modal-title {
  font-size: 18px;
  font-weight: 700;
  color: var(--v3-on-dark);
  margin: 0;
}
.modal-viewport {
  display: flex;
  gap: 4px;
  padding: 4px;
  border-radius: var(--r-pill);
  background: var(--v3-dark-3);
}
.vp-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px; height: 32px;
  border: 0;
  border-radius: var(--r-pill);
  background: transparent;
  color: var(--v3-on-dark-dim);
  cursor: pointer;
  transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.vp-btn.is-active { background: var(--v3-peach); color: var(--v3-dark); }
.modal-close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px; height: 38px;
  border: 1px solid var(--v3-line-dark);
  border-radius: 50%;
  background: transparent;
  color: var(--v3-on-dark);
  cursor: pointer;
  flex-shrink: 0;
  transition: background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out);
}
.modal-close:hover { background: var(--v3-dark-3); border-color: var(--v3-on-dark-dim); }
.modal-stage {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  overflow: auto;
  background:
    radial-gradient(800px 500px at 50% 0%, rgba(58,84,247,0.08), transparent 70%),
    var(--v3-dark);
}
/* tablet / mobile keep breathing room so the device frame reads as a device */
.modal-stage:has(.modal-device[data-vp="tablet"]),
.modal-stage:has(.modal-device[data-vp="mobile"]) {
  padding: clamp(12px, 2.4vw, 28px);
}
.modal-device {
  width: 100%;
  height: 100%;
  border-radius: 0;
  overflow: hidden;
  background: #fff;
  box-shadow: none;
  transition: width var(--dur-slow) var(--ease-out), height var(--dur-slow) var(--ease-out);
}
.modal-device[data-vp="tablet"],
.modal-device[data-vp="mobile"] {
  border-radius: var(--r-lg);
  box-shadow: 0 30px 80px -30px rgba(0,0,0,0.7);
}
.modal-device[data-vp="tablet"] { width: 834px; max-width: 100%; }
.modal-device[data-vp="mobile"] { width: 390px; max-width: 100%; }
.modal-device iframe {
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
  opacity: 0;
  transition: opacity 0.18s var(--ease-out);
}
/* On phones: hide the device switcher and lock the preview to mobile view
   (JS opens the modal already pinned to data-vp="mobile"). */
@media (max-width: 767px) {
  .modal-viewport { display: none; }

  /* The preview must fill the real screen width — a fixed 390px "device"
     was wider than small phones, causing horizontal drift / no fixed view. */
  .modal { padding: 0; }
  .modal-shell { width: 100vw; height: 100svh; max-width: 100%; border: 0; border-radius: 0; }
  .modal-stage { padding: 0 !important; overflow: hidden; background: #fff; }
  .modal-device,
  .modal-device[data-vp="mobile"],
  .modal-device[data-vp="tablet"] {
    width: 100% !important;
    max-width: 100% !important;
    height: 100%;
    border-radius: 0;
    box-shadow: none;
  }
}

/* buy modal card */
.modal-card {
  position: relative;
  z-index: 1;
  width: min(480px, 96vw);
  background: var(--v3-dark-2);
  border: 1px solid var(--v3-line-dark);
  border-radius: var(--r-2xl);
  padding: 36px 32px 30px;
  animation: modalIn 0.4s var(--ease-reveal);
}
.modal-card .modal-close { position: absolute; top: 16px; right: 16px; }
.eyebrow {
  font-size: 11px;
  letter-spacing: 0.16em;
  color: var(--v3-peach);
  margin: 0 0 8px;
}
.modal-card h3 {
  font-size: 26px;
  font-weight: 700;
  color: var(--v3-on-dark);
  margin: 0 0 12px;
}
.buy-desc {
  font-size: 14.5px;
  line-height: 1.5;
  color: var(--v3-on-dark-dim);
  margin: 0 0 24px;
}
.buy-options { display: flex; flex-direction: column; gap: 12px; margin-bottom: 22px; }
.buy-option {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px;
  border-radius: var(--r-lg);
  border: 1px solid var(--v3-line-dark);
  background: var(--v3-dark-3);
  text-decoration: none;
  color: var(--v3-on-dark);
  transition: border-color var(--dur) var(--ease-out), transform var(--dur) var(--ease-out);
}
.buy-option:hover { border-color: var(--v3-peach); transform: translateY(-2px); }
.buy-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px; height: 42px;
  border-radius: 50%;
  flex-shrink: 0;
}
.buy-icon.peach { background: var(--v3-peach); color: var(--v3-dark); }
.buy-icon.blue  { background: var(--v3-blue); color: #fff; }
.buy-icon.whatsapp { background: #25D366; color: #fff; }
.buy-option > span:nth-child(2) { display: flex; flex-direction: column; gap: 2px; flex: 1; }
.buy-option strong { font-size: 15px; font-weight: 700; }
.buy-hint { font-size: 12.5px; color: var(--v3-on-dark-dim); }
.buy-arrow { color: var(--v3-on-dark-dim); flex-shrink: 0; }
.buy-foot {
  font-size: 11px;
  letter-spacing: 0.1em;
  color: var(--v3-on-dark-faint);
  text-align: center;
  margin: 0;
}

/* ============================================================
   REVEAL ANIMATIONS
   ============================================================ */
.reveal-fade {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity 0.7s var(--ease-reveal), transform 0.7s var(--ease-reveal);
  transition-delay: var(--reveal-delay, 0ms);
}
.reveal-fade.is-in { opacity: 1; transform: translateY(0); }

.reveal-up {
  opacity: 0;
  transform: translateY(38px);
  transition: opacity 0.7s var(--ease-reveal), transform 0.7s var(--ease-reveal);
  transition-delay: var(--reveal-delay, 0ms);
}
.reveal-up.is-in { opacity: 1; transform: translateY(0); }

.reveal-3d {
  opacity: 0;
  transform: perspective(1000px) rotateX(34deg) translateY(40px);
  transform-origin: 50% 100%;
  transition: opacity 0.8s var(--ease-reveal), transform 0.8s var(--ease-reveal);
}
.reveal-3d.is-in { opacity: 1; transform: perspective(1000px) rotateX(0) translateY(0); }

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width: 1000px) {
  .footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }
  .footer-brand { grid-column: 1 / -1; }
}

@media (max-width: 860px) {
  .ns-nav-links { display: none; }
  .ns-nav-pill { padding: 7px 7px 7px 12px; gap: 12px; }
  /* Sticky mobile CTA bar — HIDDEN for now (covered too much and duplicated the
     chatbot button). To re-enable later, set `.mobile-cta { display: flex; }`
     here and restore `#webi-root { bottom: 84px !important; }` below. */
  .mobile-cta { display: none !important; }
  body.landing-body.v3 main { padding-bottom: 0; }

  .bento-grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: 200px; }
  .bento-2x2 { grid-column: span 2; grid-row: span 2; }
  .bento-2x1 { grid-column: span 2; }
  .bento-4x1 { grid-column: span 2; grid-row: span 1; }
  /* Let the trio's cards flow as normal grid items so the wrapper doesn't
     overflow its fixed auto-row and collide with the next section. */
  .bento-trio { display: contents; }
  .bento-trio-card { grid-column: span 1; grid-row: span 1; min-height: 0; }

  .proc-steps { grid-template-columns: 1fr; gap: 0; }
  .proc-step { padding: 22px 0; }

  .pkg-grid.is-active { grid-template-columns: 1fr; }
  .pkg-card.is-featured { order: -1; }

  .hero-foot { flex-direction: column; align-items: flex-start; }
  .hero-scroll-hint { display: none; }
}

@media (max-width: 540px) {
  .bento-grid { grid-template-columns: 1fr; grid-auto-rows: 220px; }
  .bento-2x2, .bento-2x1, .bento-4x1 { grid-column: span 1; grid-row: span 1; }
  .bento-trio { display: contents; }
  .bento-trio-card { grid-column: span 1; grid-row: span 1; min-height: 0; }
  .footer-grid { grid-template-columns: 1fr; }
  .hero-line { font-size: clamp(60px, 22vw, 120px); }
}

/* Touch / low-power devices: drop GPU-heavy effects that caused render
   crashes on phones (backdrop-filter blur is very expensive to composite). */
@media (hover: none), (pointer: coarse) {
  .grain-canvas { display: none !important; }
  .ns-nav-pill,
  .bento-live-badge,
  .modal-backdrop,
  .buy-icon,
  .glass,
  [class*="glass"] {
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
  }

  /* Mobile fix — the fixed footer CTA jumped to mid-screen on iOS because
     `overflow-x: clip` on <html> changes the containing block of position:fixed
     descendants there. Relocate the horizontal clip to <main> (which still
     contains the only horizontal-overflow source, the giant Hero type) so the
     fixed nav + footer re-anchor to the viewport. `clip` doesn't create a
     scroll container, so position:sticky inside <main> keeps working. */
  html { overflow-x: visible; }
  body.landing-body.v3 main { overflow-x: clip; }

  /* Respect the iOS home-bar safe area so the bar sits flush at the bottom. */
  .mobile-cta { bottom: max(12px, env(safe-area-inset-bottom)); }

  /* Webi chat (inline widget) — mobile overrides, SCOPED to this landing only
     (does not touch the shared Webi product). 16px inputs stop iOS focus-zoom;
     the panel goes full-screen and tracks the visual viewport (--webi-vh, set
     by JS) so the composer rides above the on-screen keyboard. The widget's own
     "Cerrar" button still closes it. */
  #webi-root .webi-composer-input,
  #webi-root input,
  #webi-root textarea { font-size: 16px !important; }

  /* Full-screen panel that exactly fits the VISIBLE viewport (above keyboard).
     Anchor only at the top (following visualViewport offset) + height = visible
     height — never set bottom, so it can't fight the keyboard or jump up. */
  #webi-root .webi-panel {
    position: fixed !important;
    top: var(--webi-top, 0px) !important;
    left: 0 !important;
    right: auto !important;
    bottom: auto !important;
    width: 100vw !important;
    max-width: 100vw !important;
    height: var(--webi-vh, 100dvh) !important;
    max-height: var(--webi-vh, 100dvh) !important;
    border-radius: 0 !important;
  }
  /* Hide the launcher bubble while the chat is open (it sat over the panel). */
  #webi-root .webi-panel.webi-open ~ .webi-bubble { display: none !important; }
}

@media (prefers-reduced-motion: reduce) {
  .reveal-fade, .reveal-up, .reveal-3d,
  .s-hero .hero-line,
  .pkg-card {
    opacity: 1 !important;
    transform: none !important;
    animation: none !important;
    transition: none !important;
  }
  .hero-marquee-track,
  .scroll-arrow,
  .ed-cursor, .ed-cursor svg, .ed-cursor::after,
  .bento-live-badge::before { animation: none !important; }
  .s-hero.is-ready .ed-cursor { opacity: 1 !important; }
  .statement-text .word { opacity: 1 !important; }
  .grain-canvas { opacity: 0.06; }
}
