/* =============================================================================
   HappyStack — "Valley" landing page · developer handoff (2026-09-22)
   One stylesheet, no preprocessor, no build step.

   ARCHITECTURE
   Token-driven throughout: the palette lives as custom properties on :root.
   Each sticky pillar card sets --sa / --sa-glow INLINE in the HTML and every
   accent inside it (top edge, eyebrow dot, glow) inherits from those two
   values — a fourth card is two variables, not new CSS. Cards share one glass
   recipe (translucent gradient + backdrop blur + 1px light border + inset top
   highlight); glass only reads with a colour source behind it.

   THE HERO IS A COMPOSITION, NOT A BACKGROUND. The product window sits between
   SVG ridge layers; the foreground ridge (z-index:3) must overlap the window's
   lower corners — that overlap is what makes it an object in the scene. Cursor
   parallax moves the DASHBOARD ONLY (data-depth on the figure); sky, stars and
   ridges never follow the cursor. Do not re-distribute data-depth.

   TYPE   Greed 700 UPPERCASE display / Greed 600 two-tone H2 (.dim tail) /
          Saans body / system mono 11px +12% tracking labels.
   LAYOUT .container 1160px + clamp(20px,4vw,48px); one breakpoint at 920px.
   MOTION all gated behind prefers-reduced-motion. .rv reveals need the
          .motion-ready class on <html> (progressive: no JS = everything
          visible). Sticky stack engages only under .stack-ready, which
          script.js sets when the tallest card fits the viewport.

   ORANGE DASHED TEXT (.slot) = UNFILLED COPY SLOT, deliberate. The copy
   source of truth is Notion "Website Copy v2"; slots are filled there first.

   ⚠ FONTS ARE TRIAL CUTS — see README ship-blocker #1 before production.
   ============================================================================= */

/* ============ FONTS (TRIAL cuts — mockup only) ============ */
@font-face{font-family:'Greed';font-weight:700;font-style:normal;src:url("fonts/greed-Bold.woff2") format('woff2');font-display:block}
@font-face{font-family:'Greed';font-weight:600;font-style:normal;src:url("fonts/greed-SemiBold.woff2") format('woff2');font-display:block}
@font-face{font-family:'Greed';font-weight:500;font-style:normal;src:url("fonts/greed-Medium.woff2") format('woff2');font-display:block}
@font-face{font-family:'Saans';font-weight:100 900;font-style:normal;src:url("fonts/saans-VF.woff2") format('woff2');font-display:block}

/* ---- gradient wordmark fill (used in the hero headline's "only had to close") ---- */
@keyframes gradrun{from{background-position:0% 0}to{background-position:100% 0}}
.grad{background:linear-gradient(93deg,#F895C5 0%,#B495F8 36%,#98EDFE 66%,#CEFC97 100%);
  background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;
  animation:gradrun 9s ease-in-out infinite alternate}

/* ============ TOKENS (from website-mvp-handoff SPEC — dark-committed by ruling) ============ */
:root{
  --bg:#0B0E09; --bg-deep:#070906;
  --ink:#F2F2E9; --ink-2:#B7BCAC; --ink-3:#7E8476;
  --accent:#AAF988; --accent-hover:#BDFBA0; --accent-ink:#15200E;
  --p-pink:#F895C5; --p-purple:#B495F8; --p-cyan:#98EDFE; --p-green:#CEFC97;
  --line:rgba(244,243,236,.12); --line-soft:rgba(244,243,236,.07);
  --display:'Greed',ui-sans-serif,system-ui,sans-serif;
  --body:'Saans',ui-sans-serif,system-ui,sans-serif;
  /* 2026-10-23 Dylan: master frame = the hero's 1280px band. Every section
     (credband stat cards, logo marquee, pillars, testimonials, Dawn, FAQ,
     footer) uses this container width so edges align to the hero's left+right. */
  --container:1280px; --pad:clamp(20px,4vw,48px);
  --ease:cubic-bezier(.2,.6,.2,1);
}
*{margin:0;padding:0;box-sizing:border-box}
/* 2026-10-23 Dylan: smooth-scroll was fighting the wheel-glide hijack + sticky
   recede script. Reverted to :auto; the "How it works" anchor click is now
   smooth-scrolled via a targeted JS listener (at the end of this file). */
html{scroll-behavior:auto}
body{background:var(--bg);color:var(--ink);font-family:var(--body);font-weight:400;
  font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}
::selection{background:rgba(170,249,136,.25)}
img{max-width:100%}
a{color:inherit}

/* grain */
.grain{position:fixed;inset:0;pointer-events:none;z-index:60;opacity:.055;
  background-image: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.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E")}

/* ============ NAV — floating glass pill (CANONICAL — keep these three pages identical) ====
   One component, every page. It is a FIXED-WIDTH GRID, not a shrink-to-fit flex row: that is
   what stops the pill resizing and the wordmark sliding as you click between pages. Before
   28 Sep the lander was grid-620px with the mark centred while company/about were flex, so
   navigating moved the mark ~170px and changed the pill width by ~90px.
   26 Oct Dylan: three-column shape — wordmark LEFT (.nav-left, justify-start), 'How it
   works' CENTRE (direct <a> child in the auto column, naturally centred by the 1fr flanks),
   CTA RIGHT (.nav-right, justify-end). Grid `1fr auto 1fr`. Wordmark hrefs home.
   Verify with `node qa/navcheck.mjs <base-url>` — it fails if the pages disagree. ======== */
nav{position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:50;
  display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:6px;
  width:min(720px,calc(100% - 40px));padding:7px 10px;border-radius:999px;
  background:linear-gradient(155deg,rgba(244,243,236,.09),rgba(244,243,236,.03) 42%,rgba(244,243,236,.012));
  backdrop-filter:blur(20px) saturate(1.5);-webkit-backdrop-filter:blur(20px) saturate(1.5);
  border:1px solid rgba(244,243,236,.15);
  box-shadow:0 24px 48px -32px rgba(0,0,0,.55),inset 0 1px 0 rgba(244,243,236,.14)}
.nav-left{justify-self:start;display:inline-flex;align-items:center;gap:14px}
.nav-wordmark{display:inline-flex;align-items:center;gap:9px;
  font-family:var(--display);font-weight:600;font-size:17px;letter-spacing:-.01em;
  color:inherit;text-decoration:none}
.nav-right{justify-self:end;display:inline-flex;align-items:center;gap:2px}
.nav-mascot{height:26px;width:auto;display:block}
.foot-mascot{height:36px;width:auto;display:block}
.nav-link{font-size:14px;color:var(--ink-2);text-decoration:none;padding:8px 12px;border-radius:999px;transition:color .2s;white-space:nowrap}
.nav-link:hover{color:var(--ink)}
.nav-link[aria-current="page"]{color:var(--ink)}
/* .nav-cta base pill — Aura body + ring styles join below under the shared block. */
.nav-cta{font-size:14px;font-weight:500;text-decoration:none;padding:9px 18px;border-radius:999px}

/* ============ SHARED ============ */
.container{max-width:var(--container);margin:0 auto;padding-left:var(--pad);padding-right:var(--pad)}
.pill{display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border-radius:999px;
  border:1px solid var(--line);background:rgba(244,243,236,.04);
  font-family:var(--body);font-size:11px;font-weight:500;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-2)}

/* ---- AURA: light refracting round a border (25 Sep) --------------------------------
   One beam of the brand spectrum travels the perimeter of any rounded box. Built as a
   conic gradient masked down to the border ring, so it costs one compositor layer and
   inherits whatever border-radius the host already has. `--aura-beam` sets how much of
   the circumference the light occupies, `--aura-delay` de-syncs siblings so a row of
   cards never pulses in unison. The ::after is the same ring, fatter and blurred — the
   bloom the light throws onto the surface around it.
   Needs @property to interpolate the angle; without it the ring just sits still, which
   is the intended fallback (border colour still reads). ------------------------------ */
@property --aura{syntax:'<angle>';inherits:false;initial-value:0deg}
@keyframes aura-spin{to{--aura:360deg}}
.aura{position:relative}
.aura::before,.aura::after{content:"";position:absolute;inset:0;border-radius:inherit;
  pointer-events:none;padding:var(--aura-w,1px);
  background:conic-gradient(from var(--aura) at 50% 50%,
    transparent 0turn,
    transparent calc(1turn - var(--aura-beam,.34turn)),
    rgba(248,149,197,0)  calc(1turn - var(--aura-beam,.34turn)),
    var(--p-pink)        calc(1turn - var(--aura-beam,.34turn) * .72),
    var(--p-purple)      calc(1turn - var(--aura-beam,.34turn) * .50),
    var(--p-cyan)        calc(1turn - var(--aura-beam,.34turn) * .28),
    var(--p-green)       calc(1turn - var(--aura-beam,.34turn) * .10),
    rgba(206,252,151,0)  1turn);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask-composite:exclude;
  opacity:var(--aura-op,.85);
  animation:aura-spin var(--aura-dur,7.5s) linear infinite var(--aura-delay,0s)}
/* 2026-10-25 Dylan: pause rule removed. html:not(:focus-within) fires in the
   DEFAULT no-focus state (page load, click outside anything focusable), so the
   rings were freezing permanently. The real memory hog was the wheel-glide
   rAF loop, which is already gone. Keep the aura spinning. */
.aura::after{inset:-1px;padding:calc(var(--aura-w,1px) + 2px);
  filter:blur(6px);opacity:calc(var(--aura-op,.85) * .6)}
@media (prefers-reduced-motion:reduce){
  .aura::before,.aura::after{animation:none;--aura:212deg}
}
h1,h2,h3{text-wrap:balance}
.h2{font-family:var(--display);font-weight:600;font-size:clamp(30px,3.6vw,46px);line-height:1.06;letter-spacing:-.01em}
.h2 .dim{color:var(--ink-3)}
.lede{font-size:clamp(17px,2vw,20px);line-height:1.5;color:var(--ink-2);max-width:34em}
/* ============================================================================
   BUTTON — AURA variant (E6, 2026-10-23 from PRD-hero-v9-split.md)
   Dark glass pill ringed by the brand's travelling light (lime → cyan → purple),
   lime arrow tracking right on hover. Applies to .btn (hero CTA, Dawn CTA, apply
   submit) AND .nav-cta — one visual, every primary action. Sentence-case labels.
   Ring is a conic-gradient driven by @property --btn-a; arrow is a mask SVG.
   Reduced motion freezes the ring at 212° and holds the arrow still.
   One self-contained block so a React port lifts it clean.
   ============================================================================ */
.btn{display:inline-flex; align-items:center; gap:.55em;
  font-family:var(--body); font-weight:500; font-size:16px; color:#EEF8E6;
  border:none; border-radius:999px; padding:15px 30px; text-decoration:none; cursor:pointer}
.btn:active{transform:translateY(1px)}

@property --btn-a{syntax:'<angle>'; inherits:false; initial-value:0deg}
@keyframes btn-spin{to{--btn-a:360deg}}

.btn,.nav-cta{position:relative; isolation:isolate;
  background:linear-gradient(180deg,rgba(36,42,32,.92),rgba(16,19,14,.92));
  color:#EEF8E6;
  box-shadow:inset 0 1px 0 rgba(244,243,236,.12), 0 12px 32px -14px rgba(170,249,136,.45);
  transition:background .2s, box-shadow .2s, color .2s, transform .1s}
.btn:hover,.nav-cta:hover{color:#FFFFFF;
  background:linear-gradient(180deg,rgba(42,49,37,.95),rgba(18,22,16,.95));
  box-shadow:inset 0 1px 0 rgba(244,243,236,.16), 0 14px 36px -12px rgba(170,249,136,.6)}

/* conic-gradient ring, masked to a hair's-breadth border round the pill */
.btn::before,.nav-cta::before{content:""; position:absolute; inset:-1px;
  border-radius:inherit; padding:1.5px; z-index:-1; pointer-events:none;
  background:conic-gradient(from var(--btn-a),
    rgba(170,249,136,.25) 0turn, #CEFC97 .12turn, #98EDFE .25turn, #B495F8 .38turn,
    rgba(170,249,136,.25) .55turn, rgba(170,249,136,.25) 1turn);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite:exclude;
  animation:btn-spin 5s linear infinite}
/* same reason as the .aura pause removal above — the no-focus default was
   freezing the button rings permanently. */
.btn:hover::before,.nav-cta:hover::before{animation-duration:1.8s}

/* lime arrow — SVG mask on a solid accent fill, nudges right on hover */
.btn::after,.nav-cta::after{content:""; width:1em; height:1em; flex:none; background:#AAF988;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8h9.2M8.6 4.4 12.2 8l-3.6 3.6' fill='none' stroke='black' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8h9.2M8.6 4.4 12.2 8l-3.6 3.6' fill='none' stroke='black' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
  transition:transform .3s cubic-bezier(.2,.7,.2,1)}
.btn:hover::after,.nav-cta:hover::after{transform:translateX(3px)}

@media (prefers-reduced-motion:reduce){
  .btn::before,.nav-cta::before{animation:none; --btn-a:212deg}
  .btn:hover::after,.nav-cta:hover::after{transform:none}
}

.btn:focus-visible,.nav-cta:focus-visible,a:focus-visible{outline:2px solid var(--accent); outline-offset:3px}
.slot{color:#EE8A5F;border-bottom:1px dashed rgba(238,138,95,.5);cursor:help;font-style:normal}
.mono-note{font-family:var(--body);font-size:11px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3)}

/* reveals */
.rv{opacity:1;transform:none}
.motion-ready .rv{opacity:0;transform:translateY(16px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
.motion-ready .rv.in{opacity:1;transform:none}

/* section header: pill + two-col (fora pattern) */
.sec-head{display:grid;grid-template-columns:1.4fr 1fr;gap:clamp(32px,5vw,80px);align-items:end;margin-bottom:clamp(40px,6vw,72px)}
.sec-head .pill{margin-bottom:26px}

/* ============ HERO — the valley ============ */
.hero{position:relative;overflow:hidden;background:#05060A}
.sky{position:absolute;inset:0;
  background:
    radial-gradient(90% 34% at 50% 74%, rgba(206,252,151,.28) 0%, rgba(152,237,254,.15) 38%, transparent 70%),
    radial-gradient(130% 60% at 50% 86%, rgba(152,237,254,.12) 0%, rgba(180,149,248,.12) 40%, rgba(248,149,197,.07) 62%, transparent 78%),
    linear-gradient(180deg,#04050A 0%,#060810 30%,#0B0D14 52%,#141324 68%,#1A1526 78%,#10120E 90%,#0B0E09 100%)}
/* .ridge base — still used by about-src.html for its own hero wave. The lander's
   split-fold hero (E2, 2026-10-23) dropped the three ridge-far/mid/fore layers along
   with the stars; keep the base selector so about's `<div class="ridge">` still styles. */
.ridge{position:absolute;left:0;right:0;width:100%;pointer-events:none}
.ridge svg{display:block;width:100%;height:auto}
/* ============================================================================
   HERO — SPLIT FOLD (E2, 2026-10-23 from PRD-hero-v9-split.md)
   One screen at ≥921px (100svh, 620px floor): headline left, transparent film
   right, both centred in a band between the nav and the partner logos (E4).
   No ridges, no stars, no hue — only two colourless drift fields on .sky.
   Mobile <921px stacks text → film with no masks (boxed cut).
   Keep CSS blocks together so a React port lifts them as one component.
   ============================================================================ */
.hero{position:relative; z-index:61;
  background:linear-gradient(180deg,#000 0%,#000 38%,#030403 62%,var(--bg) 100%);
  --glow-x:70%}
.hero + .credband{background:var(--bg)}       /* no seam into CredBand */
nav{z-index:70}                                /* above hero's grain copy */

/* backdrop grain copy, masked clear at top, full at foot — meets next section seamlessly */
.hero::after{content:""; position:absolute; inset:0; z-index:5; pointer-events:none; opacity:.055;
  background-image: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.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
  -webkit-mask:linear-gradient(180deg,transparent 0%,transparent 40%,#000 100%);
  mask:linear-gradient(180deg,transparent 0%,transparent 40%,#000 100%)}

/* sky hosts two colourless drift fields — transform-only, cheap, stops for reduced motion */
.hero .sky{overflow:hidden; background:none;
  -webkit-mask:linear-gradient(180deg,transparent 0%,#000 34%,#000 55%,transparent 90%);
  mask:linear-gradient(180deg,transparent 0%,#000 34%,#000 55%,transparent 90%)}
.hero .sky::before,.hero .sky::after{content:""; position:absolute; border-radius:50%; pointer-events:none; will-change:transform}
.hero .sky::before{width:72vmax; height:72vmax; left:calc(var(--glow-x) - 36vmax); top:calc(52% - 36vmax);
  background:radial-gradient(closest-side,rgba(255,255,255,.050) 0%,rgba(255,255,255,.020) 42%,transparent 100%);
  animation:hs-drift-a 26s ease-in-out infinite alternate}
.hero .sky::after{width:54vmax; height:54vmax; left:calc(var(--glow-x) - 44vmax); top:calc(62% - 27vmax);
  background:radial-gradient(closest-side,rgba(255,255,255,.032) 0%,rgba(255,255,255,.012) 48%,transparent 100%);
  animation:hs-drift-b 34s ease-in-out infinite alternate}
@keyframes hs-drift-a{0%{transform:translate(-8vw,-5vh) scale(1)} 50%{transform:translate(5vw,6vh) scale(1.1)} 100%{transform:translate(9vw,-6vh) scale(.92)}}
@keyframes hs-drift-b{0%{transform:translate(2vw,4vh) scale(1)} 50%{transform:translate(-12vw,-8vh) scale(1.16)} 100%{transform:translate(6vw,2vh) scale(.94)}}
@media (prefers-reduced-motion:reduce){.hero .sky::before,.hero .sky::after{animation:none}}

/* layout tokens for the band — reused by E4's logo row.
   2026-10-23 Dylan: text column wider (--tw 400→680) and smaller center gap
   so the headline's right edge and the film's left edge meet closer to the
   centreline — less dead air between them at wide viewports. */
.hero{--navb:74px; --vpad:clamp(56px,10svh,130px); --logos-h:clamp(72px,11svh,112px);
  --gutter:max(var(--pad),calc((100vw - 1280px) / 2));
  /* 2026-10-28 Dylan: --tw widened from 38vw→42vw so the hero text column
     at 1440 native matches what he sees at 90% zoom on wider screens —
     keeps "Imagine your sales team" on one line. */
  --tw:clamp(400px,42vw,680px)}

/* ----- desktop (≥921px): one screen, text column left, film column right -----
   Gutters live on the band's inset, NOT on padding inside the columns, so the
   --tw width is the ACTUAL text width (not a cell containing padding + text).
   Earlier bug: padding-left:var(--gutter) inside .hero-content shrank the text
   from 620px to ~310px at 1900 wide and forced 'sales team' to wrap. */
@media (min-width:921px){
  /* 2026-10-25 Dylan: hero fills the viewport again so the logo marquee sits at
     the ACTUAL bottom of the fold, not floating ~300px above it. Reduced --vpad
     from the earlier pass still holds — headline + film sit tighter in the band's
     centre so there's no air pocket under them. */
  .hero{min-height:100svh;
    --vpad:clamp(44px,7svh,88px); --logos-h:clamp(64px,9svh,96px)}
  .hero-inner.hero-split{position:absolute;
    inset:calc(var(--navb) + var(--vpad)) var(--gutter) calc(var(--logos-h) + .6 * var(--vpad)) var(--gutter);
    display:grid; grid-template-columns:var(--tw) 1fr; gap:clamp(24px,2vw,40px); align-items:center;
    padding:0; margin:0; max-width:none; z-index:6}
  /* 2026-10-27 Dylan: title was vertically centred in the full-height hero band, which at
     tall viewports pushed the headline ~400px below the nav because justify-content:center
     spread the "unused" vertical space symmetrically above and below. Anchor the text column
     to the top of the band + a tunable padding-top so the headline sits closer to the nav.
     Film gets the same margin-top so the two columns stay visually aligned. */
  /* 2026-10-28 Dylan: content column centred vertically in the hero band so
     the gap below the CTA closes instead of sitting as dead space. Film
     column centres on the same axis so the two stay visually aligned. */
  .hero-split .hero-content{display:flex; flex-direction:column; justify-content:center;
    text-align:left; max-width:none; align-items:flex-start; padding:0}
  .hero-split .alpha-hero{align-self:center; margin-top:0}
  /* 2026-10-23 (overnight critic): film's second width candidate was
     `remaining-row-width / .943`, which at 1920 wide inflated the film to 602px
     inside a 568px column — it bled 34px past the master 1280 container's right
     edge. Dropping the /.943 inflation locks the film to its actual column cell
     at any viewport ≥1281, so its right edge aligns with the logo marquee + the
     site's 1280 frame. */
  .alpha-hero{justify-self:end;
    width:min(
      calc((100svh - var(--navb) - 2*var(--vpad) - var(--logos-h) - .6*var(--vpad)) * (1440/1240)),
      calc(100vw - 2*var(--gutter) - var(--tw) - 40px),
      44vw,
      900px);
    max-width:none}
}

/* ----- film box — rectangle × circle feather (E3, 2026-10-23) -----
   The base rectangle (horizontal + vertical gradients) is intersected with a radial
   gradient driven by --iris (0 open, 1 closed) — valley-iris.js reads the film's own
   mediaTime and animates --iris 0 → 1 between 4.9–5.25s (closed over the market map
   dive) and back 1 → 0 between 8.25–8.95s (open before the email card lands). When
   --iris=0 the radial resolves to #000 at 300%/400%, i.e. a solid plate that lets
   the rectangle alone show. When --iris=1 the radial is #000 at 74% and transparent
   at 100% — a circle inside the box. Phones use the boxed cut and skip the mask. */
/* unconditional base: no width here. The @media (min-width:921px) rule above
   sets width:min(...); the @media (max-width:920px) rule below sets width:100%.
   Setting width:100% unconditionally wins source order and inflates the film. */
.alpha-hero{position:relative; margin:0; padding:0}
.alpha-film{position:relative; width:100%; aspect-ratio:1440/1240;
  --ia:calc(300% - 226% * var(--iris, 0));
  --ib:calc(400% - 300% * var(--iris, 0));
  -webkit-mask:
    linear-gradient(90deg,transparent 0,#000 8%,#000 92%,transparent 100%),
    linear-gradient(180deg,transparent 0,#000 6%,#000 96%,transparent 100%),
    radial-gradient(50% 58% at 50% 52%,#000 var(--ia),transparent var(--ib));
  -webkit-mask-composite:source-in, source-in;
  mask:
    linear-gradient(90deg,transparent 0,#000 8%,#000 92%,transparent 100%),
    linear-gradient(180deg,transparent 0,#000 6%,#000 96%,transparent 100%),
    radial-gradient(50% 58% at 50% 52%,#000 var(--ia),transparent var(--ib));
  mask-composite:intersect, intersect}
.alpha-film__media,.alpha-film__still{position:absolute; inset:0; width:100%; height:100%; display:block;
  background:transparent; object-fit:contain}
.alpha-film__media{opacity:0}
.alpha-film[data-playing] .alpha-film__media{opacity:1}
.alpha-film[data-playing] .alpha-film__still{visibility:hidden}

/* pause control — hover-only (Dylan 2026-10-23: skip E5's always-visible rebuild) */
.alpha-film__toggle{position:absolute; right:9%; bottom:11%; z-index:3;
  font:600 12px/1 Saans,system-ui,sans-serif; letter-spacing:.04em; color:#B7BCAC;
  background:rgba(20,24,18,.72); border:1px solid rgba(244,243,236,.14); border-radius:999px; padding:7px 12px;
  cursor:pointer; opacity:0; transition:opacity .2s}
.alpha-film:hover .alpha-film__toggle,.alpha-film__toggle:focus-visible{opacity:1}

/* type + sub + CTA (R1 applied globally — sentence case, Greed 600) */
.hero-inner{position:relative}
.hero .pill{margin-bottom:30px}
.h1{font-family:var(--display); font-weight:600; text-transform:none;
  letter-spacing:-.02em; line-height:1.06; text-wrap:balance;
  font-size:clamp(36px,min(3.95vw,6.4svh),68px); max-width:14ch; margin:0 auto}
.hero .h1{max-width:none; margin:0}
.hero .h1 .grad{display:block; width:fit-content}
.hero-sub{margin:clamp(24px,3.8svh,38px) 0 0; max-width:26em;
  color:var(--ink-2); font-size:clamp(15px,min(1.3vw,2.2svh),20px); line-height:1.62; text-wrap:pretty}
/* default is center (used by DawnCTA + apply page). Hero-specific left-align is scoped below. */
.hero-cta-row{margin-top:clamp(32px,5.2svh,52px); display:flex; justify-content:center; align-items:center; gap:14px}
.hero .hero-cta-row{justify-content:flex-start}
/* 2026-10-29 Cian: hero sub in the Labs body style — bigger, tighter, first
   sentence bright, the rest softer. Same words. */
.hero .hero-sub{color:var(--ink); line-height:1.4; letter-spacing:-.016em}
.hero .hero-sub b{font-weight:500}
.hero .hero-sub .mu{opacity:.56}
@media (min-width:921px){
  .hero .hero-sub{font-size:clamp(16px,min(1.4vw,2.5svh),21px); max-width:28em; margin-top:clamp(18px,3svh,30px)}
  .hero .hero-cta-row{margin-top:clamp(24px,4.4svh,44px)}
}

/* ===== HERO LOGOS (E4, 2026-10-23) — the partner marquee pinned to the fold's foot.
   Quieter than the credband one it came from: smaller marks, lower opacity, bigger
   gap, so it reads as proof not a feature. CredBand keeps the stat cards. ===== */
/* 2026-10-23 Dylan: logo marquee aligns to the hero's 1280 frame — same
   --gutter as the headline + film, so the row of marks starts and ends on
   the master border set by the hero. */
.hero-logos{position:absolute; left:var(--gutter); right:var(--gutter); bottom:0; z-index:3;
  height:var(--logos-h); display:flex; align-items:flex-end; padding-bottom:16px; pointer-events:none}
/* bump specificity past `.motion-ready .rv.in{opacity:1}` so the .42 fade
   actually lands — Dylan 23 Oct: logos read as quiet proof not a feature. */
.hero-logos .marquee.rv,.hero-logos .marquee.rv.in,.hero-logos .marquee{width:100%; opacity:.42; pointer-events:auto}
.hero-logos .mq-set{gap:clamp(44px,4.6vw,76px)}
.hero-logos .mq-set li>img{height:calc(clamp(20px,1.85vw,28px) * var(--s, 1))}
/* 2026-10-29 Cian: logos sit at the foot of the screen. The generic .marquee
   margin-bottom (52–76px, meant for the credband strip) was lifting the hero row
   ~65px off the bottom edge. */
.hero-logos .marquee{margin-bottom:0}
@media (min-width:921px){ .hero-logos{padding-bottom:clamp(18px,3.4svh,34px)} }

/* ----- phones (<921px): stack text → film, boxed cut, no masks. Logos sit in flow ----- */
@media (max-width:920px){
  .hero{min-height:0; height:auto; padding:124px var(--pad) 40px}
  .hero-inner.hero-split{display:flex; flex-direction:column; gap:28px; align-items:center; margin:0 auto; max-width:420px}
  .hero-split .hero-content{text-align:center; align-items:center}
  .hero .h1{text-align:center; max-width:14ch; margin:0 auto}
  .hero .h1 .grad{margin:0 auto}
  .hero-sub{text-align:center; margin:26px auto 0}
  .hero-cta-row{justify-content:center}
  .alpha-hero{width:100%; max-width:none; margin:0 auto; justify-self:center}
  .alpha-film{-webkit-mask:none; mask:none; border-radius:16px; overflow:hidden; background:#0b100d; border:1px solid rgba(244,243,236,.12)}
  .hero-logos{position:relative; height:auto; margin-top:36px; padding-bottom:20px}
}

/* ============ CREDIBILITY ============ */
.credband{padding:clamp(90px,12vw,140px) 0;background:linear-gradient(180deg,#050704 0%,var(--bg) 30%)}
/* .cred-head (centred pill above an h2) was the pre-E8 header pattern — E8 (2026-10-24)
   replaced it with .cred-intro (eyebrow + left-aligned h2 + right lede). Selectors removed
   2026-10-25 after they sat matching nothing for a day. */

/* ---- logo marquee. The set is authored once; JS clones it and adds .mq-ready, and
   only then does the track start running and translate by exactly half its width —
   which is one set, so the seam lands on itself. Without JS, or under reduced motion,
   the same single set stays as a centred wrapped strip. The base64 marks therefore
   appear once in the document, not twice. ---- */
.marquee{--mq-gap:clamp(52px,6vw,92px);position:relative;overflow:hidden;
  margin-bottom:clamp(52px,6.5vw,76px)}
.marquee.is-running{
  -webkit-mask:linear-gradient(90deg,transparent 0,#000 11%,#000 89%,transparent 100%);
  mask:linear-gradient(90deg,transparent 0,#000 11%,#000 89%,transparent 100%)}
.mq-track{display:flex;flex-wrap:wrap;justify-content:center;row-gap:30px}
.mq-track.mq-ready{flex-wrap:nowrap;justify-content:flex-start;width:max-content;
  animation:mq-run var(--mq-dur,52s) linear infinite}
.marquee:hover .mq-ready,.marquee:focus-within .mq-ready{animation-play-state:paused}
@keyframes mq-run{to{transform:translate3d(-50%,0,0)}}
.mq-set{display:flex;align-items:center;flex-wrap:wrap;justify-content:center;
  gap:var(--mq-gap);row-gap:30px;list-style:none;margin:0}
.mq-ready .mq-set{flex-wrap:nowrap;padding-right:var(--mq-gap)}
/* static fallback (reduced motion, or JS off): wrap the full partner list with
   tighter spacing, keeping every company visible. */
.mq-track:not(.mq-ready){--mq-gap:clamp(28px,3.4vw,52px);padding:0 var(--pad)}
.mq-track:not(.mq-ready) img{height:calc(clamp(22px,2.1vw,30px) * var(--s,1))}
.mq-set li{flex:0 0 auto;display:flex;align-items:center}
.mq-set img{display:block;width:auto;height:calc(clamp(28px,2.7vw,38px) * var(--s,1));
  opacity:.5;transition:opacity .35s var(--ease)}
.mq-set li:hover img{opacity:.92}
.mq-moshi{gap:10px}
.mq-moshi img{filter:grayscale(1)}
.mq-name{font-family:var(--display);font-weight:600;line-height:1;
  font-size:clamp(28px,2.7vw,38px);opacity:.5;transition:opacity .35s var(--ease)}
.mq-moshi:hover .mq-name{opacity:.92}
.mq-track:not(.mq-ready) .mq-name{font-size:clamp(22px,2.1vw,30px)}

/* ---- proof cards: same light, slower, staggered, one accent hue each ---- */
.cred-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(28px,3vw,56px)}
.cred-card{--aura-w:1px;--aura-dur:15s;--aura-beam:.40turn;--aura-op:.62;
  position:relative;display:flex;flex-direction:column;border-radius:18px;padding:28px 28px 30px;
  border:1px solid rgba(244,243,236,.085);
  background:
    radial-gradient(118% 88% at 100% 0%, var(--ca,rgba(206,252,151,.12)), transparent 62%),
    linear-gradient(155deg,rgba(244,243,236,.075),rgba(244,243,236,.022) 46%,rgba(244,243,236,.008));
  box-shadow:0 30px 60px -36px rgba(0,0,0,.7),inset 0 1px 0 rgba(244,243,236,.10);
  transition:transform .45s var(--ease),box-shadow .45s var(--ease),border-color .45s var(--ease)}
.cred-card:hover{transform:translateY(-3px);--aura-op:1;
  border-color:rgba(244,243,236,.14);
  box-shadow:0 44px 80px -40px rgba(0,0,0,.8),inset 0 1px 0 rgba(244,243,236,.14)}
.cred-card .mono-note{display:block;color:var(--ink-3);
  font-family:var(--body);font-weight:500;letter-spacing:.15em}   /* brand face; Saans sets tighter than mono, so the tracking goes up to hold the rhythm */
.cred-num{font-family:var(--display);font-weight:600;font-size:clamp(46px,5vw,64px);line-height:.98;
  letter-spacing:-.02em;margin:20px 0 14px;font-variant-numeric:tabular-nums}
/* pinned to the floor, so a two-line caption grows upward and every card in the row
   keeps the same last baseline however the copy wraps */
.cred-sub{margin-top:auto;color:var(--ink-2);font-size:15.5px;line-height:1.5;max-width:22ch}
/* ---------- Direction C · Dawn horizon (lifted verbatim from the Callout Card Directions
   artifact fe6514fc) ----------  Each card carries a sunrise: .glow is an accent ellipse rising
   into the glass, .horizon is the crisp 1.5px arc (the top border of a wide ellipse) + bloom,
   both sliding up on hover; a coloured drop-shadow throws light onto the page. Label takes
   --acc, the figure stays pure ink with a soft glow. Scoped to .v-c so it's an additive skin. */
.v-c .cred-card{--aura-op:.45;border-color:rgba(244,243,236,.11);padding-bottom:76px;
  background:linear-gradient(180deg,rgba(244,243,236,.07),rgba(244,243,236,.02) 60%,rgba(244,243,236,.01));
  box-shadow:0 60px 90px -56px color-mix(in srgb,var(--acc) 60%,transparent),
    0 30px 60px -36px rgba(0,0,0,.8),inset 0 1px 0 rgba(244,243,236,.12)}
.v-c .clip{position:absolute;inset:0;border-radius:inherit;overflow:hidden;z-index:1;pointer-events:none}
.v-c .glow,.v-c .horizon{position:absolute;left:-20%;width:140%;transition:transform .9s var(--ease)}
.v-c .glow{bottom:-66%;height:100%;border-radius:50%;
  background:radial-gradient(closest-side,color-mix(in srgb,var(--acc) 42%,transparent),color-mix(in srgb,var(--acc) 12%,transparent) 55%,transparent)}
.v-c .horizon{bottom:-150px;height:190px;border-radius:50%;
  border-top:1.5px solid color-mix(in srgb,var(--acc) 85%,white);
  box-shadow:0 -6px 24px color-mix(in srgb,var(--acc) 55%,transparent),inset 0 10px 30px color-mix(in srgb,var(--acc) 35%,transparent)}
.v-c .cred-card:hover .glow{transform:translateY(-16%)}
.v-c .cred-card:hover .horizon{transform:translateY(-22px)}
/* Card lift on hover. The reveal sets `.motion-ready .rv.in{transform:none}` at (0,3,0), which beats
   the base `.cred-card:hover` (0,2,0) once a card is in view — so the lift never showed. Re-assert it
   at (0,3,0), scoped to .v-c and placed after the reveal rule so it wins the tie on hover. */
.v-c .cred-card:hover{transform:translateY(-4px)}
.v-c .mono-note{color:var(--acc)}
.v-c .cred-num{font-size:clamp(54px,5.8vw,76px);text-shadow:0 0 42px color-mix(in srgb,var(--acc) 38%,transparent)}
.v-c .cred-sub{color:#DADDD0;font-size:16px}

/* ============ FAQ — native <details>, matches section-head pattern ============
   Picks up Dawn's final pure-#000 and gradients back up to --bg so the two
   sections flow as ONE black-into-ink wash rather than a block color change. */
.faq{position:relative;padding:clamp(80px,10vw,140px) 0;
  background:linear-gradient(180deg,#000 0%,#030403 30%,var(--bg) 100%)}
.faq .section-head{text-align:center;margin-bottom:clamp(48px,6vw,72px)}
.faq .section-head .h2{margin-top:18px;font-size:clamp(28px,3.2vw,42px);line-height:1.1}
.faq-list{max-width:720px;margin:0 auto}
.faq-row{position:relative}
.faq-row>summary{list-style:none;cursor:pointer;padding:22px 2px;display:grid;grid-template-columns:1fr auto;gap:24px;align-items:center;
  font-family:var(--display);font-weight:500;font-size:clamp(18px,2.1vw,22px);color:var(--ink);line-height:1.3;transition:color .15s}
.faq-row>summary::-webkit-details-marker{display:none}
.faq-row>summary::after{content:"";width:14px;height:14px;flex-shrink:0;position:relative;transition:transform .18s ease-out;
  background:
    linear-gradient(var(--ink-2),var(--ink-2)) center/14px 1.5px no-repeat,
    linear-gradient(var(--ink-2),var(--ink-2)) center/1.5px 14px no-repeat}
.faq-row[open]>summary::after{transform:rotate(45deg);
  background:linear-gradient(var(--accent),var(--accent)) center/14px 1.5px no-repeat}
.faq-row>summary:hover{color:var(--accent)}
.faq-row>summary:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:4px}
.faq-answer{padding:0 2px 24px;max-width:60ch}
.faq-answer p{margin:0;color:var(--ink-2);font-size:clamp(15px,1.6vw,17px);line-height:1.55}
@media (max-width:920px){
  .faq{padding:60px 0 72px}
  .faq .section-head{margin-bottom:32px}
  .faq-row>summary{padding:18px 2px;font-size:17px}
}

/* ============ TESTIMONIAL ORBIT (E9, 2026-10-25) — proof row rebuilt as a
   satellite carousel. One card centre-stage, others circle as 3D company orbs
   on a lime→cyan→purple→pink ring. All CSS ported value-for-value from the
   signed-off reference at hero-v9-split-reference/index.html <style id="proof-orbit">.
   The engine ships at the bottom of this file inside the main <script> block,
   gated on [data-orbit]. Reduced-motion freezes everything; cards hold their
   final numbers in markup so no-JS visitors still read the stat. ============ */
@property --glow-c { syntax: '<color>'; inherits: true; initial-value: #98EDFE; }
.proof { position:relative; overflow:hidden; padding:clamp(44px,4vw,72px) 0 clamp(36px,3.5vw,60px);
  --oe:cubic-bezier(.22,.75,.18,1); --od:.95s; transition:--glow-c 1.1s var(--ease);
  /* 2026-10-27 Dylan: contained in one viewport — head top, orbit mid, chips bottom. */
  min-height:100svh; display:flex; flex-direction:column }
.proof > .container { display:flex; flex-direction:column; justify-content:space-between; flex:1; width:100% }

/* head — rule R1: sentence case, Greed 600 */
.proof-head { position:relative; z-index:3; text-align:center; margin-bottom:clamp(12px,1.6vw,24px) }
.proof-eyebrow { display:block; margin-bottom:14px; font-family:var(--body); font-weight:500; letter-spacing:.15em; color:var(--ink-3) }
.proof-h { margin:0 auto; max-width:17em; font-family:var(--display); font-weight:600;
  font-size:clamp(28px,2.9vw,40px); line-height:1.06; letter-spacing:-.02em; text-wrap:balance }

/* the stage */
.orbit { position:relative; height:var(--oh,560px); touch-action:pan-y; -webkit-user-select:none; user-select:none;
  transition:height .6s var(--oe) }
.orbit::before { content:""; position:absolute; left:50%; top:52%; width:min(1200px,130vw); height:130%;
  transform:translate(-50%,-50%); pointer-events:none;
  background:radial-gradient(closest-side, color-mix(in srgb,var(--glow-c) 12%,transparent),
    color-mix(in srgb,var(--glow-c) 4%,transparent) 55%, transparent) }
.orbit-world { position:absolute; inset:0; z-index:2; transform:translateY(var(--sy,0px));
  transition:transform var(--od) var(--oe) }

/* the orbit path: lime → cyan → purple → pink, 1.5px ring + soft bloom */
.orbit-ring { position:absolute; z-index:1; left:50%; top:0; width:calc(var(--erx) * 2); height:calc(var(--ery) * 2);
  margin-left:calc(var(--erx) * -1); transform:translateY(var(--ety,0px)); pointer-events:none }
.orbit-ring::before, .orbit-ring::after { content:""; position:absolute; inset:0; border-radius:50%; border:1.5px solid transparent;
  background:conic-gradient(from 90deg, #CEFC97, #98EDFE, #B495F8, #F895C5, #CEFC97) border-box;
  -webkit-mask:linear-gradient(#000 0 0) padding-box, linear-gradient(#000 0 0); -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) padding-box, linear-gradient(#000 0 0); mask-composite:exclude }
.orbit-ring::before { opacity:.7 }
.orbit-ring::after { border-width:6px; filter:blur(10px); opacity:.45 }

/* ---- the card ---- */
.oc { position:absolute; left:50%; top:50%; width:var(--cw,560px); height:var(--ch,auto); pointer-events:none;
  transform:translate(-50%,-50%) translate(var(--x,0px),var(--y,0px)) scale(var(--s,1)); opacity:var(--o,1);
  transition:transform var(--od) var(--oe), opacity var(--od) var(--oe) }
.oc.is-active { pointer-events:auto }
.oc-card { position:relative; height:100%; display:flex; flex-direction:column; overflow:hidden; border-radius:24px;
  padding:clamp(22px,2.2vw,32px) clamp(22px,2.4vw,36px) clamp(20px,2vw,28px);
  border:1px solid rgba(255,255,255,.08); background:linear-gradient(180deg, #060706 0%, #000 100%);
  box-shadow:0 50px 90px -50px rgba(0,0,0,.95), inset 0 1px 0 rgba(255,255,255,.12) }
.oc-card::before { content:"\201C"; position:absolute; top:4px; right:26px; font:600 150px/1 var(--display);
  color:rgba(255,255,255,.05); pointer-events:none }
.oc-who { position:relative; display:flex; align-items:center; gap:14px }
.oc-who img { width:52px; height:52px; border-radius:50%; object-fit:cover; flex:none;
  box-shadow:0 0 0 2px rgba(0,0,0,.55), 0 0 0 3.5px color-mix(in srgb,var(--acc) 75%,transparent), 0 0 18px color-mix(in srgb,var(--acc) 30%,transparent) }
.oc-who span { display:flex; flex-direction:column; gap:3px }
.oc-who b { font:600 17px/1.2 var(--body); color:var(--ink) }
.oc-who i { font:400 14px/1.3 var(--body); font-style:normal; color:var(--ink-3) }
.oc-quote { position:relative; margin:clamp(16px,1.8vw,22px) 0 26px; font-family:var(--display); font-weight:500;
  font-size:clamp(18px,1.5vw,22px); line-height:1.34; letter-spacing:-.005em; color:var(--ink); text-wrap:pretty }

/* the callout: an inset panel ringed by the travelling light (E6 Aura, in the founder's colour). */
.oc-stat { position:relative; isolation:isolate; margin-top:auto; padding:18px 24px 18px 22px; border-radius:18px;
  display:grid; grid-template-columns:auto 1fr; grid-template-rows:auto auto; column-gap:22px; row-gap:4px; align-items:center;
  background:linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.018));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.09), 0 22px 44px -28px color-mix(in srgb,var(--acc) 50%,transparent) }
.oc-stat::before { content:""; position:absolute; inset:-1px; border-radius:inherit; padding:1.5px; z-index:-1; pointer-events:none; --btn-a:212deg;
  background:conic-gradient(from var(--btn-a), color-mix(in srgb,var(--acc) 22%,transparent) 0turn, var(--acc) .1turn, #F6F8F1 .16turn,
    color-mix(in srgb,var(--acc) 60%,#98EDFE) .26turn, color-mix(in srgb,var(--acc) 22%,transparent) .45turn, color-mix(in srgb,var(--acc) 22%,transparent) 1turn);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); mask-composite:exclude }
.oc.is-active .oc-stat::before { animation:btn-spin 6s linear infinite }
.oc-num { grid-row:1 / 3; font-family:var(--display); font-weight:600; font-size:clamp(58px,5.4vw,80px); line-height:.9;
  letter-spacing:-.02em; font-variant-numeric:tabular-nums;
  background:linear-gradient(180deg, #FFFFFF 10%, color-mix(in srgb,var(--acc) 70%,white) 55%, var(--acc) 100%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
  filter:drop-shadow(0 0 22px color-mix(in srgb,var(--acc) 45%,transparent)) }
.oc-lab { align-self:end; font:500 11px/1.3 var(--body); letter-spacing:.15em; text-transform:uppercase; color:var(--ink) }
.oc-cap { align-self:start; font-size:14.5px; line-height:1.45; color:#A3A89A }

/* ---- the satellites: the other partners' company orbs ---- */
.orbit-planets { position:absolute; left:0; right:0; top:0; height:0 }
.planet { all:unset; position:absolute; left:50%; top:0; width:84px; height:84px; margin:-42px 0 0 -42px; border-radius:50%; cursor:pointer;
  transform:translate(var(--px,0px), var(--py,0px)) scale(var(--ps,1)); opacity:var(--po,0); z-index:var(--pz,1) }
.planet img { display:block; width:100%; height:100%; transition:transform .35s var(--oe);
  filter:drop-shadow(0 12px 16px rgba(0,0,0,.55)) drop-shadow(0 0 18px rgba(255,255,255,.08)) }
.planet span { position:absolute; top:100%; left:50%; transform:translateX(-50%); margin-top:10px; white-space:nowrap;
  font:500 12px/1 var(--body); letter-spacing:.02em; color:var(--ink-2); opacity:0; transition:opacity .3s }
.planet:hover img { transform:scale(1.12) }
.planet:hover span { opacity:1 }

/* ---- nav: arrows + founder chips (the keyboard/screen-reader way in) ---- */
.orbit-nav { position:relative; z-index:5; display:flex; align-items:center; justify-content:center; gap:12px;
  margin-top:clamp(10px,1.4vw,20px); padding:0 var(--pad) }
.orbit-chips { display:flex; flex-wrap:wrap; justify-content:center; gap:8px }
.chip { all:unset; position:relative; overflow:hidden; display:inline-flex; align-items:center; gap:9px; padding:5px 15px 5px 5px; border-radius:999px;
  font:500 13.5px/1 var(--body); color:var(--ink-3); cursor:pointer; border:1px solid rgba(244,243,236,.1); background:rgba(244,243,236,.025);
  transition:color .3s, border-color .3s, background .3s }
.chip img { width:28px; height:28px; border-radius:50%; object-fit:cover; filter:grayscale(1) brightness(.85); transition:filter .3s }
.chip:hover { color:var(--ink-2) }
.chip[aria-pressed="true"] { color:var(--ink); border-color:color-mix(in srgb,var(--acc) 50%,transparent); background:color-mix(in srgb,var(--acc) 9%,transparent) }
.chip[aria-pressed="true"] img { filter:none }
.chip .bar { position:absolute; left:0; bottom:0; height:2px; width:0; background:var(--acc); opacity:.8 }
.orbit-nav.is-auto .chip[aria-pressed="true"] .bar.run { animation:chip-fill var(--auto-ms,7000ms) linear forwards }
@keyframes chip-fill { to { width:100% } }
.orbit-arrow { all:unset; flex:none; width:42px; height:42px; border-radius:50%; cursor:pointer; display:grid; place-items:center;
  border:1px solid rgba(244,243,236,.12); background:rgba(244,243,236,.03); transition:background .25s, border-color .25s }
.orbit-arrow::before { content:""; width:16px; height:16px; background:var(--ink-2);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8h9.2M8.6 4.4 12.2 8l-3.6 3.6' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8h9.2M8.6 4.4 12.2 8l-3.6 3.6' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat }
.orbit-arrow[data-step="-1"]::before { transform:scaleX(-1) }
.orbit-arrow:hover { background:rgba(244,243,236,.08); border-color:rgba(244,243,236,.22) }
.chip:focus-visible, .orbit-arrow:focus-visible { outline:2px solid var(--accent); outline-offset:3px }

@media (max-width:719px) {
  .chip { padding-right:5px; font-size:0; gap:0 }
  .oc-card::before { font-size:110px; right:18px }
  .planet { width:62px; height:62px; margin:-31px 0 0 -31px }
}
@media (prefers-reduced-motion:reduce) {
  .proof { --od:.01s; transition:none }
  .oc.is-active .oc-stat::before { animation:none }
  .orbit-nav .chip .bar { display:none }
}

/* ============================================================================
   E8 — CREDBAND "OPEN ROW" skin (Option A, 2026-10-24 from Dylan's screenshot)
   Intro: eyebrow + heading on the LEFT, lede on the RIGHT (2-col at desktop).
   Stats: UNBOXED. Label (coloured) → big figure → thin accent hairline → caption.
   No borders, no backgrounds, no shadows, no aura rings, no sunrise arcs.
   .v-c (dawn-horizon card skin) kept as dead code one class away.
   ============================================================================ */
/* 2026-10-27 Dylan: centralised boxes pattern. Heading on top, lede below,
   both centred. Container flex-column + space-between pushes the stat grid
   to the bottom third of a 100svh credband (promoted below). */
.cred-intro{display:flex;flex-direction:column;align-items:center;gap:20px;text-align:center}
.cred-intro-head{display:flex;flex-direction:column;gap:16px;align-items:center}
.cred-eyebrow{display:inline-block;letter-spacing:.15em;font-weight:500;color:var(--ink-3);
  text-transform:uppercase;font-size:12px}
.cred-h{font-family:var(--display);font-weight:600;text-transform:none;
  font-size:clamp(30px,3.6vw,46px);line-height:1.06;letter-spacing:-.02em;text-wrap:balance;margin:0}
.cred-lede{margin:0 auto;max-width:30em;color:var(--ink-2);
  font-size:clamp(16px,1.3vw,18px);line-height:1.55;text-wrap:pretty;text-align:center}
@media (max-width:920px){
  .cred-intro{gap:16px;margin-bottom:40px}
  .cred-h{margin-left:auto;margin-right:auto}
}

/* ----- .v-h "Open row" cards: unboxed, hairline underline under the figure ----- */
.v-h{position:relative;z-index:2}
.v-h .cred-card{border:0;border-radius:0;background:none;box-shadow:none;padding:0;
  display:flex;flex-direction:column;align-items:flex-start;text-align:left;gap:0;overflow:visible}
.v-h .cred-card::before,.v-h .cred-card::after,.v-h .clip,.v-h .glow,.v-h .horizon{display:none}
.v-h .cred-card:hover{transform:none}
.v-h .mono-note{color:var(--acc);letter-spacing:.15em;font-size:12px;font-weight:500;text-transform:uppercase}
.v-h .cred-num{font-family:var(--display);font-weight:600;color:var(--ink);
  font-size:clamp(60px,6.8vw,96px);line-height:1;letter-spacing:-.02em;
  margin:20px 0 0;text-shadow:0 0 52px color-mix(in srgb,var(--acc) 32%,transparent)}
/* the thin accent rule under each figure — the hairline that makes 'Open row' */
.v-h .cred-rule{display:block;width:min(72%,220px);height:1.5px;margin:14px 0 20px;
  background:linear-gradient(90deg,color-mix(in srgb,var(--acc) 85%,white) 0%,var(--acc) 60%,transparent 100%);
  border-radius:1px}
/* Card 3 sits in the right column, so a left-anchored left→right fade points its
   hairline OFF the right edge of the screen — the opposite of cards 1 and 2, which
   fade toward the middle. Mirror the third card: anchor to its right edge and
   reverse the gradient so its fade-out endpoint lands back toward the centre of
   the page. 2026-10-25 Dylan. */
.v-h .cred-card:nth-child(3) .cred-rule{margin-left:auto;
  background:linear-gradient(270deg,color-mix(in srgb,var(--acc) 85%,white) 0%,var(--acc) 60%,transparent 100%)}
.v-h .cred-sub{margin:0;color:#DADDD0;font-size:16px;line-height:1.5;max-width:24ch}
/* 2026-10-25 Dylan: hover the stat and the number lifts slightly off the screen,
   with the hairline rule rising half a step with it and the accent glow brightening. */
.v-h .cred-card .cred-num,.v-h .cred-card .cred-rule{transition:transform .35s cubic-bezier(.22,.75,.18,1), filter .35s ease, background .35s ease}
.v-h .cred-card:hover .cred-num{transform:translateY(-8px); filter:drop-shadow(0 0 40px color-mix(in srgb,var(--acc) 55%,transparent))}
.v-h .cred-card:hover .cred-rule{transform:translateY(-4px);
  background:linear-gradient(90deg,color-mix(in srgb,var(--acc) 95%,white) 0%,var(--acc) 55%,color-mix(in srgb,var(--acc) 40%,transparent) 85%,transparent 100%)}
/* mirror card 3's hover gradient so the brightening fades toward centre, not off-screen */
.v-h .cred-card:nth-child(3):hover .cred-rule{
  background:linear-gradient(270deg,color-mix(in srgb,var(--acc) 95%,white) 0%,var(--acc) 55%,color-mix(in srgb,var(--acc) 40%,transparent) 85%,transparent 100%)}
@media (prefers-reduced-motion:reduce){
  .v-h .cred-card:hover .cred-num,.v-h .cred-card:hover .cred-rule{transform:none; transition:none}
}
@media (max-width:920px){
  .v-h .cred-card{align-items:center;text-align:center}
  .v-h .cred-num{font-size:clamp(52px,14vw,72px);margin:12px 0 0}
  .v-h .cred-rule{margin:12px auto 14px;width:min(60%,180px)}
  .v-h .cred-sub{max-width:28ch}
}

/* .proofband / .proof-grid / .proof-card / .proof-stat* RETIRED 2026-10-25
   — the whole band moved to the .proof orbit above. Markup gone, selectors
   gone, no revival path (unlike .v-c). If you want the 4-card grid back:
   git log --oneline -- src/valley-lander-src.html and grep for 'E9'. */


@media (prefers-reduced-motion:reduce){.v-c .glow,.v-c .horizon{transition:none}}
@media (max-width:920px){.v-c .cred-card{padding-bottom:52px}.v-c .cred-num{font-size:clamp(40px,9vw,56px)}}
/* One column makes each card wide and short, and a stacked stat strands the right two
   thirds empty — so below the breakpoint the card turns on its side: figure on the left
   spanning both rows, label and caption meeting it in the middle. */
@media (max-width:920px){
  .cred-grid{grid-template-columns:1fr;gap:14px}
  .cred-card{display:grid;grid-template-columns:minmax(0,auto) 1fr;grid-template-rows:auto auto;
    align-items:center;column-gap:clamp(20px,4vw,42px);padding:24px 26px}
  .cred-card .mono-note{grid-area:1/2;align-self:end}
  /* 3ch (tabular) holds the widest figure, so 34 / 150 / 246 all hand off to the same
     text column and the three rows share one left edge */
  .cred-num{grid-area:1/1/3/2;margin:0;font-size:clamp(42px,8vw,54px);min-width:3ch}
  .cred-sub{grid-area:2/2;margin-top:4px;align-self:start;max-width:none}
}

/* ============ STICKY STACK ============ */
/* 2026-10-25 Dylan: pillars sits on black so the ink cards stand out more.
   Short gradient fades at the top (from credband's var(--bg)) and the bottom
   (into Dawn's var(--bg) start) keep both seams invisible. */
.pillars{padding:clamp(96px,12vw,150px) 0 0;
  background:linear-gradient(180deg, var(--bg) 0%, #000 14%, #000 86%, var(--bg) 100%)}
/* how-it-works header: single centred aura pill, mirroring the "engine behind" pill */
.pillars-head{display:block;text-align:center;margin-bottom:clamp(40px,6vw,72px)}
.pillars-head .pill{margin-bottom:0;--aura-w:1px;--aura-dur:8.5s;--aura-beam:.30turn;
  padding:10px 22px;font-size:11.5px;letter-spacing:.15em;color:var(--ink-2);
  border-color:rgba(244,243,236,.09);
  background:linear-gradient(150deg,rgba(244,243,236,.075),rgba(244,243,236,.02) 60%,rgba(244,243,236,.008))}
.stackzone{position:relative}
.scard-hold{position:sticky;top:11vh;padding-bottom:7vh}
/* Pillar chapter titles REMOVED 2026-10-28 (Dylan): cards speak for themselves. */
.scard{--sa:var(--p-green);border-radius:20px;overflow:hidden;
  border:1px solid rgba(244,243,236,.14);border-top:2px solid var(--sa);
  background:linear-gradient(160deg,#12150F 0%,#0C0F0A 60%,#0A0D08 100%);
  box-shadow:0 40px 80px -30px rgba(0,0,0,.75),inset 0 1px 0 rgba(244,243,236,.1);
  display:grid;grid-template-columns:1fr 1fr;min-height:66vh}
.scard .txt{padding:clamp(30px,4vw,56px);display:flex;flex-direction:column;justify-content:center;gap:18px}
/* 25 Sep: the "01 / Automation" pills are gone (Dylan), so h3 is now the top of the card and
   carries the weight the pill used to share. Wording is untouched — headings come from Notion
   "Website Copy v2" only. ⚠ The 01/02/03 sequence went with the pills; if the stack needs to
   read as three steps again, put a mono numeral here rather than restoring the chrome. */
.scard h3{font-family:var(--display);font-weight:600;font-size:clamp(27px,2.9vw,39px);line-height:1.06;letter-spacing:-.01em}
.scard .txt p{color:var(--ink-2);font-size:16.5px;max-width:30em}

/* ---- BEATS: the card's copy read one piece at a time (25 Sep) ---------------------
   Monaco's pattern, on our type. Each beat is a disclosure button with a rail to its
   left: a dim stub when closed, a full-height track when open, with a fill that runs
   top→bottom over the dwell in the card's own --sa. Auto-advances, loops, pauses off
   screen and on hover; click or keyboard jumps. Every word is the Notion "Website Copy
   v3" copy — the beat titles are that copy's own sentences, not new headings.
   The open row animates on grid-template-rows 0fr→1fr, which is the only way to ease
   to intrinsic height without measuring it. ---------------------------------------- */
.beats{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column}
.beat{position:relative;padding-left:21px}
/* The rail is anchored to the beat itself, not measured in JS: closed it is a 20px stub,
   open it is the beat's own height less its padding — so it grows with the copy it marks
   and stays in step with the row opening, with no second source of truth. */
.beat-rail{position:absolute;left:0;top:16px;width:3px;height:20px;border-radius:99px;
  background:rgba(244,243,236,.16);overflow:hidden;
  transition:height .55s var(--ease),background .5s var(--ease)}
.beat-rail::after{content:"";position:absolute;inset:0;border-radius:inherit;
  background:var(--sa,var(--accent));transform-origin:top;transform:scaleY(0)}
.beat-head{display:block;width:100%;padding:13px 0 0;background:none;border:0;
  text-align:left;cursor:pointer;font:inherit;color:inherit}
.beat-head:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:4px}
.beat-title{display:block;font-size:16.5px;line-height:1.45;color:var(--ink-3);
  transition:color .4s var(--ease)}
/* The card's one proof figure. It used to be the mono "data label" treatment — 12.5px uppercase,
   LIGHTER than the beat above it, which reads backwards for the strongest claim on the card.
   Now the display face at 600, same size as its sibling so the two beats stay peers: the weight
   comes from Greed, not from shouting in caps. */
.is-stat .beat-title{font-family:var(--display);font-weight:600;font-size:16.5px;
  letter-spacing:-.01em;line-height:1.35;font-variant-numeric:tabular-nums}
.beat-body{display:grid;grid-template-rows:0fr;opacity:0;
  transition:grid-template-rows .55s var(--ease),opacity .4s var(--ease)}
.beat-copy{overflow:hidden;min-height:0}
.beat-body p{margin:.7em 0 0;max-width:30em}

.beat.on .beat-title{color:var(--ink)}
.beat.on .beat-rail{height:calc(100% - 30px);background:rgba(244,243,236,.10)}
.beat.on .beat-rail::after{animation:beat-fill var(--beat-dur,7.5s) linear forwards}
.beat.on .beat-body{grid-template-rows:1fr;opacity:1;padding-bottom:14px}
@keyframes beat-fill{from{transform:scaleY(0)}to{transform:scaleY(1)}}
.beats[data-paused] .beat.on .beat-rail::after{animation-play-state:paused}
/* 2026-10-27 Dylan: when the sticky-recede engine is live, each pillar card
   stays on screen while the user scrolls through its beats. drawBeats()
   drives --beatFill (0 → 1) per beat; this disables the CSS timer and
   paints the rail directly from scroll position. */
.stack-ready .beat.on .beat-rail::after{
  animation:none;transform-origin:top;transform:scaleY(var(--beatFill, 0))
}
.beat-head:hover .beat-title{color:var(--ink-2)}
.beat.on .beat-head:hover .beat-title{color:var(--ink)}

/* No JS, or reduced motion: every beat open, no rails racing, nothing hidden behind a
   control that is not running. */
@media (prefers-reduced-motion:reduce){
  .beat-body{grid-template-rows:1fr;opacity:1;transition:none}
  .beat-title{color:var(--ink)}
  .beat-rail{height:calc(100% - 30px);background:rgba(244,243,236,.12)}
  .beat-rail::after{animation:none;transform:scaleY(0)}
}
.beats:not([data-ready]) .beat-body{grid-template-rows:1fr;opacity:1}
.beats:not([data-ready]) .beat-title{color:var(--ink)}
.beats:not([data-ready]) .beat-rail{height:calc(100% - 30px)}
.scard .viz{position:relative;display:flex;align-items:center;justify-content:center;padding:clamp(24px,3vw,48px);overflow:hidden}
.scard .viz::before{content:"";position:absolute;inset:auto -20% -35% auto;width:420px;height:420px;border-radius:50%;
  background:radial-gradient(circle,var(--sa-glow,rgba(206,252,151,.13)),transparent 65%)}

/* ============ PROOF ============
   2026-10-26 Dylan: the orbit section fades in and out of the ink body. No hard
   colour change between credband (ends at --bg) and the orbit; no hard change
   from the orbit back into the sticky pillars (--bg at both seams). --bg-deep
   lives in the middle 60% of the section as the darkest point.
   The old 1px top rule + the dead .quote blockquote / figcaption / em selectors
   below (pre-E9 one-quote proof variant) removed in the same pass. */
.proof{padding:clamp(44px,4vw,72px) 0 clamp(36px,3.5vw,60px);
  background:linear-gradient(180deg, var(--bg) 0%, var(--bg-deep) 18%, var(--bg-deep) 82%, var(--bg) 100%)}

/* ============================================================================
   BOOKEND CTA — R2 (E7, 2026-10-23 from PRD-hero-v9-split.md)
   Mirrors the fold: starts on var(--bg) (continues the section above) and grades
   to pure black at the foot. No purple, no ridge, no lime — the same two
   colourless drift fields on .sky as the hero carries, inverted mask so the
   light sits mid-band instead of the top. Sits above the global grain at z-61
   and carries its own grain ::after, full at top and clear at foot so the
   section above meets black with no seam.
   Founder scatter, copy and button are UNCHANGED. (The button becomes Aura via E6.)
   ============================================================================ */
/* 2026-10-27 Dylan: this is the final CTA before the FAQ — we should feel the weight
   of it when we land here. Bumped min-height to 100svh and the dawn-inner top/bottom
   padding so the headline + sub + CTA breathe inside a full-viewport section. */
.dawn{position:relative; min-height:100svh; overflow:hidden; display:flex; align-items:center;
  z-index:61; --glow-x:50%;
  background:linear-gradient(180deg,var(--bg) 0%,#030403 44%,#000 70%,#000 100%)}

/* grain copy, masked full at top, clear at foot */
.dawn::after{content:""; position:absolute; inset:0; z-index:4; pointer-events:none; opacity:.055;
  background-image: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.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
  -webkit-mask:linear-gradient(180deg,#000 0%,transparent 60%,transparent 100%);
  mask:linear-gradient(180deg,#000 0%,transparent 60%,transparent 100%)}

/* sky hosts the two drift fields, inverted mask so they live mid-band */
.dawn .sky{position:absolute; inset:0; z-index:1; overflow:hidden; background:none; pointer-events:none;
  -webkit-mask:linear-gradient(180deg,transparent 6%,#000 38%,#000 62%,transparent 94%);
  mask:linear-gradient(180deg,transparent 6%,#000 38%,#000 62%,transparent 94%)}
.dawn .sky::before,.dawn .sky::after{content:""; position:absolute; border-radius:50%; pointer-events:none; will-change:transform}
.dawn .sky::before{width:80vmax; height:80vmax; left:calc(var(--glow-x) - 40vmax); top:calc(56% - 40vmax);
  background:radial-gradient(closest-side,rgba(255,255,255,.05) 0%,rgba(255,255,255,.02) 42%,transparent 100%);
  animation:hs-drift-a 26s ease-in-out infinite alternate}
.dawn .sky::after{width:56vmax; height:56vmax; left:calc(var(--glow-x) - 10vmax); top:calc(40% - 28vmax);
  background:radial-gradient(closest-side,rgba(255,255,255,.032) 0%,rgba(255,255,255,.012) 48%,transparent 100%);
  animation:hs-drift-b 34s ease-in-out infinite alternate}

/* ===== Dawn horizon arc — same visual grammar as the Direction C callout cards =====
   A wide, flat ellipse whose crisp 1.5px accent-coloured top edge reads as a horizon
   crossing the Dawn section at ~20% from the top. Soft glow blurred above and below
   so the line feels like dawn light breaking the sky, not a hard rule.
   Positioned absolute so it sits above the drift fields but below the content. */
/* 2026-10-25 Dylan: arc moved up to 5% (mobile 4%) so the dead run above it
   shrinks and the spacing between arc and headline balances. Arc now sits
   closer to the credband seam at the top of the Dawn section. */
.dawn-horizon{position:absolute; left:50%; top:5%; transform:translateX(-50%);
  width:min(220%,2400px); height:70%; z-index:2; pointer-events:none;
  border-radius:50%; border-top:1.5px solid rgba(170,249,136,.4);
  box-shadow:0 -12px 48px rgba(170,249,136,.22), 0 -1px 0 rgba(170,249,136,.5);
  /* 2026-10-29 Cian: one arc only. The glow ran round the whole ellipse, so its
     lower half drew a second swoosh behind the CTA. Clip to the top half. */
  clip-path:inset(-80px -80px 50% -80px)}
@media (max-width:920px){
  .dawn-horizon{top:4%; width:min(260%,1800px); height:60%}
}
.dawn-inner{position:relative;z-index:3;width:100%;text-align:center;padding:clamp(180px,22vh,280px) var(--pad) clamp(140px,16vh,200px)}
.dawn .h1{font-size:clamp(34px,4.4vw,58px)}
/* 25 Sep (Dylan): "No one else in the space does that." was the second half of the H2, set in
   the same weight and only dimmed. It is a different claim from the promise above it, so it is
   now its own line — display face, roughly half the headline, still dimmed. */
.dawn-claim{margin:18px auto 0;max-width:22em;font-family:var(--display);font-weight:500;
  font-size:clamp(20px,2.3vw,29px);line-height:1.15;letter-spacing:-.005em;color:var(--ink-3)}
.dawn-sub{margin:22px auto 0;max-width:30em;color:var(--ink-2);font-size:clamp(16px,1.9vw,19px)}

/* ============ FOOTER ============ */
/* 2026-10-26 Dylan: never a solid-colour seam between a section and the footer.
   Fades from --bg (faq's bottom stop) down to --bg-deep over the first 40%, then
   holds --bg-deep. No visible edge where the content ends and the footer begins. */
footer{background:linear-gradient(180deg, var(--bg) 0%, var(--bg-deep) 40%);padding:56px 0 44px}
.foot-row{display:flex;justify-content:space-between;align-items:center;gap:20px;flex-wrap:wrap}
.foot-links{display:flex;gap:26px}
.foot-links a{font-size:14px;color:var(--ink-3);text-decoration:none}
.foot-links a:hover{color:var(--ink)}
/* Bottom rule: legal tag left, social out-links right. Same component on every page. */
.foot-tag{margin-top:34px;display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;
  font-family:var(--body);font-size:11px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3)}
.foot-social{display:flex;align-items:center;gap:6px}
.foot-social a{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  border-radius:999px;color:var(--ink-3);transition:color .2s,background .2s}
.foot-social a:hover{color:var(--ink);background:rgba(244,243,236,.06)}
.foot-social svg{width:18px;height:18px;display:block}

/* ============ RESPONSIVE ============ */
@media (max-width:920px){
  .scard{grid-template-columns:1fr;min-height:0}
  .scard .viz{padding-top:0}
  .sec-head{grid-template-columns:1fr;align-items:start;gap:18px}
    .nav-link{display:none}
  .hero{min-height:0;padding-bottom:26vh}
  .scard-hold{position:static;padding-bottom:22px}
}
@media (prefers-reduced-motion:reduce){
  .rv{opacity:1;transform:none;transition:none}
  .grad{animation:none}
  *{scroll-behavior:auto !important}
}
/* ============ SEPTEMBER REFINEMENT — real product + native scroll ============ */
html{scroll-padding-top:104px}
:root{--sticky-top:104px}
/* 2026-10-27 Dylan: credband is the pattern-setter — 100svh "centralised box".
   Intro + stat cards sit tight together near the top; the dawn arc below
   balances the remaining space instead of a dead middle gap. */
.credband{padding:72px 0 96px;min-height:100svh;display:flex;flex-direction:column;position:relative;overflow:hidden}
.credband > .container{display:flex;flex-direction:column;justify-content:flex-start;flex:1;gap:clamp(48px,7svh,96px);width:100%;position:relative;z-index:2}
/* 2026-10-27 Dylan: a 'dawn' line peeking into the credband foot — pulls the
   eye down into the testimonial orbit below. Same grammar as .dawn-horizon
   (ellipse + top accent + bloom) but anchored to the bottom and mostly off-
   screen. Raised from -62% to -45% so the arc carries more of the lower half
   now that the content is bunched at the top. Width widened to min(400%,5200px)
   so the arc's lateral endpoints land off-screen on wide/ultra-wide monitors
   instead of terminating inside the viewport. */
.cred-horizon{position:absolute;left:50%;bottom:-45%;transform:translateX(-50%);
  width:min(400%,5200px);height:70%;z-index:1;pointer-events:none;
  border-radius:50%;border-top:1.5px solid rgba(170,249,136,.4);
  box-shadow:0 -12px 48px rgba(170,249,136,.22), 0 -1px 0 rgba(170,249,136,.5)}
@media (max-width:920px){
  .cred-horizon{display:none}
}
.pillars{padding-top:96px}
.pillars-head{margin-bottom:60px}
.stackzone{padding-bottom:70px}
/* 2026-10-23 Dylan: visible breathing room between pillar cards on first paint.
   Sticky-recede still works — the margin shows background between cards as a
   gap before/between stacks, not during the full-cover scroll handoff. */
.scard-hold{position:relative;top:auto;padding-bottom:0;margin-bottom:64px;scroll-margin-top:var(--sticky-top)}
.scard{grid-template-columns:.95fr 1.15fr;min-height:520px;transform-origin:center top}
.scard .txt{padding:36px;gap:20px}
.scard .txt p{font-size:17px;line-height:1.55}
.dawn{min-height:76vh}
.dawn-inner{padding:clamp(180px,24vh,260px) var(--pad) clamp(120px,16vh,180px)}
@media(min-width:921px){
  /* 2026-10-23 Dylan: each pillar card gets its own viewport. min-height on the
     hold means the next card never peeks before you've scrolled past the current.
     2026-10-25 Dylan: card was 50+ px below visible centre because the hold was
     100svh tall but pinned at top:var(--sticky-top) (104 px). Subtracting that
     offset from the hold height so the flex-centre lands at the midpoint of the
     ACTUAL visible region, not the full-viewport midpoint. */
  /* 2026-10-27 Dylan: holds are 160svh so the NEXT pillar doesn't rise
     into viewport until the current pillar's beats are consumed.
     2026-10-28 Dylan: layout switched to CSS grid so the card centres in
     the VIEWPORT-VISIBLE portion of the hold when sticky-pinned (row 1 =
     100svh − sticky-top; row 2 = the scroll runway below). */
  .stack-ready .scard-hold{position:sticky;top:var(--sticky-top);
    min-height:calc(160svh - var(--sticky-top));margin-bottom:0;
    display:grid;grid-template-rows:calc(100svh - var(--sticky-top)) auto;
    justify-items:center;padding-top:0}
  .stack-ready .scard-hold > .scard{align-self:center;grid-row:1;width:100%}
  /* 2026-10-27 Dylan: pillar 3 is wrapped in its own position:relative
     container so its position:sticky bounds don't share the stackzone with
     pillars 1+2 (Chrome has a quirk where stacked sticky siblings with the
     same top offset collapse the last one's sticky range to ~0). The
     wrapper's min-height controls how long pillar 3 stays pinned. */
  .pillar-3-wrap{position:relative; min-height:calc(160svh + 80vh)}
  /* 2026-10-29 Cian: ~1300px of dead scroll sat between pillar 3 leaving and the
     Dawn headline. Pillar 3 keeps its full pinned time; only the tail goes: the
     hold's empty runway row (60svh) and the 48vh stackzone pad. */
  .stack-ready .stackzone{padding-bottom:0}
  .stack-ready .pillar-3-wrap{margin-bottom:-60svh}
  .stack-ready .scard{will-change:transform}
  /* explicit z-index stacking so the latest card paints over the previous one
     during the sticky-recede handoff. Pillar 3 is targeted by #id because the
     wrapper makes :nth-of-type(3) no longer match it. */
  .stack-ready .scard-hold{z-index:1}
  .stack-ready .scard-hold:nth-of-type(2){z-index:2}
  .stack-ready #consolidation.scard-hold{z-index:3}
  .stack-ready .pillar-3-wrap{z-index:3;position:relative}
}
@media(max-width:920px){
  .hero{padding-bottom:0}
  .scard{grid-template-columns:1fr;min-height:0}
  .scard .txt{padding:28px}
  .stackzone{padding-bottom:16px}
  .credband{padding:40px 0 64px;min-height:auto;display:block}
  .credband > .container{display:block}
  .dawn{min-height:0}
  .dawn-inner{padding:88px var(--pad)}
}
@media(max-width:540px){
  /* Phone: the links are hidden, so a symmetric 1fr auto 1fr reserves an empty left column
     and squeezes the CTA (measured 95px against a 111px natural width — the label wrapped).
     Collapse the empty cell instead and let the CTA keep its own size. */
  nav{width:calc(100% - 20px);padding:6px 8px;gap:2px;grid-template-columns:auto 1fr auto}
  .nav-wordmark{font-size:15px;gap:6px}
  .nav-cta{font-size:13px;padding:9px 13px}
  .nav-mascot{height:22px}
  .hero-inner{padding:124px 20px 0}
  .h1{font-size:clamp(36px,9.5vw,50px)}
  .hero-sub{font-size:17px}
  .pillars{padding-top:64px}
  .scard .txt{padding:26px}
  .mono-note{font-size:12px;letter-spacing:.08em}
}
@media(prefers-reduced-motion:reduce){
  .motion-ready .rv{opacity:1;transform:none;transition:none}
  .stack-ready .scard-hold{position:static}
  .stack-ready .scard-hold{margin-bottom:32px}
  .stack-ready .stackzone{padding-bottom:16px}
}

/* Approved motion studies, embedded at the same scale as the review.
   22 Sep: frames wear the house glass recipe (hairline + inset top highlight +
   the per-pillar --sa glow behind, same as the mini cards), toggle speaks mono. */
.hs-motion{position:relative;min-width:0;width:100%;margin:0;z-index:1}
.hs-motion-frame{position:relative;aspect-ratio:720/560;overflow:hidden;background:var(--bg);
  border:1px solid rgba(244,243,236,.14);border-radius:16px;
  box-shadow:0 30px 60px -28px rgba(0,0,0,.7),inset 0 1px 0 rgba(244,243,236,.12)}
.scard .hs-motion-frame{border-top:1px solid color-mix(in srgb,var(--sa) 45%,rgba(244,243,236,.14))}
.hs-motion iframe{display:block;width:100%;height:100%;border:0;touch-action:pan-y}
.scard .motion-viz{padding:24px 20px 24px 0}
.stack-grid .hs-motion::before{content:"";position:absolute;inset:auto -18% -28% auto;width:380px;height:380px;
  border-radius:50%;background:radial-gradient(circle,rgba(152,237,254,.12),transparent 65%);pointer-events:none;z-index:-1}
@media(max-width:920px){
  .scard .motion-viz{padding:0 22px 24px}
}
@media(max-width:540px){
  .scard .motion-viz{padding:0 10px 18px}
  .hs-motion-frame{border-radius:12px;aspect-ratio:auto}
  .hs-motion iframe{aspect-ratio:720/560;height:auto}
}
@media(prefers-reduced-motion:reduce){.stack-grid .hs-motion{position:static}}

/* .sr-only — a11y helper kept live for the hero's accessible description paragraph */
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* .hs-hero-video — the Astra "lander-handoff-v2/hero-video.css" chrome (viewport,
   controls, status, download, toggle) was removed 2026-10-25 after the v9 alpha
   hero shipped. v9 is a chromeless full-bleed film handled by valley-pick.js +
   valley-iris.js inside .alpha-hero / .alpha-film — no .hs-hero-video class in
   any src/* page, so these ~22 lines of selectors matched nothing. If a chromed
   fallback player is ever restored, revive from git history (search for
   `hs-hero-video` on main). */

/* ============================================================================
   MOBILE PASS — 2026-10-27 (Dylan). ONE block for every rule, placed last so
   the override intent is unambiguous. Everything below is inside
   @media (max-width:540px) — browsers skip it above 540px, so desktop CSS is
   bit-identical. Earlier narrower-mobile sibling blocks (lines ~907 nav/hero,
   ~944 scard viz, ~614 cred-intro at ≤920) still apply where this block
   doesn't speak.
   ============================================================================ */
@media (max-width:540px){
  /* ---- Nav: 44px CTA tap target (iOS min). Earlier 540 block set 9px padding;
     this nudges the pill height without touching font or layout.
     2026-10-28 Dylan: "Request to join" was reading tight on iPhone — Safari
     sub-pixel rendering at 13 px pinches pair kerning. Zero out tracking and
     force the font's own kern table + optimizeLegibility. */
  .nav-cta{padding:11px 15px;min-height:44px;line-height:1;
    letter-spacing:0;font-feature-settings:"kern" 1;text-rendering:optimizeLegibility;
    /* min-height alone left the label pinned to the top of the 44px pill (9.5px above, 19px below);
       flex centres it. The arrow ::after stays hidden, as on desktop where it has no box. */
    display:inline-flex;align-items:center;justify-content:center}
  .nav-cta::after{display:none}

  /* ---- HERO ---------------------------------------------------------------
     Dylan 2026-10-27: title breaks "Imagine your / sales team / only had / to
     close" because the ≤920 rule caps `.hero .h1` at 14ch. Widen the measure
     and shrink the clamp so "Imagine your sales team" fits on one line at
     320px. The gradient span `only had to close.` is already a display:block,
     so it lands on its own line underneath.
     Order: title → sub → video → CTA → carousel. The CTA lives inside the
     .hero-content wrapper on desktop; display:contents lifts the three text
     grandchildren into .hero-inner so flex `order` can slot .alpha-hero
     between .hero-sub and .hero-cta-row.
     Fit: hero is a one-flick fold on 320×568 — carousel is reachable after a
     single scroll (Dylan q2 2026-10-27). */
  /* .hero gets a tight top pad; the earlier ≤540 rule at ~l.915 sets .hero-inner
     padding:124px 20px 0 which stacks under .hero's own top padding. We zero
     .hero-inner's top pad here so the headline sits ~84 px below the fixed nav
     instead of ~236 px below. */
  .hero{padding:84px 16px 24px}
  .hero-inner.hero-split{display:flex;flex-direction:column;align-items:center;
    text-align:center;gap:0;max-width:420px;margin:0 auto;padding:0}
  .hero-inner{padding:0 16px}
  .hero-split .hero-content{display:contents}
  /* Clamp min dropped from 30→23 so "Imagine your sales team" fits one line at
     320–375 (280–335 px available). Negative letter-spacing tightens the measure
     just enough that at 320 the 23-char line reads ~255 px. At 430 the clamp
     yields 26 px and the second line (gradient span) still falls to its own row
     because `.grad` is display:block. */
  /* letter-spacing eased from -.02em → -.01em because Safari's sub-pixel
     rendering at the clamp-interpolated size (≈24px at 390 wide) was pinching
     a couple of letter pairs. Kerning table + optimizeLegibility enforced so
     the font picks up its proper pair kerning instead of metric spacing. */
  .hero .h1{order:1;max-width:none;font-size:clamp(23px,6.2vw,28px);
    line-height:1.1;letter-spacing:-.01em;margin:0 auto;text-wrap:balance;
    font-feature-settings:"kern" 1;text-rendering:optimizeLegibility}
  .hero .h1 .grad{display:block;margin:0 auto}
  .hero-sub{order:2;max-width:30ch;margin:14px auto 0;text-align:center}
  .alpha-hero{order:3;width:100%;max-width:320px;margin:22px auto 0;justify-self:center}
  .hero .hero-cta-row{order:4;justify-content:center;margin:22px auto 0}
  .hero-logos{margin-top:28px;padding-bottom:16px}

  /* ---- SECTION HEADS — consistent padding + anchoring --------------------
     Dylan 2026-10-27: all mobile section titles share the same clamp, the
     same top rhythm, and the same clear-of-nav. Also fixes the audit's
     pillars-eyebrow-behind-nav (#3) via scroll-margin on each anchor. */
  html{scroll-padding-top:88px}
  #how,#faq,#join{scroll-margin-top:88px}
  .credband{padding:48px 0 56px}
  .cred-intro{margin-bottom:28px}
  /* Clamp min dropped 28→22 because "Booked is only half of it." (24 chars at
     28px display face ≈ 335 px) overflowed the 280 px frame at 320 and read
     as left-shifted. 22 px fits one line and still carries weight; wraps
     naturally on longer section headings (.proof-h, FAQ h2). */
  .cred-h,.proof-h,.faq .section-head .h2{font-size:clamp(22px,6.4vw,30px);
    line-height:1.12;letter-spacing:-.01em;max-width:none;text-align:center;
    text-wrap:balance}
  .dawn h2.h1{font-size:clamp(26px,7vw,32px);line-height:1.1}
  /* The dawn-horizon ellipse is 260% wide and reads as two disconnected green
     slivers when its crest clips the viewport at mobile. Hide the arc; the
     section still carries the sunrise metaphor via its background gradient. */
  .dawn-horizon{display:none}
  .pillars{padding-top:72px}
  .pillars-head{margin-bottom:40px;padding-top:12px}

  /* ---- PILLAR "CALLOUT" CARDS — centred stack (Dylan q1 2026-10-27) -------
     Three cards felt broken (copy left/viz below felt monotone). Centre the
     copy inside the ink card and let the viz sit under it full-width.
     2026-10-28 Dylan: beats themselves still read left-aligned because the
     base .beat-rail is position:absolute left:0. Centre the beat text and
     retire the rail on mobile — the rail's purpose is the fill animation,
     but on mobile the beat body is always open so the fill never runs. */
  .scard-hold{margin-bottom:28px}
  .scard{grid-template-columns:1fr}
  .scard .txt{padding:28px 22px 20px;text-align:center;gap:14px;align-items:center}
  .scard .txt h3{max-width:22ch;margin:0 auto;font-size:clamp(22px,6.4vw,28px);
    line-height:1.15}
  .scard .beats{width:100%;max-width:28ch;margin:0 auto;text-align:center;list-style:none;padding:0}
  .scard .beat-rail{display:none}
  .scard .beat-head{min-height:44px;padding:14px 2px;text-align:center}
  .scard .beat-title{text-align:center}
  .scard .beat-body p{text-align:center;max-width:none;margin-left:auto;margin-right:auto}

  /* 2026-10-27 Dylan edit #4: desktop promoted .proof to 100svh flex-column.
     On mobile the stacked-carousel is its own composition — revert .proof
     to natural flow so the stacked column doesn't get stretched to a tall
     viewport. */
  .proof{min-height:0;display:block}
  .proof > .container{display:block}

  /* ---- TESTIMONIAL ORBIT — stacked carousel ------------------------------
     Replaces the desktop ellipse at mobile (audit blocker #1). The engine
     keeps assigning --px/--py and .is-active; we ignore the coord vars and
     relay out the subtree as a column: planet strip above, active card below,
     chip + arrow row at the bottom. Andy no longer floats because the stat
     panel is a fixed small gap under the quote (margin-top:16px, not auto). */
  .orbit{height:auto;min-height:0;display:flex;flex-direction:column;gap:20px;
    padding:0 16px;touch-action:pan-y}
  .orbit::before,.orbit-ring{display:none}
  .orbit-world{position:static;height:auto;transform:none;transition:none}
  .oc{position:static;width:auto;height:auto;transform:none;opacity:0;
    display:none;pointer-events:auto;transition:opacity .3s ease}
  .oc.is-active{display:block;opacity:1}
  .oc-card{height:auto;padding:22px 20px 18px;border-radius:20px}
  .oc-card::before{font-size:110px;top:-2px;right:16px}
  .oc-who img{width:44px;height:44px}
  .oc-who b{font-size:16px}
  .oc-who i{font-size:13px}
  .oc-quote{font-size:17px;margin:14px 0 18px;line-height:1.35}
  .oc-stat{margin-top:16px;padding:14px 18px;column-gap:16px}
  .oc-num{font-size:52px;line-height:.95}
  .oc-lab{font-size:10.5px}
  .oc-cap{font-size:13px;line-height:1.4}
  .orbit-planets{position:static;display:flex;flex-direction:row;justify-content:center;
    align-items:center;gap:14px;height:auto;order:-1;pointer-events:auto}
  .planet{position:static;width:48px;height:48px;margin:0;transform:none;opacity:1;z-index:auto}
  .planet img{filter:drop-shadow(0 6px 10px rgba(0,0,0,.45))}
  .planet span{display:none}
  /* 2026-10-28 Dylan: the chip + arrow row below the testimonial card ("founder
     toggle") was reading as broken on mobile — greyed-out chip imagery, loose
     spacing, and redundant to the planet strip above. Remove the whole nav
     subtree at ≤540; the engine still auto-cycles through founders every ~7s
     via .orbit-nav.is-auto, and the planet strip above remains tappable. */
  .orbit-nav{display:none}

  /* ---- FOOTER — iOS 44px rows (audit #5, #6) ------------------------------
     Links stack as a column with 44px vertical hit zones; social icons
     padded to 44×44 without changing their 22px glyph size. */
  .foot-row{align-items:flex-start}
  .foot-links{flex-direction:column;gap:0;align-items:flex-start}
  .foot-links a{display:block;padding:12px 0;font-size:15px}
  .foot-tag{margin-top:24px;align-items:flex-start;flex-direction:column;gap:14px}
  .foot-social a{width:44px;height:44px;padding:0}
  .foot-social svg{width:22px;height:22px}
}

/* ============ RHYTHM PASS (2026-10-29, Cian) ============================
   One spacing rhythm down the page on desktop: ~200–240px from the last thing in
   one section to the first thing in the next. Measured before at 1440×900:
   stats→partners 425, partners→how 146, card→dawn 344, dawn→faq 284, faq→footer 227. */
@media (min-width:921px){
  /* credband hugged a full screen with its content at the top: ~370px of empty
     floor. It now hugs its content; the arc is pinned a fixed distance off its
     foot, so it lands between the stats and the testimonials. */
  .credband{min-height:0;padding:72px 0 160px}
  .cred-horizon{bottom:auto;top:calc(100% - 70px)}
  .pillars{padding-top:140px}
  /* dawn: the arc already opens the section, so less run-in above the headline */
  .dawn{min-height:0}
  .dawn-inner{padding:clamp(120px,15vh,150px) var(--pad) clamp(96px,11vh,120px)}
}
@media (max-width:920px){
  /* stats: the centred .v-h layout was still inheriting the side-on grid from the
     older .cred-card phone rule, which pushed each label into a right-hand column */
  .v-h .cred-card{display:flex;flex-direction:column;align-items:center;padding:0}
  .v-h .cred-card .mono-note{align-self:center}
  .cred-grid.v-h{gap:56px}
}
@media (max-width:540px){
  /* hero headline was 23–28px, barely above the sub; give it its weight back and
     a clear line of air under the nav */
  .hero{padding-top:104px}
  .hero .h1{font-size:clamp(28px,8vw,36px);line-height:1.04}
}

/* 2026-10-29 Cian: the Dawn section goes back to plain black — no horizon arc, no
   drifting glow. The pillars' foot stays black too, so the two meet with no band. */
.dawn-horizon,.dawn .sky{display:none}
.dawn{background:#000}
.pillars{background:linear-gradient(180deg, var(--bg) 0%, #000 14%, #000 100%)}

/* 2026-10-29 Cian: stat hover glows popped in instead of fading. The number's glow
   was a filter added from nothing (some browsers snap that), and the hairline swapped
   gradients, which never animate. Now the number's own text glow brightens and the
   hairline keeps its gradient and brightens — both interpolate, on the calm Labs ease. */
.v-h .cred-card .cred-num{filter:none;transition:transform .6s var(--ease),text-shadow .6s var(--ease)}
.v-h .cred-card:hover .cred-num{filter:none;text-shadow:0 0 64px color-mix(in srgb,var(--acc) 62%,transparent)}
.v-h .cred-card .cred-rule{transition:transform .6s var(--ease),filter .6s var(--ease)}
.v-h .cred-card:hover .cred-rule{filter:brightness(1.5);
  background:linear-gradient(90deg,color-mix(in srgb,var(--acc) 85%,white) 0%,var(--acc) 60%,transparent 100%)}
.v-h .cred-card:nth-child(3):hover .cred-rule{
  background:linear-gradient(270deg,color-mix(in srgb,var(--acc) 85%,white) 0%,var(--acc) 60%,transparent 100%)}

/* ============ TESTIMONIALS, ROW (2026-10-29, Cian) ===============================
   The galaxy is retired at every width: the phone composition (orb row above one
   card) is the design. All cards share one grid cell, so the band never changes
   height; the outgoing card blurs away as the next one settles in. The active orb
   comes forward with a hairline countdown ring for the autoplay. Restrained on
   purpose: soft glows, small moves. The engine's coordinate vars are ignored. */
.proof{min-height:0}
.orbit{height:auto;min-height:0;display:flex;flex-direction:column;align-items:center;
  gap:clamp(22px,2.6vw,34px);padding:0 16px;margin-top:clamp(18px,2.4vw,32px);transition:none}
.orbit-ring,.orbit-nav{display:none}
.orbit::before{top:62%;width:min(900px,110vw);height:110%;opacity:.7}
.orbit-world{position:relative;inset:auto;transform:none;transition:none;display:grid;width:min(640px,100%)}
.oc,.oc.is-active{position:relative;left:auto;top:auto;width:auto;height:auto;display:block;grid-area:1/1;
  transform:translateY(10px) scale(.985);opacity:0;filter:blur(8px);visibility:hidden;pointer-events:none;
  transition:opacity .45s var(--ease),filter .45s var(--ease),transform .45s var(--ease),visibility 0s linear .45s}
.oc.is-active{transform:none;opacity:1;filter:none;visibility:visible;pointer-events:auto;
  transition:opacity .7s var(--ease) .12s,filter .7s var(--ease) .12s,transform .7s var(--ease) .12s,visibility 0s}
.oc-card{height:100%}
.oc-stat{margin-top:clamp(18px,2vw,26px)}
@media (min-width:921px){
  .oc-card{padding:clamp(28px,2.6vw,38px) clamp(28px,2.8vw,42px) clamp(24px,2.2vw,32px)}
  .oc-quote{font-size:clamp(20px,1.65vw,24px);letter-spacing:-.02em;line-height:1.32}
}

/* the orb row */
.orbit-planets{position:static;height:auto;order:-1;display:flex;justify-content:center;align-items:center;
  gap:clamp(14px,1.6vw,22px);pointer-events:auto}
.planet,.planet:hover{position:relative;left:auto;top:auto;margin:0;z-index:auto;opacity:1;transform:none;
  width:clamp(48px,4.4vw,60px);height:clamp(48px,4.4vw,60px);border-radius:50%;cursor:pointer;pointer-events:auto}
.planet img{opacity:.5;filter:grayscale(.35) drop-shadow(0 8px 12px rgba(0,0,0,.5));transform:scale(.9);
  transition:opacity .5s var(--ease),filter .5s var(--ease),transform .5s var(--ease)}
.planet:hover img{opacity:.85;filter:grayscale(0) drop-shadow(0 8px 12px rgba(0,0,0,.5));transform:scale(.94)}
.planet.is-active img{opacity:1;filter:grayscale(0) drop-shadow(0 8px 14px rgba(0,0,0,.5)) drop-shadow(0 0 14px color-mix(in srgb,var(--acc) 22%,transparent));transform:none}
.planet span{display:none}
.planet:focus-visible{outline:2px solid var(--accent);outline-offset:4px}
/* countdown: a hairline ring in the partner's colour drawing round the active orb */
@property --ring{syntax:'<number>';inherits:false;initial-value:0}
.planet::after{content:"";position:absolute;inset:-5px;border-radius:50%;pointer-events:none;opacity:0;
  background:conic-gradient(color-mix(in srgb,var(--acc) 80%,white) calc(var(--ring) * 1turn),rgba(244,243,236,.08) 0);
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 1.5px),#000 calc(100% - 1px));
  mask:radial-gradient(farthest-side,transparent calc(100% - 1.5px),#000 calc(100% - 1px));
  transition:opacity .5s var(--ease)}
.planet.is-active::after{opacity:1;--ring:1}
@keyframes orb-ring{from{--ring:0}to{--ring:1}}
.orbit.is-auto .planet.is-active.run::after{animation:orb-ring var(--auto-ms,7000ms) linear forwards}
@media (prefers-reduced-motion:reduce){
  .oc,.oc.is-active{transition:none;filter:none;transform:none}
  .orbit.is-auto .planet.is-active.run::after{animation:none}
}

/* ============ FAQ, COMPACT (2026-10-29, Cian) =====================================
   A small reference band above the footer, not a section of its own: heading
   left, a tight hairline list right on desktop; one column on phones. Same copy. */
.faq{padding:clamp(56px,6vw,88px) 0 clamp(40px,4vw,56px)}
.faq .section-head{text-align:left;margin:0 0 24px}

.faq .section-head .h2,.faq .section-head .h2.rv{margin-top:14px;font-size:clamp(24px,2.3vw,32px);line-height:1.08;max-width:14em}
.faq-list{max-width:none;margin:0;border-top:1px solid rgba(244,243,236,.08)}
.faq-row{border-bottom:1px solid rgba(244,243,236,.08)}
.faq-row>summary{padding:15px 2px;font-size:clamp(16px,1.2vw,18px);letter-spacing:-.02em;gap:20px;color:var(--ink);
  transition:color .3s var(--ease)}
.faq-row>summary:hover{color:color-mix(in srgb,var(--accent) 70%,var(--ink))}
.faq-row>summary::after{width:12px;height:12px;background-size:12px 1.5px,1.5px 12px;transition:transform .35s var(--ease)}
.faq-row[open]>summary::after{background-size:12px 1.5px}
.faq-answer{padding:0 2px 18px;max-width:62ch}
.faq-answer p{font-size:clamp(15px,1.1vw,16px);line-height:1.5}
@media (min-width:921px){
  .faq>.container{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(40px,6vw,96px);align-items:start}
  .faq .section-head{margin:0;position:sticky;top:120px}
}
@media (max-width:920px){
  .faq{padding:48px 0 40px}
  .faq-row>summary{padding:16px 2px;font-size:16px}
}

/* ============ QUIETER (2026-10-29, Cian) ==========================================
   "Pro, slick, a little playful" — every glow and hover reaction stays, at roughly
   half the volume. Values below replace the louder ones set earlier in this file. */
/* buttons: the lime underglow and the spinning ring both drop back */
.btn,.nav-cta{box-shadow:inset 0 1px 0 rgba(244,243,236,.12), 0 10px 28px -16px rgba(170,249,136,.24)}
.btn:hover,.nav-cta:hover{box-shadow:inset 0 1px 0 rgba(244,243,236,.16), 0 12px 30px -14px rgba(170,249,136,.34)}
.btn::before,.nav-cta::before{opacity:.7}
/* stats: softer resting glow, a gentler hover lift and brighten */
.v-h .cred-num{text-shadow:0 0 48px color-mix(in srgb,var(--acc) 20%,transparent)}
.v-h .cred-card:hover .cred-num{transform:translateY(-4px);text-shadow:0 0 56px color-mix(in srgb,var(--acc) 34%,transparent)}
.v-h .cred-card:hover .cred-rule{transform:translateY(-2px);filter:brightness(1.2)}
.cred-horizon{box-shadow:0 -10px 40px rgba(170,249,136,.13), 0 -1px 0 rgba(170,249,136,.35);border-top-color:rgba(170,249,136,.3)}
/* testimonial: the big number and its panel glow less */
.oc-num{filter:drop-shadow(0 0 18px color-mix(in srgb,var(--acc) 24%,transparent))}
.oc-stat{box-shadow:inset 0 1px 0 rgba(255,255,255,.08), 0 22px 44px -30px color-mix(in srgb,var(--acc) 28%,transparent)}
.orbit::before{opacity:.5}
/* card stack: the soft corner glow behind each animation */
.scard .viz::before{opacity:.7}
@media (max-width:640px){
  /* phones: quotes differ a lot in length at this width, so a shared cell left a tall
     empty card for the short ones. Swap cards instead; the incoming one still blurs in. */
  .oc{display:none}
  .oc.is-active{display:block;animation:oc-in .6s var(--ease) both}
  @keyframes oc-in{from{opacity:0;filter:blur(8px);transform:translateY(8px)}to{opacity:1;filter:none;transform:none}}
  .faq .section-head,.faq .section-head .h2,.faq .section-head .h2.rv{text-align:left;margin-left:0;margin-right:0}
}
@media (max-width:640px) and (prefers-reduced-motion:reduce){.oc.is-active{animation:none}}
/* FAQ header centred like every other titled section (pill on the centre line);
   the compact list sits centred beneath it. Overrides the two-column split above. */
.faq>.container{display:block}
.faq .section-head,.faq .section-head .h2,.faq .section-head .h2.rv{text-align:center;margin-left:auto;margin-right:auto;position:static}
.faq .section-head{margin-bottom:clamp(24px,3vw,36px)}
.faq-list{max-width:760px;margin:0 auto}
@media (max-width:640px){.faq .section-head,.faq .section-head .h2,.faq .section-head .h2.rv{text-align:center;margin-left:auto;margin-right:auto}}

/* ============ TESTIMONIALS, DECK (2026-10-29, Cian) ===============================
   Desktop: the cards are a deck. The next two peek beneath the front card, rimmed
   in their partner's colour; drag the front card and it follows (script.js), throw
   it and it leaves the deck that way while the stack moves up. The front card tilts
   a touch toward the cursor with a soft light following it. Quotes arrive word by
   word. Phones keep the simple swap (above) and get the word-by-word quote. */
@media (min-width:921px){
  .orbit-world{padding-bottom:30px}
  .oc[data-depth],.oc.is-active[data-depth]{visibility:visible;filter:none;pointer-events:none;
    transition:transform .75s cubic-bezier(.2,.8,.2,1),opacity .55s var(--ease),filter .55s var(--ease)}
  .oc[data-depth="3"]{opacity:0;transform:translateY(40px) scale(.86);z-index:0;visibility:hidden;
    transition:transform .75s cubic-bezier(.2,.8,.2,1),opacity .4s var(--ease),visibility 0s linear .55s}
  .oc[data-depth="2"]{opacity:.32;transform:translateY(28px) scale(.9);z-index:1}
  .oc[data-depth="1"]{opacity:.6;transform:translateY(14px) scale(.95);z-index:2}
  .oc[data-depth="1"] .oc-card,.oc[data-depth="2"] .oc-card{border-color:color-mix(in srgb,var(--acc) 26%,rgba(255,255,255,.08))}
  .oc[data-depth="0"]{opacity:1;z-index:3;pointer-events:auto;cursor:grab;
    transform:translateX(var(--dx,0px)) rotate(var(--dr,0deg))}
  .oc.is-drag{transition:none;cursor:grabbing}
  /* the card that just left: lifted off the top of the deck, away in the thrown direction */
  .oc.is-leaving[data-depth]{visibility:visible;z-index:4;opacity:0;filter:blur(4px);
    transform:translate(calc(var(--fly,-1) * 46%),-14px) rotate(calc(var(--fly,-1) * 7deg));
    transition:transform .7s cubic-bezier(.3,.6,.2,1),opacity .55s var(--ease),filter .55s var(--ease)}
  .oc-card{transform:perspective(1100px) rotateX(var(--tx,0deg)) rotateY(var(--ty,0deg));
    transition:transform .6s cubic-bezier(.2,.8,.2,1)}
}
/* the light that follows the cursor across the front card */
.oc-card::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;
  background:radial-gradient(460px circle at var(--lx,50%) var(--ly,0%),rgba(255,255,255,.06),transparent 62%);
  transition:opacity .45s var(--ease)}
.oc.is-active .oc-card:hover::after{opacity:1}
/* quotes: words blur in once the band is on screen and each time a card comes forward */
.motion-ready .oc .oc-quote[data-words] .w{transition-delay:0s}
.motion-ready .orbit.in .oc.is-active .oc-quote[data-words] .w{opacity:1;filter:none;transform:none;
  transition-delay:calc(.2s + var(--k) * 22ms)}
@media (prefers-reduced-motion:reduce){
  .oc[data-depth],.oc.is-leaving[data-depth],.oc-card{transition:none}
}
@media (min-width:921px){
  /* scale from the foot so the stack actually peeks out below the front card */
  .oc{transform-origin:50% 100%}
  .oc[data-depth="2"]{opacity:.5;transform:translateY(26px) scale(.9)}
  .oc[data-depth="1"]{opacity:.8;transform:translateY(13px) scale(.95)}
  .oc[data-depth="1"] .oc-card,.oc[data-depth="2"] .oc-card{
    background:linear-gradient(180deg,#0e100d 0%,#090a08 100%);
    border-color:color-mix(in srgb,var(--acc) 38%,rgba(255,255,255,.08))}
}
@media (min-width:921px){
  /* each card hugs its own copy; the deck aligns on its foot so the stack edge holds still */
  .oc{align-self:end}
  .oc-card{height:auto}
}
@media (min-width:921px){ .oc.is-drag[data-depth]{transition:none} }   /* must out-rank the deck transition */

/* ============ TESTIMONIALS, GALAXY (2026-10-29, Cian) =============================
   Desktop: the deck sits at the centre of a slow galaxy — every partner logo on
   three tilted orbits (built by family.js), each ring at its own pace, a faint
   starfield turning with them. The rings are flat planes tipped back 72°; each logo
   counter-spins so it always faces the viewer. Far side recedes under perspective and
   a soft vertical fade; everything passes behind the card. Pointer tilts it a touch. */
.galaxy{display:none}
@media (min-width:921px){
  .proof{overflow:hidden}
  .galaxy{display:block;position:absolute;left:50%;top:50%;width:0;height:0;z-index:0;pointer-events:none;
    perspective:1400px;transform:rotateX(var(--gx,0deg)) rotateY(var(--gy,0deg));transform-style:preserve-3d;
    transition:transform 1.2s cubic-bezier(.2,.8,.2,1)}
  .g-plane{position:absolute;left:0;top:0;transform-style:preserve-3d;transform:rotateX(72deg)}
  .g-ring{position:absolute;left:calc(var(--r) * -1);top:calc(var(--r) * -1);width:calc(var(--r) * 2);height:calc(var(--r) * 2);
    border-radius:50%;border:1px solid rgba(244,243,236,.07);transform-style:preserve-3d;
    animation:g-spin var(--dur) linear infinite;animation-direction:var(--dir);will-change:transform}
  .g-item{position:absolute;left:50%;top:50%;width:0;height:0;transform-style:preserve-3d;
    transform:rotate(var(--a)) translateX(var(--r))}
  .g-face{position:absolute;transform-style:preserve-3d;transform:translate(-50%,-50%);
    animation:g-face var(--dur) linear infinite;animation-direction:var(--dir)}
  .g-face img{display:block;height:calc(18px * var(--s,1));width:auto;opacity:.5;
    padding:9px 14px;box-sizing:content-box;border-radius:999px;
    background:linear-gradient(160deg,rgba(244,243,236,.07),rgba(244,243,236,.02));
    box-shadow:inset 0 0 0 1px rgba(244,243,236,.08),0 10px 24px -14px rgba(0,0,0,.8)}
  .g-stars{position:absolute;left:0;top:0;width:1px;height:1px;border-radius:50%;animation:g-spin 220s linear infinite}
  .galaxy.is-paused .g-ring,.galaxy.is-paused .g-face,.galaxy.is-paused .g-stars{animation-play-state:paused}
  /* far side of the orbits recedes into the dark */
  .galaxy{-webkit-mask:none;mask:none}
  .orbit-world{isolation:isolate}
  .orbit-world::before{content:"";position:absolute;left:50%;top:50%;width:1700px;height:900px;transform:translate(-50%,-56%);
    z-index:0;pointer-events:none;background:radial-gradient(ellipse 50% 46% at 50% 38%,rgba(0,0,0,.55),transparent 70%)}
  .oc{z-index:1}
}
@keyframes g-spin{to{transform:rotate(360deg)}}
/* counter the ring's spin and the plane's tilt so each logo stays upright, facing out */
@keyframes g-face{
  from{transform:translate(-50%,-50%) rotate(calc(-1 * var(--a))) rotateX(-72deg)}
  to  {transform:translate(-50%,-50%) rotate(calc(-1 * var(--a) - 360deg)) rotateX(-72deg)}
}
@media (prefers-reduced-motion:reduce){ .g-ring,.g-face,.g-stars{animation:none!important} }
@media (min-width:921px){
  /* galaxy layer: covers the band, centred on the card, faded softly on all four edges */
  .proof{padding-bottom:clamp(110px,10vw,150px)}
  .proof>.container{position:relative;z-index:1}
  .galaxy-wrap{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;
    -webkit-mask:linear-gradient(180deg,transparent 0%,#000 24%,#000 80%,transparent 100%),linear-gradient(90deg,transparent 0%,#000 14%,#000 86%,transparent 100%);
    -webkit-mask-composite:source-in;
    mask:linear-gradient(180deg,transparent 0%,#000 24%,#000 80%,transparent 100%),linear-gradient(90deg,transparent 0%,#000 14%,#000 86%,transparent 100%);
    mask-composite:intersect}
  .galaxy-wrap .galaxy{top:var(--gcy,60%)}
  .orbit-world::before{display:none}
  .g-face img{opacity:.62}
  /* travelling lights */
  .g-spark i{position:absolute;left:-3px;top:-3px;width:6px;height:6px;border-radius:50%;background:var(--c);
    box-shadow:0 0 10px 2px color-mix(in srgb,var(--c) 55%,transparent)}
  /* cards: back to one height with the stat on the floor, so the card never jumps under the orbs */
  .oc{align-self:stretch}
  .oc-card{height:100%}
  .oc-stat{margin-top:auto}
  .oc-quote{margin-bottom:28px}
}
@media (min-width:921px){
  .g-face img{height:calc(22px * var(--s,1));padding:11px 17px}
  /* a logo whose wordmark is text (Moshi): icon and name share one chip */
  .g-face.has-name{display:flex;align-items:center;gap:8px;padding:11px 17px;border-radius:999px;opacity:.62;
    background:linear-gradient(160deg,rgba(244,243,236,.07),rgba(244,243,236,.02));box-shadow:inset 0 0 0 1px rgba(244,243,236,.08)}
  .g-face.has-name img{padding:0;background:none;box-shadow:none;opacity:1}
  .g-face.has-name span{font:600 calc(20px * var(--s,1))/1 var(--display);letter-spacing:-.02em;color:#C9CCC0;white-space:nowrap}
}

/* ============ POLISH (2026-10-29, Cian) ===========================================
   High-end pass: a headline with presence, one arc too many gone, quieter card rims. */
@media (min-width:921px){
  .hero .h1{font-size:clamp(44px,min(4.5vw,7.2svh),74px)}
}
.cred-horizon{display:none}
.scard{border-top:1px solid color-mix(in srgb,var(--sa) 55%,rgba(244,243,236,.14))}

/* 2026-10-29 Cian: Dawn sits above the page grain (z 61 > 60) and carried its own grain
   copy faded out toward its foot, so it ended grain-free while the FAQ below had the full
   grain: a visible grey seam. Keep Dawn's grain at full strength to its foot so both sides
   match. Then mark the change of section on purpose: a fine hairline the width of the FAQ
   list, fading out at both ends, with a little more air either side. */
.dawn::after{-webkit-mask:none;mask:none}
.faq{padding-top:clamp(64px,7vw,104px)}
.faq::before{content:"";position:absolute;left:50%;top:0;transform:translateX(-50%);
  width:min(760px,calc(100% - 2 * var(--pad)));height:1px;pointer-events:none;
  background:linear-gradient(90deg,transparent 0%,rgba(244,243,236,.14) 30%,rgba(244,243,236,.2) 50%,rgba(244,243,236,.14) 70%,transparent 100%)}

/* ============ TESTIMONIALS, GALAXY v2 (2026-10-29, Cian) ==========================
   Rebuilt flat: no perspective, no 3D — so no skewed chips and no soft text. The plane
   is squashed to an ellipse (scaleY .34); each chip's own timeline both carries it round
   its orbit and counters the squash, scaling it up and brightening it as it passes the
   front (bottom) of the orbit and down and dimmer at the back (top). Same --ph phase
   offsets both timelines so the two stay locked. Replaces the 3D rules above. */
@media (min-width:921px){
  .galaxy{perspective:none;transform:translate(var(--px,0px),var(--py,0px));transform-style:flat;
    transition:transform 1.4s cubic-bezier(.2,.8,.2,1),opacity 1.2s var(--ease);opacity:0}
  .galaxy.is-on{opacity:1}
  .g-plane{transform:scaleY(.34);transform-style:flat}
  .g-ring{animation:none;transform-style:flat;border:0;
    box-shadow:inset 0 0 0 1px rgba(244,243,236,.06)}
  .g-item{position:absolute;left:0;top:0;width:0;height:0;transform-style:flat;
    animation:g-orbit var(--dur) linear infinite;animation-delay:calc(var(--ph) * var(--dur) * -1);will-change:transform}
  .g-face{position:absolute;left:0;top:0;transform-style:flat;
    animation:g-depth var(--dur) linear infinite;animation-delay:calc(var(--ph) * var(--dur) * -1);will-change:transform,opacity}
  .galaxy.is-paused .g-item,.galaxy.is-paused .g-face{animation-play-state:paused}

  /* the pill: one height, the logo optically centred, nothing spills */
  .g-chip{position:absolute;left:0;top:0;transform:translate(-50%,-50%);display:flex;align-items:center;justify-content:center;gap:8px;
    height:40px;padding:0 18px;border-radius:999px;white-space:nowrap;overflow:hidden;
    background:linear-gradient(180deg,rgba(244,243,236,.075),rgba(244,243,236,.025));
    box-shadow:inset 0 1px 0 rgba(244,243,236,.1),inset 0 0 0 1px rgba(244,243,236,.07),0 12px 28px -16px rgba(0,0,0,.9);
    -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
  .g-chip img{display:block;flex:none;padding:0;background:none;box-shadow:none;opacity:.86;object-fit:contain}
  .g-chip span{font:600 15px/1 var(--display);letter-spacing:-.02em;color:#D3D6CB}
  .g-dot{position:absolute;left:-3px;top:-3px;width:6px;height:6px;border-radius:50%;background:var(--c);
    box-shadow:0 0 10px 2px color-mix(in srgb,var(--c) 50%,transparent)}
  .g-face img:not(.g-chip img){height:auto}
}
/* one lap of the orbit; the inner rotate cancels the outer so the chip never turns */
@keyframes g-orbit{
  from{transform:rotate(0deg) translateX(var(--r)) rotate(0deg)}
  to  {transform:rotate(360deg) translateX(var(--r)) rotate(-360deg)}
}
/* undo the plane's squash (1/.34 = 2.94) and add depth: 25% = front of the orbit */
@keyframes g-depth{
  0%  {transform:scale(.86,2.53);opacity:.62}
  25% {transform:scale(1,2.94);opacity:1}
  50% {transform:scale(.86,2.53);opacity:.62}
  75% {transform:scale(.72,2.12);opacity:.3}
  100%{transform:scale(.86,2.53);opacity:.62}
}
@media (prefers-reduced-motion:reduce){ .g-item,.g-face{animation-play-state:paused!important} }
@media (min-width:921px){ .g-chip{-webkit-backdrop-filter:none;backdrop-filter:none} }  /* glass blur on 21 chips under a mask smeared the card above them */

/* ============ HOW IT WORKS CARDS, LIT (2026-10-29, Cian) ===========================
   The testimonial card's light, brought to the pillar cards. Each card's own colour
   (--sa: green / purple / cyan) pools softly from the top centre, with the top edge
   drawn as a fine line of that colour fading out to the corners. A faint coloured glow
   sits under the card. On hover a soft light follows the cursor (family.js sets
   --lx/--ly), the top wash lifts a touch and the under-glow deepens. No hover transform:
   the stack script owns the card's transform. All quiet on purpose. */
.scard{border-top-color:rgba(244,243,236,.1);
  box-shadow:0 40px 80px -30px rgba(0,0,0,.75),inset 0 1px 0 rgba(244,243,236,.06),
    0 50px 110px -70px color-mix(in srgb,var(--sa) 32%,transparent);
  transition:box-shadow .6s var(--ease),border-color .6s var(--ease)}
.scard>.txt,.scard>.viz{position:relative;z-index:1}
.scard::before{content:"";position:absolute;left:0;right:0;top:0;height:min(260px,60%);z-index:0;pointer-events:none;
  background:
    linear-gradient(90deg,transparent 4%,color-mix(in srgb,var(--sa) 75%,transparent) 50%,transparent 96%) 0 0/100% 1px no-repeat,
    radial-gradient(55% 100% at 50% 0%,color-mix(in srgb,var(--sa) 13%,transparent) 0%,transparent 72%);
  opacity:.85;transition:opacity .6s var(--ease)}
.scard::after{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;border-radius:inherit;opacity:0;
  background:radial-gradient(520px circle at var(--lx,50%) var(--ly,0%),rgba(255,255,255,.045),transparent 62%);
  transition:opacity .5s var(--ease)}
@media (hover:hover) and (pointer:fine){
  .scard:hover{border-color:rgba(244,243,236,.18);
    box-shadow:0 40px 80px -30px rgba(0,0,0,.75),inset 0 1px 0 rgba(244,243,236,.08),
      0 50px 120px -64px color-mix(in srgb,var(--sa) 46%,transparent)}
  .scard:hover::before{opacity:1}
  .scard:hover::after{opacity:1}
}
/* 2026-10-29 Cian: "far too much glow" — the under-glow flooded the space below each
   card. Now a whisper: tighter, about a third of the strength, a small lift on hover. */
.scard{box-shadow:0 40px 80px -30px rgba(0,0,0,.75),inset 0 1px 0 rgba(244,243,236,.06),
  0 30px 70px -56px color-mix(in srgb,var(--sa) 12%,transparent)}
@media (hover:hover) and (pointer:fine){
  .scard:hover{box-shadow:0 40px 80px -30px rgba(0,0,0,.75),inset 0 1px 0 rgba(244,243,236,.08),
    0 30px 70px -52px color-mix(in srgb,var(--sa) 18%,transparent)}
}

/* ============ RHYTHM, ROUND 2 (2026-10-29, Cian) =================================
   Three loose joins tightened to ~150px: stats → "What partners say" (the room kept
   for the old arc), the deck → "How it works" (galaxy room + pillars padding stacked),
   and the "How it works" pill → first card (the card centres in its pinned viewport
   row, so it sat ~130px below its slot; pull the stack up by that offset). */
@media (min-width:921px){
  .credband{padding-bottom:96px}
  .proof{padding-bottom:64px}
  .pillars{padding-top:88px}
  .pillars-head{margin-bottom:28px}
  /* (row height − card height) / 2, with the card at ~540px; keeps ~48px under the pill
     at any viewport height while the pinned card still centres when it sticks */
  .stack-ready .stackzone{margin-top:calc((540px - 100svh + var(--sticky-top)) / 2 + 20px)}
  /* the stacked cards' edges: a softer rim so the peek reads as depth, not a line */
  .oc[data-depth="1"] .oc-card,.oc[data-depth="2"] .oc-card{border-color:color-mix(in srgb,var(--acc) 22%,rgba(255,255,255,.05))}
}
@media (min-width:921px){
  /* last card → "We get paid" and "We get paid" → FAQ onto the same ~170px rhythm */
  .dawn-inner{padding:clamp(40px,5vh,56px) var(--pad) clamp(72px,8vh,88px)}
}
@media (max-width:920px){ .dawn-inner{padding-bottom:56px} .faq{padding-top:56px} }   /* phone: Dawn → FAQ onto the ~110px rhythm */

/* ============ BEAT LINES, LIT (2026-10-29, Cian) ==================================
   As you scroll, each beat's line fills in the card's colour; the fill now carries a
   soft glow, and a small bright point rides its leading edge, fading out once the beat
   is complete (--beatFill, 0→1, is set per beat by script.js). Quiet on purpose. */
@media (min-width:921px){
  .beat-rail{overflow:visible}
  .beat-rail::after{box-shadow:0 0 10px 0 color-mix(in srgb,var(--sa,var(--accent)) 45%,transparent)}
  .stack-ready .beat.on .beat-rail::before{content:"";position:absolute;left:50%;z-index:1;width:6px;height:6px;border-radius:50%;
    top:calc(var(--beatFill,0) * 100%);transform:translate(-50%,-50%);pointer-events:none;
    background:color-mix(in srgb,var(--sa,var(--accent)) 55%,#fff);
    box-shadow:0 0 8px 2px color-mix(in srgb,var(--sa,var(--accent)) 55%,transparent);
    opacity:clamp(0, min((1 - var(--beatFill,0)) * 8, var(--beatFill,0) * 30), 1)}
}
@media (prefers-reduced-motion:reduce){ .stack-ready .beat.on .beat-rail::before{display:none} }

/* galaxy: the featured partner's logo lifts a little out of its orbit, brightens and
   takes a soft rim in their colour (family.js toggles .is-featured with --fc). Uses
   `translate`/`scale` so it layers on the chip's centring transform. */
@media (min-width:921px){
  .g-chip{transition:translate .8s cubic-bezier(.2,.8,.2,1),scale .8s cubic-bezier(.2,.8,.2,1),box-shadow .8s var(--ease),background .8s var(--ease)}
  .g-chip img,.g-chip span{transition:opacity .8s var(--ease)}
  .g-chip.is-featured{translate:0 -14px;scale:1.12;
    background:linear-gradient(180deg,color-mix(in srgb,var(--fc) 14%,rgba(244,243,236,.06)),rgba(244,243,236,.03));
    box-shadow:inset 0 1px 0 rgba(244,243,236,.14),inset 0 0 0 1px color-mix(in srgb,var(--fc) 45%,transparent),
      0 10px 26px -12px color-mix(in srgb,var(--fc) 40%,transparent)}
  .g-chip.is-featured img{opacity:1}
}
@media (prefers-reduced-motion:reduce){ .g-chip{transition:none} }

/* ============ SECTIONS AS FRAMES (2026-10-29, Cian) ===============================
   Desktop: a nav click lands a section exactly at the top of the screen — no slice of
   the section before it (the page-wide 104px scroll padding used to leave one showing).
   Each target section carries enough top padding to clear the floating nav itself.
   Results is a full-screen frame with its content centred, so the next section never
   peeks in below. FAQ lands with the footer beneath it, the end of the page. The card
   holds keep their own scroll-margin for the pinned stack. */
@media (min-width:921px){
  html{scroll-padding-top:0}
  .credband{min-height:100svh;display:flex;flex-direction:column;justify-content:center;padding:112px 0 72px}
  .credband>.container{flex:none}
  .pillars{padding-top:120px}
  .faq{padding-top:clamp(112px,13svh,140px)}
}
@media (min-width:921px){
  /* the cards' pinning runway overlaps Dawn by 60svh; Dawn must be at least that tall or
     the (invisible) runway spills over the top of the FAQ */
  .dawn{min-height:calc(60svh + 32px)}
}

/* ============ RESULTS, LIT CARDS (2026-10-29, Cian) ===============================
   The stats sat as flat text while everything around them lives in lit glass. Each
   is now a card in the pillar-card language: glass body, its colour pooling softly
   from the top with a fine top edge fading to the corners; the label as a small
   tinted pill; the figure in the testimonial's white-to-colour gradient (still counts
   up). Hover: a 3px lift, a soft light that follows the cursor, the wash brightens.
   The loose underline goes — the lit top edge does its job. Same words, same figures. */
.v-h .cred-card{position:relative;overflow:hidden;isolation:isolate;display:flex;flex-direction:column;align-items:flex-start;text-align:left;
  padding:clamp(26px,2.4vw,36px) clamp(24px,2.4vw,34px) clamp(26px,2.4vw,34px);border-radius:22px;
  border:1px solid rgba(244,243,236,.09);
  background:linear-gradient(170deg,rgba(244,243,236,.045) 0%,rgba(244,243,236,.015) 45%,rgba(0,0,0,.2) 100%);
  box-shadow:inset 0 1px 0 rgba(244,243,236,.07),0 40px 70px -46px rgba(0,0,0,.9)}
.v-h .cred-card.rv.in{transition:opacity 1s var(--ease),filter 1s var(--ease),transform 1s var(--ease),
  translate .6s cubic-bezier(.2,.8,.2,1),border-color .6s var(--ease),box-shadow .6s var(--ease)}
/* colour wash + top edge */
.v-h .cred-card::before{display:block;content:"";position:absolute;left:0;right:0;top:0;height:70%;z-index:-1;pointer-events:none;
  background:
    linear-gradient(90deg,transparent 6%,color-mix(in srgb,var(--acc) 75%,transparent) 50%,transparent 94%) 0 0/100% 1px no-repeat,
    radial-gradient(70% 90% at 50% 0%,color-mix(in srgb,var(--acc) 11%,transparent) 0%,transparent 72%);
  opacity:.8;transition:opacity .6s var(--ease)}
/* the light that follows the cursor (family.js sets --lx/--ly) */
.v-h .cred-card::after{display:block;content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;opacity:0;
  background:radial-gradient(380px circle at var(--lx,50%) var(--ly,0%),rgba(255,255,255,.05),transparent 62%);
  transition:opacity .5s var(--ease)}
/* label as a small tinted pill */
.v-h .cred-card .mono-note{align-self:flex-start;display:inline-flex;align-items:center;padding:6px 12px;border-radius:999px;
  font-size:13.5px;letter-spacing:-.005em;font-weight:500;color:color-mix(in srgb,var(--acc) 85%,white);
  background:color-mix(in srgb,var(--acc) 9%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--acc) 22%,transparent)}
/* the figure: testimonial gradient, a soft glow defined in both states so it fades */
.v-h .cred-num,.v-h .cred-card .cred-num{margin:clamp(22px,2.4vw,32px) 0 clamp(14px,1.6vw,20px);font-size:clamp(60px,6.4vw,96px);line-height:.92;
  font-weight:500;letter-spacing:-.05em;font-variant-numeric:tabular-nums;text-shadow:none;
  background:linear-gradient(180deg,#FFFFFF 12%,color-mix(in srgb,var(--acc) 55%,white) 62%,color-mix(in srgb,var(--acc) 90%,white) 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 0 22px color-mix(in srgb,var(--acc) 16%,transparent));
  transition:filter .6s var(--ease)}
.v-h .cred-rule{display:none}
.v-h .cred-sub,.v-h .cred-card .cred-sub{margin:auto 0 0;max-width:30ch;color:rgba(242,242,233,.62)}
@media (hover:hover) and (pointer:fine){
  .v-h .cred-card:hover{translate:0 -3px;border-color:rgba(244,243,236,.15);
    box-shadow:inset 0 1px 0 rgba(244,243,236,.09),0 44px 80px -46px rgba(0,0,0,.95),0 30px 70px -56px color-mix(in srgb,var(--acc) 16%,transparent)}
  .v-h .cred-card:hover::before{opacity:1}
  .v-h .cred-card:hover::after{opacity:1}
  .v-h .cred-card:hover .cred-num{transform:none;text-shadow:none;filter:drop-shadow(0 0 26px color-mix(in srgb,var(--acc) 26%,transparent))}
}
@media (min-width:921px){
  .cred-grid.v-h{gap:clamp(18px,1.8vw,26px);align-items:stretch}
}
@media (max-width:920px){
  .cred-grid.v-h{gap:14px}
  .v-h .cred-card{align-items:flex-start;text-align:left;padding:24px 22px}
  .v-h .cred-card .mono-note{align-self:flex-start}
  .v-h .cred-num,.v-h .cred-card .cred-num{font-size:clamp(56px,16vw,76px);margin:18px 0 12px}
}
@media (prefers-reduced-motion:reduce){ .v-h .cred-card{translate:none!important} }

/* ============ RESULTS, ROUND 2 (2026-10-29, Cian) =================================
   Layout: the figure leads, then the label as the bright line and the caption soft
   beneath — the Labs bright/soft pattern used across the site — instead of
   pill / figure / caption. Brand: the slow light that travels round the buttons and
   the testimonial panel now circles each card's rim, faint and in the card's colour
   (the spare .cred-rule element carries it), each card starting at a different point. */
.v-h .cred-card .cred-num{order:-1;margin:0 0 clamp(18px,2vw,26px)}
.v-h .cred-card .mono-note{align-self:flex-start;display:block;padding:0;border-radius:0;background:none;box-shadow:none;
  font-size:clamp(17px,1.3vw,19px);font-weight:500;line-height:1.3;color:var(--ink)}
.v-h .cred-card .mono-note::before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;margin:0 10px 2px 0;vertical-align:middle;
  background:var(--acc);box-shadow:0 0 10px color-mix(in srgb,var(--acc) 60%,transparent)}
.v-h .cred-sub,.v-h .cred-card .cred-sub{margin:10px 0 0;font-size:clamp(16px,1.15vw,17.5px);line-height:1.45;color:rgba(242,242,233,.56)}
.v-h .cred-card .cred-rule,.v-h .cred-card:nth-child(3) .cred-rule{display:block;position:absolute;inset:0;z-index:1;margin:0;width:auto;height:auto;border-radius:inherit;padding:1px;
  pointer-events:none;transform:none;filter:none;opacity:.5;--btn-a:0deg;
  background:conic-gradient(from var(--btn-a),transparent 0turn,color-mix(in srgb,var(--acc) 70%,transparent) .08turn,#F6F8F1 .12turn,
    color-mix(in srgb,var(--acc) 70%,transparent) .16turn,transparent .3turn,transparent 1turn);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;
  animation:btn-spin 11s linear infinite}
.v-h .cred-card:nth-child(2) .cred-rule{animation-delay:-3.7s}
.v-h .cred-card:nth-child(3) .cred-rule{animation-delay:-7.3s}
.v-h .cred-card:hover .cred-rule,.v-h .cred-card:nth-child(3):hover .cred-rule{transform:none;filter:none;opacity:.8;
  background:conic-gradient(from var(--btn-a),transparent 0turn,color-mix(in srgb,var(--acc) 70%,transparent) .08turn,#F6F8F1 .12turn,
    color-mix(in srgb,var(--acc) 70%,transparent) .16turn,transparent .3turn,transparent 1turn)}
@media (prefers-reduced-motion:reduce){ .v-h .cred-card .cred-rule{animation:none;opacity:.3} }
/* natural letter spacing widened the lede a touch; give it room to stay on one line,
   and balance it if a narrow screen does wrap it (no orphaned "it lands.") */
.cred-lede{max-width:40em;text-wrap:balance}

/* ============ RESULTS, OPEN COLUMNS (2026-10-29, Cian — chosen over cards and a rail) ==
   No boxes: three columns divided by fine hairlines that fade at both ends, bigger
   figures each with a soft glow of its own colour behind, centred in the column. */
/* shared: strip the card chrome */
.cred-grid.alt-cols .cred-card{background:none;border:0;box-shadow:none;border-radius:0;overflow:visible;translate:none!important}
.cred-grid.alt-cols .cred-card::before,.cred-grid.alt-cols .cred-card::after,.cred-grid.alt-cols .cred-card .cred-rule{display:none}

/* A — open columns: fine vertical hairlines between, bigger figures, a soft colour
   glow behind each figure, everything centred in its column */
@media (min-width:921px){
  .cred-grid.alt-cols{gap:0}
  .cred-grid.alt-cols .cred-card{align-items:center;text-align:center;padding:12px clamp(24px,3vw,56px) 8px}
  .cred-grid.alt-cols .cred-card+.cred-card{border-left:1px solid;border-image:linear-gradient(180deg,transparent,rgba(244,243,236,.14) 30%,rgba(244,243,236,.14) 70%,transparent) 1}
  .cred-grid.alt-cols .cred-card .cred-num{font-size:clamp(84px,8.4vw,128px);position:relative}
  .cred-grid.alt-cols .cred-card .mono-note{align-self:center}
  .cred-grid.alt-cols .cred-card .cred-sub{margin-left:auto;margin-right:auto;max-width:26ch}
  .cred-grid.alt-cols .cred-card .cred-num::after{content:none}
  .cred-grid.alt-cols .cred-card{background:radial-gradient(48% 34% at 50% 26%,color-mix(in srgb,var(--acc) 9%,transparent),transparent 70%)}
}



/* ============ WE GET PAID, ON STAGE (2026-10-29, Cian) ===========================
   The close of the page gets its own stage: a large glass panel inset from the
   edges (which separates it cleanly from the cards above and the FAQ below), the
   brand light travelling slowly round its rim, a faint green→blue→purple light
   rising from its floor, and a bigger headline with "what you close." in the hero's
   moving brand gradient. Restrained glow, on purpose. */
.dawn{align-items:center;justify-content:center}
.dawn-inner,.dawn .dawn-inner{position:relative;isolation:isolate;overflow:hidden;z-index:3;
  width:min(1120px,calc(100% - 2 * var(--pad)));margin:0 auto;border-radius:36px;
  padding:clamp(72px,8vw,116px) clamp(28px,5vw,80px) clamp(64px,7vw,100px);
  background:linear-gradient(180deg,rgba(244,243,236,.035),rgba(244,243,236,.01) 60%,rgba(244,243,236,.02));
  border:1px solid rgba(244,243,236,.08);
  box-shadow:inset 0 1px 0 rgba(244,243,236,.08),0 60px 120px -70px rgba(0,0,0,.95)}
.dawn-inner::before{content:"";position:absolute;left:0;right:0;bottom:0;height:70%;z-index:-1;pointer-events:none;
  background:radial-gradient(55% 60% at 50% 112%,rgba(206,252,151,.13) 0%,rgba(152,237,254,.07) 38%,rgba(180,149,248,.05) 58%,transparent 76%)}
.dawn-inner::after{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;border-radius:inherit;padding:1px;opacity:.55;--btn-a:0deg;
  background:conic-gradient(from var(--btn-a),transparent 0turn,rgba(206,252,151,.6) .07turn,#F6F8F1 .11turn,rgba(152,237,254,.6) .15turn,rgba(180,149,248,.5) .2turn,transparent .32turn,transparent 1turn);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;
  animation:btn-spin 14s linear infinite}
.dawn-inner>*{position:relative;z-index:1}
.dawn .h1{font-size:clamp(44px,6vw,92px);line-height:1}
.dawn .h1 .grad{display:inline-block}
@media (max-width:920px){
  .dawn-inner,.dawn .dawn-inner{width:calc(100% - 32px);border-radius:26px;padding:64px 22px 56px}
  .dawn .h1{font-size:clamp(34px,9vw,46px)}
}
@media (prefers-reduced-motion:reduce){ .dawn-inner::after{animation:none} }
@media (min-width:921px){ .dawn .dawn-inner .h1{font-size:clamp(52px,6.2vw,92px)} }

/* ============ FAQ, SMALLER STILL (2026-10-29, Cian) ===============================
   A quiet reference block above the footer: smaller heading, 15px questions on
   tighter rows, a narrower list, less padding. Same questions and answers. */
.faq{padding-bottom:clamp(36px,4vw,52px)}
@media (min-width:921px){ .faq{padding-top:clamp(84px,10svh,112px)} }
.faq .section-head{margin-bottom:20px}
.faq .section-head .h2,.faq .section-head .h2.rv{font-size:clamp(20px,1.8vw,26px);margin-top:12px;max-width:22em}
.faq-list{max-width:640px}
.faq-row>summary{padding:12px 2px;font-size:15px;gap:16px}
.faq-row>summary::after{width:10px;height:10px;background-size:10px 1.5px,1.5px 10px}
.faq-row[open]>summary::after{background-size:10px 1.5px}
.faq-answer{padding:0 2px 14px}
.faq-answer p{font-size:14.5px;line-height:1.55}
@media (min-width:921px){ .faq{padding-top:112px} }   /* pill sits ~34px clear of the nav when FAQ is clicked */
/* open columns, phone: the three stats stack centred, no boxes, divided by fine
   horizontal hairlines fading at both ends (the desktop dividers turned on their side) */
@media (max-width:920px){
  .cred-grid.alt-cols{gap:0}
  .cred-grid.alt-cols .cred-card{align-items:center;text-align:center;padding:30px 8px;
    background:radial-gradient(60% 40% at 50% 30%,color-mix(in srgb,var(--acc) 9%,transparent),transparent 72%)}
  .cred-grid.alt-cols .cred-card+.cred-card{border-top:1px solid;border-image:linear-gradient(90deg,transparent,rgba(244,243,236,.14) 30%,rgba(244,243,236,.14) 70%,transparent) 1}
  .cred-grid.alt-cols .cred-card .mono-note{align-self:center}
  .cred-grid.alt-cols .cred-card .cred-sub{margin-left:auto;margin-right:auto;max-width:28ch}
  .cred-grid.alt-cols .cred-card .cred-num{font-size:clamp(64px,19vw,84px)}
}
.cred-grid.alt-cols .cred-card .cred-sub{text-wrap:balance}   /* no orphaned "won" */

/* ============ RESULTS, ALIVE (2026-10-29, Cian) ==================================
   Open columns with a pulse. Each column's glow now lives on its own layer: it
   breathes slowly (staggered so the three never pulse together) and, on hover,
   drifts toward the cursor (--gx/--gy, registered so it glides) and brightens. The
   hovered column comes forward — figure lifts, glow deepens — while its neighbours
   soften back, the way the nav does. The label dot keeps a soft heartbeat. The digit
   roll on hover is in family.js. All quiet; nothing changes width. */
@property --gx{syntax:'<percentage>';inherits:false;initial-value:50%}
@property --gy{syntax:'<percentage>';inherits:false;initial-value:26%}
.cred-grid.alt-cols .cred-card{position:relative;isolation:isolate;background:none;
  transition:opacity .5s var(--ease),--gx .9s cubic-bezier(.2,.8,.2,1),--gy .9s cubic-bezier(.2,.8,.2,1)}
.cred-grid.alt-cols .cred-card::before{display:block;content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:radial-gradient(52% 38% at var(--gx) var(--gy),color-mix(in srgb,var(--acc) 12%,transparent),transparent 72%);
  opacity:.65;animation:col-breathe 7s ease-in-out infinite;transition:opacity .6s var(--ease)}
.cred-grid.alt-cols .cred-card:nth-child(2)::before{animation-delay:-2.3s}
.cred-grid.alt-cols .cred-card:nth-child(3)::before{animation-delay:-4.6s}
@keyframes col-breathe{0%,100%{opacity:.5}50%{opacity:.85}}
.cred-grid.alt-cols .cred-card .cred-num{transition:translate .6s cubic-bezier(.2,.8,.2,1),filter .6s var(--ease)}
.cred-grid.alt-cols .cred-card .mono-note::before{animation:dot-beat 3.2s ease-in-out infinite}
.cred-grid.alt-cols .cred-card:nth-child(2) .mono-note::before{animation-delay:-1.1s}
.cred-grid.alt-cols .cred-card:nth-child(3) .mono-note::before{animation-delay:-2.2s}
@keyframes dot-beat{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--acc) 0%,transparent),0 0 8px color-mix(in srgb,var(--acc) 50%,transparent)}
  50%{box-shadow:0 0 0 5px color-mix(in srgb,var(--acc) 14%,transparent),0 0 12px color-mix(in srgb,var(--acc) 70%,transparent)}}
@media (hover:hover) and (pointer:fine){
  .cred-grid.alt-cols:hover .cred-card:not(:hover){opacity:.5}
  .cred-grid.alt-cols .cred-card:hover::before{animation-play-state:paused;opacity:1;
    background:radial-gradient(52% 38% at var(--gx) var(--gy),color-mix(in srgb,var(--acc) 18%,transparent),transparent 72%)}
  .cred-grid.alt-cols .cred-card:hover .cred-num{translate:0 -5px;filter:drop-shadow(0 0 30px color-mix(in srgb,var(--acc) 30%,transparent))}
}
@media (prefers-reduced-motion:reduce){
  .cred-grid.alt-cols .cred-card::before,.cred-grid.alt-cols .cred-card .mono-note::before{animation:none}
}
.cred-grid.alt-cols .cred-card.rv.in{transition:opacity .5s var(--ease),filter 1s var(--ease),transform 1s var(--ease),
  --gx .9s cubic-bezier(.2,.8,.2,1),--gy .9s cubic-bezier(.2,.8,.2,1)}
/* the figure's box is fixed at its final width (script.js); digits sit from its left
   edge so a narrower digit mid-count or mid-roll leaves air at the end, never shifts */
.cred-grid.alt-cols .cred-card .cred-num{text-align:left;overflow:visible}
/* 2026-10-29 Cian: hover is a glow, nothing more — no digit roll, no lift, no dimming
   of the other columns. The column's glow brightens softly and the figure takes a
   faint halo in its colour; both fade in and out. */
@media (hover:hover) and (pointer:fine){
  .cred-grid.alt-cols:hover .cred-card:not(:hover){opacity:1}
  .cred-grid.alt-cols .cred-card .cred-num,.cred-grid.alt-cols .cred-card:hover .cred-num{translate:none}
  .cred-grid.alt-cols .cred-card .cred-num{filter:drop-shadow(0 0 0 transparent)}
  .cred-grid.alt-cols .cred-card:hover .cred-num{filter:drop-shadow(0 0 22px color-mix(in srgb,var(--acc) 22%,transparent))}
  .cred-grid.alt-cols .cred-card:hover::before{background:radial-gradient(52% 38% at 50% 26%,color-mix(in srgb,var(--acc) 16%,transparent),transparent 72%)}
}

/* ============ 2026-11-04 Dylan: three fixes from the copy-sync review ============
   1) Hero headline: "Imagine your sales team" back on one line (his 28 Oct rule).
      Cian's 29 Oct polish (POLISH block above) grew the headline to min(4.5vw,7.2svh),
      74px max, without widening the text column (--tw: 42vw, 680px max), so the line
      wrapped at 1440x900, 1512x982, 1728x1117 and 1920x1080. The line measures 9.8x its
      font size, so 4.25vw with a 69px cap always fits the column. Still larger than the
      pre-polish 3.95vw / 68px. Floor 44 -> 40px so 921-1030px wide windows fit too.
      nowrap is the backstop: sized to fit with 3-5px spare, so a browser rendering the
      font a pixel wider can't drop "sales team" to a second line. */
@media (min-width:921px){
  .hero .h1{font-size:clamp(40px,min(4.25vw,7.2svh),69px);white-space:nowrap}
}
@media (max-width:540px){
  /* 2) Testimonial stat on phones: a wide figure ($750k, $254K) squeezed the label and
        caption into a column one or two words wide. Figure on top, label and caption
        under it at full width, on every card so the deck doesn't change shape. */
  .oc-stat{grid-template-columns:1fr;grid-template-rows:auto;row-gap:4px}
  .oc-num{grid-row:auto}
  .oc-lab{align-self:start;margin-top:10px}
  /* 3) Pillar cards on phones: the base .beat keeps padding-left:21px for the rail,
        which is hidden here, so the centred beat text sat ~10px right of centre. */
  .scard .beat{padding-left:0}
}
/* 4) 2026-11-05 Dylan reversed the 4 Nov two-line split: "Meetings that actually convert."
      is back on one line. The 7.6em cap that forced "Meetings that / actually convert." is
      removed rather than overridden, so .cred-h is back to its pre-4 Nov rules (base at
      line ~663, phone at ~1140). Don't re-add a max-width here. */
/* 5) 2026-11-04 Dylan: phone pillar cards. A horizontal bar replaces the hidden rail,
      both lines stay open, and each line reveals as it scrolls up the screen.
      Before: the rail was display:none on phones, so its fill timer never ran and line 2's
      body stayed shut until someone tapped a title with no cue to tap (against the 28 Oct
      note above, "on mobile the beat body is always open").
      Now every line is laid out: nothing hidden, no layout jump. A short bar in the card's
      colour sits centred over each title. Where the browser has view timelines (Chrome,
      Safari 26+), the bar fills with the same soft glow and leading bright point as the
      desktop rail while that line crosses the lower part of the screen, and the line
      rises from dim to full. Scroll-linked, transform and opacity only. Older browsers and
      reduced motion get the same layout with the bars filled and no motion.
      .scard goes overflow hidden -> clip here: identical clipping, but no longer a scroll
      container, so the lines track the page scroll instead of the (unscrolling) card. */
@media (max-width:540px){
  .scard .beats .beat .beat-body{grid-template-rows:1fr;opacity:1;padding-bottom:4px;transition:none}
  .scard .beats .beat .beat-title{color:var(--ink);opacity:1;filter:none}
  .scard .beats .beat .beat-head{cursor:default}
  .scard .beats .beat .beat-rail{display:block;position:relative;left:auto;top:auto;width:44px;height:3px;
    margin:0 auto 12px;background:rgba(244,243,236,.12);overflow:visible;transition:none}
  .scard .beats .beat .beat-rail::after{transform-origin:left center;transform:scaleX(1);animation:none;
    box-shadow:0 0 10px 0 color-mix(in srgb,var(--sa,var(--accent)) 45%,transparent)}
}
@media (max-width:540px) and (prefers-reduced-motion:no-preference){
  @supports (animation-timeline:view()) and (overflow:clip){
    .scard{overflow:clip}
    .scard .beats .beat{view-timeline:--beatline block}
    .scard .beats .beat .beat-head{animation:beat-rise-m linear both;animation-timeline:--beatline;animation-range:cover 4% cover 30%}
    .scard .beats .beat .beat-body{animation:beat-rise-m linear both;animation-timeline:--beatline;animation-range:cover 10% cover 36%}
    .scard .beats .beat .beat-rail::after{animation:beat-bar-m linear both;animation-timeline:--beatline;animation-range:cover 4% cover 32%}
    .scard .beats .beat .beat-rail::before{content:"";position:absolute;left:0;top:50%;z-index:1;width:6px;height:6px;
      margin:-3px 0 0 -3px;border-radius:50%;pointer-events:none;
      background:color-mix(in srgb,var(--sa,var(--accent)) 55%,#fff);
      box-shadow:0 0 8px 2px color-mix(in srgb,var(--sa,var(--accent)) 55%,transparent);
      animation:beat-dot-m linear both;animation-timeline:--beatline;animation-range:cover 4% cover 32%}
  }
}
@keyframes beat-rise-m{from{opacity:.22;transform:translateY(12px)}to{opacity:1;transform:none}}
@keyframes beat-bar-m{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes beat-dot-m{0%{transform:translateX(0);opacity:0}10%{opacity:1}85%{opacity:1}100%{transform:translateX(44px);opacity:0}}
