/* ── typefaces ──────────────────────────────────────────────────────────
   Self-hosted latin subsets, 62 KB for both — no third-party request on the
   critical path. Instrument Serif carries the voice; Inter stays out of its
   way. swap, so text paints immediately in the fallback and reflows once. */
@font-face {
  font-family: 'Instrument Serif';
  font-style: normal; font-weight: 400; font-display: swap;
  src: url('assets/fonts/instrument-serif-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+2122, U+2212;
}
@font-face {
  font-family: 'Press Start 2P';
  font-style: normal; font-weight: 400; font-display: swap;
  src: url('assets/fonts/press-start-2p-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+2122, U+2212;
}
@font-face {
  font-family: 'Inter';
  font-style: normal; font-weight: 400 700; font-display: swap;
  src: url('assets/fonts/inter-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+2122, U+2212;
}

/* ── theme tokens ───────────────────────────────────────────────────── */
:root {
  --bg: #ffffff;
  --surface: #ffffff;
  --surface-2: #fbfbfd;
  --ink: #1a1310;
  --muted: #6f6259;
  --faint: #7b6e64;   /* 4.93:1 on white, 4.77:1 on surface-2 */
  --line: #e9e9ef;
  --line-soft: #f1f1f5;
  --line-strong: #d5d5e0;
  --brand: #b4400f;
  --brand-2: #e2703a;
  --brand-soft: rgba(180,64,15,.09);
  --brand-line: #edc3ab;
  --on-brand: #ffffff;
  --grid: rgba(10,10,16,.08);
  --grid-hi: rgba(10,10,16,.34);
  /* dot lattice — mobile/tablet only (see the hero background override) */
  --dot: rgba(10,10,16,.26);
  --hover: rgba(10,10,16,.045);
  --sh: 20,20,40;
  color-scheme: light;
}
:root[data-theme="dark"] {
  --bg: #0d0b0a;
  --surface: #171412;
  --surface-2: #1c1815;
  --ink: #f6f3f1;
  --muted: #b0a49d;
  --faint: #8d8079;   /* 5.14:1 on body, 4.62:1 on surface-2 */
  --line: #2e2825;
  --line-soft: #241f1c;
  --line-strong: #453b36;
  --brand: #e2703a;
  --brand-2: #f09a6b;
  --brand-soft: rgba(226,112,58,.15);
  --brand-line: #7d4327;
  --on-brand: #14100c;
  --grid: rgba(255,255,255,.075);
  --grid-hi: rgba(255,255,255,.30);
  --dot: rgba(255,255,255,.26);
  --hover: rgba(255,255,255,.06);
  --sh: 0,0,0;
  color-scheme: dark;
}

:root {
  --font: Inter, ui-sans-serif, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  /* display face: headline, section headings, the rotating term */
  --font-display: 'Instrument Serif', ui-serif, Georgia, "Times New Roman", serif;
  --ease: cubic-bezier(.22, 1, .36, 1);

  /* menu icons — masked so they inherit the brand colour (no icon library) */
  --i-board: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linejoin="round"><rect x="2" y="3" width="3.4" height="10" rx="1"/><rect x="6.3" y="3" width="3.4" height="7" rx="1"/><rect x="10.6" y="3" width="3.4" height="10" rx="1"/></svg>');
  --i-star: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linejoin="round"><path d="M8 2l1.8 3.8 4.2.6-3 2.9.7 4.1L8 11.5 4.3 13.4l.7-4.1-3-2.9 4.2-.6z"/></svg>');
  --i-book: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linejoin="round"><path d="M4 2.5h6a1.5 1.5 0 0 1 1.5 1.5v9.5l-4.5-2-4.5 2V4A1.5 1.5 0 0 1 4 2.5z"/></svg>');
  --i-users: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="2.4"/><path d="M2 13.4a4 4 0 0 1 8 0"/><path d="M11 4.2a2.4 2.4 0 0 1 0 4.6"/><path d="M11.6 13.4a4 4 0 0 0-1.5-3.1"/></svg>');
  --i-chart: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 13.5h11"/><rect x="3.6" y="8" width="2.4" height="3.8" rx="0.6"/><rect x="7" y="4.6" width="2.4" height="7.2" rx="0.6"/><rect x="10.4" y="6.8" width="2.4" height="5" rx="0.6"/></svg>');
  --i-shield: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2l5 2v4c0 3.2-2.1 5.4-5 6.4C5.1 13.4 3 11.2 3 8V4z"/><path d="M5.9 8l1.5 1.5 2.8-3"/></svg>');
  --i-bolt: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linejoin="round"><path d="M9 2L4 9h3.5L7 14l5-7H8.5z"/></svg>');
  --i-id: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3.5" width="12" height="9" rx="2"/><circle cx="6" cy="7.4" r="1.5"/><path d="M3.7 11.2a2.7 2.7 0 0 1 4.6 0"/><path d="M10.2 7h2.4M10.2 9.4h2.4"/></svg>');
  --i-clock: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="5.6"/><path d="M8 4.8V8l2.2 1.6"/></svg>');
  --i-cap: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3l6 3-6 3-6-3z"/><path d="M4.5 8v3c0 1 1.6 2 3.5 2s3.5-1 3.5-2V8"/></svg>');
  --i-lab: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 2v4.2L3 12a1.4 1.4 0 0 0 1.2 2h7.6A1.4 1.4 0 0 0 13 12L9.5 6.2V2"/><path d="M5.6 2h4.8"/></svg>');
  --i-building: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="2.5" width="10" height="11" rx="1.5"/><path d="M6 5.6h1.4M6 8h1.4M6 10.4h1.4M8.8 5.6h1.4M8.8 8h1.4M8.8 10.4h1.4"/></svg>');
  --i-code: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5.6 5L2.5 8l3.1 3"/><path d="M10.4 5L13.5 8l-3.1 3"/><path d="M9 3.2l-2 9.6"/></svg>');
  --i-doc: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M9 1.8H4.6A1.6 1.6 0 0 0 3 3.4v9.2a1.6 1.6 0 0 0 1.6 1.6h6.8a1.6 1.6 0 0 0 1.6-1.6V5.6z"/><path d="M9 1.8v3.8h4"/><path d="M5.6 8.6h4.8M5.6 11h3.2"/></svg>');
  --i-search: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round"><circle cx="7" cy="7" r="4.4"/><path d="M10.3 10.3L13.6 13.6"/></svg>');
  --i-pen: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M11.2 2.4l2.4 2.4-8 8-3.1.7.7-3.1z"/><path d="M9.6 4l2.4 2.4"/></svg>');
  --i-award: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="6.2" r="3.8"/><path d="M5.8 9.4L5 14l3-1.6L11 14l-.8-4.6"/></svg>');
  --i-tools: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M9.8 5.2a2.6 2.6 0 0 1 3.4-3.4l-2 2 1.4 1.4 2-2a2.6 2.6 0 0 1-3.4 3.4L4.6 13.2a1.5 1.5 0 0 1-2.1-2.1z"/></svg>');
  --i-sun: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round"><circle cx="8" cy="8" r="3"/><path d="M8 1.6v1.6M8 12.8v1.6M1.6 8h1.6M12.8 8h1.6M3.5 3.5l1.1 1.1M11.4 11.4l1.1 1.1M12.5 3.5l-1.1 1.1M4.6 11.4l-1.1 1.1"/></svg>');
  --i-moon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M13.4 9.5A5.6 5.6 0 0 1 6.5 2.6a5.7 5.7 0 1 0 6.9 6.9z"/></svg>');
  --i-bell: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6.6a4 4 0 0 1 8 0c0 3.2 1 4 1 4H3s1-.8 1-4z"/><path d="M6.6 13a1.6 1.6 0 0 0 2.8 0"/></svg>');
  --i-out: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M6.2 2.5H3.8A1.3 1.3 0 0 0 2.5 3.8v8.4a1.3 1.3 0 0 0 1.3 1.3h2.4"/><path d="M10.5 11.2L13.5 8l-3-3.2"/><path d="M13.5 8H6.2"/></svg>');
  --i-rocket: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M6.4 9.6C4.2 8.8 2.6 10 2 14c4-.6 5.2-2.2 4.4-4.4z"/><path d="M7.4 8.6l-1-1c.6-3.4 2.8-5.6 7.2-5.8-.2 4.4-2.4 6.6-5.8 7.2z"/><circle cx="10.4" cy="5.6" r="1"/></svg>');
}

* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0; background: var(--bg); color: var(--ink);
  font-family: var(--font); -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* ── hero shell + interactive lattice ───────────────────────────────── */
/* Two stacked copies of the same grid, perfectly aligned:
   ::before is the faint baseline you always see;
   ::after is a brighter copy revealed only inside a spotlight that follows
   the pointer. Geometry never moves — only visibility changes. */
.hero {
  position: relative; overflow: hidden;
  padding-bottom: clamp(48px, 6vw, 88px);
  --mx: 50%; --my: 26%; --spot: 300px;
  background: var(--bg);
}
.hero::before,
.hero::after {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background-size: 1cm 1cm;
  background-position: center top;
}
/* baseline — subtle, but genuinely visible */
.hero::before {
  background-image:
    linear-gradient(to right,  var(--grid) 1px, transparent 1px),
    linear-gradient(to bottom, var(--grid) 1px, transparent 1px);
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 58%, transparent 84%);
  mask-image: linear-gradient(to bottom, #000 0%, #000 58%, transparent 84%);
}
/* spotlight — the same black grid, just darker where the pointer is */
.hero::after {
  background-image:
    linear-gradient(to right,  var(--grid-hi) 1px, transparent 1px),
    linear-gradient(to bottom, var(--grid-hi) 1px, transparent 1px);
  -webkit-mask-image:
    radial-gradient(circle var(--spot) at var(--mx) var(--my),
      #000 0%, rgba(0,0,0,.72) 38%, rgba(0,0,0,.28) 62%, transparent 78%);
  mask-image:
    radial-gradient(circle var(--spot) at var(--mx) var(--my),
      #000 0%, rgba(0,0,0,.72) 38%, rgba(0,0,0,.28) 62%, transparent 78%);
}

/* ── mobile + tablet: video backdrop instead of the ruled grid ───────────
   The component's background layer: a looping muted video pinned behind the
   content with object-fit: cover. Hidden entirely above 1024px, where the
   ruled lattice and its pointer spotlight are untouched. */
.hero-bg { position: absolute; inset: 0; z-index: 0; display: none; overflow: hidden; }
.hero-bg video {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; object-fit: cover;
  /* the aurora lives on the left of the frame, and a tall hero crops `cover`
     horizontally — centred, the visible slice would be the empty side */
  object-position: left center;
}
/* the scrim is what makes the copy readable on both themes: the video is a
   full-strength image, and neither near-white nor near-black text survives on
   top of one unaided. Each theme veils toward its own page colour, strongest
   behind the headline and clearing by the workspace window. */
.hero-scrim {
  position: absolute; inset: 0; display: block; pointer-events: none;
  background:
    linear-gradient(180deg,
      rgba(255,255,255,0) 0%,
      rgba(255,255,255,.16) 28%,
      rgba(255,255,255,.58) 52%,
      rgba(255,255,255,.92) 72%,
      var(--bg) 88%);
}
:root[data-theme="dark"] .hero-scrim {
  background:
    linear-gradient(180deg,
      rgba(13,11,10,.05) 0%,
      rgba(13,11,10,.30) 28%,
      rgba(13,11,10,.68) 52%,
      rgba(13,11,10,.93) 72%,
      var(--bg) 88%);
}

@media (max-width: 1024px) {
  /* the ruled grid and its pointer spotlight give way to the video */
  .hero::before, .hero::after { display: none; }
  .hero-bg { display: block; }
}

/* text left, live workspace right — the window keeps its full scale and
   bleeds off the right edge rather than shrinking to fit the column */
.hero-inner {
  position: relative; z-index: 1;
  display: grid;
  grid-template-columns: minmax(0, clamp(400px, 26vw, 520px)) minmax(0, 1fr);
  /* the gap has to read as a deliberate column break, not a near-miss —
     it scales with the viewport instead of pinching shut on wide screens */
  align-items: center; column-gap: clamp(48px, 4vw, 110px);
  /* the workspace column stops short of the screen edge, never touches it */
  padding: clamp(32px, 4vw, 68px) var(--dash-edge) 0 var(--edge);
}

/* ── sticky header ──────────────────────────────────────────────────── */
/* ONE shell for the whole site. The header, the hero copy, the marquee, every
   section and the footer all resolve their left edge from these two values, so
   nothing on the page can drift out of alignment with anything else. */
:root {
  --hdr: 72px; --hdr-gap: 14px; --hdr-side: 16px; --shell: 1520px; --gutter: clamp(20px, 4vw, 48px);
  /* breathing room between the workspace window and the screen edge: 1–2cm
     (38–76px) across the whole desktop range */
  --dash-edge: clamp(40px, 3vw, 72px);
}
/* distance from the viewport edge to the shell's content edge */
.hero-inner { --edge: calc(max(0px, (100% - var(--shell)) / 2) + var(--gutter)); }
/* A floating, rounded bar — never a hard-edged box. It inches in and rounds
   further as you scroll rather than switching between two shapes, so the
   header reads as one object that settles. --hdr-gap drives both the inset
   here and the hero's pull-up below; the drawer breakpoint zeroes it, where a
   detached bar would just eat vertical space. */
.site-header {
  position: sticky; top: var(--hdr-gap); z-index: 60;
  width: calc(100% - var(--hdr-side) * 2);
  margin: var(--hdr-gap) auto 0; max-width: 1600px;
  /* opaque, always — a translucent bar lets the lattice read through the menu */
  background: var(--surface);
  border-radius: 20px;
  box-shadow: 0 6px 22px -12px rgba(var(--sh), .18);
  transition: max-width .32s var(--ease), top .32s var(--ease),
              border-color .28s, box-shadow .28s, border-radius .32s var(--ease);
}
/* condensed state — set by JS past the scroll threshold */
.site-header.scrolled {
  max-width: 1120px; border-radius: 24px;
  box-shadow: 0 0 0 1px var(--line), 0 14px 40px -12px rgba(var(--sh), .16);
}
/* The bar is inset by --hdr-side, which would push the brand that far right of
   every other left edge on the page. Its padding gives the inset back. Past
   shell + 2*side the bar stops being edge-limited, its own centring absorbs
   the inset, and the compensation has to stop or it over-corrects. */
.hdr-inner {
  display: flex; align-items: center; gap: 32px;
  max-width: var(--shell); margin: 0 auto;
  height: var(--hdr); padding: 0 calc(var(--gutter) - var(--hdr-side));
  transition: padding .32s var(--ease);
}
/* Once the viewport passes the shell, the page starts centring its content and
   the bar has to centre with it. It can only do that while its own content box
   is still at least a shell wide — so from that point the inset ramps in from
   zero rather than being a flat 16px, and the compensation above stops. Ramp
   and hand-off are both smooth; nothing steps. */
@media (min-width: 1520px) {
  :root { --hdr-side: min(16px, calc((100vw - var(--shell)) / 2)); }
  .hdr-inner { padding-inline: var(--gutter); }
}
.site-header.scrolled .hdr-inner { padding: 0 clamp(12px, 2vw, 20px); }
/* hero slides under the header so the lattice runs behind it — and past the
   float gap as well, so the bar sits ON the hero rather than above a strip
   of page background */
.hero {
  margin-top: calc((var(--hdr) + var(--hdr-gap)) * -1);
  padding-top: calc(var(--hdr) + var(--hdr-gap));
}

/* ── mobile toggle ──────────────────────────────────────────────────── */
.burger {
  display: none; margin-left: auto;
  width: 40px; height: 40px; border-radius: 10px;
  align-items: center; justify-content: center;
  border: 1px solid var(--line); background: var(--surface);
  color: var(--ink); cursor: pointer;
}
.menu-icon { width: 21px; height: 21px; transition: transform .3s ease-in-out; }
.menu-icon .mi-morph {
  stroke-dasharray: 12 63;
  transition: stroke-dasharray .3s ease-in-out, stroke-dashoffset .3s ease-in-out;
}
.burger[aria-expanded="true"] .menu-icon { transform: rotate(-45deg); }
.burger[aria-expanded="true"] .mi-morph { stroke-dasharray: 20 300; stroke-dashoffset: -32.42px; }

/* ── mobile panel ───────────────────────────────────────────────────── */
.mobile-panel {
  position: fixed; inset: var(--hdr) 0 0; z-index: 55;
  display: flex; flex-direction: column;
  background: var(--surface);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
  border-top: 1px solid var(--line);
  animation: mp-in .26s var(--ease) both;
}
.mobile-panel[hidden] { display: none; }
@keyframes mp-in { from { opacity: 0; transform: scale(.985); } }
.mp-scroll { flex: 1; overflow-y: auto; padding: 18px 20px 8px; -webkit-overflow-scrolling: touch; }
.mp-scroll h6 {
  margin: 18px 0 6px; font-size: 11px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase; color: var(--faint);
}
.mp-scroll h6:first-child { margin-top: 0; }
/* ── mobile accordion ───────────────────────────────────────────────── */
.acc { border-bottom: 1px solid var(--line); }
.acc-t {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  width: 100%; padding: 16px 4px; border: 0; background: none;
  font: inherit; font-size: 15.5px; font-weight: 600; color: var(--ink);
  cursor: pointer; text-align: left;
}
.acc-t .chev { width: 14px; height: 14px; transition: transform .26s var(--ease); }
.acc-t[aria-expanded="true"] .chev { transform: rotate(180deg); }
/* grid-template-rows animates to auto-height without measuring in JS */
.acc-c {
  display: grid; grid-template-rows: 0fr;
  transition: grid-template-rows .3s var(--ease);
}
.acc-t[aria-expanded="true"] + .acc-c { grid-template-rows: 1fr; }
/* must be a single wrapper: 0fr sizes only the first row, so direct
   children beyond the first would stay visible when collapsed */
.acc-in { overflow: hidden; min-height: 0; }
.acc-c a {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 4px; text-decoration: none; color: var(--ink);
}
.acc-c a b { display: block; font-size: 14.5px; font-weight: 500; }
.acc-c a em {
  display: block; font-style: normal; font-size: 12px;
  color: var(--muted); margin-top: 2px;
}
.mt {
  width: 38px; height: 38px; border-radius: 10px; flex: none;
  border: 1px solid var(--line); background: var(--surface-2);
}
.mt::after { inset: 10px; }
.mp-plain { padding-top: 8px; }
.mp-plain a {
  display: block; padding: 12px 4px; border-radius: 10px;
  color: var(--ink); text-decoration: none; font-size: 15.5px; font-weight: 600;
}
.mp-scroll a:active { background: var(--hover); }
.mp-foot {
  flex: none; display: grid; gap: 10px;
  padding: 14px 20px calc(18px + env(safe-area-inset-bottom));
  border-top: 1px solid var(--line);
}
.mp-foot .btn { text-align: center; }

/* ── nav ────────────────────────────────────────────────────────────── */
.nav { display: flex; align-items: center; gap: 32px; padding: 22px clamp(20px, 5vw, 64px); }
/* The supplied lockup is a single flat ink throughout, so one alpha PNG masked
   and coloured by CSS covers every surface — orange on dark, white on the
   orange bar — instead of shipping and preloading two bitmaps. The <a> still
   carries real text for screen readers and search engines. */
:root { --logo: #fe3100; }               /* the lockup's own ink */
.brand {
  display: inline-flex; align-items: center; padding-block: 9px;   /* thumb-sized hit area */
  /* an <a> with no colour falls back to the UA's link blue — invisible here
     only because the label is sr-only, but wrong the moment it is not */
  text-decoration: none; color: var(--ink);
  font-size: 19px; font-weight: 600; letter-spacing: -.02em;
}
/* if masking is unavailable, drop the graphic and let the wordmark show as
   text rather than leaving the header with no brand at all */
@supports not ((-webkit-mask-image: url('')) or (mask-image: url(''))) {
  .brand-mark { display: none; }
  .brand .sr-only, .ab-name .sr-only {
    position: static; width: auto; height: auto; margin: 0; clip: auto; overflow: visible;
  }
}
.brand-mark {
  display: block; width: 100px; height: 38px;
  background: var(--logo-ink, var(--logo));
  -webkit-mask: url('assets/logo-white.png') no-repeat center / contain;
  mask: url('assets/logo-white.png') no-repeat center / contain;
}
.nav-links { display: flex; align-items: center; gap: 4px; margin-left: 8px; }
.nav-links > a,
.menu-trigger {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 8px 12px; border-radius: 9px;
  color: var(--muted); text-decoration: none; font: inherit; font-size: 14px;
  background: none; border: 0; cursor: pointer;
  transition: color .2s, background .2s;
}
.nav-links > a:hover,
.menu-trigger:hover,
.menu-trigger[aria-expanded="true"] { color: var(--ink); background: var(--hover); }
.chev { width: 12px; height: 12px; transition: transform .28s var(--ease); }
.menu-trigger[aria-expanded="true"] .chev { transform: rotate(180deg); }

/* ── mega menu ──────────────────────────────────────────────────────── */
.menu { position: relative; }
.menu-panel {
  position: absolute; top: calc(100% + 10px); left: 0; z-index: 40;
  width: max-content; max-width: min(560px, calc(100vw - 40px));
  padding: 18px; border-radius: 16px;
  background: var(--surface); border: 1px solid var(--line);
  box-shadow: 0 24px 60px rgba(var(--sh), .14), 0 2px 8px rgba(var(--sh), .05);
  opacity: 0; transform: translateY(-6px) scale(.985);
  transition: opacity .22s var(--ease), transform .22s var(--ease);
}
.menu-panel.wide { max-width: min(900px, calc(100vw - 40px)); }
.menu-panel.open { opacity: 1; transform: none; }
.menu-panel[hidden] { display: none; }
.panel-grid { display: grid; grid-template-columns: 2fr 1fr; gap: 20px; }
.panel-side { padding-left: 20px; border-left: 1px solid var(--line); }
/* integrity line — the promise the copy has to keep */
.panel-note {
  margin: 16px -18px -18px; padding: 13px 28px;
  border-top: 1px solid var(--line); background: var(--surface-2);
  border-radius: 0 0 16px 16px;
  font-size: 12px; color: var(--muted);
}
.panel-note strong { color: var(--ink); font-weight: 600; }
.menu-panel h6 {
  margin: 0 0 12px; padding-left: 10px;
  font-size: 11px; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase; color: var(--faint);
}
.menu-panel ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.panel-main ul, .panel-two { grid-template-columns: 1fr 1fr; }
.menu-panel a {
  display: grid; grid-template-columns: auto 1fr; column-gap: 11px; row-gap: 4px;
  padding: 11px; border-radius: 11px; text-decoration: none;
  transition: background .18s;
}
.menu-panel a:hover, .menu-panel a:focus-visible { background: var(--hover); outline: none; }

/* ── featured grid cards ────────────────────────────────────────────── */
.gcards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.menu-panel a.gcard {
  position: relative; isolation: isolate; overflow: hidden;
  display: flex; flex-direction: column; gap: 10px;
  min-height: 148px; padding: 16px 17px;
  border: 1px solid var(--line); border-radius: 10px; background: var(--surface);
  transition: border-color .15s;
}
.menu-panel a.gcard:hover { background: var(--surface); border-color: var(--line-strong); }
.gc-bg { position: absolute; inset: 0; z-index: -1; pointer-events: none; }
/* skewed lattice that lifts on hover */
.gc-bg::before {
  content: ''; position: absolute; inset: -25%;
  background-image:
    linear-gradient(to right,  var(--line) 1px, transparent 1px),
    linear-gradient(to bottom, var(--line) 1px, transparent 1px),
    /* a few filled cells, like the reference's random squares */
    linear-gradient(var(--hover), var(--hover)),
    linear-gradient(var(--hover), var(--hover)),
    linear-gradient(var(--hover), var(--hover));
  background-size: 30px 30px, 30px 30px, 29px 29px, 29px 29px, 29px 29px;
  background-position: 0 0, 0 0, 212px 61px, 272px 121px, 182px 151px;
  background-repeat: repeat, repeat, no-repeat, no-repeat, no-repeat;
  transform: skewY(-12deg) translateY(8px);
  transition: transform .18s ease-out;
  -webkit-mask-image: linear-gradient(225deg, #000, transparent);
  mask-image: linear-gradient(225deg, #000, transparent);
}
.menu-panel a.gcard:hover .gc-bg::before { transform: skewY(-12deg) translateY(0); }
/* brand-tinted bloom, in place of the reference's pink/blue conic */
.gc-bg::after {
  content: ''; position: absolute; inset: -10%;
  background: conic-gradient(var(--brand) 0deg, var(--brand-2) 117deg, var(--brand-2) 180deg, #5182fc 240deg, var(--brand) 360deg);
  filter: blur(50px); opacity: 0; transition: opacity .18s;
}
.menu-panel a.gcard:hover .gc-bg::after { opacity: .13; }
.gcard .mi { grid-row: auto; margin: 0; }
/* both must be block — as inline spans a short title lets the description
   ride up onto the same line */
.gc-t { display: block; font-size: 13.5px; font-weight: 600; color: var(--ink); }
.gc-d { display: block; margin-top: 5px; font-size: 12px; line-height: 1.45; color: var(--muted); font-style: normal; }
.gcard .gc-txt { display: block; }

/* ── small rows with a sliding arrow ────────────────────────────────── */
.menu-panel a.srow {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 10px; border-radius: 9px;
}
.srow .mi { width: 22px; height: 22px; border-radius: 7px; }
.srow .mi::after { inset: 4px; }
.srow .s-t { font-size: 13.5px; color: var(--ink); }
.srow .arw-i {
  margin-left: auto; width: 14px; height: 14px; flex: none;
  opacity: 0; transform: translateX(-6px);
  transition: opacity .2s var(--ease), transform .2s var(--ease);
}
.menu-panel a.srow:hover .arw-i, .menu-panel a.srow:focus-visible .arw-i { opacity: .6; transform: none; }
.menu-panel b {
  grid-column: 2; align-self: center;
  font-size: 13.5px; font-weight: 600; color: var(--ink);
}
.menu-panel em {
  grid-column: 2; font-style: normal;
  font-size: 12px; line-height: 1.45; color: var(--muted);
}
.mi {
  grid-row: 1 / span 2; align-self: start; margin-top: 1px;
  width: 26px; height: 26px; border-radius: 8px; flex: none;
  background: var(--brand-soft);
  position: relative;
}
.mi::after {
  content: ''; position: absolute; inset: 5px;
  background: var(--brand);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-position: center; mask-position: center;
}
.mi-board::after  { -webkit-mask-image: var(--i-board);   mask-image: var(--i-board); }
.mi-star::after   { -webkit-mask-image: var(--i-star);    mask-image: var(--i-star); }
.mi-book::after   { -webkit-mask-image: var(--i-book);    mask-image: var(--i-book); }
.mi-users::after  { -webkit-mask-image: var(--i-users);   mask-image: var(--i-users); }
.mi-chart::after  { -webkit-mask-image: var(--i-chart);   mask-image: var(--i-chart); }
.mi-shield::after { -webkit-mask-image: var(--i-shield);  mask-image: var(--i-shield); }
.mi-bolt::after   { -webkit-mask-image: var(--i-bolt);    mask-image: var(--i-bolt); }
.mi-id::after     { -webkit-mask-image: var(--i-id);      mask-image: var(--i-id); }
.mi-clock::after  { -webkit-mask-image: var(--i-clock);   mask-image: var(--i-clock); }
.mi-cap::after    { -webkit-mask-image: var(--i-cap);     mask-image: var(--i-cap); }
.mi-lab::after    { -webkit-mask-image: var(--i-lab);     mask-image: var(--i-lab); }
.mi-building::after { -webkit-mask-image: var(--i-building); mask-image: var(--i-building); }
.mi-code::after   { -webkit-mask-image: var(--i-code);   mask-image: var(--i-code); }
.mi-doc::after    { -webkit-mask-image: var(--i-doc);    mask-image: var(--i-doc); }
.mi-search::after { -webkit-mask-image: var(--i-search); mask-image: var(--i-search); }
.mi-pen::after    { -webkit-mask-image: var(--i-pen);    mask-image: var(--i-pen); }
.mi-award::after  { -webkit-mask-image: var(--i-award);  mask-image: var(--i-award); }
.mi-tools::after  { -webkit-mask-image: var(--i-tools);  mask-image: var(--i-tools); }
.mi-rocket::after { -webkit-mask-image: var(--i-rocket); mask-image: var(--i-rocket); }
.nav-cta {
  margin-left: auto; padding: 9px 18px; border-radius: 999px;
  border: 1px solid var(--line); background: var(--surface);
  color: var(--ink); text-decoration: none; font-size: 14px;
  transition: background .2s, border-color .2s, color .2s;
}
.nav-cta:hover { background: var(--ink); color: var(--on-brand); border-color: var(--ink); }

/* ── copy ───────────────────────────────────────────────────────────── */
.hero-copy { text-align: left; padding: 0; }
/* ── hero type system ───────────────────────────────────────────────────
   Four tiers, and every text in the hero belongs to exactly one:
     1  display   Instrument Serif 400 — h1, stat figures, rotating term
     2  lede      Inter 400, open leading — the paragraph under the headline
     3  micro     Inter 600, 11px, uppercase, wide tracking — every label
     4  ui        Inter 500 — buttons and the assurance line
   The micro tier is what makes the section read corporate: pill, eyebrow,
   stat captions and the marquee label all speak in the same small voice
   instead of four slightly different greys. */
.pill-note {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 8px 16px 8px 13px; border-radius: 999px;
  border: 1px solid var(--line); background: var(--surface);
  backdrop-filter: blur(6px);
  font-size: 11px; font-weight: 600; line-height: 1.4;
  letter-spacing: .11em; text-transform: uppercase;
  color: var(--muted); text-decoration: none;
  transition: border-color .25s, transform .25s var(--ease);
}
.pill-note:hover { border-color: var(--brand-line); transform: translateY(-1px); }
.ping { position: relative; width: 7px; height: 7px; border-radius: 50%; background: var(--brand); flex: none; }
.ping::after {
  content: ''; position: absolute; inset: -4px; border-radius: 50%;
  border: 1.5px solid var(--brand); opacity: 0;
  animation: ping 2.4s var(--ease) infinite;
}
@keyframes ping { 0% { transform: scale(.5); opacity: .7; } 70%,100% { transform: scale(1.4); opacity: 0; } }
.arw { color: var(--brand); font-weight: 600; }

/* Instrument Serif ships one weight (400), so 600 here would synthesise a
   fake bold and smear the strokes. It also carries more optical weight than
   a grotesque at the same size — hence a little larger, and nowhere near the
   negative tracking a sans needs. */
.hero h1 {
  margin: 22px 0 0;
  font-family: var(--font-display);
  font-size: clamp(36px, 3.7vw, 56px); line-height: 1.06;
  letter-spacing: -.012em; font-weight: 400;
  text-wrap: balance;
}
/* keep the accent phrase whole — a hyphen break across lines reads as a typo */
.hero h1 em { font-style: italic; color: var(--brand); white-space: nowrap; }
/* ── rotating discipline ────────────────────────────────────────────────
   Sits above the workspace window and reads as its caption: a quiet lead-in,
   then the discipline itself at display size. Two lines rather than one, so
   the term always has the full column to itself and never fights the
   sentence for space. The word is typed in and out by hero-grid.js. */
.hero-right { display: flex; flex-direction: column; min-width: 0; }
.hero-rot {
  display: grid;                    /* live block and sizer share one cell */
  margin: 0 0 clamp(18px, 1.6vw, 26px);
}
.hero-rot > .hr-block { grid-area: 1 / 1; min-width: 0; }
.hr-sizer { visibility: hidden; }

/* A short brand tick marks the label. A full-width rule here would cut the
   hero in two right above the window — the seam this page is built to avoid. */
.hr-lead {
  display: block; position: relative; padding-top: 18px;
  font-size: 11px; font-weight: 600; line-height: 1.6;
  letter-spacing: .13em; text-transform: uppercase;
  color: var(--muted);
}
.hr-lead::before {
  content: ''; position: absolute; top: 0; left: 0;
  width: 34px; height: 2px; border-radius: 2px;
  background: linear-gradient(90deg, var(--brand), var(--brand-2));
}
.hr-term {
  display: block; margin-top: 6px;
  font-family: var(--font-display);
  font-size: clamp(28px, 2.8vw, 44px); line-height: 1.12;
  letter-spacing: -.008em; font-weight: 400;
}
/* the term carries the only gradient on the page — it earns it by being the
   one element that changes while you watch it */
.hr-word {
  background: linear-gradient(96deg, var(--brand) 10%, var(--brand-2) 90%);
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
}
.hr-caret {
  display: inline-block; width: .06em; height: .82em; margin-left: .07em;
  background: var(--brand-2); vertical-align: -.06em; border-radius: 1px;
  animation: hr-blink 1.05s steps(1) infinite;
}
@keyframes hr-blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }

@media (prefers-reduced-motion: reduce) {
  .hr-caret { animation: none; opacity: .45; }
}

.sub {
  max-width: 480px; margin: 22px 0 0; color: var(--muted);
  font-size: clamp(16px, 1.5vw, 19px); line-height: 1.65;
  letter-spacing: -.011em;          /* Inter tightens up as it grows */
}
.hero-cta { display: flex; gap: 12px; margin: 30px 0 0; flex-wrap: wrap; }
.btn {
  padding: 15px 30px; border-radius: 999px;
  font-size: 14px; font-weight: 500; letter-spacing: .006em;
  text-decoration: none; transition: transform .2s var(--ease), border-color .2s, box-shadow .2s;
}
.btn:hover { transform: translateY(-1px); }
.btn-primary {
  background: var(--ink); color: var(--on-brand); font-weight: 500;
  box-shadow: 0 8px 22px rgba(var(--sh), .16);
}
.btn-ghost { border: 1px solid var(--line); color: var(--ink); background: var(--surface); backdrop-filter: blur(6px); }
.btn-ghost:hover { border-color: var(--line-strong); }

.assure {
  margin: 18px 0 0; max-width: 440px;
  font-size: 12.5px; line-height: 1.6; letter-spacing: .004em; color: var(--faint);
}

/* ── stat row ───────────────────────────────────────────────────────── */
.stats {
  position: relative;
  list-style: none; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 16px; max-width: 520px; margin: clamp(26px, 3vw, 38px) 0 0;
  padding: clamp(24px, 2.8vw, 32px) 0 0;
}
/* fades out rather than stopping dead — the same hairline language as the
   eyebrow tick, so the hero has no hard rules anywhere in it */
.stats::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, var(--line-strong), var(--line) 55%, transparent);
}
.stats li { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
/* figures in the display face — a serif numeral reads considered where a
   grotesque one reads like a dashboard metric */
.stats b {
  font-family: var(--font-display);
  font-size: clamp(28px, 2.5vw, 36px); line-height: 1; font-weight: 400;
  letter-spacing: -.004em; color: var(--ink);
}
.stats span {
  font-size: 11px; font-weight: 600; line-height: 1.45;
  letter-spacing: .1em; text-transform: uppercase; color: var(--faint);
}

/* ── video ──────────────────────────────────────────────────────────── */
.hero-video {
  margin: clamp(40px, 5vw, 72px) auto 0;
  max-width: 1600px; padding: 0 clamp(16px, 2vw, 28px);
}
/* the video IS the workspace window, cropped — so it carries the window's own
   rounding and shadow, and the page grid runs right up to its edge */
.video-wrap { position: relative; }
.hero-video video {
  display: block; width: 100%; height: auto;
  border-radius: clamp(10px, 1.1vw, 18px);
  box-shadow: 0 24px 70px rgba(var(--sh), .12), 0 2px 8px rgba(var(--sh), .05);
}

.vid-toggle {
  position: absolute; right: 16px; bottom: 16px;
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 14px 8px 11px; border-radius: 999px;
  border: 1px solid var(--line); background: rgba(255,255,255,.86);
  backdrop-filter: blur(8px);
  color: var(--ink); font: inherit; font-size: 12.5px; font-weight: 600;
  cursor: pointer; opacity: 0; transform: translateY(4px);
  transition: opacity .25s var(--ease), transform .25s var(--ease),
              border-color .2s, background .2s;
}
.video-wrap:hover .vid-toggle,
.vid-toggle:focus-visible { opacity: 1; transform: none; }
.vid-toggle:hover { border-color: var(--line-strong); background: var(--surface); }
.vid-toggle svg { width: 13px; height: 13px; fill: currentColor; flex: none; }
/* show whichever icon matches the *action* the button performs */
.vid-toggle .ic-play { display: none; }
.vid-toggle[aria-pressed="false"] .ic-pause { display: none; }
.vid-toggle[aria-pressed="false"] .ic-play { display: block; }
/* keep it visible while paused, so the control is discoverable */
.vid-toggle[aria-pressed="false"] { opacity: 1; transform: none; }

/* ── journal marquee ────────────────────────────────────────────────── */
/* lives inside the hero grid — span both columns, then sit on the shell */
.marquee {
  grid-column: 1 / -1;
  /* same content width as every .wrap section, so its right edge lines up too */
  margin: clamp(36px, 4vw, 60px) 0 0; max-width: calc(var(--shell) - 2 * var(--gutter));
  display: flex; align-items: center; gap: 22px;
}
.marquee-lbl {
  font-size: 11px; font-weight: 600; letter-spacing: .13em; text-transform: uppercase;
  color: var(--faint); white-space: nowrap; flex: none;
}
.marquee-track {
  flex: 1; min-width: 0; overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
}
/* the run holds two identical sets; translating exactly one set width loops seamlessly */
.marquee-run { display: flex; width: max-content; animation: slide 30s linear infinite; }
.mq-set { display: flex; gap: 30px; padding-right: 30px; }
.marquee-track span { font-size: 13.5px; font-weight: 600; color: var(--faint); white-space: nowrap; }
@keyframes slide { to { transform: translateX(-50%); } }

/* the full nav (3 mega menus + 2 links + auth pair + theme) needs ~1000px of
   header before it starts wrapping onto two lines — hand over to the drawer
   well before that, which also puts iPad landscape on the drawer */
@media (max-width: 1024px) {
  /* the drawer is anchored to --hdr and measures from the viewport top, so the
     bar goes flush here — a floating one would leave a gap above the panel */
  :root { --hdr-gap: 0px; --hdr-side: 0px; }
  .site-header { width: 100%; max-width: none; border-radius: 0; box-shadow: none; }
  /* the drawer carries its own Sign in / Sign up, so the header pair goes too */
  .nav-links, .nav-cta, .nav-auth { display: none; }
  .burger { display: inline-flex; margin-left: 0; }
  .theme-btn { margin-left: auto; }
  .site-header.scrolled { max-width: none; border-radius: 0; }
  /* it is a full-width bar here, not a floating pill — so it keeps the shell
     gutter instead of the pill's tighter inset, which pushed the brand 20px
     left of every other element on the page */
  .site-header.scrolled .hdr-inner { padding: 0 var(--gutter); }
}
/* Below this the two-column split leaves the workspace under ~950px, which is
   where its five stages stop being readable. Stacking hands it the full shell
   instead — a 1400px window with room to breathe beats a cramped 800px one. */
@media (max-width: 1599px) {
  .hero-inner {
    grid-template-columns: minmax(0, 1fr);
    max-width: var(--shell); margin-inline: auto;
    padding: clamp(28px, 5vw, 56px) var(--gutter) 0;
    row-gap: clamp(34px, 5vw, 52px);
  }
  /* full shell available now — the prose keeps its measure, but the stat row
     spreads out instead of huddling in a 660px column */
  .hero-copy { max-width: none; }
  .sub, .assure { max-width: 660px; }
  .hero h1 { font-size: clamp(32px, 5.4vw, 54px); max-width: 20ch; }
  .stats { max-width: 880px; }
}

@media (max-width: 720px) {
  .hero-video { padding: 0 12px; }
  .stats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 26px; }
  /* stacking drops the track out of the row, so `flex: 1` no longer caps its
     width and it grows to its 2200px content — clipped by .hero, but the fade
     mask ends up off-screen. Pin it back to the container. */
  .marquee { flex-direction: column; align-items: stretch; gap: 12px; }
  .marquee-track { width: 100%; }
}

/* phones: the board is decorative at this size — keep it legible, not complete */
@media (max-width: 560px) {
  .hero h1 { font-size: clamp(29px, 8.4vw, 38px); }
  .hero-cta .btn { flex: 1 1 auto; text-align: center; }
}

@media (prefers-reduced-motion: reduce) {
  .ping::after, .marquee-run, .fp path { animation: none; }
}

/* ── mega panel (spans the header, columns of grouped links) ─────────── */
.hdr-inner { position: relative; }
.menu { position: static; }
.menu-panel.mega {
  left: 0; right: 0; width: auto; max-width: none;
  padding: 0; overflow: hidden;
}
.mega-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 16px;
  padding: 16px 22px 13px; border-bottom: 1px solid var(--line);
  background: var(--surface-2);
}
.mega-head h5 {
  margin: 0; font-size: 11px; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase; color: var(--faint);
}
.mega-all { font-size: 12.5px; font-weight: 600; color: var(--brand); text-decoration: none; white-space: nowrap; }
.mega-all:hover { text-decoration: underline; }

/* ── theme toggle ───────────────────────────────────────────────────── */
.theme-btn {
  width: 38px; height: 38px; flex: none; margin-left: 10px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--line); border-radius: 10px;
  background: var(--surface); color: var(--ink); cursor: pointer;
  transition: border-color .2s, background .2s;
}
.theme-btn:hover { border-color: var(--line-strong); }
.theme-btn svg { width: 17px; height: 17px; }
.theme-btn .ic-moon { display: none; }
:root[data-theme="dark"] .theme-btn .ic-sun { display: none; }
:root[data-theme="dark"] .theme-btn .ic-moon { display: block; }

/* ── mobile sub-groups inside the accordion ─────────────────────────── */
.msub { padding: 6px 0 10px; }
.msub-t {
  display: flex; align-items: center; gap: 9px; margin: 6px 0 4px;
  font-size: 12.5px; font-weight: 700; color: var(--ink);
}
.msub-t .mi { width: 22px; height: 22px; border-radius: 7px; }
.msub-t .mi::after { inset: 5px; }
.msub-l { display: grid; }
.msub-l a {
  display: block; padding: 8px 8px 8px 31px; border-radius: 8px;
  font-size: 14px; color: var(--muted); text-decoration: none;
}

/* the recorded demo is a light-background video; give it a frame in dark mode */
:root[data-theme="dark"] .hero-video video { border: 1px solid var(--line); }


/* the panel spans the two triggers rather than the whole header */

/* mobile: overview items + a link through to the section */
.m-feat {
  display: block !important; margin-top: 6px; padding: 12px 4px !important;
  font-size: 14px; font-weight: 600; color: var(--brand) !important;
}
@media (max-width: 980px) {
  .ov-grid { grid-template-columns: 1fr; }
  .ov-side { border-left: 0; border-top: 1px solid var(--line); }
}


.ov-grid { grid-template-columns: 1fr 268px; }
.menu-panel .ov-quick a.srow {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 10px; border-radius: 8px;
  font-size: 12.8px; color: var(--muted); text-decoration: none;
}
.menu-panel .ov-quick a.srow:hover { color: var(--ink); background: var(--hover); }
.ov-quick .s-t { flex: 1; }
.ov-quick .ov-arw { margin-left: auto; }

/* the mega panel has no padding, so the note's negative margins would push it
   outside overflow:hidden and clip the text */
.menu-panel.mega .panel-note { margin: 0; border-radius: 0; }
.lr-d { -webkit-line-clamp: 3; }


/* footer bar */
.mm-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 16px 24px; border-top: 1px solid var(--line); background: var(--surface-2);
}
.menu-panel a.mm-cta {
  display: inline-block; padding: 13px 26px; border-radius: 999px;
  /* --on-brand, not #fff — see .nav-signup below */
  background: var(--brand); color: var(--on-brand); text-decoration: none;
  font-size: 14.5px; font-weight: 600;
  transition: transform .2s var(--ease), box-shadow .2s;
}
.menu-panel a.mm-cta:hover { transform: translateY(-1px); box-shadow: 0 8px 22px -8px var(--brand); background: var(--brand); }
.menu-panel a.mm-all {
  display: inline-flex; align-items: center; gap: 8px; padding: 8px 4px;
  color: var(--ink); text-decoration: none; font-size: 14.5px; font-weight: 600;
}
.menu-panel a.mm-all span { color: var(--brand); transition: transform .2s var(--ease); display: inline-block; }
.menu-panel a.mm-all:hover span { transform: translateX(4px); }

@media (max-width: 980px) {
}

/* ── mega menu: titled columns, icon + label + description ───────────── */
.menu-panel.mega { width: max-content; max-width: calc(100vw - 32px); left: 0; right: auto; padding: 0; }
.mm-cols { display: flex; padding: 22px 0 18px; }
.mm-col { min-width: 0; flex: 1; padding: 0 22px; }
.mm-col + .mm-col { border-left: 1px solid var(--line-soft); }
.mm-col h3 {
  margin: 0 0 12px; padding: 0 0 10px 2px;
  border-bottom: 1px solid var(--line-soft);
  font-size: 10.5px; font-weight: 700; color: var(--muted);
  text-transform: uppercase; letter-spacing: .09em;
}
.mm-col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.menu-panel .mm-col a {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 10px; border-radius: 10px; text-decoration: none;
  transition: background .18s;
}
.menu-panel .mm-col a:hover, .menu-panel .mm-col a:focus-visible { background: var(--hover); outline: none; }
/* bordered square icon, as in the reference — tinted on hover, not filled blue */
.mm-ic {
  position: relative; width: 36px; height: 36px; flex: none;
  border: 1px solid var(--line); border-radius: 9px; background: var(--surface);
  transition: border-color .25s, background .25s;
}
.mm-ic::after {
  content: ''; position: absolute; inset: 9px; background: var(--ink);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-position: center; mask-position: center;
  transition: background .25s;
}
.menu-panel .mm-col a:hover .mm-ic { border-color: var(--brand-line); background: var(--brand-soft); }
.menu-panel .mm-col a:hover .mm-ic::after { background: var(--brand); }
.mm-tx { display: block; line-height: 1.35; }
.mm-tx b { display: block; font-size: 13.5px; font-weight: 600; color: var(--ink); letter-spacing: -.005em; }
.mm-tx em {
  display: block; margin-top: 3px; font-style: normal;
  font-size: 11.5px; line-height: 1.4; color: var(--muted); transition: color .25s;
}
.menu-panel .mm-col a:hover .mm-tx em { color: var(--ink); }

.mm-ic.mi-board::after   { -webkit-mask-image: var(--i-board);   mask-image: var(--i-board); }
.mm-ic.mi-star::after    { -webkit-mask-image: var(--i-star);    mask-image: var(--i-star); }
.mm-ic.mi-book::after    { -webkit-mask-image: var(--i-book);    mask-image: var(--i-book); }
.mm-ic.mi-users::after   { -webkit-mask-image: var(--i-users);   mask-image: var(--i-users); }
.mm-ic.mi-chart::after   { -webkit-mask-image: var(--i-chart);   mask-image: var(--i-chart); }
.mm-ic.mi-shield::after  { -webkit-mask-image: var(--i-shield);  mask-image: var(--i-shield); }
.mm-ic.mi-bolt::after    { -webkit-mask-image: var(--i-bolt);    mask-image: var(--i-bolt); }
.mm-ic.mi-id::after      { -webkit-mask-image: var(--i-id);      mask-image: var(--i-id); }
.mm-ic.mi-clock::after   { -webkit-mask-image: var(--i-clock);   mask-image: var(--i-clock); }
.mm-ic.mi-cap::after     { -webkit-mask-image: var(--i-cap);     mask-image: var(--i-cap); }
.mm-ic.mi-lab::after     { -webkit-mask-image: var(--i-lab);     mask-image: var(--i-lab); }
.mm-ic.mi-code::after    { -webkit-mask-image: var(--i-code);    mask-image: var(--i-code); }
.mm-ic.mi-doc::after     { -webkit-mask-image: var(--i-doc);     mask-image: var(--i-doc); }
.mm-ic.mi-search::after  { -webkit-mask-image: var(--i-search);  mask-image: var(--i-search); }
.mm-ic.mi-pen::after     { -webkit-mask-image: var(--i-pen);     mask-image: var(--i-pen); }
.mm-ic.mi-award::after   { -webkit-mask-image: var(--i-award);   mask-image: var(--i-award); }
.mm-ic.mi-tools::after   { -webkit-mask-image: var(--i-tools);   mask-image: var(--i-tools); }
.mm-ic.mi-rocket::after  { -webkit-mask-image: var(--i-rocket);  mask-image: var(--i-rocket); }

.mm-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 14px 24px; border-top: 1px solid var(--line); background: var(--surface-2);
}
/* second .mm-cta block — this is the one that wins, so the fix belongs here too */
.menu-panel a.mm-cta {
  display: inline-block; padding: 12px 24px; border-radius: 999px;
  background: var(--brand); color: var(--on-brand); text-decoration: none;
  font-size: 14px; font-weight: 600;
  transition: transform .2s var(--ease), box-shadow .2s;
}
.menu-panel a.mm-cta:hover { transform: translateY(-1px); box-shadow: 0 8px 22px -8px var(--brand); }
.menu-panel a.mm-all {
  display: inline-flex; align-items: center; gap: 8px; padding: 8px 4px;
  color: var(--ink); text-decoration: none; font-size: 14px; font-weight: 600;
}
.menu-panel a.mm-all span { color: var(--brand); display: inline-block; transition: transform .2s var(--ease); }
.menu-panel a.mm-all:hover span { transform: translateX(4px); }

/* ── sliding hover pill behind the nav triggers ─────────────────────── */
.nav-links { position: relative; }
.nav-pill {
  position: absolute; left: 0; top: 0; z-index: -1;
  height: 0; width: 0; border-radius: 999px; background: var(--brand-soft);
  opacity: 0; pointer-events: none;
  transition: transform .32s var(--ease), width .32s var(--ease),
              height .32s var(--ease), opacity .2s;
}
.nav-links > a, .menu-trigger { position: relative; }
/* the pill replaces the per-item background so they can't double up */
.nav-links > a:hover, .menu-trigger:hover, .menu-trigger[aria-expanded="true"] { background: none; }

@media (max-width: 1100px) { .mm-cols { gap: 26px; } }
@media (max-width: 980px) {
  .mm-cols { flex-direction: column; gap: 18px; }
}

/* the note is a footnote, so it must sit below the CTA in the hierarchy */
.menu-panel.mega .panel-note {
  padding: 11px 24px; font-size: 11.5px; color: var(--muted);
  background: var(--surface); border-top: 1px solid var(--line-soft);
}
.menu-panel.mega .panel-note strong { color: var(--ink); font-weight: 600; }

/* ── account menu (mobile drawer only) ──────────────────────────────── */
.am { margin-top: 6px; padding-top: 6px; }
.am-label {
  margin: 14px 4px 6px; font-size: 11.5px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase; color: var(--muted);
}
.am-sep { height: 1px; margin: 12px 0 2px; background: var(--line); }
.am-item {
  display: flex; align-items: center; gap: 12px; width: 100%;
  padding: 11px 10px; border: 0; border-radius: 10px;
  background: none; font: inherit; font-size: 14.5px; color: var(--ink);
  text-decoration: none; cursor: pointer; text-align: left;
  transition: background .18s, color .18s;
}
.am-item:active, .am-item:hover { background: var(--hover); }
.am-t { flex: 1; }
.am-ic { position: relative; width: 18px; height: 18px; flex: none; }
.am-ic::after {
  content: ''; position: absolute; inset: 0; background: currentColor;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-position: center; mask-position: center;
}
.am-ic.mi-tools::after { -webkit-mask-image: var(--i-tools); mask-image: var(--i-tools); }
.am-ic.mi-board::after { -webkit-mask-image: var(--i-board); mask-image: var(--i-board); }
.am-ic.mi-users::after { -webkit-mask-image: var(--i-users); mask-image: var(--i-users); }
.am-ic.mi-sun::after   { -webkit-mask-image: var(--i-sun);   mask-image: var(--i-sun); }
.am-ic.mi-moon::after  { -webkit-mask-image: var(--i-moon);  mask-image: var(--i-moon); }
.am-ic.mi-bell::after  { -webkit-mask-image: var(--i-bell);  mask-image: var(--i-bell); }
.am-ic.mi-out::after   { -webkit-mask-image: var(--i-out);   mask-image: var(--i-out); }

/* destructive action, kept distinct from the brand rust so it still reads as a warning */
.am-danger { color: #c8321f; }
:root[data-theme="dark"] .am-danger { color: #ff8a72; }
.am-danger:hover, .am-danger:active { background: rgba(200,50,31,.10); }

/* submenu: chevron turns, panel opens to its natural height */
.am-chev { width: 13px; height: 13px; color: var(--faint); transition: transform .26s var(--ease); }
.am-trigger[aria-expanded="true"] .am-chev { transform: rotate(90deg); }
.am-panel {
  display: grid; grid-template-rows: 0fr;
  transition: grid-template-rows .28s var(--ease);
}
.am-trigger[aria-expanded="true"] + .am-panel { grid-template-rows: 1fr; }
.am-in { overflow: hidden; min-height: 0; padding-left: 30px; }
.am-opt {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 9px 10px; border: 0; border-radius: 9px;
  background: none; font: inherit; font-size: 13.5px; color: var(--muted);
  cursor: pointer; text-align: left; transition: background .18s, color .18s;
}
.am-opt:hover, .am-opt:active { background: var(--hover); color: var(--ink); }
.am-opt[aria-checked="true"] { color: var(--ink); font-weight: 600; }
/* radio dot */
.am-opt > i {
  width: 15px; height: 15px; flex: none; border-radius: 50%;
  border: 1.5px solid var(--line-strong); position: relative; transition: border-color .2s;
}
.am-opt[aria-checked="true"] > i { border-color: var(--brand); }
.am-opt[aria-checked="true"] > i::after {
  content: ''; position: absolute; inset: 3px; border-radius: 50%; background: var(--brand);
}
/* checkbox variant */
.am-check > i { border-radius: 5px; }
.am-check[aria-checked="true"] > i { background: var(--brand); border-color: var(--brand); }
.am-check[aria-checked="true"] > i::after {
  content: ''; position: absolute; inset: 0;
  background: #fff; border-radius: 0;
  -webkit-mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8.4l3 3 6-6.4"/></svg>') center/11px no-repeat;
  mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="black" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8.4l3 3 6-6.4"/></svg>') center/11px no-repeat;
}

/* ── header auth pair ───────────────────────────────────────────────── */
.nav-auth { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.nav-signin {
  padding: 9px 14px; border-radius: 999px; color: var(--ink);
  text-decoration: none; font-size: 14px; font-weight: 500;
  transition: background .2s;
}
.nav-signin:hover { background: var(--hover); }
.nav-signup {
  padding: 9px 18px; border-radius: 999px;
  /* not #fff: in dark the brand is a light orange, and white on it is 3.18:1.
     --on-brand is white in light and near-black in dark — correct on both. */
  background: var(--brand); color: var(--on-brand); text-decoration: none;
  font-size: 14px; font-weight: 600;
  transition: transform .2s var(--ease), box-shadow .2s;
}
.nav-signup:hover { transform: translateY(-1px); box-shadow: 0 8px 20px -8px var(--brand); }
@media (max-width: 860px) { .nav-auth { display: none; } }

/* ── section scaffolding ────────────────────────────────────────────── */
.sec { padding: clamp(64px, 8vw, 108px) 0; }
/* Section tints used to be slabs with a 1px rule top and bottom, which is what
   made the page read as stacked blocks. They are now edgeless: the tint fades
   up from nothing and back to nothing, so one section becomes the next. */
.sec-alt { position: relative; }
.sec-alt::before {
  content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg, transparent, var(--surface-2) 16%, var(--surface-2) 84%, transparent);
}
/* same shell as the header and the hero — every section starts at the same x */
.wrap { max-width: var(--shell); margin: 0 auto; padding: 0 var(--gutter); }
.kicker {
  margin: 0 0 14px; font-size: 11px; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: var(--brand);
}
.sec h2 {
  margin: 0; max-width: 18ch;               /* the shell is wide; the measure is not */
  font-family: var(--font-display);
  font-size: clamp(31px, 3.6vw, 50px); line-height: 1.08;
  letter-spacing: -.01em; font-weight: 400; color: var(--ink);
}
.cta-band h2 { max-width: none; }
.lede { margin: 16px 0 0; max-width: 620px; font-size: clamp(15px, 1.3vw, 17px); line-height: 1.6; color: var(--muted); }

/* ── service cards ──────────────────────────────────────────────────── */
.cards3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: clamp(36px, 4vw, 56px); }
.scard {
  display: flex; flex-direction: column;
  padding: 26px; border: 1px solid var(--line); border-radius: 16px;
  background: var(--surface); transition: border-color .25s, box-shadow .25s, transform .25s var(--ease);
}
.scard:hover { border-color: var(--line-strong); transform: translateY(-2px); box-shadow: 0 16px 40px -18px rgba(var(--sh), .28); }
.scard-ic, .feat-ic {
  position: relative; width: 42px; height: 42px; border-radius: 12px;
  background: var(--brand-soft); margin-bottom: 18px;
}
.scard-ic::after, .feat-ic::after {
  content: ''; position: absolute; inset: 11px; background: var(--brand);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-position: center; mask-position: center;
}
.scard h3, .feat h3 { margin: 0 0 10px; font-size: 19px; font-weight: 600; color: var(--ink); letter-spacing: -.015em; }
.scard p { margin: 0; font-size: 14.5px; line-height: 1.6; color: var(--muted); }
.ticks { list-style: none; margin: 18px 0 0; padding: 0; display: grid; gap: 9px; }
.ticks li { position: relative; padding-left: 24px; font-size: 13.5px; color: var(--muted); }
.ticks li::before {
  content: ''; position: absolute; left: 0; top: 4px; width: 15px; height: 15px;
  border-radius: 50%; background: var(--brand-soft);
}
.ticks li::after {
  content: ''; position: absolute; left: 4px; top: 8px; width: 7px; height: 4px;
  border-left: 1.6px solid var(--brand); border-bottom: 1.6px solid var(--brand);
  transform: rotate(-45deg);
}
.scard-go {
  margin-top: auto; padding-top: 22px; text-decoration: none;
  font-size: 14px; font-weight: 600; color: var(--brand);
}
.scard-go span { display: inline-block; transition: transform .2s var(--ease); }
.scard-go:hover span { transform: translateX(4px); }


/* ── feature grid ───────────────────────────────────────────────────── */
/* ── why: bento ─────────────────────────────────────────────────────────
   Six reasons at three weights rather than six identical boxes. The lead tile
   spans two rows and carries the integrity claim, because every other reason
   here depends on it. Each tile lights a spotlight border under the pointer,
   and the set staggers in on scroll so the eye is walked through it. */
.grid6 {
  display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 14px; margin-top: clamp(36px, 4vw, 56px);
}
.feat {
  position: relative; isolation: isolate; overflow: hidden;
  display: flex; flex-direction: column;
  padding: clamp(20px, 2vw, 28px);
  border: 1px solid var(--line); border-radius: 18px;
  background: var(--surface);
  transition: transform .4s var(--ease), border-color .3s;
}
.feat:hover { transform: translateY(-3px); border-color: var(--line-strong); }

/* bento shape: 1 leads over two rows, 2 and 3 stack beside it, 4-6 sit below */
.feat:nth-child(1) { grid-column: span 3; grid-row: span 2; }
.feat:nth-child(2),
.feat:nth-child(3) { grid-column: span 3; }
.feat:nth-child(4),
.feat:nth-child(5),
.feat:nth-child(6) { grid-column: span 2; }

/* Spotlight border. The gradient is painted into the padding ring and the
   fill is punched back out — mask-composite must EXCLUDE here; intersect
   multiplies the two layers to zero alpha and paints nothing at all. */
.feat-edge {
  position: absolute; inset: 0; z-index: -1; pointer-events: none;
  border-radius: inherit; padding: 1px;
  background: radial-gradient(220px circle at var(--mx, 50%) var(--my, 50%),
              var(--brand), transparent 68%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  opacity: 0; transition: opacity .35s var(--ease);
}
.feat:hover .feat-edge, .feat:focus-within .feat-edge { opacity: 1; }

/* the index, set large and faint in the display face */
.feat-n {
  position: absolute; top: clamp(12px, 1.2vw, 18px); right: clamp(14px, 1.4vw, 22px);
  font-family: var(--font-display); font-size: clamp(30px, 3vw, 46px);
  line-height: 1; color: var(--ink); opacity: .07;
  transition: opacity .35s var(--ease), color .35s;
}
.feat:hover .feat-n { opacity: .22; color: var(--brand); }

.feat-ic { width: 34px; height: 34px; margin-bottom: 16px; }
.feat-ic::after { inset: 9px; }
.feat h3 {
  margin: 0 0 8px; font-size: clamp(15px, 1.35vw, 17.5px); font-weight: 600;
  letter-spacing: -.012em; color: var(--ink);
}
.feat p { margin: 0; font-size: 14px; line-height: 1.62; color: var(--muted); }

/* the lead tile gets the room its claim needs */
.feat-lead { justify-content: flex-end; padding: clamp(24px, 2.6vw, 38px); }
.feat-lead .feat-ic { width: 44px; height: 44px; margin-bottom: 20px; }
.feat-lead .feat-ic::after { inset: 12px; }
.feat-lead h3 {
  font-family: var(--font-display); font-weight: 400;
  font-size: clamp(24px, 2.5vw, 34px); line-height: 1.12; letter-spacing: -.012em;
  margin-bottom: 12px;
}
.feat-lead p { font-size: clamp(14.5px, 1.2vw, 16px); line-height: 1.68; max-width: 44ch; }
.feat-lead .feat-n { font-size: clamp(40px, 4.4vw, 68px); }

/* staggered arrival, once */
.grid6 .feat { opacity: 0; }
.grid6.in .feat {
  animation: feat-in .6s var(--ease) both;
  animation-delay: calc(.07s * var(--i));
}
@keyframes feat-in {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: none; }
}

@media (max-width: 980px) {
  .grid6 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .feat:nth-child(1) { grid-column: span 4; grid-row: auto; }
  .feat:nth-child(2), .feat:nth-child(3),
  .feat:nth-child(4), .feat:nth-child(5), .feat:nth-child(6) { grid-column: span 2; }
}
@media (max-width: 620px) {
  .grid6 { grid-template-columns: minmax(0, 1fr); }
  .feat:nth-child(n) { grid-column: span 1; }
}
@media (prefers-reduced-motion: reduce) {
  .grid6 .feat { opacity: 1; }
  .grid6.in .feat { animation: none; }
  .feat, .feat-edge, .feat-n { transition: none; }
}

/* ── stat band ──────────────────────────────────────────────────────── */
.sec-band { position: relative; padding: clamp(40px, 5vw, 64px) 0; }
.sec-band::before {
  content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg, transparent, var(--surface-2) 22%, var(--surface-2) 78%, transparent);
}
.band { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; text-align: center; }
.band b { display: block; font-size: clamp(30px, 3.4vw, 42px); font-weight: 600; letter-spacing: -.03em; color: var(--ink); }
.band span { display: block; margin-top: 6px; font-size: 13px; color: var(--muted); }

/* ── quotes ─────────────────────────────────────────────────────────── */
/* ── review wall ────────────────────────────────────────────────────────
   Two rows drifting in opposite directions. Each row holds the same ten cards
   twice and translates by exactly one set width, so the seam never lands in
   view — the same loop the journal marquee uses. Pure CSS: nothing measures,
   nothing runs on the main thread. */
.rv-wall { margin-top: clamp(36px, 4vw, 56px); display: grid; gap: 10px; }
.rv-row {
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
}
.rv-run { display: flex; width: max-content; animation: rv-drift 78s linear infinite; }
.rv-set { display: flex; gap: 10px; padding-right: 10px; }
/* reverse gives the second row its left-to-right travel off the same keyframe */
.rv-row[data-dir="r"] .rv-run { animation-direction: reverse; }
@keyframes rv-drift { to { transform: translateX(-50%); } }
/* let a reader stop a card they are part-way through */
.rv-row:hover .rv-run,
.rv-row:focus-within .rv-run { animation-play-state: paused; }

.rv {
  position: relative; overflow: hidden; isolation: isolate;
  flex: 0 0 auto; width: clamp(268px, 25vw, 340px);
  display: flex; flex-direction: column;
  margin: 0; padding: 18px;
  border: 1px dashed var(--line-strong);
}
/* GridPattern as a masked background rather than an <svg> per card — forty
   inline patterns would be forty DOM subtrees for one decorative texture, and
   masking lets it take the theme colour the way the menu icons do. */
.rv-grid {
  position: absolute; top: 0; left: 50%; width: 100%; height: 100%;
  margin: -8px 0 0 -80px; pointer-events: none; z-index: -1;
  background: var(--line-strong); opacity: .5;
  -webkit-mask-image:
    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25"><path d="M.5 25V.5H25" fill="none" stroke="black" stroke-dasharray="3"/></svg>'),
    radial-gradient(farthest-side at top, #000, transparent),
    linear-gradient(#000, transparent);
  mask-image:
    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25"><path d="M.5 25V.5H25" fill="none" stroke="black" stroke-dasharray="3"/></svg>'),
    radial-gradient(farthest-side at top, #000, transparent),
    linear-gradient(#000, transparent);
  -webkit-mask-composite: source-in; mask-composite: intersect;
  -webkit-mask-repeat: repeat, no-repeat, no-repeat; mask-repeat: repeat, no-repeat, no-repeat;
}
.rv blockquote { margin: 0 0 16px; }
.rv blockquote p {
  margin: 0; font-size: 14px; font-weight: 300; line-height: 1.62;
  letter-spacing: .01em; color: var(--ink);
}
.rv figcaption { margin-top: auto; }
.rv b { display: block; font-size: 13.5px; font-weight: 600; color: var(--ink); }
.rv em {
  display: block; margin-top: 2px; font-style: normal;
  font-size: 11px; letter-spacing: .01em; color: var(--muted);
}

/* the three rotated ellipses behind the section */
.voices-wash { position: absolute; inset: 0; z-index: 0; overflow: hidden; pointer-events: none; }
.voices-wash i {
  position: absolute; top: 0; left: 0; height: 1280px; border-radius: 50%;
  transform: translateY(-350px) rotate(-45deg);
}
.voices-wash i:nth-child(1) { width: 560px; background: radial-gradient(68% 69% at 55% 31%, var(--brand-soft) 0, transparent 60%); }
.voices-wash i:nth-child(2) { width: 240px; transform: translate(5%, -50%) rotate(-45deg); background: radial-gradient(50% 50% at 50% 50%, var(--brand-soft) 0, transparent 80%); }
.voices-wash i:nth-child(3) { width: 240px; background: radial-gradient(50% 50% at 50% 50%, var(--brand-soft) 0, transparent 80%); }
#stories { position: relative; }
#stories .wrap { position: relative; z-index: 1; }

/* motion off: the rows stop and become a plain scroller the reader drives */
@media (prefers-reduced-motion: reduce) {
  .rv-run { animation: none; }
  .rv-row { overflow-x: auto; }
  .rv-row .rv-set[aria-hidden="true"] { display: none; }
}

/* ── faq ────────────────────────────────────────────────────────────── */
/* the questions keep a reading measure, but on the same left rail as every
   other section rather than centred in the shell */
/* ── FAQ intro capsule ──────────────────────────────────────────────────
   The reference's rotating beam, breathing ring, sweeping meter and running
   tick, at the site's tint. Everything here is decorative and aria-hidden. */
.fq-intro {
  position: relative; isolation: isolate; overflow: hidden;
  display: flex; align-items: center; gap: .85rem;
  width: 100%; max-width: 24rem; margin: 0 auto clamp(34px, 4vw, 56px);
  padding: .85rem 1.4rem; border-radius: 999px;
  border: 1px solid var(--line-strong); background: var(--surface-2);
  /* the reference sets .65rem (10.4px); this page holds an 11px floor, so the
     tracking gives back the width the extra half-pixel takes */
  font-size: 11px; text-transform: uppercase; letter-spacing: .3em;
  color: var(--muted);
  opacity: 0; transform: translate3d(0, 12px, 0); filter: blur(8px);
  animation: fqi-in .72s var(--ease) .1s forwards;
}
@keyframes fqi-in { to { opacity: 1; transform: none; filter: blur(0); } }

.fq-intro > span { position: relative; z-index: 1; }
.fqi-beam, .fqi-pulse { position: absolute; inset: -110%; z-index: 0; border-radius: 50%; pointer-events: none; }
.fqi-beam {
  background: conic-gradient(from 160deg, var(--brand-soft), transparent 32%,
              rgba(226, 112, 58, .16) 58%, transparent 78%, var(--brand-soft));
  animation: fqi-spin 18s linear infinite; opacity: .75;
}
@keyframes fqi-spin { to { transform: rotate(360deg); } }
.fqi-pulse {
  border: 1px solid currentColor; opacity: .22;
  animation: fqi-pulse 3.4s ease-out infinite;
}
@keyframes fqi-pulse {
  0%   { transform: scale(.7);  opacity: .5; }
  60%  { opacity: .08; }
  100% { transform: scale(1.25); opacity: 0; }
}
.fqi-label { font-weight: 600; letter-spacing: .34em; color: var(--ink); white-space: nowrap; }
.fqi-meter {
  flex: 1 1 auto; height: 1px; opacity: .7;
  background: linear-gradient(90deg, transparent, currentColor 35%, transparent 85%);
  transform: scaleX(0); transform-origin: left;
  animation: fqi-meter 5.8s ease-in-out infinite;
}
@keyframes fqi-meter {
  0%, 20%   { transform: scaleX(0); transform-origin: left; }
  45%, 60%  { transform: scaleX(1); transform-origin: left; }
  80%, 100% { transform: scaleX(0); transform-origin: right; }
}
.fqi-tick {
  width: .55rem; height: .55rem; border-radius: 999px; flex: none;
  background: var(--brand); box-shadow: 0 0 0 4px var(--brand-soft);
  animation: fqi-tick 3.2s ease-in-out infinite;
}
@keyframes fqi-tick {
  0%, 30% { transform: translateX(-6px); opacity: .4; }
  50%     { transform: translateX(2px);  opacity: 1; }
  100%    { transform: translateX(20px); opacity: 0; }
}

/* header row: copy left, mode control right — the reference's md:flex-row */
.fq-head { display: flex; flex-direction: column; gap: 26px; }
.fq-head .kicker { margin-top: 0; }
.fq-head .lede { margin-bottom: 0; }
@media (min-width: 820px) {
  .fq-head { flex-direction: row; align-items: flex-end; justify-content: space-between; gap: 40px; }
  .fq-mode { flex: none; margin-bottom: 4px; }
}

.fq-mode {
  display: inline-flex; align-items: center; gap: 12px;
  height: 44px; padding: 0 20px; border-radius: 999px;
  border: 1px solid var(--line-strong); background: var(--surface);
  font: inherit; font-size: 14px; font-weight: 500; color: var(--ink);
  cursor: pointer; transition: border-color .3s, background .5s, transform .2s var(--ease);
}
.fq-mode:hover { border-color: var(--brand-line); transform: translateY(-1px); }
.fq-mode:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; }
.fqm-dot { position: relative; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; }
.fqm-dot::before {
  content: ''; position: absolute; inset: 0; border-radius: 50%;
  border: 1px solid var(--line-strong); opacity: .55;
}
:root[data-theme="dark"] .fqm-dot::before { animation: fqm-breathe 2s ease-in-out infinite; }
@keyframes fqm-breathe { 50% { opacity: .18; } }
.fqm-dot i { width: 12px; height: 12px; border-radius: 50%; background: var(--ink); transition: background .5s; }

/* ── FAQ ────────────────────────────────────────────────────────────────
   Native port of the monochrome FAQ component. Carried over: the card stack
   with a pointer-tracked radial glow, the circular plus that rotates to a
   cross, the meta tag, the lift on hover, and the height transition. Left
   behind: its own theme toggle (this page already has one in the header, and
   a second control writing to a different storage key would fight it) and its
   slate palette. */
.faq {
  list-style: none; margin: clamp(30px, 3.5vw, 46px) 0 0; padding: 0;
  max-width: 900px; display: grid; gap: 12px;
}
.fq {
  position: relative; isolation: isolate; overflow: hidden;
  border: 1px solid var(--line); border-radius: 20px;
  background: var(--surface);
  transition: transform .4s var(--ease), border-color .3s, box-shadow .4s var(--ease);
}
.fq:hover, .fq:focus-within { transform: translateY(-2px); border-color: var(--line-strong); }
.fq[data-open="true"] { border-color: var(--brand-line); }

/* the glow follows the pointer; --fx/--fy are written by the handler and fall
   back to the card's centre so a keyboard user still gets the lit state */
.fq-glow {
  position: absolute; inset: 0; z-index: -1; pointer-events: none;
  opacity: 0; transition: opacity .45s var(--ease);
  background: radial-gradient(240px circle at var(--fx, 50%) var(--fy, 50%), var(--brand-soft), transparent 70%);
}
.fq:hover .fq-glow, .fq[data-open="true"] .fq-glow { opacity: 1; }

.fq h3 { margin: 0; font: inherit; }
.fq button {
  display: flex; align-items: flex-start; gap: clamp(14px, 1.6vw, 22px);
  width: 100%; padding: clamp(18px, 2vw, 26px) clamp(18px, 2.2vw, 30px);
  border: 0; background: none; cursor: pointer; font: inherit; text-align: left;
}
.fq button:focus-visible { outline: 2px solid var(--brand); outline-offset: -3px; border-radius: 20px; }

.fq-ic {
  position: relative; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  width: 48px; height: 48px; border-radius: 50%;
  border: 1px solid var(--line-strong); background: var(--surface-2);
  color: var(--ink); transition: transform .45s var(--ease), border-color .3s;
}
.fq:hover .fq-ic { transform: scale(1.06); border-color: var(--brand-line); }
.fq-ic svg { width: 19px; height: 19px; transition: transform .45s var(--ease); }
/* the plus becomes a cross, exactly as the component does it */
.fq[data-open="true"] .fq-ic svg { transform: rotate(45deg); }
.fq[data-open="true"] .fq-ic { border-color: var(--brand); color: var(--brand); }

.fq-tx { display: flex; flex-direction: column; gap: 7px; min-width: 0; flex: 1; }
/* question left, tag hard right — the reference's sm:ml-auto */
.fq-row { display: flex; align-items: center; gap: 16px; }
@media (max-width: 620px) { .fq-row { flex-direction: column; align-items: flex-start; gap: 8px; } }
.fq-q {
  font-size: clamp(15.5px, 1.4vw, 18px); font-weight: 600; line-height: 1.35;
  letter-spacing: -.01em; color: var(--ink);
}
.fq-meta {
  margin-left: auto; flex: none;
  padding: 4px 11px; border: 1px solid var(--line); border-radius: 999px;
  font-size: 11px; font-weight: 600; letter-spacing: .16em;
  text-transform: uppercase; color: var(--muted);
}

/* grid-rows animates to auto height without measuring anything in JS */
.fq-p { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .45s var(--ease); }
.fq[data-open="true"] .fq-p { grid-template-rows: 1fr; }
.fq-p > div { overflow: hidden; min-height: 0; }
.fq-p p {
  margin: 0; padding: 0 clamp(18px, 2.2vw, 30px) clamp(20px, 2.2vw, 28px)
                     calc(48px + clamp(18px, 2.2vw, 30px) + clamp(14px, 1.6vw, 22px));
  font-size: clamp(14px, 1.15vw, 15.5px); line-height: 1.7; color: var(--muted);
}
@media (max-width: 560px) {
  .fq-p p { padding-left: clamp(18px, 2.2vw, 30px); }
  .fq-meta { font-size: 11px; letter-spacing: .12em; }
}
@media (prefers-reduced-motion: reduce) {
  .fq, .fq-ic, .fq-ic svg, .fq-p, .fq-glow { transition: none; }
}


/* ── closing band ───────────────────────────────────────────────────── */
.cta-band { text-align: center; }
.cta-band .lede { margin-inline: auto; }
.cta-band .hero-cta { margin-top: 30px; justify-content: center; }

/* ── footer ─────────────────────────────────────────────────────────── */
/* the footer's own ground is set further down; the hard rule here was the last
   visible seam on the page */
.foot { background: var(--surface-2); }
.foot-in { display: grid; grid-template-columns: 1.3fr 2.7fr; gap: 48px; padding-block: clamp(44px, 5vw, 64px); }
.foot-brand p { margin: 16px 0 0; font-size: 13.5px; line-height: 1.6; color: var(--muted); max-width: 300px; }
.foot-legal { font-size: 12px !important; color: var(--faint) !important; }
.foot-cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px; }
.foot-cols h4 {
  margin: 0 0 12px; font-size: 11.5px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase; color: var(--muted);
}
.foot-cols a {
  display: block; font-size: 13.5px;
  /* padding, not margin — the gap between links has to be part of the hit area,
     otherwise every footer link is a 15px-tall target on a touchscreen */
  padding-block: 5px;
  color: var(--muted); text-decoration: none; transition: color .2s;
}
.foot-cols a:hover { color: var(--ink); }
.foot-bar {
  display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;
  padding-block: 18px; border-top: 1px solid var(--line);
}
.foot-bar p { margin: 0; font-size: 12.5px; color: var(--faint); }
.foot-note { color: var(--muted) !important; }

@media (max-width: 960px) {
  .cards3 { grid-template-columns: 1fr 1fr; }   /* .grid6 sizes itself, see the bento block */
  .foot-in { grid-template-columns: 1fr; gap: 36px; }
  .foot-cols { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 640px) {
  .cards3, .band { grid-template-columns: 1fr; }
  .band { text-align: left; }
}

/* section icon masks */
.scard-ic.mi-board::after, .feat-ic.mi-board::after { -webkit-mask-image: var(--i-board); mask-image: var(--i-board); }
.scard-ic.mi-search::after, .feat-ic.mi-search::after { -webkit-mask-image: var(--i-search); mask-image: var(--i-search); }
.scard-ic.mi-pen::after, .feat-ic.mi-pen::after { -webkit-mask-image: var(--i-pen); mask-image: var(--i-pen); }
.scard-ic.mi-users::after, .feat-ic.mi-users::after { -webkit-mask-image: var(--i-users); mask-image: var(--i-users); }
.scard-ic.mi-code::after, .feat-ic.mi-code::after { -webkit-mask-image: var(--i-code); mask-image: var(--i-code); }
.scard-ic.mi-doc::after, .feat-ic.mi-doc::after { -webkit-mask-image: var(--i-doc); mask-image: var(--i-doc); }
.scard-ic.mi-shield::after, .feat-ic.mi-shield::after { -webkit-mask-image: var(--i-shield); mask-image: var(--i-shield); }
.scard-ic.mi-chart::after, .feat-ic.mi-chart::after { -webkit-mask-image: var(--i-chart); mask-image: var(--i-chart); }
.scard-ic.mi-cap::after, .feat-ic.mi-cap::after { -webkit-mask-image: var(--i-cap); mask-image: var(--i-cap); }
.scard-ic.mi-tools::after, .feat-ic.mi-tools::after { -webkit-mask-image: var(--i-tools); mask-image: var(--i-tools); }
.scard-ic.mi-lab::after, .feat-ic.mi-lab::after { -webkit-mask-image: var(--i-lab); mask-image: var(--i-lab); }
.scard-ic.mi-rocket::after, .feat-ic.mi-rocket::after { -webkit-mask-image: var(--i-rocket); mask-image: var(--i-rocket); }
.scard-ic.mi-book::after, .feat-ic.mi-book::after { -webkit-mask-image: var(--i-book); mask-image: var(--i-book); }
.scard-ic.mi-star::after, .feat-ic.mi-star::after { -webkit-mask-image: var(--i-star); mask-image: var(--i-star); }
.scard-ic.mi-bolt::after, .feat-ic.mi-bolt::after { -webkit-mask-image: var(--i-bolt); mask-image: var(--i-bolt); }
.scard-ic.mi-id::after, .feat-ic.mi-id::after { -webkit-mask-image: var(--i-id); mask-image: var(--i-id); }
.scard-ic.mi-award::after, .feat-ic.mi-award::after { -webkit-mask-image: var(--i-award); mask-image: var(--i-award); }

/* ── touch targets ───────────────────────────────────────────────────────
   Placed at the end of the file on purpose: the base .foot-cols rule sits
   further up, and at equal specificity the later rule is the one that wins. */
@media (max-width: 1024px) {
  .foot-cols a { padding-block: 11px; }   /* ~37px row, thumb-sized */
}

/* ── animated border ─────────────────────────────────────────────────────
   Port of the button-border component. A 20px gradient square rides the
   button's outline via offset-path/offset-distance — the same two properties
   framer-motion was tweening, so CSS drives it directly and no library is
   needed. The overlay is masked to its own border ring so only that 2px band
   shows; everything inside stays the button.

   One deliberate change: the component composites `linear-gradient(transparent,
   transparent)` against black with `mask-composite: intersect`, which
   multiplies to zero alpha and paints nothing. The ring wants border-box MINUS
   padding-box, so both layers are opaque and the operator is `exclude`.

   Colour comes from --brand, so the comet is deep rust on light and the
   lighter orange on dark, matching the rest of the theme. */
.theme-btn, .burger { position: relative; }

.ab {
  position: absolute; inset: -1px;
  border: 2px solid transparent; border-radius: 12px;
  pointer-events: none; overflow: hidden;
  -webkit-mask-image: linear-gradient(#000, #000), linear-gradient(#000, #000);
          mask-image: linear-gradient(#000, #000), linear-gradient(#000, #000);
  -webkit-mask-clip: padding-box, border-box;
          mask-clip: padding-box, border-box;
  -webkit-mask-composite: xor;      /* legacy keyword — same result as exclude */
          mask-composite: exclude;
}
.ab i {
  position: absolute; width: 20px; aspect-ratio: 1;
  background: linear-gradient(90deg, transparent, var(--brand), var(--brand));
  offset-path: rect(0 auto auto 0 round 20px);
  animation: ab-run 5s linear infinite;
}
@keyframes ab-run { from { offset-distance: 0%; } to { offset-distance: 100%; } }

/* offset-path: rect() is recent; without it the square would sit in the corner,
   so fall back to a plain brand hairline rather than a stray dot */
@supports not (offset-path: rect(0 auto auto 0 round 2px)) {
  .ab i { display: none; }
  .ab { border-color: var(--brand-line); }
}
@media (prefers-reduced-motion: reduce) {
  .ab i { animation: none; }
}

/* ── copy sitting on the hero video ──────────────────────────────────────
   End of file on purpose: the base .sub / .assure rules are further up, and
   at equal specificity the later rule wins.

   Measured against the brightest part of the aurora, the muted greys fell to
   4.26:1 and 2.21:1 — under AA. Darkening the copy fixes that without
   thickening the veil, so the backdrop stays as visible as it was asked to be.
   Only the two lines that sit on the video change; everything lower is behind
   an opaque scrim and keeps the normal tokens. */
@media (max-width: 1024px) {
  .sub    { color: #35353f; }
  .assure { color: #45454f; }
  :root[data-theme="dark"] .sub    { color: #e2d9d3; }
  :root[data-theme="dark"] .assure { color: #c7bbb3; }
}

/* ── hero entrance ───────────────────────────────────────────────────────
   Port of the AcmeHero component's motion choreography: every element starts
   at opacity 0, offset 20px down, and fades up in a staggered cascade —
   headline 0.2s, copy 0.3s, buttons 0.4s, then the preview last at 0.6s from
   40px over 0.8s, exactly the delays and durations the component declares.

   framer-motion's `initial`/`animate` pair maps onto a keyframe with
   `animation-fill-mode: both`: `both` holds the from-state through the delay,
   which is what `initial` does, and holds the end-state afterwards. No
   library, and nothing here touches layout — only opacity and transform, so
   the entrance cannot shift the page as it plays. */

@keyframes hero-rise {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: none; }
}
@keyframes hero-rise-far {
  from { opacity: 0; transform: translateY(40px); }
  to   { opacity: 1; transform: none; }
}

.hero-copy > *,
.hero-rot,
.dash-wrap,
.marquee { animation: hero-rise .5s var(--ease) both; }

.hero-copy > .pill-note { animation-delay: .05s; }
.hero-copy > h1         { animation-delay: .2s; }
.hero-copy > .sub       { animation-delay: .3s; }
.hero-copy > .hero-cta  { animation-delay: .4s; }
.hero-copy > .assure    { animation-delay: .46s; }
.hero-copy > .stats     { animation-delay: .52s; }

/* the preview arrives last, from further away and more slowly — the component's
   one deliberate departure from the 20px/0.5s rhythm above */
/* the label lands just before the window it captions */
.hero-rot  { animation-delay: .54s; }
.dash-wrap { animation: hero-rise-far .8s var(--ease) both; animation-delay: .6s; }
.marquee   { animation-delay: .78s; }

@media (prefers-reduced-motion: reduce) {
  .hero-copy > *, .hero-rot, .dash-wrap, .marquee { animation: none; }
}

/* ── desktop hero grid: dulled ───────────────────────────────────────────
   --grid and --grid-hi are read in exactly two places, .hero::before and
   .hero::after, and both are display:none at ≤1024 where the video backdrop
   takes over. Scoping to min-width 1025 anyway, so "desktop only" is enforced
   by the rule rather than by that coincidence holding true later.

   Baseline drops .08 → .034 and the pointer spotlight .34 → .13 — roughly
   2.4× fainter, so the lattice reads as a texture that answers the cursor
   rather than a drawn grid. */
@media (min-width: 1025px) {
  :root {
    --grid: rgba(10,10,16,.034);
    --grid-hi: rgba(10,10,16,.13);
  }
  :root[data-theme="dark"] {
    --grid: rgba(255,255,255,.032);
    --grid-hi: rgba(255,255,255,.12);
  }
}

/* ── who we are ──────────────────────────────────────────────────────────
   Port of AboutSection3. Kept: the clip-path banner, the stat cluster, the
   staggered blur-and-rise reveal (TimelineContent) and the per-word cut
   reveal on the headline (VerticalCutReveal).

   Dropped: the whole social-icon row, on request — those belong in the
   footer, and four external SVGs hotlinked from a demo host is not something
   this site should ship regardless.

   Retimed: the source staggers TimelineContent by `i * 0.4s` across 15
   elements, so the last one starts six seconds after the section appears, and
   its headline carries an additional 3s delay on top. That reads as broken
   rather than deliberate on a real page. Same choreography at 0.09s per step
   — the last element lands just under a second in.

   Realigned: the source right-aligns its closing column. Every other section
   here sits on one left rail, so that column is left-aligned too. */

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.about { position: relative; padding: clamp(56px, 7vw, 96px) 0; }
.about::before {
  content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(180deg, transparent, var(--surface-2) 14%, var(--surface-2) 86%, transparent);
}

.ab-kicker {
  display: flex; align-items: center; gap: 10px; margin: 0 0 22px;
  font-size: 12px; font-weight: 700; letter-spacing: .12em;
  text-transform: uppercase; color: var(--muted);
}
.ab-star { color: var(--brand); font-size: 15px; animation: ab-spin 9s linear infinite; }
@keyframes ab-spin { to { transform: rotate(360deg); } }

.ab-fig { margin: 0; }
/* the <svg> only carries the clipPath definition now — it must not take space */
.ab-clipdef { position: absolute; width: 0; height: 0; overflow: hidden; }
/* clipPathUnits="objectBoundingBox" means the notch scales with the box, so one
   path fits every viewport without a second asset or a media query */
.ab-clip {
  position: relative; width: 100%; height: clamp(190px, 26vw, 360px);
  overflow: hidden; background: var(--surface-2);
  -webkit-clip-path: url(#ab-clip); clip-path: url(#ab-clip);
}
.ab-clip video {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; object-fit: cover;
}

/* ── stat cluster ───────────────────────────────────────────────────── */
.ab-stats {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 24px; flex-wrap: wrap; padding: 20px 0 clamp(28px, 4vw, 48px);
}
.ab-small { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.ab-small p { margin: 0; font-size: 14px; color: var(--muted); }
.ab-small b, .ab-big b { color: var(--brand); font-weight: 700; }
.ab-sep { color: var(--line-strong); }
.ab-big { text-align: right; }
.ab-big p { margin: 0; }
.ab-big p:first-child {
  font-size: clamp(26px, 3.4vw, 42px); font-weight: 600; letter-spacing: -.03em; line-height: 1;
}
.ab-big p:first-child span { color: var(--ink); text-transform: uppercase; font-size: .62em; letter-spacing: .02em; }
.ab-note { margin-top: 6px !important; font-size: 13px; color: var(--faint); }

/* ── body ───────────────────────────────────────────────────────────── */
.ab-body { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: clamp(32px, 5vw, 72px); }
.ab-h {
  margin: 0 0 clamp(24px, 3vw, 36px); max-width: 20ch;
  font-family: var(--font-display);
  font-size: clamp(31px, 3.8vw, 52px); line-height: 1.08;
  letter-spacing: -.01em; font-weight: 400; color: var(--ink);
}
.ab-cols { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(24px, 3vw, 40px); }
.ab-cols p { margin: 0; font-size: 14.5px; line-height: 1.7; color: var(--muted); }

.ab-side { display: flex; flex-direction: column; align-items: flex-start; }
.ab-name { margin: 0; }
.ab-name .brand-mark { width: 116px; height: 44px; }
.ab-role { margin: 8px 0 0; font-size: 13px; color: var(--muted); }
.ab-ask { margin: clamp(20px, 3vw, 30px) 0 18px; font-size: 15px; line-height: 1.55; font-weight: 500; color: var(--ink); }
.ab-cta {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 12px 20px; border-radius: 10px; text-decoration: none;
  background: var(--ink); color: var(--on-brand);
  font-size: 14px; font-weight: 600;
  box-shadow: 0 10px 26px -12px rgba(var(--sh), .5);
  transition: gap .3s var(--ease), transform .2s var(--ease);
}
.ab-cta:hover { gap: 14px; transform: translateY(-1px); }
.ab-cta svg { width: 15px; height: 15px; flex: none; }

/* ── reveal (TimelineContent) ───────────────────────────────────────── */
.tl { opacity: 0; transform: translateY(-20px); filter: blur(10px); }
.about.in .tl {
  animation: tl-in .5s var(--ease) both;
  animation-delay: calc(var(--n, 0) * .09s);
}
@keyframes tl-in {
  from { opacity: 0; transform: translateY(-20px); filter: blur(10px); }
  to   { opacity: 1; transform: none; filter: blur(0); }
}

/* ── headline cut reveal (VerticalCutReveal) ────────────────────────── */
.ab-h .vc { display: inline-flex; overflow: hidden; vertical-align: bottom; }
.ab-h .vc > span { display: inline-block; transform: translateY(-110%); }
.about.in .ab-h .vc > span {
  animation: vc-in .62s cubic-bezier(.22, 1.08, .36, 1) both;
  animation-delay: calc(.15s + var(--w) * .06s);
}
@keyframes vc-in { to { transform: none; } }

@media (max-width: 860px) {
  .ab-stats { align-items: flex-start; }
  .ab-small { display: grid; gap: 4px; }
  .ab-sep { display: none; }        /* stacked, it strands at the line start */
  .ab-big { text-align: left; }
  .ab-body { grid-template-columns: minmax(0, 1fr); }
  .ab-cols { grid-template-columns: minmax(0, 1fr); }
  .ab-side { border-top: 1px solid var(--line); padding-top: clamp(24px, 5vw, 34px); }
}

@media (prefers-reduced-motion: reduce) {
  .tl, .about.in .tl { animation: none; opacity: 1; transform: none; filter: none; }
  .ab-h .vc > span, .about.in .ab-h .vc > span { animation: none; transform: none; }
  .ab-star { animation: none; }
}

/* ── sticky footer ───────────────────────────────────────────────────────
   Port of StickyFooter. The reveal is the component's: the <footer> is a
   fixed-height box carrying a clip-path, which makes it the containing block
   for the position:fixed layer inside it. That layer is pinned to the bottom
   of the viewport but painted only where the footer's box has scrolled into
   view, so the page appears to slide up off the footer rather than push it.

   Adapted: the source hard-codes 720px in three places (height, height, and
   the sticky top offset). One custom property drives all three here, because
   this footer holds less than the source's 54 links and 720px would leave a
   third of it empty. The radial decorations become three positioned blobs on
   --ink instead of Tailwind's --theme() colour function.

   Below 861px the mechanic is dropped entirely: the stacked footer is taller
   than any sensible fixed height, and a fixed layer that overflows its clip
   would strand the last links off-screen with no way to reach them. */

.foot {
  --foot-h: clamp(460px, 62vh, 620px);
  position: relative; width: 100%; height: var(--foot-h);
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  background: var(--surface-2);
}
.foot-fixed { position: fixed; bottom: 0; left: 0; width: 100%; height: var(--foot-h); }
.foot-stick { position: sticky; top: calc(100vh - var(--foot-h)); height: 100%; overflow-y: auto; }
.foot-panel {
  position: relative; display: flex; flex-direction: column; justify-content: space-between;
  min-height: 100%; padding-block: clamp(30px, 4vw, 48px) 0;
  background: linear-gradient(180deg, var(--bg), var(--surface-2) 22%);
}

/* the source's three rotated radial washes */
.foot-glow { position: absolute; inset: 0; z-index: 0; overflow: hidden; pointer-events: none; }
.foot-glow i {
  position: absolute; top: 0; left: 0; border-radius: 50%;
  transform-origin: top left; rotate: -45deg;
}
.foot-glow i:nth-child(1) {
  width: 560px; height: 1280px; translate: 0 -350px;
  background: radial-gradient(68% 69% at 55% 31%, rgba(var(--sh), .07) 0, rgba(var(--sh), .02) 50%, transparent 80%);
}
.foot-glow i:nth-child(2) {
  width: 240px; height: 1280px; translate: 5% -50%;
  background: radial-gradient(50% 50% at 50% 50%, rgba(var(--sh), .05) 0, rgba(var(--sh), .01) 80%, transparent 100%);
}
.foot-glow i:nth-child(3) {
  width: 240px; height: 1280px; translate: 0 -350px;
  background: radial-gradient(50% 50% at 50% 50%, rgba(var(--sh), .05) 0, rgba(var(--sh), .01) 80%, transparent 100%);
}
:root[data-theme="dark"] .foot-glow i:nth-child(1) {
  background: radial-gradient(68% 69% at 55% 31%, rgba(255,255,255,.05) 0, rgba(255,255,255,.015) 50%, transparent 80%);
}
:root[data-theme="dark"] .foot-glow i:nth-child(2),
:root[data-theme="dark"] .foot-glow i:nth-child(3) {
  background: radial-gradient(50% 50% at 50% 50%, rgba(255,255,255,.035) 0, rgba(255,255,255,.01) 80%, transparent 100%);
}

/* .foot-panel is a column flex container, and .wrap carries `margin: 0 auto`.
   Auto inline margins on a flex item cancel the default stretch, so the block
   shrank to its content and centred itself 25px off the page's left rail. */
.foot-in, .foot-bar { position: relative; z-index: 1; width: 100%; }

/* social row — the icons this footer was always meant to carry */
.foot-social { display: flex; gap: 8px; margin-top: 18px; }
.foot-social a {
  width: 34px; height: 34px; border-radius: 9px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--line); background: var(--surface);
  color: var(--muted); transition: color .2s, border-color .2s, transform .2s var(--ease);
}
.foot-social a:hover { color: var(--brand); border-color: var(--brand-line); transform: translateY(-1px); }
.foot-social svg { width: 17px; height: 17px; }

/* reveal, matching the component's blur/rise/stagger */
.fa { opacity: 0; transform: translateY(-8px); filter: blur(4px); }
.foot.in .fa {
  animation: fa-in .8s var(--ease) both;
  animation-delay: calc(.1s + var(--n, 0) * .1s);
}
@keyframes fa-in { to { opacity: 1; transform: none; filter: blur(0); } }

@media (max-width: 860px) {
  .foot { height: auto; clip-path: none; }
  .foot-fixed { position: static; height: auto; }
  .foot-stick { position: static; height: auto; overflow: visible; }
  .foot-panel { min-height: 0; }
  .foot-glow { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .fa, .foot.in .fa { animation: none; opacity: 1; transform: none; filter: none; }
}


/* ── WebGL deck ──────────────────────────────────────────────────────────
   The canvas is added by deck3d.js and only takes over once all four textures
   have uploaded — until then, and on any machine without WebGL, the CSS cards
   underneath are what renders. The <img> elements stay in the DOM permanently:
   they are the texture source, the alt text, and the no-GL fallback in one. */
/* the canvas is deliberately larger than the deck so cards can fly past its
   edges — which means it must not exist until GL actually owns the deck, or it
   overflows the page on any layout where the deck is full width */
.deck-gl { display: none; }
.deck.gl .deck-gl { display: block; position: absolute; inset: 0; width: 100%; height: 100%; }
.deck.gl .dcard { opacity: 0 !important; pointer-events: none; }

/* ── WebGL deck ──────────────────────────────────────────────────────────
   The canvas is added by deck3d.js and only takes over once all four textures
   have uploaded — until then, and on any machine without WebGL, the CSS cards
   underneath are what renders. The <img> elements stay in the DOM permanently:
   they are the texture source, the alt text, and the no-GL fallback in one. */
/* the canvas is deliberately larger than the deck so cards can fly past its
   edges — which means it must not exist until GL actually owns the deck, or it
   overflows the page on any layout where the deck is full width */
.deck-gl { display: none; }
.deck.gl .deck-gl { display: block; position: absolute; inset: 0; width: 100%; height: 100%; }
.deck.gl .dcard { opacity: 0 !important; pointer-events: none; }

/* ── stage section ───────────────────────────────────────────────────────
   Full-bleed and committed dark in both themes. This is the one place on the
   site that stops being a document and becomes a scene, so it sets its own
   colour rather than inheriting: pale rust on near-white had no depth to it,
   and the 3D needs black to read against.

   Four elements per frame. Everything is sized off the viewport so the
   composition holds from a laptop to a 5K display. */

.story {
  --ink-3d: #f4efec;
  --dim-3d: #ab9f97;
  position: relative;
  background: #080706;
  color: var(--ink-3d);
}
/* the scene sits behind everything, edge to edge */
.deck { position: absolute; inset: 0; z-index: 0; }
.dcard {
  position: absolute; inset: 0; margin: 0; opacity: 0;
  transition: opacity .8s var(--ease);
}
.dcard[data-pos="0"] { opacity: .5; }
.dcard img { width: 100%; height: 100%; object-fit: cover; display: block; }


.st-stack { position: relative; min-height: 46vh; }

.st.on { opacity: 1; pointer-events: auto; }

.st-ix span { color: var(--brand-2); margin-right: 16px; }


/* type arrives heavy and slow — the single biggest difference between motion
   that feels expensive and motion that feels like a toy */
.st > * { opacity: 0; transform: translate3d(0, 34px, 0); }
.st.on > *:nth-child(1) { transition-delay: .06s }
.st.on > *:nth-child(2) { transition-delay: .14s }
.st.on > *:nth-child(3) { transition-delay: .24s }

/* one progress line replaces the dots and the counter it used to sit beside */

@media (max-width: 860px) {
  .story-panel { position: static; height: auto; padding-block: clamp(64px, 12vw, 104px); }
  .deck { position: static; }
  .st-stack { position: static; min-height: 0; }
  .st { position: static; opacity: 1; pointer-events: auto; padding-block: clamp(38px, 9vw, 60px); }
  .st > * { opacity: 1; transform: none; }
  .dcard {
    position: static; opacity: 1; margin: clamp(22px, 5vw, 34px) 0 0;
    aspect-ratio: 16/9; border-radius: 14px; overflow: hidden;
  }
  .story-rail { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .st, .st > *, .dcard { transition: none; }
}

/* ── stage section ───────────────────────────────────────────────────────
   Rejoined to the page. This used to set its own near-black canvas, which
   made the site read as two different websites with a hard seam between
   them. It now inherits the theme like every other section: the drama comes
   from one large contained scene panel, not from inverting the page. */

.story { position: relative; background: transparent; }
.story-panel {
  position: sticky; top: 0; height: 100vh; overflow: hidden;
  display: grid; align-items: center;
}
.story-grid {
  position: relative; z-index: 2;
  width: 100%; max-width: var(--shell); margin-inline: auto;
  padding-inline: var(--gutter);
  display: grid; align-items: center;
  grid-template-columns: minmax(0, .92fr) minmax(0, 1.08fr);
  column-gap: clamp(32px, 4.5vw, 78px);
}

.st-stack { position: relative; min-height: clamp(300px, 40vh, 440px); }
.st {
  position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center;
  opacity: 0; pointer-events: none; transition: opacity .9s var(--ease);
}
.st.on { opacity: 1; pointer-events: auto; }

.st-ix {
  margin: 0 0 clamp(16px, 1.8vw, 26px);
  font-size: clamp(11px, .85vw, 13px); font-weight: 700;
  letter-spacing: .3em; text-transform: uppercase; color: var(--muted);
}
.st-ix span { color: var(--brand); margin-right: 14px; }

/* Instrument Serif ships a single 400 weight — 600 here had the browser
   synthesising a bold and smearing the strokes. Tracking relaxed to match: a
   serif at display size needs a fraction of what a grotesque wants. */
.st h2 {
  font-family: var(--font-display);
  margin: 0; max-width: 15ch;
  font-size: clamp(36px, 4.7vw, 74px); line-height: 1;
  letter-spacing: -.015em; font-weight: 400; color: var(--ink);
}
.st-d {
  margin: clamp(20px, 2.4vw, 30px) 0 0; max-width: 46ch;
  font-size: clamp(15px, 1.15vw, 17px); line-height: 1.65; color: var(--muted);
}

/* The publication caveat. Inherits colour and sizes in em, so it reads as a
   quieter aside in both the 3D stage and the stacked one without needing a
   value for either. */
.st-note {
  display: block; margin-top: .8em;
  font-size: .87em; line-height: 1.55; opacity: .74;
}

.st > * { opacity: 0; transform: translate3d(0, 28px, 0); }
.st.on > * {
  opacity: 1; transform: none;
  transition: opacity 1s cubic-bezier(.16,1,.3,1), transform 1.1s cubic-bezier(.16,1,.3,1);
}
.st.on > *:nth-child(1) { transition-delay: .06s }
.st.on > *:nth-child(2) { transition-delay: .14s }
.st.on > *:nth-child(3) { transition-delay: .24s }

/* the scene: a contained panel, not the section background */
.deck {
  position: relative; aspect-ratio: 4 / 3; max-height: 66vh;
  border-radius: 22px; overflow: hidden;
  background: #0b0a09;
  box-shadow: 0 50px 100px -46px rgba(var(--sh), .5), 0 12px 30px -22px rgba(var(--sh), .3);
}
.dcard { position: absolute; inset: 0; margin: 0; opacity: 0; transition: opacity .8s var(--ease); }
.dcard[data-pos="0"] { opacity: 1; }
.dcard img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* progress reads as a hairline under the copy, not a bar across the page */
.story-rail {
  position: absolute; left: var(--gutter); bottom: clamp(28px, 5vh, 56px); z-index: 3;
  width: clamp(160px, 22vw, 300px); height: 2px; border-radius: 2px;
  background: var(--line);
  right: 0;
}
.story-rail i {
  display: block; height: 100%; width: 100%; border-radius: 2px;
  transform-origin: left center; transform: scaleX(var(--fill, 0));
  background: linear-gradient(90deg, var(--brand), var(--brand-2));
  transition: transform .25s linear;
}

@media (max-width: 860px) {
  .story-panel { position: static; height: auto; padding-block: clamp(52px, 10vw, 84px); }
  .story-grid { grid-template-columns: minmax(0, 1fr); }
  .st-stack { position: static; min-height: 0; }
  .st { position: static; opacity: 1; pointer-events: auto; padding-block: clamp(30px, 7vw, 46px); }
  .st > * { opacity: 1; transform: none; }
  .deck { position: static; aspect-ratio: 16/10; max-height: none; margin-top: clamp(20px, 5vw, 30px); }
  .dcard { position: static; opacity: 1; }
  .story-rail { display: none; }
}

@media (prefers-reduced-motion: reduce) { .st, .st > *, .dcard { transition: none; } }

/* ── kinetic mobile navigation ───────────────────────────────────────────
   Port of the Sterling Gate menu. Its structure is kept — an overlay, three
   backdrop layers that slide in staggered, links that rise and unrotate, a
   label that swaps Menu/Close and an icon that turns 315° — and its GSAP
   timeline is rebuilt on the Web Animations API in nav.js. gsap and
   CustomEase are not needed: the whole sequence is six tweens.

   What is NOT kept is its content or its palette. The component ships five
   flat links; this drawer carries three menus, 37 items and the account
   panel, so the presentation is applied to what is already there. Its
   indigo/violet/pink shapes become the site's rust, since a second palette
   would undo the theme work. */

.mobile-nav { position: fixed; inset: var(--hdr) 0 0; z-index: 55; }
.mobile-nav[hidden] { display: none; }
.mn-overlay {
  position: absolute; inset: 0; opacity: 0;
  background: rgba(var(--sh), .34);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}

/* the panel itself carries no background now — the layers behind it do */
.mobile-panel {
  position: absolute; inset: 0; z-index: 1;
  display: flex; flex-direction: column;
  background: transparent; border-top: 0; animation: none;
  overflow: hidden;
}
.mn-bg { position: absolute; inset: 0; z-index: -1; overflow: hidden; }
.mn-layer {
  position: absolute; inset: 0; display: block;
  transform: translateX(101%);
  background: var(--surface);
}
.mn-layer:nth-child(1) { background: var(--brand); }
.mn-layer:nth-child(2) { background: var(--brand-line); }
:root[data-theme="dark"] .mn-layer:nth-child(2) { background: var(--surface-2); }

/* ambient shapes — the component's five, redrawn on the brand */
.mn-shapes { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; }
.mn-el {
  fill: var(--brand); stroke: var(--brand-2);
  opacity: .055; transform-box: fill-box; transform-origin: center;
}
.mn-el:nth-child(even) { fill: var(--brand-2); opacity: .04; }
:root[data-theme="dark"] .mn-el { opacity: .07; }
:root[data-theme="dark"] .mn-el:nth-child(even) { opacity: .05; }
.mobile-nav[data-nav="open"] .mn-shapes { opacity: 1; transition: opacity .8s var(--ease) .35s; }

.mp-scroll { position: relative; z-index: 2; }

/* every row rises and unrotates, exactly as the component's links do */
.mp-scroll > *, .mp-foot > * { will-change: transform, opacity; }

/* ── the Menu / Close button ─────────────────────────────────────────── */
.burger {
  width: auto; gap: 10px; padding: 0 12px 0 14px;
  overflow: hidden;
}
.bg-tx {
  position: relative; display: block; height: 17px; overflow: hidden;
  font-size: 13px; font-weight: 600; letter-spacing: .01em;
}
.bg-tx em {
  display: block; height: 17px; line-height: 17px; font-style: normal;
  transition: transform .5s var(--ease);
}
.burger[aria-expanded="true"] .bg-tx em { transform: translateY(-100%); }
.bg-ic { display: block; width: 12px; height: 12px; color: var(--ink); transition: transform .55s var(--ease); }
.bg-ic svg { width: 100%; height: 100%; display: block; }
.burger[aria-expanded="true"] .bg-ic { transform: rotate(315deg); }

@media (prefers-reduced-motion: reduce) {
  .bg-tx em, .bg-ic, .mn-shapes { transition: none; }
}

/* The label stays at every width. It used to be dropped below 420px because
   the header's 32px flex gap left no room for it — tightening the gap and the
   button's own padding buys back more than the word costs, so "Menu" survives
   down to 320. */
@media (max-width: 420px) {
  .hdr-inner { gap: 12px; }
  .burger { padding: 0 10px 0 12px; gap: 8px; }
  .bg-tx { font-size: 12.5px; }
}

/* ══ light-mode brand header ═══════════════════════════════════════════
   The bar itself carries the brand in light mode. Scoped with :not(dark)
   rather than [data-theme="light"] so it still applies before the pre-paint
   script runs, and appended last so it wins at equal specificity against the
   header block above.

   Not a flat fill: a shallow gradient across the bar keeps a 1600px-wide
   block of saturated colour from going dead in the middle. Dark mode is
   untouched — the bar stays near-black there, where an orange band would
   glare. */
:root:not([data-theme="dark"]) .site-header {
  background: linear-gradient(102deg, #9c370c 0%, #b4400f 44%, #c2551d 100%);
  color: #fff;
}
:root:not([data-theme="dark"]) .site-header.scrolled {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .18),
              0 12px 34px -10px rgba(140, 48, 10, .45);
}

/* Every rule below is scoped to .site-header. The brand lockup also appears in
   the footer — unscoped, knocking it out to white made the footer logo
   invisible on its white panel. */
/* wordmark, and the badge inverts so it stays legible on its own ground */
:root:not([data-theme="dark"]) .site-header .brand { color: #fff; }
:root:not([data-theme="dark"]) .site-header .brand-mark { --logo-ink: #fff; }

/* nav: .88 white rather than pure, so the active item still has somewhere
   brighter to go — and it clears 4.5:1 on this ground either way */
:root:not([data-theme="dark"]) .site-header .nav-links > a,
:root:not([data-theme="dark"]) .site-header .menu-trigger { color: rgba(255, 255, 255, .88); }
:root:not([data-theme="dark"]) .site-header .nav-links > a:hover,
:root:not([data-theme="dark"]) .site-header .menu-trigger:hover,
:root:not([data-theme="dark"]) .site-header .menu-trigger[aria-expanded="true"] {
  color: #fff; background: rgba(255, 255, 255, .14);
}

/* auth: the primary CTA inverts to white, which makes it the highest-contrast
   element on the bar — where a primary action belongs */
:root:not([data-theme="dark"]) .site-header .nav-signin { color: #fff; }
:root:not([data-theme="dark"]) .site-header .nav-signin:hover { background: rgba(255, 255, 255, .14); }
:root:not([data-theme="dark"]) .site-header .nav-signup {
  background: #fff; color: var(--brand);
}
:root:not([data-theme="dark"]) .site-header .nav-signup:hover {
  box-shadow: 0 8px 20px -8px rgba(0, 0, 0, .45);
}

/* icon buttons */
:root:not([data-theme="dark"]) .site-header .theme-btn,
:root:not([data-theme="dark"]) .site-header .burger {
  border-color: rgba(255, 255, 255, .3);
  background: rgba(255, 255, 255, .08);
  color: #fff;
}
:root:not([data-theme="dark"]) .site-header .theme-btn:hover,
:root:not([data-theme="dark"]) .site-header .burger:hover {
  border-color: rgba(255, 255, 255, .55);
  background: rgba(255, 255, 255, .16);
}

/* ══ comparison table ══════════════════════════════════════════════════
   Laid out to the reference: centred heading and standfirst, right-aligned
   row labels over a lattice block, a bloom beneath it, light spilling below,
   a lattice strip in every column gutter, and our column as one solid block.

   The table carries explicit ARIA roles because the stacking breakpoint sets
   display:block on table elements, which silently strips their implicit roles
   — a screen reader would otherwise stop announcing "row, GitHub, No". */
.sec h2.cmp-h {
  /* .sec h2 is (0,1,1) and caps the measure at 18ch, which pins a centred line
     to the left — this has to out-specify it, not merely come later */
  margin: 0; max-width: none; text-align: center;
  font-family: var(--font-display); font-weight: 400;
  font-size: clamp(34px, 4.4vw, 60px); line-height: 1.06; letter-spacing: -.012em;
  color: var(--ink);
}
.cmp-sub {
  margin: 14px auto 0; max-width: 62ch; text-align: center;
  font-size: clamp(14px, 1.2vw, 16.5px); line-height: 1.6; color: var(--muted);
}

/* geometry shared by the table and the backdrop, so the strips land exactly in
   the gutters rather than being nudged into place by eye */
.cmp-stage {
  --lblw: 39%;                 /* label block */
  --colw: 15.25%;              /* each verdict column */
  position: relative; margin-top: clamp(38px, 4.5vw, 68px);
}
.cmp-fx { position: absolute; inset: -6px 0 -8px; pointer-events: none; overflow: hidden; z-index: 0; }
.cmp-fx i { position: absolute; display: block; }

/* bloom sits UNDER the lattice — in the reference the grid lines read over it */
.cf-bloom {
  top: 0; bottom: 0; left: 0; width: var(--lblw);
  background:
    radial-gradient(58% 44% at 62% 44%, rgba(120, 88, 196, .30) 0, transparent 70%),
    radial-gradient(46% 40% at 90% 88%, rgba(226, 120, 70, .30) 0, transparent 72%);
}
.cf-grid, .cf-strip {
  background-image:
    linear-gradient(to right, var(--cmp-line) 1px, transparent 1px),
    linear-gradient(to bottom, var(--cmp-line) 1px, transparent 1px);
  background-size: 26px 26px;
}
.cf-grid { top: 0; bottom: 0; left: 0; width: var(--lblw); }
/* light spilling out from under the block */
.cf-glow {
  left: 8%; width: 30%; height: 190px; bottom: -100px;
  background: radial-gradient(50% 50% at 50% 24%, rgba(255, 236, 224, .16) 0, transparent 70%);
  filter: blur(20px);
}
/* one strip per gutter, positioned off the same column arithmetic as the table */
.cf-strip {
  top: 0; bottom: 0; width: 30px;
  left: calc(var(--lblw) + var(--colw) * (var(--at) - 1));
  -webkit-mask-image: linear-gradient(to bottom, transparent, #000 7%, #000 92%, transparent);
  mask-image: linear-gradient(to bottom, transparent, #000 7%, #000 92%, transparent);
}
:root { --cmp-line: rgba(20, 19, 16, .16); }
:root[data-theme="dark"] { --cmp-line: rgba(255, 255, 255, .14); }

.cmp { position: relative; z-index: 1; width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0; }
.cmp .ch-void { width: var(--lblw); }
.cmp thead th { width: var(--colw); }

/* ── column headers ───────────────────────────────────────────────────── */
.cmp thead th.ch { padding: 0 6px 22px; vertical-align: bottom; text-align: center; }
.ch-in { display: inline-flex; align-items: center; gap: 8px; }
.ch-logo { width: 22px; height: 22px; flex: none; }
.ch-logo svg { width: 100%; height: 100%; display: block; }
.lg-gh svg { fill: var(--ink); }
.lg-tu { color: var(--ink); }
.lg-us { color: var(--on-brand); }
.ch-t { font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: var(--ink); white-space: nowrap; }
/* our column: header block, then the body block, as two pieces like the reference */
.cmp thead th.cmp-us {
  padding: 16px 6px; vertical-align: middle;
  background: var(--brand); border-radius: 4px;
}
.cmp thead th.cmp-us .ch-t { color: var(--on-brand); }
/* the mark sits on the brand block: white plate, brand letter — currentColor
   alone would paint it near-black on orange in the dark theme */
.cmp thead th.cmp-us .lg-us { color: #fff; }

/* ── rows ─────────────────────────────────────────────────────────────── */
.cmp tbody th {
  padding: 30px 30px 30px 0;
  font-size: clamp(13px, 1.15vw, 15.5px); font-weight: 400; line-height: 1.45;
  color: var(--ink); text-align: right; vertical-align: middle;   /* right-aligned, as the reference */
}
.cmp td { padding: 30px 8px; text-align: center; vertical-align: middle; }
.cmp td.cmp-us { background: var(--brand); }
/* Parts the header block from the body block. font-size/line-height are zeroed
   because an empty cell still generates a line box, which propped the row open
   to 30px regardless of the height asked for. */
.cmp tbody tr.cmp-gap td {
  padding: 0; height: 6px; background: none;
}
.cmp tbody tr:nth-child(2) td.cmp-us { border-radius: 4px 4px 0 0; }
.cmp tbody tr:last-child  td.cmp-us { border-radius: 0 0 4px 4px; }

/* only cells that carry a verdict get a disc — unscoped, this also generated a
   30px mark inside the spacer row and held it open regardless of its height */
.cmp td[data-v]::before {
  content: ''; display: inline-block; width: 30px; height: 30px;
  border-radius: 50%; vertical-align: middle;
  background-repeat: no-repeat; background-position: center; background-size: 14px 14px;
}
.cmp td[data-v="y"]::before {
  background-color: rgba(45, 138, 86, .17);
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><path d="M2 6.3l2.7 2.7L10 3.4" fill="none" stroke="%233ecf8e" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg>');
}
.cmp td[data-v="n"]::before {
  background-color: rgba(190, 55, 48, .17);
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><path d="M3.3 3.3l5.4 5.4M8.7 3.3l-5.4 5.4" fill="none" stroke="%23f2635a" stroke-width="1.7" stroke-linecap="round"/></svg>');
}
/* our ticks: a light disc on the brand block, as in the reference */
.cmp td.cmp-us[data-v="y"]::before {
  background-color: rgba(255, 255, 255, .26);
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><path d="M2 6.3l2.7 2.7L10 3.4" fill="none" stroke="%23ffffff" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/></svg>');
}

/* the label block gives ground before anything is allowed to crowd */
@media (max-width: 1080px) {
  .cmp-stage { --lblw: 34%; --colw: 22%; }
  .cmp thead th.ch { padding-bottom: 18px; }
  .ch-t { font-size: 13px; }
  .ch-logo { width: 19px; height: 19px; }
  .cmp tbody th, .cmp td { padding-top: 24px; padding-bottom: 24px; }
  .cmp tbody th { padding-right: 20px; }
}
@media (max-width: 880px) {
  .ch-in { flex-direction: column; gap: 6px; }
  .ch-t { font-size: 11.5px; white-space: normal; text-align: center; }
}

/* ── narrow: still one matrix, never split into per-row cards ───────────
   The table stays a table at every width. Below 640 the column names drop to
   their logos — the marks and the row labels are what carry the meaning, and
   the names cost ~90px each that the verdict columns need. Nothing scrolls
   sideways and nothing is cut off. */
@media (max-width: 880px) {
  .cmp-stage { --lblw: 40%; --colw: 15%; }
  .cmp tbody th { padding-right: 12px; }
  .cmp td { padding-inline: 4px; }
}
@media (max-width: 640px) {
  .cmp-stage { --lblw: 44%; --colw: 14%; }
  .cmp thead th.ch { padding: 0 2px 14px; }
  .ch-in { flex-direction: column; gap: 0; }
  .ch-t { display: none; }                 /* the logo identifies the column */
  .ch-logo { width: 22px; height: 22px; }
  .cmp thead th.cmp-us { padding: 12px 2px; }
  .cmp tbody th {
    padding: 16px 10px 16px 0; font-size: 12.5px; line-height: 1.4;
    overflow-wrap: anywhere;
  }
  .cmp td { padding: 16px 2px; }
  .cmp td[data-v]::before { width: 24px; height: 24px; background-size: 11px 11px; }
}
@media (max-width: 400px) {
  .cmp-stage { --lblw: 46%; --colw: 13.5%; }
  .ch-logo { width: 19px; height: 19px; }
  .cmp tbody th { font-size: 11.5px; padding-right: 8px; }
  .cmp td[data-v]::before { width: 21px; height: 21px; background-size: 10px 10px; }
}

/* ── closing the comparison: what each audience walks away with ─────────
   Reference layout — a standing headline on the left, two coloured cards to
   its right, each with a banded header and icon rows. The cards keep their own
   tint in both themes (they are objects on the page, not surfaces), so their
   ink is fixed dark rather than following --ink. Tints stay in the warm family
   instead of the reference's purple/yellow. */
.conf {
  display: grid; align-items: start;
  grid-template-columns: minmax(0, .84fr) minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(18px, 2.2vw, 32px);
  margin-top: clamp(48px, 6vw, 88px);
}
.conf-lede { padding-top: 6px; }
.conf-lede h3 {
  margin: 0; font-family: var(--font-display); font-weight: 400;
  font-size: clamp(30px, 3.4vw, 50px); line-height: 1.04; letter-spacing: -.014em;
  color: var(--ink);
}
.conf-lede p { margin: 14px 0 0; font-size: 14px; line-height: 1.6; color: var(--muted); }

.conf-card { --ink-c: #1a1310; border-radius: 4px; overflow: hidden; }
.cc-a { background: #f6dccb; }
.cc-a > header { background: #eec5a8; }
.cc-b { background: #f8e7bd; }
.cc-b > header { background: #f2d48f; }

.conf-card > header {
  padding: 18px 22px; text-align: center;
  display: flex; flex-direction: column; gap: 3px;
}
.conf-card > header b {
  font-size: clamp(15px, 1.4vw, 18px); font-weight: 700;
  letter-spacing: -.01em; color: var(--ink-c);
}
.conf-card > header span {
  font-size: 11px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; color: rgba(26, 19, 16, .62);
}
.conf-card ul {
  list-style: none; margin: 0; padding: clamp(20px, 2vw, 26px) clamp(18px, 1.8vw, 24px);
  display: grid; gap: clamp(20px, 2vw, 26px);
}
.conf-card li { display: grid; grid-template-columns: auto 1fr; gap: 14px; align-items: start; }
.ci { width: 26px; height: 26px; flex: none; color: var(--ink-c); margin-top: 1px; }
.ci svg { width: 100%; height: 100%; display: block; }
.conf-card b {
  display: block; font-size: 14.5px; font-weight: 700; line-height: 1.35;
  letter-spacing: -.005em; color: var(--ink-c);
}
.conf-card li p {
  margin: 7px 0 0; font-size: 13.5px; line-height: 1.55;
  color: rgba(26, 19, 16, .74);
}

/* the headline steps above the pair before the cards get squeezed */
@media (max-width: 1000px) {
  .conf { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .conf-lede { grid-column: 1 / -1; padding-top: 0; }
  .conf-lede h3 { font-size: clamp(28px, 4.6vw, 40px); }
  .conf-lede br { display: none; }
}
@media (max-width: 640px) {
  .conf { grid-template-columns: minmax(0, 1fr); }
}


/* the footer has room for the lockup at a readable size — the strapline under
   the wordmark is only legible from about 40px up */
.foot .brand-mark { width: 124px; height: 47px; }
@media (max-width: 1024px) { .brand-mark { width: 92px; height: 35px; } }
@media (max-width: 380px)  { .brand-mark { width: 82px; height: 31px; } }

/* ── dark mode: "Who we are" and "How we are different" sit flat ────────
   Both paint a --surface-2 wash (#1c1815) over the #0d0b0a body, which lifts
   them off the page in dark mode where every other section is flat. The wash
   stays in light mode, where it reads as a quiet alternation rather than a
   different colour. */
:root[data-theme="dark"] .about::before,
:root[data-theme="dark"] #compare::before { background: none; }

/* ── FAQ: 8-bit treatment ───────────────────────────────────────────────
   Scoped entirely to .faq. Nothing outside this section changes — the intro
   capsule, the heading, the mode control and every other section keep the
   styling they already had.

   The answers deliberately stay in Inter. The reference sets them at 9px in
   the pixel face, which is fine for one arcade line and unreadable for a
   360-character paragraph; the retro layer goes on the question row, the
   marker and the tag, where the strings are short. */
.faq { --pixel: 4px; }

/* stepped frame instead of a radius: four offset shadows cut the corners,
   which is how the pixel edge is drawn without an image */
.faq .fq {
  border: 0; border-radius: 0;
  background: var(--surface);
  box-shadow:
    0 calc(var(--pixel) * -1) 0 0 var(--line-strong),
    0 var(--pixel) 0 0 var(--line-strong),
    calc(var(--pixel) * -1) 0 0 0 var(--line-strong),
    var(--pixel) 0 0 0 var(--line-strong);
  transition: box-shadow .2s steps(2), transform .2s steps(2);
}
.faq .fq:hover, .faq .fq:focus-within { transform: translateY(-2px); }
.faq .fq[data-open="true"] {
  box-shadow:
    0 calc(var(--pixel) * -1) 0 0 var(--brand),
    0 var(--pixel) 0 0 var(--brand),
    calc(var(--pixel) * -1) 0 0 0 var(--brand),
    var(--pixel) 0 0 0 var(--brand);
}
/* a soft radial glow fights a hard pixel edge — the retro cards drop it */
.faq .fq-glow { display: none; }

/* the marker: + while shut, >> while open, exactly the component's icons */
.faq .fq-ic {
  width: auto; height: auto; min-width: 34px;
  border: 0; border-radius: 0; background: none;
  font-family: 'Press Start 2P', ui-monospace, monospace;
  font-size: 12px; line-height: 1; color: var(--brand);
  transform: none; transition: color .2s steps(2);
  padding-top: 3px;
}
.faq .fq:hover .fq-ic { transform: none; }
.faq .fqi-open { display: none; font-style: normal; }
.faq .fqi-shut { font-style: normal; }
.faq .fq[data-open="true"] .fqi-shut { display: none; }
.faq .fq[data-open="true"] .fqi-open { display: inline; }

.faq .fq-q {
  font-family: 'Press Start 2P', ui-monospace, monospace;
  font-size: clamp(11px, .95vw, 12px); font-weight: 400;
  line-height: 1.75; letter-spacing: 0; color: var(--ink);
  min-width: 0; overflow-wrap: anywhere;
}
/* the tag becomes a pixel-framed badge */
.faq .fq-meta {
  border: 0; border-radius: 0;
  padding: 5px 9px;
  font-family: 'Press Start 2P', ui-monospace, monospace;
  font-size: 11px; font-weight: 400; letter-spacing: 0; line-height: 1.2;
  color: var(--on-brand); background: var(--brand);
  box-shadow: 0 -3px 0 0 var(--brand), 0 3px 0 0 var(--brand),
              -3px 0 0 0 var(--brand), 3px 0 0 0 var(--brand);
}
.faq .fq-row { gap: 20px; min-width: 0; }
.faq .fq-tx { min-width: 0; }

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


/* ── touch header: controls sit hard against the right edge ─────────────
   `.theme-btn { margin-left: auto }` was declared inside the 1024 query at
   line 745, but the base rule at 810 re-set margin-left to 10px — same
   specificity, later in the file, so it won. The controls stopped short and
   left ~126px of dead space at the right of the bar. Declared here, after
   both, so it actually applies. */
@media (max-width: 1024px) {
  .site-header .theme-btn { margin-left: auto; }
  .site-header .burger { margin-left: 0; }
}

/* ── stacked story: the emptied deck must not paint ─────────────────────
   Below 861px story.js re-homes all six cards into their own text stages,
   which leaves .deck in the flow with nothing in it — but it keeps its own
   near-black background and 16/10 aspect-ratio, so it rendered as a solid
   dark block under the last stage on phones and tablets. It has no job once
   the cards have left. */
@media (max-width: 860px) {
  .deck { display: none; }
}
