/*
  SmashDrop — smashdrop.app
  ------------------------------------------------------------------
  Mobile-first. Every base rule targets a 360px phone; media queries
  only ever ADD width. Colours are lifted verbatim from the app's own
  palette (src/theme/colors.ts) — the site and the product must not be
  two different greens.
*/

/* ---------- tokens ---------- */
:root {
  /*
    The app's LIGHT palette, lifted verbatim from src/theme/colors.ts.

    Fill vs ink, which is the rule that matters here. The palette's brand
    values are FILLS: court green on a white surface measures 1.4:1 as
    text, which is invisible. So the tokens named after a colour resolve
    to that colour's INK — the deepened, text-safe step, each of which
    clears WCAG AA on both white and its own soft tint — and the vivid
    original is available separately as `--*-bright` for the handful of
    places that are genuinely a fill: a gradient button, a live dot, the
    progress bar.

    Get this backwards and the page still "works", it is just unreadable.
  */
  --bg: #E9F5EE;
  --surface: #FFFFFF;
  --surface-alt: #DCEFE4;
  --raised: #FFFFFF;

  --border: #C8E2D3;
  --border-strong: #A6CCB6;

  --text: #062015;
  --muted: #4A6659;
  /*
    Darker than the app's own `textFaint` (#7A9687), deliberately.

    That value measures 2.7:1 on this page's tinted ground — it fails AA
    for normal text by a wide margin, and the site leans on it far more
    than the app does: footer headings, stat labels, the eyebrow above
    every feature, the fine print under the pricing. #516E5F clears 4.67:1
    against the worst of the three surfaces and still reads as the quiet
    third step below `--muted`.
  */
  --faint: #516E5F;

  /* ink — safe as text */
  --court: #00734A;
  --shuttle: #8A5A00;
  --haven: #6D28D9;
  --streak: #B23A0A;   /* LIVE pill text; #C2410C fell to 4.3:1 on the tinted band */
  --gold: #8A5A00;
  --info: #1B4FBF;
  --danger: #B3261E;

  /* fills — never as text */
  --court-bright: #00E88F;
  --court-deep: #00734A;
  --on-court: #00190E;
  --shuttle-bright: #FFD84D;
  --on-shuttle: #231A00;
  --haven-bright: #B47CF5;
  --streak-bright: #FF6B35;

  --court-soft: rgba(0, 141, 90, 0.12);
  --court-border: rgba(0, 115, 74, 0.30);
  --shuttle-soft: rgba(214, 150, 0, 0.15);
  --shuttle-border: rgba(214, 150, 0, 0.34);
  --haven-soft: rgba(109, 40, 217, 0.10);
  --haven-border: rgba(109, 40, 217, 0.30);
  --streak-soft: rgba(255, 107, 53, 0.12);

  /* Light needs real elevation; the dark scheme leaned on surface
     lightness instead and barely used shadow at all. */
  --shadow-sm: 0 2px 6px rgba(11, 26, 19, 0.06);
  --shadow-md: 0 8px 20px rgba(11, 26, 19, 0.08);
  --shadow-lg: 0 18px 42px rgba(11, 26, 19, 0.12);

  /* 4pt scale, same names the app uses */
  --sp-xs: 4px;
  --sp-sm: 8px;
  --sp-md: 12px;
  --sp-lg: 16px;
  --sp-xl: 20px;
  --sp-2xl: 24px;
  --sp-3xl: 32px;
  --sp-4xl: 40px;
  --sp-5xl: 56px;

  --r-sm: 10px;
  --r-md: 14px;
  --r-lg: 18px;
  --r-xl: 24px;
  --r-2xl: 32px;
  --r-pill: 999px;

  --font: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI',
    Roboto, Helvetica, Arial, sans-serif;

  --wrap: 1180px;
  --header-h: 60px;

  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
}

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

html {
  overflow-x: clip;
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 12px);
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font);
  font-size: 16px;
  line-height: 1.6;
  letter-spacing: -0.01em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/*
  `overflow-x: hidden` is NOT the way to stop sideways scroll, and it cost
  the showcase its whole effect.

  When one axis is `hidden` and the other `visible`, CSS computes the
  visible one to `auto` — so `overflow-x: hidden` on the body silently made
  the body a vertical scroll container. `position: sticky` then pinned to
  the BODY's scrollport instead of the viewport, and a scrollport that
  scrolls with the page never holds anything still. The phone in the
  showcase scrolled away exactly as if it had never been sticky at all.

  `overflow-x: clip` on the root, above, is the fix: `clip` is explicitly
  exempt from that rule, so it stops sideways scroll without creating a
  scroll container. The real overflow sources were found and fixed anyway
  (see the marquee's lane, and the sideways reveals below 900px) — this is
  only a backstop.
*/

img, svg, video { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; border: 0; background: none; cursor: pointer; }
ul, ol { margin: 0; padding: 0; }

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

::selection { background: var(--court); color: var(--on-court); }

/* ---------- layout ---------- */
.wrap {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--sp-xl);
}

.section {
  position: relative;
  padding-block: var(--sp-5xl);
}

@media (min-width: 768px) {
  .wrap { padding-inline: var(--sp-3xl); }
  .section { padding-block: 96px; }
}

@media (min-width: 1100px) {
  .section { padding-block: 120px; }
}

.section--tint { background: linear-gradient(180deg, transparent, var(--surface-alt) 12%, var(--surface-alt) 88%, transparent); }

.hr {
  height: 1px;
  border: 0;
  margin: 0;
  background: linear-gradient(90deg, transparent, var(--border), transparent);
}

/* ---------- type ---------- */
h1, h2, h3, h4 { margin: 0; font-weight: 800; letter-spacing: -0.035em; line-height: 1.05; }

.display {
  font-size: clamp(2.3rem, 9.4vw, 4.9rem);
  font-weight: 800;
  letter-spacing: -0.045em;
  line-height: 0.98;
}

.h1 { font-size: clamp(1.95rem, 7.2vw, 3.4rem); line-height: 1.04; }
.h2 { font-size: clamp(1.45rem, 5vw, 2.1rem); line-height: 1.12; letter-spacing: -0.03em; }
.h3 { font-size: 1.125rem; font-weight: 700; letter-spacing: -0.02em; line-height: 1.3; }

.lead {
  font-size: clamp(1.02rem, 3.6vw, 1.28rem);
  line-height: 1.55;
  color: var(--muted);
  font-weight: 500;
  letter-spacing: -0.015em;
}

.body-muted { color: var(--muted); font-size: 0.975rem; line-height: 1.65; }

.overline {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 0.688rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--court);
}

.overline::before {
  content: '';
  width: 18px;
  height: 2px;
  border-radius: 2px;
  background: currentColor;
}

.overline--shuttle { color: var(--shuttle); }
.overline--haven { color: var(--haven); }

.ink-court { color: var(--court); }
.ink-shuttle { color: var(--shuttle); }
.ink-haven { color: var(--haven); }
.ink-muted { color: var(--muted); }

/* Gradient headline word. Falls back to plain court green where
   background-clip:text is unsupported. */
.grad {
  color: var(--court);
  background: linear-gradient(100deg, #00A86B 0%, #00734A 45%, #8A5A00 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

.section-head { max-width: 720px; margin-bottom: var(--sp-3xl); }
.section-head .h2 { margin-block: var(--sp-md) var(--sp-lg); }
.section-head--center { margin-inline: auto; text-align: center; }
.section-head--center .overline { justify-content: center; }

@media (min-width: 768px) {
  .section-head { margin-bottom: var(--sp-4xl); }
}

/* ---------- buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 52px;
  padding: 0 var(--sp-2xl);
  border-radius: var(--r-pill);
  font-weight: 700;
  font-size: 0.975rem;
  letter-spacing: -0.01em;
  transition: transform 0.18s var(--ease), box-shadow 0.25s var(--ease),
    background-color 0.2s var(--ease), border-color 0.2s var(--ease);
  will-change: transform;
}

.btn:active { transform: scale(0.97); }

.btn--primary {
  background: linear-gradient(135deg, #2BF0A0, #00C97F);
  color: var(--on-court);
  box-shadow: 0 8px 30px rgba(0, 232, 143, 0.28);
}

.btn--primary:hover { box-shadow: 0 12px 40px rgba(0, 232, 143, 0.42); transform: translateY(-2px); }

.btn--ghost {
  border: 1px solid var(--border-strong);
  background: var(--surface);
  color: var(--text);
}

.btn--ghost:hover { border-color: var(--court); background: var(--court-soft); }

.btn--shuttle {
  background: linear-gradient(135deg, #FFE066, #FFC53D);
  color: var(--on-shuttle);
  box-shadow: 0 8px 30px rgba(255, 200, 61, 0.26);
}

.btn--shuttle:hover { transform: translateY(-2px); box-shadow: 0 12px 40px rgba(255, 200, 61, 0.4); }

.btn--sm { min-height: 42px; padding: 0 var(--sp-xl); font-size: 0.875rem; }
.btn--block { width: 100%; }

/*
  Store badges. Drawn rather than shipped as Apple/Google artwork so they
  stay crisp, theme correctly on the dark ground, and add no image request.
*/
.stores {
  display: flex;
  flex-direction: column;
  gap: var(--sp-md);
}

@media (min-width: 420px) {
  .stores { flex-direction: row; flex-wrap: wrap; }
}

.store {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  min-height: 56px;
  padding: 0 22px 0 18px;
  border-radius: var(--r-md);
  border: 1px solid rgba(234, 247, 240, 0.22);
  background: rgba(4, 10, 8, 0.72);
  color: #fff;
  transition: transform 0.2s var(--ease), border-color 0.2s var(--ease),
    background-color 0.2s var(--ease), box-shadow 0.25s var(--ease);
}

.store:hover {
  transform: translateY(-3px);
  border-color: rgba(0, 232, 143, 0.6);
  background: rgba(10, 31, 22, 0.92);
  box-shadow: 0 14px 34px rgba(0, 0, 0, 0.5);
}

.store svg { flex: none; width: 24px; height: 24px; }
.store__text { display: flex; flex-direction: column; line-height: 1.15; text-align: left; }
.store__sub { font-size: 0.625rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: rgba(255, 255, 255, 0.66); }
.store__name { font-size: 1.05rem; font-weight: 700; letter-spacing: -0.02em; }

/* ---------- chips / pills ---------- */
.chip {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 13px;
  border-radius: var(--r-pill);
  border: 1px solid var(--court-border);
  background: var(--court-soft);
  color: var(--court);
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.01em;
  white-space: nowrap;
}

.chip--shuttle { border-color: rgba(255, 216, 77, 0.34); background: var(--shuttle-soft); color: var(--shuttle); }
.chip--haven { border-color: rgba(180, 124, 245, 0.38); background: var(--haven-soft); color: var(--haven); }
.chip--plain { border-color: var(--border); background: var(--surface); color: var(--muted); }

.dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: currentColor;
  flex: none;
}

.dot--live { box-shadow: 0 0 0 0 currentColor; animation: pulse 2s infinite; }

@keyframes pulse {
  0% { box-shadow: 0 0 0 0 rgba(0, 232, 143, 0.6); }
  70% { box-shadow: 0 0 0 9px rgba(0, 232, 143, 0); }
  100% { box-shadow: 0 0 0 0 rgba(0, 232, 143, 0); }
}

/* ---------- header ---------- */
.header {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 90;
  height: var(--header-h);
  display: flex;
  align-items: center;
  transition: background-color 0.3s var(--ease), border-color 0.3s var(--ease),
    backdrop-filter 0.3s var(--ease);
  border-bottom: 1px solid transparent;
}

.header.is-stuck {
  background: rgba(233, 245, 238, 0.82);
  backdrop-filter: blur(18px) saturate(140%);
  -webkit-backdrop-filter: blur(18px) saturate(140%);
  border-bottom-color: var(--border);
}

.header__inner {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--sp-xl);
  display: flex;
  align-items: center;
  gap: var(--sp-lg);
}

@media (min-width: 768px) {
  .header__inner { padding-inline: var(--sp-3xl); }
}

.brand { display: inline-flex; align-items: center; gap: 10px; margin-right: auto; }
.brand svg { width: 30px; height: 30px; }
.brand__word { font-size: 1.12rem; font-weight: 800; letter-spacing: -0.04em; }
.brand__word em { font-style: normal; color: var(--court); }

.nav { display: none; }

@media (min-width: 940px) {
  .nav { display: flex; align-items: center; gap: var(--sp-2xl); }
  .nav a {
    position: relative;
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--muted);
    transition: color 0.2s var(--ease);
  }
  .nav a::after {
    content: '';
    position: absolute;
    left: 0;
    bottom: -6px;
    width: 0;
    height: 2px;
    border-radius: 2px;
    background: var(--court-bright);
    transition: width 0.25s var(--ease);
  }
  .nav a:hover { color: var(--text); }
  .nav a:hover::after { width: 100%; }
}

.header__cta { display: none; }
@media (min-width: 560px) { .header__cta { display: inline-flex; } }

/* burger */
/*
  Flex column, not grid. As a grid the three bars landed in implicit rows
  that collapsed against each other and the icon rendered as two.
*/
.burger {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  margin-right: -8px;
  border-radius: var(--r-sm);
}

@media (min-width: 940px) { .burger { display: none; } }

.burger span {
  display: block;
  width: 20px;
  height: 2px;
  border-radius: 2px;
  background: var(--text);
  transition: transform 0.3s var(--ease), opacity 0.2s var(--ease);
}

.burger[aria-expanded='true'] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.burger[aria-expanded='true'] span:nth-child(2) { opacity: 0; }
.burger[aria-expanded='true'] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.mobile-nav {
  position: fixed;
  inset: var(--header-h) 0 auto 0;
  z-index: 89;
  padding: var(--sp-xl) var(--sp-xl) var(--sp-3xl);
  background: rgba(233, 245, 238, 0.97);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border-bottom: 1px solid var(--border);
  display: grid;
  gap: 2px;
  transform: translateY(-12px);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.25s var(--ease), transform 0.3s var(--ease), visibility 0.3s;
}

.mobile-nav.is-open { opacity: 1; transform: none; visibility: visible; }

.mobile-nav a {
  padding: 14px 4px;
  font-size: 1.05rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  border-bottom: 1px solid var(--border);
}

.mobile-nav .btn { margin-top: var(--sp-xl); }

@media (min-width: 940px) { .mobile-nav { display: none; } }

/* ---------- hero ---------- */
.hero {
  position: relative;
  padding-top: calc(var(--header-h) + 44px);
  padding-bottom: var(--sp-4xl);
  overflow: hidden;
  isolation: isolate;
}

@media (min-width: 900px) {
  .hero { padding-top: calc(var(--header-h) + 76px); padding-bottom: 88px; }
}

/* the moving ground: two emerald blooms and a shuttle-yellow one */
.hero__glow {
  position: absolute;
  z-index: -2;
  border-radius: 50%;
  filter: blur(80px);
  opacity: 0.42;
  pointer-events: none;
}

.hero__glow--a {
  width: 68vw; height: 68vw;
  max-width: 620px; max-height: 620px;
  top: -14%; left: -22%;
  background: radial-gradient(circle, rgba(0, 232, 143, 0.55), transparent 68%);
  animation: drift-a 20s var(--ease-in-out) infinite alternate;
}

.hero__glow--b {
  width: 60vw; height: 60vw;
  max-width: 540px; max-height: 540px;
  top: 12%; right: -24%;
  background: radial-gradient(circle, rgba(0, 188, 212, 0.4), transparent 68%);
  animation: drift-b 26s var(--ease-in-out) infinite alternate;
}

.hero__glow--c {
  width: 46vw; height: 46vw;
  max-width: 420px; max-height: 420px;
  bottom: -12%; left: 32%;
  background: radial-gradient(circle, rgba(255, 216, 77, 0.26), transparent 68%);
  animation: drift-c 22s var(--ease-in-out) infinite alternate;
}

@keyframes drift-a { to { transform: translate3d(70px, 50px, 0) scale(1.14); } }
@keyframes drift-b { to { transform: translate3d(-60px, 70px, 0) scale(1.1); } }
@keyframes drift-c { to { transform: translate3d(50px, -50px, 0) scale(1.18); } }

/* court lines, barely there */
.hero__court {
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  opacity: 0.5;
  -webkit-mask-image: radial-gradient(ellipse 90% 70% at 50% 30%, #000 20%, transparent 78%);
  mask-image: radial-gradient(ellipse 90% 70% at 50% 30%, #000 20%, transparent 78%);
}

/* the falling shuttles — the app's own ambient motion, ported */
.shuttle-fall {
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  overflow: hidden;
}

.shuttle-fall i {
  position: absolute;
  top: -10%;
  color: var(--court);
  opacity: 0;
  animation-name: fall;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

.shuttle-fall i svg { width: 100%; height: 100%; }

@keyframes fall {
  0% { transform: translate3d(0, -10vh, 0) rotate(var(--rot, 12deg)); opacity: 0; }
  12% { opacity: var(--peak, 0.5); }
  88% { opacity: var(--peak, 0.5); }
  100% { transform: translate3d(var(--dx, 26px), 112vh, 0) rotate(calc(var(--rot, 12deg) + 40deg)); opacity: 0; }
}

.hero__grid { display: grid; gap: var(--sp-4xl); }

@media (min-width: 1000px) {
  .hero__grid {
    grid-template-columns: minmax(0, 1.02fr) minmax(0, 0.98fr);
    align-items: center;
    gap: var(--sp-3xl);
  }
}

.hero__badge {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 7px 15px 7px 9px;
  border-radius: var(--r-pill);
  border: 1px solid var(--court-border);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  font-size: 0.78rem;
  font-weight: 700;
  color: var(--text);
  margin-bottom: var(--sp-xl);
}

.hero__badge b {
  padding: 3px 9px;
  border-radius: var(--r-pill);
  background: var(--court-bright);
  color: var(--on-court);
  font-size: 0.66rem;
  font-weight: 800;
  letter-spacing: 0.07em;
  text-transform: uppercase;
}

.hero h1 { margin-bottom: var(--sp-xl); }
.hero .lead { max-width: 30ch; margin-bottom: var(--sp-2xl); }

@media (min-width: 768px) { .hero .lead { max-width: 46ch; } }

/*
  Two-up on a phone, then a single row once there is width for it. As a
  flex-wrap row the fourth figure dropped onto a line of its own, which
  read as an afterthought rather than as the fourth of four.
*/
.hero__proof {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-xl) var(--sp-2xl);
  margin-top: var(--sp-2xl);
  padding-top: var(--sp-2xl);
  border-top: 1px solid var(--border);
}

@media (min-width: 560px) {
  .hero__proof { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.hero__proof div { min-width: 0; }
.hero__proof dt { display: block; font-size: 1.55rem; font-weight: 800; letter-spacing: -0.045em; line-height: 1.1; }
.hero__proof dd { margin: 2px 0 0; font-size: 0.75rem; font-weight: 600; color: var(--faint); letter-spacing: 0.01em; }

.hero__note { margin-top: var(--sp-lg); font-size: 0.8rem; color: var(--faint); }

/* the phone cluster */
.hero__phones {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: flex-end;
  gap: 0;
  perspective: 1600px;
  min-height: 480px;
}

.hero__phones .phone { flex: none; }

.hero__phones .phone--back {
  transform: translateX(28%) rotate(7deg) scale(0.8);
  /* On the dark scheme 0.55 read as "further away". On a light ground it
     just read as washed out — a pale grey slab. Depth here comes from the
     scale and the rotation instead. */
  opacity: 0.9;
  display: none;
}

.hero__phones .phone--front {
  transform: rotate(-2deg);
  z-index: 3;
}

@media (min-width: 620px) {
  .hero__phones .phone--back { display: block; }
  .hero__phones .phone--front { transform: translateX(-8%) rotate(-3deg); }
}

@media (min-width: 1000px) {
  .hero__phones { min-height: 620px; justify-content: flex-end; }
}

/* ---------- marquee ---------- */
.marquee {
  position: relative;
  overflow: hidden;
  padding-block: var(--sp-xl);
  border-block: 1px solid var(--border);
  background: var(--surface-alt);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}

/*
  The lane holds the track and its duplicate side by side and is what
  slides; the track itself only sets the content width. Animating the
  lane rather than the track is what makes the loop seamless — at -50%
  the duplicate sits exactly where the original started.
*/
.marquee__lane {
  display: flex;
  width: max-content;
  animation: slide 42s linear infinite;
}

.marquee:hover .marquee__lane { animation-play-state: paused; }

.marquee__track {
  display: flex;
  width: max-content;
  gap: var(--sp-3xl);
  padding-right: var(--sp-3xl);
}

/* With no JS the single track still needs to move on its own. */
.marquee > .marquee__track { animation: slide 42s linear infinite; }
.marquee__lane .marquee__track { animation: none; }

.marquee__item {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--muted);
  white-space: nowrap;
}

.marquee__item svg { width: 15px; height: 15px; color: var(--court); flex: none; }

@keyframes slide { to { transform: translateX(-50%); } }

/* ---------- cards ---------- */
.card {
  position: relative;
  padding: var(--sp-2xl);
  border-radius: var(--r-xl);
  border: 1px solid var(--border);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  transition: transform 0.35s var(--ease), border-color 0.35s var(--ease),
    box-shadow 0.35s var(--ease);
}

.card::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(140deg, rgba(0, 141, 90, 0.34), transparent 42%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  opacity: 0;
  transition: opacity 0.35s var(--ease);
  pointer-events: none;
}

.card:hover { transform: translateY(-4px); border-color: var(--court-border); box-shadow: var(--shadow-lg); }
.card:hover::before { opacity: 1; }

.card__icon {
  display: grid;
  place-items: center;
  width: 46px;
  height: 46px;
  margin-bottom: var(--sp-lg);
  border-radius: var(--r-md);
  border: 1px solid var(--court-border);
  background: var(--court-soft);
  color: var(--court);
}

.card__icon svg { width: 22px; height: 22px; }
.card__icon--shuttle { border-color: rgba(255, 216, 77, 0.32); background: var(--shuttle-soft); color: var(--shuttle); }
.card__icon--haven { border-color: rgba(180, 124, 245, 0.36); background: var(--haven-soft); color: var(--haven); }
.card__icon--streak { border-color: rgba(255, 107, 53, 0.34); background: rgba(255, 107, 53, 0.14); color: var(--streak); }

.card h3 { margin-bottom: var(--sp-sm); }
.card p { margin: 0; color: var(--muted); font-size: 0.94rem; line-height: 1.6; }

.grid { display: grid; gap: var(--sp-lg); }

@media (min-width: 620px) { .grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 620px) { .grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 980px) { .grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 620px) { .grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1000px) { .grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* a card that spans two columns on wide screens */
@media (min-width: 980px) { .card--wide { grid-column: span 2; } }

/* ---------- alternating feature rows ---------- */
.feature {
  display: grid;
  gap: var(--sp-3xl);
  align-items: center;
}

.feature + .feature { margin-top: 88px; }

@media (min-width: 900px) {
  .feature { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-5xl); }
  .feature + .feature { margin-top: 120px; }
  .feature--flip .feature__media { order: -1; }
}

.feature__media { display: flex; justify-content: center; }

.feature__list { margin-top: var(--sp-2xl); display: grid; gap: var(--sp-md); }

.feature__list li {
  position: relative;
  list-style: none;
  padding-left: 30px;
  font-size: 0.95rem;
  line-height: 1.55;
  color: var(--muted);
}

.feature__list li b { color: var(--text); font-weight: 700; }

.feature__list li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 5px;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--court-soft);
  border: 1px solid var(--court-border);
}

.feature__list li::after {
  content: '';
  position: absolute;
  left: 6px;
  top: 10px;
  width: 6px;
  height: 3px;
  border-left: 2px solid var(--court);
  border-bottom: 2px solid var(--court);
  transform: rotate(-45deg);
}

/* ---------- rank ladder ---------- */
.ladder { display: grid; gap: var(--sp-md); counter-reset: rung; }

.rung {
  position: relative;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--sp-lg);
  align-items: center;
  padding: var(--sp-lg);
  border-radius: var(--r-lg);
  border: 1px solid var(--border);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  transition: transform 0.3s var(--ease), border-color 0.3s var(--ease);
}

.rung:hover { transform: translateX(4px); border-color: var(--border-strong); }

.rung__glow {
  position: absolute;
  inset: 0;
  opacity: 0.12;
  pointer-events: none;
  transition: opacity 0.35s var(--ease);
}

.rung:hover .rung__glow { opacity: 0.22; }

.rung__badge {
  position: relative;
  display: grid;
  place-items: center;
  width: 54px;
  height: 54px;
  border-radius: var(--r-md);
  font-size: 1.2rem;
  font-weight: 800;
  color: var(--on-court);
  flex: none;
}

.rung__name { font-size: 1.02rem; font-weight: 800; letter-spacing: -0.025em; }
.rung__tag { font-size: 0.82rem; color: var(--muted); margin-top: 1px; }

.rung__reqs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 10px;
}

.rung__reqs span {
  padding: 3px 9px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--surface-alt);
  font-size: 0.688rem;
  font-weight: 700;
  color: var(--muted);
  white-space: nowrap;
}

/* ---------- points ladder ---------- */
.points { display: grid; gap: var(--sp-md); }

.point-row {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  gap: var(--sp-lg);
  align-items: center;
  padding: var(--sp-lg);
  border-radius: var(--r-lg);
  border: 1px solid var(--border);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  transition: border-color 0.3s var(--ease), background-color 0.3s var(--ease);
}

.point-row:hover { border-color: var(--shuttle-border); background: var(--shuttle-soft); }

.point-row__icon {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--r-sm);
  border: 1px solid rgba(255, 216, 77, 0.28);
  background: var(--shuttle-soft);
  color: var(--shuttle);
  flex: none;
}

.point-row__icon svg { width: 19px; height: 19px; }
.point-row__name { display: block; font-weight: 700; font-size: 0.95rem; letter-spacing: -0.02em; }
.point-row__detail { display: block; font-size: 0.8rem; color: var(--muted); margin-top: 1px; }

.point-row__cost {
  font-size: 1.05rem;
  font-weight: 800;
  letter-spacing: -0.03em;
  color: var(--shuttle);
  white-space: nowrap;
}

.point-row__cost small { display: block; font-size: 0.625rem; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); }

/* the earn table */
.earn {
  display: grid;
  gap: 0;
  border-radius: var(--r-lg);
  border: 1px solid var(--border);
  overflow: hidden;
}

.earn div {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-lg);
  padding: 14px var(--sp-lg);
  background: var(--surface);
  font-size: 0.92rem;
}

.earn div + div { border-top: 1px solid var(--border); }
.earn span:first-child { color: var(--muted); }
.earn b { font-size: 1rem; font-weight: 800; color: var(--shuttle); letter-spacing: -0.02em; white-space: nowrap; }

/* ---------- pricing ---------- */
.plans { display: grid; gap: var(--sp-xl); }

@media (min-width: 860px) { .plans { grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: start; } }

.plan {
  position: relative;
  padding: var(--sp-2xl);
  border-radius: var(--r-2xl);
  border: 1px solid var(--border);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
}

@media (min-width: 768px) { .plan { padding: var(--sp-3xl); } }

.plan--pro {
  border-color: var(--court-border);
  background:
    radial-gradient(120% 90% at 50% -10%, rgba(0, 232, 143, 0.14), transparent 62%),
    var(--surface);
  box-shadow: var(--shadow-lg);
}

.plan__flag {
  position: absolute;
  top: -13px;
  left: var(--sp-2xl);
  padding: 5px 14px;
  border-radius: var(--r-pill);
  background: linear-gradient(135deg, #2BF0A0, #00C97F);
  color: var(--on-court);
  font-size: 0.66rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.plan__name { font-size: 1.05rem; font-weight: 800; letter-spacing: -0.02em; }
.plan__price { display: flex; align-items: baseline; gap: 8px; margin: var(--sp-md) 0 var(--sp-xs); }
.plan__amount { font-size: clamp(2.6rem, 9vw, 3.4rem); font-weight: 800; letter-spacing: -0.05em; line-height: 1; }
.plan__per { font-size: 0.95rem; font-weight: 600; color: var(--muted); }
.plan__sub { font-size: 0.875rem; color: var(--muted); margin-bottom: var(--sp-xl); }

.plan ul { display: grid; gap: 11px; margin-bottom: var(--sp-2xl); }

.plan li {
  position: relative;
  list-style: none;
  padding-left: 28px;
  font-size: 0.925rem;
  line-height: 1.5;
  color: var(--muted);
}

.plan li b { color: var(--text); font-weight: 700; }

.plan li::before {
  content: '';
  position: absolute;
  left: 2px;
  top: 6px;
  width: 7px;
  height: 4px;
  border-left: 2px solid var(--court);
  border-bottom: 2px solid var(--court);
  transform: rotate(-45deg);
}

.plan li.is-off { color: var(--faint); }
.plan li.is-off::before {
  border: 0;
  top: 9px;
  left: 1px;
  width: 10px;
  height: 2px;
  background: var(--faint);
  transform: none;
}

.plan__fine { margin: var(--sp-lg) 0 0; font-size: 0.75rem; line-height: 1.5; color: var(--faint); }

/* comparison table */
.compare {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.9rem;
}

.compare th, .compare td { padding: 13px var(--sp-md); text-align: left; border-bottom: 1px solid var(--border); }
.compare th:first-child, .compare td:first-child { padding-left: 0; }
.compare thead th { font-size: 0.7rem; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); }
.compare tbody th { font-weight: 600; color: var(--muted); }
.compare td { text-align: center; width: 88px; }
.compare tbody th { width: auto; }
.compare .yes { color: var(--court); font-weight: 800; }
.compare .no { color: var(--faint); }

.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* ---------- faq ---------- */
.faq { display: grid; gap: 0; border-top: 1px solid var(--border); }

.faq details {
  border-bottom: 1px solid var(--border);
}

.faq summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-lg);
  padding: var(--sp-xl) 0;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  cursor: pointer;
  list-style: none;
  transition: color 0.2s var(--ease);
}

.faq summary::-webkit-details-marker { display: none; }
.faq summary:hover { color: var(--court); }

.faq summary::after {
  content: '';
  flex: none;
  width: 11px;
  height: 11px;
  margin-right: 4px;
  border-right: 2px solid var(--court);
  border-bottom: 2px solid var(--court);
  transform: rotate(45deg) translateY(-3px);
  transition: transform 0.3s var(--ease);
}

.faq details[open] summary::after { transform: rotate(-135deg) translateY(-3px); }

.faq__body { padding-bottom: var(--sp-xl); color: var(--muted); font-size: 0.94rem; line-height: 1.68; max-width: 68ch; }
.faq__body p { margin: 0 0 var(--sp-md); }
.faq__body p:last-child { margin-bottom: 0; }

/* ---------- final cta ---------- */
.cta {
  position: relative;
  overflow: hidden;
  border-radius: var(--r-2xl);
  border: 1px solid var(--court-border);
  padding: var(--sp-4xl) var(--sp-2xl);
  text-align: center;
  background:
    radial-gradient(100% 120% at 50% 0%, rgba(0, 232, 143, 0.22), transparent 62%),
    linear-gradient(180deg, #FFFFFF, var(--surface-alt));
  box-shadow: var(--shadow-md);
}

@media (min-width: 768px) { .cta { padding: 88px var(--sp-4xl); } }

.cta .stores { justify-content: center; margin-top: var(--sp-2xl); }
.cta .lead { margin-inline: auto; max-width: 52ch; }

/* ---------- footer ---------- */
.footer {
  border-top: 1px solid var(--border);
  padding-block: var(--sp-4xl) var(--sp-3xl);
  background: var(--surface-alt);
}

.footer__grid { display: grid; gap: var(--sp-3xl); }

@media (min-width: 720px) {
  .footer__grid { grid-template-columns: 1.6fr repeat(3, 1fr); gap: var(--sp-2xl); }
}

.footer__about { max-width: 34ch; }
.footer__about p { margin: var(--sp-md) 0 0; font-size: 0.875rem; color: var(--faint); line-height: 1.6; }

.footer h4 { font-size: 0.7rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--faint); margin-bottom: var(--sp-md); }
.footer li { list-style: none; margin-bottom: 9px; }
.footer li a { font-size: 0.9rem; color: var(--muted); transition: color 0.2s var(--ease); }
.footer li a:hover { color: var(--court); }

.footer__bar {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-md) var(--sp-xl);
  align-items: center;
  justify-content: space-between;
  margin-top: var(--sp-3xl);
  padding-top: var(--sp-xl);
  border-top: 1px solid var(--border);
  font-size: 0.8rem;
  color: var(--faint);
}

/* ---------- legal pages ---------- */
.legal-hero {
  padding-top: calc(var(--header-h) + 48px);
  padding-bottom: var(--sp-3xl);
  border-bottom: 1px solid var(--border);
  background: radial-gradient(90% 120% at 20% 0%, rgba(0, 232, 143, 0.1), transparent 60%);
}

.legal-hero .h1 { margin: var(--sp-md) 0 var(--sp-md); }
.legal-hero p { margin: 0; color: var(--muted); font-size: 0.95rem; }

.legal { display: grid; gap: var(--sp-4xl); padding-block: var(--sp-4xl); }

@media (min-width: 960px) {
  .legal { grid-template-columns: 240px minmax(0, 1fr); gap: var(--sp-5xl); align-items: start; }
}

.toc { display: none; }

@media (min-width: 960px) {
  .toc {
    display: block;
    position: sticky;
    top: calc(var(--header-h) + 24px);
    padding: var(--sp-xl);
    border-radius: var(--r-lg);
    border: 1px solid var(--border);
    background: var(--surface);
    box-shadow: var(--shadow-sm);
  }
  .toc h4 { font-size: 0.7rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--faint); margin-bottom: var(--sp-md); }
  .toc li { list-style: none; margin-bottom: 7px; }
  .toc a { font-size: 0.85rem; color: var(--muted); line-height: 1.45; display: block; transition: color 0.2s var(--ease); }
  .toc a:hover, .toc a.is-active { color: var(--court); }
}

.prose { max-width: 74ch; }
.prose h2 {
  margin: var(--sp-4xl) 0 var(--sp-md);
  font-size: 1.35rem;
  font-weight: 800;
  letter-spacing: -0.03em;
  scroll-margin-top: calc(var(--header-h) + 24px);
}
.prose h2:first-child { margin-top: 0; }
.prose h3 { margin: var(--sp-2xl) 0 var(--sp-sm); font-size: 1.02rem; font-weight: 700; }
.prose p { margin: 0 0 var(--sp-lg); color: var(--muted); line-height: 1.72; font-size: 0.95rem; }
.prose ul, .prose ol { margin: 0 0 var(--sp-lg); padding-left: var(--sp-xl); }
.prose li { margin-bottom: 9px; color: var(--muted); line-height: 1.65; font-size: 0.95rem; }
.prose strong { color: var(--text); font-weight: 700; }
.prose a { color: var(--court); text-decoration: underline; text-underline-offset: 3px; }
.prose table { width: 100%; border-collapse: collapse; margin-bottom: var(--sp-lg); font-size: 0.9rem; }
.prose th, .prose td { padding: 11px var(--sp-md); text-align: left; border-bottom: 1px solid var(--border); vertical-align: top; }
.prose th { font-size: 0.7rem; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); }
.prose td { color: var(--muted); }

.callout {
  padding: var(--sp-xl);
  border-radius: var(--r-lg);
  border: 1px solid var(--court-border);
  background: var(--court-soft);
  margin-bottom: var(--sp-xl);
}

.callout p { margin: 0; color: var(--text); font-size: 0.925rem; line-height: 1.65; }
.callout--haven { border-color: rgba(180, 124, 245, 0.38); background: var(--haven-soft); }

/* ---------- scroll reveal ---------- */
[data-reveal] {
  opacity: 0;
  transform: translateY(26px);
  transition: opacity 0.7s var(--ease), transform 0.7s var(--ease);
  transition-delay: var(--delay, 0ms);
  will-change: opacity, transform;
}

[data-reveal='left'] { transform: translateX(-30px); }
[data-reveal='right'] { transform: translateX(30px); }

@media (max-width: 899px) {
  [data-reveal='left'],
  [data-reveal='right'] { transform: translateY(26px); }
}
[data-reveal='scale'] { transform: scale(0.94); }
[data-reveal='blur'] { filter: blur(10px); transform: translateY(20px); }

.is-revealed[data-reveal] { opacity: 1; transform: none; filter: none; }

/* progress bar under the header */
.scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 95;
  height: 2px;
  width: 100%;
  transform-origin: 0 50%;
  transform: scaleX(0);
  background: linear-gradient(90deg, var(--court-bright), var(--shuttle-bright));
  pointer-events: none;
}

/* ---------- reduce motion ----------
   Same rule the app follows: motion that carries no information stops
   entirely; motion that IS the affordance becomes a fade. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }

  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }

  .shuttle-fall, .hero__glow { display: none; }
  .marquee__track, .marquee__lane { animation: none; transform: none; }

  [data-reveal] { opacity: 1; transform: none; filter: none; }
  .scroll-progress { display: none; }
}

/* ---------- skip link ---------- */
.skip {
  position: absolute;
  left: 0;
  top: 0;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  z-index: 200;
  padding: 12px 20px;
  border-radius: 0 0 var(--r-md) 0;
  background: var(--court-bright);
  color: var(--on-court);
  font-weight: 700;
}

.skip:focus { clip: auto; clip-path: none; }

/* ---------- "in review" toast ----------
   The store buttons cannot go anywhere yet. Saying so beats a 404 for
   somebody who tapped in good faith. */
.pending-note {
  position: fixed;
  left: 50%;
  bottom: 24px;
  z-index: 120;
  transform: translate(-50%, 20px);
  opacity: 0;
  visibility: hidden;
  max-width: calc(100vw - 32px);
  padding: 14px 22px;
  border-radius: var(--r-pill);
  border: 1px solid var(--court-border);
  background: rgba(255, 255, 255, 0.97);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  box-shadow: var(--shadow-lg);
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--text);
  text-align: center;
  transition: opacity 0.3s var(--ease), transform 0.35s var(--ease), visibility 0.35s;
}

.pending-note.is-shown { opacity: 1; visibility: visible; transform: translate(-50%, 0); }
.pending-note b { color: var(--court); }

/* ---------- the screens carousel ----------
   A slide is a phone and the words that belong to it, in one block, so
   the two can never end up describing different things — which is what
   went wrong every time they were separate columns held together by a
   scroll observer.

   Narrow: a native scroll-snap track of cards. The swipe is the
   browser's, so the physics are right everywhere.
   Wide: the whole list of words sits on the left, readable at once, and
   the phones stack on the right with tabs underneath. `display: contents`
   is what lets one set of markup be both — the slide stops generating a
   box and its two halves become items of the section's own grid.
*/
.sc { position: relative; }

.sc__track {
  display: flex;
  gap: var(--sp-lg);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  margin-inline: calc(var(--sp-xl) * -1);
  padding: 4px var(--sp-xl) var(--sp-sm);
}

.sc__track::-webkit-scrollbar { display: none; }

.sc__slide {
  flex: 0 0 min(84vw, 420px);
  scroll-snap-align: center;
  display: grid;
  gap: var(--sp-lg);
  padding: var(--sp-xl);
  border-radius: var(--r-xl);
  border: 1px solid var(--border);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
}

.sc__media { display: flex; justify-content: center; }

.sc__copy { display: flex; gap: var(--sp-md); align-items: flex-start; }

.sc__n {
  display: none;
  place-items: center;
  flex: none;
  width: 28px;
  height: 28px;
  border-radius: var(--r-sm);
  background: var(--court-soft);
  border: 1px solid var(--court-border);
  color: var(--court);
  font-size: 0.8rem;
  font-weight: 800;
}

.step__num {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 0.688rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--court);
  margin-bottom: 6px;
}

.sc__copy h3 {
  margin-bottom: var(--sp-sm);
  font-size: clamp(1.15rem, 4.2vw, 1.4rem);
  line-height: 1.2;
}

.sc__copy p { margin: 0; color: var(--muted); font-size: 0.95rem; line-height: 1.6; }

/* ---- controls ---- */
.sc__controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-lg);
  margin-top: var(--sp-xl);
}

.sc__tabs { display: flex; align-items: center; gap: var(--sp-sm); }

.sc__tab {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-width: 30px;
  min-height: 30px;
  border-radius: var(--r-pill);
  color: var(--faint);
  transition: color 0.25s var(--ease), background-color 0.25s var(--ease),
    border-color 0.25s var(--ease);
}

/* Narrow: dots. Five words do not fit across a phone, and the card
   itself already says what it is showing. */
.sc__tab-label { display: none; }

.sc__tab-dot {
  display: block;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--border-strong);
  transition: background-color 0.25s var(--ease), transform 0.25s var(--ease);
}

.sc__tab.is-on .sc__tab-dot { background: var(--court); transform: scale(1.35); }

.sc__hint {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  margin: 0;
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--faint);
  transition: opacity 0.4s var(--ease);
}

.sc__hint svg { width: 15px; height: 15px; flex: none; animation: nudge 1.8s var(--ease-in-out) infinite; }
.sc__hint.is-done { opacity: 0; pointer-events: none; }

@keyframes nudge {
  0%, 100% { transform: translateX(0); }
  50% { transform: translateX(5px); }
}

/* ---------- wide: list left, phone right ---------- */
@media (min-width: 900px) {
  .sc {
    display: grid;
    grid-template-columns: minmax(0, 1.04fr) minmax(0, 0.96fr);
    column-gap: var(--sp-5xl);
    align-items: start;
  }

  /* Both stop generating boxes, so the ten halves below become items of
     the grid above and can be placed in two columns. */
  .sc__track,
  .sc__slide { display: contents; }

  /* Every set of words is on screen at once and the chosen one is lit.
     A reader can take in the whole list without waiting for a carousel
     to come round to it. */
  .sc__copy {
    grid-column: 1;
    align-items: flex-start;
    padding: var(--sp-lg) var(--sp-lg) var(--sp-lg) var(--sp-xl);
    border-left: 2px solid var(--border);
    border-radius: 0 var(--r-md) var(--r-md) 0;
    cursor: pointer;
    opacity: 0.55;
    transition: opacity 0.35s var(--ease), border-color 0.35s var(--ease),
      background-color 0.35s var(--ease);
  }

  .sc__copy:hover { opacity: 0.85; }

  .sc__slide.is-on .sc__copy {
    opacity: 1;
    border-left-color: var(--court);
    background: linear-gradient(90deg, var(--court-soft), transparent 70%);
  }

  .sc__copy h3 { font-size: 1.22rem; margin-bottom: 6px; }
  .sc__copy p { font-size: 0.95rem; }

  /* All five phones occupy the same area beside the list, so only the
     chosen one is ever visible. Spanning every row is what makes the two
     columns the same height. */
  .sc__media {
    grid-column: 2;
    grid-row: 1 / span 4;
    align-self: center;
    justify-self: center;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.45s var(--ease), visibility 0.45s;
  }

  .sc__slide.is-on .sc__media { opacity: 1; visibility: visible; }

  .sc__media .phone { --pw: 258px; }

  /* Under the phone, as in the reference. */
  .sc__controls {
    grid-column: 2;
    grid-row: 5;
    justify-self: center;
    margin-top: var(--sp-2xl);
  }

  .sc__tabs { flex-wrap: wrap; justify-content: center; gap: 2px; }

  .sc__tab {
    min-width: 0;
    min-height: 36px;
    padding: 0 var(--sp-md);
    border: 1px solid transparent;
    font-size: 0.82rem;
    font-weight: 700;
    letter-spacing: -0.015em;
    white-space: nowrap;
  }

  .sc__tab-label { display: block; }
  .sc__tab-dot { display: none; }
  .sc__tab:hover { color: var(--text); background: var(--surface); }

  .sc__tab.is-on {
    color: var(--court);
    background: var(--court-soft);
    border-color: var(--court-border);
  }

  /* Swiping is not a thing you do with a mouse. */
  .sc__hint { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .sc__hint svg { animation: none; }
  .sc__media, .sc__copy { transition-duration: 0.001ms; }
}

/* ---------- women's section band ---------- */
.haven-band {
  position: relative;
  overflow: hidden;
  border-radius: var(--r-2xl);
  border: 1px solid rgba(180, 124, 245, 0.34);
  padding: var(--sp-3xl) var(--sp-2xl);
  background:
    radial-gradient(110% 130% at 12% 0%, rgba(180, 124, 245, 0.20), transparent 60%),
    linear-gradient(180deg, #FFFFFF, var(--surface-alt));
  box-shadow: var(--shadow-md);
}

@media (min-width: 768px) { .haven-band { padding: var(--sp-4xl); } }

@media (min-width: 980px) {
  .haven-band { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr); gap: var(--sp-4xl); align-items: center; }
}

/* ---------- pro teaser ---------- */
.pro-band {
  position: relative;
  overflow: hidden;
  border-radius: var(--r-2xl);
  border: 1px solid var(--court-border);
  padding: var(--sp-3xl) var(--sp-2xl);
  background:
    radial-gradient(120% 120% at 100% 0%, rgba(255, 216, 77, 0.28), transparent 58%),
    radial-gradient(110% 120% at 0% 100%, rgba(0, 232, 143, 0.20), transparent 60%),
    var(--surface);
  box-shadow: var(--shadow-md);
}

@media (min-width: 768px) { .pro-band { padding: var(--sp-4xl); } }

/* ---------- misc helpers ---------- */
.stack { display: grid; gap: var(--sp-lg); }
.row { display: flex; flex-wrap: wrap; gap: var(--sp-md); align-items: center; }
.mt-lg { margin-top: var(--sp-xl); }
.mt-xl { margin-top: var(--sp-2xl); }
.mt-2xl { margin-top: var(--sp-3xl); }
.center { text-align: center; }
.muted-sm { font-size: 0.8rem; color: var(--faint); line-height: 1.55; }

.pull-quote {
  margin: 0;
  padding: var(--sp-2xl);
  border-left: 3px solid var(--court);
  background: var(--court-soft);
  border-radius: 0 var(--r-lg) var(--r-lg) 0;
}

.pull-quote p { margin: 0; font-size: 1.08rem; line-height: 1.55; font-weight: 600; letter-spacing: -0.02em; }
.pull-quote footer { margin-top: var(--sp-md); font-size: 0.82rem; color: var(--faint); }

/* Visible to a screen reader, and to nothing else. */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ---------- the organiser's handbook ----------
   A numbered walk-through. The rail down the left is one border on the
   list, not a line per item, so the steps cannot drift out of alignment
   with it. */
.hb { counter-reset: hb; display: grid; gap: 0; }

.hb__step {
  position: relative;
  padding: 0 0 var(--sp-3xl) var(--sp-4xl);
  border-left: 2px solid var(--border);
}

.hb__step:last-child { border-left-color: transparent; padding-bottom: 0; }

.hb__step::before {
  counter-increment: hb;
  content: counter(hb);
  position: absolute;
  left: -19px;
  top: -4px;
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: var(--surface);
  border: 2px solid var(--court-border);
  color: var(--court);
  font-size: 0.9rem;
  font-weight: 800;
  box-shadow: var(--shadow-sm);
}

.hb__step h3 {
  margin-bottom: var(--sp-sm);
  font-size: clamp(1.15rem, 4.2vw, 1.45rem);
  line-height: 1.2;
}

.hb__step p { margin: 0 0 var(--sp-md); color: var(--muted); font-size: 0.97rem; line-height: 1.65; }
.hb__step p:last-child { margin-bottom: 0; }
.hb__step strong { color: var(--text); font-weight: 700; }

.hb__note {
  margin-top: var(--sp-lg);
  padding: var(--sp-lg);
  border-radius: var(--r-md);
  border: 1px solid var(--border);
  background: var(--surface-alt);
  font-size: 0.9rem;
  line-height: 1.6;
  color: var(--muted);
}

.hb__note b { color: var(--text); }

@media (min-width: 768px) {
  .hb__step { padding-left: var(--sp-5xl); }
}

/* option chips — the formats, the age groups, the grades */
.opts { display: flex; flex-wrap: wrap; gap: 6px; margin: var(--sp-md) 0 0; }

.opts span {
  padding: 5px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--surface);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--muted);
  white-space: nowrap;
}

.opts span b { color: var(--court); font-weight: 800; }

/* the run-sheet */
.check { display: grid; gap: 0; border-radius: var(--r-lg); border: 1px solid var(--border); overflow: hidden; }

.check li {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-md);
  padding: 14px var(--sp-lg);
  list-style: none;
  background: var(--surface);
  font-size: 0.94rem;
  line-height: 1.5;
  color: var(--muted);
}

.check li + li { border-top: 1px solid var(--border); }
.check li b { color: var(--text); font-weight: 700; }

.check li::before {
  content: '';
  flex: none;
  width: 18px;
  height: 18px;
  margin-top: 2px;
  border-radius: 5px;
  border: 2px solid var(--border-strong);
}

/* ---------- getting the app ----------
   Badges everywhere; the QR only where somebody is on a computer and the
   phone in their pocket is the one that needs the app. */
.getit { display: flex; flex-direction: column; gap: var(--sp-lg); margin-top: var(--sp-2xl); }
.qr { display: none; }

@media (min-width: 900px) {
  .getit { flex-direction: row; align-items: center; gap: var(--sp-2xl); }
  .getit .stores { flex-direction: column; }
  .getit--center { justify-content: center; }
  .qr {
    display: inline-flex; align-items: center; gap: var(--sp-md);
    padding: 10px 18px 10px 10px; border-radius: var(--r-lg);
    border: 1px solid var(--border); background: var(--surface); box-shadow: var(--shadow-sm);
    font-size: 0.82rem; font-weight: 600; line-height: 1.4; color: var(--muted);
    transition: border-color 0.2s var(--ease), box-shadow 0.25s var(--ease);
  }
  .qr:hover { border-color: var(--court-border); box-shadow: var(--shadow-md); }
  .qr img { width: 84px; height: 84px; border-radius: 8px; }
}

/* ---------- live scoring, two phones ---------- */
.duo { display: flex; align-items: center; justify-content: center; gap: var(--sp-md); }
.duo .phone { --pw: 146px; }
.duo__item { margin: 0; display: grid; justify-items: center; gap: var(--sp-md); }
.duo__item figcaption { font-size: 0.85rem; font-weight: 700; color: var(--muted); }
.duo__link { display: none; }

@media (min-width: 600px) { .duo .phone { --pw: 220px; } .duo { gap: var(--sp-2xl); } }

@media (min-width: 1000px) {
  .duo .phone { --pw: 268px; }
  .duo { gap: var(--sp-3xl); }
  /* the signal between the two phones */
  .duo__link { display: flex; gap: 8px; }
  .duo__link i {
    width: 10px; height: 10px; border-radius: 50%; background: var(--court-bright);
    animation: signal 1.4s var(--ease-in-out) infinite;
  }
  .duo__link i:nth-child(2) { animation-delay: 0.18s; }
  .duo__link i:nth-child(3) { animation-delay: 0.36s; }
}

@keyframes signal { 0%, 100% { opacity: 0.2; transform: scale(0.8); } 50% { opacity: 1; transform: none; } }

/* ---------- the honest "and more" ---------- */
.more {
  margin: var(--sp-2xl) 0 0; text-align: center;
  font-size: 1rem; font-weight: 600; color: var(--muted);
}

/* ---------- where do you stand ---------- */
.rung2 { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--sp-sm); margin: var(--sp-2xl) 0 0; padding: 0; }
.rung2 li {
  list-style: none; display: inline-flex; align-items: center; gap: 8px;
  padding: 6px 14px 6px 6px; border-radius: var(--r-pill);
  background: var(--surface); border: 1px solid var(--border);
  font-size: 0.85rem; font-weight: 700; color: var(--text);
}
.rung2__b {
  display: grid; place-items: center; width: 26px; height: 26px; border-radius: 50%;
  font-size: 0.75rem; font-weight: 800; color: var(--on-court);
}
.rung2--locked .rung2__b { background: linear-gradient(135deg, #FFE066, #FF9F1C); }
/* The top rung is shown and not read: you find out what it takes in the app. */
.rung2__hidden { filter: blur(5px); user-select: none; }

/* ---------- the bar that follows you on a phone ---------- */
.getbar {
  position: fixed; left: 12px; right: 12px; z-index: 80;
  bottom: calc(12px + env(safe-area-inset-bottom));
  display: flex; align-items: center; gap: 12px;
  padding: 10px 10px 10px 14px; border-radius: 18px;
  background: rgba(255, 255, 255, 0.96); border: 1px solid var(--border); box-shadow: var(--shadow-lg);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  transform: translateY(160%); transition: transform 0.35s var(--ease);
}
.getbar.is-shown { transform: none; }
.getbar__mark { width: 30px; height: 30px; flex: none; color: #00E88F; }
.getbar__text { flex: 1; min-width: 0; display: grid; line-height: 1.25; }
.getbar__text b { font-size: 0.95rem; font-weight: 800; letter-spacing: -0.02em; }
.getbar__text span { font-size: 0.75rem; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@media (min-width: 900px) { .getbar { display: none; } }

/* ---------- a footer that does not compete ---------- */
.foot { display: grid; gap: var(--sp-lg); justify-items: start; }
.foot__line { margin: 0; font-size: 0.9rem; color: var(--muted); max-width: 60ch; }
.foot__line a, .foot__links a { color: var(--court); font-weight: 600; }
.foot__links { display: flex; flex-wrap: wrap; gap: var(--sp-sm) var(--sp-xl); font-size: 0.9rem; }
@media (min-width: 900px) { .foot { grid-template-columns: auto 1fr auto; align-items: center; gap: var(--sp-3xl); } }

@media (prefers-reduced-motion: reduce) {
  .duo__link i { animation: none; opacity: 1; }
  .getbar { transition: none; }
}
