/* =====================================================================
   CreatorLabs — landing redesign v3 (faithful replica of Figma 471-4041)
   Scrapbook aesthetic: cream paper, torn edges, stickers, marker type.
   ===================================================================== */
@import url('https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600;9..40,700&family=Inter:wght@400;500;600;700&family=Plus+Jakarta+Sans:wght@500;600&family=Syne:wght@600;700;800&family=Caveat:wght@500;600;700&family=Permanent+Marker&family=Kaushan+Script&display=swap');

/* Atomic Marker — the design's marker-accent face (SCALE. / FAST. / TWO WEEKS. …) */
@font-face {
  font-family: 'Atomic Marker';
  src: url('assets/fonts/AtomicMarker-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

/* ---------- tokens ---------- */
:root {
  /* viewport width, capped at the 1600 design frame — the scale every
     full-bleed decoration must follow so it never outgrows its section */
  --frame-w: min(100vw, 1600px);
  --cream: #F7F1E8;
  --cream-2: #FBF7F0;
  --ink: #04080D;
  --grey: #6B6F7B;
  --grey-3: #9CA3AF;
  --lead-ink: #16151C;
  --purple: #6C5CE7;
  --purple-deep: #5B4BDB;
  --purple-bright: #6657F5;
  --purple-tint: #EFEBFE;
  --lav: #DCD3F6;
  --lav-pill: #C9BCF0;
  --pink: #F6D7E4;
  --pink-deep: #F48FB8;
  --pink-pill: #F9A8CC;
  --yellow: #F4F76B;
  --yellow-deep: #F7F92D;
  --white: #fff;
  --hair: #E8E4DC;
  --r: 18px;
  --r-lg: 26px;
  --shadow: 0 16px 40px -18px rgba(35,25,80,.25);
  --maxw: 1440px;
  --fd: 'Bricolage Grotesque', sans-serif;
  --fb: 'DM Sans', sans-serif;
  --fu: 'Inter', sans-serif;
  --fsyne: 'Syne', sans-serif;
  --fj: 'Plus Jakarta Sans', sans-serif;
  --fh: 'Caveat', cursive;
  --fm: 'Atomic Marker', 'Permanent Marker', cursive;
  /* design uses "Boxed Round Medium" for button labels — DM Sans 500 is the metric-closest stand-in */
  --fbtn: 'DM Sans', sans-serif;
  --hero-bg: #F8F2EA;
  /* SCALE MODEL — the Figma frame is a 1600px artboard holding a 1440px content
     column. We ship that 1:1: `.stage` sections are laid out in artboard units
     capped at 1600, `.wrap` sections use the 1440 column, so both share the same
     left/right edges and every type size equals its design value at >=1600.
     Below 1600 the stage `--u` shrinks with the container and `.wrap` falls back
     to `100% - gutter`, so the page scales down instead of cropping.
     Backgrounds are always full-bleed and independent of both. */
  --dw-page: 1600px;
  --gutter: 44px;
  --fs: 'Kaushan Script', cursive;
  /* The nav's 14-segment separator (Figma 471:4213). A token because the cookie
     bar wears the same strip and the two must not drift apart. */
  --rainbow: linear-gradient(90deg,
    #b288e7 0 7.14%, #6657f5 7.14% 14.29%, #7751f4 14.29% 21.43%,
    #ebacff 21.43% 42.86%, #bec7ff 42.86% 64.29%, #b086e7 64.29% 85.71%,
    #d5b9f3 85.71% 100%);
}

* { box-sizing: border-box; }
button { font: inherit; color: inherit; }
html { scroll-behavior: smooth; overflow-x: clip; }
body { margin: 0; font-family: var(--fb); color: var(--ink); background: var(--cream); line-height: 1.5; overflow-x: clip; }
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
.wrap { width: min(100% - 44px, var(--maxw)); margin-inline: auto; position: relative; z-index: 2; }
/* Design stage: children are absolutely positioned in Figma artboard px via --u,
   which is exactly 1px when the stage is 1600 wide. Capped at --dw-page. */
/* A stage's OWN height must never be written as calc(N * var(--u)): an element
   cannot query its own container, so `100cqw` inside .stage resolves against the
   VIEWPORT while its children resolve against the (1600-capped) stage. Above
   1600px the two diverge and the box inflates away from its content — that is
   what left a ~500px hole under the hero on wide screens. `aspect-ratio` tracks
   the stage's real width instead, so the box is exact at every viewport.
   Each stage just declares its artboard height in --sh. */
.stage {
  position: relative; container-type: inline-size;
  width: min(100%, var(--dw-page)); margin-inline: auto;
  --u: calc(100cqw / 1600);
  aspect-ratio: 1600 / var(--sh, 1);
}
.stage > * { position: absolute; }

/* ---------- type ---------- */
h1,h2,h3,h4 { font-family: var(--fd); font-weight: 700; letter-spacing: -0.02em; line-height: 0.9; margin: 0; }
.h-display { font-size: clamp(2.5rem, 5.6vw, 4.7rem); }
.h-sec { font-size: clamp(2.1rem, 4.4vw, 4.375rem); font-weight: 500; line-height: 1.0; text-align: center; }
/* per-section heading sizes (Figma: sizes/weights vary section to section) */
.gradband .h-sec { font-size: calc(100 * var(--u)); font-weight: 700; letter-spacing: 0; }   /* Figma 471:4697 — 100 Bold */
.where .h-sec, .results .h-sec { font-size: clamp(2.1rem, 4.4vw, 4.375rem); }        /* 70 Medium */
.weeks-sec .h-sec, .control-sec .h-sec { font-size: clamp(1.9rem, 3.75vw, 3.75rem); } /* 60 Medium */
.youus-sec .h-sec, .pricing .h-sec, .faq-zone .h-sec { font-size: clamp(1.7rem, 3.25vw, 3.25rem); } /* 52 Medium */
.h-feat { font-size: clamp(1.9rem, 3.3vw, 3.125rem); font-weight: 600; line-height: 1.06; }
.marker { font-family: var(--fm); font-weight: 400; letter-spacing: 0; color: var(--purple); transform: rotate(-1.5deg); display: inline-block; }
.hand { font-family: var(--fh); font-weight: 600; }
.script { font-family: var(--fs); font-weight: 400; }
.purple { color: var(--purple); }
.lead { color: var(--lead-ink); font-weight: 300; font-size: clamp(1.05rem, 1.55vw, 1.5625rem); line-height: 1.4; }
.kick { font-family: var(--fh); font-weight: 600; font-size: clamp(1.1rem, 1.35vw, 1.25rem); color: var(--ink); letter-spacing: 0; }
.kick.caps { color: var(--purple); }

/* ---------- pills / buttons ---------- */
.tag {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--fd); font-weight: 800; font-size: 15px; letter-spacing: .02em;
  padding: 11px 24px; border-radius: 999px;
  background: var(--lav-pill); color: #000;
  transform: rotate(-2deg);
}
.tag.flat { transform: none; }
/* Design-stage pills (Figma 471:4687 / 471:4690 / 471:4693) — sized in --u, 226x42 */
.tag-pink, .tag-lav {
  justify-content: center; padding: 0;
  font-family: var(--fd); font-weight: 800; font-size: calc(17 * var(--u));
  letter-spacing: 0; gap: calc(7 * var(--u)); transform: rotate(-1.4deg);
}
.tag-pink { background: #FE9DD0; color: #fff; }
.tag-lav { background: #C9BCF0; color: #000; }
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  font-family: var(--fsyne); font-weight: 700; font-size: 17px;
  padding: 15px 34px; border-radius: 999px; border: 1.5px solid var(--ink);
  cursor: pointer; transition: transform .15s ease, box-shadow .15s ease;
  white-space: nowrap; background: #fff; color: var(--ink);
}
.btn:hover { transform: translateY(-2px); box-shadow: 0 8px 20px -8px rgba(0,0,0,.35); }
.btn:active { transform: scale(.97); }
.btn-yellow { background: var(--yellow-deep); }
.btn-yellow::after { content: "⟶"; font-size: 17px; }
.btn-purple { background: var(--purple); border-color: var(--purple); color: #fff; }
.btn-sm { padding: 10px 20px; font-size: 14px; }

/* =====================================================================
   TUTORIAL VIDEO PLATE — the onboarding walkthrough, sitting on the page
   instead of hiding behind a CTA. One component, used twice: under the
   "More than an AI chatbot" statement and again above the FAQ folders.
   The mp4 is preload="none", so a visit costs the 24KB poster and nothing
   more until someone presses play.
   The tilt lives on .vplate-frame, not on .vplate: [data-reveal].in lands
   on transform:none and would flatten a tilt set on the same element.
   ===================================================================== */
.vplate { --rot: 0deg; width: min(100%, 920px); margin-inline: auto; }
.vplate-frame {
  position: relative; background: #fff;
  border-radius: var(--r-lg); padding: clamp(8px, 1vw, 16px);
  box-shadow: 0 26px 60px -28px rgba(74, 45, 110, .42);
  transform: rotate(var(--rot));
}
.vplate-media {
  position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: 14px; background: #0d0d12;
}
.vplate-video { display: block; width: 100%; height: 100%; object-fit: cover; }

/* full-bleed veil so the whole still is one control, not a small target
   floating over a dead image. No flat scrim over the poster: the frame's
   field is a bright yellow and any dark wash turns it olive, so the button
   and the caption carry their own contrast instead. */
.vplate-play {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  padding: 0; border: 0; cursor: pointer; background: none;
  transition: opacity .3s ease, visibility .3s ease;
}
.vplate-play:focus-visible { outline: 3px solid var(--purple-bright); outline-offset: -4px; }
.vplate-btn {
  display: grid; place-items: center;
  width: clamp(56px, 6vw, 88px); aspect-ratio: 1; border-radius: 50%;
  background: var(--purple); box-shadow: 0 14px 34px -8px rgba(35, 25, 80, .55);
  transition: transform .2s ease, background .2s ease;
}
.vplate-btn svg { width: 46%; height: 46%; display: block; margin-left: 6%; }
.vplate-play:hover .vplate-btn { transform: scale(1.07); background: var(--purple-deep); }
.vplate-play:active .vplate-btn { transform: scale(.97); }
/* pinned to a corner rather than stacked under the button: centred, the pill
   lands straight across the phone mockups the still is there to show */
.vplate-cap {
  position: absolute; left: clamp(8px, 1.8vw, 24px); bottom: clamp(8px, 1.8vw, 24px);
  display: inline-flex; align-items: baseline; gap: 8px;
  padding: 8px 24px; border-radius: 999px;
  background: #fff; color: var(--ink);
  font-family: var(--fbtn); font-weight: 500; font-size: clamp(13px, 1.05vw, 16px);
  line-height: 1;
  box-shadow: 0 10px 26px -12px rgba(35, 25, 80, .45);
}
.vplate-cap b { font-family: var(--fu); font-weight: 600; color: var(--purple); }
/* once it is playing the veil steps aside for the native controls. visibility,
   not just opacity: a transparent button is still a tab stop */
.vplate.playing .vplate-play { opacity: 0; visibility: hidden; pointer-events: none; }
/* at phone width the pill would otherwise run the full width of the frame */
@media (max-width: 600px) {
  .vplate-cap { padding: 8px 16px; font-size: 12px; gap: 8px; }
}

/* ---------- sections ---------- */
.sec { position: relative; padding-block: clamp(56px, 8vw, 110px); }
.sec-head { text-align: center; max-width: 1240px; margin: 0 auto clamp(30px, 4vw, 52px); position: relative; z-index: 2; }
.sec-head .tag { margin-bottom: 20px; }
.sec-head .lead { font-size: clamp(1.1rem, 1.9vw, 1.875rem); margin: 18px auto 0; max-width: 660px; }

/* ---------- torn paper edges ---------- */
.torn { position: absolute; left: 0; right: 0; width: 100%; height: 74px; object-fit: cover; z-index: 3; pointer-events: none; }
.torn.top { top: -36px; }
.torn.bottom { bottom: -36px; transform: scaleY(-1); }

/* ---------- doodles ---------- */
.doodle { position: absolute; pointer-events: none; z-index: 1; }

/* =====================================================================
   NAV
===================================================================== */
/* Figma 471:4213 — bar 84px + 3px 14-segment separator, logo x53, right items x32 */
.topstrip { display: none; }
.nav { position: sticky; top: 0; z-index: 60; background: rgba(248,242,234,.9); backdrop-filter: blur(10px); }
.nav::after {
  content: ""; display: block; height: 3px;
  background: var(--rainbow);
}
.nav-in { display: flex; align-items: center; justify-content: space-between; height: 84px; width: min(100%, var(--dw-page)); max-width: none; padding: 0 32px 0 53px; margin-inline: auto; }
.nav-in { position: relative; }
.nav-in > .nav-links { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }
.brand { display: inline-flex; align-items: center; gap: 8px; font-family: var(--fd); font-weight: 700; font-size: 19px; }
.brand .logo-img { height: 28px; width: auto; display: block; }
.feat-img { display: block; width: 100%; height: auto; }
.brand .logo-img-lg { height: 36px; }
.nav-links { display: flex; gap: 48px; font-family: var(--fu); font-size: 14px; font-weight: 400; color: #212121; }
.nav-links a { display: inline-flex; align-items: center; }
.nav-links a:hover { opacity: .65; }
.nav-right { display: flex; align-items: center; gap: 20px; }
.nav-right .btn-sm { border-width: 2px; border-color: #212121; color: #212121; border-radius: 39px; padding: 13px 24px; font-size: 16px; line-height: 20px; background: transparent; }
/* five links need a tighter rhythm before the centred list closes on the logo
   to its left and the Start free pill to its right */
@media (max-width: 1100px) { .nav-links { gap: 32px; } }

/* the bar is sticky and 87px tall (84 + the rainbow rule), so without this an
   anchor jump parks the section's first line underneath it */
#why, #what, #start-steps, #pricing, #faq, #start { scroll-margin-top: 96px; }

/* burger — hidden until the bar drops its links at 980 */
.nav-burger {
  display: none; flex-direction: column; align-items: center; justify-content: center;
  gap: 8px; width: 48px; height: 48px; margin-right: -8px;
  padding: 0; border: 0; background: none; cursor: pointer;
}
.nav-burger span {
  display: block; width: 24px; height: 2px; border-radius: 2px; background: var(--ink);
  transition: transform .25s ease, opacity .18s ease;
}
.nav.open .nav-burger span:nth-child(1) { transform: translateY(10px) rotate(45deg); }
.nav.open .nav-burger span:nth-child(2) { opacity: 0; }
.nav.open .nav-burger span:nth-child(3) { transform: translateY(-10px) rotate(-45deg); }
.nav-burger:focus-visible { outline: 3px solid var(--purple-bright); outline-offset: 2px; border-radius: 8px; }
/* logo + Start free + burger have to share one 320px bar: at the old sizes the
   wordmark ran under the pill from 360 down */
@media (max-width: 600px) {
  .brand .logo-img { height: 24px; }
  .nav-right { gap: 8px; }
  .nav-right .btn-sm { padding: 8px 16px; font-size: 14px; line-height: 16px; }
  .nav-burger { width: 40px; margin-right: -8px; }
}

/* =====================================================================
   HERO
===================================================================== */
/* Figma: hero band = frame y87..939 (852 tall) on flat #F8F2EA.
   Background is full-bleed; the design stage is capped at the 1600px artboard
   width and centred, so --u never grows past 1px on wide screens. */
.hero { position: relative; overflow: clip; background: var(--hero-bg); }
.hero .stage { --sh: 852; }
.hero .h-plusses { left: calc(232 * var(--u)); top: calc(192 * var(--u)); width: calc(168 * var(--u)); }
.hero .h-sparkle { left: calc(180 * var(--u)); top: calc(217 * var(--u)); width: calc(57 * var(--u)); }
/* Both doodles are marks scribbled on top of the headline, so they arrive with
   it instead of already sitting there: same [data-reveal] trigger as .hero-copy
   (above the fold, so it fires on load), but a stamp-in — scale plus a little
   rotation about the mark's own centre — rather than the page-wide translateY.
   Each carries its own --from and --t so the two don't move in lockstep; the
   black sparkle is the last mark to land. Overriding transform here is why the
   rules are per-class: .hero .h-* outranks the [data-reveal] base. */
.hero .h-plusses, .hero .h-sparkle {
  transform: var(--from);
  transition: opacity .45s ease, transform .55s cubic-bezier(.34,1.4,.64,1);
  transition-delay: var(--t);
}
.hero .h-plusses.in, .hero .h-sparkle.in { transform: none; }
.hero .h-plusses { --from: scale(.62) rotate(-9deg); --t: .18s; }
.hero .h-sparkle { --from: scale(.35) rotate(16deg); --t: .34s; }
.hero .hero-collage { left: calc(776 * var(--u)); top: calc(35 * var(--u)); width: calc(802 * var(--u)); height: auto; }
.hero .hero-copy { left: calc(97 * var(--u)); top: calc(245 * var(--u)); width: calc(741 * var(--u)); z-index: 3; }
.hero h1 {
  /* 81, not the frame's 90: "Run your business" is a longer first line than
     the design's "creator business" and 90 overflows the 741 copy column. */
  font-size: calc(81 * var(--u)); line-height: calc(72 * var(--u));
  font-weight: 700; letter-spacing: 0; color: #000;
  font-variation-settings: "opsz" 14, "wdth" 100;
}
.hero h1 .purple { color: var(--purple-bright); }
.hero-sub {
  margin: calc(24 * var(--u)) 0 0; width: calc(667 * var(--u));
  font-family: var(--fb); font-weight: 300; color: #000;
  font-size: calc(30 * var(--u)); line-height: calc(35 * var(--u));
}
.hero-actions { display: flex; align-items: center; gap: calc(22 * var(--u)); margin-top: calc(63 * var(--u)); }
/* Figma primary/secondary button: square, 1px black hairline, 57 tall */
.hero .btn {
  font-family: var(--fbtn); font-weight: 500; letter-spacing: 0;
  font-size: calc(18 * var(--u)); line-height: calc(25 * var(--u));
  height: calc(57 * var(--u)); padding: 0 calc(38 * var(--u));
  border: 1px solid #000; border-radius: 0; background: transparent; color: #000;
  gap: calc(10 * var(--u));
}
.hero .btn-yellow { background: var(--yellow-deep); width: calc(210 * var(--u)); padding: 0; }
.hero .btn-yellow::after { content: none; }
.hero .btn-arrow { width: calc(43 * var(--u)); height: auto; transform: scaleY(-1); }
.hero .btn:hover { transform: none; box-shadow: 3px 3px 0 rgba(0,0,0,.85); }

/* =====================================================================
   YELLOW STATS BAND
===================================================================== */
/* Figma 471:4673 — 1600x80 band #F8F96F, three fixed columns at x87 / x611 / x1139 */
.statband { background: #F8F96F; position: relative; z-index: 2; }
.statband .stage { --sh: 80; }
.statband .item {
  /* Centred rather than a fixed top: at `top: 14 * --u` the ink sat 6px above
     the frame's in the 80px band (ours 956..990 against 963..992 measured off
     v3.png at 1600). Centring the 44px box lands the ink centre on 977.0
     against the frame's 977.5. */
  top: 50%; translate: 0 -50%;
  display: flex; align-items: baseline; gap: calc(8 * var(--u));
  font-family: var(--fbtn); font-weight: 400; font-size: calc(30 * var(--u)); line-height: calc(40 * var(--u)); color: #000; white-space: nowrap;
}
.statband .i1 { left: calc(87 * var(--u)); }
.statband .i2 { left: calc(611 * var(--u)); }
.statband .i3 { left: calc(1139 * var(--u)); }
.statband b { font-family: var(--fbtn); font-weight: 700; font-size: calc(36 * var(--u)); }
.statband .sp { font-size: calc(23 * var(--u)); }

/* One stat per row below 750, where the band's 30px design type has scaled
   under 14px (it reaches 6px at 320 — the whole stage is aspect-ratio
   1600/80, so the band and its text shrink with the viewport forever).
   Same escape hatch the hero uses: leave the absolute stage, --u: 1px, and
   size in real px. The b/.sp ratios stay design-exact by using em (36/30 =
   1.2, 23/30 = 0.767). */
@media (max-width: 980px) {
  .statband .stage {
    aspect-ratio: auto; height: auto; container-type: normal; --u: 1px;
    display: grid; justify-items: center; gap: clamp(9px, 2.4vw, 15px);
    padding: clamp(22px, 5.2vw, 34px) 22px;
  }
  .statband .stage > * { position: static; translate: none; }
  .statband .item { font-size: clamp(15px, 4.9vw, 26px); line-height: 1.25; gap: .3em; }
  .statband b { font-size: 1.2em; }
  .statband .sp { font-size: .767em; }
}

/* =====================================================================
   PARTNERS + CREATORS (pink band with torn edges)
===================================================================== */
/* Figma 471:4202 — flat #F8E4E3 band, frame y1019..1533, torn paper edge into cream */
.pinkband { background: #F8E4E3; position: relative; }
.pinkband .stage { --sh: 514; }
.pinkband .pb-star  { left: calc(1198 * var(--u)); top: calc(43 * var(--u));  width: calc(144 * var(--u)); }
.pinkband .pb-heart { left: calc(320 * var(--u));  top: calc(121 * var(--u)); width: calc(72 * var(--u)); }
.pinkband .tag-pink { left: calc(709 * var(--u));  top: calc(75 * var(--u));  width: calc(226 * var(--u)); height: calc(42 * var(--u)); }
.pinkband .pb-title {
  left: calc(388 * var(--u)); top: calc(108 * var(--u)); width: calc(875 * var(--u));
  font-family: var(--fd); font-weight: 400; letter-spacing: 0; text-align: center; color: #000;
  font-size: calc(50 * var(--u)); line-height: calc(120 * var(--u));
  font-variation-settings: "opsz" 14, "wdth" 100;
}
.pinkband .pb-cards { left: calc(505 * var(--u)); top: calc(243 * var(--u)); width: calc(680 * var(--u)); aspect-ratio: 1360 / 256; }
/* Both torn cards share one webp whose flat #F8E4E3 ground matches the band,
   so each link paints its own half of the image and can move independently:
   the pink it drags along is invisible against the pink it sits on. */
.pinkband .pb-cards .pb-link {
  position: absolute; top: 0; height: 100%; width: 50%;
  background: url(assets/pb-cards.webp) 0 0 / 200% 100% no-repeat;
  transform-origin: 50% 55%;
}
.pinkband .pb-cards .pb-link.unruly { left: 0; }
.pinkband .pb-cards .pb-link.behave { left: 50%; background-position: 100% 0; }
.pinkband .pb-cards .pb-link:hover { animation: pb-wave .7s ease-in-out; }
@keyframes pb-wave {
  0%, 100% { transform: rotate(0); }
  30% { transform: rotate(-2.4deg); }
  60% { transform: rotate(2.2deg); }
  85% { transform: rotate(-.8deg); }
}
/* torn edge is full-bleed so wide screens still tear edge-to-edge */
.pinkband .pb-torn { position: absolute; left: 0; bottom: 0; width: 100%;
  height: calc(147 / 1600 * var(--frame-w)); object-fit: fill; }

/* ---------- creators (cream) ---------- */
/* Figma frame y1533..2534 on #F8F2EA — script wordmark, handwriting, polaroid wall */
.creators-sec { background: var(--cream); position: relative; overflow: clip; }
.creators-sec .stage { --sh: 1001; }
.creators-sec .tag-lav  { left: calc(712 * var(--u));  top: calc(35 * var(--u));  width: calc(226 * var(--u)); height: calc(42 * var(--u)); }
.creators-sec .cr-words { left: calc(1189 * var(--u)); top: calc(-2 * var(--u));  width: calc(411 * var(--u)); }
.creators-sec .cr-script{ left: calc(79 * var(--u));   top: calc(71 * var(--u));  width: calc(1061 * var(--u)); }
.creators-sec .cr-cards { left: calc(70 * var(--u));   top: calc(369 * var(--u)); width: calc(1475 * var(--u)); }
.blend { display: block; width: 100%; pointer-events: none; }
.ccard { margin: 0; background: #fff; border-radius: 6px; box-shadow: 0 26px 46px -22px rgba(90,50,140,.4); transition: transform .25s ease; }
.ccard img { border-radius: 6px; }
.ccard.t1 { width: 20%; transform: rotate(-5deg) translateY(84px); }
.ccard.t2 { width: 26%; transform: rotate(-2deg); }
.ccard.t3 { width: 23%; transform: rotate(1.5deg) translateY(26px); }
.ccard.t4 { width: 25%; transform: rotate(4deg) translateY(52px); }
.ccard:hover { transform: rotate(0) translateY(-4px); z-index: 3; }

/* =====================================================================
   CHOOSE / SCALE  (gradient pink→lavender)
===================================================================== */
/* Figma frame y2534..3694. Background = torn paper edge out of the creators cream,
   then Figma's blurred blob stack (471:4210): #F4EEF6 plate + pink + lavender rects,
   each with a 50px layer blur. All three layers are full-bleed. */
.gradband {
  position: relative; background: var(--cream); overflow: clip;
  container-type: inline-size; --u: calc(min(100cqw, var(--dw-page)) / 1600);
  padding: calc(232 * var(--u)) 0 calc(46 * var(--u));
}
.gradband > .wrap { z-index: 3; }
.gradband .gb-blob {
  position: absolute; left: 50%; translate: -50% 0; top: calc(188 * var(--u));
  width: 100%; min-width: 1600px; height: calc(972 * var(--u));
  background: #F4EEF6; filter: blur(calc(50 * var(--u))); z-index: 0;
}
/* full-bleed layers anchor to the page centre, so frame x maps to 50% + (x - 800)*--u */
.gradband .gb-blob i { position: absolute; display: block; filter: blur(calc(50 * var(--u))); }
.gradband .gb-blob .b1 { left: calc(50% - 783 * var(--u)); top: 0; width: calc(1093 * var(--u)); height: calc(716 * var(--u)); background: #F8C9EB; }
.gradband .gb-blob .b2 { left: calc(50% - 669 * var(--u)); top: calc(301 * var(--u)); width: calc(1479 * var(--u)); height: calc(714 * var(--u)); background: #C9BCF0; }
.gradband .gb-torn { position: absolute; left: 50%; translate: -50% 0; top: 0; width: 100%;
  height: calc(276 / 1600 * var(--frame-w)); object-fit: fill; z-index: 1; }
.gradband .gb-star1, .gradband .gb-star2, .gradband .gb-heart { position: absolute; z-index: 2; }
.gradband .gb-star1 { left: calc(50% - 446 * var(--u)); top: calc(297 * var(--u));  width: calc(45 * var(--u)); }
.gradband .gb-star2 { left: calc(50% + 440 * var(--u)); top: calc(325 * var(--u));  width: calc(69 * var(--u)); }
.gradband .gb-heart { left: calc(50% - 393 * var(--u)); top: calc(1067 * var(--u)); width: calc(37 * var(--u)); }
/* head block: tag y232, h2 y302 (100/92), lead y520 — all measured off the frame */
.gradband .sec-head { margin: 0 auto; max-width: none; }
.gradband .sec-head .tag { width: calc(226 * var(--u)); height: calc(42 * var(--u)); margin: 0; }
.gradband .sec-head .h-sec { margin-top: calc(28 * var(--u)); line-height: calc(92 * var(--u)); }
.gradband .sec-head .lead { margin: calc(34 * var(--u)) auto 0; max-width: none; font-size: calc(30 * var(--u)); line-height: calc(35 * var(--u)); color: #000; }
.gradband .compare { margin-top: calc(57 * var(--u)); }
/* note sits next to the heart doodle at a fixed frame position, not after the cards */
.gradband { min-height: calc(1160 * var(--u)); }
.gradband .compare-note {
  position: absolute; left: calc(50% - 324 * var(--u)); top: calc(1079 * var(--u));
  margin: 0; width: calc(833 * var(--u)); text-align: left; z-index: 3;
  font-weight: 400; font-size: calc(58 * var(--u)); letter-spacing: calc(1.1 * var(--u));
  line-height: calc(35 * var(--u)); white-space: nowrap;
}
.compare { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; align-items: stretch; max-width: 1200px; margin: 0 auto; }
.ccol { background: #fff; border-radius: var(--r-lg); padding: 34px 32px; box-shadow: 0 14px 34px -20px rgba(60,40,120,.35); }
.ccol h3 { font-family: var(--fd); font-weight: 700; font-size: 25px; margin-bottom: 6px; }
.ccol .sub { font-family: var(--fu); font-size: 15px; color: var(--grey-3); margin: 0 0 22px; }
.ccol.mid { background: #FBEFF6; position: relative; box-shadow: 0 22px 44px -20px rgba(120,40,120,.4); }
.ccol.mid h3 { font-family: var(--fs); font-weight: 400; font-size: 26px; color: var(--purple-bright); }
.ccol .flag { position: absolute; top: -14px; left: 50%; transform: translateX(-50%) rotate(-1deg); background: var(--ink); color: var(--yellow-deep); font-family: var(--fu); font-weight: 700; font-size: 11px; letter-spacing: .06em; padding: 7px 14px; border-radius: 999px; white-space: nowrap; }
.clist { margin: 0; padding: 0; display: grid; gap: 16px; }
.clist li { list-style: none; display: flex; gap: 12px; font-family: var(--fu); font-size: 16px; color: var(--ink); align-items: center; }
.clist li::before { flex: none; width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center; font-size: 12px; font-weight: 700; line-height: 1; }
.clist.x li::before { content: "✕"; background: #FBE1DC; color: #D9502E; }
.clist.check li::before { content: "✓"; background: var(--purple-bright); color: #fff; }
.clist li.good::before { content: "✓"; background: #D8F2E1; color: #1F9D55; }
/* heart is a real doodle image (.gb-heart), so no ::before glyph here */
.compare-note { text-align: center; margin-top: 40px; font-family: var(--fh); font-weight: 700; font-size: clamp(1.5rem, 2.6vw, 2rem); color: var(--ink); }

/* chatbot statement (cream) */
.statement-sec { background: var(--cream); position: relative; padding-block: clamp(72px, 9vw, 120px); }
.statement { text-align: center; position: relative; }
.statement h2 { font-size: clamp(2.3rem, 5.6vw, 5.625rem); font-weight: 700; line-height: .96; }
.statement .hl { position: relative; display: inline-block; padding: 2px 14px; background: var(--yellow-deep); transform: rotate(-1.6deg); font-family: var(--fm); font-weight: 400; color: var(--ink); }
.statement .lead { max-width: 520px; margin: 18px auto 0; color: #6b5f79; }
/* the two plates lean opposite ways so the pair reads as hand-placed rather
   than as the same embed pasted twice */
.statement-sec .vplate { --rot: -1.1deg; margin-top: clamp(40px, 5vw, 72px); }
.faq-zone .vplate { --rot: 1.1deg; margin-bottom: clamp(40px, 5.5vw, 80px); }

/* =====================================================================
   FEATURES
===================================================================== */
.feat { position: relative; padding-block: clamp(56px, 7vw, 96px); }
/* Figma feature rows are not a uniform 50/50 grid — each row sets its own
   column widths / gutter / total span via --c1/--c2/--gap/--gw. */
.feat-grid { display: grid; grid-template-columns: var(--c1, 1fr) var(--c2, 1fr); gap: var(--gap, clamp(28px, 5vw, 72px)); max-width: var(--gw, none); margin-inline: auto; align-items: center; }
.feat-grid.flip .copy { order: 2; }
.feat .copy .kick { display: block; margin-bottom: calc(6px + .1em); transform: rotate(-1deg); }
/* Bricolage SemiBold 50 / line-height 70 / tracking -1.82px (Figma 471:4870) */
.feat .copy h3 { font-size: clamp(1.9rem, 3.3vw, 3.125rem); font-weight: 600; line-height: 1.4; letter-spacing: -0.036em; }
.feat .copy h3 .purple { color: var(--purple-bright); }
/* DM Sans Light 25 / line-height 35 / black (Figma 471:4871) */
.feat .copy .lead { margin-top: 6px; max-width: 46ch; color: #000; }
.blob-bg { position: absolute; inset: auto 0; left: 50%; transform: translateX(-50%); border-radius: 50%; z-index: 0; }
.feat .wrap { z-index: 2; }

/* white ui cards */
.uicard { background: #fff; border-radius: var(--r-lg); padding: 20px; box-shadow: var(--shadow); font-family: var(--fu); }
.uirow { display: flex; align-items: center; gap: 12px; padding: 13px 4px; }
.uirow + .uirow { border-top: 1px solid #F0EDE7; }
.uirow .ic { width: 38px; height: 38px; border-radius: 12px; background: var(--purple-tint); display: grid; place-items: center; font-size: 17px; flex: none; }
.uirow .t { font-weight: 600; font-size: 14.5px; }
.uirow .s { font-size: 12px; color: var(--grey-3); }
.uirow .rt { margin-left: auto; text-align: right; }
.uirow .num { font-weight: 700; font-size: 16px; color: var(--purple-bright); }
.minipill { display: inline-block; font-size: 10px; font-weight: 700; padding: 3px 8px; border-radius: 999px; background: var(--yellow); }
.chip { display: inline-flex; align-items: center; gap: 5px; font-family: var(--fu); font-weight: 600; font-size: 12.5px; padding: 7px 13px; border-radius: 999px; background: var(--purple-tint); color: var(--purple-deep); }
.chip.red { background: #FDE8E8; color: #C0392B; }
.chip.dashed { background: transparent; border: 1.5px dashed var(--grey-3); color: var(--grey); }
.chip.solid { background: var(--purple); color: #fff; }
.chip.white { background: #fff; color: var(--ink); box-shadow: 0 6px 16px -8px rgba(0,0,0,.25); }
.chip.yellow { background: var(--yellow-deep); color: var(--ink); }
.chip.outline { background: transparent; border: 1.5px solid var(--ink); }

/* progress bars (auto engagement) */
.bar { height: 34px; border-radius: 10px; background: var(--purple-tint); position: relative; overflow: hidden; margin-top: 8px; font-size: 12.5px; font-weight: 600; }
.bar > i { position: absolute; inset: 0 auto 0 0; background: linear-gradient(90deg, var(--purple), var(--purple-bright)); border-radius: 10px; }
.bar span { position: absolute; inset: 0; display: flex; align-items: center; padding: 0 12px; color: #fff; z-index: 1; }
.bar.light span { color: var(--purple-deep); }

/* content management card (feature 04, Figma 518:2443) */
.content-card { max-width: 582px; margin: 0 auto clamp(32px, 4vw, 52px); background: #fff; border: 1px solid #ECECEF; border-radius: 18px; padding: clamp(16px, 2.4vw, 26px); box-shadow: 0 30px 70px rgba(4,8,13,.1); display: grid; gap: 13px; font-family: var(--fu); text-align: left; }
.cc-head { display: flex; align-items: center; gap: 11px; background: #F4F2FE; border-radius: 12px; padding: 14px 16px; }
.cc-badge { width: 34px; height: 34px; border-radius: 9px; background: #fff; display: grid; place-items: center; font-size: 16px; flex: none; }
.cc-badge.lav { width: 38px; height: 38px; background: var(--purple-tint); }
.cc-t { font-weight: 600; font-size: 14px; color: #04080D; }
.cc-s { font-size: 12px; color: #5C6370; margin-top: 3px; }
.cc-photos { display: flex; gap: 10px; justify-content: center; }
.cc-photos img { width: clamp(70px, 23%, 124px); aspect-ratio: 124 / 165; object-fit: cover; border-radius: 12px; }
.cc-tag { color: var(--purple-bright); font-weight: 600; font-size: 11px; letter-spacing: .05em; text-transform: uppercase; padding-top: 3px; }
.cc-bundle { display: flex; align-items: center; gap: 12px; border: 1px solid #ECECEF; border-radius: 12px; padding: 14px 16px; }
.cc-bundle > div { flex: 1; }
.cc-bundle .cc-s { color: var(--grey-3); }
.cc-price { color: var(--purple-bright); font-weight: 600; font-size: 19px; flex: none; }

/* =====================================================================
   WHERE YOU ARE — 4 cards
===================================================================== */
.where { background: linear-gradient(180deg, #F6DCE9, #F3D4E5); position: relative; padding-block: clamp(70px, 9vw, 110px) clamp(90px, 11vw, 150px); overflow: clip; }
.where h2 .purple { color: var(--purple-bright); }
.where-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(14px, 1.6vw, 22px); margin-top: clamp(44px, 6vw, 80px); position: relative; align-items: start; }
.wcard { position: relative; background: #fff; border-radius: 20px; padding: 34px 22px 24px; box-shadow: 0 20px 38px -22px rgba(120,40,90,.45); border: 1px solid rgba(120,60,150,.10); }
.wcard::before { content: ""; position: absolute; left: 18px; right: 18px; top: 20px; border-top: 2px dashed #CBB9FF; }
.wcard::after { content: "•••"; position: absolute; right: 18px; top: 9px; letter-spacing: 2px; color: #CBB9FF; font-size: 11px; line-height: 1; }
.wcard .wic { position: absolute; left: 20px; top: 36px; width: 42px; height: 42px; border-radius: 12px; background: var(--purple-tint); display: grid; place-items: center; font-size: 19px; }
.wcard h4 { font-family: var(--fd); font-weight: 700; font-size: 16px; margin: 0 0 12px 56px; min-height: 42px; display: flex; align-items: center; line-height: 1.15; }
.wcard p { margin: 0; font-family: var(--fu); font-size: 12.5px; color: var(--grey); line-height: 1.55; }
/* diagonal cascade: steps up left -> right (arrow is child 1).
   margin-top, NOT transform: the data-reveal animation ends in transform:none
   and would wipe a transform-based stagger. */
.wcard:nth-child(1) { margin-top: 54px; }
.wcard:nth-child(2) { margin-top: 36px; }
.wcard:nth-child(3) { margin-top: 18px; }
.wcard:nth-child(4) { margin-top: 0; }
.where-arrow { position: absolute; left: -6px; top: -34px; width: clamp(78px, 8vw, 118px); transform: rotate(8deg) scaleX(-1); opacity: .75; pointer-events: none; z-index: 1; }

/* =====================================================================
   RESULTS — yellow band
===================================================================== */
.results { padding-block: clamp(64px, 8vw, 100px) 0; }
.results-band { background: var(--yellow); margin-top: clamp(30px, 4vw, 48px); padding: clamp(36px, 5vw, 60px) 0; }
.rgrid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
.rcard { background: #fff; border-radius: var(--r); padding: 28px 20px; text-align: center; box-shadow: 0 12px 26px -14px rgba(90,90,20,.35); }
.rcard .ico { font-size: 20px; margin-bottom: 10px; color: var(--purple); }
.rcard .big { font-family: var(--fd); font-weight: 800; font-size: clamp(2rem, 3.4vw, 2.9rem); color: var(--purple-bright); }
.rcard .lbl { font-family: var(--fu); font-size: 12.5px; color: var(--grey); margin-top: 8px; line-height: 1.5; }

/* =====================================================================
   YOU / US
===================================================================== */
.youus { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; max-width: 980px; margin: 0 auto; }
.yu-card { border-radius: var(--r-lg); padding: 26px; }
.yu-card.you { background: #fff; box-shadow: var(--shadow); }
.yu-card.us { background: var(--purple-tint); box-shadow: var(--shadow); }
.yu-card h4 { font-family: var(--fd); font-size: 18px; margin-bottom: 16px; }
.yu-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 11px 0; border-top: 1px solid rgba(0,0,0,.06); font-family: var(--fu); font-size: 14px; }
.yu-row .who { flex: none; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 999px; background: #fff; color: var(--purple-deep); box-shadow: 0 2px 6px rgba(0,0,0,.08); }

/* =====================================================================
   TIMELINE
===================================================================== */
.timeline { max-width: 860px; margin: 0 auto; display: grid; gap: 14px; }
.tl { display: grid; grid-template-columns: 96px 1fr; gap: 18px; align-items: start; }
.tl .day { font-family: var(--fu); font-weight: 700; font-size: 12px; background: var(--purple); color: #fff; border-radius: 999px; padding: 6px 12px; text-align: center; margin-top: 16px; transform: rotate(-2deg); }
.tl .body { background: #fff; border-radius: var(--r); padding: 20px 24px; box-shadow: var(--shadow); }
.tl .body h4 { font-family: var(--fd); font-size: 16.5px; margin-bottom: 6px; }
.tl .body p { margin: 0; font-family: var(--fu); font-size: 13.5px; color: var(--grey); }
.tl.hl .body { background: var(--purple-tint); }

/* =====================================================================
   CONTROL — blob cards
===================================================================== */
.ctrl-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; max-width: 1020px; margin: 0 auto; }
.blobcard {
  border: 1.6px solid var(--ink); background: transparent;
  padding: 30px 28px; position: relative;
  border-radius: 58% 42% 55% 45% / 52% 48% 52% 48%;
  min-height: 150px;
}
.blobcard:nth-child(2n) { border-radius: 45% 55% 48% 52% / 48% 55% 45% 52%; transform: rotate(.6deg); }
.blobcard:nth-child(3n) { border-radius: 52% 48% 42% 58% / 55% 45% 55% 45%; transform: rotate(-.7deg); }
.blobcard h4 { font-family: var(--fd); font-size: 16px; margin-bottom: 8px; }
.blobcard p { margin: 0; font-family: var(--fu); font-size: 12.5px; color: var(--grey); line-height: 1.55; }
.blobcard .ic { position: absolute; top: 18px; right: 26px; font-size: 18px; color: var(--purple); }
.blobcard .ic-img { position: absolute; top: 12px; right: 22px; width: 52px; height: 52px; object-fit: contain; }
.blobcard h4 { padding-right: 56px; }
.ctrl-legal { text-align: center; font-family: var(--fu); font-size: 11.5px; color: var(--grey-3); max-width: 620px; margin: 36px auto 0; }
.ctrl-legal a { text-decoration: underline; }

/* =====================================================================
   PRICING
===================================================================== */
/* overflow-x only. The gradient below has to bleed vertically past the section
   box — the frame ramps it up over ~280px starting well ABOVE this section, so
   at the section's own top edge it is already at 53% of peak. `overflow: clip`
   cut it off exactly there, which is the hard horizontal line that looked like
   the artwork had been trimmed. `clip`/`visible` is a legal pair and is
   preserved (same trick as `body`), so content still cannot escape sideways. */
.pricing { position: relative; overflow-x: clip; overflow-y: visible; padding-block: clamp(70px, 9vw, 120px); }
/* Background gradient. It was three `border-radius: 50%` blobs behind
   `filter: blur()`, but the frame's version is not radial at all — node
   471:4119 paints two heavily blurred rounded RECTANGLES: a yellow one across
   the top left and a larger lavender one below and right of it. Round blobs
   cannot make the broad flat fields that produces, and the fixed-px sizes had
   the usual gotcha-2 problem on top of it, so the whole thing read as a pale
   wash (peak #F8F3DC against the frame's #FCFF4D).
   Reproduced from the frame's own export rather than re-fitted by hand: the
   two rects overlap, which contaminates any edge fit — every attempt to solve
   the blur radius from the ramp disagreed with itself (sigma 29 across, 59
   down, for one isotropic blur). The export registers to frame x 0..1600,
   y 13006..14222, found by brute-force offset search over background-only
   pixels (score 1.86/255).
   Stretched with 100% 100% rather than pinned to an aspect ratio: the artwork
   has no feature smaller than the ~30px blur, so it takes any amount of
   non-uniform scaling invisibly, and that keeps the composition filling the
   section identically at every viewport. Absolute px would be exact at 1600
   and then leave most of the section bare on a phone, where this section grows
   to ~3x its desktop height while --frame-w shrinks.
   Percentages are over OUR section height (1018 at 1600), not the design's
   972 — using 972 stretched it 4.7% and pushed the colour transition ~40
   blue-levels late. Height is the export's 1216. The -145 top is measured, not
   the export's nominal -101 from the design's container: our section box does
   not start where that container does. Fitted by rendering the ramps at
   -101/-115/-130/-145/-160/-175 and scoring RMS against the frame's own
   vertical profiles — 35.6 at -101, 2.8 at -145, rising again after, which
   agrees with anchoring on the pink pill's ink independently.
   z-index -1, not 0: the bleed now lands on the control section above and the
   FAQ below, both of which are transparent over body's cream. A negative
   z-index paints above the canvas background but behind every element on the
   page, so those sections' own content still covers it and the price card
   stays opaque on top without needing a counter-z-index on .wrap. */
.pricing::before {
  content: ''; position: absolute; z-index: -1; pointer-events: none;
  left: 0; right: 0; top: -14.24%; height: 119.45%;
  background: url(assets/pricing-glow.webp) 50% 50% / 100% 100% no-repeat;
}
.price-card { background: #fff; border-radius: var(--r-lg); box-shadow: var(--shadow); max-width: 920px; margin: 0 auto; overflow: hidden; }
.prow { display: grid; grid-template-columns: 180px 1fr; gap: 20px; padding: 22px 30px; align-items: baseline; }
.prow + .prow { border-top: 1px solid #F0EDE7; }
.prow .k { font-family: var(--fd); font-weight: 700; font-size: 15.5px; }
.prow .v { font-family: var(--fu); font-weight: 700; font-size: 15.5px; color: var(--purple-bright); }
.prow .d { font-family: var(--fu); font-size: 13px; color: var(--grey); margin-top: 4px; }
.fee-table { background: #fff; border-radius: var(--r-lg); box-shadow: var(--shadow); max-width: 920px; margin: 22px auto 0; overflow: hidden; font-family: var(--fu); font-size: 14px; }
.fee-table .tr { display: flex; justify-content: space-between; padding: 14px 30px; }
.fee-table .tr + .tr { border-top: 1px solid #F0EDE7; }
.fee-table .th { background: var(--pink); font-weight: 700; }
.fee-table .amt { font-weight: 700; color: var(--purple-bright); }

/* =====================================================================
   FAQ — folder cards
===================================================================== */
.faq-zone { position: relative; }
.folders { display: grid; grid-template-columns: repeat(3, 1fr); gap: 26px 22px; max-width: 940px; margin: 0 auto; position: relative; z-index: 2; }
.folder { position: relative; cursor: pointer; }
.folder .face {
  background: #fff; border-radius: 14px; padding: 34px 26px 30px;
  box-shadow: 0 16px 34px -16px rgba(35,25,80,.3);
  position: relative; min-height: 104px; display: flex; align-items: center;
}
.folder .face::before {
  content: ""; position: absolute; top: -15px; left: 16px;
  width: 44%; height: 18px; background: #fff; border-radius: 9px 12px 0 0;
}
.folder:nth-child(3n+1) { transform: rotate(-3.4deg); }
.folder:nth-child(3n+2) { transform: rotate(2.4deg); }
.folder:nth-child(3n)   { transform: rotate(-1.6deg); }
.folder .q { font-family: var(--fu); font-weight: 600; font-size: 17px; line-height: 1.35; display: flex; justify-content: space-between; gap: 10px; width: 100%; align-items: center; }
.folder .q .st { color: var(--purple); flex: none; }
.folder .q .st-img { width: 34px; height: 34px; object-fit: contain; flex: none; }
.folder .a { display: none; font-family: var(--fu); font-size: 12.5px; color: var(--grey); margin-top: 10px; line-height: 1.55; }
.folder.open .a { display: block; }
.faq-q-doodle { position: absolute; z-index: 1; opacity: .9; }

/* =====================================================================
   FINAL CTA + FOOTER
===================================================================== */
.final { text-align: center; padding-block: clamp(70px, 9vw, 110px) clamp(48px, 6vw, 72px); }
.final h2 { font-size: clamp(2.1rem, 4.5vw, 4.5rem); font-weight: 500; line-height: 1.0; letter-spacing: -0.03em; }
.final .lead { max-width: 420px; margin: 14px auto 26px; }
.final .note { margin-top: 16px; font-family: var(--fu); font-size: 12.5px; color: var(--grey-3); }

.footer { border-top: 1px solid var(--hair); padding: clamp(44px, 6vw, 64px) 0 32px; position: relative; overflow: clip; }
.footer .brandrow { display: flex; justify-content: center; margin-bottom: clamp(32px, 4vw, 48px); }
.footer-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(28px, 5vw, 64px); align-items: center; max-width: 980px; margin: 0 auto; }
.f-left { position: relative; min-height: 180px; }
.f-left .script-lab { font-family: var(--fh); font-weight: 700; font-size: clamp(2rem, 3.4vw, 2.8rem); color: var(--purple); transform: rotate(-3deg); display: inline-block; }
.f-left .tagline { font-family: var(--fh); font-weight: 600; font-size: 19px; color: var(--pink-deep); margin-top: 8px; }
.f-contact { display: grid; gap: 26px; }
.f-item { display: grid; grid-template-columns: 56px 1fr; gap: 16px; align-items: center; }
.f-item .lbl { font-family: var(--fh); font-weight: 700; font-size: 21px; color: var(--pink-deep); }
.f-item .val { font-family: var(--fd); font-weight: 600; font-size: clamp(1.15rem, 2vw, 1.55rem); }
.f-item .val-line { display: block; width: min(100%, 320px); height: 10px; margin-top: 3px; }
.footer .fd { z-index: 0; opacity: .92; }
.footer-legal { display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; font-family: var(--fu); font-size: 11.5px; color: var(--grey-3); margin-top: clamp(36px, 5vw, 56px); border-top: 1px solid var(--hair); padding-top: 20px; }

/* ---------- reveal ---------- */
[data-reveal] { opacity: 0; transform: translateY(20px); transition: opacity .6s ease, transform .6s cubic-bezier(.2,.8,.2,1); }
[data-reveal].in { opacity: 1; transform: none; }

/* =====================================================================
   ANIMATED FEATURE MOCKUPS
===================================================================== */
/* staged items — hidden until the [data-anim] container scrolls in, then
   each child pops at its own --t delay */
[data-anim] .ai { opacity: 0; transform: translateY(12px) scale(.97); transition: opacity .5s ease, transform .55s cubic-bezier(.34,1.4,.64,1); transition-delay: var(--t, 0s); }
[data-anim].in .ai { opacity: 1; transform: none; }

/* ---------------------------------------------------------------------
   .mock — proportional mockup scaler.
   The Figma frame is 1600px wide, so every mockup is authored in raw
   design px and scales as one unit: set --dw to the design width, then
   express every inner value as calc(N * var(--u)). --u is exactly 1px
   when the mockup renders at its design size.
   --------------------------------------------------------------------- */
.mock { container-type: inline-size; width: 100%; max-width: calc(var(--dw) * 1px); margin-inline: auto; text-align: left; --u: calc(100cqw / var(--dw)); }
/* Figma pins DM Sans's optical-size axis at 14 inside the mockups; without this
   the glyphs render ~8% narrower than the design at large sizes. */
.mock { font-variation-settings: "opsz" 14; }

/* 01 — auto onboarding (Figma 471:4968, 602x559) */
.ob-card {
  background: #fff; border-radius: calc(30 * var(--u));
  padding: calc(44 * var(--u)) calc(32 * var(--u)) calc(49 * var(--u)) calc(37 * var(--u));
  font-family: var(--fb);
}
.ob-hi {
  display: flex; align-items: center; gap: calc(49 * var(--u));
  height: calc(103 * var(--u)); margin-bottom: calc(37 * var(--u));
  padding-left: calc(31 * var(--u));
  background: #F8F5FC; border: 1px solid #E5E5E5; border-radius: calc(10 * var(--u));
}
.ob-hi-ic { width: calc(60 * var(--u)); height: calc(60 * var(--u)); flex: none; }
.ob-hi-ic svg { width: 100%; height: 100%; display: block; }
.ob-item { display: flex; align-items: center; gap: calc(30 * var(--u)); }
.ob-item:not(:last-child) { padding-bottom: calc(18 * var(--u)); border-bottom: 1px solid #D9D9D9; margin-bottom: calc(19 * var(--u)); }
.ob-ic {
  width: calc(84 * var(--u)); height: calc(84 * var(--u)); flex: none;
  margin-left: calc(19 * var(--u));   /* tiles sit inset from the card padding */
  background: #F8F5FC; border: 1px solid #E7E7E7; border-radius: calc(10 * var(--u));
  display: grid; place-items: center; overflow: hidden;
}
.ob-ic img { display: block; }
.ob-ic .w61 { width: calc(61 * var(--u)); }
.ob-ic .w56 { width: calc(56 * var(--u)); }
.ob-ic .w59 { width: calc(59 * var(--u)); }
.ob-tt { flex: 1; min-width: 0; }
.ob-tt b { display: block; font-weight: 600; font-size: calc(25 * var(--u)); line-height: calc(32 * var(--u)); color: #000; }
.ob-tt span { display: block; font-weight: 500; font-size: calc(18 * var(--u)); line-height: calc(32 * var(--u)); color: #818181; margin-top: calc(3 * var(--u)); }
.ob-right { display: grid; justify-items: end; gap: calc(15 * var(--u)); }
.ob-num { font-weight: 600; font-size: calc(35 * var(--u)); line-height: calc(32 * var(--u)); color: #6657F5; white-space: nowrap; }
.ob-flag {
  display: flex; align-items: center; gap: calc(5 * var(--u));
  width: calc(101 * var(--u)); height: calc(23 * var(--u)); padding-left: calc(12 * var(--u));
  background: #FDF1C3; border-radius: calc(11.5 * var(--u));
  font-weight: 500; font-size: calc(10 * var(--u)); line-height: 1; color: #000; white-space: nowrap;
}
.ob-flag svg { width: calc(9 * var(--u)); height: calc(7 * var(--u)); flex: none; transform: rotate(-37.87deg); }
.hashpill { background: #EFEBFE; color: #5346E8; font-size: 11px; font-weight: 500; padding: 3px 9px; border-radius: 999px; }

/* 03 — fan profile (Figma 471:4877 — 582x283) */
.fp-card {
  background: #fff; border: 1px solid #ECECEF; border-radius: calc(18 * var(--u));
  padding: calc(27 * var(--u)); display: grid; gap: calc(16 * var(--u));
  filter: drop-shadow(0 calc(30 * var(--u)) calc(35 * var(--u)) rgba(4,8,13,.12));
  font-family: var(--fu); line-height: normal;
}
.fp-head { display: flex; align-items: center; gap: calc(12 * var(--u)); }
.fp-ava { width: calc(44 * var(--u)); height: calc(44 * var(--u)); border-radius: calc(22 * var(--u)); flex: none; background: linear-gradient(135deg, #8C7DF8 0%, #6657F5 100%); }
.fp-id { flex: 1; min-width: 0; display: grid; gap: calc(2 * var(--u)); }
.fp-name { display: flex; align-items: center; gap: calc(9 * var(--u)); font-size: calc(15 * var(--u)); font-weight: 600; color: #04080D; }
.fp-pill { background: #EFEBFE; color: #5346E8; font-size: calc(10 * var(--u)); font-weight: 600; letter-spacing: calc(.4 * var(--u)); text-transform: uppercase; padding: calc(3 * var(--u)) calc(8 * var(--u)); border-radius: 999px; }
.fp-sub { font-size: calc(12 * var(--u)); color: #9CA3AF; }
.fp-live { display: flex; align-items: center; gap: calc(6 * var(--u)); font-size: calc(12 * var(--u)); font-weight: 500; color: #15803D; }
.fp-live .dot { width: calc(7 * var(--u)); height: calc(7 * var(--u)); border-radius: 50%; background: #16A34A; flex: none; }
.fp-table { border: 1px solid #ECECEF; border-radius: calc(12 * var(--u)); padding: calc(3 * var(--u)) 1px 1px; overflow: clip; }
.fp-tr { display: flex; justify-content: space-between; align-items: flex-start; gap: calc(10 * var(--u)); padding: calc(12 * var(--u)) calc(15 * var(--u)); }
.fp-tr + .fp-tr { border-top: 1px solid #F1F2F4; padding-top: calc(13 * var(--u)); }
.fp-tr .k { font-size: calc(13 * var(--u)); color: #5C6370; }
.fp-tr .v { font-size: calc(13 * var(--u)); font-weight: 600; color: #04080D; }
.fp-chips { display: flex; flex-wrap: wrap; gap: 0 calc(8 * var(--u)); height: calc(27 * var(--u)); }
.fp-chips span { background: #F2F2F5; color: #5C6370; font-size: calc(12 * var(--u)); padding: calc(6 * var(--u)) calc(12 * var(--u)); border-radius: 999px; display: flex; align-items: center; }

/* 02 — chat demo (Figma 471:4054 — 678x845 stage, card 547x784 at 74,46).
   Laid out absolutely, exactly as the Figma frame: this is a screenshot-style
   mockup, so faithful geometry beats reflow. */
.cd-stage { position: relative; height: calc(845 * var(--u)); font-family: var(--fu); }
.cd-stage > img { position: absolute; }
.cd-dust-l { left: 0; top: 0; width: calc(76 * var(--u)); height: calc(809 * var(--u)); }
.cd-dust-r { left: calc(621 * var(--u)); top: calc(109 * var(--u)); width: calc(57 * var(--u)); height: calc(736 * var(--u)); transform: rotate(180deg); }
.cd-eye { left: calc(554 * var(--u)); top: 0; width: calc(105 * var(--u)); height: calc(65 * var(--u)); }
.cd-lips { left: calc(12.25 * var(--u)); top: calc(666.85 * var(--u)); width: calc(88.09 * var(--u)); height: calc(60.1 * var(--u)); transform: rotate(-21.08deg); }

.cd-card {
  position: absolute; left: calc(74 * var(--u)); top: calc(46 * var(--u));
  width: calc(547 * var(--u)); height: calc(784 * var(--u));
  background: rgba(255,255,255,.87); border-radius: calc(30 * var(--u));
  box-shadow: 0 calc(4 * var(--u)) calc(15 * var(--u)) rgba(0,0,0,.08);
}
.cd-card > * { position: absolute; }

/* header */
.cd-back { left: calc(21.75 * var(--u)); top: calc(42.8 * var(--u)); width: calc(26.5 * var(--u)); height: calc(18.41 * var(--u)); transform: rotate(180deg); }
.cd-ava { left: calc(65 * var(--u)); top: calc(26 * var(--u)); width: calc(60 * var(--u)); height: calc(60 * var(--u)); border-radius: 50%; }
.cd-name { left: calc(144 * var(--u)); top: calc(35 * var(--u)); font-family: var(--fb); font-weight: 600; font-size: calc(18 * var(--u)); line-height: calc(18 * var(--u)); color: #000; }
.cd-verified { left: calc(197 * var(--u)); top: calc(40 * var(--u)); width: calc(16 * var(--u)); height: calc(16 * var(--u)); }
.cd-dot { left: calc(146 * var(--u)); top: calc(68 * var(--u)); width: calc(9 * var(--u)); height: calc(9 * var(--u)); border-radius: 50%; background: #44DC79; }
.cd-online { left: calc(163 * var(--u)); top: calc(57 * var(--u)); height: calc(29 * var(--u)); display: flex; align-items: center; font-family: var(--fd); font-weight: 300; font-size: calc(15 * var(--u)); letter-spacing: 0; color: #000; }
.cd-live {
  left: calc(379 * var(--u)); top: calc(29 * var(--u));
  width: calc(138.58 * var(--u)); height: calc(41.45 * var(--u));
  background: #fff; border: max(1px, calc(.5 * var(--u))) solid #D5B9F3; border-radius: calc(11.5 * var(--u));
}
.cd-live i { position: absolute; left: calc(10.9 * var(--u)); top: calc(16.22 * var(--u)); width: calc(9.34 * var(--u)); height: calc(10.81 * var(--u)); border-radius: 50%; background: #44DC79; }
.cd-live span { position: absolute; left: calc(28 * var(--u)); top: 0; height: 100%; display: flex; align-items: center; font-family: var(--fd); font-weight: 300; font-size: calc(15 * var(--u)); color: #000; }
.cd-div { left: calc(1 * var(--u)); top: calc(97 * var(--u)); width: calc(541 * var(--u)); height: 1px; background: #D7BEF7; }

/* message bubbles — Inter Regular 15 / line box 18 */
.cd-b { font-weight: 400; font-size: calc(15 * var(--u)); line-height: calc(18 * var(--u)); color: #04080D; }
.cd-fan {
  background: #F3ECFC; padding: calc(12 * var(--u)) calc(16 * var(--u));
  border-radius: calc(18 * var(--u)) calc(18 * var(--u)) calc(5 * var(--u)) calc(18 * var(--u));
}
.cd-b1 { left: calc(109 * var(--u)); top: calc(124 * var(--u)); width: calc(302 * var(--u)); height: calc(79 * var(--u)); }
.cd-b3 { left: calc(113 * var(--u)); top: calc(325 * var(--u)); width: calc(298 * var(--u)); height: calc(79 * var(--u)); }
.cd-b2 {
  left: calc(108 * var(--u)); top: calc(235 * var(--u)); width: calc(361 * var(--u)); height: calc(58 * var(--u));
  background: #FDFDFE; border: 1px solid #DADADA; color: #000;
  padding: calc(12 * var(--u)) calc(16 * var(--u)) calc(12 * var(--u)) calc(14 * var(--u));
  border-radius: calc(18 * var(--u)) calc(18 * var(--u)) calc(18 * var(--u)) calc(5 * var(--u));
}

/* avatars: 17px star badge pinned bottom-right, as in Figma */
.cd-av { border-radius: 50%; }
.cd-av img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; display: block; }
.cd-av > svg { position: absolute; width: calc(17 * var(--u)); height: calc(17 * var(--u)); }
.cd-avf1 { left: calc(427 * var(--u)); top: calc(134 * var(--u)); width: calc(55 * var(--u)); height: calc(57 * var(--u)); }
.cd-avf2 { left: calc(427 * var(--u)); top: calc(339 * var(--u)); width: calc(51 * var(--u)); height: calc(53 * var(--u)); }
.cd-avf1 > svg { left: calc(38 * var(--u)); top: calc(44 * var(--u)); }
.cd-avf2 > svg { left: calc(38 * var(--u)); top: calc(44 * var(--u)); }
.cd-avc1 { left: calc(35 * var(--u)); top: calc(243 * var(--u)); }
.cd-avc2 { left: calc(35 * var(--u)); top: calc(436 * var(--u)); }
.cd-avc1, .cd-avc2 { width: calc(43.68 * var(--u)); height: calc(44.13 * var(--u)); }
.cd-avc1 > svg, .cd-avc2 > svg { left: calc(30 * var(--u)); top: calc(28 * var(--u)); }

/* unlock card */
.cd-unlock {
  left: calc(114 * var(--u)); top: calc(436 * var(--u));
  width: calc(368 * var(--u)); height: calc(191 * var(--u));
  background: #8D70EE; border-radius: calc(16 * var(--u));
}
.cd-unlock > * { position: absolute; }
.cd-uc-media { left: calc(16 * var(--u)); top: calc(16 * var(--u)); width: calc(157 * var(--u)); height: calc(108 * var(--u)); border-radius: calc(15 * var(--u)); object-fit: cover; }
.cd-uc-t { left: calc(184 * var(--u)); top: calc(35 * var(--u)); width: calc(148 * var(--u)); text-align: center; font-family: var(--fb); font-weight: 600; font-size: calc(20 * var(--u)); line-height: calc(19 * var(--u)); letter-spacing: calc(-.16 * var(--u)); color: #FCF9F3; }
.cd-uc-p { left: calc(186 * var(--u)); top: calc(63 * var(--u)); font-family: var(--fj); font-weight: 500; font-size: calc(12 * var(--u)); line-height: calc(18.6 * var(--u)); letter-spacing: calc(-.16 * var(--u)); color: #FCF9F3; white-space: nowrap; }
.cd-uc-btn {
  left: calc(18 * var(--u)); top: calc(148 * var(--u)); width: calc(332 * var(--u)); height: calc(33 * var(--u));
  background: rgba(231,229,253,.37); border-radius: calc(12.5 * var(--u));
  display: flex; align-items: center; justify-content: center; gap: calc(9 * var(--u));
  font-weight: 600; font-size: calc(15 * var(--u)); color: #fff;
}
.cd-uc-btn svg { width: calc(19 * var(--u)); height: calc(19 * var(--u)); flex: none; }

/* footer confirmation pill */
.cd-pill {
  left: calc(57 * var(--u)); top: calc(671 * var(--u));
  width: calc(445.34 * var(--u)); height: calc(57.67 * var(--u));
  background: #8D70EE; border: 1px solid #C9BCF0; border-radius: calc(16 * var(--u));
  display: flex; align-items: center; justify-content: center;
  font-family: var(--fj); font-weight: 600; font-size: calc(12.5 * var(--u));
  line-height: calc(19.38 * var(--u)); letter-spacing: calc(-.16 * var(--u)); color: #fff;
}

/* =====================================================================
   v3 SYNC — kick caps, feature 01 card, feature 04 live stream,
   chat flip, where/results/you-us/timeline/control restyles
===================================================================== */

/* feature kick — uppercase spaced variant (04 / 05 / 06) */
.kick.caps { font-family: var(--fu); font-weight: 700; font-size: clamp(11.5px, 1.1vw, 13px); letter-spacing: .16em; text-transform: uppercase; }


/* ---------- feature 04 — live stream ---------- */
/* ---------- feature 04 live stream (Figma 471:5492 head / 471:5005 tabs / 471:4917 panel) ---------- */
.feat04-head { display: flex; flex-direction: column; align-items: center; gap: 21px; text-align: center; margin: 0 auto clamp(30px, 3.5vw, 56px); }
/* Figma Hand Bold 13 / tracking 1.56 / #6657F5 */
.feat04-head .kick.caps { font-family: var(--fh); font-weight: 700; font-size: 15px; letter-spacing: 1.56px; text-transform: uppercase; color: #6657F5; display: block; margin: 0; }
/* Bricolage Medium 55 / line-height 60 / tracking -1.2 */
.feat04-head h3 { font-size: clamp(2.05rem, 3.44vw, 3.4375rem); font-weight: 500; line-height: 1.091; letter-spacing: -0.0218em; color: #04080D; }
/* Inter Regular 18 / line-height 28.8 / #5C6370, 526px measure, left-aligned */
.feat04-head .lead { width: min(100%, 526px); margin: 0; font-family: var(--fu); font-weight: 400; font-size: clamp(15px, 1.125vw, 18px); line-height: 1.6; color: #5C6370; text-align: left; }

.stream-tabs { display: flex; justify-content: center; gap: calc(51 * var(--u)); margin-bottom: clamp(24px, 2.6vw, 41px); position: relative; }
.stab {
  /* The 2px stroke is a design-px value like everything else in a .mock, so it
     has to ride --u — left fixed it reads 4x too heavy once --u drops to .3
     (2px around a 16.7px-tall pill). 1px is the floor so it never disappears. */
  --sbw: max(1px, calc(2 * var(--u)));
  height: calc(56 * var(--u)); flex: none;
  display: flex; align-items: center; justify-content: center;
  border: var(--sbw) solid #000; border-radius: calc(30 * var(--u));
  font-family: var(--fb); font-weight: 400; font-size: calc(20 * var(--u)); line-height: calc(24 * var(--u));
  color: #04080D; white-space: nowrap;
}
.stab:nth-child(1) { width: calc(200.79 * var(--u)); background: #F8F96F; border-radius: calc(33 * var(--u)); font-weight: 500; font-size: calc(24 * var(--u)); position: relative; }
/* Hand-drawn offset shadow behind the active tab. The border width is
   subtracted so the black peeks out bottom-right; subtracting a flat 2px
   inverted the offset below u≈0.43 (at u=.299 it landed at -0.2,-0.6, i.e.
   up-LEFT of the pill and clipped by the section edge). */
.stab:nth-child(1)::before {
  content: ''; position: absolute; z-index: -1; background: #000;
  left: calc(5.87 * var(--u) - var(--sbw)); top: calc(4.54 * var(--u) - var(--sbw));
  width: calc(204.4 * var(--u)); height: calc(50.89 * var(--u)); border-radius: calc(43 * var(--u));
}
.stab:nth-child(2) { width: calc(256.18 * var(--u)); }
.stab:nth-child(3) { width: calc(253.87 * var(--u)); }
.stab:nth-child(4) { width: calc(280.42 * var(--u)); }
/* Figma 471:5952 — a flat vector cursor (pale-yellow fill, 1.5px black
   stroke), not the ☝️ emoji that was standing in for it. 39.66x58.98 at
   frame (396,7115), i.e. (158.36,30) inside the first tab. */
.stab-hand { position: absolute; left: calc(158.36 * var(--u)); top: calc(30 * var(--u));
  width: calc(39.66 * var(--u)); height: calc(58.98 * var(--u)); pointer-events: none; }

.stream { display: flex; gap: calc(24 * var(--u)); align-items: flex-start; }
.stream-video { width: calc(751 * var(--u)); flex: none; border-radius: calc(16 * var(--u)); overflow: hidden; background: #111; }
.sv-media { position: relative; height: calc(532 * var(--u)); }
.sv-media img { width: 100%; height: 100%; object-fit: cover; }
.live-badge {
  position: absolute; left: calc(30 * var(--u)); top: calc(27 * var(--u));
  width: calc(176 * var(--u)); height: calc(36 * var(--u));
  display: flex; align-items: center; gap: calc(13 * var(--u)); padding-left: calc(16 * var(--u));
  background: #fff; border-radius: calc(9 * var(--u));
  font-family: var(--fu); font-weight: 600; font-size: calc(16 * var(--u)); line-height: 1; color: #04080D;
}
.live-badge .dot { width: calc(12 * var(--u)); height: calc(11 * var(--u)); border-radius: 50%; background: #E5484D; flex: none; }
.live-badge .tt { color: #656565; font-weight: 500; }
.stream-controls { height: calc(135 * var(--u)); background: #C9BCF0; display: flex; align-items: center; justify-content: center; gap: calc(26 * var(--u)); }
.sctl { display: grid; justify-items: center; gap: calc(8 * var(--u)); font-family: var(--fu); font-size: calc(13 * var(--u)); line-height: 1; color: #5B5570; }
.sctl .ci { width: calc(44 * var(--u)); height: calc(44 * var(--u)); border-radius: 50%; background: #fff; display: grid; place-items: center; color: #4A4560; }
.sctl .ci svg { width: calc(22 * var(--u)); height: calc(22 * var(--u)); }
.sctl.end { color: #FF3734; font-weight: 600; }
.sctl.end .ci { background: #FF3734; color: #fff; }
.sctl.end .ci svg { width: calc(26 * var(--u)); height: calc(26 * var(--u)); }

.stream-side {
  width: calc(382 * var(--u)); height: calc(667 * var(--u)); flex: none;
  background: #fff; border: 1px solid #606060; border-radius: calc(16 * var(--u));
  padding: calc(26 * var(--u)) calc(32 * var(--u)) 0;
  display: flex; flex-direction: column; font-family: var(--fu);
}
.ss-head { display: flex; align-items: baseline; gap: calc(29 * var(--u)); font-size: calc(17 * var(--u)); line-height: calc(21 * var(--u)); }
.ss-head .ss-chat { color: #5f5f5f; }
.ss-head .ss-att { font-weight: 600; }
.ss-head .ss-count { margin-left: auto; font-weight: 600; }
.ss-head .mut { color: #5f5f5f; font-weight: 500; }
.stream-grid { display: grid; grid-template-columns: 1fr 1fr; gap: calc(20 * var(--u)) calc(30 * var(--u)); margin-top: calc(38 * var(--u)); }
/* no position: relative — the mic badge it anchored was never in the frame */
.satt { margin: 0; display: grid; justify-items: center; gap: calc(17 * var(--u)); }
.satt img { width: 100%; aspect-ratio: 147 / 190; object-fit: cover; border-radius: calc(10 * var(--u)); }
.satt figcaption {
  height: calc(26 * var(--u)); display: flex; align-items: center; max-width: 100%;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  background: #C9BCF0; font-size: calc(13 * var(--u)); padding-inline: calc(7 * var(--u)); border-radius: calc(5 * var(--u));
}
.stream-bundle { margin-top: auto; margin-bottom: calc(20 * var(--u)); height: calc(66 * var(--u)); display: flex; align-items: center; gap: calc(12 * var(--u)); border: 1px solid #ECECEF; border-radius: calc(12 * var(--u)); padding-inline: calc(14 * var(--u)); }
.stream-bundle > div { flex: 1; min-width: 0; }
.stream-bundle .cc-badge.lav { width: calc(38 * var(--u)); height: calc(38 * var(--u)); border-radius: calc(11 * var(--u)); }
.stream-bundle .cc-badge svg { width: calc(19 * var(--u)); height: calc(19 * var(--u)); }
.stream-bundle .cc-t { font-size: calc(15 * var(--u)); font-weight: 600; }
.stream-bundle .cc-s { font-size: calc(12 * var(--u)); color: #9CA3AF; margin-top: calc(3 * var(--u)); }
.stream-bundle .cc-price { font-size: calc(20 * var(--u)); }

/* Stacked below 800: side by side, the 382-wide panel is under 250px there and
   its 17px type renders below 11px. Kept next to the component on purpose —
   the old overrides lived in the RESPONSIVE block 90 lines away and had drifted
   into setting grid-template-columns on a flex container, so the stack they
   were meant to produce never happened.
   Each column re-derives --u from its OWN design width, so the mockup keeps
   scaling as one piece instead of boxes growing while their contents stay
   small. 100cqw resolves against .mock (neither column is a container itself),
   and the min() caps each at design size so nothing renders larger than 1:1. */
@media (max-width: 800px) {
  .stream { flex-direction: column; align-items: center; gap: clamp(16px, 3vw, 24px); }
  .stream-video { width: min(100%, 751px); --u: calc(min(100cqw, 751px) / 751); }
  .stream-side  { width: min(100%, 382px); --u: calc(min(100cqw, 382px) / 382); }

  /* The four pills run 1144 design px on one line, so scaling them off that
     leaves 7px labels next to a mockup that is now near 1:1. Wrap to two rows
     and scale off the wider row (253.87 + 51 + 280.42 = 585.3, rounded up to
     600 for slack) instead. flex-start, not center: .stab-hand is absolutely
     placed 158.36 design px from the ROW's left edge, so centring the short
     first row slides the cursor 32px back into the middle of the label. */
  .stream-tabs { flex-wrap: wrap; justify-content: flex-start;
    --u: calc(min(100cqw, 600px) / 600); row-gap: calc(16 * var(--u)); }
}

/* ---------- where cards — glyph icons + tilt ---------- */
.wcard::before { display: none; }
.wcard.in { transform: rotate(var(--rot, 0deg)); }
.wcard:nth-child(1) { --rot: -3deg; }
.wcard:nth-child(2) { --rot: 2.4deg; }
.wcard:nth-child(3) { --rot: -2deg; }
.wcard:nth-child(4) { --rot: 3deg; }
.wcard .wic svg { display: block; }

/* ---------- results — glyph icons, ✦ divider, tilted ribbon ---------- */
.results { overflow: clip; }
.results-band { width: 106%; margin-left: -3%; transform: rotate(-2deg); }
.rgrid { transform: rotate(2deg); }
.rico { width: 46px; height: 46px; border-radius: 50%; background: var(--purple-tint); display: grid; place-items: center; margin: 0 auto 12px; }
.rdiv { display: block; color: var(--purple); font-size: 12px; margin: 9px auto 6px; opacity: .75; }
.rcard.in { transform: rotate(var(--rot, 0deg)); }
.rcard:nth-child(1) { --rot: -2.4deg; }
.rcard:nth-child(2) { --rot: 1.6deg; }
.rcard:nth-child(3) { --rot: -1.4deg; }
.rcard:nth-child(4) { --rot: 2.4deg; }

/* ---------- you / us — folder-tab cards + checklist ---------- */
.yu-card { position: relative; border-radius: 0 var(--r-lg) var(--r-lg) var(--r-lg); padding: 30px 28px 26px; }
.yu-card::before { content: ""; position: absolute; top: -15px; left: 0; width: 40%; height: 18px; border-radius: 12px 14px 0 0; }
.yu-card.you, .yu-card.you::before { background: #fff; }
.yu-card.us, .yu-card.us::before { background: var(--purple-tint); }
.yu-head { display: flex; align-items: center; gap: 8px; font-family: var(--fu); font-weight: 700; font-size: 12px; letter-spacing: .12em; color: var(--grey-3); margin-bottom: 18px; }
.yu-ic { width: 22px; height: 22px; border-radius: 6px; background: rgba(108,92,231,.14); display: grid; place-items: center; color: var(--purple); }
.yu-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 15px; }
.yu-list li { position: relative; padding-left: 28px; font-family: var(--fu); font-size: 14.5px; color: var(--ink); line-height: 1.35; }
.yu-list li::before { content: "✓"; position: absolute; left: 4px; top: 0; font-weight: 800; color: var(--purple-bright); }

/* ---------- timeline — role badges + folder-tab day ---------- */
.tl-badge { display: inline-block; margin-top: 14px; font-family: var(--fu); font-weight: 700; font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; padding: 5px 11px; border-radius: 999px; background: var(--purple-tint); color: var(--purple-deep); }
.tl-badge.you { background: #E2F6EA; color: #1F9D55; }
.tl .day { border-radius: 0 9px 9px 9px; transform: none; }
.tl .day::before { content: ""; position: absolute; top: -6px; left: 0; width: 42%; height: 8px; background: var(--purple); border-radius: 6px 7px 0 0; }
.tl .day { position: relative; }
.tl.hl .day, .tl.hl .day::before { background: var(--purple-deep); }

/* ---------- control — clean ellipse outlines + line icons ---------- */
.blobcard { border-radius: 50%; padding: 34px 46px; min-height: 172px; display: flex; flex-direction: column; justify-content: center; text-align: left; }
.blobcard:nth-child(2n) { border-radius: 50%; transform: rotate(.8deg); }
.blobcard:nth-child(3n) { border-radius: 50%; transform: rotate(-.9deg); }
.blobcard h4 { padding-right: 34px; }
.ic-line { position: absolute; top: 30px; right: 46px; display: grid; place-items: center; }
.ic-line svg { display: block; }

/* =====================================================================
   RESPONSIVE
===================================================================== */
@media (max-width: 980px) {
  /* hero drops out of the 1600px design stage into normal flow */
  .hero .stage { aspect-ratio: auto; height: auto; padding: 40px 0 56px; container-type: normal; --u: 1px; }
  .hero .stage > * { position: static; }
  .hero .h-plusses, .hero .h-sparkle { display: none; }
  .hero .hero-copy { width: min(100% - 44px, 680px); margin-inline: auto; }
  /* Min rides vw, not the old 2.4rem floor: "Run your business" has to hold
     one line down to ~320px or the br strands "on Autopilot." mid-phrase. */
  .hero h1 { font-size: clamp(1.8rem, 9vw, 4rem); line-height: 1.02; }
  .hero-sub { width: 100%; font-size: clamp(1.05rem, 2.6vw, 1.4rem); line-height: 1.4; }
  /* the desktop break lands mid-phrase at phone widths; let it flow */
  .hero-sub br { display: none; }
  .hero-actions { margin-top: 32px; gap: 14px; flex-wrap: wrap; }
  .hero .btn { height: 52px; font-size: 16px; }
  .hero .btn-yellow { width: auto; padding: 0 28px; }
  .hero .hero-collage { display: block; width: min(100% - 22px, 620px); margin: 34px auto 0; }
  .nav-in { padding-inline: 22px; }
  .feat-grid { grid-template-columns: 1fr; }
  .feat-grid.flip .copy { order: 0; }
  .compare { grid-template-columns: 1fr; max-width: 480px; }
  .where-cards, .rgrid { grid-template-columns: 1fr 1fr; }
  .where { padding-bottom: clamp(64px, 8vw, 90px); }
  .where-cards { margin-top: clamp(30px, 4vw, 48px); }
  .wcard:nth-child(1), .wcard:nth-child(2), .wcard:nth-child(3), .wcard:nth-child(4) { margin-top: 0; }
  .where-arrow { display: none; }
  .youus { grid-template-columns: 1fr; }
  .folders { grid-template-columns: 1fr 1fr; }
  .ctrl-grid { grid-template-columns: 1fr 1fr; }

  /* ---------- burger menu ----------
     The bar's own <nav> becomes the panel, so there is a single list of
     links in the markup and the phone menu maps the whole page the same
     way the desktop bar does. .nav.open beats the two-class selector that
     positions and hides it. */
  .nav-burger { display: flex; }
  .nav-in > .nav-links {
    display: none;
    /* +3px clears .nav::after, the rainbow rule, which is the separator the
       panel would otherwise cover */
    position: absolute; left: 0; right: 0; top: calc(100% + 3px); transform: none;
    flex-direction: column; gap: 0;
    /* 22px, off the 8pt grid on purpose: it is the bar's own gutter, so the
       panel's links line up under the logo instead of 2px inside it */
    padding: 8px 22px 24px;
    /* solid, not the bar's translucent cream: the hero collage sits right
       under this and shows through anything less */
    background: var(--hero-bg);
    box-shadow: 0 24px 44px -26px rgba(35, 25, 80, .5);
  }
  .nav.open .nav-in > .nav-links { display: flex; }
  .nav-links a {
    font-family: var(--fd); font-size: 19px; font-weight: 600;
    padding: 16px 0; border-bottom: 1px solid var(--hair);
  }
  .nav-links a:last-child { border-bottom: 0; }
  .footer-grid { grid-template-columns: 1fr; text-align: center; }
  .f-left { min-height: 0; }
  .f-item { grid-template-columns: 1fr; justify-items: center; }
  /* partners band leaves the stage too: one column, cards at readable size
     instead of the two of them sharing 680 design units of a shrinking frame */
  .pinkband .stage {
    aspect-ratio: auto; height: auto; container-type: normal; --u: 1px;
    display: grid; justify-items: center;
    padding: 48px 22px 96px;
  }
  .pinkband .stage > * { position: static; }
  .pinkband .pb-star, .pinkband .pb-heart { display: none; }
  .pinkband .tag-pink { width: auto; height: auto; }
  .pinkband .pb-title {
    width: auto; margin-top: 16px; text-align: center;
    font-size: clamp(1.7rem, 6.4vw, 2.6rem); line-height: 1.2;
  }
  .pinkband .pb-cards {
    /* no authored gap: each half of the webp brings its own pink margin */
    width: min(100%, 360px); aspect-ratio: auto;
    display: grid; margin-top: 24px;
  }
  .pinkband .pb-cards .pb-link { position: static; width: 100%; aspect-ratio: 680 / 256; }
}
@media (max-width: 600px) {
  .where-cards, .rgrid, .folders, .ctrl-grid { grid-template-columns: 1fr; }
  .wcard.in, .rcard.in { transform: none; }
  .results-band { width: 100%; margin-left: 0; transform: none; }
  .rgrid { transform: none; }
  .blobcard { border-radius: var(--r-lg); padding: 28px 30px; min-height: 0; }
  .ic-line { right: 26px; }
  .tl { grid-template-columns: 1fr; }
  .tl .day { justify-self: start; margin-top: 0; }
  .prow { grid-template-columns: 1fr; gap: 4px; }
  .hero-actions .btn { flex: 1; }
}
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1 !important; transform: none !important; transition: none; }
  [data-anim] .ai { opacity: 1 !important; transform: none !important; transition: none; }
  .typing { display: none !important; }
  .typing i { animation: none; }
  .pb-link:hover { animation: none; }
}


/* creators section — mobile */
@media (max-width: 600px) {
  .creators-title { padding-inline: 10px; }
  .creators .side-hand { position: static; display: block; transform: rotate(-4deg); margin-top: 6px; white-space: normal; }
  .creators .side-hand br { display: none; }
  .creators-title .title-star { display: none; }
  .creators-wall { flex-wrap: wrap; gap: 14px 10px; margin-top: 10px; padding-inline: 12px; }
  .ccard.t1, .ccard.t2, .ccard.t3, .ccard.t4 { width: 44%; transform: rotate(-2deg); }
  .ccard.t2 { transform: rotate(2deg) translateY(10px); }
  .ccard.t3 { transform: rotate(1.5deg); }
  .ccard.t4 { transform: rotate(-1.5deg) translateY(10px); }
}

/* ---------- feature 05 About-you card (Figma 471:5039 — 582 wide) ---------- */
.ab-card {
  background: #fff; border: 1px solid #ECECEF; border-radius: calc(18 * var(--u));
  padding: calc(27 * var(--u)); display: flex; flex-direction: column; gap: calc(10 * var(--u));
  filter: drop-shadow(0 calc(30 * var(--u)) calc(35 * var(--u)) rgba(4,8,13,.12));
  font-family: var(--fu); line-height: normal;
}
.ab-row { display: flex; align-items: center; justify-content: space-between; }
.ab-row2 { padding-top: calc(10 * var(--u)); }
.ab-lbl { font-weight: 600; font-size: calc(11 * var(--u)); letter-spacing: calc(.55 * var(--u)); text-transform: uppercase; color: #9CA3AF; }
.ab-wrote { display: flex; align-items: center; gap: calc(5 * var(--u)); font-size: calc(12 * var(--u)); color: #6657F5; }
.ab-wrote svg { width: calc(12 * var(--u)); height: calc(12 * var(--u)); flex: none; }
.ab-built { font-size: calc(12 * var(--u)); color: #9CA3AF; }
.ab-quote {
  margin: 0; background: #F7F8FA; border-left: calc(3 * var(--u)) solid #6657F5;
  border-radius: 0 calc(12 * var(--u)) calc(12 * var(--u)) 0;
  padding: calc(14 * var(--u)) calc(16 * var(--u)) calc(14 * var(--u)) calc(19 * var(--u));
  font-style: italic; font-size: calc(13 * var(--u)); line-height: calc(20.15 * var(--u)); color: #5C6370;
}
.ab-chips { display: flex; flex-wrap: wrap; gap: calc(13 * var(--u)) calc(8 * var(--u)); padding-top: calc(3 * var(--u)); }
.ab-chips span {
  height: calc(29 * var(--u)); display: flex; align-items: center;
  padding-inline: calc(12 * var(--u)); border-radius: 999px;
  background: #F2F2F5; font-size: calc(13 * var(--u)); color: #5C6370; white-space: nowrap;
}
.ab-chips .lav { background: #EFEBFE; color: #5346E8; }
.ab-chips .add { background: none; border: 1px dashed #C9C1FB; color: #6657F5; padding-inline: calc(13 * var(--u)); }

/* features 04-06 use a tighter Inter lead + Bricolage Medium heading (not the DM Sans lead of 01-03) */
.copy-alt .kick.caps { display: block; font-family: var(--fh); font-weight: 400; font-size: 15px; letter-spacing: 1.56px; text-transform: uppercase; color: #6657F5; margin-bottom: 14.7px; transform: none; }
.copy-alt h3 { font-size: clamp(1.9rem, 3.125vw, 3.125rem); font-weight: 500; line-height: .95; letter-spacing: -0.024em; }
.copy-alt .lead { font-family: var(--fu); font-weight: 400; font-size: clamp(15px, 1.125vw, 18px); line-height: 1.6; color: #5C6370; margin-top: 14.7px; max-width: none; }

/* hero doodles missing from the first build (Figma stage offsets) */
.collage .c-heart-top { left: calc(370 * var(--u)); top: calc(23 * var(--u)); width: calc(25 * var(--u)); z-index: 5; }
.collage .c-star-sm { left: calc(377 * var(--u)); top: calc(268 * var(--u)); width: calc(28 * var(--u)); z-index: 5; }
.collage .c-hand { left: calc(30 * var(--u)); top: calc(545 * var(--u)); width: calc(125 * var(--u)); z-index: 6; }
.collage .c-heart-cr { left: calc(172 * var(--u)); top: calc(610 * var(--u)); width: calc(36 * var(--u)); z-index: 6; }
.collage .c-autopilot { left: calc(615 * var(--u)); top: calc(272 * var(--u)); width: calc(80 * var(--u)); z-index: 6; }

/* =====================================================================
   v3 ALIGNMENT PASS — backgrounds, doodles, section rhythm
   Every number below is a raw coordinate read off the 1600px Figma frame
   `creatorlabsv3` (471-4041), sampled from a 1:1 render of the frame.
   ===================================================================== */

/* ---------- palette corrections (sampled from the frame) ---------- */
:root {
  --cream: #F8F2EA;         /* was #F7F1E8 */
  --yellow: #F8F96F;        /* stat band, feature-03 blob */
  --yellow-hot: #F8FE25;    /* results slab + its eyebrow pill */
  --pink-blob: #F8C9EB;     /* feature 01 / 05 slabs */
  --lav-band: #C9BCF0;      /* feature 06 / where slabs */
}

/* ---------- full-bleed background primitives ----------
   .tiltband  — a rotated slab (both edges parallel). Rotation keeps the
                angle constant at any viewport width, which is what the
                design intends; it is sized well past 100vw so the corners
                never pull in.
   .wedge     — a slab whose two edges are NOT parallel, so it has to be a
                clip-path polygon rather than a rotation.                */
.tiltband {
  position: absolute; left: 50%; top: var(--cy);
  width: 220vw; min-width: 3600px; height: var(--t);
  transform: translate(-50%, -50%) rotate(var(--a));
  background: var(--c); z-index: 0; pointer-events: none;
}
.wedge {
  position: absolute; left: 50%; translate: -50% 0; top: var(--top);
  width: 100vw; min-width: 1600px; height: var(--h);
  background: var(--c); z-index: 0; pointer-events: none;
}

/* =====================================================================
   STATEMENT — Figma: h2 caps at y3995/4071, marker plate 471:4122
   (1047,4077 407x104), stars 471:4866 / 471:4867.
   The frame also repeats the "Creator stories" pill here one section after
   the real Creator-stories block — treated as a comp leftover, not shipped.
===================================================================== */
.statement-sec { padding-block: clamp(96px, 18.8vw, 301px) clamp(40px, 4.3vw, 69px); }
.statement h2 { font-size: clamp(2.3rem, 5.625vw, 5.625rem); line-height: .845; letter-spacing: -.03em; }
/* marker plate: purple type on the yellow slab, not black */
.statement .hl {
  padding: calc(6 * var(--sc)) calc(22 * var(--sc)); transform: rotate(-1deg);
  color: var(--purple-bright); background: var(--yellow-deep);
  font-size: calc(84 * var(--sc)); line-height: 1;
}
.statement { --sc: min(1px, 100vw / 1600); }
.statement .lead { max-width: calc(640 * var(--sc)); margin-top: calc(50 * var(--sc)); font-size: calc(25 * var(--sc)); line-height: 1.4; }
.st-star { position: absolute; z-index: 1; pointer-events: none; }
.st-star-l { left: calc(50% - 547 * var(--sc)); top: calc(-45 * var(--sc)); width: calc(38 * var(--sc)); }
.st-star-r { left: calc(50% + 623 * var(--sc)); top: calc(24 * var(--sc)); width: calc(62 * var(--sc)); }

/* =====================================================================
   FEATURE 05 — pink slab 471:4196 (rotated -8.2deg, 578px of vertical cover)
===================================================================== */
.feat05 { padding-block: clamp(56px, 6.1vw, 98px); overflow: visible; }
.tb-f05 { --cy: 224px; --t: 572px; --a: -8.17deg; --c: var(--pink-blob); }
.f05-arrow { position: absolute; right: calc(-1 * clamp(10px, 1.4vw, 23px)); bottom: -90px; width: clamp(200px, 22.9vw, 366px); z-index: 1; pointer-events: none; }

/* =====================================================================
   FEATURE 06 — lavender wedge 471:4195 (edges are not parallel)
===================================================================== */
.feat06 { background: none; overflow: visible; }
.wg-f06 { --top: -69px; --h: 750px; --c: var(--lav-band);
  clip-path: polygon(0 137px, 100% 89px, 100% 679px, 0 496px); }

/* =====================================================================
   WHERE — cream, with the lavender slab 471:4124 running under the cards
===================================================================== */
.where { background: none; overflow: clip; }
.tb-where { --cy: 677px; --t: 344px; --a: -6.82deg; --c: var(--lav-band); }

/* =====================================================================
   RESULTS — yellow slab 471:4125 tilts DOWN to the right (+7.4deg) and the
   stat cards ride it, so the grid is not counter-rotated any more.
===================================================================== */
.results-band { background: var(--yellow-hot); width: 132%; margin-left: -16%; transform: rotate(7.39deg); }
.rgrid { transform: none; }
.rcard.in { transform: none; }
.tag-yellow { background: var(--yellow-hot); color: #000; }

/* =====================================================================
   TWO WEEKS — white slab 471:4123 with torn paper edges 471:4199 / 471:4200
===================================================================== */
.weeks-sec { background: #fff; overflow: visible; }
.weeks-torn { position: absolute; left: 50%; translate: -50% 0; width: 100%;
  object-fit: fill; z-index: 1; pointer-events: none; }
.weeks-torn.top    { height: calc(169 / 1600 * var(--frame-w)); }
.weeks-torn.bottom { height: calc(161 / 1600 * var(--frame-w)); }
.weeks-torn.top { bottom: 100%; margin-bottom: -2px; }
.weeks-torn.bottom { top: 100%; margin-top: -2px; }

/* =====================================================================
   FEATURE 04 — brush figure 471:4042 (-63,6485 651x829), bleeds off-canvas
===================================================================== */
.f04-brush { position: absolute; left: calc(50% - 863px); top: 100px; width: 651px; z-index: 1; pointer-events: none; }

/* =====================================================================
   FINAL CTA — rule 471:5474, square yellow button, logo lockup 471:5512
===================================================================== */
.final { position: relative; padding-block: clamp(52px, 6vw, 96px) 0; }
.final::before {
  content: ""; position: absolute; left: 50%; translate: -50% 0; top: 0;
  width: 100vw; min-width: 1600px; height: 3px;
  background: linear-gradient(90deg,
    #b288e7 0 7.14%, #6657f5 7.14% 14.29%, #7751f4 14.29% 21.43%,
    #ebacff 21.43% 42.86%, #bec7ff 42.86% 64.29%, #b086e7 64.29% 85.71%,
    #d5b9f3 85.71% 100%);
}
.final .wrap { position: relative; }
.final h2 { font-size: clamp(2.1rem, 4.5vw, 4.5rem); font-weight: 700; letter-spacing: -.035em; }
.final .fin-star { color: var(--purple); font-size: .5em; vertical-align: .55em; }
.final .lead { max-width: 560px; font-size: clamp(1rem, 1.25vw, 1.25rem); color: var(--grey); margin: 26px auto 30px; }
/* Figma: 207x53 square plate, 2px ink rule, hard offset shadow */
.final .btn-yellow {
  border-radius: 0; border: 2px solid #000; background: var(--yellow-deep);
  width: 207px; height: 53px; padding: 0; gap: 14px;
  font-family: var(--fbtn); font-weight: 500; font-size: 18px;
  box-shadow: 4px 4px 0 #000;
}
.final .btn-yellow::after { content: "⟶"; font-size: 20px; }
.final .btn-yellow:hover { transform: translate(2px, 2px); box-shadow: 2px 2px 0 #000; }
.final .note { margin-top: 26px; }
.fin-star-img { position: absolute; left: 50%; margin-left: 235px; top: 172px; width: 80px; pointer-events: none; }
/* rule + centred wordmark, Figma y15481 */
.final-logo {
  position: relative; margin-top: 42px; display: flex; justify-content: center;
  width: min(100% - 44px, 1370px); margin-inline: auto;
}
.final-logo::before {
  content: ""; position: absolute; left: 0; right: 0; top: 50%;
  border-top: 1.5px solid #CFC4E9;
}
.final-logo img { position: relative; height: 30px; width: auto; background: var(--cream); padding-inline: 34px; }

/* =====================================================================
   FOOTER — absolute 1600-artboard layout; the whole doodle layer is the
   single exported PNG 471:4053 (17,15244 1561x878) sitting behind it.
===================================================================== */
.footer { border-top: 0; padding: 0; position: relative; overflow: clip; }
.footer .stage { --sh: 721; }
.footer .stage > * { z-index: 1; }
/* The doodle layer is one 1561x878 export that has to register with text which
   is all pinned in --u. It used to be pinned in fixed px instead
   (`width: 1561px; margin-left: -783px; top: -254px` off .footer's centre),
   which is only correct where --u happens to be 1 — i.e. at exactly 1600 and
   above, where the stage caps. Below that the layer kept its full size while
   the text shrank:
     1440   +156px wide (+11%)   -78px x    -25px y
     1280   +312px      (+24%)  -157px     -51px
     1100   +488px      (+42%)  -245px     -79px
      981   +604px      (+62%)  -303px     -98px
   Now in --u like its neighbours, so it is aligned by construction rather than
   at one width. 17 = the stage half-width minus the old 783 centre offset.
   HANDOFF gotcha 2. Specificity has to beat the `> *` rule above. */
.footer .stage > .footer-doodles {
  left: calc(17 * var(--u)); top: calc(-254 * var(--u));
  width: calc(1561 * var(--u)); height: auto;
  max-width: none; z-index: 0; pointer-events: none;
}
.f-env      { left: calc(110 * var(--u)); top: calc(139 * var(--u)); width: calc(115 * var(--u)); }
.f-script   { left: calc(227 * var(--u)); top: calc(272 * var(--u)); font-family: var(--fh); font-weight: 600; font-size: calc(62 * var(--u)); line-height: 1; color: #8E7BE8; transform: rotate(-2deg); }
.f-tagline  { left: calc(206 * var(--u)); top: calc(352 * var(--u)); margin: 0; width: calc(430 * var(--u)); font-family: var(--fh); font-weight: 600; font-size: calc(21 * var(--u)); line-height: 1; color: #F0A5C4; }
.f-copy-mark{ left: calc(120 * var(--u)); top: calc(356 * var(--u)); font-size: calc(17 * var(--u)); color: #C9BCF0; }
.f-ic       { width: calc(132 * var(--u)); }
.f-ic-mail  { left: calc(812 * var(--u)); top: calc(77 * var(--u)); }
.f-ic-tg    { left: calc(815 * var(--u)); top: calc(262 * var(--u)); }
.f-lbl      { font-family: var(--fh); font-weight: 600; font-size: calc(34 * var(--u)); line-height: 1; color: #F0A5C4; }
.f-lbl-mail { left: calc(1006 * var(--u)); top: calc(58 * var(--u)); }
.f-lbl-tg   { left: calc(1008 * var(--u)); top: calc(233 * var(--u)); }
.f-val      { font-family: var(--fd); font-weight: 400; font-size: calc(34 * var(--u)); line-height: 1; color: #04080D; letter-spacing: -.01em; }
.f-val-mail { left: calc(1005 * var(--u)); top: calc(124 * var(--u)); }
.f-val-tg   { left: calc(1005 * var(--u)); top: calc(300 * var(--u)); }
.f-legal    { font-family: var(--fu); font-size: calc(15 * var(--u)); line-height: calc(20 * var(--u)); color: #4B4B55; top: calc(467 * var(--u)); }
.f-legal-l  { left: calc(205 * var(--u)); }
.f-legal-r  { left: calc(822 * var(--u)); }
/* the global `a { color: inherit; text-decoration: none }` would make a link in
   the legal line invisible, so it gets its own underline */
.f-link { text-decoration: underline; text-underline-offset: 2px; }
.f-link:hover { color: var(--purple); }

/* =====================================================================
   SECTION RHYTHM — padding solved backwards from the frame so each
   section's eyebrow / card lands on its Figma y. Values are the design's
   own gaps, clamped so they collapse on narrow viewports.
===================================================================== */
.feat-01 { padding-block: clamp(48px, 6vw, 96px) clamp(12px, 1.1vw, 18px); }
.feat-02 { padding-block: clamp(48px, 6vw, 96px) clamp(48px, 6.8vw, 109px); }
.feat-03 { padding-block: clamp(56px, 7.8vw, 125px) clamp(56px, 9vw, 145px); }
.feat04  { padding-block: clamp(56px, 6.2vw, 99px) clamp(24px, 3vw, 48px); }
.feat05  { padding-block: clamp(56px, 6.2vw, 99px) clamp(48px, 6.6vw, 105px); }
.feat06  { padding-block: clamp(52px, 5.8vw, 93px) clamp(56px, 8.7vw, 139px); }
.where   { padding-block: clamp(40px, 3.8vw, 60px) clamp(30px, 2.5vw, 40px); }
.results { padding-block: clamp(36px, 3.4vw, 54px) 0; }
.youus-sec { padding-block: clamp(56px, 6.3vw, 100px) clamp(36px, 3.6vw, 58px); }
.weeks-sec { padding-block: clamp(60px, 6.9vw, 110px) clamp(24px, 1.9vw, 30px); }
.control-sec { padding-block: clamp(60px, 6.9vw, 110px) clamp(70px, 10.5vw, 168px); }
.pricing { padding-block: clamp(64px, 7.5vw, 120px) 0; }
.faq-zone { padding-block: clamp(60px, 6.9vw, 110px) clamp(80px, 12.5vw, 200px); }
.statement-sec { padding-bottom: clamp(50px, 5.75vw, 92px); }

/* =====================================================================
   COMPARE CARDS — Figma: 374 / 489 / 374 columns, 1.5px ink outline on all
   three, the CreatorLabs card on the pink plate and 29px taller than its
   neighbours. Pill, bullets and title are all the same #EB78B9.
===================================================================== */
.compare { grid-template-columns: 374fr 489fr 374fr; gap: 20px; max-width: 1276px; align-items: center; }
.ccol { background: #fff; border: 1.5px solid #000; border-radius: 30px; box-shadow: none; padding: 34px 34px 38px; }
.ccol h3 { font-size: 26px; font-weight: 700; margin-bottom: 4px; }
.ccol .sub { font-size: 15px; margin: 0 0 26px; }
.ccol.mid { background: #F8E4E3; box-shadow: none; padding: 52px 40px 44px; }
.ccol.mid h3 { font-family: var(--fd); font-weight: 500; font-size: 34px; color: #F3A8CE; }
.ccol .flag {
  top: -17px; background: #EB78B9; color: #fff;
  font-family: var(--fd); font-weight: 700; font-size: 13px; letter-spacing: .03em;
  padding: 8px 20px; transform: translateX(-50%) rotate(0deg);
}
.clist { gap: 22px; }
.clist li { font-size: 17px; gap: 14px; }
.clist li::before { width: 26px; height: 26px; font-size: 14px; }
.clist.check li::before { background: #EB78B9; }

/* =====================================================================
   FAQ — folder cards: tab, tilt and doodle sit inline after the question.
   The reveal animation resets transform, so the tilt has to be re-applied
   on .in (same trick as .wcard / .rcard).
===================================================================== */
.folders { grid-template-columns: repeat(3, 1fr); gap: 76px 96px; max-width: 971px; }
.folder .face { min-height: 96px; border-radius: 10px; padding: 26px 22px; box-shadow: 0 12px 26px -16px rgba(35,25,80,.4); }
.folder .face::before { top: -13px; left: 0; width: 52%; height: 16px; border-radius: 8px 12px 0 0; }
.folder, .folder.in { transform: rotate(var(--rot, 0deg)); }
.folder:nth-child(1) { --rot: -3.2deg }
.folder:nth-child(2) { --rot: -2.2deg }
.folder:nth-child(3) { --rot:  1.1deg }
.folder:nth-child(4) { --rot: -4.2deg }
.folder:nth-child(5) { --rot: -1.6deg }
.folder:nth-child(6) { --rot:  1.8deg }
.folder:nth-child(7) { --rot: -1.2deg }
.folder:nth-child(8) { --rot: -2.6deg }
.folder:nth-child(9) { --rot:  1.4deg }
.folder .q { justify-content: flex-start; gap: 13px; font-size: 15.5px; font-weight: 500; }
.folder .q .st-img { width: 27px; height: 27px; }
.faq-zone .faq-q-doodle:first-of-type { width: 116px; left: calc(50% - 708px); top: 150px; }
.faq-zone .faq-q-doodle:nth-of-type(2) { width: 133px; left: calc(50% + 570px); top: 340px; right: auto; transform: none; }

/* =====================================================================
   TWO WEEKS — light day chips on a hairline rail, hairline cards
===================================================================== */
.weeks-sec .lead { font-size: clamp(15px, 1.1vw, 17.5px); line-height: 1.5; max-width: 620px; color: var(--grey); }
.timeline { max-width: 845px; }
.tl { grid-template-columns: 60px 1fr; gap: 40px; position: relative; }
.tl .day { background: #E7E0FB; color: #5B4BDB; border-radius: 7px; font-size: 11.5px; padding: 9px 0; margin-top: 12px; }
.tl .day::before { display: none; }
.tl.hl .day, .tl.hl .day::before { background: #E7E0FB; color: #5B4BDB; }
.tl:not(:last-child)::before { content: ""; position: absolute; left: 30px; top: 52px; bottom: -14px; border-left: 1px solid #DEDCE6; }
.tl .body { background: #fff; border: 1px solid #EAE8EF; box-shadow: none; border-radius: 12px; padding: 22px 26px; }
.tl.hl .body { background: #fff; }
/* `grid-template-columns: 60px 1fr` + `gap: 40px` above is unconditional and
   beats the stack rule at line ~938, so the label column was still reserving
   100px of the row all the way down: the card fell to 71% of the row at 390
   and 64% at 320, next to a mostly empty gutter. Stack it for real — pill on
   its own line above the card. `justify-self: start` alone (which is all that
   survived from that block) shrank the pill to its glyphs, since the desktop
   rule pads it `9px 0` and relies on the 60px track for the side space. */
@media (max-width: 600px) {
  .tl { grid-template-columns: 1fr; gap: 8px; }
  .tl .day { justify-self: start; margin-top: 0; padding: 7px 12px; }
  /* the connector ran down the middle of the label column; there isn't one */
  .tl:not(:last-child)::before { display: none; }
  .timeline { gap: 20px; }
}

/* =====================================================================
   CONTROL — ellipses are 330x202 with 38/25 gutters in the frame
===================================================================== */
.ctrl-grid { gap: 25px 38px; max-width: 1066px; }
.blobcard { min-height: 202px; padding: 30px 50px; }
.ic-line { top: 26px; right: 44px; }
.ic-line svg { width: 32px; height: 32px; }

/* =====================================================================
   WHERE — 4 cards ~370 wide bleeding past the text column, stepping up
   43px each from left to right (Figma 471:4126)
===================================================================== */
.where-cards { width: min(100% + 80px, 1512px); margin-inline: auto; margin-left: 50%; translate: -50% 0; gap: 10px; margin-top: 46px; }
.wcard { min-height: 278px; padding: 40px 26px 26px; border-radius: 18px; }
.wcard:nth-child(1) { margin-top: 129px; }
.wcard:nth-child(2) { margin-top: 86px; }
.wcard:nth-child(3) { margin-top: 43px; }
.wcard:nth-child(4) { margin-top: 0; }
.wcard h4 { font-size: 17px; margin-left: 60px; }
.wcard p { font-size: 13px; }
.where-arrow { left: -60px; top: 20px; width: 150px; }

/* =====================================================================
   YOU / US — the US plate is a saturated lavender in the frame
===================================================================== */
.yu-card.us, .yu-card.us::before { background: #C9BCF0; }
.yu-list li { font-size: 15px; }
.youus { max-width: 1000px; grid-template-columns: 480fr 500fr; }

/* =====================================================================
   PRICING — the two big blurred plates (471:4119) are now .pricing::before
===================================================================== */
.pricing .lead { font-size: clamp(15px, 1.15vw, 18.5px); max-width: 620px; color: var(--grey); }

/* =====================================================================
   FEATURE SLABS 01 / 03 — the frame's two organic plates are wide, shallow,
   slightly rotated ellipses. Axes and tilt are least-squares fitted to the
   edge positions sampled at x=100 / 800 / 1300 / 1550 in the frame.
===================================================================== */
.blob-bg { border-radius: 50%; left: 50%; }
.blob-f01 {
  width: 2240px; height: 784px; background: var(--pink-blob);
  left: calc(50% - 20px); top: 380px;
  transform: translate(-50%, -50%) rotate(-3.18deg);
}
.blob-f03 {
  width: 1800px; height: 720px; background: var(--yellow);
  left: calc(50% + 50px); top: 271px;
  transform: translate(-50%, -50%) rotate(5.24deg);
}

/* =====================================================================
   SECTION LEAD SIZES — the frame does NOT use one lead size; only the
   gradband lead is 30px, the rest are 15–18px Inter/DM Sans.
===================================================================== */
.where .sec-head .lead   { font-size: clamp(14px, 1vw, 16px); line-height: 1.45; max-width: 600px; color: var(--grey); }
.results .sec-head .lead { font-size: clamp(13px, .94vw, 15px); line-height: 1.4; margin-top: 12px; color: var(--grey); }
.youus-sec .sec-head .lead, .control-sec .sec-head .lead { font-size: clamp(14px, 1.05vw, 17px); color: var(--grey); }

/* side compare cards use a smaller list than the CreatorLabs card */
.ccol:not(.mid) .clist { gap: 17px; }
.ccol:not(.mid) .clist li { font-size: 13.5px; gap: 11px; }
.ccol:not(.mid) .clist li::before { width: 20px; height: 20px; font-size: 11px; }
.ccol:not(.mid) h3 { font-size: 21px; }
.ccol:not(.mid) .sub { font-size: 13px; margin-bottom: 20px; }

/* FAQ question type + the two big ? doodles (471:5451 / 471:5452) */
.folder .q { font-size: 19px; line-height: 1.3; }
.faq-q-doodle.q-l { width: 116px; left: calc(50% - 708px); top: 150px; }
.faq-q-doodle.q-r { width: 133px; left: auto; right: calc(50% - 703px); top: 340px; transform: scaleX(-1); }

/* final rhythm trim — keeps each eyebrow within ~15px of its Figma y */
.weeks-sec { padding-block: clamp(48px, 5.25vw, 84px) clamp(36px, 3.5vw, 56px); }
.pricing   { padding-block: clamp(52px, 5.3vw, 85px) clamp(22px, 2.2vw, 35px); }
.faq-zone  { padding-block: clamp(60px, 6.9vw, 110px) clamp(44px, 5vw, 80px); }

/* statement polish: the marker plate is a rounded pill, and the gradband's
   50px blur is allowed to bleed down into the cream instead of being clipped
   dead on the section boundary (the frame fades out around y3760–3854). */
.statement .hl { border-radius: 34px; }
.statement .lead { color: var(--lead-ink); }
.gradband { overflow: visible; }
.st-star-r { width: calc(62 * var(--sc)); }

/* =====================================================================
   RESPONSIVE — the 1600 artboard is the >=1600 case. Between the artboard
   and the tablet breakpoint the .stage sections scale with --u and the
   .wrap sections fall back to `100% - gutter`; below 980px everything
   reflows (rules further up in this file).
===================================================================== */
@media (max-width: 1440px) {
  /* keep the diagonal slabs from swallowing their sections as the column
     narrows — the tilt stays, the vertical cover shrinks with the viewport */
  .tb-f05 { --t: clamp(430px, 39.7vw, 572px); }
  .tb-where { --t: clamp(260px, 23.9vw, 344px); }
  .where-cards { width: 100%; }
  .wcard:nth-child(1) { margin-top: 90px; }
  .wcard:nth-child(2) { margin-top: 60px; }
  .wcard:nth-child(3) { margin-top: 30px; }
  .faq-q-doodle.q-l { left: 0; }
  .faq-q-doodle.q-r { right: 0; }
}
@media (max-width: 980px) {
  .tiltband, .wedge, .blob-bg { display: none; }
  .feat05 { background: var(--pink-blob); }
  .feat06 { background: var(--lav-band); }
  .where  { background: linear-gradient(180deg, var(--cream) 55%, var(--lav-band) 55%); }
  .f04-brush, .f05-arrow, .footer-doodles, .st-star { display: none; }
  .weeks-torn { display: none; }
  .compare { grid-template-columns: 1fr; max-width: 520px; }
  .results-band { width: 100%; margin-left: 0; transform: none; }
  .wcard:nth-child(1), .wcard:nth-child(2), .wcard:nth-child(3) { margin-top: 0; }
  .footer .stage { aspect-ratio: auto; height: auto; container-type: normal; --u: 1px; padding: 48px 22px 32px; }
  .footer .stage > * { position: static; }
  .footer .stage { display: grid; gap: 14px; justify-items: center; text-align: center; }
  .f-ic { width: 72px; }
  .f-legal { font-size: 11.5px; }
  .final-logo { width: min(100% - 44px, 520px); }
}

/* phone — these have to sit after the desktop grids above, which would
   otherwise win on source order and leave 2-up grids at 390px */
@media (max-width: 600px) {
  .folders, .ctrl-grid, .where-cards, .rgrid, .youus, .compare { grid-template-columns: 1fr; }
  .folder, .folder.in { transform: none; }
  .folders { gap: 26px; max-width: 420px; }
  .folder .q { font-size: 16px; }
  .faq-q-doodle { display: none; }
  .blobcard { min-height: 0; padding: 26px 30px; border-radius: var(--r-lg); }
  .ic-line { top: 22px; right: 24px; }
  .f-tagline, .f-script, .f-val, .f-lbl, .f-legal { width: auto; max-width: 100%; }
  .f-script { font-size: 44px; }
  .f-val { font-size: 22px; word-break: break-word; }
  .f-lbl { font-size: 26px; }
  .f-copy-mark { display: none; }
  .final .btn-yellow { width: min(100%, 240px); }
}

/* Figma 471:5070 — the f05 heading is authored at a fixed 572px and is
   allowed to overhang its 526px grid column, so it stays on one line. */
.feat05 .copy-alt h3 { width: 572px; max-width: none; line-height: .848; }
@media (max-width: 1200px) { .feat05 .copy-alt h3 { width: auto; } }

/* pricing: the frame's eyebrow here is the pink pill. Note the frame paints
   the yellow plate over the lead, which makes it near-illegible; the plate is
   now reproduced faithfully but the lead is still left on top of it. */
.pricing .sec-head .tag { background: var(--pink-pill); text-transform: uppercase; letter-spacing: .06em; font-size: 13px; }

/* =====================================================================
   CREATOR STORIES — Figma frame 518:220 "video section design" (1600x1174).
   Two testimonial polaroids, built in markup so the video is real and
   clickable. Plate sizes/rotations are the frame's own: Lucia 577x682 at
   -4deg, Aspen 560x662 at +4.67deg (both derived from the rotated bboxes).
   Media aspect 523.37/535.74 is shared by both cards.
===================================================================== */
.creators-sec .stage { --sh: 1174; }
.creators-sec .tag-lav   { left: calc(701 * var(--u));  top: calc(87 * var(--u)); width: calc(226 * var(--u)); height: calc(42 * var(--u)); }
.creators-sec .cr-script { left: calc(48 * var(--u));   top: calc(108 * var(--u)); width: calc(1061 * var(--u)); }
.creators-sec .cr-words  { left: calc(1150 * var(--u)); top: 0; width: calc(420 * var(--u)); }

.cs-card {
  margin: 0; background: #fff; z-index: 3;
  width: calc(var(--cw) * var(--u));
  padding: calc(23 * var(--u)) calc(var(--pad) * var(--u)) 0;
  transform: rotate(var(--rot));
  box-shadow: 0 calc(16 * var(--u)) calc(42 * var(--u)) rgba(74, 45, 110, .20);
}
.cs-lucia { --cw: 577; --pad: 27; --rot: -4deg;   left: calc(247 * var(--u)); top: calc(435 * var(--u)); }
.cs-aspen { --cw: 560; --pad: 26; --rot: 4.67deg; left: calc(952 * var(--u)); top: calc(437 * var(--u)); }
/* the reveal animation lands on transform:none, which would flatten the tilt */
.cs-card, .cs-card.in { transform: rotate(var(--rot)); }

.cs-media { position: relative; aspect-ratio: 523.37 / 535.74; background: #0d0d12; overflow: hidden; }
.cs-video { display: block; width: 100%; height: 100%; object-fit: cover; }

/* the play veil is a full-bleed button, so the whole still is one hit target
   and one accessible control */
.cs-play {
  position: absolute; inset: 0; display: grid; place-items: center;
  padding: 0; border: 0; background: none; cursor: pointer;
  transition: opacity .25s ease;
}
.cs-play svg { width: calc(66 * var(--u)); height: calc(66 * var(--u)); display: block; transition: transform .2s ease; }
.cs-play:hover svg { transform: scale(1.07); }
.cs-play:focus-visible { outline: 3px solid var(--purple-bright); outline-offset: -3px; }

/* ---------- testimonial lightbox ----------
   Playback moved out of the polaroid: the card window is 523.37x535.74 (0.977)
   and the footage is 1080x1920 (0.5625), so object-fit: cover was showing 58%
   of the frame with the native controls crammed into the crop. */
.cs-lightbox {
  width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh;
  margin: 0; padding: 0; border: 0; background: transparent; overflow: hidden;
}
.cs-lightbox:not([open]) { display: none; }
.cs-lightbox[open] { display: grid; place-items: center; }
.cs-lightbox::backdrop { background: rgba(16, 10, 28, .78); }
/* showModal() makes the page behind inert but leaves it scrollable, and the
   video only covers ~30vw on a desktop, so the page would visibly slide
   around behind it. */
html:has(.cs-lightbox[open]) { overflow: hidden; }
.cs-lb-video {
  /* --arn is width/height as a NUMBER, so one value drives both the
     aspect-ratio and the vw-limited height. Script overwrites it from the
     video's own videoWidth/videoHeight once metadata lands, so a re-cut clip
     needs no CSS change; 0.5625 is the current 9:16 source. */
  --arn: 0.5625;
  aspect-ratio: var(--arn);
  height: min(86dvh, calc(92vw / var(--arn)));
  width: auto; max-width: 92vw;
  display: block; background: #000; border-radius: 14px;
}
.cs-lb-close {
  position: fixed; top: clamp(10px, 2vw, 22px); right: clamp(10px, 2vw, 22px);
  width: 44px; height: 44px; display: grid; place-items: center;
  border: 0; border-radius: 50%; cursor: pointer;
  background: rgba(255, 255, 255, .14); color: #fff;
  font-size: 26px; line-height: 1; font-family: var(--fu);
}
.cs-lb-close:hover { background: rgba(255, 255, 255, .26); }
.cs-lb-close:focus-visible { outline: 3px solid var(--purple-bright); outline-offset: 2px; }

.cs-card figcaption {
  height: calc(122 * var(--u));
  /* `align-items: baseline` aligns the name and the heart to each other, but in
     a fixed-height flex container it also parks the whole line at the START of
     the cross axis — the ink was landing flush on the photo's bottom edge (0px
     gap) with 90px of empty white under it. flex-wrap makes this a multi-line
     container so align-content can centre the single line, without disturbing
     the baseline relationship inside it. */
  display: flex; flex-wrap: wrap; align-items: baseline; align-content: center;
  justify-content: center; gap: calc(7 * var(--u));
  font-family: var(--fh); font-weight: 700; color: #EB78B9;
  font-size: calc(25 * var(--u)); line-height: 1; white-space: nowrap;
}
.cs-heart { font-size: calc(36 * var(--u)); vertical-align: -.1em; }

/* Phone/tablet: a 1600-artboard stage would shrink these to ~140px wide, which
   is unusable for video, so the section leaves the artboard and stacks. */
@media (max-width: 900px) {
  .creators-sec .stage {
    aspect-ratio: auto; height: auto; container-type: normal; --u: 1px;
    display: grid; justify-items: center; gap: 26px; padding: 26px 0 8px;
  }
  .creators-sec .stage > * { position: static; }
  .creators-sec .cr-words { display: none; }
  .creators-sec .cr-script { width: min(100% - 40px, 560px); }
  .cs-card, .cs-card.in { --rot: 0deg; width: min(100% - 40px, 420px); padding: 14px 14px 0; }
  .cs-card figcaption { height: 62px; font-size: 22px; }
  .cs-heart { font-size: 30px; }
  .cs-play svg { width: 60px; height: 60px; }
}

/* The title raster (Figma "image 2580") has an opaque cream band across its top
   24px that would otherwise slice the eyebrow pill in half — the frame paints
   the pill above it, so lift it out of the images' paint order. */
.creators-sec .tag-lav { z-index: 4; }

/* The frame does not centre-crop these stills — it takes a band from near the top
   of the 1080x1920 portrait source (recovered by locating Figma's cropped fill
   inside the raw upload: y=128/1920 for Lucia, y=159/1702 for Aspen). The same
   object-position drives the poster and the video, so the framing does not jump
   when playback starts. */
.cs-lucia .cs-video { object-position: 50% 16%; }
.cs-aspen .cs-video { object-position: 50% 24%; }

/* Full-bleed torn-paper strips must keep their artboard height above the 1600
   frame. They were width:100% + height:auto, so past 1600 they grew taller in
   step with the viewport: by ~2250px the pinkband's strip had climbed over the
   UNRULY / BEHAVE logos, and by 2531 it swallowed them. Lock the height to the
   frame and let the width stretch — an organic torn edge stretches invisibly,
   whereas growing vertically eats the content above it. */
/* (folded into the base rules above — they now cap in both directions) */

/* torn-creators.png is a fully opaque block (no alpha anywhere): the tear at the
   top, then flat white/cream all the way to its bottom edge. Painted over the
   blurred blob stack it hid the gradient's soft onset and its own bottom edge
   became a hard cream->pink line straight across the band. Dissolve the strip
   below the tear so the blob fades in underneath it, which is what the frame
   does — measured down the band, the frame ramps white->pink between y=80 and
   y=260, while this was flat white until it snapped at y=276. */
.gradband .gb-torn {
  -webkit-mask-image: linear-gradient(to bottom, #000 0 26%, transparent 76%);
          mask-image: linear-gradient(to bottom, #000 0 26%, transparent 76%);
}

/* Below 980 the compare grid stacks, so the gradient band grows far past the
   1160px it occupies in the frame. Everything the band pins to a frame
   coordinate then lands in the wrong place — the "A full team's output" note
   is anchored at y=1079 and came down on top of the first card's last row.
   Hand the note back to normal flow, let the blob stretch to the real section
   height instead of stopping at 972, and drop the heart that paired with the
   note's old position. */
@media (max-width: 980px) {
  .gradband { min-height: 0; }
  .gradband .gb-blob { top: calc(188 * var(--u)); bottom: 0; height: auto; }
  .gradband .gb-heart { display: none; }
  /* relative, not static: the note is a sibling of .wrap, not a child, so
     dropping it out of the positioned layer puts it under the blob's
     z-index:0 and the blur washes the text out to near-invisible grey. */
  .gradband .compare-note {
    position: relative; z-index: 3; inset: auto;
    width: auto; margin: 40px auto 0; padding-inline: 22px; text-align: center;
    white-space: normal; letter-spacing: 0;
    font-size: clamp(1.25rem, 4vw, 1.8rem); line-height: 1.25;
  }
}

/* The blob stack's bottom edge sits exactly on the section boundary (188 + 972 =
   1160), so `overflow: clip` sliced its 50px blur off flat and the band ended in
   a hard lavender/cream line. In the frame the fade keeps going ~154px past the
   boundary before it reaches cream, which is just the blur's own tail — so the
   fix is to stop cutting it, not to draw anything new.
   Clip horizontally only (the blob is still min-width:1600), and let the
   statement section fall back to the body's cream so it stops painting over the
   spill; its own .wrap is positioned, so the copy still sits above. */
.gradband { overflow: clip visible; }
.statement-sec { background: transparent; }

/* STATEMENT block — Figma 471:4799, a centred column with 39px gaps:
   pill (471:4800) -> heading (471:4803) -> lead (471:4804).
   The pill was previously read as a comp leftover because it repeats the
   Creator-stories label one section down, but it is a real node and every
   other section carries an eyebrow, so it ships; only the wording is suspect. */
.statement .st-tag {
  display: inline-flex; align-items: center; justify-content: center;
  gap: calc(7 * var(--sc)); padding: 0;
  width: calc(226 * var(--sc)); height: calc(42 * var(--sc));
  border-radius: 999px; background: #C9BCF0; color: #000;
  font-family: var(--fd); font-weight: 800;
  font-size: calc(15.1 * var(--sc)); letter-spacing: calc(.6 * var(--sc));
  font-variation-settings: "opsz" 96, "wdth" 100;
  transform: rotate(-2deg);
  margin-bottom: calc(39 * var(--sc));
}
/* the frame pins the optical-size axis at 14 even at 90px; leaving it on `auto`
   let Chrome track opsz to the font size and rendered the line 12% narrow
   (911px against the frame's 1030px). Same trap already fixed on .hero h1. */
.statement h2 {
  line-height: 1; letter-spacing: -.0202em;
  font-variation-settings: "opsz" 14, "wdth" 100;
}
.statement h2 .semi { font-weight: 600; }
.statement .lead {
  max-width: calc(716 * var(--sc)); margin-top: calc(39 * var(--sc));
  font-size: calc(30 * var(--sc)); line-height: calc(35 * var(--sc)); color: #000;
}
/* pill at frame y3904 => 210 below the section top, was 301 with no pill */
.statement-sec { padding-block: clamp(67px, 13.125vw, 210px) clamp(52px, 5.6vw, 90px); }
/* block-level, so the pill does not ride a text line box and inherit its leading */
.statement .st-tag { display: flex; margin-inline: auto; }
/* frame 471:4803 sets "your page" in Atomic Marker at the heading's own 90px,
   and the plate behind it (471:4122) is 407x104 */
.statement .hl { font-size: calc(90 * var(--sc)); padding: calc(7 * var(--sc)) calc(24 * var(--sc)); }
/* the pill moved .statement's top from section y301 to y210, so the sparkles,
   which are absolute inside it, came up 91px with it. Frame 471:4866 sits at
   section y256 and 471:4867 at y325, i.e. +46 / +115 from the new origin. */
.st-star-l { top: calc(46 * var(--sc)); }
.st-star-r { top: calc(115 * var(--sc)); }
/* The marker rides the heading rather than --sc, so it tracks the h2's clamp on
   small screens instead of shrinking to a quarter of the words around it.
   1em == the frame's 90px at the design width, so desktop is unchanged. */
.statement .hl { font-size: 1em; padding: .078em .267em; }
/* --sc is a straight viewport ratio with no floor, so at 390px it renders the
   pill at 55x12 and the lead at ~7px while the h2 holds its clamp floor. Give
   the two --sc-driven pieces readable sizes once the artboard stops making
   sense as a scale. */
@media (max-width: 980px) {
  .statement .st-tag {
    width: fit-content; height: auto; padding: 9px 18px; gap: 6px;
    font-size: clamp(12px, 2.6vw, 15px); letter-spacing: .04em;
    margin-bottom: clamp(18px, 3vw, 32px);
  }
  .statement .lead {
    max-width: min(100% - 40px, 640px); margin-top: clamp(18px, 3vw, 34px);
    font-size: clamp(15px, 2.6vw, 26px); line-height: 1.45;
  }
}

/* Feature 03 emoji doodles — Figma 471:4916 🌟, 471:4914 💜, 471:4915 🔥.
   Positioned off their painted extents in the 1:1 render rather than the text
   node boxes, which carry line-height padding. Anchored to the page centre so
   they hold at any width, like the other full-bleed decorations. */
.f03-emo {
  position: absolute; z-index: 3; line-height: 1; font-size: 76px;
  pointer-events: none; user-select: none;
}
.f03-star  { left: calc(50% + 537px); top: 44px; }
.f03-heart { left: calc(50% - 115px); top: 368px; }
.f03-fire  { left: calc(50% - 721px); top: 410px; }
/* The brush sits 506px too low and 10% too large: the export is 651x918 while
   the frame node (471:4042) is 651x829, so width 651 over-scaled it. Sized to
   put its ink where the frame's is, and lifted out of feature 04's own top. */
.f04-brush { left: calc(50% - 807px); top: -406px; width: 588px; }
/* the fire glyph is drawn smaller than the other two at the same font-size, so
   it needs its own to match the frame's painted 76x97 */
.f03-fire { font-size: 102px; left: calc(50% - 733px); top: 414px; }

/* These decorations are pinned to frame coordinates, so they have to shrink
   with the artboard below 1600 or they walk off the canvas — at 1200 the fire
   sat at x=-133. --frame-w is the viewport capped at the frame, so N/1600 *
   --frame-w is "N artboard px". Below 980 the feature grid reflows to one
   column and the coordinates stop meaning anything, so they are hidden there. */
.f03-emo   { font-size: calc(76 / 1600 * var(--frame-w)); }
.f03-star  { left: calc(50% + 537 / 1600 * var(--frame-w)); top: calc(44 / 1600 * var(--frame-w)); }
.f03-heart { left: calc(50% - 115 / 1600 * var(--frame-w)); top: calc(368 / 1600 * var(--frame-w)); }
.f03-fire  { font-size: calc(102 / 1600 * var(--frame-w));
             left: calc(50% - 733 / 1600 * var(--frame-w)); top: calc(414 / 1600 * var(--frame-w)); }
.f04-brush { left: calc(50% - 807 / 1600 * var(--frame-w));
             top: calc(-406 / 1600 * var(--frame-w)); width: calc(588 / 1600 * var(--frame-w)); }
@media (max-width: 980px) { .f03-emo { display: none; } }

/* Brush now sits inside feature 03 ahead of the yellow blob, so the blob paints
   over it — requested in place of relying on the PNG's alpha. Its origin moves
   from .feat04's top to .feat-03's, hence 210 rather than -406. */
.f04-brush { top: calc(210 / 1600 * var(--frame-w)); z-index: 0; }
.blob-f03  { z-index: 1; }

/* WHERE doodles — frame 471:4191 heart (473,9113 56x76), 471:4192 sparkle
   (1279,9174 39x39), 471:4127 scribble arrow (33,9427 378x373). The build had
   the heart at 6% / the sparkle at right:8% inside .sec-head, which put them
   ~220px and ~110px off, and used a small thin doodle-arrow in place of the
   frame's large loopy scribble. Hung off .where and placed in frame
   coordinates, scaled by --frame-w like the other pinned decorations. */
.wh-doodle { position: absolute; z-index: 2; pointer-events: none; }
.wh-heart    { left: calc(50% - 327 / 1600 * var(--frame-w)); top: calc(131 / 1600 * var(--frame-w)); width: calc(56 / 1600 * var(--frame-w)); }
.wh-sparkle  { left: calc(50% + 479 / 1600 * var(--frame-w)); top: calc(192 / 1600 * var(--frame-w)); width: calc(39 / 1600 * var(--frame-w)); }
.wh-scribble { left: calc(50% - 767 / 1600 * var(--frame-w)); top: calc(445 / 1600 * var(--frame-w)); width: calc(378 / 1600 * var(--frame-w)); }
@media (max-width: 980px) { .wh-doodle { display: none; } }
/* Card row, re-solved from the render with rect.py (minimum-area rectangle over
   the white plate, so the tilt comes out of the measurement instead of being
   assumed). The frame's card centres step (377.5, -49.5) and card 1 sits with
   its centre 172.9px below the slab's top edge — dead centre of the 345.5px
   slab, 42px of lavender above and below. This row was seating card 1 at +203,
   so it hung low: 83 above, 23 below. Raising the grid 43.7px and stepping 49.5
   reproduces the frame's drift (the row's pitch is steeper than the slab's, so
   card 4 rides 12.6px higher in the band than card 1 — that is the frame). */
.where-cards { margin-top: 54.3px; }
.wcard:nth-child(1) { margin-top: 148.5px; }
.wcard:nth-child(2) { margin-top: 99px; }
.wcard:nth-child(3) { margin-top: 49.5px; }
.wcard:nth-child(4) { margin-top: 0; }
/* Raising the row and growing the plate would shorten .where by 21.8px, and the
   section's height is what everything below it is offset against — plus .where
   clips, so a shorter section nicks more off the slab's bottom-left corner.
   Hold the section at its current 856px. Desktop only — below 1100 the cards
   reflow and that block's own padding-bottom applies. */
@media (min-width: 1101px) { .where { padding-bottom: 61.2px; } }
/* Scribble y solved from the render, not the node box: the frame's own
   coordinates for 471:4127 put it 183px low (its parent chain carries an offset
   the metadata dump flattens out). Placed so the asset's ink inset lands its
   ink on the frame's, at x106 y9296 (+120). */
.wh-scribble { top: calc(262 / 1600 * var(--frame-w)); }

/* WHERE cards ride their lavender slab, they are not individually jittered.
   Minimum-area rectangle over each plate in the render gives -7.34 / -6.93 /
   -7.12 / -7.65deg (the frame hand-places them), mean -7.26. The build had them
   alternating -3 / +2.4 / -2 / +3, which reads as four crooked cards rather
   than a tilted row. */
.wcard, .wcard.in { transform: rotate(-7.26deg); }
.wcard:nth-child(1), .wcard:nth-child(2),
.wcard:nth-child(3), .wcard:nth-child(4) { --rot: -7.26deg; }
/* Frame stat cards measure 321.1x286.1 unrotated at +7.36deg; these match
   (320.1x286.1 at +7.39, inherited from the band). */
.rcard { min-height: 287px; padding: 30px 22px; }
@media (max-width: 980px) {
  .wcard, .wcard.in { transform: none; }
  .rcard { min-height: 0; }
}
/* Grid pitch, from the rendered card centres rather than the node boxes.
   Results stands as is: the frame's centres step 354.2 mean against our 355.0,
   inside its own 353.0..355.7 spread, so 4*321 + 3*37 = 1395 stays. Where: the
   centres step 377.5 and the plate measures 346.4 wide plus a 1px border either
   side, so the track is 348 and the gap 29.5 -> 4*348 + 3*29.5 = 1480.5. */
/* max-width: 100% never bit here — .rgrid's parent is the 132%-wide band, so
   100% is ~1690 at a 1280 viewport and the 1395 row hung 57px off each edge.
   Cap against the viewport instead; no-op at 1536 and up. */
.rgrid { width: 1395px; max-width: calc(100vw - 56px); margin-inline: auto; gap: 37px; }
.where-cards { width: min(100%, 1480.5px); gap: 29.5px; }
/* .where-cards has to break out of the 1440 wrap to reach the frame's 1480.5
   pitch. The frame's where row is centred on 809.5, 10px right of the page
   centre this grid resolves to.
   The width is a hard px only at the design width: it was flat 1487px, and the
   ">= 981px" side of the reflow never re-capped it, so 981..1599 held the full
   row and clipped it at both ends (at 1440 that lost 25px off card 1 and 45px
   off card 4, silently, because body has overflow-x: clip). min(100vw - 56px)
   resolves to 1480.5 from 1536 up and shrinks the row below that. */
.where-cards { width: min(100vw - 56px, 1480.5px); max-width: none; translate: calc(-50% + 10px) 0; }
/* The stat row is NOT seated right of centre, so no translate here. That 36px
   came from the metadata x for 471:5130/5142/5153/5163 (126/481/836/1188), but
   those coordinates carry a uniform +36.5px parent-chain offset — the render
   puts the bbox lefts at 89/445/799/1152, i.e. a row centre of 798.0 against a
   page centre of 800. The y on the same four nodes is exact to the pixel, so
   the offset is per-axis: only the render can be trusted for either. */
/* These pitch rules are unconditional and were appended after the responsive
   blocks, so they beat them on source order — .where-cards was holding 1487px
   down to 390px, clipped rather than visibly broken because body has
   overflow-x: clip. Re-assert the reflowed widths here. */
@media (max-width: 980px) {
  .where-cards { width: 100%; max-width: none; margin-left: 0; translate: none; gap: 18px; }
  .rgrid { width: 100%; max-width: none; translate: none; gap: 18px; }
  .wcard { min-height: 0; }

  /* The 148.5 / 99 / 49.5 / 0 staircase above is what steps the four cards
     down the tilted slab on desktop. Two earlier blocks already tried to zero
     it (lines ~921 and ~1361) and both lose to the unconditional rules, so it
     was still applying at 390: 54.3 + 148.5 = 203px of dead cream between the
     lead and card 1, and inter-card gaps of 117 / 68 / 18 once the grid drops
     to one column — the gap shrinking down the page is the staircase, not a
     rhythm. There is no slab to step down here (.tiltband is display:none
     below 980), so it all goes. */
  .wcard:nth-child(1), .wcard:nth-child(2),
  .wcard:nth-child(3), .wcard:nth-child(4) { margin-top: 0; }
  .where-cards { margin-top: clamp(28px, 5vw, 54px); }

  /* The slab is hidden, and the flat `cream 55% / lavender 55%` stand-in split
     the SECTION, not the content — at 980 that line ran straight through
     cards 1 and 2, and at 390 it landed in the gap above card 2, leaving card
     1 stranded on cream. Anchor the lavender to the card block instead, which
     is what the slab does on desktop. Painted from .where-cards so it tracks
     the grid however the heading wraps; no z-index, because .where is only
     position:relative and a negative index would drop it behind the section's
     own background — the cards are positioned and come later, so they win on
     paint order anyway. */
  .where { background: var(--cream); }
  .where-cards::before {
    content: ""; position: absolute; background: var(--lav-band);
    left: 50%; translate: -50% 0; width: 100vw;
    top: calc(-1 * clamp(20px, 4.5vw, 40px));
    bottom: calc(-1 * clamp(34px, 7vw, 70px));
  }
}
/* WHERE slab 471:4124: 1615x357 at -6.82deg centred (800, 9585) in the frame,
   i.e. centre 597px down this section. It was at --cy 677 / --t 344, which put
   its lower edge at y=10048 against a section that clips at 9980 — the band's
   bottom-left corner was being sliced off flat. At 597/357 the lower edge lands
   at 9974, inside the section, and the diagonal reads uncut. */
.tb-where { --cy: 597px; --t: 344px; }
/* ...except at the far left, where it still read as a flat cut. .tiltband is an
   infinite band (220vw / min 3600px) rotated about the section's centre, so its
   lower edge at x=0 sits 772.7 + 0.0598 * 100vw below the section top: 868 at a
   1600 viewport against a section that ends at 856, and it gets worse the wider
   the window goes — 888 at 1920, 924 at 2531. Lowering --cy only trades this for
   a cut somewhere else, and paying for it in padding would push the six sections
   below out of alignment. overflow-clip-margin is the property for exactly this:
   it grows the clip region without touching layout. 6vw is ~2.5x the shortfall
   at every width from 1600 to 5120, and the only thing in .where that reaches
   into it is the band itself — the cards stop 61px short of the section edge,
   and sideways the bleed dies against html/body's overflow-x: clip. */
@media (min-width: 981px) { .where { overflow-clip-margin: 6vw; } }
/* Card type, solved against the frame's rendered ink widths instead of a node
   bbox. Seven de-rotated lines, each divided by the same string's advance at
   100px, imply 13.89 / 13.91 / 13.94 / 13.84 / 13.94px in Inter — a 0.1 spread,
   so the family is right and the size is 13.9, not the 14.5 a bbox suggested.
   (The same lines against DM Sans spread 0.59, which is how you tell.) The five
   body lines' ink tops step 21.75px, so 13.9/1.565. Title stands: the frame's
   "Just starting out" inks 157px wide and so does ours at 21px. */
.wcard h4 { font-size: 21px; }
.wcard p  { font-size: 13.9px; line-height: 1.565; }
@media (max-width: 980px) { .wcard h4 { font-size: 17px; } .wcard p { font-size: 13px; } }
/* The frame's rule is solid, not dashed: 2px at card-local y34, inset 3 left and
   4 right, and its darkest pixel is (203,185,255) — #CBB9FF, not #EBE4FF. It was
   at y14 because the plate it was measured against started 22px too low. */
.wcard::before {
  display: block; content: ""; position: absolute;
  left: 2px; right: 2px; top: 33px;
  border-top: 2px solid #CBB9FF;
}
@media (max-width: 980px) { .wcard::before { display: none; } }
/* Card interior, re-measured. The previous pass read the plate as 346x238 and
   every interior offset ~22px low, because each card carries a full-width rule
   near its top that cuts the white plate into a thin strip plus a body, and the
   body alone got measured. Closing the mask over that 2px rule first, all four
   plates come out 346.4x259.4 (bbox 376.6x301.5, which is the 377x302 the node
   box claims — two independent methods agreeing). Frame card 1, card-local:
   rule y34, icon tile 46x46 at (39,46), title ink 109..266 with its cap band
   centred on 69.5 (i.e. centred on the icon), body ink from y112, column left
   inset 39 and right inset 14.7 (right edge is the consistent one across all
   four cards; the frame's left insets wander 17..41). So the plate is 261 with
   the border, the icon sits at 46 not 24, and padding-top has to be 46 to keep
   the title centred on it. */
.wcard { padding: 46px 14px 26px 38px; min-height: 261px; }
.wcard .wic { left: 38px; top: 46px; width: 46px; height: 46px; }
.wcard h4 { margin: 0 0 14px 69px; min-height: 46px; }
@media (max-width: 980px) {
  .wcard { padding: 26px 22px 24px; min-height: 0; }
  .wcard .wic { left: 20px; top: 26px; width: 42px; height: 42px; }
  .wcard h4 { margin: 0 0 10px 56px; min-height: 42px; }
}

/* RESULTS band, measured off the render the same way as the where slab. Three
   things were wrong at once, and the flat cut was only the last of them.

   Yellow edges, y at x=0 -> x=1599, against the section's headline ink:

                    top edge      column thickness   bottom edge at x=1599
     frame          +86           349                +640
     was            +38           410                clipped flat from x=795

   1. Thickness. The frame's band is 346 perpendicular and its cards are 286.1,
      so the padding is exactly (346-286)/2 = 30 — the card sits dead centre,
      1.3px off the band's midline. clamp(36px, 5vw, 60px) resolved to 60, which
      made the band 410 thick in column terms instead of 349.
   2. Position. That left the band's top edge 48px high; the cards with it, 15px
      high against the frame. margin-top 48 -> 94 puts the top edge at +85 and
      card 1's centre at +294 (frame +86 / +294).
   3. The cut. This is structural, not a number: .results has padding-bottom 0,
      so the band's box bottom IS the section's bottom, while the band is rotated
      +7.39deg about its own centre and 132% wide — its lower edge at the
      viewport's right sits 0.0649 * 100vw + 0.0042 * H *below* that box, 103px
      at 1600 and worse as the window widens. So the lower right of the band, and
      27px of card 4's corner with it, were sliced off flat. Same fix as .where:
      overflow-clip-margin, which grows the clip region without touching layout.
      7vw clears it from 1100 to 5120. The revealed tail lands in the cream gap
      above .youus-sec's heading, which has no background of its own to cover it
      and whose first ink is 69px clear of the tail at 1600 — the frame has the
      same gap, 51px at x=1599.

   Fixing 1 and 2 nets 14px off the section, so the six sections below shift up
   by 14; the frame wants them 33px higher still. */
@media (min-width: 981px) {
  .results-band { margin-top: 94px; padding: 30px 0; }
  .results { overflow-clip-margin: 7vw; }
}

/* RESULTS card interior, de-rotated out of each card's +7.4deg box and read
   axis-aligned (rect.py --derotate, then zoom.py for the artwork). Card-local,
   card 321x286, consistent across all four unless noted:

                     frame                    was
     icon tile       65x65 at y18, #F6EEFB    47x46 at y31, --purple-tint
     icon artwork    ~36x36, 3px stroke,      19x19, 1.7px, #6657F5
                     #5822AA
     divider         1px rule x58..258 (201   nothing but the star, 7x8
                     wide) at y190, broken
                     by a 29px gap, star
                     10.5x10.5 #8478FF on it
     stat number     ink 46 tall              ink 36 tall
     label           ink line 1 <= 231 wide,  ink line 1 up to 264 wide,
                     pitch 21                 pitch 20

   The rule is the "line at the star" — it is a real element in the frame
   (Group 2087327310, 201x41 rotated = 201x15 flat) that this build never had.

   Sizes solved from ink, not from node boxes (gotcha 10). The number: the four
   ink widths are 1.258 / 1.333 / 1.292 / 1.333 of ours and the heights 1.297 /
   1.394 / 1.243 / 1.270, mean 1.303 both ways, so it is the same face 30% too
   small -> 46.4px becomes 60.5. Its node box de-rotates to 239x61.5, i.e. a
   1.02 line, which is why line-height has to come down from the inherited 1.5.
   The label: card 4's "fan churn among AI-managed fans" is one line in both, so
   it is a clean same-string ratio, 228/205 = 1.112 -> 12.5px becomes 13.9, the
   same size the where body solved to. At 13.9 in a 238.5 column all four wrap
   the way the frame does.

   The icons are image fills in the frame (nodes image 2589..2592), so these are
   hand-traced from a 9x de-rotated crop rather than exported: bars-and-rising-
   arrow, two figures under a heart, a faceted diamond, a heart in a shield. The
   first was a squiggle over a baseline with no bars at all. */
@media (min-width: 981px) {
  .rcard { padding: 17px 41px 26px; }
  .rico { width: 65px; height: 65px; background: #F6EEFB; margin: 0 auto 28px; }
  .rcard .big { font-size: 60.5px; line-height: 1.02; }
  .rdiv {
    display: flex; align-items: center; justify-content: center; gap: 9px;
    width: 201px; margin: 11px auto 8px;
    color: #8478FF; font-size: 14px; line-height: 1; opacity: 1;
  }
  .rdiv::before, .rdiv::after { content: ""; flex: 1 1 auto; height: 1px; background: #CBB9FF; }
  .rcard .lbl { font-size: 13.9px; line-height: 1.51; margin-top: 8px; }
}

/* TORN EDGES on the white weeks slab. Two things were wrong; the visible one is
   a hard cream line straight across the page where the slab starts.

   Both PNGs are opaque, matted onto the frame's cream (gotcha 4), and both were
   exported with a few rows of the *other* edge still attached — they are mirror
   halves of one strip, so weeks-torn-top's rows 161..168 fade back to cream and
   weeks-torn-bot's rows 0..6 do the same. Those rows sit on top of the slab
   (z-index 1), which is what draws the cream stripe: measured in the render at
   y11229..11232 on the top edge and y12410..12413 on the bottom. Cropping with
   object-fit: cover + object-position keeps it in the diff instead of
   re-encoding the assets — 161 rows from the top matches the frame's own node
   height for 471:4199 exactly, and 154 from the bottom is the first row of
   weeks-torn-bot that is >= 99% white edge to edge. The crop is a clip-path
   percentage rather than object-fit: cover, because cover re-scales once
   --frame-w caps at 1600 — at a 2531 viewport it upscales 1.58x and crops to
   source row 101, which drags the tear ~50px down into the slab. inset() on a
   fill-stretched image drops the same source rows at every width.

   Second, the tear was in the wrong place. Anchoring to content rather than to
   the slab (its node y is one of the offset ones): the frame's tear midline —
   the row where the white fraction crosses 50% — sits 111px below the "Connect
   your account once." ink and 72px above the "Getting started" pill, i.e. 58%
   of the way across that gap. Ours sat 1px below the connect line, so the tear
   ran straight through the text. Our gap is 26px tighter than the frame's, so
   the midline goes at 58% of it: 96px below the ink, 70 above the pill. The
   bottom tear was nearly right already, 26px above the control pill against the
   frame's 35.

   The asset's midline is at row 83 of 161 (top) and row 77 of the cropped 154
   (bottom), so the margins are solved backwards from where the midline has to
   land. Left as artboard px so they track --frame-w like the other pinned art. */
.weeks-torn.top {
  clip-path: inset(0 0 4.734% 0);            /* 8 of 169 rows off the bottom */
  margin-bottom: calc(-98 / 1600 * var(--frame-w));
}
.weeks-torn.bottom {
  clip-path: inset(4.348% 0 0 0);            /* 7 of 161 rows off the top */
  margin-top: calc(-12 / 1600 * var(--frame-w));
}

/* SAFETY & CONTROL grid. The six shapes are not geometric ellipses — the frame
   draws them with one hand-drawn stroke (Circle-23, an image fill reused for all
   six; identical sha256 across nodes) that overshoots and doubles back at the
   bottom left. A border-radius: 50% ring cannot do that, so the stroke is now
   the asset, pulled as a rawImage for real alpha (gotcha 4) at 2x the render box
   and re-cropped to its own alpha bbox: assets/ctrl-ellipse.png, 706x434, 27 KB.

   Geometry read off the render, not the node boxes (this branch's grid x is 9px
   out): outline runs along each shape's centre row put the left edges at 287 /
   658 / 1033 and the column scan puts shape 1 at y12514..12731. So 353x217 on a
   373.5 pitch, and the rows step 214 against a 217-tall shape — they overlap
   3px. The middle shape of the top row sits 7px higher than its neighbours.
   This build had 330x202 on a 368 pitch with a 227 row step, all six perfect
   ellipses with a 1px border and a fake ~0.7deg rotation.

   Type is 16% small, and that number is solid: the six titles are the same six
   strings in both, and their ink widths come out 1.154 / 1.163 / 1.147 / 1.179 /
   1.158 / 1.156 of ours — mean 1.160. The body line pitch agrees independently,
   22 against our 19, so 16px -> 18.6 and 12.5px -> 14.5 on a 22px line. Text
   left inset 47 (the frame's own title ink starts at 40..58, mean 48.5).

   Icons: the same six hand-drawn PNGs already in assets/ that an earlier pass
   downloaded and then replaced with inline line-art SVGs a third the size, all
   parked in the same top-right corner. The frame hand-places them, so each is
   positioned individually. Each box below is solved twice — from the frame's
   measured purple ink rect divided by the PNG's own alpha bbox, and from the
   node box — and the two agree to ~1px (e.g. 52.6 solved vs 54 in the node).

   The grid is left page-centred. The frame's is centred on 834 and its own
   legal line on 820.5, i.e. the block is nudged right by an inconsistent
   20..34px; matching that would read as a misaligned section against every
   other centred block on the page. Flagged, not reproduced. */
/* Desktop only. The three 353px tracks plus two 20.5 gaps are a hard 1100px, and
   the file's existing plan already reflows this grid to 2-up at <= 1100 and 1-up
   at <= 600 with the geometric border and the corner .ic-img — which is where
   these same PNGs were wired up before. Left flat, the fixed tracks overflowed
   38px each side at 1024 and 59 at 981, silently, behind body's overflow-x: clip
   (gotcha 11). */
@media (min-width: 1101px) {
  .ctrl-grid {
    grid-template-columns: repeat(3, 353px);
    justify-content: center;
    column-gap: 20.5px;
    row-gap: 0;
    max-width: none;
  }
  .blobcard {
    width: 353px; height: 217px; min-height: 0;
    border: 0;
    background: url(assets/ctrl-ellipse.png) 0 0 / 100% 100% no-repeat;
    /* padding-top 10 against 0 at the bottom drops the centred block 5px: the
       frame's six title ink tops mean 74.8, pure centring lands them at 70. */
    padding: 10px 9px 0 47px;
    display: flex; flex-direction: column; justify-content: center;
  }
  /* The :nth-child() reset has to carry a pseudo-class of its own — the fake blob
     radii and ~0.7deg rotations are set on :nth-child(2n)/(3n), which outrank a
     bare .blobcard whatever the source order. They were inflating cards 2/3/4/6
     to 356x222 and clipping the new stroke asset to a blob. */
  .blobcard:nth-child(n) { transform: none; border-radius: 0; }
  .blobcard:nth-child(2) { margin-top: -7px; }
  .blobcard:nth-child(4), .blobcard:nth-child(5), .blobcard:nth-child(6) { margin-top: -3px; }
  .blobcard h4 { font-size: 18.6px; padding-right: 0; margin-bottom: 10px; }
  .blobcard p  { font-size: 14.5px; line-height: 1.517; }
  .blobcard .ic-img { position: absolute; top: auto; right: auto; height: auto; }
  .blobcard:nth-child(1) .ic-img { width: 53px; left: 221px; top: 49px; }
  .blobcard:nth-child(2) .ic-img { width: 55px; left: 150px; top: 14px; }
  .blobcard:nth-child(3) .ic-img { width: 45px; left: 154px; top: 17px; }
  .blobcard:nth-child(4) .ic-img { width: 58px; left: 195px; top: 25px; }
  .blobcard:nth-child(5) .ic-img { width: 55px; left: 198px; top: 31px; }
  .blobcard:nth-child(6) .ic-img { width: 53px; left: 233px; top: 39px; }
  /* Legal line: the frame's box is 760 wide (node 471:5341), ink 445..1197 on a
     26px line; ours was capped at 620 and broke a word early. */
  .ctrl-legal { max-width: 760px; font-size: 12px; line-height: 26px; }
}
/* <= 1100 keeps the file's existing fluid reflow, but two pre-existing bugs in it
   surface now that the icons are real artwork rather than 26px line SVGs. The
   fake blob radii on :nth-child(2n)/(3n) outrank every later .blobcard rule, so
   four of the six cards stayed 50%-round even at 390 with the copy spilling
   outside the shape; and the corner .ic-img sat half off the outline with the
   title running under it. */
@media (max-width: 1100px) {
  .blobcard:nth-child(n) { transform: none; border-radius: 50%; }
  .blobcard .ic-img { top: 16px; right: 34px; width: 46px; height: 46px; }
  /* no title padding here — at these widths the icon sits at y16..62 and the
     centred title lands at ~86, so they never meet and 74px only forced
     "Your content, your call" onto two lines. */
}
@media (max-width: 600px) {
  .blobcard:nth-child(n) { border-radius: var(--r-lg); }
  .blobcard .ic-img { top: 18px; right: 20px; width: 42px; height: 42px; }
  .blobcard h4 { padding-right: 62px; }
}

/* FAQ folders. Two things were off, and they are the same thing twice: the
   question mark doodles and the folder geometry were already close (bboxes 262..268
   against the frame's 263..281, columns at 311/668/1025 against 321/662/1026), but

   1. the icon was a flex sibling of the text, so it reserved a column on *every*
      line instead of flowing after the last word the way the frame does. That
      narrowed the text to 184px against the frame's 216 and pushed questions onto
      extra lines — "Do I need a big content library first?" ran to three lines
      where the frame takes two, its first line measuring 216 against our 132.
      Inline now, and .face padding-left 22 -> 30 puts the text ink at ~33 against
      the frame's per-folder 27..41 (mean 34), which makes the column 216 exactly.
   2. the icons rendered at ~15px of ink where the frame has 30..40, so the pencil
      strokes diluted to almost nothing. The type was already right — the two
      single-line questions are clean same-string measurements and come out 173.5
      vs our 165.5 and 155.7 vs 151.9, so 1.02..1.05, i.e. 19px stands.

   Sizes solved twice. The frame's icon nodes are 68x61 / 73x67 / 71x65 (star),
   77x70 / 71x63 / 63x56 (sparkle), 37x39 / 28x30 / 37x39 (heart); dividing each
   by the source PNG's own ink fraction gives ink 30.7 / 39.6 / 21.8, and measuring
   the purple ink straight off the render gives 30x29 / 43x53 / 23x25. The nodes
   themselves are crops of a reference screenshot (download_assets on all three
   returns the same 418x236 image of an older FAQ layout), so the artwork stays the
   doodle PNGs already in assets/ — re-cropped to their own alpha>8 bbox as
   faq-star/sparkle/heart so the CSS box is the ink box, which is what inline flow
   needs. Column 1 is the star, 2 the sparkle, 3 the heart, as in the frame. */
.folder .face { padding: 26px 22px 26px 30px; }
.folder .q { display: block; }
.folder .q .st-img {
  display: inline-block; vertical-align: -0.28em; margin-left: 9px;
  width: auto; height: auto; flex: none;
}
.folder:nth-child(3n+1) .q .st-img { width: 31px; }
.folder:nth-child(3n+2) .q .st-img { width: 40px; }
.folder:nth-child(3n)   .q .st-img { width: 22px; }
@media (max-width: 1000px) {
  .folder .face { padding: 24px 20px 24px 26px; }
  .folder:nth-child(3n+1) .q .st-img { width: 26px; }
  .folder:nth-child(3n+2) .q .st-img { width: 33px; }
  .folder:nth-child(3n)   .q .st-img { width: 19px; }
}
/* Folder faces are a FIXED 263.1 x 142.3 in the frame — min-area rectangles over
   all nine white plates come back at that size to a tenth of a px, whatever the
   question length. Ours were 260 wide and 108..147 tall because min-height: 96
   let them grow with the copy. Row pitch was already right at 204; the column
   pitch was 356 against the frame's 347 (its column centres mean 455.5 / 807.9 /
   1149.4, ours 443.6 / 799.2 / 1155.7), so 263 tracks on an 84 gap = 957.

   Rotations are the measured per-plate angles, which are much larger than the
   ~2deg jitter this had: two plates sit dead level and one leans 8deg.

   Line breaks: the frame sets a different text width per folder (folder 4's text
   node de-rotates to 268 wide, folder 2's to ~145), and no single column can
   reproduce them — at 19px folder 4 needs >= 209.5 to keep "Do I need a big
   content" on one line while folder 5 has to break before 170.6. So the two that
   need a narrow box get one and the rest take the full 221 column. Folder 8 then
   breaks a word later than the frame ("What if my account gets / flagged?"
   against its "What if my account / gets flagged?") — it needs < 220.5 and the
   column is 221; not worth a tenth folder-specific width. */
.folder .face { width: 263px; height: 129px; min-height: 0; padding: 26px 12px 26px 30px; }
.folder:nth-child(2) .q { width: 155px; }
.folder:nth-child(5) .q { width: 158px; }
.folders { max-width: 957px; gap: 75px 84px; }
.folder:nth-child(1) { --rot:  6.09deg }
.folder:nth-child(2) { --rot: -4.93deg }
.folder:nth-child(3) { --rot:  0deg }
.folder:nth-child(4) { --rot: -8.13deg }
.folder:nth-child(5) { --rot:  3.12deg }
.folder:nth-child(6) { --rot: -3.07deg }
.folder:nth-child(7) { --rot:  0deg }
.folder:nth-child(8) { --rot: -3.29deg }
.folder:nth-child(9) { --rot:  1.27deg }
@media (max-width: 1000px) {
  .folder .face { width: auto; height: auto; min-height: 0; padding: 24px 20px 24px 26px; }
  .folder:nth-child(2) .q, .folder:nth-child(5) .q { width: auto; }
  .folders { max-width: none; gap: 22px; }
}
/* The icons are NOT inline in the frame — each is absolutely placed, which is why
   the nine node offsets scatter over (143..222, 20..74). Inline flow cannot
   reproduce them anyway: folder 2's box has to be under 178.5 to break "What
   happens after", but its last line plus an inline sparkle needs 184. So each
   icon gets the frame's own position, de-rotated out of its plate (rect.py gives
   each plate's centre and angle; the icon ink rect comes off the render) and
   expressed face-local, minus the 13px the .face::before tab adds above the plate.
   Widths are the measured ink + 4, since the assets are cropped to ink + 2. */
.folder .q .st-img {
  position: absolute; display: block; margin: 0; vertical-align: baseline;
  height: auto; flex: none;
}
.folder:nth-child(1) .st-img { left: 210px; top: 42px; width: 34px; }
.folder:nth-child(2) .st-img { left: 195px; top: 33px; width: 47px; }
.folder:nth-child(3) .st-img { left: 202px; top: 73px; width: 27px; }
.folder:nth-child(4) .st-img { left: 170px; top: 76px; width: 33px; }
.folder:nth-child(5) .st-img { left: 194px; top: 48px; width: 45px; }
.folder:nth-child(6) .st-img { left: 225px; top: 60px; width: 21px; }
.folder:nth-child(7) .st-img { left: 204px; top: 49px; width: 34px; }
.folder:nth-child(8) .st-img { left: 187px; top: 69px; width: 38px; }
.folder:nth-child(9) .st-img { left: 209px; top: 38px; width: 27px; }
/* Text widths, now free of the icon: each is the interval that reproduces the
   frame's break. Only three need to be narrower than the 221 column. */
.folder:nth-child(2) .q { width: 155px; }   /* < 178.5 breaks "What happens after" */
.folder:nth-child(5) .q { width: 158px; }   /* < 170.6 breaks "Do I lose control of" */
.folder:nth-child(8) .q { width: 218px; }   /* < 220.5 breaks "What if my account gets" */
@media (max-width: 1000px) {
  .folder .q .st-img { position: absolute; left: auto !important; right: 20px;
    top: 18px !important; width: 30px !important; }
  .folder:nth-child(n) .q { width: auto; }
  .folder .q { padding-right: 44px; }
}

/* =====================================================================
   COOKIE BAR
   Bottom counterpart to the nav: rainbow strip along the top edge, ink
   hairline, pill buttons, no ornament. A centred card rather than a full-bleed
   band so it reads as a note laid on the page instead of browser chrome, and so
   it never covers a whole row of the design.
   z-index 70 clears the sticky nav (60); the testimonial <dialog> is in the
   top layer, so its backdrop still dims this.
===================================================================== */
.cookiebar {
  position: fixed; z-index: 70;
  left: 50%;
  /* env() keeps it off the iOS home indicator, and is 0 everywhere else */
  bottom: calc(clamp(12px, 1.8vw, 24px) + env(safe-area-inset-bottom, 0px));
  width: min(100% - 24px, 940px);
  background: #fff; border: 1.5px solid var(--ink);
  border-radius: 22px; overflow: clip;
  box-shadow: 0 26px 56px -22px rgba(35, 25, 80, .5);
  /* closed state: consent.js flips .is-open one frame after un-hiding it */
  opacity: 0; transform: translate(-50%, 18px);
  transition: opacity .32s ease, transform .32s cubic-bezier(.2, .8, .25, 1);
}
.cookiebar.is-open { opacity: 1; transform: translate(-50%, 0); }
/* the [hidden] attribute has to beat the display below, so state it here */
.cookiebar[hidden] { display: none; }
.cookiebar::before {
  content: ""; position: absolute; inset: 0 0 auto; height: 3px;
  background: var(--rainbow);
}
.cb-in {
  display: flex; align-items: center; gap: 22px;
  padding: 18px 20px 18px 22px;
}
.cb-copy { flex: 1 1 auto; min-width: 0; }
.cb-title {
  margin: 0 0 3px; font-family: var(--fd); font-weight: 800;
  font-size: 17px; line-height: 1.2;
}
.cb-text {
  margin: 0; font-family: var(--fb); font-size: 13.5px;
  line-height: 1.45; color: var(--grey);
  /* two even lines beside the buttons instead of a full line plus one word */
  text-wrap: balance;
}
.cb-actions { flex: none; display: flex; align-items: center; gap: 10px; }
.cb-btn { border-width: 1.5px; border-radius: 999px; padding: 11px 20px; font-size: 15px; }
.cb-yes { background: var(--yellow-deep); }

@media (max-width: 700px) {
  .cookiebar { border-radius: 18px; }
  .cb-in { flex-wrap: wrap; gap: 14px; padding: 16px; }
  .cb-copy { flex-basis: 100%; }
  /* buttons take their own row, equal halves, thumb-sized */
  .cb-actions { flex: 1 0 100%; }
  .cb-btn { flex: 1 1 0; padding-block: 13px; }
}

@media (prefers-reduced-motion: reduce) {
  .cookiebar { transition: none; }
}

/* =====================================================================
   LEGAL PAGES — terms.html
   Long-form contract in the site's voice: cream paper, marker headline,
   the text on one white slab like the pricing card. Deliberately quieter
   than the landing sections — no doodles, no reveal animation on the body
   copy (a contract has to read with JS off and on paper), measure capped
   near 70ch. Only tokens already defined above are used, so a palette
   change on the landing page carries over here.
===================================================================== */
.lg { padding-block: clamp(38px, 4.4vw, 72px) clamp(56px, 7vw, 100px); }
.lg-head { text-align: center; max-width: 820px; margin: 0 auto clamp(26px, 3.4vw, 44px); }
.lg-head .tag { margin-bottom: 18px; }
.lg-head h1 { font-size: clamp(2.2rem, 5vw, 4.25rem); font-weight: 500; line-height: 1; }
.lg-formal { font-family: var(--fu); font-size: clamp(13.5px, 1vw, 16px); color: var(--grey); margin: 20px 0 0; }
.lg-dates  { font-family: var(--fu); font-size: 13px; color: var(--grey-3); margin: 8px 0 0; }
.lg-dates strong { font-weight: 600; color: var(--grey); }

/* Three tracks, two children: the empty third one is a counterweight for the
   contents rail, so the slab sits on the page's centre line under the centred
   headline instead of ~140px right of it. It also holds the measure near 75ch —
   a full-width column at this size runs to ~95 characters a line. */
.lg-body {
  display: grid; grid-template-columns: 228px minmax(0, 748px) 228px;
  justify-content: center; gap: clamp(24px, 3.4vw, 60px); align-items: start;
}
@media (max-width: 1240px) {
  .lg-body { grid-template-columns: 228px minmax(0, 1fr); }
}

/* ---------- contents rail ---------- */
.lg-toc { position: sticky; top: 28px; font-family: var(--fu); }
.lg-toc-t {
  font-family: var(--fd); font-weight: 800; font-size: 11.5px;
  letter-spacing: .1em; text-transform: uppercase; color: var(--grey-3);
  margin: 0 0 10px 14px;
}
.lg-toc ol { list-style: none; margin: 0; padding: 0; }
.lg-toc a {
  display: block; padding: 5px 0 5px 13px; font-size: 12.5px; line-height: 1.35;
  color: var(--grey); border-left: 2px solid var(--hair);
  transition: color .12s ease, border-color .12s ease;
}
.lg-toc a:hover { color: var(--purple); border-left-color: var(--lav-pill); }

/* ---------- the document slab ---------- */
.lg-doc {
  background: #fff; border-radius: var(--r-lg); box-shadow: var(--shadow);
  padding: clamp(24px, 3vw, 52px) clamp(20px, 3.2vw, 56px);
}
.lg-doc h2 {
  font-size: clamp(1.1rem, 1.6vw, 1.4rem); font-weight: 700; line-height: 1.22;
  letter-spacing: -.01em; margin: 0 0 14px;
}
/* the contents links target the section, not the heading, so the jump would
   otherwise land with the title flush against the window edge */
.lg-sec { scroll-margin-top: 24px; }
.lg-doc p, .lg-doc li {
  font-size: clamp(14.5px, 1.02vw, 16px); line-height: 1.62; color: #23222B;
}
.lg-doc p { margin: 0 0 13px; }
.lg-doc p:last-child { margin-bottom: 0; }
.lg-doc strong { font-weight: 600; }
.lg-doc a { color: var(--purple-deep); text-decoration: underline; text-underline-offset: 2px; overflow-wrap: break-word; }
.lg-doc a:hover { color: var(--purple-bright); }
/* one hairline between sections, like the fee table's rows */
.lg-sec + .lg-sec {
  margin-top: clamp(26px, 2.8vw, 40px);
  padding-top: clamp(24px, 2.6vw, 36px); border-top: 1px solid var(--hair);
}
/* a lettered clause — (a), (b) … carried inline by the source text */
.lg-doc p.cl { margin-top: 15px; }
/* several sections close with a paragraph that qualifies the list above it; the
   lists carry no bottom margin so a trailing list doesn't pad the section out */
.lg-doc ul + p, .lg-doc ol + p { margin-top: 14px; }
/* the all-caps disclaimer blocks: a notch smaller so a 600-character
   uppercase paragraph is still readable */
.lg-doc p.caps { font-size: clamp(13px, .92vw, 14.3px); line-height: 1.58; color: #3A3945; }
.lg-callout {
  background: var(--purple-tint); border-left: 3px solid var(--purple);
  border-radius: 0 var(--r) var(--r) 0; padding: 15px 20px; margin: 16px 0 0;
}

.lg-list { margin: 13px 0 0; padding-left: 21px; }
.lg-list > li { margin-top: 11px; }
.lg-list > li::marker { color: var(--purple); }
.lg-list > li > p { margin: 9px 0 0; }
/* the source sets these sub-items with an en dash, not a bullet */
.lg-sub { list-style: none; margin: 9px 0 0; padding: 0; }
.lg-sub > li { position: relative; padding-left: 18px; margin-top: 6px; }
.lg-sub > li::before { content: "–"; position: absolute; left: 2px; color: var(--purple); }
/* (a) (b) (c) … numbered by CSS: every list in the .docx restarts its own
   counter, so Word renders them all as "(a)" */
.lg-alpha { list-style: none; margin: 13px 0 0; padding: 0; counter-reset: lgalpha; }
.lg-alpha > li { counter-increment: lgalpha; position: relative; padding-left: 32px; margin-top: 11px; }
.lg-alpha > li::before {
  content: "(" counter(lgalpha, lower-alpha) ")";
  position: absolute; left: 0; top: 0;
  font-family: var(--fu); font-weight: 600; font-size: .9em; color: var(--purple);
}

.lg-table-w { border: 1px solid var(--hair); border-radius: var(--r); overflow: hidden; margin: 16px 0 4px; }
.lg-table { width: 100%; border-collapse: collapse; font-family: var(--fu); font-size: 13.5px; text-align: left; }
.lg-table th { background: var(--pink); font-weight: 700; }
.lg-table th, .lg-table td { padding: 12px 16px; vertical-align: top; line-height: 1.45; }
.lg-table tbody tr + tr td, .lg-table tbody td { border-top: 1px solid #F0EDE7; }
.lg-table td:first-child { font-weight: 600; width: 34%; }

@media (max-width: 980px) {
  .lg-body { grid-template-columns: 1fr; }
  /* the rail becomes a box above the text; capped so 24 sections don't push
     the contract itself below two screens of links */
  .lg-toc {
    position: static; max-height: 208px; overflow-y: auto;
    background: #fff; border-radius: var(--r); padding: 16px 18px 14px;
    box-shadow: var(--shadow); margin-bottom: 22px;
  }
  .lg-toc-t { margin-left: 0; }
}
@media (max-width: 600px) {
  .lg-doc { border-radius: var(--r); padding: 22px 20px; }
  .lg-table th, .lg-table td { padding: 10px 12px; }
  .lg-table td:first-child { width: auto; }
}

/* scoped to the legal page so printing the landing page is left alone */
@media print {
  body.legal .lg-toc { display: none; }
  body.legal { background: #fff; }
  body.legal .lg-doc { box-shadow: none; padding: 0; border-radius: 0; }
  body.legal .lg-sec { break-inside: avoid-page; }
  body.legal .lg-doc h2 { break-after: avoid-page; }
}
