/* ============================================================
   Flint landing — light theme, matched to the iOS app's onboarding.

   Palette, orbs, and the cream bloom below are ports of the app's
   light onboarding chrome (Flint/Onboarding/OnboardingLightChrome.swift
   + design/onboarding/flint.css) — not an interpretation. Token map:
     bg #ffffff · surface #f5f6f8 · surface2 #eef0f4 · surface3 #e3e6ec
     line #e6e8ee · text #101014 · text2 #5f5f68 · text3 #93939c
     accent #4f8ef7 · accentDeep #2f6fe0 · accentSoft #e8f0fe
     tints: blue #f2f6fe · pink #fef2f6 · violet #f5f2fe
   ============================================================ */

:root{
  /* Surfaces — the app's light appearances */
  --bg:        #ffffff;
  --surface:   #f5f6f8;
  --surface-2: #eef0f4;
  --surface-3: #e3e6ec;
  --line:      #e6e8ee;

  --border2:   #dcdfe8;

  /* Ink */
  --ink:    #101014;
  --text-2: #5f5f68;
  --text-3: #93939c;
  --text-4: #c3c3cb;
  --body:   #3a3a44;

  /* Accent + onboarding hues */
  --accent:       #4f8ef7;
  --accent-deep:  #2f6fe0;
  --accent-soft:  #e8f0fe;
  --accent-line:  rgba(79,142,247,0.30);
  --mint:   #2fbf8f;
  --violet: #7a5cff;
  --pink:   #f2568c;

  /* Screen tints (per onboarding screen) */
  --tint-blue:   #f2f6fe;
  --tint-pink:   #fef2f6;
  --tint-violet: #f5f2fe;

  --positive: #1fa457;
  --negative: #e5484d;

  /* No webfont is loaded, so every name here must be one the OS already has.
     The old stack named 'SF Pro Text', 'SF Pro Display' and 'Inter' — none of
     which are installed on Windows or Android, and none of which we ship — so
     those visitors fell through to Arial. -apple-system already resolves to SF
     on Apple platforms; system-ui/Segoe UI/Roboto cover the rest natively. */
  --font: -apple-system, BlinkMacSystemFont, system-ui, 'Segoe UI', Roboto,
          'Helvetica Neue', Arial, sans-serif;

  /* Two durations for interface feedback. The demo choreography (card dim, row
     cascade) is timed by hand and deliberately does not use these. */
  --t-quick: .2s;
  --t-ease:  .28s;
  --curve:   cubic-bezier(.2,.7,.3,1);
}

*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  background:var(--bg);color:var(--body);font-family:var(--font);
  font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;
  /* `clip`, not `hidden`: the ambient orbs deliberately bleed past their section
     (each section clips them itself), and nothing here actually overflows the
     viewport. `overflow:hidden` on html/body would make them scroll containers,
     which is what silently breaks `position:sticky` on the inner-page nav. */
  overflow-x:clip;
}
::selection{background:rgba(79,142,247,0.22)}
a{color:var(--accent);text-decoration:none}
a:hover{color:var(--accent-deep)}
img{max-width:100%;display:block}
button,input,select,textarea{font-family:var(--font)}
button{background:none;border:none;color:inherit;cursor:pointer}

.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--accent);outline-offset:2px;border-radius:6px;
}

.wrap{max-width:1120px;margin:0 auto;padding:0 52px}
.icon-stroke{stroke:var(--body);stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round}

/* ============================================================
   AMBIENT ART — exact port of the onboarding blooms
   flint.css `.orb` + the welcome/done cream bloom.
   ============================================================ */
.orb{position:absolute;border-radius:50%;pointer-events:none;z-index:0;filter:blur(2px)}
.orb-blue  {background:radial-gradient(circle at 35% 30%,rgba(79,142,247,.28),rgba(79,142,247,.06) 70%)}
.orb-teal  {background:radial-gradient(circle at 35% 30%,rgba(24,166,160,.26),rgba(24,166,160,.05) 70%)}
.orb-violet{background:radial-gradient(circle at 35% 30%,rgba(122,92,255,.24),rgba(122,92,255,.05) 70%)}
.orb-pink  {background:radial-gradient(circle at 35% 30%,rgba(242,86,140,.22),rgba(242,86,140,.05) 70%)}

/* Soft cream bloom (welcome + done backdrop): four layered radial gradients,
   box inset left/right -20% and bottom -24% at 70% height, blur 64. */
.cream-bloom{position:absolute;left:-20%;right:-20%;bottom:-24%;height:70%;
  pointer-events:none;z-index:0;filter:blur(64px);
  background:
    radial-gradient(58% 70% at 24% 78%,rgba(79,142,247,.2) 0%,transparent 68%),
    radial-gradient(52% 62% at 70% 88%,rgba(130,178,250,.24) 0%,transparent 66%),
    radial-gradient(46% 55% at 46% 100%,rgba(178,207,252,.34) 0%,transparent 70%),
    radial-gradient(70% 60% at 55% 110%,rgba(224,237,254,.7) 0%,transparent 78%)}

/* ---- MOTION ---- */
@keyframes fadeUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes toastIn{from{opacity:0;transform:translateY(12px) scale(.97)}to{opacity:1;transform:none}}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
/* Only runs while the hero line is typing; JS removes the caret once it settles. */
@keyframes blink{0%,45%{opacity:1}50%,100%{opacity:0}}

.reveal{opacity:0;transform:translateY(24px);
  transition:opacity .7s var(--curve),transform .7s var(--curve)}
.reveal.in{opacity:1;transform:none}
.reveal.d1{transition-delay:.08s}
.reveal.d2{transition-delay:.16s}
.reveal.d3{transition-delay:.24s}

/* ---- NAV (scoped to #nav so it never leaks onto other <nav> elements) ---- */
#nav{position:fixed;top:0;left:0;right:0;z-index:200;display:flex;align-items:center;
  justify-content:space-between;padding:0 52px;height:64px;
  background:rgba(255,255,255,0.74);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);
  border-bottom:1px solid transparent;transition:border-color var(--t-ease)}
#nav.scrolled{border-bottom-color:var(--line)}
.nav-brand{display:flex;align-items:center;color:var(--ink)}
.nav-brand:hover{color:var(--ink)}
/* The mark ships as black-on-transparent artwork (brand/flint-mark-black.svg in the
   app repo) — no container, no plate behind it. */
.brand-mark{display:block;flex-shrink:0;height:auto;transition:opacity var(--t-quick)}
.nav-brand:hover .brand-mark{opacity:.7}
.nav-links{display:flex;align-items:center;gap:32px}
.nav-links a{color:var(--text-2);font-size:14px;font-weight:500;transition:color var(--t-quick)}
.nav-links a:hover{color:var(--accent)}
.nav-cta{background:var(--ink);color:#fff;padding:9px 19px;border-radius:100px;
  font-size:13px;font-weight:600;letter-spacing:-.1px;white-space:nowrap;
  transition:opacity var(--t-quick),transform var(--t-quick)}
.nav-cta:hover{color:#fff;opacity:.85;transform:translateY(-1px)}
body.page #nav{position:sticky}

/* ---- BUTTONS (app: primary is the ink pill, accent is Flint blue) ---- */
.btn-primary{display:inline-flex;align-items:center;justify-content:center;
  background:var(--ink);color:#fff;padding:13px 24px;border-radius:100px;
  font-size:14px;font-weight:600;letter-spacing:-.1px;white-space:nowrap;transition:opacity var(--t-quick)}
.btn-primary:hover{color:#fff;opacity:.86}
.btn-primary:disabled{opacity:.5;cursor:default}
.btn-accent{display:inline-flex;align-items:center;justify-content:center;
  background:var(--accent);color:#fff;padding:13px 24px;border-radius:100px;
  font-size:14px;font-weight:600;letter-spacing:-.1px;white-space:nowrap;transition:opacity var(--t-quick)}
.btn-accent:hover{color:#fff;opacity:.9}

/* ---- SECTION HEADS ---- */
/* Tracking is in `em` so it tracks the clamp() size. In px it stayed constant while
   the font shrank, so mobile headings ended up ~2x tighter than SF Pro's own spec
   (Apple: -0.8px at 28pt, -1.05px at 34pt ≈ -0.029/-0.031em) — backwards, since
   tracking should loosen as type gets smaller. Values below match the previous
   desktop rendering exactly and only relax the small end. */
.sec-title{font-size:clamp(30px,3.6vw,46px);font-weight:700;letter-spacing:-.035em;
  line-height:1.06;color:var(--ink);margin-bottom:16px}
.sec-title .dim{color:var(--text-3)}
.sec-sub{font-size:16px;color:var(--text-2);line-height:1.65;letter-spacing:-.1px;max-width:560px}

/* ============================================================
   HERO — tint #f2f6fe + blue orbs (01-intro-why) + cream bloom
   ============================================================ */
.hero{min-height:100vh;display:grid;grid-template-columns:47% 53%;align-items:center;
  padding-top:64px;position:relative;overflow:hidden;background:var(--tint-blue)}
.hero-orb-a{width:520px;height:520px;right:-190px;bottom:120px}
.hero-orb-b{width:300px;height:300px;left:-90px;top:90px}
.hero-orb-c{width:260px;height:260px;right:32%;bottom:-90px}

.hero-text{padding:60px 30px 40px 60px;position:relative;z-index:2}
/* Entrance stagger. Driven by nth-child, so the hero's direct children are
   positional: badge, h1, typed line, sub, .hero-signup, .hero-trust. Reordering
   or inserting one shifts every delay after it. */
.hero-text>*{animation:fadeUp .9s var(--curve) both}
.hero-text>*:nth-child(2){animation-delay:.1s}
.hero-text>*:nth-child(3){animation-delay:.2s}
.hero-text>*:nth-child(4){animation-delay:.3s}
.hero-text>*:nth-child(5){animation-delay:.4s}
.hero-text>*:nth-child(6){animation-delay:.5s}

.hero-badge{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--accent-line);
  background:var(--accent-soft);border-radius:100px;padding:6px 14px;font-size:12px;font-weight:500;
  color:var(--accent-deep);margin-bottom:26px;letter-spacing:.02em}
.hero-badge-dot{width:6px;height:6px;border-radius:50%;background:var(--accent)}
.hero h1{font-size:clamp(42px,5.2vw,68px);font-weight:700;line-height:1.03;letter-spacing:-.035em;
  color:var(--ink);margin-bottom:20px}
.hero h1 .dim{color:var(--text-3)}
.hero-typed{font-size:17px;font-weight:500;color:var(--text-2);margin-bottom:18px;
  letter-spacing:-.2px;min-height:1.6em}
.hero-typed .typed-word{color:var(--accent)}
.hero-typed .cursor{display:inline-block;width:1.5px;height:1em;background:var(--accent);
  vertical-align:-0.15em;margin-left:2px;animation:blink 1s step-end infinite}
.hero-sub{font-size:17px;color:var(--text-2);line-height:1.65;margin-bottom:34px;
  max-width:440px;letter-spacing:-.1px}
.hero-trust{display:flex;align-items:center;gap:10px;margin-top:30px;font-size:13px;color:var(--text-3)}
.hero-trust b{color:var(--text-2);font-weight:500}
.hero-trust-sep{width:3px;height:3px;border-radius:50%;background:var(--text-4);flex-shrink:0}

/* ---- EMAIL / WAITLIST FORM ---- */
.waitlist-form{display:flex;gap:8px;max-width:460px;padding:6px;background:#fff;
  border:1px solid var(--border2);border-radius:100px;
  transition:border-color var(--t-quick),box-shadow var(--t-quick);box-shadow:0 2px 10px rgba(23,32,64,0.05)}
.waitlist-form:focus-within{border-color:rgba(79,142,247,.6);box-shadow:0 0 0 4px rgba(79,142,247,0.12)}
.waitlist-input{flex:1;min-width:0;background:transparent;border:none;outline:none;color:var(--ink);
  font-size:15px;padding:11px 18px;letter-spacing:-.1px}
.waitlist-input::placeholder{color:var(--text-3)}
.waitlist-input:disabled{opacity:.6}
.waitlist-form .btn-primary{border-radius:100px;padding:12px 24px}
.waitlist-note{font-size:12px;color:var(--text-3);margin-top:14px;letter-spacing:-.05px}
.waitlist-note.ok{color:var(--positive);font-weight:600;font-size:13px}
.waitlist-note.error{color:var(--negative);font-weight:600;font-size:13px}
.centered .waitlist-form{margin-left:auto;margin-right:auto}

/* ---- HERO PHONE (real app screenshot in a device frame) ---- */
.hero-visual{display:flex;align-items:center;justify-content:center;
  padding:90px 52px 60px 20px;position:relative;z-index:1;
  animation:fadeUp 1s .25s var(--curve) both}
/* The captures are real device screenshots — status bar and notch included — so the
   frame draws only the bezel; a CSS notch would double up on the one in the image. */
.phone{width:308px;flex:none;border-radius:48px;background:#0c0c0f;padding:10px;position:relative;
  box-shadow:0 44px 90px rgba(23,32,64,0.20),0 0 0 1px rgba(23,32,64,0.06)}
/* height:auto so the width/height attributes drive aspect-ratio instead of
   applying as a presentational height hint (which stretches the capture). */
.phone-shot{width:100%;height:auto;border-radius:39px;display:block;background:var(--surface)}
.phone.sm{width:278px;border-radius:44px;padding:9px}
.phone.sm .phone-shot{border-radius:32px}

/* ============================================================
   MARQUEE
   ============================================================ */
.marquee-section{border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:20px 0;overflow:hidden;position:relative;background:var(--bg)}
.marquee-section::before,.marquee-section::after{content:'';position:absolute;top:0;bottom:0;
  width:120px;z-index:2;pointer-events:none}
.marquee-section::before{left:0;background:linear-gradient(90deg,var(--bg),transparent)}
.marquee-section::after{right:0;background:linear-gradient(-90deg,var(--bg),transparent)}
.marquee-track{display:flex;gap:56px;width:max-content;animation:marquee 48s linear infinite;white-space:nowrap}
.marquee-item{display:flex;align-items:center;gap:56px;font-size:13px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:var(--text-3)}
.marquee-item span::after{content:'';display:inline-block;width:4px;height:4px;border-radius:50%;
  background:var(--accent);opacity:.5;margin-left:52px;vertical-align:middle}

/* ============================================================
   HOW IT WORKS — tint #fef2f6 + pink orbs (02-intro-how)
   ============================================================ */
.how{padding:84px 0;position:relative;overflow:hidden;background:var(--tint-pink)}
.how-orb-a{width:360px;height:360px;right:-140px;top:40px}
.how-orb-b{width:240px;height:240px;left:-100px;bottom:60px}
.how .wrap{position:relative;z-index:1}
.how-head{max-width:620px;margin-bottom:56px}
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
/* These cards are read, not clicked. Lifting them on hover is a false affordance:
   it signals an action that isn't there, and on touch it never fires at all. */
.step{background:#fff;border:1px solid var(--line);border-radius:20px;padding:28px 24px}
.step-num{font-size:12px;font-weight:700;color:var(--accent);letter-spacing:.06em;margin-bottom:22px;
  display:flex;align-items:center;font-variant-numeric:tabular-nums}
.step-icon{width:48px;height:48px;border-radius:50%;background:var(--accent-soft);
  display:flex;align-items:center;justify-content:center;margin-bottom:18px}
.step-icon svg{width:19px;height:19px}
.step-icon .icon-stroke{stroke:var(--accent)}
.step:nth-child(2) .step-icon{background:rgba(122,92,255,.12)}
.step:nth-child(2) .step-icon .icon-stroke{stroke:var(--violet)}
.step:nth-child(2) .step-num{color:var(--violet)}
.step:nth-child(3) .step-icon{background:rgba(47,191,143,.14)}
.step:nth-child(3) .step-icon .icon-stroke{stroke:var(--mint)}
.step:nth-child(3) .step-num{color:var(--mint)}
.step h3{font-size:17px;font-weight:600;color:var(--ink);margin-bottom:8px;letter-spacing:-.35px}
.step p{font-size:13.5px;color:var(--text-2);line-height:1.62;letter-spacing:-.05px}

/* ============================================================
   FEATURE ROWS
   ============================================================ */
.feat{padding:16px 0 44px}
.feat-row{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center;
  padding:52px 0;border-top:1px solid var(--line)}
.feat-row.rev .feat-copy{order:2}
.feat-copy h2{font-size:clamp(28px,3.2vw,40px);font-weight:700;letter-spacing:-.032em;line-height:1.08;
  color:var(--ink);margin-bottom:16px}
.feat-copy h2 .dim{color:var(--text-3)}
.feat-copy p{font-size:16px;color:var(--text-2);line-height:1.65;margin-bottom:26px;letter-spacing:-.1px}
.feat-list{display:flex;flex-direction:column;gap:13px}
.feat-li{display:flex;align-items:flex-start;gap:12px;font-size:14px;color:var(--body);letter-spacing:-.05px}
.feat-li-check{width:20px;height:20px;border-radius:50%;background:var(--accent-soft);
  display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}
.feat-li-check svg{width:9px;height:9px}
.feat-li-check .icon-stroke{stroke:var(--accent);stroke-width:2.4}
.feat-vis{background:var(--tint-blue);border:1px solid var(--line);border-radius:24px;padding:32px;
  position:relative;overflow:hidden}
.feat-vis .orb{width:300px;height:300px;top:-110px;right:-90px}
.feat-vis.plain{display:flex;justify-content:center;padding:40px 32px}

/* ---- group card ----
   Ported from the app: VirtualCardView.swift on the "Sky" finish in CardFinish.swift.
   Sky = a 155deg gradient plus two hard-edged translucent ellipse "blobs" whose
   normalized rects intentionally spill past the card edge. The face carries no
   chip, sheen or glow — the app removed all three in the card redesign. */
.gcard{position:relative;z-index:1;border-radius:18px;aspect-ratio:1.585;
  max-width:360px;margin:0 auto;overflow:hidden;
  box-shadow:0 12px 15px rgba(0,0,0,.45)}
.gcard-finish{position:absolute;inset:0;background:linear-gradient(155deg,#1c3fae 0%,#2f5fe0 100%);
  transition:opacity .5s ease}
.gcard-blob{position:absolute;border-radius:50%;opacity:.55}
.gcard-blob.a{background:#6fa3ff;left:52%;top:-40%;width:78%;height:130%}
.gcard-blob.b{background:#1a2e7a;left:53%;top:40%;width:55%;height:95%}
.gcard-face{position:relative;z-index:1;height:100%;padding:22px;
  display:flex;flex-direction:column;justify-content:space-between}
.gcard-top{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.gcard-brand{font-size:15px;font-weight:600;letter-spacing:-.3px;color:#fff}
.gcard-num{font-size:17px;font-weight:600;letter-spacing:2px;color:#fff;
  font-variant-numeric:tabular-nums}
.gcard-bottom{display:flex;justify-content:space-between;align-items:flex-end}
.gcard-exp{text-align:right}
.gcard-label{font-size:10px;font-weight:600;letter-spacing:.5px;
  color:rgba(255,255,255,0.62);margin-bottom:2px}
.gcard-val{font-size:13px;font-weight:600;color:#fff}

/* The app's whole frozen treatment: the card drops to 55% and this capsule shows.
   Nothing else — no frost, flakes or sheen, none of which exist in the product.

   One adaptation: the app dims the entire card, which works against its dark UI
   because #7aa2f7 still reads at 55%. On this white page that washes the capsule
   out completely, so the dim is applied to the finish and the face text while the
   capsule — the only thing actually announcing the state — stays full strength. */
.gcard-brand,.gcard-num,.gcard-bottom{transition:opacity .5s ease}
.gcard-frozen-tag{font-size:10px;font-weight:700;letter-spacing:.02em;color:#2f5fe0;
  background:rgba(255,255,255,0.92);border-radius:100px;padding:3px 7px;white-space:nowrap;
  opacity:0;transition:opacity .35s ease .12s}
.gcard.frozen .gcard-finish,
.gcard.frozen .gcard-brand,
.gcard.frozen .gcard-num,
.gcard.frozen .gcard-bottom{opacity:.55}
.gcard.frozen .gcard-frozen-tag{opacity:1}

/* Freeze row, from SetCardControlsSheet.swift: title over a live state line. */
.gcard-freeze{margin:16px auto 0;display:flex;align-items:center;justify-content:space-between;
  gap:14px;background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px;
  position:relative;z-index:1;max-width:360px}
.gcard-freeze-t{font-size:13px;font-weight:600;color:var(--ink);letter-spacing:-.1px}
.gcard-freeze-s{font-size:12px;color:var(--text-2);margin-top:2px}
/* Presentational — the demo flips it on scroll, so it must not invite a click. */
.sw{display:block;width:34px;height:20px;border-radius:100px;background:var(--surface-3);
  border:1px solid var(--border2);position:relative;
  transition:background var(--t-quick),border-color var(--t-quick);flex-shrink:0}
.sw::after{content:'';position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
  background:#fff;box-shadow:0 1px 2px rgba(23,32,64,0.2);transition:left .2s}
.sw.on{background:var(--accent);border-color:var(--accent)}
.sw.on::after{left:16px}

/* ---- receipt + split demo ---- */
.receipt{background:#fff;border:1px solid var(--line);border-radius:20px;padding:20px;
  position:relative;z-index:1;margin-bottom:14px;box-shadow:0 14px 34px rgba(23,32,64,.08)}
.receipt-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px}
.receipt-merch{font-size:15px;font-weight:600;color:var(--ink);letter-spacing:-.2px}
.receipt-tag{font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:var(--mint);border:1px solid rgba(47,191,143,.32);background:rgba(47,191,143,.12);
  border-radius:100px;padding:3px 9px}
.receipt-line{display:flex;justify-content:space-between;font-size:13px;color:var(--text-2);
  padding:5px 0;font-variant-numeric:tabular-nums}
.receipt-total{display:flex;justify-content:space-between;font-size:15px;font-weight:600;color:var(--ink);
  border-top:1px dashed var(--border2);margin-top:8px;padding-top:11px;font-variant-numeric:tabular-nums}
/* Presentational caption for the demo; .done is its settled state.
   Styled as a soft status chip, not a solid CTA: as a full-width accent button it
   was the loudest element on the page — louder than the real "Join the closed
   beta" — while being unclickable. Tinted fill keeps it legible as app chrome. */
.split-btn{width:100%;background:var(--accent-soft);color:var(--accent-deep);
  border:1px solid var(--accent-line);border-radius:14px;padding:12px;
  font-size:13px;font-weight:600;position:relative;z-index:1;text-align:center;
  letter-spacing:-.05px;transition:background var(--t-ease),color var(--t-ease)}
.split-btn.done{background:rgba(47,191,143,.12);border-color:rgba(47,191,143,.32);color:#12805e}
.split-result{position:relative;z-index:1;margin-top:14px}
.split-row{display:flex;align-items:center;justify-content:space-between;background:#fff;
  border:1px solid var(--line);border-radius:14px;padding:11px 14px;margin-bottom:8px;
  opacity:0;transform:translateY(10px);animation:toastIn .45s forwards}
.split-row-l{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--ink);font-weight:500}
.split-row-amt{font-size:14px;font-weight:600;color:var(--accent);font-variant-numeric:tabular-nums}
.ledger-av{width:26px;height:26px;border-radius:50%;background:var(--surface-2);
  display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;
  color:var(--text-2);flex-shrink:0}

/* ============================================================
   FEES
   ============================================================ */
.fees{padding:84px 0 84px;position:relative;overflow:hidden}
.fees-orb{width:300px;height:300px;left:-130px;bottom:20px}
.fees .wrap{position:relative;z-index:1}
.fees-head{max-width:620px;margin-bottom:44px}
.fees-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.fee{background:var(--surface);border:1px solid var(--line);border-radius:20px;padding:32px 30px}
.fee-tag{font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent);margin-bottom:14px}
.fee:nth-child(2) .fee-tag{color:var(--pink)}
.fee-price{font-size:32px;font-weight:700;letter-spacing:-1.2px;color:var(--ink);margin-bottom:12px}
.fee p{font-size:13.5px;color:var(--text-2);line-height:1.62}

/* ============================================================
   SECURITY — tint #f5f2fe + violet orbs (03-intro-privacy)
   ============================================================ */
.security{padding:84px 0 84px;position:relative;overflow:hidden;background:var(--tint-violet)}
.sec-orb-a{width:380px;height:380px;right:-140px;top:60px}
.sec-orb-b{width:260px;height:260px;left:-110px;bottom:120px}
.security .wrap{position:relative;z-index:1}
.sec-head{max-width:620px;margin-bottom:44px}
.sec-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.sec-card{background:#fff;border:1px solid var(--line);border-radius:20px;padding:30px 28px}
.sec-icon{width:48px;height:48px;border-radius:50%;background:var(--accent-soft);
  display:flex;align-items:center;justify-content:center;margin-bottom:18px}
.sec-icon svg{width:19px;height:19px}
.sec-icon .icon-stroke{stroke:var(--accent)}
/* Exactly three cards — a 3n+ cycle implied a repeating list that never repeats. */
.sec-card:nth-child(2) .sec-icon{background:rgba(122,92,255,.12)}
.sec-card:nth-child(2) .sec-icon .icon-stroke{stroke:var(--violet)}
.sec-card:nth-child(3) .sec-icon{background:rgba(47,191,143,.14)}
.sec-card:nth-child(3) .sec-icon .icon-stroke{stroke:var(--mint)}
.sec-card h3{font-size:16px;font-weight:600;color:var(--ink);letter-spacing:-.3px;margin-bottom:8px}
.sec-card p{font-size:13.5px;color:var(--text-2);line-height:1.62}
.sec-note{margin-top:16px;display:flex;gap:16px;align-items:flex-start;background:#fff;
  border:1px solid var(--line);border-radius:20px;padding:26px 28px;font-size:13.5px;
  color:var(--text-2);line-height:1.65}
.sec-note-icon{width:38px;height:38px;border-radius:12px;background:var(--accent-soft);
  display:flex;align-items:center;justify-content:center;flex-shrink:0}
.sec-note-icon svg{width:17px;height:17px}
.sec-note-icon .icon-stroke{stroke:var(--accent)}
.sec-note b{color:var(--ink);font-weight:600}

/* ============================================================
   WAITLIST / FINAL CTA — tint #f2f6fe + the welcome cream bloom
   ============================================================ */
.waitlist{padding:100px 0;position:relative;overflow:hidden;border-top:1px solid var(--line);
  background:var(--tint-blue)}
.waitlist-orb-a{width:280px;height:280px;left:6%;top:14%}
.waitlist-orb-b{width:230px;height:230px;right:7%;bottom:16%}
.waitlist-inner{max-width:700px;margin:0 auto;text-align:center;position:relative;z-index:1;padding:0 22px}
.waitlist h2{font-size:clamp(34px,4.6vw,58px);font-weight:700;letter-spacing:-.038em;line-height:1.04;
  color:var(--ink);margin-bottom:16px}
.waitlist h2 .dim{color:var(--text-3)}
.waitlist-sub{font-size:17px;color:var(--text-2);line-height:1.6;margin-bottom:38px;letter-spacing:-.1px}
.store-badges{display:flex;gap:12px;justify-content:center;margin-top:40px}
/* Status badges, not store links — no hover, since there is nowhere to go yet. */
.store-badge{display:flex;align-items:center;gap:10px;background:rgba(255,255,255,0.7);
  border:1px solid var(--line);border-radius:14px;padding:10px 18px;text-align:left}
.store-badge svg{width:20px;height:20px;color:var(--ink)}
.store-badge-sub{font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--text-3)}
.store-badge-name{font-size:13.5px;font-weight:600;color:var(--ink);letter-spacing:-.2px}

/* ============================================================
   FOOTER
   ============================================================ */
footer{padding:48px 0 36px;border-top:1px solid var(--line)}
.footer-inner{max-width:1120px;margin:0 auto;padding:0 52px;display:flex;align-items:center;
  justify-content:space-between;flex-wrap:wrap;gap:24px}
.footer-brand{display:flex;align-items:center}
.footer-links{display:flex;gap:28px;flex-wrap:wrap;align-items:center}
.footer-links a{font-size:13px;color:var(--text-2);transition:color var(--t-quick)}
.footer-links a:hover{color:var(--accent)}
.footer-bottom{max-width:1120px;margin:36px auto 0;padding:24px 52px 0;border-top:1px solid var(--line);
  display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:12px}
.footer-copy{font-size:12px;color:var(--text-3)}
.footer-disclaimer{font-size:11px;color:var(--text-4);max-width:560px;line-height:1.55}
/* The inner pages set their content in a 760px column (.legal-wrap), not the home
   page's 1120px grid, so their footer follows that column. On the wide grid the
   brand mark lands ~200px left of the text directly above it. */
.footer-narrow .footer-inner{max-width:760px;padding:0 24px}
.footer-narrow .footer-bottom{max-width:760px;padding:24px 24px 0}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media(max-width:920px){
  #nav{padding:0 22px;height:58px}
  .nav-links{display:none}
  .wrap{padding:0 22px}
  .hero{grid-template-columns:1fr;padding-top:58px;min-height:auto}
  .hero-text{padding:56px 22px 8px}
  .hero-visual{padding:36px 22px 56px}
  .how{padding:76px 0}
  .steps{grid-template-columns:1fr 1fr}
  .feat-row{grid-template-columns:1fr;gap:36px;padding:48px 0}
  .feat-row.rev .feat-copy{order:0}
  .fees-grid{grid-template-columns:1fr}
  .sec-grid{grid-template-columns:1fr}
  .waitlist{padding:84px 0}
  .waitlist-form{flex-direction:column;border-radius:20px;padding:8px}
  .waitlist-form .btn-primary{width:100%}
  .store-badges{flex-direction:column;align-items:center}
  .footer-inner,.footer-bottom{flex-direction:column;align-items:flex-start;padding-left:22px;padding-right:22px}
}
@media(max-width:560px){
  .steps{grid-template-columns:1fr}
}

@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;
    transition-duration:.01ms !important}
  .reveal{opacity:1;transform:none}
  html{scroll-behavior:auto}
}

/* ============================================================
   INNER PAGES — shared shell (support, 404, pay, join, help)
   ============================================================ */
.section{padding:110px 52px;max-width:1120px;margin:0 auto}

/* ============================================================
   LEGAL PAGES (privacy / terms) — readable long-form
   ============================================================ */
.legal-wrap{max-width:760px;margin:0 auto;padding:100px 24px 100px}
.legal-head{padding-bottom:28px;margin-bottom:36px;border-bottom:1px solid var(--line)}
.legal-head h1{font-size:clamp(30px,4vw,42px);font-weight:700;letter-spacing:-.033em;line-height:1.06;
  margin-bottom:12px;color:var(--ink)}
.legal-meta{font-size:13px;color:var(--text-3)}
.legal-intro{font-size:16px;color:var(--text-2);line-height:1.7;margin-bottom:8px}
.legal-toc{margin:28px 0 44px;padding:20px 22px;background:var(--surface);border:1px solid var(--line);border-radius:20px}
.legal-toc h2{font-size:12px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:var(--text-3);margin-bottom:12px}
.legal-toc ol{list-style:none;counter-reset:toc;display:grid;grid-template-columns:1fr 1fr;gap:8px 24px}
.legal-toc li{counter-increment:toc;font-size:14px}
.legal-toc li::before{content:counter(toc) ". ";color:var(--text-3);font-variant-numeric:tabular-nums}
.legal-toc a{color:var(--text-2)}
.legal-toc a:hover{color:var(--accent)}
.legal-section{padding-top:16px;margin-top:32px}
.legal-section h2{font-size:21px;font-weight:600;letter-spacing:-.4px;margin-bottom:14px;
  color:var(--ink);scroll-margin-top:80px}
.legal-section h3{font-size:16px;font-weight:600;margin:22px 0 8px;color:var(--ink);letter-spacing:-.2px}
.legal-section p{font-size:15px;color:var(--text-2);line-height:1.72;margin-bottom:14px}
.legal-section ul{margin:0 0 16px;padding-left:0;list-style:none}
.legal-section li{font-size:15px;color:var(--text-2);line-height:1.65;margin-bottom:10px;
  padding-left:20px;position:relative}
.legal-section li::before{content:'';position:absolute;left:4px;top:10px;width:5px;height:5px;
  border-radius:50%;background:var(--text-4)}
.legal-section li b{color:var(--ink);font-weight:600}
.legal-section a{color:var(--accent)}
.legal-callout{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);
  border-radius:14px;padding:16px 18px;margin:18px 0}
.legal-callout p{margin:0;font-size:14.5px;color:var(--text-2)}
@media(max-width:640px){.legal-toc ol{grid-template-columns:1fr}}
@media(max-width:920px){.section{padding:80px 22px}.legal-wrap{padding-top:88px}}
