/* =============================================================================
   GENUBRA LIVE LAUGH ENGINE — realm.css
   The complete cinematic design system for the "Living Comedy Realm Interface".
   -----------------------------------------------------------------------------
   Aesthetic: stage-void black + neon accent + warm spotlight + crowd-glow.
   Architecture: mobile-first, CDN-font with system fallback, CSS-only graceful
   degradation. Every animation gated behind html:not(.reduce-motion) so the
   prefers-reduced-motion path (realm.js adds .reduce-motion to <html>) is calm.

   JS overrides --rc-void / --rc-accent / --rc-spotlight / --rc-glow / --rc-ink
   from world.brand at boot. Stage-light positions react to --rc-spot-x / -y and
   --rc-progress that the scroll controller writes live.

   SECTION INDEX
     00  Font loading
     01  Design tokens (:root)
     02  Global reset + base
     03  Stage-void background, film-grain, haze, vignette, crowd-glow field
     04  Reactive typography utilities (.rc-punch/.whisper/.shake/.flicker/.rise)
     05  Buttons — marquee CTA + ghost + utility
     06  Shared atoms — eyebrow, kicker, panel, chips, divider
     07  #cold-open intro overlay
     08  #age-disruption hero (Attention Gravity)
     09  #hero-clip captioned player
     10  #progress-rail fixed scroll->checkout indicator
     11  #scarcity-ticker live readout
     12  #clip-stage curiosity 12s clip
     13  #tcl ticket conversion loop (5 staged blocks, stage-light treatment)
     14  #tour-map + #city-panel reality layer
     15  #comedy-memory feed cards + heatmap visual
     16  #vcg viral clip generator share-card
     17  #stage-door checkout overlay ("buying = stepping onstage")
     18  Footer + social
     19  Responsive — desktop legibility >=1024px, refinement >=1600px
     20  Admin shared styles (.admin-*)
     21  prefers-reduced-motion neutralizer
   ========================================================================== */

/* -----------------------------------------------------------------------------
   00 — FONT LOADING
   Bold condensed display (Anton) for punchline typography; clean sans (Inter)
   for body. CDN @import with a robust system fallback stack so the page still
   reads intentionally if the font CDN fails.
   -------------------------------------------------------------------------- */
@import url('https://fonts.googleapis.com/css2?family=Anton&family=Archivo+Black&family=Inter:wght@300;400;500;600;700;800&display=swap');

/* -----------------------------------------------------------------------------
   01 — DESIGN TOKENS
   -------------------------------------------------------------------------- */
:root {
  /* Brand (JS overrides these from world.brand at boot) */
  --rc-void:      #07060A;
  --rc-accent:    #FF2E97;
  --rc-spotlight: #FFB35C;
  --rc-glow:      #7C5CFF;
  --rc-ink:       #F4F1FF;
  --rc-haze:      rgba(124, 92, 255, 0.10);

  /* Derived surfaces (built from void so they recolor with the brand) */
  --rc-void-2:    #0C0A12;          /* raised panel */
  --rc-void-3:    #120F1B;          /* deepest card */
  --rc-line:      rgba(244, 241, 255, 0.10);
  --rc-line-2:    rgba(244, 241, 255, 0.18);
  --rc-ink-soft:  rgba(244, 241, 255, 0.72);
  --rc-ink-dim:   rgba(244, 241, 255, 0.46);
  --rc-ink-ghost: rgba(244, 241, 255, 0.22);

  /* Accent translucencies (rebuilt by JS as it sets brand vars) */
  --rc-accent-12: color-mix(in srgb, var(--rc-accent) 12%, transparent);
  --rc-accent-22: color-mix(in srgb, var(--rc-accent) 22%, transparent);
  --rc-accent-40: color-mix(in srgb, var(--rc-accent) 40%, transparent);
  --rc-glow-18:   color-mix(in srgb, var(--rc-glow) 18%, transparent);
  --rc-spot-30:   color-mix(in srgb, var(--rc-spotlight) 30%, transparent);

  /* Live, JS-written reactive vars (stage light + scroll) */
  --rc-spot-x:    50%;   /* spotlight horizontal focus */
  --rc-spot-y:    34%;   /* spotlight vertical focus   */
  --rc-progress:  0;     /* 0..1 scroll->checkout fill */
  --rc-heat:      0;     /* 0..1 generic heat driver   */

  /* Typography */
  --rc-font-display: 'Anton', 'Archivo Black', 'Oswald', 'Bebas Neue',
                     'Impact', 'Haettenschweiler', sans-serif;
  --rc-font-body:    'Inter', system-ui, -apple-system, 'Segoe UI', Roboto,
                     Helvetica, Arial, sans-serif;
  --rc-font-mono:    'JetBrains Mono', 'SFMono-Regular', ui-monospace, Menlo,
                     Consolas, monospace;

  /* Type scale — fluid, mobile-first */
  --rc-fs-mega:  clamp(3.4rem, 16vw, 11rem);
  --rc-fs-hero:  clamp(2.6rem, 11vw, 7.5rem);
  --rc-fs-h1:    clamp(2.1rem, 8vw, 4.6rem);
  --rc-fs-h2:    clamp(1.6rem, 5.4vw, 3rem);
  --rc-fs-h3:    clamp(1.25rem, 3.6vw, 1.9rem);
  --rc-fs-lead:  clamp(1.05rem, 2.4vw, 1.3rem);
  --rc-fs-body:  clamp(0.98rem, 1.7vw, 1.06rem);
  --rc-fs-sm:    0.86rem;
  --rc-fs-xs:    0.74rem;

  --rc-lh-tight: 0.92;
  --rc-lh-snug:  1.08;
  --rc-lh-body:  1.62;

  --rc-track-display: 0.005em;
  --rc-track-eyebrow: 0.34em;

  /* Spacing scale (8pt base) */
  --rc-1:  0.25rem;
  --rc-2:  0.5rem;
  --rc-3:  0.75rem;
  --rc-4:  1rem;
  --rc-5:  1.5rem;
  --rc-6:  2rem;
  --rc-7:  3rem;
  --rc-8:  4rem;
  --rc-9:  6rem;
  --rc-10: 8rem;

  /* Section rhythm */
  --rc-section-pad: clamp(3.5rem, 9vw, 8rem);
  --rc-gutter:      clamp(1.15rem, 5vw, 3rem);
  --rc-maxw:        1240px;
  --rc-maxw-wide:   1560px;

  /* Radii */
  --rc-r-sm:   8px;
  --rc-r:      14px;
  --rc-r-lg:   22px;
  --rc-r-xl:   30px;
  --rc-r-pill: 999px;

  /* Elevation + glow */
  --rc-shadow:   0 18px 60px -28px rgba(0, 0, 0, 0.9);
  --rc-shadow-2: 0 40px 120px -40px rgba(0, 0, 0, 0.95);
  --rc-ring:     0 0 0 1px var(--rc-line);
  --rc-neon:     0 0 1px var(--rc-accent),
                 0 0 14px var(--rc-accent-40),
                 0 0 38px var(--rc-accent-22);
  --rc-neon-glow: 0 0 1px var(--rc-glow),
                  0 0 16px var(--rc-glow-18),
                  0 0 44px var(--rc-glow-18);

  /* Motion */
  --rc-ease:     cubic-bezier(0.22, 0.61, 0.36, 1);
  --rc-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --rc-ease-in:  cubic-bezier(0.5, 0, 0.75, 0);
  --rc-spring:   cubic-bezier(0.34, 1.56, 0.64, 1);
  --rc-t-fast:   0.18s;
  --rc-t:        0.34s;
  --rc-t-slow:   0.7s;

  /* Z-index ladder */
  --rc-z-scene:    0;
  --rc-z-fx:       1;
  --rc-z-content:  2;
  --rc-z-rail:     40;
  --rc-z-ticker:   45;
  --rc-z-coldopen: 80;
  --rc-z-stagedoor:90;
  --rc-z-top:      100;

  color-scheme: dark;
}

/* -----------------------------------------------------------------------------
   02 — GLOBAL RESET + BASE
   -------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; padding: 0; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-behavior: smooth;
  font-size: 100%;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

body {
  min-height: 100%;
  background: var(--rc-void);
  color: var(--rc-ink);
  font-family: var(--rc-font-body);
  font-size: var(--rc-fs-body);
  line-height: var(--rc-lh-body);
  font-weight: 400;
  letter-spacing: 0.01em;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
  overflow-y: auto;
  position: relative;
}

img, picture, video, canvas, svg { display: block; max-width: 100%; }
img, video { height: auto; }

button, input, select, textarea { font: inherit; color: inherit; }
button { background: none; border: none; cursor: pointer; }

a {
  color: var(--rc-accent);
  text-decoration: none;
  transition: color var(--rc-t-fast) var(--rc-ease);
}
a:hover { color: var(--rc-spotlight); }

ul, ol { list-style: none; }

h1, h2, h3, h4 { font-weight: 800; line-height: var(--rc-lh-snug); }

::selection {
  background: var(--rc-accent);
  color: var(--rc-void);
}

:focus-visible {
  outline: 2px solid var(--rc-spotlight);
  outline-offset: 3px;
  border-radius: 4px;
}

/* Scrollbar */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: var(--rc-void); }
::-webkit-scrollbar-thumb {
  background: linear-gradient(var(--rc-accent), var(--rc-glow));
  border-radius: 999px;
  border: 2px solid var(--rc-void);
}

/* Visually-hidden but accessible */
.rc-sr-only {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0);
  white-space: nowrap; border: 0;
}

/* Skip link — off-screen until focused, then it lands as a tappable pill in the
   top-left (above the progress rail). Generous tap target for keyboard/switch
   users. Reveals by overriding the .rc-sr-only clip on :focus. */
.rc-skip:focus,
.rc-skip:focus-visible {
  position: fixed !important;
  top: var(--rc-3);
  left: var(--rc-3);
  width: auto; height: auto;
  min-height: 44px;
  margin: 0;
  padding: 0.7em 1.2em;
  clip: auto;
  display: inline-flex;
  align-items: center;
  z-index: var(--rc-z-top);
  color: var(--rc-void);
  background: var(--rc-accent);
  border-radius: var(--rc-r-pill);
  font-weight: 700;
  letter-spacing: 0.02em;
  box-shadow: var(--rc-neon);
}

/* Layout helpers */
.rc-wrap {
  width: 100%;
  max-width: var(--rc-maxw);
  margin-inline: auto;
  padding-inline: var(--rc-gutter);
}
.rc-section {
  position: relative;
  z-index: var(--rc-z-content);
  padding-block: var(--rc-section-pad);
}
.rc-stack > * + * { margin-top: var(--rc-4); }

#realm-root {
  position: relative;
  isolation: isolate;
  min-height: 100vh;
  z-index: var(--rc-z-content);
}

/* -----------------------------------------------------------------------------
   03 — STAGE-VOID BACKGROUND, FILM-GRAIN, HAZE, VIGNETTE, CROWD-GLOW FIELD
   These layers are fixed full-viewport behind everything. They are CSS-only and
   form the "intentional" floor the page falls back to if Three.js never loads.
   -------------------------------------------------------------------------- */

/* The Three.js canvas host. scene.js appends <canvas> here. */
#scene-canvas {
  position: fixed;
  inset: 0;
  z-index: var(--rc-z-scene);
  pointer-events: none;
  contain: strict;
}
#scene-canvas canvas {
  width: 100% !important;
  height: 100% !important;
  display: block;
}

/* Base void wash + the reactive spotlight bloom (JS moves --rc-spot-x/-y) */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: var(--rc-z-scene);
  pointer-events: none;
  background:
    radial-gradient(120% 90% at var(--rc-spot-x) var(--rc-spot-y),
      var(--rc-spot-30) 0%,
      color-mix(in srgb, var(--rc-spotlight) 8%, transparent) 22%,
      transparent 52%),
    radial-gradient(140% 120% at 84% 8%, var(--rc-haze) 0%, transparent 46%),
    radial-gradient(160% 130% at 10% 96%, var(--rc-glow-18) 0%, transparent 50%),
    linear-gradient(180deg, var(--rc-void) 0%, #050409 60%, var(--rc-void) 100%);
  transition: background-position var(--rc-t-slow) var(--rc-ease);
}

/* Film grain + vignette overlay (above void, below content) */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: var(--rc-z-fx);
  pointer-events: none;
  mix-blend-mode: soft-light;
  opacity: 0.5;
  background-image:
    radial-gradient(120% 120% at 50% 50%, transparent 55%, rgba(0,0,0,0.62) 100%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.86' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.42'/%3E%3C/svg%3E");
}
html:not(.reduce-motion) body::after { animation: rc-grain 0.7s steps(4) infinite; }

@keyframes rc-grain {
  0%   { transform: translate(0, 0); }
  25%  { transform: translate(-2%, 1%); }
  50%  { transform: translate(1%, -1.5%); }
  75%  { transform: translate(-1%, 2%); }
  100% { transform: translate(2%, -1%); }
}

/* Crowd-glow particle field — the CSS-only fallback "audience" beneath content.
   A soft constellation of warm dots that drift; if scene.js renders particles
   on the canvas, this stays as the legible base layer. */
.rc-crowd-field {
  position: fixed;
  inset: 0;
  z-index: var(--rc-z-fx);
  pointer-events: none;
  opacity: 0.6;
  background-repeat: repeat;
  background-position: 0 0, 40px 60px, 130px 20px, 90px 140px;
  background-size: 220px 220px, 260px 260px, 320px 320px, 200px 200px;
  background-image:
    radial-gradient(1.6px 1.6px at 30px 40px, var(--rc-spot-30), transparent 60%),
    radial-gradient(1.4px 1.4px at 120px 90px, var(--rc-accent-40), transparent 60%),
    radial-gradient(1.2px 1.2px at 200px 30px, var(--rc-glow-18), transparent 60%),
    radial-gradient(1.8px 1.8px at 70px 170px, var(--rc-spot-30), transparent 60%);
  -webkit-mask-image: radial-gradient(120% 100% at 50% 90%, #000 30%, transparent 80%);
          mask-image: radial-gradient(120% 100% at 50% 90%, #000 30%, transparent 80%);
}
html:not(.reduce-motion) .rc-crowd-field { animation: rc-crowd-drift 22s linear infinite; }

@keyframes rc-crowd-drift {
  0%   { background-position: 0 0, 40px 60px, 130px 20px, 90px 140px; opacity: 0.45; }
  50%  { opacity: 0.7; }
  100% { background-position: 0 -220px, 40px -200px, 130px -300px, 90px -60px; opacity: 0.45; }
}

/* A reusable haze sheet for layering inside sections */
.rc-haze-sheet {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    radial-gradient(80% 60% at var(--rc-spot-x) 0%, var(--rc-haze), transparent 70%);
  opacity: 0.8;
  z-index: 0;
}

/* -----------------------------------------------------------------------------
   04 — REACTIVE TYPOGRAPHY UTILITIES
   .rc-punch / .rc-whisper / .rc-shake / .rc-flicker / .rc-rise
   All motion gated behind html:not(.reduce-motion).
   -------------------------------------------------------------------------- */

/* Display impact — the punchline voice */
.rc-punch {
  font-family: var(--rc-font-display);
  font-weight: 400;
  line-height: var(--rc-lh-tight);
  letter-spacing: var(--rc-track-display);
  text-transform: uppercase;
  color: var(--rc-ink);
  text-shadow: 0 0 28px var(--rc-accent-22);
}
.rc-punch--accent { color: var(--rc-accent); text-shadow: var(--rc-neon); }
.rc-punch--spot   { color: var(--rc-spotlight); text-shadow: 0 0 26px var(--rc-spot-30); }
html:not(.reduce-motion) .rc-punch[data-beat] {
  animation: rc-punch-in 0.7s var(--rc-spring) both;
}
@keyframes rc-punch-in {
  0%   { opacity: 0; transform: translateY(0.4em) scale(0.94); filter: blur(6px); }
  60%  { opacity: 1; filter: blur(0); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* Backstage whisper — quiet aside */
.rc-whisper {
  font-family: var(--rc-font-body);
  font-weight: 300;
  font-style: italic;
  letter-spacing: 0.06em;
  color: var(--rc-ink-dim);
  text-shadow: 0 0 18px rgba(0,0,0,0.6);
}
html:not(.reduce-motion) .rc-whisper {
  animation: rc-whisper-breathe 5.5s var(--rc-ease) infinite;
}
@keyframes rc-whisper-breathe {
  0%, 100% { opacity: 0.46; }
  50%      { opacity: 0.78; }
}

/* Shake — comedic punch impact */
.rc-shake { display: inline-block; transform-origin: 50% 60%; }
html:not(.reduce-motion) .rc-shake.is-hit { animation: rc-shake 0.5s var(--rc-ease); }
html:not(.reduce-motion) .rc-shake[data-shake="loop"] { animation: rc-shake 0.5s var(--rc-ease) infinite; }
@keyframes rc-shake {
  0%, 100% { transform: translate(0, 0) rotate(0); }
  15%  { transform: translate(-2px, 1px) rotate(-1.2deg); }
  30%  { transform: translate(3px, -2px) rotate(1.4deg); }
  45%  { transform: translate(-3px, 2px) rotate(-1deg); }
  60%  { transform: translate(2px, -1px) rotate(0.8deg); }
  80%  { transform: translate(-1px, 1px) rotate(-0.4deg); }
}

/* Flicker — neon sign / failing-tube energy */
.rc-flicker { color: var(--rc-accent); text-shadow: var(--rc-neon); }
html:not(.reduce-motion) .rc-flicker { animation: rc-flicker 4.2s linear infinite; }
@keyframes rc-flicker {
  0%, 19%, 21%, 23%, 80%, 100% { opacity: 1;   text-shadow: var(--rc-neon); }
  20%, 22%                     { opacity: 0.3; text-shadow: none; }
  55%, 57%                     { opacity: 0.62; }
  56%                          { opacity: 0.18; text-shadow: none; }
}

/* Rise — timing-beat reveal (content.js / GSAP toggles .is-in) */
.rc-rise {
  opacity: 0;
  transform: translateY(26px);
  transition:
    opacity var(--rc-t-slow) var(--rc-ease-out),
    transform var(--rc-t-slow) var(--rc-ease-out);
  will-change: opacity, transform;
}
.rc-rise.is-in { opacity: 1; transform: none; }
.rc-rise[data-delay="1"] { transition-delay: 0.08s; }
.rc-rise[data-delay="2"] { transition-delay: 0.16s; }
.rc-rise[data-delay="3"] { transition-delay: 0.24s; }
.rc-rise[data-delay="4"] { transition-delay: 0.32s; }
.rc-rise[data-delay="5"] { transition-delay: 0.40s; }

/* Gradient ink for headline emphasis */
.rc-ink-grad {
  background: linear-gradient(96deg, var(--rc-accent), var(--rc-spotlight) 55%, var(--rc-glow));
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
}

/* -----------------------------------------------------------------------------
   05 — BUTTONS — marquee CTA + ghost + utility
   -------------------------------------------------------------------------- */
.rc-btn {
  --_bg: var(--rc-accent);
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--rc-2);
  padding: 0.95em 1.7em;
  font-family: var(--rc-font-body);
  font-weight: 700;
  font-size: var(--rc-fs-body);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--rc-void);
  background: var(--_bg);
  border-radius: var(--rc-r-pill);
  overflow: hidden;
  isolation: isolate;
  transition:
    transform var(--rc-t-fast) var(--rc-spring),
    box-shadow var(--rc-t) var(--rc-ease),
    filter var(--rc-t) var(--rc-ease);
  box-shadow: var(--rc-neon);
}
.rc-btn:hover { transform: translateY(-2px); filter: saturate(1.15) brightness(1.05); }
.rc-btn:active { transform: translateY(0) scale(0.985); }
.rc-btn:disabled { opacity: 0.5; cursor: not-allowed; box-shadow: none; }

/* Primary CTA = glowing marquee button — a sweeping light bar crosses it */
.rc-btn--cta {
  --_bg: linear-gradient(96deg, var(--rc-accent), var(--rc-glow));
  color: var(--rc-ink);
  font-weight: 800;
  padding: 1.05em 2em;
  box-shadow: var(--rc-neon), var(--rc-neon-glow);
}
.rc-btn--cta::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(110deg,
    transparent 0%, rgba(255,255,255,0.55) 18%, transparent 38%);
  transform: translateX(-120%);
  mix-blend-mode: overlay;
}
html:not(.reduce-motion) .rc-btn--cta::before {
  animation: rc-marquee-sweep 3.4s var(--rc-ease) infinite;
}
@keyframes rc-marquee-sweep {
  0%, 60% { transform: translateX(-120%); }
  100%    { transform: translateX(120%); }
}
/* Marquee bulb halo ring */
.rc-btn--cta::after {
  content: "";
  position: absolute;
  inset: -2px;
  border-radius: inherit;
  z-index: -2;
  background: radial-gradient(60% 120% at 50% 50%, var(--rc-accent-40), transparent 70%);
  filter: blur(8px);
  opacity: 0.9;
}

/* Ghost / secondary */
.rc-btn--ghost {
  background: transparent;
  color: var(--rc-ink);
  box-shadow: inset 0 0 0 1px var(--rc-line-2);
}
.rc-btn--ghost:hover {
  box-shadow: inset 0 0 0 1px var(--rc-accent), var(--rc-neon);
  color: var(--rc-ink);
}

/* Spotlight (warm) */
.rc-btn--spot {
  --_bg: var(--rc-spotlight);
  color: var(--rc-void);
  box-shadow: 0 0 24px var(--rc-spot-30);
}

/* Small utility button */
.rc-btn--sm { padding: 0.55em 1em; font-size: var(--rc-fs-sm); }

/* -----------------------------------------------------------------------------
   06 — SHARED ATOMS
   -------------------------------------------------------------------------- */
.rc-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.6em;
  font-size: var(--rc-fs-xs);
  font-weight: 700;
  letter-spacing: var(--rc-track-eyebrow);
  text-transform: uppercase;
  color: var(--rc-accent);
}
.rc-eyebrow::before {
  content: "";
  width: 1.8em; height: 2px;
  background: linear-gradient(90deg, var(--rc-accent), transparent);
}

.rc-kicker {
  font-family: var(--rc-font-mono);
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--rc-ink-dim);
}

.rc-lead {
  font-size: var(--rc-fs-lead);
  color: var(--rc-ink-soft);
  max-width: 56ch;
}

.rc-panel {
  position: relative;
  background:
    linear-gradient(180deg, var(--rc-void-2), var(--rc-void-3));
  border: 1px solid var(--rc-line);
  border-radius: var(--rc-r-lg);
  box-shadow: var(--rc-shadow);
  overflow: hidden;
}
.rc-panel::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(120deg, var(--rc-accent-22), transparent 40%, var(--rc-glow-18));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  pointer-events: none;
  opacity: 0.7;
}

.rc-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  padding: 0.34em 0.8em;
  font-size: var(--rc-fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--rc-ink-soft);
  background: var(--rc-accent-12);
  border: 1px solid var(--rc-line-2);
  border-radius: var(--rc-r-pill);
}
.rc-chip--hot {
  color: var(--rc-void);
  background: var(--rc-accent);
  border-color: transparent;
  box-shadow: var(--rc-neon);
}

.rc-divider {
  height: 1px;
  border: 0;
  background: linear-gradient(90deg, transparent, var(--rc-line-2), transparent);
  margin-block: var(--rc-7);
}

/* A reusable stage-light beam element (placed inside sections) */
.rc-beam {
  position: absolute;
  top: -10%;
  width: 46vmax;
  height: 120%;
  pointer-events: none;
  background: conic-gradient(from 180deg at 50% 0%,
    transparent 0deg,
    var(--rc-spot-30) 6deg,
    transparent 14deg);
  filter: blur(8px);
  opacity: 0.5;
  transform-origin: 50% 0;
  z-index: 0;
}
.rc-beam--left  { left: -6vmax;  transform: rotate(8deg); }
.rc-beam--right { right: -6vmax; transform: rotate(-8deg); }
html:not(.reduce-motion) .rc-beam { animation: rc-beam-sway 9s var(--rc-ease) infinite alternate; }
@keyframes rc-beam-sway {
  from { transform: rotate(6deg); opacity: 0.32; }
  to   { transform: rotate(-6deg); opacity: 0.6; }
}

/* -----------------------------------------------------------------------------
   07 — #cold-open  intro overlay (JS-driven; removable)
   -------------------------------------------------------------------------- */
#cold-open {
  position: fixed;
  inset: 0;
  z-index: var(--rc-z-coldopen);
  display: grid;
  place-items: center;
  text-align: center;
  padding: var(--rc-gutter);
  background:
    radial-gradient(80% 60% at 50% 42%, color-mix(in srgb, var(--rc-spotlight) 14%, transparent), transparent 60%),
    #030208;
  transition: opacity var(--rc-t-slow) var(--rc-ease), visibility var(--rc-t-slow);
}
#cold-open[hidden],
#cold-open.is-done {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}
.cold-open__inner { max-width: 52ch; }
.cold-open__line {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  line-height: var(--rc-lh-tight);
  font-size: var(--rc-fs-h1);
  color: var(--rc-ink);
  opacity: 0;
}
.cold-open__line + .cold-open__line { margin-top: var(--rc-3); }
html:not(.reduce-motion) .cold-open__line {
  animation: rc-punch-in 0.8s var(--rc-spring) both;
}
.cold-open__line:nth-child(1) { animation-delay: 0.15s; }
.cold-open__line:nth-child(2) { animation-delay: 0.85s; }
.cold-open__line:nth-child(3) { animation-delay: 1.55s; }
.cold-open__sub {
  margin-top: var(--rc-5);
  font-size: var(--rc-fs-sm);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rc-ink-dim);
}
.cold-open__skip {
  position: absolute;
  bottom: var(--rc-6);
  left: 50%;
  transform: translateX(-50%);
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rc-ink-ghost);
}
.cold-open__skip:hover { color: var(--rc-accent); }
/* Reduce-motion: show final state instantly */
html.reduce-motion .cold-open__line { opacity: 1; }

/* -----------------------------------------------------------------------------
   08 — #age-disruption  HERO (Attention Gravity, first 1.2s disruption)
   -------------------------------------------------------------------------- */
#age-disruption {
  position: relative;
  /* 100svh keeps the hook full-screen without the mobile chrome clipping it.
     Extra bottom padding clears the fixed sticky CTA bar + home indicator so the
     in-section CTAs are never hidden behind it (env() = safe-area aware). */
  min-height: 100svh;
  display: grid;
  align-items: center;
  padding-block:
    calc(var(--rc-7) + env(safe-area-inset-top, 0px))
    calc(var(--rc-8) + var(--rc-sticky-h, 0px) + env(safe-area-inset-bottom, 0px));
  padding-inline: env(safe-area-inset-left, 0px) env(safe-area-inset-right, 0px);
  overflow: hidden;
  z-index: var(--rc-z-content);
}
.age__grid {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: var(--rc-maxw);
  margin-inline: auto;
  padding-inline: var(--rc-gutter);
  display: grid;
  gap: var(--rc-4);
}
.age__eyebrow { margin-bottom: var(--rc-2); }
.age__title {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-mega);
  line-height: var(--rc-lh-tight);
  letter-spacing: var(--rc-track-display);
  color: var(--rc-ink);
  text-shadow: 0 0 40px rgba(0,0,0,0.7);
}
.age__title .age__pop {
  color: var(--rc-accent);
  text-shadow: var(--rc-neon);
}
.age__tagline {
  max-width: 46ch;
  font-size: var(--rc-fs-lead);
  color: var(--rc-ink-soft);
}
/* Tightened one-liner tagline variant (Phase-1). */
.age__tagline--tight {
  max-width: 34ch;
  font-size: var(--rc-fs-lead);
  line-height: var(--rc-lh-snug);
}
.age__cta-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rc-3);
  align-items: center;
  margin-top: var(--rc-2);
}
/* Make every CTA in the row a comfortable >=44px tap target on phones. */
.age__cta-row .rc-btn { min-height: 48px; }
.age__cta-row .rc-btn--ghost { flex: 0 1 auto; }
.age__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rc-2) var(--rc-4);
  margin-top: var(--rc-4);
  font-size: var(--rc-fs-sm);
  color: var(--rc-ink-dim);
}

/* Live "seats are leaving" line beneath the CTAs (Phase-1 hero__seats). */
.hero__seats {
  margin-top: var(--rc-1);
  font-size: var(--rc-fs-sm);
  line-height: var(--rc-lh-snug);
}
.hero__seats-count {
  font-family: var(--rc-font-mono);
  font-weight: 700;
  font-style: normal;
  letter-spacing: 0.02em;
  color: var(--rc-accent);
  text-shadow: 0 0 14px var(--rc-accent-22);
}
.hero__seats-tail { color: var(--rc-ink-dim); }
/* The disruption flash — a hard light-burst that fires on load, then settles */
.age__disrupt {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background:
    radial-gradient(60% 50% at var(--rc-spot-x) 30%, var(--rc-spot-30), transparent 60%);
  opacity: 0;
}
html:not(.reduce-motion) #age-disruption .age__disrupt {
  animation: rc-disrupt 1.2s var(--rc-ease-out) both;
}
@keyframes rc-disrupt {
  0%   { opacity: 0; transform: scale(1.25); filter: blur(20px); }
  10%  { opacity: 1; }
  30%  { opacity: 0.85; transform: scale(1); filter: blur(0); }
  100% { opacity: 0.4; }
}
/* Scroll cue */
.age__scroll-cue {
  position: absolute;
  bottom: var(--rc-5);
  left: 50%;
  transform: translateX(-50%);
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--rc-2);
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--rc-ink-ghost);
}
.age__scroll-cue span::after {
  content: "";
  display: block;
  width: 1px; height: 34px;
  margin: 6px auto 0;
  background: linear-gradient(var(--rc-accent), transparent);
}
html:not(.reduce-motion) .age__scroll-cue { animation: rc-bob 2.4s var(--rc-ease) infinite; }
@keyframes rc-bob {
  0%, 100% { transform: translateX(-50%) translateY(0); }
  50%      { transform: translateX(-50%) translateY(6px); }
}

/* -----------------------------------------------------------------------------
   09 — #hero-clip  captioned micro player (autoplay muted)
   -------------------------------------------------------------------------- */
/* #hero-clip now lives INLINE inside the hero grid (.hero-clip--inline)
   between the tagline and the CTA row. It must read compact on a phone, not
   as a full-bleed standalone section. The #hero-clip id is preserved so the
   JS mount still resolves. */
#hero-clip {
  position: relative;
  z-index: var(--rc-z-content);
}
.hero-clip--inline {
  margin-block: var(--rc-1);
}
.hero-clip__frame {
  position: relative;
  /* Compact, portrait-leaning proof frame on mobile; capped so it never
     dominates the hook above the fold. */
  width: 100%;
  max-width: 420px;
  margin-inline: auto;
  border-radius: var(--rc-r-lg);
  overflow: hidden;
  aspect-ratio: 16 / 10;
  background: var(--rc-void-3);
  box-shadow: var(--rc-shadow-2);
  border: 1px solid var(--rc-line);
}
.hero-clip--inline .hero-clip__frame {
  max-width: 360px;
}
.hero-clip__frame::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  box-shadow: inset 0 0 120px rgba(0,0,0,0.65);
  border-radius: inherit;
}
.hero-clip__frame video,
.hero-clip__frame img {
  width: 100%; height: 100%;
  object-fit: cover;
}
/* Live caption track rendered over the clip */
.hero-clip__caption {
  position: absolute;
  left: 50%;
  bottom: clamp(1rem, 5%, 2.5rem);
  transform: translateX(-50%);
  z-index: 2;
  max-width: 84%;
  padding: 0.5em 0.95em;
  text-align: center;
  font-weight: 600;
  font-size: clamp(1rem, 2.6vw, 1.4rem);
  color: var(--rc-ink);
  background: rgba(3,2,8,0.62);
  -webkit-backdrop-filter: blur(6px);
          backdrop-filter: blur(6px);
  border-radius: var(--rc-r);
  border: 1px solid var(--rc-line);
  text-shadow: 0 2px 12px rgba(0,0,0,0.8);
}
.hero-clip__badge {
  position: absolute;
  top: var(--rc-4);
  left: var(--rc-4);
  z-index: 2;
}
.hero-clip__mute {
  position: absolute;
  bottom: var(--rc-4);
  right: var(--rc-4);
  z-index: 3;
  width: 44px; height: 44px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: rgba(3,2,8,0.6);
  border: 1px solid var(--rc-line-2);
  color: var(--rc-ink);
  transition: box-shadow var(--rc-t) var(--rc-ease);
}
.hero-clip__mute:hover { box-shadow: var(--rc-neon); }

/* -----------------------------------------------------------------------------
   09b — PHASE-1 CONVERSION FUNNEL  (.rc-scroll beats + #pick + #close + sticky CTA)
   The funnel is THREE scroll beats:
     SCROLL 1  #age-disruption  .rc-scroll--hook   (~100svh, hero w/ inline clip)
     SCROLL 2  #pick            .rc-scroll--pick   (tour map + city panel; taller)
     SCROLL 3  #close           .rc-scroll--close  (~100svh offer block)
   Everything below #close is bonus territory. Mobile-first; full-screen beats
   use 100svh so mobile browser chrome never clips them, and reserve room at the
   bottom (--rc-sticky-h + safe-area) so the fixed #sticky-cta never covers the
   in-section CTAs.
   -------------------------------------------------------------------------- */

/* Approx height the fixed sticky bar reserves at the bottom of the page +
   funnel sections. Kept as a token so the bar height + the section padding +
   the body bottom-pad all stay in lockstep. */
:root { --rc-sticky-h: 76px; }

/* Shared funnel-beat base. Each #age-disruption / #pick / #close carries this. */
.rc-scroll {
  position: relative;
  z-index: var(--rc-z-content);
}

/* --pick (SCROLL 2) — auto/taller: it holds the map + city panel. Just rhythm
   + safe-area gutters + bottom clearance for the sticky bar. */
.rc-scroll--pick {
  padding-block: var(--rc-section-pad);
  padding-inline: env(safe-area-inset-left, 0px) env(safe-area-inset-right, 0px);
  scroll-margin-top: var(--rc-6);
}

/* --close (SCROLL 3) — a punchy ~100svh centered closing beat. */
.rc-scroll--close {
  min-height: 100svh;
  display: grid;
  place-items: center;
  padding-block:
    calc(var(--rc-8) + env(safe-area-inset-top, 0px))
    calc(var(--rc-8) + var(--rc-sticky-h) + env(safe-area-inset-bottom, 0px));
  padding-inline: env(safe-area-inset-left, 0px) env(safe-area-inset-right, 0px);
  overflow: hidden;
}
/* A soft top-down spotlight wash behind the close, echoing the stage void. */
.rc-scroll--close::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background:
    radial-gradient(90% 60% at 50% -6%, var(--rc-spot-30), transparent 58%),
    radial-gradient(120% 80% at 50% 120%, var(--rc-glow-18), transparent 60%);
  opacity: 0.85;
}

/* ---- #close offer block ---------------------------------------------------- */
.close__inner {
  display: grid;
  justify-items: center;
  gap: var(--rc-4);
  text-align: center;
  max-width: 46ch;
}
.close__title {
  font-size: var(--rc-fs-h1);
  text-wrap: balance;
}
.close__proof {
  margin-inline: auto;
  max-width: 42ch;
  color: var(--rc-ink-soft);
}

/* The offer: a framed "from $X / seats" pill stack. */
.close__offer {
  display: grid;
  justify-items: center;
  gap: var(--rc-2);
  width: 100%;
  max-width: 22rem;
  margin-block: var(--rc-2);
  padding: var(--rc-4) var(--rc-5);
  border-radius: var(--rc-r-lg);
  background: linear-gradient(180deg, var(--rc-void-2), var(--rc-void-3));
  border: 1px solid var(--rc-line-2);
  box-shadow: var(--rc-shadow);
}
.close__price {
  display: inline-flex;
  align-items: baseline;
  gap: 0.45em;
}
.close__price-from {
  font-family: var(--rc-font-mono);
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--rc-ink-dim);
}
.close__price-amount {
  font-family: var(--rc-font-display);
  font-size: var(--rc-fs-h1);
  line-height: 1;
  letter-spacing: var(--rc-track-display);
  color: var(--rc-spotlight);
  text-shadow: 0 0 24px var(--rc-spot-30);
  font-variant-numeric: tabular-nums;
}
.close__seats {
  font-family: var(--rc-font-mono);
  font-style: normal;
  font-size: var(--rc-fs-sm);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--rc-accent);
}
.close__cta {
  width: 100%;
  max-width: 22rem;
  min-height: 52px;
  font-size: var(--rc-fs-lead);
}
.close__fine {
  font-style: normal;
  font-size: var(--rc-fs-xs);
  color: var(--rc-ink-dim);
}

/* -----------------------------------------------------------------------------
   09c — STICKY CTA BAR (#sticky-cta / .sticky-cta)
   Fixed to the viewport bottom, full-width, safe-area aware (clears the home
   indicator). DEFAULT = HIDDEN (off-screen, opacity 0, aria-hidden). realm.js
   toggles `.is-shown` once the buyer passes the hook. Sits above page content,
   below #stage-door (z 90). Premium backdrop-blur pill bar over the void.
   -------------------------------------------------------------------------- */
.sticky-cta {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 60; /* above content/ticker(45), below cold-open(80)/stage-door(90) */
  display: flex;
  align-items: center;
  gap: var(--rc-4);
  padding:
    var(--rc-3)
    calc(var(--rc-4) + env(safe-area-inset-right, 0px))
    calc(var(--rc-3) + env(safe-area-inset-bottom, 0px))
    calc(var(--rc-4) + env(safe-area-inset-left, 0px));
  background: rgba(7, 6, 10, 0.82);
  -webkit-backdrop-filter: blur(14px) saturate(120%);
          backdrop-filter: blur(14px) saturate(120%);
  border-top: 1px solid var(--rc-line-2);
  box-shadow: 0 -18px 50px -24px rgba(0, 0, 0, 0.9);
  /* HIDDEN default state: slid off the bottom + faded + non-interactive. */
  transform: translateY(110%);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}
/* Slide-in entrance only when motion is allowed; otherwise it simply appears. */
html:not(.reduce-motion) .sticky-cta {
  transition:
    transform var(--rc-t) var(--rc-ease-out),
    opacity var(--rc-t) var(--rc-ease),
    visibility var(--rc-t);
}
.sticky-cta.is-shown {
  transform: none;
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}
/* A lit accent hairline along the top edge — reads as a live marquee strip. */
.sticky-cta::before {
  content: "";
  position: absolute;
  top: -1px;
  left: 0;
  right: 0;
  height: 1px;
  pointer-events: none;
  background: linear-gradient(90deg, transparent, var(--rc-accent-40), var(--rc-glow-18), transparent);
}

.sticky-cta__info {
  display: grid;
  gap: 2px;
  min-width: 0;
  flex: 1 1 auto;
}
.sticky-cta__price {
  font-family: var(--rc-font-body);
  font-size: var(--rc-fs-sm);
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--rc-ink-soft);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* The price number itself (rendered as <strong> by realm.js) reads mono accent. */
.sticky-cta__price strong {
  font-family: var(--rc-font-mono);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--rc-spotlight);
  text-shadow: 0 0 14px var(--rc-spot-30);
}
.sticky-cta__seats {
  font-family: var(--rc-font-mono);
  font-style: normal;
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--rc-accent);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.sticky-cta__btn {
  flex: 0 0 auto;
  min-height: 48px;
  white-space: nowrap;
}

/* HI-DPI: the top hairline + border can blur to ~2px on retina. On 2x+ screens
   pin them to a true device pixel so the lit edge stays crisp. */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {
  .sticky-cta { border-top-width: 0.5px; }
  .sticky-cta::before { height: 0.5px; }
}

/* >=1024px — dock the bar more tastefully: a slimmer, right-anchored floating
   pill instead of a full-width strip (desktops don't need the thumb-reach bar).
   It detaches from the edges, rounds into a pill, and sits in the lower-right. */
@media (min-width: 1024px) {
  .sticky-cta {
    left: auto;
    right: clamp(1.5rem, 3vw, 2.5rem);
    bottom: clamp(1.5rem, 3vw, 2.5rem);
    width: auto;
    max-width: min(440px, calc(100vw - 4rem));
    gap: var(--rc-5);
    padding: var(--rc-3) var(--rc-3) var(--rc-3) var(--rc-5);
    border: 1px solid var(--rc-line-2);
    border-radius: var(--rc-r-pill);
    box-shadow: var(--rc-shadow-2), var(--rc-neon-glow);
  }
  /* The lit edge becomes a full pill outline rather than a top strip. */
  .sticky-cta::before {
    top: 0;
    border-radius: inherit;
    height: auto;
    inset: 0;
    padding: 1px;
    background: linear-gradient(120deg, var(--rc-accent-40), transparent 45%, var(--rc-glow-18));
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
            mask-composite: exclude;
  }
  /* Slide in from the lower-right corner rather than straight up. */
  .sticky-cta { transform: translateY(140%); }
  .sticky-cta.is-shown { transform: none; }
  .sticky-cta__btn { min-height: 44px; }
}

/* Reserve room so nothing on the page hides behind the fixed bar. The funnel
   sections already pad their own bottoms; the footer (the last paint, where the
   bar is shown) gets the clearance directly on its own rule in §18 so its
   bottom padding accounts for --rc-sticky-h + the home indicator. */
#realm-root { scroll-margin-bottom: var(--rc-sticky-h); }

/* -----------------------------------------------------------------------------
   10 — #progress-rail  fixed scroll->checkout indicator (fills toward checkout)
   Driven by --rc-progress (0..1) written by realm.js on 'progress'.
   -------------------------------------------------------------------------- */
#progress-rail {
  position: fixed;
  top: 0; left: 0;
  width: 100%;
  height: 3px;
  z-index: var(--rc-z-rail);
  background: rgba(255,255,255,0.06);
  pointer-events: none;
}
#progress-rail .rail__fill {
  height: 100%;
  width: calc(var(--rc-progress, 0) * 100%);
  background: linear-gradient(90deg, var(--rc-glow), var(--rc-accent), var(--rc-spotlight));
  box-shadow: 0 0 14px var(--rc-accent-40);
  transition: width 0.18s linear;
}
/* Vertical "journey to the stage door" rail variant for >=1024px (added later) */
#progress-rail .rail__label {
  position: fixed;
  top: 10px; right: 14px;
  font-family: var(--rc-font-mono);
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rc-ink-dim);
  pointer-events: none;
}

/* -----------------------------------------------------------------------------
   11 — #scarcity-ticker  live "seats shrinking" readout
   -------------------------------------------------------------------------- */
#scarcity-ticker {
  position: fixed;
  left: 50%;
  bottom: clamp(0.8rem, 3vw, 1.4rem);
  transform: translateX(-50%);
  z-index: var(--rc-z-ticker);
  display: inline-flex;
  align-items: center;
  gap: 0.7em;
  max-width: calc(100% - 2rem);
  padding: 0.6em 1.05em;
  font-size: var(--rc-fs-sm);
  font-weight: 600;
  color: var(--rc-ink);
  background: rgba(7,6,10,0.82);
  -webkit-backdrop-filter: blur(10px);
          backdrop-filter: blur(10px);
  border: 1px solid var(--rc-line-2);
  border-radius: var(--rc-r-pill);
  box-shadow: var(--rc-shadow);
  transition: opacity var(--rc-t) var(--rc-ease), transform var(--rc-t) var(--rc-ease);
}
#scarcity-ticker[hidden] { display: none; }
/* The ticker's CHILDREN (dot/label/count) + the seat-drop flash are owned by
   realm.components.css §css-ticker-util — ticket.js adds `.rc-ticker` to this
   same element and emits `.rc-ticker__dot` / `.rc-ticker__label` /
   `.rc-ticker__count` with `.is-pulse` / `.is-tick`. The legacy `.tick__dot` /
   `.tick__count` / `.is-drop` rules were removed — nothing emits them.
   DEAD-CSS CLEANUP. The keyframe `rc-pulse` is still referenced by the admin
   busy indicator (§20), so it is preserved below. */
@keyframes rc-pulse {
  0%, 100% { transform: scale(1);   opacity: 1; }
  50%      { transform: scale(1.5); opacity: 0.55; }
}

/* -----------------------------------------------------------------------------
   12 — #clip-stage  curiosity 12s clip section
   -------------------------------------------------------------------------- */
#clip-stage { position: relative; z-index: var(--rc-z-content); overflow: hidden; }
.clip-stage__head {
  max-width: var(--rc-maxw);
  margin-inline: auto;
  padding-inline: var(--rc-gutter);
  margin-bottom: var(--rc-6);
}
.clip-stage__title {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-h1);
  line-height: var(--rc-lh-tight);
}
.clip-stage__rail {
  display: flex;
  gap: var(--rc-4);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding: var(--rc-2) var(--rc-gutter) var(--rc-5);
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin;
}
.clip-card {
  position: relative;
  flex: 0 0 min(78vw, 320px);
  scroll-snap-align: center;
  aspect-ratio: 9 / 14;
  border-radius: var(--rc-r-lg);
  overflow: hidden;
  background: var(--rc-void-3);
  border: 1px solid var(--rc-line);
  box-shadow: var(--rc-shadow);
  transition: transform var(--rc-t) var(--rc-ease), box-shadow var(--rc-t) var(--rc-ease);
}
.clip-card:hover { transform: translateY(-4px); box-shadow: var(--rc-shadow-2), var(--rc-neon); }
.clip-card video, .clip-card img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.clip-card__scrim {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 35%, rgba(3,2,8,0.92));
}
.clip-card__body {
  position: absolute; inset: auto 0 0 0;
  padding: var(--rc-4);
  display: grid;
  gap: var(--rc-2);
}
.clip-card__hook {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-h3);
  line-height: var(--rc-lh-snug);
  color: var(--rc-ink);
}
.clip-card__meta {
  display: flex; align-items: center; gap: var(--rc-3);
  font-size: var(--rc-fs-xs);
  color: var(--rc-ink-dim);
}
.clip-card__react {
  display: inline-flex; align-items: center; gap: 0.3em;
  color: var(--rc-spotlight);
  font-weight: 600;
}
/* Play affordance */
.clip-card__play {
  position: absolute; top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 56px; height: 56px;
  display: grid; place-items: center;
  border-radius: 50%;
  color: var(--rc-void);
  background: var(--rc-ink);
  box-shadow: var(--rc-neon);
  opacity: 0.9;
  transition: transform var(--rc-t) var(--rc-spring);
}
.clip-card:hover .clip-card__play { transform: translate(-50%, -50%) scale(1.08); }

/* -----------------------------------------------------------------------------
   13 — #tcl  ticket conversion loop — 5 stacked staged blocks
   Each [data-stage] gets a stage-light treatment; the active stage brightens.
   -------------------------------------------------------------------------- */
#tcl { position: relative; z-index: var(--rc-z-content); }
.tcl__inner {
  max-width: var(--rc-maxw);
  margin-inline: auto;
  padding-inline: var(--rc-gutter);
  display: grid;
  gap: var(--rc-5);
}
.tcl__head { margin-bottom: var(--rc-4); text-align: center; }
.tcl__title {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-h1);
  line-height: var(--rc-lh-tight);
}
/* NOTE: the per-stage block styling (.rc-tcl__stage and the reveal/stage-light
   ramp) is fully owned by realm.components.css §css-tcl. ticket.js adds
   `.rc-tcl__stage` onto the authored `[data-stage]` shells. The old `.tcl-stage`
   / `.tcl-stage__num` / `.tcl-stage__*` rules were removed here so they don't
   fight the live component (the shells keep their `tcl-stage` class only as an
   inert hydration hook). DEAD-CSS CLEANUP. */

/* -----------------------------------------------------------------------------
   14 — #tour-map + #city-panel  reality layer
   -------------------------------------------------------------------------- */
#tour-map { position: relative; z-index: var(--rc-z-content); }
.tour__layout {
  max-width: var(--rc-maxw);
  margin-inline: auto;
  padding-inline: var(--rc-gutter);
  display: grid;
  gap: var(--rc-5);
}
.tour__head { display: grid; gap: var(--rc-2); }
.tour__title {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-h1);
  line-height: var(--rc-lh-tight);
}
/* The map host frame is owned by realm.components.css (.rc-tourmap__svg).
   tourmap.js renders an SVG (.rc-tourmap__node etc.) or an accessible fallback
   list (.rc-tourmap__list). The legacy `.tour__map-stage` + `.tour-pin*`
   absolute-pin vocabulary was removed — nothing emits it. DEAD-CSS CLEANUP. */

/* #city-panel — host frame for the per-city dossier. tourmap.js writes a
   `.rc-citypanel__inner` subtree (styled in realm.components.css) and adds
   .is-open. The host owns the frame + the single source of padding (the inner
   wrapper is padding-free, so the inset is never doubled). The legacy
   `.city__*` vocabulary was removed — nothing emits it. DEAD-CSS CLEANUP. */
#city-panel {
  position: relative;
  border-radius: var(--rc-r-lg);
  padding: clamp(1.3rem, 5vw, 2.2rem);
  background: linear-gradient(180deg, var(--rc-void-2), var(--rc-void-3));
  border: 1px solid var(--rc-line);
  box-shadow: var(--rc-shadow);
  min-height: 220px;
  transition: box-shadow var(--rc-t) var(--rc-ease);
}
#city-panel[data-empty="true"] { display: grid; place-items: center; color: var(--rc-ink-dim); text-align: center; }

/* -----------------------------------------------------------------------------
   15 — #comedy-memory  feed cards + heatmap visual
   -------------------------------------------------------------------------- */
/* The Comedy Memory subtree (feed cards, heat map, favorite joke) is fully
   owned by realm.components.css §css-memory — content.js emits `.rc-memory__*`,
   `.rc-moment-*`, `.rc-heat*`, `.rc-fav*`. The legacy `.memory__*` /
   `.memory-card*` / `.heatmap` / `.heat-bar*` vocabulary was removed here —
   nothing emits it. DEAD-CSS CLEANUP. Only the host hook remains. */
#comedy-memory { position: relative; z-index: var(--rc-z-content); }

/* -----------------------------------------------------------------------------
   16 — #vcg  Viral Clip Generator
   The share-card vocabulary is now fully owned by realm.components.css
   (.vcg-mounted / .vcg-card / .vcg-frame / .vcg-share …, emitted by vcg.js).
   The legacy `.vcg__*` (double-underscore) preview rules were removed here —
   nothing emits them anymore. DEAD-CSS CLEANUP. Only the section host hook
   stays so the section keeps its content-layer z-index before JS mounts.
   -------------------------------------------------------------------------- */
#vcg { position: relative; z-index: var(--rc-z-content); }

/* -----------------------------------------------------------------------------
   17 — #stage-door  checkout overlay host ("buying = stepping onstage")
   ticket.js sets `class="rc-stagedoor is-open ..."` directly on THIS element and
   renders a dedicated `.rc-stagedoor__scrim` child (styled in
   realm.components.css §css-stagedoor) that owns the dimming + backdrop-blur.
   So the host must be a TRANSPARENT positioning shell only — giving it its own
   background here would double the scrim (a darker seam over the JS scrim).
   The legacy `.stage-door__*` panel/velvet rules are removed: nothing emits them
   anymore (ticket.js emits `.rc-stagedoor__*`). DEAD-CSS CLEANUP.
   -------------------------------------------------------------------------- */
#stage-door {
  position: fixed;
  inset: 0;
  z-index: var(--rc-z-stagedoor);
  display: grid;
  place-items: center;
  padding:
    calc(var(--rc-gutter) + env(safe-area-inset-top, 0px))
    calc(var(--rc-gutter) + env(safe-area-inset-right, 0px))
    calc(var(--rc-gutter) + env(safe-area-inset-bottom, 0px))
    calc(var(--rc-gutter) + env(safe-area-inset-left, 0px));
  /* No own background/scrim — .rc-stagedoor__scrim child renders it. */
  background: transparent;
  /* Hidden until ticket.js adds .is-open / .rc-stagedoor (which animates it). */
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--rc-t) var(--rc-ease), visibility var(--rc-t);
}
/* Both the legacy host hook and the JS-rendered open state reveal the overlay. */
#stage-door.is-open,
#stage-door.rc-stagedoor.is-open { opacity: 1; visibility: visible; }

/* -----------------------------------------------------------------------------
   18 — FOOTER + SOCIAL
   -------------------------------------------------------------------------- */
.rc-footer {
  position: relative;
  z-index: var(--rc-z-content);
  /* Bottom padding clears the fixed #sticky-cta (shown this far down the page)
     plus the iPhone home indicator, so the last line of copy is never hidden
     behind the bar. */
  padding-top: var(--rc-8);
  padding-bottom: calc(var(--rc-7) + var(--rc-sticky-h) + env(safe-area-inset-bottom, 0px));
  border-top: 1px solid var(--rc-line);
  background: linear-gradient(180deg, transparent, rgba(3,2,8,0.6));
}
.rc-footer__inner {
  max-width: var(--rc-maxw);
  margin-inline: auto;
  padding-inline: var(--rc-gutter);
  display: grid;
  gap: var(--rc-6);
}
.rc-footer__sign {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-h2);
  line-height: var(--rc-lh-snug);
  color: var(--rc-ink);
}
.rc-footer__social {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rc-3);
}
.rc-footer__social a,
.rc-footer__social .rc-btn {
  display: inline-flex; align-items: center; gap: 0.5em;
  padding: 0.55em 1em;
  /* >=44px tap target on phones (a11y + thumb reach). */
  min-height: 44px;
  border-radius: var(--rc-r-pill);
  color: var(--rc-ink);
  border: 1px solid var(--rc-line-2);
  font-size: var(--rc-fs-sm);
  font-weight: 600;
  transition: box-shadow var(--rc-t) var(--rc-ease), color var(--rc-t) var(--rc-ease);
}
/* The footer CTA keeps its own gradient fill/border; don't let the shared
   social-link border above flatten it. */
.rc-footer__social .rc-btn--cta { border-color: transparent; color: var(--rc-ink); }
.rc-footer__social a:hover { box-shadow: var(--rc-neon); color: var(--rc-accent); }
.rc-footer__legal {
  font-size: var(--rc-fs-xs);
  color: var(--rc-ink-ghost);
}

/* -----------------------------------------------------------------------------
   19 — RESPONSIVE — desktop legibility >=1024px, refinement >=1600px
   -------------------------------------------------------------------------- */
@media (min-width: 1024px) {
  :root {
    --rc-fs-mega: clamp(6rem, 13vw, 13rem);
  }

  .age__grid { gap: var(--rc-6); }
  .age__tagline { font-size: var(--rc-fs-h3); max-width: 40ch; }

  /* Progress rail becomes a slim vertical "walk to the stage door" on the right */
  #progress-rail {
    top: 0; right: 0; left: auto;
    width: 4px; height: 100vh;
    background: rgba(255,255,255,0.05);
  }
  #progress-rail .rail__fill {
    width: 100%;
    height: calc(var(--rc-progress, 0) * 100%);
    background: linear-gradient(180deg, var(--rc-glow), var(--rc-accent), var(--rc-spotlight));
    transition: height 0.18s linear;
  }
  #progress-rail .rail__label {
    top: auto; bottom: 14px; right: 14px;
    writing-mode: vertical-rl;
  }

  /* Clip stage shows a true grid instead of a snap rail on desktop */
  .clip-stage__rail {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    overflow: visible;
    padding-inline: var(--rc-gutter);
  }
  .clip-card { flex: initial; aspect-ratio: 9 / 13; }

  /* Tour layout: map + sticky city panel side by side */
  .tour__layout {
    grid-template-columns: 1.5fr 1fr;
    align-items: start;
    max-width: var(--rc-maxw);
  }
  .tour__head { grid-column: 1 / -1; }
  #city-panel { position: sticky; top: var(--rc-7); }

  /* (Comedy-memory + VCG desktop layouts live in realm.components.css now —
     the JS emits .rc-memory__* / .vcg-* and those files own their own >=1024px
     passes. The legacy .memory__feed / .vcg__inner / .vcg__head / .vcg__actions
     rules were removed here: nothing emits them. DEAD-CSS CLEANUP.) */

  /* Footer two-column */
  .rc-footer__inner { grid-template-columns: 1fr auto; align-items: end; }
  /* (TCL desktop staircase offsets live in realm.components.css §css-tcl now.) */
}

@media (min-width: 1600px) {
  :root {
    --rc-maxw: var(--rc-maxw-wide);
    --rc-fs-body: 1.12rem;
  }
  .clip-stage__rail { grid-template-columns: repeat(5, 1fr); }
  .age__tagline { font-size: var(--rc-fs-h2); }
}

/* Desktop: spotlight follows pointer subtly via JS-set vars; on hover-capable
   devices we let the spotlight read a bit brighter. */
@media (hover: hover) and (pointer: fine) {
  body::before { transition: background 0.5s var(--rc-ease); }
}

/* -----------------------------------------------------------------------------
   20 — ADMIN SHARED STYLES (.admin-*)  used by admin.html
   -------------------------------------------------------------------------- */
.admin-shell {
  min-height: 100vh;
  max-width: 1080px;
  margin-inline: auto;
  padding: clamp(1.4rem, 5vw, 3rem) var(--rc-gutter);
  display: grid;
  gap: var(--rc-5);
}
.admin-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--rc-4);
  padding-bottom: var(--rc-4);
  border-bottom: 1px solid var(--rc-line);
}
.admin-title {
  font-family: var(--rc-font-display);
  text-transform: uppercase;
  font-size: var(--rc-fs-h2);
  line-height: 1;
  color: var(--rc-ink);
}
.admin-title small {
  display: block;
  font-family: var(--rc-font-mono);
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.2em;
  color: var(--rc-accent);
  margin-top: 0.4em;
}
.admin-token {
  display: flex;
  align-items: center;
  gap: var(--rc-2);
}
.admin-input {
  padding: 0.6em 0.9em;
  min-width: 220px;
  border-radius: var(--rc-r-sm);
  background: var(--rc-void-3);
  border: 1px solid var(--rc-line-2);
  color: var(--rc-ink);
  font-family: var(--rc-font-mono);
  font-size: var(--rc-fs-sm);
}
.admin-input:focus-visible { border-color: var(--rc-accent); }

.admin-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rc-2);
  align-items: center;
}
.admin-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  padding: 0.6em 1.1em;
  border-radius: var(--rc-r-pill);
  font-weight: 700;
  font-size: var(--rc-fs-sm);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--rc-ink);
  background: var(--rc-void-2);
  border: 1px solid var(--rc-line-2);
  transition: box-shadow var(--rc-t) var(--rc-ease), transform var(--rc-t-fast) var(--rc-spring), color var(--rc-t) var(--rc-ease);
}
.admin-btn:hover { transform: translateY(-1px); box-shadow: var(--rc-neon); color: var(--rc-accent); }
.admin-btn--primary {
  color: var(--rc-void);
  background: linear-gradient(96deg, var(--rc-accent), var(--rc-glow));
  border-color: transparent;
  box-shadow: var(--rc-neon);
}
.admin-btn--primary:hover { color: var(--rc-void); }
.admin-btn--ghost { background: transparent; }
.admin-btn--danger {
  color: #ffd9d9;
  border-color: rgba(255,60,60,0.4);
  background: rgba(255,60,60,0.08);
}

.admin-editor {
  display: grid;
  gap: var(--rc-2);
}
.admin-editor label {
  font-size: var(--rc-fs-xs);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rc-ink-dim);
}
.admin-textarea {
  width: 100%;
  min-height: 60vh;
  resize: vertical;
  padding: var(--rc-4);
  border-radius: var(--rc-r);
  background: #050409;
  border: 1px solid var(--rc-line-2);
  color: var(--rc-ink);
  font-family: var(--rc-font-mono);
  font-size: 0.84rem;
  line-height: 1.55;
  tab-size: 2;
  white-space: pre;
  overflow: auto;
}
.admin-textarea:focus-visible { border-color: var(--rc-accent); outline-offset: 0; }
.admin-textarea.is-invalid { border-color: rgba(255,60,60,0.6); box-shadow: 0 0 0 1px rgba(255,60,60,0.4); }

.admin-status {
  display: flex;
  align-items: center;
  gap: 0.6em;
  min-height: 1.6em;
  font-family: var(--rc-font-mono);
  font-size: var(--rc-fs-sm);
  color: var(--rc-ink-dim);
}
.admin-status::before {
  content: "";
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--rc-ink-ghost);
}
.admin-status.is-ok    { color: #d6ffe9; }
.admin-status.is-ok::before    { background: #4dffa0; box-shadow: 0 0 10px #4dffa0; }
.admin-status.is-error { color: #ffd9d9; }
.admin-status.is-error::before { background: #ff5b5b; box-shadow: 0 0 10px #ff5b5b; }
.admin-status.is-busy::before  { background: var(--rc-spotlight); box-shadow: 0 0 10px var(--rc-spotlight); }
html:not(.reduce-motion) .admin-status.is-busy::before { animation: rc-pulse 1s var(--rc-ease) infinite; }

.admin-hint {
  font-size: var(--rc-fs-xs);
  color: var(--rc-ink-ghost);
  line-height: 1.6;
}
.admin-hint code {
  font-family: var(--rc-font-mono);
  color: var(--rc-spotlight);
  background: var(--rc-accent-12);
  padding: 0.1em 0.4em;
  border-radius: 4px;
}

/* -----------------------------------------------------------------------------
   21 — prefers-reduced-motion NEUTRALIZER
   realm.js also adds .reduce-motion to <html>; we honor both the media query
   and the class so motion is fully calmed either way.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  .rc-rise { opacity: 1; transform: none; }
  .cold-open__line { opacity: 1; }
}

html.reduce-motion *,
html.reduce-motion *::before,
html.reduce-motion *::after {
  animation: none !important;
  transition-duration: 0.001ms !important;
}
html.reduce-motion .rc-rise { opacity: 1 !important; transform: none !important; }
html.reduce-motion .cold-open__line { opacity: 1 !important; }
html.reduce-motion body::after { opacity: 0.28; } /* keep grain static but present */

/* End realm.css */
