/* ═══════════════════════════════════════════════════════════════
   MyHandler.ai — /v2 landing page (design review rebuild)
   Same dark/gold palette as newlanding.css. Everything else is new:
   real spacing/type/radius/motion scales, left-aligned editorial
   composition, no scroll-jacking, no WebGL, restrained motion.
   Scoped under .v2-page.
   ═══════════════════════════════════════════════════════════════ */

:root {
  /* ── Colour ──────────────────────────────────────────────────────
     This page's ONLY colour opinion is that it collapses the four
     surface tiers into two: page and one raised. Everything else —
     gold, ink, muted, borders — is inherited from landing.css, which
     owns the light/dark tokens.

     Do NOT re-declare --gold / --warm-white / --muted here. home.css
     loads after landing.css at equal specificity, so a literal here
     wins in BOTH themes: a hardcoded --warm-white: #F5F0E8 painted the
     homepage cream-on-cream in light mode. */
  --dark: var(--surface-page);
  --dark-1: var(--surface-page);   /* the shared _PricingSection partial references this */
  --dark-2: var(--surface-raised);   /* the ONE raised surface (was --dark-2/3/4) */
  --dark-3: var(--surface-raised);
  --dark-4: var(--surface-raised);
  --green: rgba(100, 200, 120, 0.85);

  /* ── Spacing scale (was 31 arbitrary values) ── */
  --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; --sp-40: 160px; --sp-56: 224px;

  /* ── Radius scale (was 9 values) ── */
  --r-sm: 4px; --r-md: 10px; --r-lg: 20px; --r-pill: 100px;

  /* ── Shadow scale (was 8 bespoke shadows, several gold glows) ── */
  --sh-1: 0 1px 2px rgba(var(--shadow-rgb), 0.4);
  --sh-2: 0 12px 32px rgba(var(--shadow-rgb), 0.45);
  --sh-3: 0 40px 120px rgba(var(--shadow-rgb), 0.6);

  /* ── Motion scale (was 10 durations / 4 easings) ── */
  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --dur-1: 160ms; --dur-2: 280ms; --dur-3: 520ms;

  /* ── Display face ── */
  --font-display: 'Playfair Display', Georgia, serif;
  --display-weight: 500;
  --display-track-h1: -0.022em;
  --display-track-h2: -0.015em;

  /* ── Beat headings: TWO sizes, alternating loud / quiet / loud / quiet.
     Four different sizes read as inconsistency, not hierarchy — a reader
     can't infer a rule from 54 / 38 / 82 / 44. ── */
  --beat-lead:  clamp(40px, 4.6vw, 62px);
  --beat-quiet: clamp(30px, 3.2vw, 42px);

  /* ── Measures ── */
  --w-wide: 1240px;   /* tables, full product moments */
  --w-page: 1080px;   /* default */
  --w-read: 680px;    /* reading passages */
}

.v2-page {
  /* The `*` reset below only reaches DESCENDANTS, and .v2-page IS <body> —
     so the UA's 8px body margin survived and nothing was truly full-bleed
     (a visible seam down the left of the stage). */
  margin: 0;
  color-scheme: dark;              /* fixes light UA chrome on select/autofill/scrollbars */
  background: var(--dark);
  color: var(--warm-white);
  font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  font-weight: 400;
  line-height: 1.6;
  /* clip, not hidden — `overflow-x: hidden` makes this a scroll
     container and breaks the sticky stage. */
  overflow-x: clip;
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
}

.v2-page *,
.v2-page *::before,
.v2-page *::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

/* Keyboard focus — the old page had no :focus-visible anywhere */
.v2-page :focus-visible {
  outline: 2px solid var(--gold-light);
  outline-offset: 3px;
  border-radius: var(--r-sm);
}

/* ═══ Type ═══════════════════════════════════════════════════════
   Display serif is used at h1/h2 ONLY — never below 30px, never
   italic, never in a card title. Mono is the eyebrow and nothing
   else. Body weight is 400 (the old page's 300 read as thin/generic).
   ═══════════════════════════════════════════════════════════════ */
.v2-h1 {
  font-family: var(--font-display);
  font-size: clamp(48px, 7.4vw, 104px);
  font-weight: var(--display-weight);
  line-height: 0.95;
  letter-spacing: var(--display-track-h1);
}

/* Hero lead-in. The verb triplet is the concrete "what it does" line and has
   to read BEFORE the headline — but it cannot live inside the H1. The hero's
   copy column is ~495px, so display type fits ~10 characters per line; a
   60-character sentence rags into six lines and orphans single words. At body
   scale it wraps to two clean lines. Primary colour, not muted: this line is
   carrying the value proposition, not supporting it. */
.v2-hero-lead {
  font-size: 22px;
  line-height: 1.45;
  color: var(--warm-white);
  max-width: 30ch;
  margin-bottom: var(--sp-6);
  text-wrap: balance;
}

.v2-h2 {
  font-family: var(--font-display);
  font-size: clamp(34px, 4.4vw, 46px);
  font-weight: var(--display-weight);
  line-height: 1.08;
  letter-spacing: var(--display-track-h2);
  max-width: 18ch;
}

.v2-h3 {
  font-family: var(--font-display);
  font-size: 26px;
  font-weight: var(--display-weight);
  line-height: 1.25;
  letter-spacing: -0.01em;
}

/* ═══ The stage ═════════════════════════════════════════════════
   The old page's atmosphere came from the photograph and the ember
   field — not from the 1240vh of pinned scroll. So: one sticky stage
   sits behind the hero AND the three beats (~2.6 screens total, vs
   12.5), and the content scrolls over it. No pinning, no scroll
   hijack, no GSAP/Lenis/three.js.
   ═══════════════════════════════════════════════════════════════ */
.v2-stage-wrap { position: relative; }

.v2-stage {
  position: sticky;
  top: 0;
  height: 100vh;
  z-index: 0;
  overflow: hidden;
}

.v2-stage-poster {
  position: absolute;
  inset: 0;
  background: url('/newlanding/hero.png') center / cover no-repeat;
  /* A slow push-in across the run, anchored on the light in the photograph
     (the same point the embers drift toward). */
  transform: scale(var(--stage-push, 1));
  transform-origin: 62% 42%;
}

/* Darkens as you descend, so the beats read cleanly over it and the
   photo recedes rather than competing. Driven by --stage-dim in JS. */
.v2-stage-dim {
  position: absolute;
  inset: 0;
  background: var(--dark);
  opacity: calc(0.16 + 0.52 * var(--stage-dim, 0));
}

.v2-stage-scrim {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(90deg, rgba(var(--page-rgb), 0.9) 0%, rgba(var(--page-rgb), 0.45) 55%, rgba(var(--page-rgb), 0.15) 100%),
    linear-gradient(180deg, rgba(var(--page-rgb), 0.75) 0%, transparent 30%, rgba(var(--page-rgb), 0.85) 100%);
}

.v2-embers { position: absolute; inset: 0; width: 100%; height: 100%; }

.v2-stage-content { position: relative; z-index: 2; margin-top: -100vh; }

/* Film grain — scoped to the stage, not the whole page. Global grain
   meant it also sat over the ability loops and the privacy clip, where
   it shimmers on compressed H.264. */
.v2-stage::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
  pointer-events: none;
  z-index: 3;
  opacity: 0.22;
}

/* ── Beats over the stage ─────────────────────────────────────── */
.v2-beats { padding: 0 var(--sp-10) var(--sp-24); }
.v2-beats .v2-h2,
.v2-beats .v2-qa-live-q { text-shadow: 0 2px 30px rgba(var(--page-rgb), 0.9); }
.v2-beats .v2-inner { max-width: var(--w-wide); }

/* ═══ Beat archetypes ═══════════════════════════════════════════
   Four beats, four compositions. Previously all four shared one
   modifier, so they sat exactly 792px apart with an identical grid,
   an identical 62px heading and the media's right edge on the same
   x — five screens, two guides, no variance. Each now differs in
   split ratio, which side the media sits on, scale, alignment and
   figure/ground. No new copy and no new assets: same poster, same
   video id, same words.

   NOTE: the shared `.v2-beat .v2-h2` base rule lives ABOVE these on
   purpose. It has the same specificity, so whichever comes last wins
   — with it below, every per-beat size override was dead.
   ═══════════════════════════════════════════════════════════════ */
/* ═══ Feature section: one player, four tabs ════════════════════
   Replaces four stacked two-column sections. They could not be made to
   stop reading as a template, because each showed the same branded
   title card — so the fix was to show one at a time.
   ═══════════════════════════════════════════════════════════════ */
/* ── Pinned scroll (scrollytelling) ────────────────────────────
   The section is four viewports tall; its inner stage sticks to the top
   for the whole run. Scroll progress swaps which feature is showing, so
   each one gets a held moment in the SAME place instead of four
   sections stacked down the page. No scroll hijacking — the page scrolls
   at its normal rate; only the content changes. */
.v2-scrolly { height: 400vh; padding: 0 var(--sp-10); position: relative; }
/* Anchored to the TOP, not vertically centred. Centring made the tab row's
   position depend on the tallest panel — and Recall's typed answer changes
   height as it cycles, so the tabs drifted up and down. */
.v2-scrolly-stage {
  position: sticky;
  top: 0;
  height: 100vh;
  display: flex;
  align-items: flex-start;
  padding-top: 16vh;
}
.v2-scrolly-stage > .v2-inner { width: 100%; }

/* Panels stack in one place and cross-fade. Grid (not absolute) so the
   stage height is driven by the tallest panel and never jumps. */
/* Slide, not cross-fade: the outgoing panel exits the way you're scrolling
   and the incoming one arrives from the opposite edge, so the motion agrees
   with the scroll direction. JS flips --enter/--exit when you scroll back up.
   Non-active panels rest at --enter; when direction flips they jump to the
   other side, which is invisible because they're already opacity 0. */
.v2-feature-stage { display: grid; --enter: 44px; --exit: -44px; }
.v2-feature-panel {
  grid-area: 1 / 1;
  align-content: start;
  opacity: 0;
  visibility: hidden;
  transform: translateY(var(--enter));
  transition: opacity var(--dur-2) var(--ease), transform var(--dur-2) var(--ease), visibility 0s linear var(--dur-2);
}
.v2-feature-panel.is-on {
  opacity: 1;
  visibility: visible;
  transform: none;
  transition: opacity var(--dur-2) var(--ease), transform var(--dur-2) var(--ease), visibility 0s;
}
/* The one on its way out — held visible so the exit is actually seen. */
.v2-feature-panel.is-leaving {
  opacity: 0;
  visibility: visible;
  transform: translateY(var(--exit));
  transition: opacity var(--dur-2) var(--ease), transform var(--dur-2) var(--ease), visibility 0s linear var(--dur-2);
}
/* `hidden` would take the panel out of the grid and collapse the height. */
.v2-feature-panel[hidden] { display: grid; }

.v2-feature { padding: 0; }

/* Reduced motion / no-JS: no pin, no swap — the four panels simply stack
   and read top to bottom. */
@media (prefers-reduced-motion: reduce) {
  .v2-scrolly { height: auto; }
  .v2-scrolly-stage { position: static; height: auto; display: block; padding: var(--sp-16) 0; }
  .v2-feature-stage { display: block; }
  .v2-feature-panel {
    opacity: 1;
    visibility: visible;
    transform: none;
    margin-bottom: var(--sp-24);
  }
  .v2-feature-tabs { display: none; }
}

html:not(.v2-js) .v2-scrolly { height: auto; }
html:not(.v2-js) .v2-scrolly-stage { position: static; height: auto; display: block; padding: var(--sp-16) 0; }
html:not(.v2-js) .v2-feature-stage { display: block; }
html:not(.v2-js) .v2-feature-panel { opacity: 1; visibility: visible; transform: none; margin-bottom: var(--sp-24); }
html:not(.v2-js) .v2-feature-tabs { display: none; }

/* 21 chars at the 104px cap is ~2 lines; balance stops it dropping a lone
   word onto the last line. Hero only. */
.v2-hero .v2-h1 { text-wrap: balance; }

/* Doubles as a progress rail: it shows where you are in the pinned run,
   and each label is still clickable to jump to that segment. */
.v2-feature-tabs {
  display: flex;
  gap: var(--sp-2);
  flex-wrap: wrap;
  padding-bottom: var(--sp-6);
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--sp-12);
  position: relative;
}
.v2-feature-tabs::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: -1px;
  height: 1px;
  width: var(--rail, 0%);
  background: var(--gold);
  transition: width var(--dur-2) var(--ease);
}

.v2-tab {
  font-family: 'DM Mono', monospace;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  /* Was --dimmer (25%), which computes to ~2:1 against the page — unreadable
     at 11px uppercase. 78% lands around 8:1, and the hairline border makes an
     unselected tab read as a control rather than as disabled text. */
  color: rgba(var(--ink-rgb), 0.78);
  background: rgba(var(--ink-rgb), 0.03);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  padding: var(--sp-3) var(--sp-5);
  min-height: 44px;                 /* touch target */
  cursor: pointer;
  white-space: nowrap;
  transition: color var(--dur-1) var(--ease), background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease);
}
.v2-tab:hover {
  color: var(--warm-white);
  background: rgba(var(--ink-rgb), 0.08);
  border-color: var(--border-gold);
}
.v2-tab.is-on {
  color: var(--dark);
  background: var(--gold);
  border-color: var(--gold);
}

.v2-feature-panel {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: var(--sp-16);
  align-items: start;   /* video's top edge lines up with the heading's */
}
.v2-feature-panel[hidden] { display: none; }
.v2-feature-col .v2-h2 { font-size: var(--beat-lead); max-width: 15ch; }

.v2-feature-video {
  aspect-ratio: 16 / 9;
  border: 1px solid rgba(var(--ink-rgb), 0.28);
  border-radius: var(--r-md);
  overflow: hidden;
  background: #0B0A08;
  box-shadow:
    0 0 0 1px rgba(var(--gold-rgb), 0.22),
    0 0 100px rgba(var(--gold-rgb), 0.14),
    0 32px 90px rgba(var(--shadow-rgb), 0.78);
}
.v2-feature-video .v2-video-poster { filter: brightness(1.28) contrast(1.03) saturate(1.06); }
.v2-feature-video .v2-video-play {
  background: linear-gradient(180deg, transparent 12%, rgba(var(--scrim-rgb), 0.6) 48%, rgba(var(--scrim-rgb), 0.97) 100%);
  padding: var(--sp-5);
}

/* Switching panels shouldn't jolt the page — fade the incoming one in. */
.v2-js .v2-feature-panel.is-on { animation: v2-panel-in var(--dur-2) var(--ease) both; }
@keyframes v2-panel-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

@media (max-width: 1024px) {
  .v2-feature-panel { grid-template-columns: 1fr; gap: var(--sp-8); }
  .v2-feature-col { order: 2; }
  .v2-feature-video { order: 1; }
}
@media (max-width: 768px) {
  .v2-feature { padding: var(--sp-12) 0 var(--sp-16); }
  .v2-feature-tabs { margin-bottom: var(--sp-10); gap: 2px; }
  .v2-tab { font-size: 10px; padding: var(--sp-3); letter-spacing: 0.1em; }
}
@media (prefers-reduced-motion: reduce) {
  .v2-js .v2-feature-panel.is-on { animation: none; }
  .v2-feature-panel,
  .v2-feature-panel.is-on,
  .v2-feature-panel.is-leaving { transform: none; }
}

.v2-beat-inner { width: 100%; }

/* Break the exact period — the four tops used to be 792px apart. */
/* Rhythm comes from PADDING, not min-height. With min-height + centring, each
   beat padded itself above and below its content — and adjacent halves added
   up to ~290px of dead stage between Recall and Ghostwriter. Padding makes the
   gap between two beats exactly what it says. */
.v2-beat--recall    { padding: var(--sp-12) 0 var(--sp-20); }
.v2-beat--ghost     { padding: var(--sp-20) 0; }
.v2-beat--dictation { padding: var(--sp-24) 0 var(--sp-16); }
.v2-beat--voice     { padding: 0; }

/* ── 1. Recall — contained, the largest split panel, type left ──
   NO edge bleed and NO type-on-panel overlap. Every poster here is a
   CENTRED designed card (logo, pill, title, subtitle, footer), so bleeding
   one off the viewport cuts its subtitle mid-word and pushes its title
   off-centre — it reads as a rendering fault, not a composition. The
   posters have to stay intact and roughly centred; differentiation comes
   from panel scale, side, type size and figure/ground instead. */
.v2-beat--recall .v2-beat-inner {
  max-width: none;
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: var(--sp-12);
  align-items: center;
}
.v2-beat--recall .v2-h2 { font-size: var(--beat-lead); max-width: 15ch; }

/* ── 2. Ghostwriter — flipped, smaller, bottom-aligned ── */
.v2-beat--ghost { position: relative; }
/* The stage scrim is dark-on-the-left; this beat's type is on the right,
   so it needs its own counter-scrim spanning the full viewport. */
.v2-beat--ghost::before {
  content: '';
  position: absolute;
  inset: 0 calc(50% - 50vw);
  z-index: 0;
  pointer-events: none;
  background: linear-gradient(270deg,
    rgba(var(--page-rgb), 0.9) 0%,
    rgba(var(--page-rgb), 0.3) 44%,
    transparent 68%);
}
.v2-beat--ghost > * { position: relative; z-index: 1; }
.v2-beat--ghost .v2-beat-inner {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 4fr);
  gap: var(--sp-16);
  align-items: end;
}
.v2-beat--ghost .v2-beat-video { grid-column: 1; grid-row: 1; }
.v2-beat--ghost .v2-beat-col   { grid-column: 2; grid-row: 1; }
.v2-beat--ghost .v2-h2 { font-size: var(--beat-quiet); max-width: 18ch; }
.v2-beat--ghost .v2-beat-body { max-width: 38ch; }
.v2-beat--ghost .v2-beat-video {
  box-shadow: 0 0 0 1px rgba(var(--gold-rgb), 0.16), 0 20px 56px rgba(var(--shadow-rgb), 0.7);
}

/* ── 3. Dictation — no split at all: stacked, biggest type, media as a band ── */
.v2-beat--dictation .v2-beat-inner { display: block; max-width: none; }
.v2-beat--dictation .v2-h2 { font-size: var(--beat-lead); max-width: 17ch; }
.v2-beat--dictation .v2-beat-body {
  margin-top: var(--sp-8);
  columns: 2;
  column-gap: var(--sp-12);
  max-width: 68ch;
}
.v2-beat--dictation .v2-beat-video {
  margin-top: var(--sp-16);
  width: 100%;
  aspect-ratio: 21 / 9;
}

/* ── 4. Voice Command — off the stage, on a flat surface, type right ── */
.v2-offstage {
  background: var(--dark-2);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}
.v2-beat--voice .v2-beat-inner {
  display: grid;
  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  gap: var(--sp-20);
  align-items: center;
}
.v2-beat--voice .v2-beat-video { grid-column: 1; grid-row: 1; }
.v2-beat--voice .v2-beat-col   { grid-column: 2; grid-row: 1; text-align: right; }
.v2-beat--voice .v2-h2 {
  margin-left: auto;
  font-size: var(--beat-quiet);
  max-width: 15ch;
}
/* No photograph behind it now, so the stage-era shadows come off. */
.v2-beat--voice .v2-h2,
.v2-beat--voice .v2-eyebrow { text-shadow: none; }
.v2-beat--voice .v2-beat-video {
  box-shadow: var(--sh-2);
  border-color: var(--border);
}

/* ── Per-beat poster crops. All four posters are the SAME designed title
   card, so every screen was printing its headline twice — once as the h2,
   once inside the poster. Different crops break that up. ── */
/* Recall's panel is exactly 16:9 and so is the poster, so ANY scale clips the
   designed title mid-word and reads as broken rather than cropped. It gets its
   differentiation from the bleed and the type-on-panel instead. */
.v2-beat--recall    .v2-video-poster { object-position: center; }
.v2-beat--ghost     .v2-video-poster { object-position: 34% 40%;    transform: scale(1.22); }
.v2-beat--dictation .v2-video-poster { object-position: center 52%; }
.v2-beat--voice     .v2-video-poster { object-position: center 58%; }

/* ── Staggered entry: different direction and order per beat ── */
.v2-js .v2-beat-col,
.v2-js .v2-beat-video {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity var(--dur-3) var(--ease), transform var(--dur-3) var(--ease);
}
.v2-js .v2-beat.is-in .v2-beat-col,
.v2-js .v2-beat.is-in .v2-beat-video { opacity: 1; transform: none; }
.v2-js .v2-beat--recall .v2-beat-video      { transform: translateY(28px) scale(1.015); }
.v2-js .v2-beat--recall.is-in .v2-beat-col     { transition-delay: 140ms; }
.v2-js .v2-beat--ghost  .v2-beat-col        { transform: translateX(20px); }
.v2-js .v2-beat--ghost.is-in .v2-beat-col      { transition-delay: 120ms; }
.v2-js .v2-beat--dictation.is-in .v2-beat-video { transition-delay: 200ms; }
.v2-js .v2-beat--voice  .v2-beat-video      { transform: translateX(-20px); }

.v2-beat-body {
  margin-top: var(--sp-6);
  font-size: 17px;
  line-height: 1.6;
  color: var(--muted);
  max-width: 46ch;
  text-shadow: 0 2px 20px rgba(var(--page-rgb), 0.9);
}
/* These players are smaller than the hero's, so the poster's own centred
   tagline sits close to the control — the scrim has to work harder. */
.v2-beat-video .v2-video-play {
  background: linear-gradient(180deg, transparent 12%, rgba(var(--scrim-rgb), 0.6) 48%, rgba(var(--scrim-rgb), 0.97) 100%);
  padding: var(--sp-5);
}
/* The posters are near-black title cards sitting on a near-black stage, so
   the panel had no edge. Three things give it one: a brighter rim, a warm
   halo that separates it from the photograph, and a lift on the poster
   itself so the card reads lighter than what's behind it. */
.v2-beat-video {
  aspect-ratio: 16 / 9;
  border: 1px solid rgba(var(--ink-rgb), 0.28);
  border-radius: var(--r-md);
  overflow: hidden;
  background: #0B0A08;
  box-shadow:
    0 0 0 1px rgba(var(--gold-rgb), 0.22),
    0 0 90px rgba(var(--gold-rgb), 0.13),
    0 32px 90px rgba(var(--shadow-rgb), 0.75);
}
.v2-beat-video .v2-video-poster,
.v2-hero .v2-video-poster { filter: brightness(1.28) contrast(1.03) saturate(1.06); }
/* Tablet: keep the archetypes' character but ease the extremes — the bleed
   and the type-on-panel overlap need room they don't have here. */
@media (max-width: 1024px) {
  .v2-beat--recall .v2-beat-inner { grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); }
  .v2-beat--recall .v2-beat-col { margin-right: 0; }
  .v2-beat--recall .v2-beat-video::before {
    background: linear-gradient(90deg, rgba(var(--page-rgb), 0.7) 0%, transparent 40%);
  }
  .v2-beat--ghost .v2-beat-inner { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-10); }
  .v2-beat--voice .v2-beat-inner { gap: var(--sp-12); }
  .v2-beat--dictation .v2-beat-body { columns: 1; }
}

/* ── The typed exchange ───────────────────────────────────────
   Restored from the old hero — it's the one animation that shows
   the product rather than decorating it. The static ledger below
   is what renders with JS off or reduced motion on. ── */
.v2-qa-live {
  margin-top: var(--sp-8);
  max-width: 62ch;
  /* Reserved height: the answer appears and disappears as the exchange
     cycles, and without a floor the panel would resize under the layout. */
  min-height: 150px;
  padding-left: var(--sp-5);
  border-left: 1px solid var(--border-gold);
}
.v2-qa-live-q { font-size: 19px; color: var(--warm-white); line-height: 1.4; }
.v2-qa-live-q::before { content: '›'; color: var(--gold); margin-right: var(--sp-2); }
.v2-qa-caret {
  display: inline-block;
  width: 2px;
  height: 1em;
  margin-left: 2px;
  background: var(--gold);
  vertical-align: -0.12em;
  animation: v2-blink 1.05s step-end infinite;
}
@keyframes v2-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
.v2-qa-live-a {
  margin-top: var(--sp-4);
  font-family: 'DM Mono', monospace;
  font-size: 14px;
  line-height: 1.55;
  color: var(--muted);
  opacity: 0;
  transition: opacity var(--dur-3) var(--ease);
}
.v2-qa-live-a.is-on { opacity: 1; }

/* ── Magnetic CTA + glint ─────────────────────────────────────── */
.v2-magnetic { transition: transform var(--dur-2) var(--ease), background var(--dur-1) var(--ease); will-change: transform; }
.v2-glint { position: relative; overflow: hidden; }
.v2-glint::after {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  width: 40%;
  left: -60%;
  background: linear-gradient(100deg, transparent, rgba(var(--ink-rgb), 0.28), transparent);
  transform: skewX(-18deg);
  animation: v2-glint-sweep 5.5s ease-in-out infinite;
  pointer-events: none;
}
@keyframes v2-glint-sweep {
  0%, 62% { left: -60%; }
  86%, 100% { left: 120%; }
}

.v2-eyebrow {
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold);
}

.v2-lead {
  font-size: 20px;
  line-height: 1.5;
  color: var(--muted);
  max-width: 46ch;
}

.v2-body { font-size: 16px; line-height: 1.6; color: var(--muted); max-width: 52ch; }
.v2-caption { font-size: 13px; line-height: 1.45; color: var(--dimmer); }

/* ═══ Section rhythm ════════════════════════════════════════════
   Three deliberate tempos instead of 140px everywhere.
   ═══════════════════════════════════════════════════════════════ */
.v2-section { padding: var(--sp-40) var(--sp-10); }
.v2-section--dense { padding: var(--sp-24) var(--sp-10); }
.v2-section--loud  { padding: var(--sp-56) var(--sp-10); }
.v2-inner { max-width: var(--w-page); margin: 0 auto; }
.v2-inner--wide { max-width: var(--w-wide); margin: 0 auto; }
.v2-surface { background: var(--dark-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }

/* ═══ Buttons / links ═══════════════════════════════════════════
   Flat gold. No gradients, no glow shadows, no hover lift.
   ═══════════════════════════════════════════════════════════════ */
.v2-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  font-family: 'DM Sans', sans-serif;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.02em;
  text-decoration: none;
  border: 1px solid transparent;
  border-radius: var(--r-sm);
  cursor: pointer;
  transition: background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
}

.v2-btn-gold { background: var(--gold); color: var(--dark); padding: var(--sp-4) var(--sp-8); }
.v2-btn-gold:hover { background: var(--gold-light); }
.v2-btn-lg { padding: var(--sp-5) var(--sp-10); font-size: 15px; }

.v2-btn-quiet {
  background: transparent;
  border-color: var(--border);
  color: var(--warm-white);
  padding: var(--sp-4) var(--sp-6);
}
.v2-btn-quiet:hover { border-color: var(--border-gold); }

.v2-link-quiet {
  font-size: 14px;
  color: var(--muted);
  text-decoration: none;
  border-bottom: 1px solid var(--border);
  padding-bottom: 2px;
  transition: color var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease);
}
.v2-link-quiet:hover { color: var(--warm-white); border-bottom-color: var(--gold); }

/* ═══ Nav ═══════════════════════════════════════════════════════ */
.v2-nav {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 100;
  height: 64px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 var(--sp-10);
  background: transparent;
  transition: background var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease);
  border-bottom: 1px solid transparent;
}

.v2-nav.is-scrolled {
  background: rgba(var(--page-rgb), 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-bottom-color: var(--border);
}

.v2-logo {
  font-family: var(--font-display);
  font-size: 21px;
  color: var(--warm-white);
  text-decoration: none;
  letter-spacing: -0.01em;
}
.v2-logo span { color: var(--gold); }

.v2-nav-right { display: flex; align-items: center; gap: var(--sp-6); }

.v2-nav-link {
  font-size: 14px;
  color: var(--muted);
  text-decoration: none;
  transition: color var(--dur-1) var(--ease);
}
.v2-nav-link:hover { color: var(--warm-white); }

/* The popup is drawn by the OS, so it needs color-scheme on the control
   itself — inheriting it from the page isn't enough for the dropdown list.
   Without it the list rendered light, and because <option> inherits the
   select's colour, --muted (50% white) on white was barely legible. */
.v2-lang {
  /* color-scheme follows the page (:root sets it per theme) — hardcoding
     "dark" here rendered the native dropdown dark on the cream page. */
  background: rgba(var(--ink-rgb), 0.04);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--warm-white);
  font-family: inherit;
  font-size: 13px;
  padding: var(--sp-2) var(--sp-3);
  min-height: 44px;              /* first control in the tab order */
  cursor: pointer;
  transition: border-color var(--dur-1) var(--ease), background var(--dur-1) var(--ease);
}
.v2-lang:hover { border-color: var(--border-gold); background: rgba(var(--ink-rgb), 0.08); }

/* Explicit, because options do NOT inherit reliably across engines. */
.v2-lang option {
  background: var(--dark-2);
  color: var(--warm-white);
}
.v2-lang option:checked { background: var(--gold); color: var(--dark); }

.v2-nav .v2-btn-gold { padding: var(--sp-3) var(--sp-5); }
.v2-label-short { display: none; }

/* ═══ Hero ══════════════════════════════════════════════════════
   Asymmetric split: type left, the product (video) right. The old
   hero was a photograph with the product ~15 screens below.
   ═══════════════════════════════════════════════════════════════ */
.v2-hero {
  min-height: 100vh;
  display: flex;
  align-items: center;
  padding: calc(64px + var(--sp-16)) var(--sp-10) var(--sp-20);
}

.v2-hero-grid {
  width: 100%;
  max-width: var(--w-wide);
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
  gap: var(--sp-20);
  align-items: center;
}

.v2-hero-sub { margin-top: var(--sp-6); font-size: 19px; line-height: 1.55; color: var(--muted); max-width: 42ch; }

.v2-hero-ctas {
  margin-top: var(--sp-10);
  display: flex;
  align-items: center;
  gap: var(--sp-6);
  flex-wrap: wrap;
}

/* The trust line the old page rendered at 11px/25% opacity over a
   photo, because .nl-hero-micro was declared twice (newlanding.css
   :349 and :1376) and the invisible one won. */
.v2-hero-micro { margin-top: var(--sp-5); font-size: 13px; color: var(--muted); }

.v2-hero-trust {
  margin-top: var(--sp-8);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--border);
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--dimmer);
}
.v2-dot { width: 3px; height: 3px; border-radius: 50%; background: var(--gold); opacity: 0.6; }

/* ── Video facade: poster + play. The 90s promo is 43MB, so nothing
   loads until the visitor asks for it. No autoplay — a video that
   starts talking at you is hostile.
   Base rules now live in /css/video-facade.css (shared with the feature
   landing pages); only this page's variants remain below. ── */

/* ═══ Beats — three, not ten ════════════════════════════════════
   The old page spent 1240vh (12.5 screens) of pinned scroll on ten
   text cards over one unchanging photo. These are three rows,
   hairline-separated, no scroll-jacking, no pinning.
   ═══════════════════════════════════════════════════════════════ */
/* Each beat is its own held moment over the stage — not a row in a
   table. The earlier version put the eyebrow in a 3fr label column,
   which left a ~250px hole, and separated the beats with full-width
   hairlines that cut across the photograph. */
/* No min-height here on purpose. `.v2-beat` and `.v2-beat--recall` are BOTH
   (0,1,0), so this block — being later in the file — silently beat every
   per-beat height and pinned all four to 88vh (792px) again. Heights live
   only in the archetypes. */
.v2-beat {
  display: flex;
  align-items: center;
}
.v2-beat .v2-eyebrow { display: block; margin-bottom: var(--sp-5); }
/* Deliberately sets NO font-size or max-width. `.v2-beat--x .v2-h2` and
   `.v2-beat .v2-h2` are both (0,2,0) — equal specificity — so whichever
   came last would win outright. Sizing therefore lives only in the four
   archetypes; leaving a size here silently killed all of them. */
.v2-beat .v2-h2 { text-wrap: balance; }

/* Recall's proof: real question/answer pairs, set as a ledger.
   Static — the old page typed these out with a blinking caret. */
.v2-qa { margin-top: var(--sp-8); display: grid; gap: var(--sp-5); max-width: 60ch; }
/* `display: grid` beats the UA's [hidden] rule — without this the static
   ledger stays visible underneath the live typed one. */
.v2-qa[hidden] { display: none; }
.v2-qa-pair { display: grid; gap: var(--sp-2); padding-left: var(--sp-5); border-left: 1px solid var(--border); }
.v2-qa-q { font-size: 16px; color: var(--warm-white); }
.v2-qa-q::before { content: '›'; color: var(--gold); margin-right: var(--sp-2); }
.v2-qa-a { font-family: 'DM Mono', monospace; font-size: 13px; line-height: 1.5; color: var(--muted); }

/* ═══ Privacy — full-bleed video, type set left ═════════════════ */
.v2-privacy { position: relative; min-height: 92vh; display: flex; align-items: center; overflow: hidden; }
.v2-privacy-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.v2-privacy-shade {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(var(--page-rgb), 0.94) 0%, rgba(var(--page-rgb), 0.72) 45%, rgba(var(--page-rgb), 0.35) 100%);
}
.v2-privacy-inner { position: relative; max-width: var(--w-wide); margin: 0 auto; padding: var(--sp-24) var(--sp-10); width: 100%; }
.v2-privacy-inner > * { max-width: 52ch; }

.v2-privacy-lines { list-style: none; margin-top: var(--sp-8); display: grid; gap: var(--sp-4); }
.v2-privacy-lines li {
  font-size: 16px;
  color: var(--warm-white);
  padding-left: var(--sp-6);
  position: relative;
}
.v2-privacy-lines li::before {
  content: '';
  position: absolute;
  left: 0; top: 11px;
  width: 8px; height: 1px;
  background: var(--gold);
}

.v2-badges { margin-top: var(--sp-10); display: flex; gap: var(--sp-2); flex-wrap: wrap; }
.v2-badge {
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  padding: var(--sp-2) var(--sp-4);
}

.v2-privacy-vow {
  margin-top: var(--sp-10);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--border);
  font-size: 16px;
  line-height: 1.55;
  color: var(--muted);
}

/* ═══ Datamap — a spec sheet, not two cards ═════════════════════ */
.v2-split {
  display: grid;
  grid-template-columns: minmax(0, 4fr) minmax(0, 8fr);
  gap: var(--sp-16);
  align-items: start;
}
.v2-split-rail { position: sticky; top: calc(64px + var(--sp-10)); }
.v2-split-rail .v2-h2 { margin-top: var(--sp-5); }
.v2-split-rail .v2-body { margin-top: var(--sp-6); }

.v2-tiers { display: grid; grid-template-columns: 1fr 1fr; gap: 0; }
.v2-tier { padding: 0 var(--sp-8); }
.v2-tier:first-child { padding-left: 0; border-right: 1px solid var(--border); }
.v2-tier:last-child { padding-right: 0; }

.v2-tier-head {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--muted);
  padding-bottom: var(--sp-4);
  border-bottom: 1px solid var(--border);
}
.v2-tier-dot { width: 5px; height: 5px; border-radius: 50%; flex-shrink: 0; }
.v2-dot-green { background: var(--green); }
.v2-dot-gold { background: var(--gold); }

.v2-tier ul { list-style: none; }
.v2-tier li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-4);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid rgba(var(--ink-rgb), 0.04);
}
.v2-tier li span { font-size: 15px; color: var(--warm-white); }
.v2-tier li em { font-style: normal; font-size: 13px; color: var(--dimmer); text-align: right; }

.v2-tier-foot { margin-top: var(--sp-5); font-size: 13px; }
.v2-foot-green { color: var(--green); }
.v2-foot-gold { color: var(--gold); }
/* ═══ Compare ═══════════════════════════════════════════════════ */
.v2-compare-scroll { margin-top: var(--sp-12); overflow-x: auto; -webkit-overflow-scrolling: touch; }
.v2-compare-table { width: 100%; min-width: 780px; border-collapse: separate; border-spacing: 0; text-align: left; }
.v2-compare-table th {
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--dimmer);
  padding: 0 var(--sp-4) var(--sp-4);
  border-bottom: 1px solid var(--border);
  text-align: center;
}
.v2-compare-table th:first-child { text-align: left; padding-left: 0; }
.v2-compare-table th.v2-col-us { color: var(--gold); }
.v2-compare-table td { padding: var(--sp-4); border-bottom: 1px solid rgba(var(--ink-rgb), 0.04); text-align: center; font-size: 13px; }
.v2-compare-table td.v2-feat { text-align: left; padding-left: 0; font-size: 15px; color: var(--warm-white); }
.v2-compare-table .v2-col-us { background: rgba(var(--gold-rgb), 0.05); }
.v2-yes { color: var(--gold-light); }
.v2-no { color: rgba(var(--ink-rgb), 0.15); }
.v2-txt { color: var(--muted); font-size: 13px; }
.v2-compare-note { margin-top: var(--sp-6); font-size: 13px; color: var(--dimmer); max-width: 72ch; }

/* ═══ FAQ — two columns, sticky rail ════════════════════════════ */
.v2-faq-list { display: grid; gap: 0; }
.v2-faq-item { border-bottom: 1px solid var(--border); }
.v2-faq-item:first-child { border-top: 1px solid var(--border); }

.v2-faq-q {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-6);
  background: none;
  border: 0;
  color: var(--warm-white);
  font-family: inherit;
  font-size: 16px;
  line-height: 1.45;
  text-align: left;
  padding: var(--sp-5) 0;
  cursor: pointer;
  transition: color var(--dur-1) var(--ease);
}
.v2-faq-q:hover { color: var(--gold-light); }
.v2-faq-q svg { flex-shrink: 0; color: var(--dimmer); transition: transform var(--dur-2) var(--ease); }
.v2-faq-q[aria-expanded='true'] svg { transform: rotate(45deg); }

.v2-faq-a { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease); }
.v2-faq-item.is-open .v2-faq-a { grid-template-rows: 1fr; }
.v2-faq-a > div { overflow: hidden; }
.v2-faq-a p { font-size: 15px; line-height: 1.65; color: var(--muted); max-width: 62ch; padding-bottom: var(--sp-6); }
.v2-faq-a a { color: var(--gold-light); text-decoration: underline; text-underline-offset: 3px; }

/* ═══ Final CTA — type only, flat. No photo reprise, no slow zoom ═ */
.v2-final { text-align: center; }
.v2-final .v2-h1 { max-width: 14ch; margin: 0 auto; }
.v2-final-ctas { margin-top: var(--sp-12); display: flex; justify-content: center; }
.v2-final-micro { margin-top: var(--sp-6); font-size: 13px; color: var(--dimmer); }
.v2-final-vow {
  margin-top: var(--sp-16);
  padding-top: var(--sp-8);
  border-top: 1px solid var(--border);
  max-width: var(--w-read);
  margin-inline: auto;
  font-size: 15px;
  line-height: 1.6;
  color: var(--muted);
}

/* ═══ Footer ════════════════════════════════════════════════════ */
.v2-footer { background: var(--dark-2); border-top: 1px solid var(--border); padding: var(--sp-20) var(--sp-10) var(--sp-8); }
.v2-footer-grid { max-width: var(--w-page); margin: 0 auto; display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-10); }
.v2-footer-col { display: grid; gap: var(--sp-3); align-content: start; }
.v2-footer-head {
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--dimmer);
  margin-bottom: var(--sp-1);
}
.v2-footer-col a { font-size: 14px; color: var(--muted); text-decoration: none; transition: color var(--dur-1) var(--ease); }
.v2-footer-col a:hover { color: var(--warm-white); }
.v2-footer-inner {
  max-width: var(--w-page);
  margin: var(--sp-16) auto 0;
  padding-top: var(--sp-6);
  border-top: 1px solid var(--border);
  display: flex;
  justify-content: space-between;
  gap: var(--sp-4);
  font-size: 13px;
  color: var(--dimmer);
}
.v2-footer-links { display: flex; gap: var(--sp-5); }
.v2-footer-links a { color: var(--dimmer); text-decoration: none; }
.v2-footer-links a:hover { color: var(--warm-white); }

/* ═══ Send-yourself-the-link (mobile only) ══════════════════════
   MOVED to landing.css. The widget is shared by the home page and the
   feature landing pages, and landing.css is the only sheet both load
   (this file is home-only). Do not re-add the rules here — one copy.
   ═══════════════════════════════════════════════════════════════ */

/* ═══ Reveal — two places only, not every element ═══════════════ */
.v2-reveal { opacity: 0; transform: translateY(16px); transition: opacity var(--dur-3) var(--ease), transform var(--dur-3) var(--ease); }
.v2-reveal.is-in { opacity: 1; transform: none; }

/* ═══ Pricing: the shared _PricingSection partial, restyled ══════
   Same class names as landing.css so the partial stays untouched.
   Ported from newlanding.css with the gradients, glows, hover lift
   and `transition: all` removed.
   ═══════════════════════════════════════════════════════════════ */
/* The shared partial ships landing.css's `.reveal` (opacity: 0 until a script
   adds `.visible`). This page doesn't load that script — it has its own
   `.v2-reveal` — so the whole pricing block rendered at zero opacity. Neutralise
   it in CSS rather than in JS, so it stays visible even with scripts off. */
#pricing .reveal { opacity: 1; transform: none; }

#pricing .section-inner { max-width: var(--w-page); margin: 0 auto; padding: var(--sp-40) var(--sp-10); }

#pricing .section-eyebrow {
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: var(--sp-5);
}

#pricing .section-heading {
  font-family: var(--font-display);
  font-size: clamp(34px, 4.4vw, 46px);
  font-weight: 400;
  line-height: 1.08;
  letter-spacing: -0.02em;
  margin-bottom: var(--sp-6);
}
#pricing .section-heading em { font-style: italic; color: var(--gold-light); }
#pricing .section-sub { font-size: 20px; font-weight: 400; color: var(--muted); max-width: 46ch; }

.pricing-table-wrap { margin-top: var(--sp-16); overflow-x: auto; overflow-y: visible; -webkit-overflow-scrolling: touch; padding-top: var(--sp-4); }
.pricing-mobile { display: none; }
.pricing-table { width: 100%; border-collapse: separate; border-spacing: 0; min-width: 700px; text-align: left; }
.pricing-table-corner { width: 200px; min-width: 160px; }

.pricing-table-header {
  text-align: center;
  padding: var(--sp-8) var(--sp-4) var(--sp-6);
  vertical-align: top;
  border: 1px solid var(--border);
  border-bottom: none;
  border-radius: var(--r-md) var(--r-md) 0 0;
  background: var(--dark-2);
  position: relative;
}
.pricing-table-header.highlighted { background: var(--dark-2); border-color: var(--border-gold); }
.pricing-table-header.highlighted::before {
  content: '';
  position: absolute;
  top: -1px; left: 0; right: 0;
  height: 2px;
  background: var(--gold);
}

.pricing-table-header .price-name {
  font-family: 'DM Mono', monospace;
  font-size: 11px;
  font-weight: 400;
  color: var(--dimmer);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  margin-bottom: var(--sp-3);
}
.pricing-table-header .price-amount {
  font-family: var(--font-display);
  font-size: 42px;
  font-weight: 400;
  color: var(--warm-white);
  line-height: 1;
  margin-bottom: var(--sp-1);
}
.pricing-table-header.highlighted .price-amount { color: var(--gold-light); }
.pricing-table-header .price-amount sup { font-size: 20px; vertical-align: super; }
.pricing-table-header .price-period { font-size: 13px; color: var(--dimmer); margin-bottom: var(--sp-3); }
.pricing-table-header .price-tagline { font-size: 13px; font-weight: 400; color: var(--muted); line-height: 1.5; margin-bottom: var(--sp-4); min-height: 40px; }

.pricing-feature-name { font-size: 13px; color: var(--muted); padding: var(--sp-3) var(--sp-4) var(--sp-3) 0; border-bottom: 1px solid rgba(var(--ink-rgb), 0.04); white-space: nowrap; }
.pricing-feature-cell { text-align: center; padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid rgba(var(--ink-rgb), 0.04); border-left: 1px solid var(--border); border-right: 1px solid var(--border); }
.pricing-feature-cell.highlighted { background: rgba(var(--gold-rgb), 0.04); border-left-color: var(--border-gold); border-right-color: var(--border-gold); }
.pricing-table tbody tr:last-child .pricing-feature-cell { border-bottom: 1px solid var(--border); }
.pricing-table tbody tr:last-child .pricing-feature-cell.highlighted { border-bottom-color: var(--border-gold); }

.pricing-check { color: var(--gold-light); font-size: 15px; font-weight: 500; }
.pricing-dash { color: rgba(var(--ink-rgb), 0.15); font-size: 15px; }
.pricing-value { color: var(--warm-white); font-size: 13px; font-weight: 500; }

.price-cta {
  display: inline-block;
  width: 100%;
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--r-sm);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.02em;
  text-align: center;
  text-decoration: none;
  margin-top: var(--sp-1);
  box-sizing: border-box;
  cursor: pointer;
  transition: background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
}
.price-cta-outline { border: 1px solid var(--border); color: var(--muted); background: transparent; }
.price-cta-outline:hover { border-color: var(--border-gold); color: var(--warm-white); }
.price-cta-filled { background: var(--gold); color: var(--dark); border: 1px solid var(--gold); }
.price-cta-filled:hover { background: var(--gold-light); border-color: var(--gold-light); }

.pricing-mobile-card { background: var(--dark-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--sp-6); margin-bottom: var(--sp-4); position: relative; text-align: left; }
.pricing-mobile-card.highlighted { border-color: var(--border-gold); }
.pricing-mobile-header { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); margin-bottom: var(--sp-5); }
.pricing-mobile-header .price-name { font-family: 'DM Mono', monospace; font-size: 11px; font-weight: 400; color: var(--dimmer); letter-spacing: 0.14em; text-transform: uppercase; margin-bottom: var(--sp-1); }
.pricing-mobile-header .price-amount { font-family: var(--font-display); font-size: 36px; font-weight: 400; color: var(--warm-white); line-height: 1; display: flex; align-items: baseline; gap: var(--sp-1); }
.pricing-mobile-card.highlighted .pricing-mobile-header .price-amount { color: var(--gold-light); }
.pricing-mobile-header .price-amount sup { font-size: 16px; vertical-align: super; }
.price-period-inline { font-family: 'DM Sans', sans-serif; font-size: 12px; font-weight: 400; color: var(--dimmer); }
.pricing-mobile-features { list-style: none; display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-1) var(--sp-4); }
.pricing-mobile-features li { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: var(--sp-2); }
.pricing-mobile-features .pricing-check { font-size: 12px; flex-shrink: 0; }

/* ═══ Responsive — three breakpoints, not seven ═════════════════ */
@media (max-width: 1024px) {
  .v2-hero-grid { grid-template-columns: 1fr; gap: var(--sp-12); }
  .v2-hero-copy { max-width: 46ch; }
  .v2-split { grid-template-columns: 1fr; gap: var(--sp-10); }
  .v2-split-rail { position: static; }
}

@media (max-width: 768px) {
  .v2-section, .v2-section--dense, .v2-section--loud { padding-left: var(--sp-6); padding-right: var(--sp-6); }
  .v2-section { padding-top: var(--sp-24); padding-bottom: var(--sp-24); }
  .v2-section--loud { padding-top: var(--sp-32); padding-bottom: var(--sp-32); }
  .v2-hero { min-height: auto; padding: calc(64px + var(--sp-12)) var(--sp-6) var(--sp-16); }
  .v2-beats { padding: var(--sp-16) var(--sp-6) var(--sp-24); }
  .v2-stage-scrim {
    background: linear-gradient(180deg, rgba(var(--page-rgb), 0.72) 0%, rgba(var(--page-rgb), 0.55) 40%, rgba(var(--page-rgb), 0.9) 100%);
  }
  .v2-qa-live-q { font-size: 17px; }
  .v2-nav { padding: 0 var(--sp-6); gap: var(--sp-3); }
  .v2-nav-right { gap: var(--sp-4); }
  .v2-label-full { display: none; }
  .v2-label-short { display: inline; }
  /* Beats: single column everywhere, media first, and drop the viewport-height
     floor — 88vh gave ~740px blocks around ~380px of content on a phone. */
  .v2-beat,
  .v2-beat--recall,
  .v2-beat--ghost,
  .v2-beat--dictation,
  .v2-beat--voice { min-height: 0; padding: var(--sp-16) 0; }
  .v2-beat--recall .v2-beat-inner,
  .v2-beat--ghost .v2-beat-inner,
  .v2-beat--voice .v2-beat-inner { grid-template-columns: 1fr; gap: var(--sp-8); }
  .v2-beat--ghost .v2-beat-video,
  .v2-beat--voice .v2-beat-video,
  .v2-beat--ghost .v2-beat-col,
  .v2-beat--voice .v2-beat-col { grid-column: 1; grid-row: auto; }
  .v2-beat--voice .v2-beat-col { text-align: left; }
  .v2-beat--voice .v2-h2 { margin-left: 0; }
  /* The bleed and the type-on-panel overlap only work on a wide screen. */
  .v2-beat--recall .v2-beat-video { margin-right: 0; border-right: 1px solid rgba(var(--ink-rgb), 0.28); border-radius: var(--r-md); }
  .v2-beat--recall .v2-beat-video::before { display: none; }
  .v2-beat--recall .v2-beat-col { margin-right: 0; }
  .v2-beat--ghost::before { display: none; }
  .v2-beat--dictation .v2-beat-body { columns: 1; }
  .v2-beat--dictation .v2-beat-video { aspect-ratio: 16 / 9; }
  .v2-tiers { grid-template-columns: 1fr; gap: var(--sp-12); }
  .v2-tier { padding: 0; }
  .v2-tier:first-child { border-right: 0; }
  .v2-privacy-shade { background: linear-gradient(180deg, rgba(var(--page-rgb), 0.7) 0%, rgba(var(--page-rgb), 0.92) 60%); }
  .v2-privacy-inner { padding: var(--sp-20) var(--sp-6); }
  .v2-footer-grid { grid-template-columns: 1fr; gap: var(--sp-10); }
  .v2-footer-inner { flex-direction: column; }
  .pricing-table-wrap { display: none; }
  .pricing-mobile { display: block; }
}

@media (max-width: 480px) {
  .v2-hero-ctas { flex-direction: column; align-items: stretch; }
  .v2-hero-ctas .v2-btn { width: 100%; }
  .pricing-mobile-features { grid-template-columns: 1fr; }

  /* The nav row needed ~275px of children plus the logo plus padding, so the
     Download button ran 93px past the viewport and was silently clipped by
     `overflow-x: clip`. Drop the secondary links; the hero CTA and the footer
     already carry Pricing and Log in. */
  .v2-nav { padding: 0 var(--sp-4); }
  .v2-nav .v2-nav-link,
  .v2-nav .v2-lang { display: none; }
  .v2-nav-right { gap: var(--sp-2); }
  .v2-logo { font-size: 19px; }
}

/* ═══ Reduced motion — complete, not token ══════════════════════
   The old page's block disabled four things and left the caret
   blink, the glint sweep, the 26s infinite zoom, both autoplaying
   loops and the 1240vh track running.
   ═══════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
  .v2-page *,
  .v2-page *::before,
  .v2-page *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .v2-reveal { opacity: 1; transform: none; }
  .v2-faq-a { grid-template-rows: 0fr; }
  .v2-faq-item.is-open .v2-faq-a { grid-template-rows: 1fr; }

  /* Atmosphere off entirely: no embers, no glint, no caret, no
     sticky stage — the photo becomes a plain backdrop. */
  .v2-embers { display: none; }
  .v2-glint::after { display: none; }
  .v2-qa-caret { display: none; }
  .v2-qa-live { display: none; }
  .v2-stage { position: absolute; top: 0; height: 100%; }
  /* The stage leaves the flow above, so the -100vh that compensated for it
     must go too — otherwise the whole hero is pulled ~892px above scroll 0
     and the page opens on the second beat with the h1 and both CTAs
     unreachable. */
  .v2-stage-content { margin-top: 0; }
  .v2-stage-dim { opacity: 0.72; }
  .v2-stage::after { display: none; }   /* grain lives on .v2-stage, not .v2-page */
  .v2-js .v2-beat-col,
  .v2-js .v2-beat-video { opacity: 1; transform: none; }
}

/* ── Phones: no pin ────────────────────────────────────────────
   A pinned 100vh stage can't hold a panel that is taller than the
   phone — measured 73–78px of each panel cut off, and unreachable,
   because scrolling advanced the segment instead of revealing the
   rest. Below 768px the four features simply stack and scroll, and
   the tab row goes away because it has nothing left to switch.
   Written to win over the JS state too (a panel JS marked hidden at
   desktop width must still show if the window is narrowed). */
@media (max-width: 768px) {
  .v2-scrolly { height: auto; padding-left: var(--sp-6); padding-right: var(--sp-6); }
  .v2-scrolly-stage { position: static; height: auto; display: block; padding-top: var(--sp-12); }
  .v2-feature-stage { display: block; }
  .v2-feature-panel,
  .v2-feature-panel[hidden] {
    display: grid;
    opacity: 1;
    visibility: visible;
    transform: none;
    margin-bottom: var(--sp-20);
  }
  .v2-feature-panel:last-child { margin-bottom: 0; }
  .v2-feature-tabs { display: none; }
}

/* ─── Theme toggle, v2 nav idiom ─────────────────────────────────────────
   Base behaviour and the glyph swap live in landing.css; this only matches
   the toggle to this nav's control sizing, alongside .v2-lang. */
.v2-theme-toggle {
  width: 34px;
  height: 34px;
  background: rgba(var(--ink-rgb), 0.04);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-muted);
}

.v2-theme-toggle:hover {
  border-color: var(--border-gold);
  background: rgba(var(--ink-rgb), 0.08);
  color: var(--text-primary);
}

/* ═══ Stage in light mode: no photograph ═════════════════════════
   /newlanding/hero.png was shot and graded to sit behind a near-black
   page. On cream it stops receding and becomes a legible grey desk
   scene — a laptop, a window, a keyboard — competing with the type and
   showing straight through behind the feature video. A warm gradient
   keeps the depth and the light without the subject matter.

   This also closes a trap introduced with theming: .v2-stage-dim is
   `background: var(--dark)`, and the legacy alias resolves --dark to
   CREAM in light mode. The layer whose entire job is to push the photo
   back was tinting it forward instead. With no photo there is nothing
   to dim, so the layer is switched off rather than re-coloured.

   Dark mode is untouched — the photograph, the push-in and the
   scroll-driven dim all behave exactly as designed. */

:root:not([data-theme="dark"]) .v2-stage-poster {
  background:
    radial-gradient(120% 85% at 68% 34%, rgba(var(--gold-rgb), 0.09), transparent 60%),
    linear-gradient(168deg, #FCF9F4 0%, var(--surface-page) 44%, #EAE2D3 100%);
  /* The slow push-in is anchored on the light in the photograph. With no
     photograph there is nothing to push toward, and scaling a gradient
     only shifts its stops. */
  transform: none;
}

:root:not([data-theme="dark"]) .v2-stage-dim {
  opacity: 0;
}
