/* ═══════════════════════════════════════════════════════════════
   ARKLY.DEV — FINAL "Three sections, one accent"
   Warm paper · one cobalt · Fraunces/Archivo/IBM Plex Mono.
   Spec locked 2026-06-10 evening (Adrian).
   ═══════════════════════════════════════════════════════════════ */

:root {
  --paper:  #F2EBD9;   /* warm cream — never #FFF */
  --ink:    #18150E;   /* warm near-black — never #000 */
  --cobalt: #1840D4;   /* the single rationed accent */

  --rule:    rgba(24, 21, 14, 0.16);
  --rule-2:  rgba(24, 21, 14, 0.07);
  --ink-70:  rgba(24, 21, 14, 0.72);
  --ink-52:  rgba(24, 21, 14, 0.54);
  --ink-38:  rgba(24, 21, 14, 0.40);

  --f-serif:   'Fraunces', Georgia, 'Times New Roman', serif;
  --f-grotesk: 'Archivo', system-ui, sans-serif;
  --f-mono:    'IBM Plex Mono', ui-monospace, 'Courier New', monospace;

  --maxw: 1280px;
  --gutter: clamp(1.25rem, 4vw, 3.75rem);
  --ease: cubic-bezier(0.22, 1, 0.36, 1);

  /* motion distances — halved on coarse pointers */
  --rise-d: 112%;   /* masked line travel */
  --par-d: 24px;    /* section wrap parallax */
  --drift-d: -12px; /* hero card exit drift */
}
@media (pointer: coarse) {
  :root { --rise-d: 56%; --par-d: 12px; --drift-d: -6px; }
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: 90px; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  background: var(--paper);
  color: var(--ink);
  font-family: var(--f-serif);
  font-optical-sizing: auto;
  font-kerning: normal;
  font-feature-settings: 'liga' 1, 'kern' 1;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  /* clip, NOT hidden: overflow-x hidden makes <body> a scroll container,
     which kills every animation-timeline: view() on the page */
  overflow-x: clip;
}

::selection { background: var(--cobalt); color: #fff; }

:focus-visible { outline: 2px solid var(--cobalt); outline-offset: 3px; }
.coupon-input:focus-visible { outline: none; } /* row carries the ring */

img { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
h1, h2 { text-wrap: balance; hanging-punctuation: first; }

/* tabular numerals wherever a number is doing ledger work */
.num { font-variant-numeric: tabular-nums; font-feature-settings: 'tnum' 1; }

.wrap { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: var(--gutter); }

/* ─── graph paper canvas (Three.js quad shader) — behind everything ─── */
.graph-paper {
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
  width: 100vw; height: 100vh; display: block;
}
/* static fallback lattice (reduced-motion / coarse pointer): pure CSS, same geometry */
.graph-static body, body { background-color: var(--paper); }
.graph-static .graph-paper {
  background-image: radial-gradient(circle, rgba(24,21,14,0.06) 1.1px, transparent 1.2px);
  background-size: 26px 26px;
}
.bg-off .graph-paper, .audit .graph-paper { display: none; }

/* page content rides above the canvas */
.masthead, main, .footer { position: relative; z-index: 1; }

/* ─────────────────────────── MASTHEAD ─────────────────────────── */
.masthead {
  position: sticky; top: 0; z-index: 100;
  background: color-mix(in srgb, var(--paper) 92%, transparent);
  backdrop-filter: saturate(1.1) blur(10px);
}
.mast-row {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding-block: 0.8rem;
  border-bottom: 2px solid var(--ink);
  position: relative;
}
.mast-row::after {
  content: ''; position: absolute; left: 0; right: 0;
  bottom: -5px; height: 1px; background: var(--rule);
}
.mast-brand { display: flex; align-items: center; gap: 0.6rem; }
.mast-mark img { width: 24px; height: 24px; }
.wordmark {
  font-family: var(--f-grotesk); font-weight: 800;
  font-size: 1.18rem; letter-spacing: 0.18em; color: var(--ink);
}
.mast-meta { display: flex; align-items: center; gap: 1.5rem; }
.mast-dateline {
  font-family: var(--f-mono); font-size: 0.7rem; letter-spacing: 0.1em;
  color: var(--ink-52);
}
.mast-sub {
  font-family: var(--f-mono); font-size: 0.72rem; font-weight: 500;
  letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink); padding: 0.5rem 1rem;
  border: 1px solid var(--ink); border-radius: 1px;
  transition: background 0.3s var(--ease), color 0.3s var(--ease);
}
.mast-sub:hover { background: var(--ink); color: var(--paper); }
@media (max-width: 640px) { .mast-dateline { display: none; } }

/* ─── MICRO-LABEL GRAMMAR — one voice for every kicker ─── */
.kicker, .section-kicker {
  font-family: var(--f-mono); font-size: 0.68rem; font-weight: 500;
  letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-70);
  display: inline-flex; align-items: baseline; gap: 0.55rem;
}
.kicker::before, .section-kicker::before {
  content: '·'; color: var(--cobalt); font-weight: 500;
  font-size: 1.05em; transform: translateY(-0.02em);
}

/* ─────────────── S1 — HERO ─────────────── */
.hero { padding: clamp(2rem, 5vh, 3.5rem) 0 clamp(2.5rem, 6vh, 4rem); }
.kicker { padding-bottom: clamp(1rem, 2.4vh, 1.6rem); }

/* both lines EQUAL full ink — the H1 owns ~45% of the viewport */
.hero-line {
  font-family: var(--f-serif); font-weight: 600;
  font-size: clamp(3.3rem, 10.2vw, 10.4rem); line-height: 0.95;
  letter-spacing: -0.035em; color: var(--ink);
  font-variation-settings: 'opsz' 144;
}

.hero-grid {
  margin-top: clamp(1.75rem, 4.5vh, 3rem);
  display: grid; grid-template-columns: 1.15fr 0.85fr;
  gap: clamp(2rem, 5vw, 5.5rem);
  align-items: end; /* text block baseline-aligned with the card — never floats above it */
}
@media (max-width: 900px) { .hero-grid { grid-template-columns: 1fr; gap: 2.5rem; align-items: start; } }

.hero-sub {
  font-family: var(--f-serif); font-weight: 400;
  font-size: clamp(1.14rem, 1.7vw, 1.42rem); line-height: 1.5;
  color: var(--ink-70); max-width: 26em;
}

/* ─── CTA row: WhatsApp primary + email secondary ─── */
.cta-row {
  margin-top: clamp(1.5rem, 3vh, 2.2rem);
  display: flex; flex-direction: column; gap: 1rem; max-width: 32rem;
}
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem;
  height: 48px; padding: 0 1.5rem;
  font-family: var(--f-mono); font-size: 0.8rem; font-weight: 500;
  letter-spacing: 0.08em; text-transform: uppercase;
  border-radius: 1px; white-space: nowrap; cursor: pointer;
  transition: background 0.15s, color 0.15s, box-shadow 0.15s;
}
.btn-primary { background: var(--cobalt); color: #fff; border: 1px solid var(--cobalt); }
.btn-primary:hover { background: #1234b8; border-color: #1234b8; }
.btn-primary:active { background: #0f2da0; }
.btn-outline { background: transparent; color: var(--ink); border: 1px solid var(--ink); }
.btn-outline:hover { background: var(--ink); color: var(--paper); }
.btn:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--cobalt) 30%, transparent); }
.cta-row .btn-primary { align-self: flex-start; }

/* email coupon — secondary, press-subscription */
.coupon-row {
  display: flex; align-items: stretch;
  border: 1px solid var(--ink-38); background: transparent;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.coupon-row:focus-within {
  border-color: var(--cobalt);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--cobalt) 30%, transparent);
}
.coupon-input {
  flex: 1; min-width: 0; border: none; background: transparent;
  padding: 0.8rem 0.75rem; font-family: var(--f-mono); font-size: 1rem;
  color: var(--ink); letter-spacing: 0.01em;
}
.coupon-input::placeholder { color: var(--ink-38); }
.coupon-input:focus { outline: none; }
.coupon-btn {
  flex-shrink: 0; border: none; cursor: pointer;
  background: transparent; color: var(--ink);
  border-left: 1px solid var(--ink-38);
  font-family: var(--f-mono); font-size: 0.72rem; font-weight: 500;
  letter-spacing: 0.08em; text-transform: uppercase; padding: 0 1.25rem;
  transition: background 0.15s, color 0.15s;
}
.coupon-btn:hover { background: var(--ink); color: var(--paper); }
.coupon-note {
  font-family: var(--f-mono); font-size: 0.68rem; letter-spacing: 0.05em;
  color: var(--ink-38); margin-top: 0.5rem; min-height: 1.2em;
}
.coupon-note.is-success { color: var(--cobalt); }
.coupon-note.is-error { color: #B42318; }
@media (max-width: 420px) {
  .coupon-row { flex-direction: column; }
  .coupon-btn { padding: 0.9rem 1rem; border-left: none; border-top: 1px solid var(--ink-38); }
}

/* ─── the elevated dispatch card — D-002, cream-on-cream ─── */
.hero-object { display: flex; justify-content: center; }
.card-tilt { perspective: 1100px; width: 100%; max-width: 392px; }

/* the cycle frame carries the tilt — every card inherits it; grid-stacked so
   the frame height = tallest card and NEVER shifts during a swap */
.hero-cycle {
  display: grid;
  transform: rotateY(-4deg);
  transition: transform 0.4s var(--ease);
  will-change: transform;
}
.card-tilt.is-js .hero-cycle { transition: none; } /* JS lerps; CSS keeps the fallback ease */
@media (prefers-reduced-motion: reduce), (pointer: coarse) { .hero-cycle { transform: none; } }
.audit .hero-cycle { transform: none; }

.d2 {
  border: 1.5px solid var(--ink);
  background: color-mix(in srgb, var(--paper) 88%, #fff 10%);
  box-shadow: 0 28px 64px -36px rgba(15, 13, 11, 0.5);
  display: flex; flex-direction: column;
}
.d2 .d2-body { flex: 1; }

/* card swap: crossfade + small horizontal slide, no layout shift */
.hero-card {
  grid-area: 1 / 1;
  opacity: 0; visibility: hidden;
  transform: translateX(14px);
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease),
              visibility 0s linear 0.5s;
  pointer-events: none;
}
.hero-card.is-active {
  opacity: 1; visibility: visible; transform: translateX(0);
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease), visibility 0s;
  pointer-events: auto;
}
.hero-card.is-out { transform: translateX(-14px); } /* outgoing exits left */
@media (prefers-reduced-motion: reduce) {
  .hero-card, .hero-card.is-active { transition: none; transform: none; }
}
.audit .hero-card { transition: none; transform: none; }

/* serial strip — the only carousel control; [hidden] until JS proves ≥2 cards */
.cycle-serials {
  display: flex; align-items: baseline; justify-content: center; gap: 0.6rem;
  margin-top: 0.8rem;
}
.cycle-serials[hidden] { display: none; }
.cycle-serial {
  background: none; border: none; cursor: pointer; padding: 0.2rem 0.1rem;
  font-family: var(--f-mono); font-size: 0.6rem; font-weight: 500;
  letter-spacing: 0.12em; color: var(--ink-38);
  transition: color 0.3s var(--ease);
}
.cycle-serial.is-on { color: var(--ink); }
.cycle-serial:hover { color: var(--ink-70); }
.cycle-serial.is-on:hover { color: var(--ink); }
.cycle-sep { color: var(--ink-38); font-family: var(--f-mono); font-size: 0.6rem; }

/* ─── hero word-roll — "shift" occasionally rolls to a sibling word.
   JS builds the .wr-stack; without JS (or reduced-motion/?audit) the span is
   plain text "shift". Width tweens per word so only the trailing comma moves. ─── */
.word-roll { display: inline-block; white-space: nowrap; }
.word-roll.is-js {
  /* clip VERTICALLY only — the roll mask. Horizontal stays visible because
     Fraunces ink at display size + negative tracking overhangs the measured
     advance width (this clipped "shift"→"shif" in production, 2026-06-11).
     Width now only positions the comma; ink can never be cut again. */
  overflow: visible clip;
  /* top-aligned + exactly one line box tall → inner glyph geometry is identical
     to the sibling text, so the baseline can't drift (inline-block baseline
     rules never enter the picture) */
  vertical-align: top;
  height: 0.95em;
  padding-top: 0.08em;  margin-top: -0.08em;   /* ascender headroom inside the clip */
  padding-bottom: 0.2em; margin-bottom: -0.2em; /* descender room inside the clip */
  transition: width 0.45s var(--ease);
  will-change: width;
}
.wr-stack { display: block; }
.wr-stack.is-rolling { transition: transform 0.45s var(--ease); transform: translateY(-50%); }
.wr-w { display: block; }
.audit .word-roll, .audit .wr-stack { transition: none !important; transform: none !important; }

.d2-mast {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: 0.7rem 1.1rem; border-bottom: 1.5px solid var(--ink);
}
.d2-brand { display: inline-flex; align-items: center; gap: 0.45rem;
  font-family: var(--f-grotesk); font-weight: 700; font-size: 0.74rem;
  letter-spacing: 0.15em; color: var(--ink); }
.d2-brand img { width: 16px; height: 16px; }
.d2-no { font-family: var(--f-mono); font-size: 0.58rem; letter-spacing: 0.08em; color: var(--ink-52); }

.d2-body { padding: 1.3rem 1.1rem 1.1rem; }
.d2-desk {
  font-family: var(--f-mono); font-weight: 500; font-size: 0.56rem;
  letter-spacing: 0.2em; text-transform: uppercase; color: var(--cobalt);
  margin-bottom: 0.85rem;
}
.d2-head {
  font-family: var(--f-serif); font-weight: 600;
  font-size: clamp(1.5rem, 2.1vw, 1.8rem); line-height: 1.08;
  letter-spacing: -0.025em; color: var(--ink); text-wrap: balance;
}
.d2-head em { font-style: italic; }
.d2-stat {
  font-family: var(--f-grotesk); font-weight: 800;
  font-size: clamp(3rem, 4.6vw, 3.9rem); line-height: 0.95; letter-spacing: -0.015em;
  color: var(--cobalt); margin-top: 1.1rem;
}
.d2-src {
  font-family: var(--f-mono); font-size: 0.56rem; font-weight: 500;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-52);
  line-height: 1.7; border-top: 1px solid var(--rule-2);
  padding-top: 0.7rem; margin-top: 1rem;
}
.d2-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: 0.55rem 1.1rem; border-top: 1px solid var(--rule);
  font-family: var(--f-mono); font-size: 0.56rem; font-weight: 500;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-52);
}
.d2-tag { color: var(--ink-38); letter-spacing: 0.14em; }

/* short laptop viewports: compress so the fold stays a complete unit */
@media (min-width: 901px) and (max-height: 860px) {
  .hero { padding-top: 1.4rem; padding-bottom: 1.5rem; }
  .hero-line { font-size: clamp(3rem, 9vw, 8.2rem); }
  .kicker { padding-bottom: 0.8rem; }
  .hero-grid { margin-top: 1.3rem; }
  .cta-row { margin-top: 1.2rem; }
  .card-tilt { max-width: 360px; }
  .d2-body { padding: 1rem 1.1rem 0.9rem; }
  .d2-stat { font-size: 3rem; margin-top: 0.8rem; }
}

/* ═══ MOTION SYSTEM — masked line reveals · drawn rules · depth ═══
   Engine 1: native scroll-driven (animation-timeline: view()) — off main thread.
   Engine 2: IntersectionObserver class fallback (html.io-fb, set by script.js).
   Both fully off for prefers-reduced-motion and ?audit. */

/* mask anatomy — the .12em pad/neg-margin keeps descenders unclipped at rest */
/* overflow: clip (not hidden) — hidden would make the mask a scroll container
   and steal the .mline view() timeline from the viewport */
.mask { display: block; overflow: clip; padding-block: 0.12em; margin-block: -0.12em; }
.mline { display: block; will-change: transform; }
h1 .mask { display: block; }
.section-kicker.mline, .kicker.mline { display: inline-flex; } /* keep the cobalt-dot grammar */
.mask:has(> .kicker), .mask:has(> .section-kicker) { line-height: 1; }
.fmt-row { display: flex; align-items: baseline; gap: clamp(0.9rem, 2.2vw, 1.75rem); }
@media (max-width: 640px) { .fmt-row { flex-direction: column; gap: 0.5rem; } }

@keyframes fade-up {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes m-rise {
  from { transform: translateY(var(--rise-d)); }
  to   { transform: translateY(0); }
}
@keyframes rule-draw {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}
@keyframes par-rise {
  from { transform: translateY(var(--par-d)); }
  to   { transform: translateY(0); }
}
@keyframes card-drift {
  from { transform: translateY(0); }
  to   { transform: translateY(var(--drift-d)); }
}

/* ─── hero entrance (load-time, hero is above the fold): masked rises then fades ─── */
@media (prefers-reduced-motion: no-preference) {
  .hero .mline { animation: m-rise 0.7s var(--ease) both; }
  .mline-h1 { animation-delay: 0.05s !important; }
  .mline-h2 { animation-delay: 0.12s !important; }
  .mline-h3 { animation-delay: 0.19s !important; }
  .fade-3, .fade-4 { animation: fade-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; }
  .fade-3 { animation-delay: 0.30s; }
  .fade-4 { animation-delay: 0.38s; }
}
.audit .fade-3, .audit .fade-4, .audit .mline {
  animation: none !important; opacity: 1 !important; transform: none !important;
}

/* ─────────────── S2 — THE FORMAT ─────────────── */
.format { padding: clamp(6rem, 16vh, 11rem) 0; }
.fmt { list-style: none; margin-top: clamp(2.25rem, 6vh, 4rem); }
.fmt-line {
  font-family: var(--f-serif); font-weight: 600;
  font-size: clamp(1.9rem, 4.5vw, 4.1rem); line-height: 1.06;
  letter-spacing: -0.03em; color: var(--ink);
  font-variation-settings: 'opsz' 144;
  display: flex; align-items: baseline; gap: clamp(0.9rem, 2.2vw, 1.75rem);
  padding: clamp(1.1rem, 3vh, 1.9rem) 0;
}
.fmt-line + .fmt-line { border-top: 1px solid var(--rule-2); }
.fmt-n {
  font-family: var(--f-mono); font-weight: 500;
  font-size: clamp(0.7rem, 1vw, 0.85rem); letter-spacing: 0.14em;
  color: var(--ink-38); min-width: 2.2em; flex-shrink: 0;
}
.fmt-line.is-move { color: var(--cobalt); }
@media (max-width: 640px) {
  .fmt-line { flex-direction: column; gap: 0.5rem; }
}

/* ─── drawn section boundaries: hairline owned by ::before so it can draw in.
   The thick-thin masthead rule stays static. ─── */
.format, .closing { position: relative; }
.format::before, .closing::before {
  content: ''; position: absolute; top: 0; left: var(--gutter); right: var(--gutter);
  height: 1px; background: var(--rule); transform-origin: left center;
}
@media (min-width: 1380px) { /* hairline tracks .wrap's inner edge at max width */
  .format::before, .closing::before {
    left: max(var(--gutter), calc((100% - var(--maxw)) / 2 + var(--gutter)));
    right: max(var(--gutter), calc((100% - var(--maxw)) / 2 + var(--gutter)));
  }
}

/* ─── ENGINE 1 — native scroll-driven reveals (entry-range scrub, reverses naturally) ─── */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .format, .closing { view-timeline: --sec block; }

    /* boundary draws as it crosses 80% viewport */
    .format::before, .closing::before {
      animation: rule-draw linear both;
      animation-timeline: --sec;
      animation-range: entry 18% entry 58%;
    }
    /* depth: section content settles up ~24px across entry */
    .format > .wrap, .closing > .wrap {
      animation: par-rise linear both;
      animation-timeline: --sec;
      animation-range: entry 0% entry 100%;
    }
    /* masked line rises — each line scrubs its own entry window */
    .format .mline, .closing .mline {
      animation: m-rise var(--ease) both;
      animation-timeline: view();
      animation-range: entry 0% cover 30%;
    }
    .fmt-line:nth-child(1) .mline { animation-range: entry 0% cover 32%; }
    .fmt-line:nth-child(2) .mline { animation-range: entry 4% cover 36%; }
    .fmt-line:nth-child(3) .mline { animation-range: entry 8% cover 40%; }

    .record-strip, .closing-sub {
      animation: fade-up var(--ease) both;
      animation-timeline: view();
      animation-range: entry 0% cover 32%;
    }
    /* CTA arrival lands last — the sentence ending */
    .closing-ctas, .coupon--lg {
      animation: fade-up var(--ease) both;
      animation-timeline: view();
      animation-range: entry 25% cover 52%;
    }
    /* hero depth: card drifts slowly against the copy as the hero exits */
    .card-tilt {
      animation: card-drift linear both;
      animation-timeline: view();
      animation-range: exit 0% exit 100%;
    }
  }
}

/* ─── ENGINE 2 — IO fallback (html.io-fb set by JS only when view() unsupported) ─── */
.io-fb .format .mline, .io-fb .closing .mline { transform: translateY(var(--rise-d)); }
.io-fb .record-strip, .io-fb .closing-sub, .io-fb .closing-ctas, .io-fb .coupon--lg { opacity: 0; }
.io-fb .format::before, .io-fb .closing::before { transform: scaleX(0); }
.io-fb .in-view::before { animation: rule-draw 0.9s var(--ease) both; }
.io-fb .in-view .mline { animation: m-rise 0.7s var(--ease) both; }
.io-fb .in-view .fmt-line:nth-child(1) .mline { animation-delay: 0.07s; }
.io-fb .in-view .fmt-line:nth-child(2) .mline { animation-delay: 0.14s; }
.io-fb .in-view .fmt-line:nth-child(3) .mline { animation-delay: 0.21s; }
.io-fb .in-view .record-strip, .io-fb .in-view .closing-sub {
  animation: fade-up 0.7s var(--ease) 0.18s both;
}
.io-fb .in-view .closing-ctas, .io-fb .in-view .coupon--lg {
  animation: fade-up 0.7s var(--ease) 0.33s both; /* ~150ms after the H2 settles in feel */
}

/* ─── audit: everything at rest, final state ─── */
.audit .mline, .audit .format::before, .audit .closing::before,
.audit .format > .wrap, .audit .closing > .wrap, .audit .card-tilt,
.audit .record-strip, .audit .closing-sub, .audit .closing-ctas, .audit .coupon--lg {
  animation: none !important; opacity: 1 !important; transform: none !important;
}

/* the mono record strip */
.record-strip {
  margin-top: clamp(3rem, 8vh, 5rem);
  border-top: 2px solid var(--ink);
}
.rec-row {
  display: grid; grid-template-columns: 4rem 6rem 1fr auto;
  gap: 1.25rem; align-items: baseline;
  padding: 0.95rem 0.25rem;
  border-bottom: 1px solid var(--rule);
  font-family: var(--f-mono); font-size: 0.78rem; font-weight: 500;
  letter-spacing: 0.05em; color: var(--ink-70); text-transform: uppercase;
}
.rec-row > span:first-child { color: var(--ink); font-weight: 500; }
.rec-state { color: var(--cobalt); text-align: right; }
.rec-next { color: var(--ink-38); }
.rec-next > span:first-child { color: var(--ink-38); }
.rec-next .rec-state { color: var(--ink-52); font-style: italic; text-transform: none; }
@media (max-width: 560px) {
  .rec-row { grid-template-columns: 3rem 1fr auto; }
  .rec-row > span:nth-child(2) { display: none; }
}

/* ─────────────── S3 — CTA ─────────────── */
.closing { padding: clamp(6rem, 16vh, 11rem) 0 clamp(5rem, 12vh, 8rem); }
.closing-frame { text-align: center; }
.closing-title {
  font-family: var(--f-serif); font-weight: 600;
  font-size: clamp(2.4rem, 6.4vw, 5.8rem); line-height: 1.0; letter-spacing: -0.032em;
  font-variation-settings: 'opsz' 144;
}
.closing-sub {
  font-family: var(--f-serif); font-style: italic; font-weight: 300;
  font-size: clamp(1.06rem, 1.7vw, 1.3rem);
  color: var(--ink-52); max-width: 32em; margin: 1.5rem auto 0; line-height: 1.55;
}
.closing-ctas {
  display: flex; justify-content: center; gap: 0.75rem; flex-wrap: wrap;
  margin-top: clamp(2rem, 4.5vh, 3rem);
}
.coupon--lg { max-width: 30rem; margin: 1.5rem auto 0; }
.coupon--lg .coupon-note { text-align: center; }

/* ─────────────────────────── FOOTER ─────────────────────────── */
.footer { border-top: 1px solid var(--rule); padding: 1.4rem 0; }
.footer-inner {
  display: flex; align-items: center; justify-content: space-between; gap: 1.5rem; flex-wrap: wrap;
}
.footer-brand { display: flex; align-items: center; gap: 0.55rem; }
.footer-mark img { width: 20px; height: 20px; }
.footer-word {
  font-family: var(--f-grotesk); font-weight: 800; font-size: 0.95rem;
  letter-spacing: 0.17em; color: var(--ink);
}
.footer-copy, .footer-privacy {
  font-family: var(--f-mono); font-size: 0.66rem; letter-spacing: 0.1em;
  color: var(--ink-52); text-transform: uppercase;
}
.footer-privacy { text-decoration: underline; text-decoration-color: var(--rule); text-underline-offset: 3px; }
.footer-privacy:hover { color: var(--cobalt); text-decoration-color: var(--cobalt); }
@media (max-width: 560px) {
  .footer-inner { flex-direction: column; align-items: flex-start; gap: 0.8rem; }
}

/* ─── toolkit teaser — quiet ledger annotation under the record strip ─── */
.toolkit-note {
  margin-top: clamp(2rem, 4vh, 3rem); padding-top: 1.3rem;
  border-top: 1px solid var(--rule);
}
.toolkit-line {
  font-family: var(--f-serif); font-style: italic; font-weight: 400;
  font-size: clamp(1rem, 1.5vw, 1.18rem); color: var(--ink-70);
  margin-top: 0.7rem; max-width: 34em;
}
.toolkit-meta {
  font-family: var(--f-mono); font-size: 0.7rem; font-weight: 500;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-52);
  margin-top: 0.8rem;
}
.toolkit-meta a { color: var(--cobalt); text-decoration: underline; text-underline-offset: 3px; }
