/* ============================================================================
   ChatScale — design system
   ----------------------------------------------------------------------------
   Light on Tailwind's slate ramp. The brand gradient comes straight off the
   logo mark and is spent in three places only.

   Four rules keep this from drifting back into the generic dark-neon look:

     1. The gradient is a SURFACE, never text and never a border. It appears on
        the logo, the primary button, and the pay ladder. Nowhere else.
     2. One typeface. Plus Jakarta Sans carries display, body and the numeric
        readouts; weight, size and tabular figures do all the hierarchy work.
        No second family, no mono, no italic accent, no serif.
     3. No decorative eyebrows. Labels are sentence-case Plus Jakarta, not
        letterspaced uppercase mono, and sections are not numbered in the
        margin.
     4. Contrast rhythm comes from full-bleed slate-950 blocks between light
        sections — not from glows, blurred aurora or gradient borders.
   ========================================================================== */

/* ---------- tokens ---------- */
:root {
  /* paper */
  --paper:    #ffffff;
  --paper-2:  #faf9fd;  /* the homepage's page ground */
  --paper-3:  #f3f1f9;

  /* ink */
  --ink:      #0b0421;  /* the homepage's ink */
  --ink-2:    #4a4363;  /* body copy on the homepage */
  --muted:    #565273;
  --muted-2:  #9a94b4;

  /* rules */
  --line:     #eae7f2;
  --line-2:   #ddd8ea;

  /* dark blocks */
  --dark:     #0b0421;
  --dark-2:   #0f172a;  /* slate-900 */
  --dark-3:   #1e293b;  /* slate-800 */
  --on-dark:  #f1f5f9;
  --on-dark-2:#94a3b8;

  /* brand — the logo mark is the only coloured thing on the page.
     Its mint-to-pink sweep reads as a mark at 26px; stretched across buttons
     and bars it just looked like a rainbow. Every control is slate instead,
     which is both more premium and higher contrast than a hue could be.
     Colour is reserved for meaning: green for live, emerald for pass, rose
     for fail. */
  --brand:      #0f172a;  /* slate-900 */
  --brand-2:    #334155;  /* slate-700 */
  --brand-3:    #020617;  /* slate-950 */
  --brand-tint: var(--paper-3);
  --brand-ring: rgba(2, 6, 23, .14);
  --brand-glow: rgba(2, 6, 23, .45);
  /* Solid faces. Depth comes from a 1px inner top highlight and layered
     shadows — never from a blended fill. This stylesheet contains no blended
     fills at all, and it should stay that way. */
  --brand-face:    var(--brand);
  --brand-face-hi: #1e293b;  /* slate-800 */

  /* The mark's own mint, sampled off logo.png (its sweep runs
     #22ffcd -> #29deff -> #5340fb). Used at full strength and sparingly —
     the nav CTA and the answers-page category markers. */
  --brand-mark: #22ffcd;

  /* interface accent — links, focus, labels */
  --accent:   #0b0421;
  --ok:       #047857;  /* emerald-700 */
  --bad:      #be123c;  /* rose-700    */
  --warn:     #b45309;  /* amber-700   */

  /* type */
  --f: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;

  /* metrics */
  --gutter:   clamp(18px, 4vw, 44px);
  --maxw:     1280px;
  --maxw-text: 68ch;
  --r:        14px;
  --r-sm:     10px;
  --section-y: clamp(64px, 9vw, 128px);
  --ease: cubic-bezier(.22, 1, .36, 1);

  /* elevation — the homepage's: a tight contact shadow plus one wide, lifted
     one, tinted with the page ink, never black and never a plain blur */
  --sh-sm: 0 1px 2px rgba(11, 4, 33, .04);
  --sh:    0 1px 2px rgba(11, 4, 33, .03), 0 12px 32px -18px rgba(11, 4, 33, .22);
  --sh-lg: 0 1px 2px rgba(15, 23, 42, .06), 0 18px 40px -22px rgba(15, 23, 42, .30);
}

/* ---------- reset ---------- */
*, *::before, *::after { box-sizing: border-box; }
html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* `clip`, not `hidden`: hidden on <html> would make it a scroll container
     and break the sticky nav. clip stops the viewport drifting sideways when
     a wide child (the chat screenshots) overflows its own scroller. */
  overflow-x: clip;
}
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--f);
  font-size: 18px;
  line-height: 1.6;
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: clip;
}

img, svg, video { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
button, input, select, textarea { font: inherit; color: inherit; }
[hidden] { display: none !important; }

::selection { background: #c7d2fe; color: var(--ink); }

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

/* ---------- typography ---------- */
h1, h2, h3, h4, h5 {
  margin: 0;
  font-weight: 800;
  letter-spacing: -0.035em;
  line-height: 1.05;
  text-wrap: balance;
  color: var(--ink);
}

.d1 { font-size: clamp(2.75rem, 6.5vw, 5.25rem); line-height: 1.02; letter-spacing: -0.042em; }
.d2 { font-size: clamp(2.1rem, 4.4vw, 3.5rem); line-height: 1.06; letter-spacing: -0.038em; }
.d3 { font-size: clamp(1.7rem, 3.2vw, 2.4rem); line-height: 1.18; letter-spacing: -0.03em; }

.lead {
  font-size: clamp(1.125rem, 1.6vw, 1.375rem);
  line-height: 1.6;
  color: var(--muted);
  max-width: 58ch;
  margin: 0;
  font-weight: 400;
  text-wrap: pretty;
}

p { margin: 0 0 1em; text-wrap: pretty; }
p:last-child { margin-bottom: 0; }
strong, b { font-weight: 700; color: var(--ink); }

/* the only label style — sentence case, no letterspacing, no mono */
.label {
  display: inline-block;
  font-size: 1rem;
  font-weight: 600;
  color: var(--accent);
  margin-bottom: 14px;
  letter-spacing: -0.008em;
}

.muted { color: var(--muted); }
.dim   { color: var(--muted-2); }

/* ---------- layout ---------- */
.container {
  width: 100%;
  max-width: var(--maxw);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

section { position: relative; }
.sec { padding-block: var(--section-y); scroll-margin-top: 88px; }
.sec-tint { background: var(--paper-2); }
.sec-line { border-top: 1px solid var(--line); }

/* full-bleed dark block — the contrast rhythm of the page */
.sec-dark {
  background: var(--dark);
  color: var(--on-dark);
}
.sec-dark h1, .sec-dark h2, .sec-dark h3, .sec-dark h4 { color: #fff; }
.sec-dark .lead, .sec-dark p { color: var(--on-dark-2); }
.sec-dark strong { color: #fff; }
.sec-dark .label { color: #cbd5e1; }

.sec-head { max-width: 62ch; margin-bottom: clamp(34px, 4.5vw, 58px); }
.sec-head .lead { margin-top: 18px; }

/* editorial two-column: heading holds the left, content runs right */
.split-2 {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: clamp(28px, 5vw, 76px);
  align-items: start;
}
.split-2 > .sticky { position: sticky; top: 104px; }
@media (max-width: 880px) {
  .split-2 { grid-template-columns: 1fr; gap: 32px; }
  .split-2 > .sticky { position: static; }
}

/* ---------- buttons ----------------------------------------------------------
   Depth comes from four stacked cues, the way a real UI kit does it: a faint
   vertical face shade, a 1px inner top highlight, a tight contact shadow, and
   a wide tinted glow. Hover lifts the whole stack rather than just swapping a
   colour. */
.btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 14px 26px;
  border: 1px solid transparent;
  border-radius: 999px;
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: -0.012em;
  line-height: 1.25;
  cursor: pointer;
  white-space: nowrap;
  transition: transform .18s var(--ease), background .18s var(--ease),
              border-color .18s var(--ease), box-shadow .22s var(--ease), opacity .18s;
}
.btn:active { transform: translateY(0) scale(.99); }
.btn:disabled, .btn[aria-disabled="true"] { opacity: .5; pointer-events: none; box-shadow: none; }

/* default face — a .btn with no variant is the dark heavyweight, never blank */
.btn, .btn-dark {
  background: var(--brand);
  color: #fff;
  border-color: #020617;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .12),
    0 1px 2px rgba(2, 6, 23, .22),
    0 10px 24px -12px rgba(2, 6, 23, .55);
}
.btn:hover, .btn-dark:hover {
  background: var(--brand-face-hi);
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .16),
    0 2px 4px rgba(2, 6, 23, .22),
    0 16px 32px -14px rgba(2, 6, 23, .6);
}

/* primary — the brand hue */
/* the same face as the nav's Apply button: slate, a 1px inner highlight and
   nothing else. No outer shadow, no glow. */
.btn-primary {
  background: var(--brand-face);
  color: #f8fafc;
  border-color: var(--brand-face);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10);
}
.btn-primary:hover {
  background: var(--brand-face-hi);
  border-color: var(--brand-face-hi);
  transform: translateY(-1px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .17);
}

/* On a dark block the primary inverts to white — a slate button on slate is
   invisible, and white is the strongest call to action a dark section has. */
.sec-dark .btn-primary,
.cta.sec-dark .btn-primary {
  background: #ffffff;
  color: #020617;
  border-color: #ffffff;
  box-shadow: none;
}
.sec-dark .btn-primary:hover {
  background: #e2e8f0;
  border-color: #e2e8f0;
  transform: translateY(-2px);
  box-shadow: none;
}

/* ghost — white card on light, translucent on dark */
/* the homepage's outline control: paper face, hairline, lilac tint on hover */
.btn-ghost {
  background: var(--paper);
  color: var(--ink);
  border-color: var(--line-2);
  box-shadow: none;
}
.btn-ghost:hover {
  background: #f2eefb;
  border-color: #cabfe4;
  transform: translateY(-1px);
}

.sec-dark .btn-ghost {
  background: rgba(255, 255, 255, .06);
  color: #fff;
  border-color: rgba(255, 255, 255, .18);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08);
}
.sec-dark .btn-ghost:hover {
  background: rgba(255, 255, 255, .12);
  border-color: rgba(255, 255, 255, .32);
}

.btn-sm { padding: 8px 15px; font-size: 0.9375rem; gap: 6px; }
.btn-lg { padding: 15px 30px; font-size: 1.125rem; }
.btn-block { width: 100%; }

/* quiet text link */
.tlink {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-weight: 700;
  font-size: 1.0625rem;
  letter-spacing: -0.012em;
  color: var(--brand);
  transition: gap .2s var(--ease), color .2s;
}
.tlink { border-bottom: 1.5px solid var(--line-2); padding-bottom: 2px; }
.tlink:hover { gap: 11px; border-bottom-color: var(--ink); }
.sec-dark .tlink { color: #fff; border-bottom-color: rgba(255,255,255,.3); }
.sec-dark .tlink:hover { border-bottom-color: #fff; }

/* ---------- nav ----------
   The floating bar lives in assets/nav.css and every page loads it; the old
   sticky .nav bar that used to be here is gone. ---------- */

/* ---------- footer (same sheet as the homepage; the source of truth for the
   rules is the .ft block in index.html — keep the two in step) ---------- */
.ft {
  position: relative; z-index: 5; overflow: hidden;
  /* Neutral tints. These were violet-cast greys, which is the same mistake
     the ground made: a hue that has been muted toward grey reads as dirty
     rather than as quiet. Colour is spent at full strength on the wordmark,
     the live dot and the halftone — nowhere else. */
  --ft-ink:  #f4f4f7;   /* headings              */
  --ft-body: #a9a8b6;   /* links, description    */
  --ft-dim:  #8a8996;   /* legal small print     */
  --ft-line: rgba(255,255,255,.10);
  --ft-hot:  #5eead4;   /* the mark's mint, for interaction only */

  /* A near-neutral ink, with only a whisper of violet left in it (10,9,15)
     so it stays related to the page without carrying a purple cast.

     Two earlier grounds failed here for the same reason. #0a0320 was a muted
     violet and read as a dead patch; ramping into it from the light section
     above was worse, because blending any saturated hue toward a near-white
     ground runs it through desaturated midtones — the muddy band you get is
     unavoidable in sRGB, whatever the hue. So there is no ramp: the sheet
     meets the light section on a crisp edge, and the only softening is the
     1px inner highlight along its lip. No outer shadow either — a black
     shadow spreading onto a near-white ground is precisely the grey smudge
     this is replacing. */
  background: #0a090f; color: var(--ft-body);
  /* the card-to-page arrival comes from the seam rules in the walkthrough
     block; only the hairline is the footer's own */
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .11);
  padding: clamp(34px, 3.6vw, 46px) 24px clamp(22px, 2.4vw, 26px);
}
/* the hero's three stops — mint, hot pink, violet — at low alpha, so the
   footer is lit by the same palette as the top of the page instead of being
   a flat black rectangle. Strongest at the top, where it takes over from
   the ramp above. */
.ft::before {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background:
    radial-gradient(70% 50% at 16% 0%,   rgba(139, 92, 246, .13) 0%, transparent 70%),
    radial-gradient(52% 46% at 87% 6%,   rgba(232, 71, 177, .08) 0%, transparent 72%),
    radial-gradient(60% 55% at 52% 104%, rgba(94, 234, 212, .07) 0%, transparent 72%);
}

.ft__wrap { position: relative; max-width: 1240px; margin-inline: auto; }

/* logo.png sampled into a 30-column halftone — dot area tracks the mark's
   coverage. Texture, not a second logo. */
/* The halftone is the logo mark — ascending bars, sampled from logo.png into
   a 30-column dot field. It used to be bled off the bottom-right corner and
   masked at the edges, so what actually reached the page was an
   unrecognisable fragment of dots; the mark only reads as a mark when you can
   see all of it. So: shown whole, no mask, sitting inside .ft__wrap rather
   than the full-bleed footer so its right edge lines up with the link columns
   and the legal bar. Opacity is up, because a complete mark can carry more
   presence than a cropped smudge could. */
.ft__dots {
  position: absolute; right: 0; bottom: 0;
  width: clamp(104px, 12vw, 142px); height: auto;
  /* The gradient is userSpaceOnUse for a reason. SVG's default is
     objectBoundingBox, and because `fill` is inherited by every <circle>,
     that resolved the whole mint-to-pink sweep inside each individual ~9px
     dot — which averages to the stop in the middle. The result was 334 dots
     all painted the same flat violet, which is what made the mark look muddy
     and lifeless. Mapped across the viewBox instead, the sweep runs along the
     bars the way it does in the logo: mint at the low end, pink at the top. */
  fill: url(#ftDotSweep);
  opacity: .42;
  pointer-events: none; user-select: none;
}
/* Narrow: the columns stack, so the mark would land on top of them. Park it
   against the legal bar, where the stacked layout leaves a gap. */
@media (max-width: 700px) { .ft__dots { width: 84px; opacity: .26; } }

.ft__top { position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 30px; }
@media (min-width: 1024px) { .ft__top { flex-direction: row; align-items: flex-start; } }

.ft__brand { display: flex; width: 100%; flex-direction: column; align-items: flex-start; gap: 13px; }
.ft__logo { display: flex; align-items: center; gap: 10px; text-decoration: none; }
.ft__logo img { height: 30px; width: 30px; display: block; }
.ft__logo h2 { margin: 0; font-size: 20px; font-weight: 800; letter-spacing: -.03em; color: var(--ft-ink); }
.ft__desc { margin: 0; max-width: 38ch; font-size: 16px; line-height: 1.65; color: var(--ft-body); }

/* The page opens on "Chat to get rich." and now closes on it, carrying the
   mark's own mint-to-pink sweep. The brand column was 131px shorter than the
   link columns beside it, which left a hole in the left half of the sheet;
   this fills it with the one line the page is actually about rather than
   with filler. */
.ft__tag {
  margin: -2px 0 0;
  font-size: clamp(27px, 3.2vw, 38px);
  font-weight: 800;
  letter-spacing: -.045em;
  line-height: 1.02;
  /* background-clip:text only paints inside the box, and at this line
     height the box ends above the g's descender, which came out cut. The
     padding gives the gradient somewhere to paint the tail; the negative
     margin hands that height straight back so nothing below moves. */
  padding-bottom: .18em; margin-bottom: -.18em;
  background: linear-gradient(100deg, #5eead4 0%, #a78bfa 48%, #e847b1 100%);
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
}


/* The footer's call to action, replacing the "Start your application" card
   that used to run across the top of it. That card cost ~190px of height to
   collect an address the applicant retypes on the Fillout form anyway — its
   only other job was to navigate here. A button does that in one line. */
.ft__cta {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 11px 22px; border-radius: 999px;
  background: var(--ft-ink); color: #0a090f;
  font-size: 16px; font-weight: 700; letter-spacing: -.01em;
  text-decoration: none; white-space: nowrap;
  box-shadow: 0 1px 2px rgba(0,0,0,.4), 0 12px 28px -14px rgba(244,244,247,.5);
  transition: background-color .16s, transform .16s cubic-bezier(.22,1,.36,1);
}
/* The face stays put. The glow behind it is the hover signal now, and a
   pill that also turns mint is a second cue competing with it - the exact
   colour-swap this was meant to replace. It also disagreed with the hero
   CTA, which only brightens. Same action, one behaviour. */
.ft__cta:hover { background: #fff; transform: translateY(-1px); }

/* ── CTA glow ────────────────────────────────────────────────────────────
   Technique from the flame/rainbow buttons on 21st.dev: a blurred gradient
   layer sitting behind the control, not painted onto it.

   That distinction is the whole design decision. styles.css records that the
   mint-to-pink sweep was already tried ON buttons and rejected - "stretched
   across buttons and bars it just looked like a rainbow", which is exactly
   what the rainbow-button component does. So the face stays white: it is the
   highest-contrast thing a dark section can offer, and that note is right.
   The sweep only appears as diffuse light BEHIND the pill, where it reads as
   the logo's colour spilling rather than as a coloured control.

   It idles at low opacity so the button is never dead, wakes on hover, and
   the gradient drifts so the light moves rather than just brightening. The
   drift is the part a plain colour swap cannot do. */
/* The glow lives on a WRAPPER, not on the button. It has to: the button
   lifts on hover with translateY, any transform makes an element its own
   stacking context, and a z-index:-1 pseudo inside one paints on top of its
   parent's background instead of behind it. The face stayed white at rest
   and turned pink the moment you hovered. The wrapper never transforms, so
   the halo stays behind the pill in both states. */
.glow-wrap { position: relative; display: inline-flex; border-radius: 999px; }
.glow-wrap::before {
  content: '';
  position: absolute; z-index: -1;
  inset: -3px;
  border-radius: inherit;
  /* The mark's real sweep, sampled off logo.png: mint -> cyan -> indigo.
     nav.css records that the "mint-to-pink" wording in styles.css is wrong
     about the hue, and the map arcs use that wrong pair. A halo whose whole
     job is to read as the logo spilling has to use the logo's colours. */
  background: linear-gradient(90deg, #22ffcd, #29deff, #5340fb, #29deff, #22ffcd);
  background-size: 200% 100%;
  filter: blur(11px);
  opacity: .34;
  transition: opacity .28s ease, filter .28s ease;
  /* The halo is always lit; only the motion waits for interaction. Most of
     this page's traffic is paid social - the acquisition script tags
     telegram, instagram and tiktok - so it is mostly touch, where hover
     never fires. A hover-only glow would not exist for the people we paid
     to get here. Perpetual drift is the part that reads cheap, not the
     light, so it idles paused and runs as the reward for reaching for it. */
  animation: glowDrift 6s linear infinite;
  animation-play-state: paused;
}
.glow-wrap:hover::before,
.glow-wrap:focus-within::before {
  opacity: .72; filter: blur(15px);
  animation-play-state: running;
}
/* No hover to reward on touch, so the resting state carries more of it */
@media (hover: none) {
  .glow-wrap::before { opacity: .5; }
}
@keyframes glowDrift {
  from { background-position: 0% 50%; }
  to   { background-position: 200% 50%; }
}
/* the halo is decoration; without motion it holds a steady state instead */
@media (prefers-reduced-motion: reduce) {
  .glow-wrap::before { animation: none; transition: none; }
}
.ft__cta svg { width: 15px; height: 15px; stroke: currentColor; stroke-width: 2.4; fill: none; }
@media (prefers-reduced-motion: reduce) { .ft__cta { transition: none; } }

.ft__cols { display: grid; width: 100%; gap: 28px; }
@media (min-width: 768px) { .ft__cols { grid-template-columns: repeat(2, 1fr); } }
/* the right slot is the halftone's; reserving it here is what lets the mark
   sit at full size without a longer link ever reaching it */
@media (min-width: 1024px) { .ft__cols { gap: 64px; padding-right: 168px; } }
.ft__cols h3 { margin: 0 0 11px; font-size: 16px; font-weight: 700; color: var(--ft-ink); }
.ft__cols ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.ft__cols a {
  font-size: 16px; font-weight: 500; color: var(--ft-body);
  text-decoration: none; transition: color .16s;
}
.ft__cols a:hover { color: var(--ft-hot); }


.ft__bar {
  margin-top: 16px; padding: 16px 0 0;
  border-top: 1px solid var(--ft-line);
  display: flex; flex-direction: column; justify-content: space-between; gap: 12px;
  font-size: 14px; font-weight: 500; color: var(--ft-dim);
}
@media (min-width: 768px) { .ft__bar { flex-direction: row; align-items: center; } }
.ft__bar p { margin: 0; order: 2; }
@media (min-width: 1024px) { .ft__bar p { order: 1; } }
.ft__bar ul { list-style: none; margin: 0; padding: 0; order: 1; display: flex; gap: 18px; flex-wrap: wrap; }
@media (min-width: 768px) { .ft__bar ul { order: 2; } }
.ft__bar a { color: inherit; text-decoration: none; transition: color .16s; }
.ft__bar a:hover { color: var(--ft-hot); }

/* ---------- footer seam ----------
   The footer is a sheet that arrives over the section above it, on the same
   one-number system the homepage runs for .walk and .ft: --seam goes 0 → 1 as
   the footer's top edge travels from the bottom of the viewport to a quarter
   of the way up, and three crisp things ride on it — the sheet starts inset
   from both sides with deeper corners and lands full bleed at the resting
   radius, a short strip of the brand gradient crosses the top edge once and
   leaves, and the copy settles up a beat after the ground. No fades.

   This lived only in the homepage's inline <style>, which is why every other
   page had a plain square full-bleed footer while the homepage had the
   arrival. The long form of the reasoning is in the Seams comment in
   index.html; the values here are that block's, verbatim.

   Resting values are the finished state (--seam: 1), so with no JS or under
   reduce-motion the footer is simply landed rather than stuck mid-arrival.
   assets/site.js drives the number; index.html drives its own. */
body {
  --seam-inset: clamp(14px, 5vw, 88px);          /* how far in the sheet starts */
  --seam-r:     clamp(22px, 2.6vw, 34px);         /* resting corner              */
  --seam-r-in:  clamp(36px, 4.6vw, 64px);         /* corner while arriving       */
}
.ft {
  --seam: 1;
  --arrive: calc(1 - var(--seam));                /* 1 while arriving, 0 at rest */
  --r: calc(var(--seam-r) + (var(--seam-r-in) - var(--seam-r)) * var(--arrive));
  clip-path: inset(0 calc(var(--seam-inset) * var(--arrive)) 0 round var(--r) var(--r) 0 0);
}
/* The light along the edge. 3px tall so it reads at a glance, no blur, no
   glow; a 42%-wide strip that starts entirely off the left edge and is
   entirely off the right by the time the sheet has landed. */
.ft::after {
  content: ''; position: absolute; top: 0; left: 0; z-index: 30;
  width: 42%; height: 3px; pointer-events: none;
  background: linear-gradient(90deg, transparent 0%, #5eead4 18%, #e847b1 50%, #8b5cf6 82%, transparent 100%);
  transform: translateX(calc(-100% + var(--seam) * 340%));
  will-change: transform;
}
/* copy settles a beat after the ground */
.ft__wrap {
  transform: translateY(calc(var(--arrive) * 56px));
  will-change: transform;
}
/* While the sheet is inset, the strips either side of it and the space behind
   its corners show the body's own white rather than the tinted section it is
   rising out of. A transparent border extends that section's ground down under
   the footer (backgrounds paint under borders) and the negative margin gives
   the height straight back; the body is clipped so it cannot add scroll
   height, and overflow:clip makes no scroll container, so nothing sticky
   changes. Browsers without :has() skip both rules together and simply show
   white in the strips for the half second the sheet is landing. */
body:has(> .ft) { overflow: clip; }
:is(section, main, div):has(+ .ft) {
  border-bottom: 80vh solid transparent;
  margin-bottom: -80vh;
}


/* ============================================================================
   MARKETING
   ========================================================================== */

/* ---------- hero ---------- */
.hero { padding-block: clamp(44px, 7vw, 92px) clamp(40px, 6vw, 76px); }
.hero-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
  gap: clamp(36px, 6vw, 72px);
  align-items: center;
}
@media (max-width: 940px) {
  .hero-grid { grid-template-columns: 1fr; gap: 40px; }
}

/* the one moving element on the page: a live "we're hiring" marker */
.hiring {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 6px 14px 6px 11px;
  margin-bottom: 24px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--paper);
  box-shadow: var(--sh-sm);
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--ink-2);
}
.hiring .dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: #10b981;
  flex: none;
  position: relative;
}
.hiring .dot::after {
  content: '';
  position: absolute;
  inset: -4px;
  border-radius: 50%;
  border: 1px solid #10b981;
  opacity: .5;
  animation: ping 2.4s var(--ease) infinite;
}
@keyframes ping {
  0%   { transform: scale(.7); opacity: .6; }
  70%  { transform: scale(1.5); opacity: 0; }
  100% { transform: scale(1.5); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) { .hiring .dot::after { animation: none; } }

.hero h1 { max-width: 13ch; }
.hero-sub { margin-top: 22px; max-width: 46ch; font-size: clamp(1.125rem, 1.6vw, 1.375rem); color: var(--muted); }
.hero-cta { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 20px; margin-top: 30px; }

/* the trust line under the buttons — plain text, no pills */
.hero-trust {
  margin-top: 26px;
  display: flex;
  flex-wrap: wrap;
  gap: 6px 20px;
  font-size: 0.9375rem;
  color: var(--muted);
  font-weight: 500;
}
.hero-trust span { display: inline-flex; align-items: center; gap: 7px; }
.hero-trust svg { width: 15px; height: 15px; stroke: var(--ok); fill: none; stroke-width: 2.4; flex: none; }

/* ---------- the payout card (hero object) --------------------------------
   A concrete artifact beats an abstract blur: it shows the reader exactly what
   the outcome looks like. Labelled illustrative on the card itself. */
.paycard {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--sh-lg);
  overflow: hidden;
  max-width: 420px;
  margin-inline: auto;
}
.paycard .edge { height: 4px; background: var(--brand-face); }
.paycard .body { padding: clamp(20px, 3vw, 28px); }
.paycard .top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 18px;
}
.paycard .who { font-size: 0.9375rem; font-weight: 700; color: var(--ink); }
.paycard .tag {
  font-size: 0.8125rem;
  font-weight: 700;
  color: var(--muted);
  background: var(--paper-3);
  border-radius: 999px;
  padding: 4px 9px;
}
.paycard .total {
  font-size: clamp(2.1rem, 4.4vw, 2.9rem);
  font-weight: 800;
  letter-spacing: -0.045em;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}
.paycard .when { margin-top: 7px; font-size: 0.9375rem; color: var(--muted); font-weight: 500; }
.paycard .rows { margin-top: 20px; border-top: 1px solid var(--line); }
.paycard .r {
  display: flex;
  justify-content: space-between;
  gap: 14px;
  padding: 11px 0;
  border-bottom: 1px solid var(--line);
  font-size: 1.0625rem;
}
.paycard .r span:first-child { color: var(--muted); }
.paycard .r span:last-child { font-weight: 700; font-variant-numeric: tabular-nums; }
.paycard .r.sum { border-bottom: 0; padding-bottom: 0; }
.paycard .r.sum span { color: var(--ink); font-weight: 800; }
.paycard .foot {
  padding: 12px clamp(20px, 3vw, 28px);
  background: var(--paper-2);
  border-top: 1px solid var(--line);
  font-size: 0.8125rem;
  color: var(--muted);
}

/* ---------- stat row ---------- */
/* Separate tiles rather than one bordered block split by 1px rules: the
   shared frame read as a table, and the answers page below it is all cards. */
.stats {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 10px;
  margin-top: clamp(40px, 5vw, 68px);
}
.stats .s {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--sh);
  padding: clamp(16px, 2.2vw, 22px);
}
.sec-tint .stats .s { background: var(--paper); }
.sec-dark .stats .s { background: var(--dark); border-color: var(--dark-3); }
.stats .v {
  display: block;
  font-size: clamp(1.5rem, 2.6vw, 2.1rem);
  font-weight: 800;
  letter-spacing: -0.042em;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.stats .k { display: block; margin-top: 6px; font-size: 0.9375rem; color: var(--muted); font-weight: 500; }
.sec-dark .stats .k { color: var(--on-dark-2); }
@media (max-width: 760px) { .stats { grid-template-columns: repeat(2, 1fr); } }

/* ---------- the pay ladder (lives on the dark block) ---------------------- */
.ladder {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(10px, 1.8vw, 24px);
  align-items: stretch;
  height: clamp(240px, 30vw, 350px);
}
.ladder .rung { display: flex; flex-direction: column; justify-content: flex-end; min-width: 0; }
/* the bar grows into what the labels leave, so the percentages below always
   describe the same drawing area */
.ladder .barwrap { flex: 1; display: flex; align-items: flex-end; min-height: 0; }
.ladder .bar {
  width: 100%;
  border-radius: 8px 8px 3px 3px;
  background: var(--brand-face);
  position: relative;
  transition: transform .4s var(--ease);
}
/* The climb is carried by height and a lightening slate ramp; the gradient is
   held back for the final bar so it reads as the payoff rather than as four
   washed-out repeats of the same wash. */
.ladder .rung:nth-child(1) .bar { height: 20%; background: #1e293b; }
.ladder .rung:nth-child(2) .bar { height: 39%; background: #334155; }
.ladder .rung:nth-child(3) .bar { height: 65%; background: #475569; }
/* The payoff bar is white, not brand-coloured: a saturated bar this large on a
   near-black ground reads as neon, and the brand hue is already carrying the
   buttons. Height plus the slate ramp is enough to tell the story. */
.ladder .rung:nth-child(4) .bar {
  height: 100%;
  background: #ffffff;
  box-shadow: 0 0 50px -22px rgba(255, 255, 255, .55);
}
.ladder .rung:hover .bar { transform: translateY(-5px); }
.ladder .amt {
  font-size: clamp(1.02rem, 2vw, 1.6rem);
  font-weight: 800;
  letter-spacing: -0.042em;
  color: #fff;
  margin-bottom: 12px;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.ladder .when { margin-top: 13px; font-size: 0.9375rem; color: var(--on-dark-2); font-weight: 500; line-height: 1.4; }
@media (max-width: 620px) {
  .ladder { height: 220px; gap: 8px; }
  .ladder .amt { font-size: 0.9375rem; margin-bottom: 8px; }
  .ladder .when { font-size: 0.8125rem; margin-top: 9px; }
}

/* ---------- cards ---------- */
.cards {
  display: grid;
  grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr));
  gap: clamp(14px, 1.8vw, 22px);
}
@media (max-width: 900px) { .cards { --cols: 2 !important; } }
@media (max-width: 580px) { .cards { --cols: 1 !important; } }

.card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: clamp(20px, 2.6vw, 28px);
  box-shadow: var(--sh-sm);
  transition: box-shadow .28s var(--ease), transform .28s var(--ease), border-color .28s var(--ease);
}
.card:hover { box-shadow: var(--sh); transform: translateY(-2px); border-color: var(--line-2); }
.card h3 { font-size: 1.1875rem; letter-spacing: -0.028em; margin-bottom: 8px; }
.card p { color: var(--muted); font-size: 1.0625rem; margin: 0; line-height: 1.6; }

.sec-dark .card {
  background: var(--dark-2);
  border-color: var(--dark-3);
  box-shadow: none;
}
.sec-dark .card:hover { border-color: #334155; transform: translateY(-2px); }
.sec-dark .card p { color: var(--on-dark-2); }

/* numbered step chip */
.step-n {
  display: inline-grid;
  place-items: center;
  width: 30px; height: 30px;
  border-radius: 9px;
  background: var(--paper-3);
  color: var(--ink);
  font-size: 0.9375rem;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  margin-bottom: 16px;
}
.sec-dark .step-n { background: var(--dark-3); color: #fff; }

/* icon tile */
.ico-tile {
  display: inline-grid;
  place-items: center;
  width: 38px; height: 38px;
  border-radius: 10px;
  background: var(--paper-3);
  margin-bottom: 16px;
}
.ico-tile svg { width: 19px; height: 19px; stroke: var(--ink); fill: none; stroke-width: 1.7; }
.sec-dark .ico-tile { background: var(--dark-3); }
.sec-dark .ico-tile svg { stroke: #e2e8f0; }

/* ---------- checklist ---------- */
.checks { display: grid; gap: 2px; }
.check {
  display: grid;
  grid-template-columns: 26px minmax(0, 1fr);
  gap: 16px;
  align-items: start;
  padding: clamp(18px, 2.4vw, 24px) 0;
  border-bottom: 1px solid var(--line);
}
.check:first-child { border-top: 1px solid var(--line); }
.check .tick {
  width: 26px; height: 26px;
  border-radius: 50%;
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  display: grid; place-items: center;
  margin-top: 1px;
}
.check .tick svg { width: 13px; height: 13px; stroke: var(--ok); fill: none; stroke-width: 3; }
.check h3 { font-size: 1.1875rem; letter-spacing: -0.026em; margin-bottom: 5px; }
.check p { margin: 0; color: var(--muted); font-size: 1.0625rem; }

/* ---------- quote ---------- */
.quote {
  font-size: clamp(1.5rem, 3vw, 2.3rem);
  font-weight: 700;
  letter-spacing: -0.032em;
  line-height: 1.25;
  margin: 0;
  max-width: 22ch;
  color: var(--ink);
}
.sec-dark .quote { color: #fff; }
.quote-by { margin-top: 20px; font-size: 1.0625rem; color: var(--muted); font-weight: 500; }
.sec-dark .quote-by { color: var(--on-dark-2); }

/* ---------- testimonial screenshots ----------------------------------------
   Real Discord captures: ~1200px wide, barely 60px tall. Shrunk into a card or
   a marquee they turn into an unreadable smear, so they sit near native width
   in a channel-style panel and each row scrolls on its own when narrow. */
.channel {
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--dark-2);
  overflow: hidden;
  box-shadow: var(--sh);
}
.channel-bar {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 13px 18px;
  border-bottom: 1px solid var(--dark-3);
  background: var(--dark);
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--on-dark-2);
}
.channel-bar .dots { display: flex; gap: 5px; }
.channel-bar .dots i { width: 8px; height: 8px; border-radius: 50%; background: #334155; display: block; }
.channel-bar .dots i:first-child { background: #10b981; }

.shots { display: flex; flex-direction: column; }
.shot {
  overflow-x: auto;
  overflow-y: hidden;
  border-bottom: 1px solid var(--dark-3);
  padding: 4px 0;
  scrollbar-width: thin;
  scrollbar-color: #334155 transparent;
}
.shot:last-child { border-bottom: 0; }
.shot::-webkit-scrollbar { height: 5px; }
.shot::-webkit-scrollbar-thumb { background: #334155; border-radius: 3px; }
.shot img { width: 100%; min-width: 680px; display: block; }

.channel-foot {
  padding: 13px 18px;
  border-top: 1px solid var(--dark-3);
  background: var(--dark);
  font-size: 0.9375rem;
  color: var(--on-dark-2);
}

/* ---------- FAQ ----------
   Cards on a tinted ground rather than hairline rows, so the answers page
   reads at the same level as the homepage accordion. Still <details>/<summary>
   — it works with JS off and search engines index the answers, which the
   homepage's JS-rendered version does not get.
   Only /about uses these, .qa-group and .stats; no other page has the markup. */
.faq { display: grid; gap: 10px; }
.faq details {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  transition: border-color .18s var(--ease), box-shadow .18s var(--ease);
}
.faq details:hover { border-color: var(--line-2); }
.faq details[open] {
  border-color: var(--line-2);
  box-shadow: var(--sh);
}
.faq summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  padding: clamp(15px, 1.8vw, 19px) clamp(16px, 2vw, 22px);
  cursor: pointer;
  list-style: none;
  font-size: clamp(1.0625rem, 1.3vw, 1.1875rem);
  font-weight: 700;
  letter-spacing: -0.024em;
  color: var(--ink);
  transition: color .18s;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary:hover { color: var(--accent); }
/* the sign sits in its own chip so it reads as a control, not a stray glyph */
.faq summary .pm {
  flex: none; position: relative;
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--paper-3);
  transition: background-color .18s var(--ease);
}
.faq summary:hover .pm { background: var(--line); }
.faq details[open] summary .pm { background: var(--ink); color: var(--paper); }
.faq summary .pm::before, .faq summary .pm::after {
  content: ''; position: absolute; background: currentColor; border-radius: 2px;
  transition: transform .26s var(--ease), opacity .26s var(--ease);
}
.faq summary .pm::before { inset: 12.2px 7px; height: 1.6px; }
.faq summary .pm::after  { inset: 7px 12.2px; width: 1.6px; }
.faq details[open] summary .pm::after { transform: rotate(90deg); opacity: 0; }
.faq .ans {
  padding: 0 clamp(16px, 2vw, 22px) clamp(16px, 2vw, 20px);
  color: var(--ink-2);
  font-size: 1.125rem;
  line-height: 1.65;
  max-width: 72ch;
}

/* ---------- closing CTA ---------- */
.cta { padding-block: clamp(72px, 10vw, 128px); text-align: center; }
.cta h2 { margin-inline: auto; max-width: 16ch; }
.cta .lead { margin-inline: auto; margin-top: 20px; }
.cta .hero-cta { justify-content: center; }

/* ---------- reveal on scroll ---------- */
[data-rise] { opacity: 0; transform: translateY(14px); }
.rise-in { opacity: 1 !important; transform: none !important; transition: opacity .6s var(--ease), transform .6s var(--ease); }
@media (prefers-reduced-motion: reduce) { [data-rise] { opacity: 1; transform: none; } }

/* ============================================================================
   FUNNEL — apply / skills check / legal
   These pages are work, not marketing: one column, calm, maximum legibility.
   Light throughout, because people complete forms and a timed typing test here.
   ========================================================================== */

.apply-page { background: var(--paper-2); }

/* the floating nav is fixed, so every page opens with the same clearance the
   about page's hero uses */
.apply-section { padding-block: clamp(104px, 11vw, 150px) clamp(64px, 8vw, 112px); }
.apply-section > .container { max-width: 820px; }

.apply-head { margin-bottom: clamp(24px, 3.4vw, 38px); }
.apply-head h1 { font-size: clamp(2.5rem, 5.2vw, 4rem); letter-spacing: -0.042em; line-height: 1.02; }
.apply-head p { margin-top: 18px; color: var(--muted); font-size: clamp(1.125rem, 1.6vw, 1.375rem); line-height: 1.6; max-width: 52ch; }

/* step marker — sentence case, never letterspaced caps */
.pill {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 6px 14px 6px 11px;
  margin-bottom: 18px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--paper);
  box-shadow: var(--sh-sm);
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--ink-2);
}
.pulse {
  width: 7px; height: 7px; border-radius: 50%;
  background: #10b981;
  flex: none;
  position: relative;
}
.pulse::after {
  content: '';
  position: absolute; inset: -4px;
  border-radius: 50%;
  border: 1px solid #10b981;
  opacity: .5;
  animation: ping 2.4s var(--ease) infinite;
}
@media (prefers-reduced-motion: reduce) { .pulse::after { animation: none; } }

/* ---------- the working surface ---------- */
.form-card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--sh);
  padding: clamp(22px, 3.2vw, 38px);
}
.form-card > h3 { font-size: 1.1875rem; letter-spacing: -0.028em; margin-bottom: 4px; }
.form-card > p.muted { font-size: 0.9375rem; margin-bottom: 20px; }

.progress {
  height: 5px;
  background: var(--paper-3);
  border-radius: 999px;
  overflow: hidden;
  margin-bottom: 28px;
}
.progress-bar {
  height: 100%;
  width: 8%;
  background: var(--brand-face);
  border-radius: 999px;
  transition: width .5s var(--ease);
}

/* exactly one step or screen is visible at a time */
.step, .screen { display: none; }
.step.active, .screen.active { display: block; animation: rise .34s var(--ease) both; }
@keyframes rise { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .step.active, .screen.active { animation: none; } }

.step-label {
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--accent);
  margin-bottom: 16px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--line);
}

/* ---------- inputs ---------- */
.field {
  display: block;
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--ink-2);
  margin: 18px 0 7px;
}
.field:first-of-type { margin-top: 0; }

input[type="text"], input[type="email"], input[type="tel"], input[type="date"],
input[type="number"], select, textarea {
  width: 100%;
  padding: 12px 14px;
  background: var(--paper);
  border: 1px solid var(--line-2);
  border-radius: var(--r-sm);
  color: var(--ink);
  font-size: 1.0625rem;
  font-family: var(--f);
  box-shadow: var(--sh-sm);
  transition: border-color .18s, box-shadow .18s;
  -webkit-appearance: none;
  appearance: none;
}
input::placeholder, textarea::placeholder { color: var(--muted-2); }
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(2, 6, 23, .10);
}
input[type="date"]::-webkit-calendar-picker-indicator { cursor: pointer; }
textarea { resize: vertical; min-height: 92px; line-height: 1.6; }
input[type="checkbox"] {
  width: 17px; height: 17px;
  flex: none;
  margin: 2px 0 0;
  accent-color: var(--accent);
  cursor: pointer;
}

/* ---------- consent row ----------
   The one checkbox on the site, on the last screen of the skills check. It
   was a raw browser checkbox tinted with accent-color, which meant the single
   control standing between a candidate and their result was the only thing on
   the page drawn by the operating system rather than by us.

   So it is built from the same parts as `.opts .opt`, the pattern the English
   questions already use: a bordered row that responds as one target, with the
   indicator at the left. Square with a tick rather than a round dot, which is
   the ordinary distinction between agreeing to something and picking one of
   several. */
.consent {
  position: relative;
  display: grid;
  grid-template-columns: 18px 1fr;
  gap: 12px;
  align-items: start;
  margin-top: 14px;
  padding: 14px 18px;
  border: 1px solid var(--line-2);
  border-radius: var(--r-sm);
  background: var(--paper);
  box-shadow: var(--sh-sm);
  cursor: pointer;
  transition: border-color .18s, background .18s, box-shadow .18s;
}

/* The real input stays in the DOM and keeps its own focus and keyboard
   behaviour — it is only invisible. Nothing here reimplements a checkbox. */
.consent input[type="checkbox"] {
  position: absolute;
  width: 18px; height: 18px;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

.consent__box {
  width: 18px; height: 18px;
  margin-top: 1px;
  display: grid;
  place-items: center;
  border: 1.5px solid var(--line-2);
  border-radius: 5px;
  background: var(--paper);
  transition: border-color .18s, background .18s;
}
.consent__box svg {
  width: 12px; height: 12px;
  fill: none;
  stroke: var(--paper);
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
  /* The tick wipes in from the left rather than fading up. A fade would put a
     half-opaque grey tick on screen for a moment, which is the muddy look this
     palette avoids; a wipe is a hard edge at every frame of it. */
  clip-path: inset(0 100% 0 0);
  transition: clip-path .16s var(--ease);
}
.consent__text {
  font-size: 1rem;
  line-height: 1.5;
  font-weight: 500;
  color: var(--ink-2);
}

.consent:hover { border-color: var(--muted-2); background: var(--paper-2); }
.consent input[type="checkbox"]:checked + .consent__box { border-color: var(--accent); background: var(--accent); }
.consent input[type="checkbox"]:checked + .consent__box svg { clip-path: inset(0 0 0 0); }

/* :has for the row state, so checking the box settles the whole row the way
   `.opt.selected` does. Where :has is missing the tick still works — the row
   simply does not change with it. */
.consent:has(input[type="checkbox"]:checked) {
  border-color: var(--ink);
  background: var(--paper-2);
  box-shadow: 0 0 0 3px rgba(11, 4, 33, .08);
}
.consent:has(input[type="checkbox"]:focus-visible) {
  border-color: var(--ink);
  box-shadow: 0 0 0 3px rgba(11, 4, 33, .10);
}
@media (prefers-reduced-motion: reduce) {
  .consent, .consent__box, .consent__box svg { transition: none; }
}

.err {
  display: none;
  margin-top: 10px;
  padding: 11px 14px;
  border: 1px solid #fecdd3;
  border-radius: var(--r-sm);
  background: #fff1f2;
  color: var(--bad);
  font-size: 1.0625rem;
  font-weight: 500;
  line-height: 1.5;
}
.err.show { display: block; }

.form-nav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  margin-top: 24px;
  padding-top: 22px;
  border-top: 1px solid var(--line);
}

/* ---------- assessment ---------- */
.serious-note {
  border: 1px solid var(--line);
  border-left: 3px solid var(--accent);
  border-radius: var(--r-sm);
  background: var(--paper-2);
  padding: 17px 19px;
  margin-bottom: 20px;
}
.serious-note strong { display: block; margin-bottom: 6px; font-size: 1.0625rem; }
.serious-note p { margin: 0; color: var(--muted); font-size: 1.0625rem; }

.timer-chip {
  float: right;
  font-family: var(--f); font-variant-numeric: tabular-nums;
  font-size: 0.9375rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  padding: 6px 13px;
  border: 1px solid var(--line-2);
  border-radius: 999px;
  background: var(--paper);
  color: var(--ink-2);
}
.timer-chip.warn   { border-color: #fcd34d; background: #fffbeb; color: var(--warn); }
.timer-chip.danger { border-color: #fda4af; background: #fff1f2; color: var(--bad); }

.q-progress { font-size: 0.9375rem; font-weight: 600; color: var(--muted); margin-bottom: 12px; }

.assess-q { font-size: clamp(1.05rem, 1.8vw, 1.25rem); font-weight: 700; letter-spacing: -0.026em; line-height: 1.35; margin-bottom: 8px; }
.assess-pass { font-size: 1.0625rem; color: var(--muted); margin-bottom: 20px; }
.passage {
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  padding: 17px 19px;
  margin-bottom: 20px;
  color: var(--ink-2);
  font-size: 1.0625rem;
  line-height: 1.72;
}

/* options — built by the step script as .opt divs, chosen via .selected */
.opts { display: grid; gap: 9px; }
.opts .opt {
  position: relative;
  padding: 14px 18px 14px 46px;
  border: 1px solid var(--line-2);
  border-radius: var(--r-sm);
  background: var(--paper);
  cursor: pointer;
  font-size: 1.0625rem;
  line-height: 1.5;
  box-shadow: var(--sh-sm);
  transition: border-color .18s, background .18s, box-shadow .18s;
}
.opts .opt::before {
  content: '';
  position: absolute;
  left: 17px; top: 50%;
  margin-top: -8px;
  width: 16px; height: 16px;
  border: 1.5px solid var(--line-2);
  border-radius: 50%;
  transition: border-color .18s, background .18s, box-shadow .18s;
}
.opts .opt:hover { border-color: var(--muted-2); background: var(--paper-2); }
.opts .opt.selected {
  border-color: var(--ink);
  background: var(--paper-2);
  box-shadow: 0 0 0 3px rgba(2, 6, 23, .08);
}
.opts .opt.selected::before {
  border-color: var(--accent);
  background: var(--accent);
  box-shadow: inset 0 0 0 3px var(--paper);
}

.q-loader {
  display: flex;
  align-items: center;
  gap: 11px;
  margin-top: 22px;
  padding-top: 20px;
  border-top: 1px solid var(--line);
  color: var(--muted);
  font-size: 1.0625rem;
}

/* metric readout — the one place mono earns its keep */
.metrics {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  overflow: hidden;
  margin-top: 18px;
}
.metric { background: var(--paper-2); padding: 15px 13px; text-align: center; }
.metric .mv {
  font-family: var(--f); font-variant-numeric: tabular-nums;
  font-size: clamp(1.2rem, 2.6vw, 1.55rem);
  font-weight: 600;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}
.metric .ml {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--muted);
  margin-top: 6px;
}
.metric .ml svg { width: 13px; height: 13px; flex: none; }
.metric.pass .mv { color: var(--ok); }
.metric.fail .mv { color: var(--bad); }

.test-status {
  display: flex; align-items: center; gap: 12px;
  padding: 15px 17px;
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  background: var(--paper-2);
  color: var(--ink-2);
  font-size: 1.0625rem;
}

/* typing test */
.type-target {
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  padding: 17px 19px;
  font-size: 1.1875rem;
  line-height: 1.85;
  color: var(--muted-2);
  margin-bottom: 14px;
}
.type-target.scroll { height: 112px; overflow: hidden; position: relative; }
.type-scroll { transition: transform .18s var(--ease); }
/* Character states, one span per character, set by the typing test in
   /test. These replace `.type-target b/i/u`, which styled an older version
   that wrapped characters in tags; the script now writes class names, so
   those three rules matched nothing and the whole passage rendered in one
   flat grey — correct, wrong and not-yet-typed all identical. The test was
   asking people to type blind.

   Untyped text is the `.type-target` colour already, so `.todo` only has to
   undo the other two states when a character is retyped. */
.type-target .todo { color: var(--muted-2); background: none; }

/* Typed correctly: full-contrast ink. The passage darkens left to right, so
   progress is legible at a glance without a progress bar. */
.type-target .ok { color: var(--ink); }

/* Typed wrong: the EXPECTED character, in red on a red wash — you see what
   you should have hit, not what you did. The wash is what makes a wrong
   space visible, since the glyph itself has nothing to colour. */
.type-target .bad { color: var(--bad); background: #ffe4e6; border-radius: 2px; }

/* The caret sits on the next character to type. box-shadow, not border-left:
   a border on an inline span adds width and shoves the rest of the line
   along, which makes the text jitter on every keystroke. A shadow paints
   outside the layout box and costs nothing. */
.type-target .cur { box-shadow: -2px 0 0 0 var(--accent); }
@keyframes caret-blink { 0%, 100% { box-shadow: -2px 0 0 0 var(--accent); } 50% { box-shadow: -2px 0 0 0 transparent; } }
.type-target .cur { animation: caret-blink 1.06s step-end infinite; }
@media (prefers-reduced-motion: reduce) { .type-target .cur { animation: none; } }

/* The input lies over the passage and is invisible — see the comment on the
   markup in /test. Its own glyphs and caret are transparent, so the only text
   and the only caret you see are the styled ones underneath. inset:0 means a
   click anywhere on the box puts the cursor back, which is the whole
   affordance: the box you read is the box you type in. */
.type-target textarea {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 17px 19px;
  border: 0;
  background: none;
  resize: none;
  font: inherit;
  line-height: inherit;
  color: transparent;
  caret-color: transparent;
  outline: none;
}
/* Focus belongs to the box, not the invisible field inside it. */
.type-target:focus-within {
  border-color: var(--line-2);
  box-shadow: 0 0 0 3px rgba(11, 4, 33, .10);
}
.type-target textarea:disabled { cursor: default; }

/* ---------- result screens ---------- */
.screen .success, .screen.fail { text-align: center; padding: 12px 0 4px; }
.tickbig {
  width: 56px; height: 56px;
  margin: 0 auto 20px;
  border-radius: 50%;
  display: grid; place-items: center;
  background: var(--brand-face);
  color: #fff;
  font-size: 1.5rem;
  font-weight: 800;
  box-shadow: none;
}
.scr-ico {
  width: 56px; height: 56px;
  margin: 0 auto 18px;
  border-radius: 50%;
  border: 1px solid var(--line-2);
  background: var(--paper-2);
  display: grid; place-items: center;
  color: var(--muted);
}
.scr-ico svg { width: 24px; height: 24px; }
.scr-ico.muted-ico { border-color: #fecdd3; background: #fff1f2; color: var(--bad); }
.big-emoji { font-size: 2.4rem; line-height: 1; margin-bottom: 16px; }

.screen h3 { font-size: clamp(1.5625rem, 3vw, 2.125rem); letter-spacing: -0.032em; margin-bottom: 10px; }
.screen p { color: var(--muted); max-width: 52ch; margin-inline: auto; font-size: 1.0625rem; }
.note {
  margin-top: 18px;
  padding: 15px 17px;
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  background: var(--paper-2);
  color: var(--ink-2);
  font-size: 1.0625rem;
  line-height: 1.6;
  text-align: left;
}

.invite-copy { display: flex; flex-direction: column; align-items: center; gap: 9px; }
.invite-label { font-size: 0.9375rem; color: var(--muted); font-weight: 500; }
.copy-chip {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 9px 15px;
  border: 1px solid var(--line-2);
  border-radius: 999px;
  background: var(--paper);
  color: var(--ink-2);
  font-family: var(--f); font-variant-numeric: tabular-nums;
  font-size: 0.9375rem;
  cursor: pointer;
  transition: border-color .18s, color .18s;
}
.copy-chip:hover { border-color: var(--muted-2); }
.copy-chip.copied { border-color: #a7f3d0; background: #ecfdf5; color: var(--ok); }
.copy-ico svg { width: 13px; height: 13px; }

.spinner {
  width: 17px; height: 17px;
  border: 2px solid var(--line);
  border-top-color: var(--accent);
  border-radius: 50%;
  display: inline-block;
  animation: spin .8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* ---------- legal ---------- */
/* Legal pages carry the same display scale as every other page: the
   headline is the page's headline, not a document title. */
.legal { max-width: 72ch; }
.legal > h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.legal h2 {
  font-size: clamp(1.5rem, 2.4vw, 1.875rem);
  letter-spacing: -0.03em;
  margin: 52px 0 14px;
  padding-top: 28px;
  border-top: 1px solid var(--line);
}
.legal h3 { font-size: 1.1875rem; margin: 26px 0 8px; }
.legal p, .legal li { color: var(--ink-2); font-size: 1.125rem; line-height: 1.7; }
.legal ul, .legal ol { padding-left: 22px; margin: 0 0 1em; }
.legal li { margin-bottom: .55em; }
.legal a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
.legal h2 { scroll-margin-top: 104px; }

/* contents list in the sticky column: numbered the way the sections are */
.toc { list-style: none; margin: 18px 0 0; padding: 0; display: flex; flex-direction: column; gap: 2px; counter-reset: toc; }
.toc li { counter-increment: toc; }
.toc a {
  display: flex; gap: 12px; align-items: baseline;
  padding: 7px 0; font-size: 1.0625rem; font-weight: 600; color: var(--muted);
  transition: color .16s;
}
.toc a::before { content: counter(toc, decimal-leading-zero); font-variant-numeric: tabular-nums; font-size: 0.875rem; font-weight: 700; color: var(--muted-2); }
.toc a:hover { color: var(--ink); }

/* ============================================================================
   ABOUT — components only the answers page needs
   ========================================================================== */

/* A 2px full-bleed ink rule under every category was the loudest thing on the
   page and competed with the cards below it. The marker carries the weight
   now — brand mint, at full strength, on the one element that is pure
   signposting. */
.qa-group {
  margin: clamp(34px, 4.2vw, 54px) 0 14px;
  display: flex; align-items: center; gap: 10px;
}
.qa-group:first-child { margin-top: 0; }
.qa-group::before {
  content: ''; flex: none;
  width: 6px; height: 18px; border-radius: 3px;
  background: var(--brand-mark);
}
.qa-group h3 { font-size: 1.1875rem; letter-spacing: -0.026em; }

.chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 15px; }
.chips span {
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--ink-2);
  padding: 6px 12px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--paper-2);
}

.split { margin-top: 20px; display: grid; gap: 14px; }
.split-row .split-lbl {
  display: flex; justify-content: space-between; gap: 16px;
  font-size: 0.9375rem; color: var(--muted); margin-bottom: 7px; font-weight: 500;
}
.split-row .split-lbl b { color: var(--ink); font-weight: 800; }
.split-bar { height: 8px; border-radius: 999px; background: var(--paper-3); overflow: hidden; }
.split-bar i { display: block; height: 100%; border-radius: 999px; background: var(--brand-face); }
.split-row.alt .split-bar i { background: var(--line-2); }

/* ---------- bank cards -----------------------------------------------------
   The payment methods as a hand of cards, one per country. Each face is one
   solid colour at full strength (no blended fills, per the rule at the top),
   and the number is masked the way a real statement masks it. Illustrative,
   which the note under them says. */
.bcards {
  --w: clamp(180px, 42%, 236px);
  --pivot: 460%;      /* how far below the cards the fan's hinge sits */
  --spread: 4deg;     /* angle between neighbours */
  --step: clamp(30px, 9%, 52px);  /* sideways offset between neighbours */
  position: relative; height: clamp(190px, 46vw, 222px); margin-top: 14px;
  user-select: none; -webkit-user-select: none;
  display: block;
}
.bcard {
  --face: var(--ink); --on: #fff; --on-2: rgba(255, 255, 255, .62); --chip: rgba(255, 255, 255, .18);
  --i: 0;
  position: absolute; left: 50%; top: 18px;
  width: var(--w); aspect-ratio: 1.62;
  display: flex; flex-direction: column;
  padding: 16px 18px;
  border-radius: 14px; background: var(--face); color: var(--on);
  border: 1px solid transparent;
  overflow: hidden;
  box-shadow: var(--sh-lg);
  transform-origin: 50% var(--pivot);
  transform: translateX(calc(-50% + var(--i) * var(--step))) rotate(calc(var(--i) * var(--spread)));
  transition: transform .32s var(--ease), box-shadow .32s var(--ease);
  z-index: 1;
}
.bcard:nth-child(1) { --i: -2; }
.bcard:nth-child(2) { --i: -1; }
.bcard:nth-child(3) { --i: 0; }
.bcard:nth-child(4) { --i: 1; }
.bcard:nth-child(5) { --i: 2; }
/* the hovered card comes to the front and lifts along its own axis */
.bcard:hover { z-index: 2; transform: translateX(calc(-50% + var(--i) * var(--step))) rotate(calc(var(--i) * var(--spread))) translateY(-16px); }
.bcard[data-face="paper"]   { --face: var(--paper); --on: var(--ink); --on-2: var(--muted); --chip: var(--paper-3); border-color: var(--line-2); }
.bcard[data-face="indigo"]  { --face: #5340fb; }
.bcard[data-face="emerald"] { --face: #047857; }
.bcard[data-face="mint"]    { --face: #22ffcd; --on: var(--ink); --on-2: rgba(11, 4, 33, .62); --chip: rgba(11, 4, 33, .14); }
@media (prefers-reduced-motion: reduce) { .bcard { transition: none; } }

.bcard-top { display: flex; align-items: center; gap: 8px; font-size: 0.9375rem; font-weight: 700; }
.bcard-flag { font-size: 1.125rem; line-height: 1; }
.bcard-co { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bcard-tag { font-size: 0.6875rem; font-weight: 800; letter-spacing: .04em; padding: 3px 7px; border-radius: 999px; background: var(--chip); color: var(--on); }
.bcard-chip {
  display: block; width: 30px; height: 22px; margin-top: auto; margin-bottom: 8px;
  border-radius: 5px; background: var(--chip);
  background-image: linear-gradient(var(--face), var(--face)), linear-gradient(var(--face), var(--face));
  background-size: 100% 1px, 1px 100%; background-position: 0 50%, 50% 0; background-repeat: no-repeat;
}
.bcard-no { font-size: clamp(0.875rem, 1.3vw, 1rem); font-weight: 700; letter-spacing: .02em; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* the crypto line under the fan: one row that reads like a block-explorer
   entry, the one place on the page a wallet address belongs */
.chain {
  display: flex; align-items: center; gap: 14px;
  margin-top: 14px; padding: 12px 14px 12px 12px;
  user-select: none; -webkit-user-select: none;
  border-radius: var(--r-sm);
  background: var(--dark-2); color: var(--on-dark);
  border: 1px solid var(--dark-3);
}
.chain-ico {
  flex: none; width: 34px; height: 34px; border-radius: 9px;
  display: grid; place-items: center;
  background: var(--brand-mark); color: var(--ink);
  font-size: 1.125rem; font-weight: 800; line-height: 1;
}
.chain-body { flex: 1; min-width: 0; display: grid; gap: 2px; }
.chain-k { font-size: 0.9375rem; font-weight: 700; color: #fff; }
.chain-v { font-size: 0.875rem; color: var(--on-dark-2); font-variant-numeric: tabular-nums; letter-spacing: .02em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.chain-state { flex: none; display: inline-flex; align-items: center; gap: 7px; font-size: 0.8125rem; font-weight: 700; color: #fff; }
.chain-state i { width: 7px; height: 7px; border-radius: 50%; background: #10b981; }
@media (max-width: 460px) { .chain-state { display: none; } }

.bcard-foot { display: flex; justify-content: space-between; margin-top: 8px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: .06em; color: var(--on-2); }
@media (max-width: 460px) { .bcards { --w: 64%; --spread: 3.5deg; --step: 22px; height: 200px; } }

.payout-note { margin-top: 12px; font-size: 0.9375rem; color: var(--muted); }

/* Rungs — the roles above chat agent, inside an answer.
   Same bordered-row grammar as .payout above it, so the About page has one
   idea of what a list of facts looks like. What it adds is the glyph: three
   bars that fill one, two, three as you go down, which is the whole shape of
   the answer before a word of it is read, at the size of a favicon. Filled
   is ink and empty is --line-2, no tint and no gradient. */
.rungs {
  margin-top: 18px;
  display: grid; gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  overflow: hidden;
}
.rung { display: flex; gap: 14px; padding: 13px 16px; background: var(--paper); }
.rung-step { flex: none; display: flex; align-items: flex-end; gap: 3px; height: 17px; margin-top: 4px; }
.rung-step i { width: 4px; border-radius: 1px; background: var(--line-2); }
.rung-step i:nth-child(1) { height: 7px; }
.rung-step i:nth-child(2) { height: 12px; }
.rung-step i:nth-child(3) { height: 17px; }
.rung[data-lvl="1"] .rung-step i:nth-child(-n+1),
.rung[data-lvl="2"] .rung-step i:nth-child(-n+2),
.rung[data-lvl="3"] .rung-step i:nth-child(-n+3) { background: var(--ink); }
.rung-body { min-width: 0; }
.rung-body b { display: block; font-size: 1.0625rem; color: var(--ink); }
.rung-body span { display: block; margin-top: 3px; font-size: 0.9375rem; line-height: 1.55; color: var(--muted); }

/* ---------- the fact sheet ----------------------------------------------
   The agency as a list of facts, in the bordered-row grammar .payout and
   .rungs already use, so the page keeps one idea of what a list looks like.
   Key on the left, the fact in ink, and one plain sentence under it. */
.facts {
  display: grid; gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r);
  overflow: hidden;
  box-shadow: var(--sh);
}
.fact {
  display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 16px;
  align-items: baseline;
  padding: clamp(15px, 1.8vw, 19px) clamp(16px, 2vw, 22px);
  background: var(--paper);
}
.fact .k { font-size: 0.9375rem; font-weight: 600; color: var(--muted); }
.fact .v { font-size: 1.125rem; font-weight: 800; letter-spacing: -0.024em; color: var(--ink); }
.fact .d { display: block; margin-top: 3px; font-size: 1rem; font-weight: 400; letter-spacing: 0; line-height: 1.55; color: var(--ink-2); }
.fact .d b { font-variant-numeric: tabular-nums; }
@media (max-width: 520px) { .fact { grid-template-columns: 1fr; gap: 4px; } }

/* ---------- the shift strip ----------------------------------------------
   Twenty-four hours, left to right, cut at the three shift boundaries. The
   live shift is the white bar, the same move as the ladder's payoff bar.
   The marker is the live green the hero's hiring dot uses. Kept short: one
   heading, the strip, one line under it. */
.day-sec { padding-block: clamp(44px, 6vw, 72px); }
.day-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 6px 24px; }
.day-head p { margin: 0; font-size: 1rem; }
.day { margin-top: clamp(22px, 3vw, 34px); }
.day-track {
  position: relative;
  display: grid; grid-template-columns: 4fr 8fr 8fr 4fr; gap: 3px;
  padding: 3px;
  height: 52px;
  border-radius: 12px;
  background: var(--dark-2);
}
.day-seg {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  border-radius: 9px;
  background: var(--dark-3);
  font-size: 0.9375rem; font-weight: 700; color: var(--on-dark-2);
  white-space: nowrap; overflow: hidden;
  transition: background-color .3s var(--ease), color .3s var(--ease);
}
.day-seg small { font-size: 0.8125rem; font-weight: 500; opacity: .75; font-variant-numeric: tabular-nums; }
.day-seg.on {
  background: #ffffff; color: var(--ink);
  box-shadow: 0 0 50px -22px rgba(255, 255, 255, .55);
}
.day-now {
  position: absolute; top: -6px; bottom: -6px; left: 50%;
  width: 2px; border-radius: 2px;
  background: #10b981;
  transform: translateX(-50%);
  transition: left .6s var(--ease);
}
.day-now b {
  position: absolute; bottom: calc(100% + 6px); left: 50%;
  transform: translateX(-50%);
  padding: 3px 8px; border-radius: 999px;
  background: #10b981; color: var(--ink);
  font-size: 0.75rem; font-weight: 700; line-height: 1;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.day-ticks { position: relative; height: 20px; margin-top: 8px; }
.day-ticks span {
  position: absolute; top: 0; transform: translateX(-50%);
  font-size: 0.8125rem; font-weight: 500; color: var(--on-dark-2);
  font-variant-numeric: tabular-nums;
}
.day-ticks span:first-child { transform: none; }
.day-ticks span:last-child { transform: translateX(-100%); }
.day-note { margin-top: 18px; font-size: 1rem; color: var(--on-dark-2); max-width: 70ch; }
@media (max-width: 720px) { .day-seg small { display: none; } }
@media (max-width: 520px) {
  .day-track { height: 46px; }
  .day-seg { font-size: 0.8125rem; }
  .day-ticks span:nth-child(2), .day-ticks span:nth-child(4) { display: none; }
}

/* the application-process steps: numbered rows in the same bordered grammar */
.steps {
  margin: 18px 0 0; padding: 0; list-style: none; counter-reset: s;
  display: grid; gap: 1px;
  background: var(--line); border: 1px solid var(--line); border-radius: var(--r-sm); overflow: hidden;
}
.steps li { display: flex; gap: 14px; padding: 13px 16px; background: var(--paper); font-size: 1.0625rem; line-height: 1.55; color: var(--muted); }
.steps li::before {
  counter-increment: s; content: counter(s);
  flex: none; width: 24px; height: 24px; border-radius: 50%;
  background: var(--ink); color: var(--paper);
  font-size: 0.8125rem; font-weight: 800; display: grid; place-items: center; margin-top: 2px;
  font-variant-numeric: tabular-nums;
}
.steps strong { color: var(--ink); }
.steps + .payout-note { margin-top: 14px; }

.wins { margin: 15px 0 0; padding: 0; list-style: none; display: grid; gap: 9px; }
.wins li { display: flex; gap: 11px; font-size: 1.0625rem; color: var(--muted); line-height: 1.55; }
.wins li::before {
  content: '';
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent); flex: none; margin-top: .5em;
}
.footnote { margin-top: 22px; font-size: 0.9375rem; color: var(--muted-2); }

/* ---------- video ----------------------------------------------------------
   A framed player, not a neon light show: one ring, one soft shadow, and a
   tinted halo underneath so it lifts off the page. */
.videoblock { max-width: 900px; margin-inline: auto; }
.videoframe {
  position: relative;
  border-radius: var(--r);
  padding: 8px;
  background: var(--paper);
  border: 1px solid var(--line);
  box-shadow:
    0 1px 2px rgba(2, 6, 23, .05),
    0 24px 60px -24px rgba(2, 6, 23, .28),
    0 0 0 1px rgba(79, 70, 229, .04);
}
/* the halo — sits behind the frame, never over it */
.videoframe::before {
  content: '';
  position: absolute;
  inset: 12% 6% -6%;
  background: rgba(2, 6, 23, .5);
  filter: blur(48px);
  opacity: .14;
  border-radius: 50%;
  z-index: -1;
}
.videoframe .screen-in {
  position: relative;
  padding-bottom: 56.25%;
  height: 0;
  border-radius: 9px;
  overflow: hidden;
  background: var(--dark);
}
.videoframe iframe {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  border: 0;
}
.sec-dark .videoframe {
  background: var(--dark-2);
  border-color: #334155;
  box-shadow: 0 24px 70px -24px rgba(0, 0, 0, .7);
}
.videocap {
  margin-top: 18px;
  text-align: center;
  font-size: 1.0625rem;
  color: var(--muted);
}

/* ============================================================================
   SIGNATURE COMPONENTS
   ----------------------------------------------------------------------------
   Card grids are what every page has. These are the blocks that only a chat
   agency could run: the craft shown as an actual conversation, the pay shown
   as a number the reader moves themselves, the typing bar shown by making them
   type. Flat and monochrome like everything else.
   ========================================================================== */

/* ---------- 1. the conversation ------------------------------------------ */
.chatdemo {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--sh);
  overflow: hidden;
}
.chatdemo-head {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--line);
  background: var(--paper-2);
}
.chatdemo-head .av {
  width: 30px; height: 30px;
  border-radius: 50%;
  background: var(--line-2);
  display: grid; place-items: center;
  font-size: 0.8125rem; font-weight: 800; color: var(--paper);
  flex: none;
}
.chatdemo-head .nm { font-size: 1.0625rem; font-weight: 700; }
.chatdemo-head .st { font-size: 0.9375rem; color: var(--muted); display: flex; align-items: center; gap: 6px; }
.chatdemo-head .st i { width: 6px; height: 6px; border-radius: 50%; background: #10b981; display: block; }
.chatdemo-head .spacer { flex: 1; }

.chatdemo-body { padding: 20px clamp(16px, 2.4vw, 24px); display: grid; gap: 14px; }

.msg { display: grid; gap: 6px; max-width: 82%; }
.msg .b {
  padding: 11px 15px;
  border-radius: 16px;
  font-size: 1.0625rem;
  line-height: 1.5;
}
.msg.fan { justify-self: start; }
.msg.fan .b { background: var(--paper-3); border-bottom-left-radius: 5px; }
.msg.agent { justify-self: end; text-align: right; }
.msg.agent .b {
  background: var(--ink);
  color: #fff;
  border-bottom-right-radius: 5px;
  text-align: left;
}
/* the annotation is the whole point — it names the move being made */
.msg .note-tag {
  font-size: 0.8125rem;
  font-weight: 700;
  color: var(--muted);
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.msg.agent .note-tag { justify-self: end; }
.msg .note-tag::before {
  content: '';
  width: 12px; height: 1.5px;
  background: var(--line-2);
  display: block;
}

.typing { display: inline-flex; gap: 4px; align-items: center; padding: 13px 16px; }
.typing i {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--muted-2);
  display: block;
  animation: blink 1.3s infinite;
}
.typing i:nth-child(2) { animation-delay: .18s; }
.typing i:nth-child(3) { animation-delay: .36s; }
@keyframes blink { 0%, 60%, 100% { opacity: .3; } 30% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .typing i { animation: none; } }

.chatdemo-foot {
  padding: 13px 18px;
  border-top: 1px solid var(--line);
  background: var(--paper-2);
  font-size: 0.9375rem;
  color: var(--muted);
}

/* ---------- 2. the earnings slider --------------------------------------- */
.calc {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, .9fr);
  gap: clamp(24px, 4vw, 56px);
  align-items: center;
  padding: clamp(24px, 3.4vw, 38px);
  border: 1px solid var(--dark-3);
  border-radius: var(--r);
  background: var(--dark-2);
}
@media (max-width: 820px) { .calc { grid-template-columns: 1fr; gap: 28px; } }

.calc-label { font-size: 1.0625rem; color: var(--on-dark-2); margin-bottom: 6px; }
.calc-vol {
  font-size: clamp(1.6rem, 3vw, 2.2rem);
  font-weight: 800;
  letter-spacing: -0.04em;
  color: #fff;
  font-variant-numeric: tabular-nums;
  margin-bottom: 20px;
}

input[type="range"].slider {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  height: 6px;
  border-radius: 999px;
  background: #334155;
  outline: none;
  cursor: pointer;
  padding: 0;
  border: 0;
  box-shadow: none;
}
input[type="range"].slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 26px; height: 26px;
  border-radius: 50%;
  background: #fff;
  border: 1px solid #cbd5e1;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .5);
  cursor: grab;
}
input[type="range"].slider::-webkit-slider-thumb:active { cursor: grabbing; }
input[type="range"].slider::-moz-range-thumb {
  width: 26px; height: 26px;
  border-radius: 50%;
  background: #fff;
  border: 1px solid #cbd5e1;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .5);
  cursor: grab;
}
.calc-scale {
  display: flex;
  justify-content: space-between;
  margin-top: 10px;
  font-size: 0.9375rem;
  color: var(--on-dark-2);
}

.calc-out {
  border-left: 1px solid var(--dark-3);
  padding-left: clamp(20px, 3vw, 36px);
}
@media (max-width: 820px) {
  .calc-out { border-left: 0; border-top: 1px solid var(--dark-3); padding-left: 0; padding-top: 24px; }
}
.calc-out .k { font-size: 1.0625rem; color: var(--on-dark-2); margin-bottom: 8px; }
.calc-out .v {
  font-size: clamp(2.1rem, 4.4vw, 3rem);
  font-weight: 800;
  letter-spacing: -0.045em;
  line-height: 1;
  color: #fff;
  font-variant-numeric: tabular-nums;
}
.calc-out .sub { margin-top: 12px; font-size: 0.9375rem; color: var(--on-dark-2); line-height: 1.6; }

/* ---------- 3. the stepper ----------------------------------------------- */
.stepper { position: relative; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(16px, 2.4vw, 32px); }
/* the rail runs behind the markers and stops at the first and last */
.stepper::before {
  content: '';
  position: absolute;
  top: 17px;
  left: 12.5%;
  right: 12.5%;
  height: 1px;
  background: var(--line-2);
}
.stepper .st { position: relative; }
.stepper .mk {
  width: 34px; height: 34px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  display: grid; place-items: center;
  font-size: 0.9375rem; font-weight: 800;
  margin-bottom: 18px;
  position: relative;
  z-index: 1;
  box-shadow: 0 0 0 6px var(--paper);
}
.stepper .st h3 { font-size: 1.1875rem; letter-spacing: -0.026em; margin-bottom: 7px; }
.stepper .st p { font-size: 1.0625rem; color: var(--muted); margin: 0; }
.stepper .st .when {
  display: inline-block;
  margin-top: 10px;
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--ink);
  border-bottom: 1.5px solid var(--line-2);
  padding-bottom: 1px;
}
@media (max-width: 860px) {
  .stepper { grid-template-columns: 1fr; gap: 0; }
  .stepper::before { top: 34px; bottom: 34px; left: 17px; right: auto; width: 1px; height: auto; }
  .stepper .st { padding-bottom: 28px; }
  .stepper .mk { margin-bottom: 12px; }
}

/* ---------- 4. the typing bar -------------------------------------------- */
.typetest {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--sh);
  padding: clamp(20px, 3vw, 30px);
}
.tt-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
.tt-head h3 { font-size: 1.1875rem; letter-spacing: -0.026em; }
.tt-timer {
  font-family: var(--f); font-variant-numeric: tabular-nums;
  font-size: 0.9375rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--muted);
}
.tt-target {
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  padding: 16px 18px;
  font-size: 1.1875rem;
  line-height: 1.7;
  color: var(--muted-2);
  user-select: none;
}
.tt-target b { color: var(--ink); font-weight: 400; }
.tt-target i { color: var(--bad); font-style: normal; background: #ffe4e6; border-radius: 2px; }
.tt-target u { text-decoration: none; border-bottom: 2px solid var(--ink); }
.tt-input { margin-top: 12px; }
.tt-stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  overflow: hidden;
  margin-top: 16px;
}
.tt-stats .c { background: var(--paper-2); padding: 13px; text-align: center; }
.tt-stats .v {
  font-family: var(--f); font-variant-numeric: tabular-nums;
  font-size: 1.3rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}
.tt-stats .l { font-size: 0.9375rem; color: var(--muted); margin-top: 5px; }
.tt-stats .c.pass .v { color: var(--ok); }
.tt-stats .c.fail .v { color: var(--bad); }
.tt-verdict { margin-top: 16px; font-size: 1.0625rem; display: none; }
.tt-verdict.show { display: block; }

/* ---------- 5. the comparison -------------------------------------------- */
.vs {
  border: 1px solid var(--line);
  border-radius: var(--r);
  overflow: hidden;
  background: var(--paper);
  box-shadow: var(--sh-sm);
}
.vs-row {
  display: grid;
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, 1fr);
  border-bottom: 1px solid var(--line);
}
.vs-row:last-child { border-bottom: 0; }
.vs-row > * { padding: 16px clamp(14px, 2vw, 22px); }
.vs-row .them { border-left: 1px solid var(--line); color: var(--muted); }
.vs-row .us { border-left: 1px solid var(--line); background: var(--paper-2); font-weight: 600; }
.vs-head { background: var(--ink); border-bottom: 0; }
.vs-head > * { color: #fff; font-weight: 700; font-size: 1.0625rem; padding-block: 15px; }
.vs-head .them, .vs-head .us { border-left-color: #334155; background: transparent; color: #fff; }
.vs-row .lbl-cell { font-weight: 600; font-size: 1.0625rem; }
.vs-row .them, .vs-row .us { font-size: 1.0625rem; display: flex; align-items: flex-start; gap: 9px; }
.vs-ico { flex: none; width: 17px; height: 17px; margin-top: 2px; }
.vs-ico.no { stroke: var(--muted-2); }
.vs-ico.yes { stroke: var(--ok); }
@media (max-width: 700px) {
  .vs-row { grid-template-columns: 1fr; }
  .vs-row > * { padding-block: 11px; }
  .vs-row .them, .vs-row .us { border-left: 0; }
  .vs-row .lbl-cell { padding-bottom: 4px; background: var(--paper-2); }
  .vs-head { display: none; }
  .vs-row .them::before { content: 'Most agencies — '; font-weight: 700; color: var(--ink); }
  .vs-row .us::before { content: 'ChatScale — '; font-weight: 700; color: var(--ink); }
}
