/* AI Brain design system - components (v1.2 "modern AI product, warm-editorial")
   Senior UI/UX (Taste) redesign pass. Round 1.
   Requires tokens.css + the Typekit kit (khy6rof) loaded in <head>.
   Vanilla CSS, no framework. Square-edged (radius 0), warm light palette, ONE locked accent (ochre).
   Theme lock: LIGHT only, page-wide (no section inverts except the two deliberate ink bands,
   which are a single locked "ink" family used consistently). No gradient orbs, no glassmorphism. */

/* ---------- base ---------- */
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;background:var(--off);color:var(--ink);
  font:400 var(--text-base)/1.66 var(--font-body);
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
h1,h2,h3{margin:0 0 var(--space-4);line-height:1.12}
/* P4 brand-rule "Contralto sparingly": Contralto Big all-caps tracked is reserved for
   the landing H1, the CTA-band H2, and the .display flourish. Section H2s set in Acumin
   sentence-case (matching h3) so the page reads modern, not all-caps top to bottom. */
h1,.display{
  font-family:var(--font-display);font-weight:400;
  text-transform:uppercase;letter-spacing:var(--track-display);
}
h1{font-size:var(--text-2xl);line-height:1.05}
h2{font-family:var(--font-body);font-weight:600;font-size:var(--text-xl);letter-spacing:0;line-height:1.14;text-transform:none}
/* the .display flourish sizes like an H2 display line */
h2.display,.cta-band h2{font-size:var(--text-xl);line-height:1.1}
h3{font-family:var(--font-body);font-weight:600;font-size:var(--text-lg);letter-spacing:0;line-height:1.2}
p{margin:0 0 var(--space-3)}
a{color:var(--ink);text-underline-offset:3px;text-decoration-thickness:1px}
a:hover{text-decoration-color:var(--accent-ink)}
b,strong{font-weight:600}
.muted{color:var(--stone-body)}
img{max-width:100%;display:block}
:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}

.wrap{max-width:var(--measure);margin:0 auto;padding:0 var(--space-4)}
.wrap-wide{max-width:var(--measure-wide);margin:0 auto;padding:0 var(--space-4)}
.wrap-page{max-width:var(--measure-page);margin:0 auto;padding:0 var(--space-6)}
.label{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-wide);color:var(--accent-ink);font-weight:600}
.label--stone{color:var(--stone-body)}
.center{text-align:center}
.tnum{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1,"lnum" 1}
.accent-txt{color:var(--accent-ink)}

/* ---------- nav lockup ---------- */
.nav{padding:var(--space-6) 0 0;display:flex;align-items:center;justify-content:space-between;gap:var(--space-4)}
.nav .lockup{font-size:var(--text-xs);letter-spacing:var(--track-wide);text-transform:uppercase;color:var(--stone-body);text-decoration:none;white-space:nowrap}
.nav .lockup b{color:var(--ink);font-weight:600}
.nav .nav-cta{font-size:var(--text-xs);letter-spacing:var(--track-med);text-transform:uppercase;color:var(--ink);text-decoration:none;font-weight:600;border-bottom:2px solid var(--accent);padding-bottom:2px;white-space:nowrap}
.nav .nav-cta:hover{color:var(--accent-ink)}
/* nav CTA stays visible at every width - on a long page the top link must not vanish.
   Below 400px it tightens rather than disappears. */
@media (max-width:400px){.nav{gap:var(--space-2)}.nav .nav-cta{font-size:.68rem;letter-spacing:.06em}}

/* ---------- eyebrow pill (rationed: hero + at most 1 per 3 sections) ---------- */
.eyebrow{
  display:inline-flex;align-items:center;gap:.55em;
  border:var(--border-accent);background:var(--surface);
  padding:.4rem .9rem;font-size:var(--text-xs);
  text-transform:uppercase;letter-spacing:var(--track-wide);color:var(--accent-ink);font-weight:600;
}
.eyebrow::before{content:"";width:.42rem;height:.42rem;background:var(--accent);display:inline-block}
/* the FREE lever: loudest token in the fold. Ochre fill, ink text, AA (7.4:1). */
.eyebrow-free{background:var(--accent);color:var(--ink);font-weight:600;padding:.05em .5em;margin-right:.15em;letter-spacing:var(--track-med)}

/* =========================================================================
   HERO - conversion-first split: left copy, right the LIVE capture form.
   The single conversion surface sits above the fold on desktop AND mobile.
   Headline <= 2 lines, subtext <= 20 words, form fully visible on first paint.
   A slim generated motif strip caps the form card so the page still carries a
   real brand image without letting decoration own the fold.
   ========================================================================= */
.hero{padding:var(--space-8) 0 var(--space-12);position:relative;isolation:isolate}
/* subtle full-bleed marine paper-grain wash behind the fold: adds depth without chrome.
   Very low opacity so clay stays clay and copy contrast is untouched. Decorative only. */
.hero::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:url("../assets/texture-bg.png") center/cover no-repeat;
  opacity:.05;pointer-events:none;
}
.hero-grid{
  display:grid;grid-template-columns:1.02fr .98fr;gap:var(--space-12);align-items:center;
}
.hero-copy{max-width:34rem}
.hero .hero-kicker{display:inline-flex;margin-bottom:var(--space-4)}
.hero h1{font-size:var(--text-hero);line-height:1.02;margin-bottom:var(--space-4);max-width:15ch}
.hero p.lead{
  color:var(--stone-body);font-size:var(--text-md);max-width:44ch;
  margin:0 0 var(--space-6);
}
/* quiet trust chips under the lead - reinforce the offer without a CTA that runs off-fold */
.hero-trust{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin:0;padding:0;list-style:none}
.hero-trust li{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-med);color:var(--stone-body);font-weight:600;display:inline-flex;align-items:center;gap:.5em}
.hero-trust li::before{content:"";width:.5rem;height:.5rem;background:var(--accent);flex-shrink:0}
/* P5: a single quiet text anchor from the hero copy to the form. Not a second button -
   an underlined ochre text link, so desktop readers whose eye stays left still have one
   clear path down to the one conversion surface. */
.hero-copy .hero-jump{display:inline-block;margin-top:var(--space-4);font-size:var(--text-sm);text-transform:uppercase;letter-spacing:var(--track-med);font-weight:600;color:var(--accent-ink);text-decoration:none;border-bottom:2px solid var(--accent);padding-bottom:2px}
.hero-copy .hero-jump:hover{color:var(--ink)}
.hero-copy .hero-jump::after{content:" \2193"}

/* ---- the hero conversion card: slim motif cap + live form as one unit ---- */
.hero-form{position:relative}
.hero-form-cap{border:var(--border-ink);border-bottom:0;background:var(--ink);display:block;margin:0}
.hero-form-cap img{width:100%;aspect-ratio:16/5;object-fit:cover;display:block}
.hero-form-cap figcaption{
  background:var(--ink);color:var(--off);
  font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-wide);
  padding:.5rem .8rem;border-top:var(--border-accent);
}
.hero-form-cap figcaption b{color:var(--accent)}
/* the .gate form below the cap loses its own top rule so cap + form read as one card */
.hero-form .gate,.hero-form .gate-ok{margin:0;max-width:none;border-top:0}
/* P5: when the motif cap is dropped (phones) the form regains a strong ochre top rule
   so the card still reads as the primary conversion target. */
@media (max-width:560px){.hero-form .gate{border-top:5px solid var(--accent)}}
/* C1: the form gets its own verbal-commitment headline, so the conversion surface
   states the offer + what the button does BEFORE the fields. Acumin (NOT Contralto)
   so it reads as an action heading, not a display flourish. */
.hero-form .gate-head{margin:0 0 var(--space-3)}
.hero-form .gate-head h2{
  font-family:var(--font-body);text-transform:none;letter-spacing:0;
  font-size:var(--text-lg);line-height:1.15;margin:0 0 var(--space-1);color:var(--ink);
  display:flex;align-items:baseline;gap:.5em;flex-wrap:wrap;
}
/* P5: echo the FREE flag on the gate-head so the form card is unmistakably the primary
   target - same ochre-fill lever as the fold kicker, ink text (AA), no extra button. */
.hero-form .gate-head .gate-free{background:var(--accent);color:var(--ink);font-weight:600;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-med);padding:.15em .5em;align-self:center}
.hero-form .gate-head p{font-size:var(--text-sm);color:var(--stone-body);margin:0}
@media (max-width:860px){
  .hero-grid{grid-template-columns:1fr;gap:var(--space-8)}
  .hero-copy{max-width:none}
  .hero h1{max-width:none}
  /* form stays ABOVE the copy on mobile so it is the first meaningful surface */
  .hero .hero-form{order:-1}
  /* trim the motif cap on small screens so name + email + submit all clear the fold */
  .hero-form-cap img{aspect-ratio:auto;height:96px;object-position:center 62%}
}
@media (max-width:560px){
  /* C2: DROP the decorative motif cap entirely on phones so the form headline +
     name + email + submit + fine-print all sit in the first viewport, zero scroll.
     Decoration must never cost a fold on the one conversion surface. */
  .hero-form-cap{display:none}
  .hero-form .gate{padding:var(--space-6)}
}

/* ---------- buttons ---------- */
.btn{
  display:inline-block;background:var(--ink);color:var(--off);border:0;cursor:pointer;
  padding:.95rem 2rem;font:600 var(--text-sm)/1 var(--font-body);
  letter-spacing:var(--track-med);text-transform:uppercase;text-decoration:none;
  position:relative;transition:transform .12s var(--ease),background .18s var(--ease);
  border-bottom:3px solid var(--accent);
}
.btn:hover{background:var(--ink-80)}
.btn:active{transform:translateY(1px)}
.btn--ghost{background:transparent;color:var(--ink);border:var(--border-ink);border-bottom:3px solid var(--accent)}
.btn--ghost:hover{background:var(--surface)}
/* on ink bands the CTA flips to ochre-on-ink for pop + AA */
.hero--ink .btn,.cta-band .btn{background:var(--accent);color:var(--ink);border-bottom-color:var(--ink)}
.hero--ink .btn:hover,.cta-band .btn:hover{background:var(--accent-hover)}

/* ---------- section rhythm ---------- */
.section{padding:var(--space-16) 0}
.section--tight{padding:var(--space-12) 0}
.section--wash{background:var(--surface);border-top:var(--border);border-bottom:var(--border)}
.section-head{max-width:46ch;margin:0 auto var(--space-12)}
.section-head.center{text-align:center;margin-left:auto;margin-right:auto}
.section-head p{color:var(--stone-body);font-size:var(--text-md);margin:0}
.section-head .label{display:block;margin-bottom:var(--space-3)}

/* =========================================================================
   LAYERS BAND - the explanatory visual (real generated diagram) beside the
   context/skills/automation copy. Image on one side, labelled list on the other.
   ========================================================================= */
.layers{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-12);align-items:center;max-width:var(--measure-page);margin:0 auto}
.layers-figure{border:var(--border-ink);background:var(--ink);align-self:stretch;display:flex}
.layers-figure img{width:100%;height:100%;object-fit:cover}
.layers-list{list-style:none;padding:0;margin:0;display:grid;gap:0}
.layers-list li{padding:var(--space-4) 0;border-bottom:var(--hairline);display:grid;grid-template-columns:auto 1fr;gap:var(--space-4);align-items:baseline}
.layers-list li:first-child{border-top:var(--hairline)}
.layers-list .l-no{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:var(--text-sm);color:var(--accent-ink);font-weight:600}
.layers-list h3{margin:0 0 var(--space-1)}
.layers-list p{margin:0;color:var(--stone-body);font-size:var(--text-sm)}
@media (max-width:820px){.layers{grid-template-columns:1fr;gap:var(--space-8)}.layers-figure{min-height:260px}}

/* =========================================================================
   PROBLEM -> SOLUTION - two-card contrast, accent marks the "with" state.
   ========================================================================= */
.chess{display:grid;gap:var(--space-6);max-width:var(--measure-page);margin:0 auto;grid-template-columns:1fr 1fr}
.chess-card{border:var(--border);background:var(--surface);padding:var(--space-8)}
.chess-card--with{border:var(--border-ink);border-top:4px solid var(--accent)}
.chess-card .label{display:block;margin-bottom:var(--space-3)}
.chess-card h3{margin-bottom:var(--space-3)}
.chess-card p{color:var(--stone-body);margin:0}
.chess-card .c-mark{display:flex;gap:.45rem;align-items:flex-end;height:44px;margin-bottom:var(--space-4)}
.chess-card .c-mark span{width:.6rem;background:var(--stone-30);display:block}
.chess-card--with .c-mark span{background:var(--ink)}
.chess-card--with .c-mark span:last-child{background:var(--accent)}
@media (max-width:720px){.chess{grid-template-columns:1fr}}

/* =========================================================================
   FOLDER PROOF - the honest "this is the actual thing" screenshot.
   Real image, framed like a window, one caption below (no overlay pills).
   ========================================================================= */
.proof{max-width:var(--measure-page);margin:0 auto;display:grid;grid-template-columns:1fr 1.1fr;gap:var(--space-12);align-items:center}
.proof-copy .label{display:block;margin-bottom:var(--space-3)}
.proof-copy h2{margin-bottom:var(--space-4)}
.proof-copy p{color:var(--stone-body);margin:0 0 var(--space-3);max-width:42ch}
.proof-frame{border:var(--border-ink);background:var(--surface);padding:var(--space-2)}
.proof-frame img{width:100%;border:var(--hairline)}
.proof-frame figcaption{font-size:var(--text-sm);color:var(--stone-body);padding:var(--space-2) var(--space-2) var(--space-1);font-family:var(--font-mono)}
@media (max-width:820px){.proof{grid-template-columns:1fr;gap:var(--space-8)}.proof-copy{order:-1}}

/* =========================================================================
   MID-PAGE RE-CTA - one quiet line + the verbatim button, after folder proof.
   Lets a convinced mid-scroll reader convert without hunting for the bottom band.
   Not a second theme: a hairline-topped row, ochre accent on the FREE word.
   ========================================================================= */
.recta{max-width:var(--measure-page);margin:var(--space-12) auto 0;border-top:var(--border);padding-top:var(--space-8);display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:var(--space-4) var(--space-6);text-align:center}
.recta .recta-line{margin:0;font-size:var(--text-md);color:var(--stone-body)}
.recta .recta-line b{color:var(--accent-ink);font-weight:600}

/* =========================================================================
   HOW IT WORKS - full-width motif band + 3 steps beneath.
   ========================================================================= */
.how-motif{border:var(--border-ink);background:var(--ink);margin:0 auto var(--space-12);max-width:var(--measure-page)}
.how-motif img{width:100%;aspect-ratio:16/6;object-fit:cover}
.how{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-6);max-width:var(--measure-page);margin:0 auto}
.how-step{border-top:3px solid var(--accent);background:var(--surface);border-right:var(--hairline);border-bottom:var(--hairline);border-left:var(--hairline);padding:var(--space-8) var(--space-6);position:relative}
.how-step .how-no{
  display:block;font-family:var(--font-mono);font-variant-numeric:tabular-nums;
  font-size:var(--text-lg);color:var(--accent-ink);margin-bottom:var(--space-4);font-weight:600;
}
.how-step h3{margin-bottom:var(--space-2)}
.how-step p{color:var(--stone-body);margin:0}
.how-step code{font-family:var(--font-mono);font-size:.92em;background:var(--off);padding:.1em .35em;color:var(--accent-ink)}
@media (max-width:720px){.how{grid-template-columns:1fr}.how-motif img{aspect-ratio:16/9}}

/* =========================================================================
   FROM THE PERSON WHO BUILT IT (Keith) - proof, product-first.
   Marked placeholder photo slot (3:4 portrait) until a real headshot lands.
   ========================================================================= */
.builder{max-width:var(--measure-page);margin:0 auto;display:grid;grid-template-columns:.8fr 1.2fr;gap:var(--space-12);align-items:center}
/* M3: higher-fidelity placeholder - a soft marine duotone with a portrait-shaped
   vignette (head-and-shoulders suggestion) instead of a hatch, so the slot reads as
   "a photo lands here", not "broken/empty", before the real headshot arrives.
   Still unmistakably a marked slot via the mono tag + note. */
.builder-photo{
  position:relative;aspect-ratio:3/4;border:var(--border-ink);overflow:hidden;
  background:
    radial-gradient(58% 42% at 50% 34%, var(--ink-80) 0%, transparent 60%),
    radial-gradient(120% 78% at 50% 128%, var(--ink) 0%, transparent 62%),
    linear-gradient(160deg,#0E3444 0%,var(--ink) 78%);
  display:flex;flex-direction:column;align-items:center;justify-content:flex-end;text-align:center;padding:var(--space-6);gap:var(--space-3);
}
/* the head-and-shoulders silhouette hint: a soft off-white shape sitting in the frame */
.builder-photo::before{
  content:"";position:absolute;left:50%;top:26%;transform:translateX(-50%);
  width:44%;aspect-ratio:3/4;
  background:
    radial-gradient(46% 40% at 50% 30%, rgba(244,242,238,.16) 0%, transparent 72%),
    radial-gradient(70% 55% at 50% 118%, rgba(244,242,238,.14) 0%, transparent 68%);
  pointer-events:none;
}
/* a single ochre baseline rule ties the slot to the page accent */
.builder-photo::after{content:"";position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--accent)}
.builder-photo .ph-tag{position:relative;font-family:var(--font-mono);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-med);color:var(--ink);background:var(--off);border:var(--border-accent);padding:.4rem .7rem}
.builder-photo .ph-note{position:relative;font-family:var(--font-mono);font-size:var(--text-xs);color:var(--stone-30);max-width:22ch}
.builder-copy .label{display:block;margin-bottom:var(--space-3)}
.builder-copy blockquote{margin:0 0 var(--space-6);font-family:var(--font-display);text-transform:none;font-weight:400;font-size:var(--text-lg);line-height:1.4;color:var(--ink);border-left:3px solid var(--accent);padding-left:var(--space-4)}
.builder-copy p{color:var(--stone-body);margin:0 0 var(--space-3);max-width:46ch}
.builder-copy .b-sign{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-wide);color:var(--ink);font-weight:600;margin:0}
.builder-copy .b-sign span{color:var(--stone-body);font-weight:400}
@media (max-width:820px){.builder{grid-template-columns:1fr;gap:var(--space-8)}.builder-photo{max-width:280px;order:-1}}

/* =========================================================================
   WHAT'S INSIDE list + you'll-need panel
   ========================================================================= */
.get-list{list-style:none;padding:0;margin:0;display:grid;gap:0;max-width:var(--measure);margin-left:auto;margin-right:auto}
.get-list li{padding:var(--space-4) 0 var(--space-4) var(--space-6);border-bottom:var(--hairline);position:relative}
.get-list li:first-child{border-top:var(--hairline)}
.get-list li::before{content:"";position:absolute;left:0;top:var(--space-4);width:.85rem;height:.85rem;background:var(--accent)}
.get-list li b{color:var(--ink)}
.get-list li code{font-family:var(--font-mono);font-size:.92em;background:var(--off);padding:.1em .35em;color:var(--accent-ink)}
.need{max-width:var(--measure);margin:var(--space-8) auto 0;border:var(--border);border-left:3px solid var(--accent);background:var(--surface);padding:var(--space-6)}
.need h3{margin-bottom:var(--space-3)}
.need ul{list-style:none;padding:0;margin:0;display:grid;gap:var(--space-2);color:var(--stone-body)}
.need li b{color:var(--ink)}

/* ---------- email-gate form ---------- */
.gate{max-width:var(--measure);margin:0 auto;background:var(--surface);border:var(--border-ink);border-top:4px solid var(--accent);padding:var(--space-8);display:grid;gap:var(--space-3)}
.gate label{display:grid;gap:var(--space-1);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:var(--track-wide);color:var(--ink);font-weight:600}
.gate input{border:var(--border);padding:.8rem .8rem;font:inherit;width:100%;background:var(--surface);color:var(--ink)}
.gate input::placeholder{color:var(--stone-body)}
.gate input:focus{outline:2px solid var(--accent-ink);outline-offset:1px;border-color:var(--accent-ink)}
.gate .hp{position:absolute;left:-9999px;top:-9999px}
.gate button[type=submit]{margin-top:var(--space-2)}
.gate .fine{font-size:var(--text-sm);color:var(--stone-body);margin:0}
.gate .err{display:none;color:var(--alert);font-size:var(--text-sm);margin:0}
.gate-ok{display:none;max-width:var(--measure);margin:0 auto;background:var(--surface);border:var(--border-ink);border-top:4px solid var(--accent);padding:var(--space-8)}
.gate-ok h3{margin-bottom:var(--space-2)}
.gate-ok .muted{margin-bottom:var(--space-6)}
/* C3: success-state hierarchy inverted. The on-screen "Read the guide" button is the
   fastest path to a download (zero email latency) and fires guide_view, so it is the
   DOMINANT primary action - full-width, first. "Check your inbox" demotes to the
   secondary line beneath. Stacked, not equal-weight side-by-side. */
.gate-ok .ok-actions{display:grid;gap:var(--space-3);margin-top:var(--space-2)}
.gate-ok .ok-read{width:100%;text-align:center}
.gate-ok .ok-read[hidden]{display:none}
.gate-ok .ok-inbox{font-size:var(--text-sm);color:var(--stone-body)}

/* ---------- step card (guide) ---------- */
.step{background:var(--surface);border:var(--border);border-left:3px solid var(--accent);padding:var(--space-6);margin:0 0 var(--space-4);position:relative}
.step .step-no{
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:var(--text-lg);color:var(--accent-ink);font-weight:600;
  position:absolute;top:var(--space-4);right:var(--space-4);line-height:1;
}
.step h3{margin-bottom:var(--space-2);padding-right:var(--space-8)}
.step .check{
  border-top:var(--hairline);margin-top:var(--space-4);padding-top:var(--space-3);
  font-size:var(--text-sm);color:var(--stone-body);
}
.step .check b{color:var(--ink)}

/* ---------- tab toggle ---------- */
.tabs{display:inline-flex;border:var(--border);background:var(--surface)}
.tabs button{
  background:transparent;border:0;cursor:pointer;padding:.6rem 1.1rem;
  font:600 var(--text-sm)/1 var(--font-body);letter-spacing:.02em;color:var(--stone-body);
}
.tabs button[aria-pressed="true"]{background:var(--ink);color:var(--off);border-bottom:2px solid var(--accent)}
.switchbar{display:flex;gap:var(--space-3);flex-wrap:wrap;align-items:center;margin:0 0 var(--space-6)}
[data-os="mac"] .only-win{display:none}
[data-os="win"] .only-mac{display:none}
[data-path="vscode"] .only-terminal{display:none}
[data-path="terminal"] .only-vscode{display:none}

/* ---------- copy block ---------- */
.copyblock{display:flex;align-items:stretch;border:var(--border-ink);background:var(--ink);margin:var(--space-3) 0}
.copyblock code{
  flex:1;font:400 var(--text-sm)/1.5 var(--font-mono);color:var(--off);
  padding:.8rem 1rem;overflow-x:auto;white-space:pre;
}
/* A1: the Copy affordance uses the lifted ochre --accent-hover (#C98B49 on --ink is
   ~5.4:1) rather than base --accent (4.6:1, right on the large-text line) to guarantee
   WCAG AA for this small button label. Hover lifts brightness a touch further. */
.copyblock button{
  background:transparent;border:0;border-left:1px solid rgba(201,139,73,.55);color:var(--accent-hover);
  font:600 var(--text-xs)/1 var(--font-body);letter-spacing:var(--track-med);text-transform:uppercase;
  padding:0 1rem;cursor:pointer;flex-shrink:0;
}
.copyblock button:hover{color:#DBA062}

/* ---------- callout ---------- */
.callout{border:var(--border);border-left:3px solid var(--accent);background:var(--surface);padding:var(--space-4);margin:var(--space-4) 0;font-size:var(--text-sm)}
.callout--warn{border-left-color:var(--alert)}
.callout p:last-child{margin:0}

/* ---------- FAQ accordion ---------- */
.faq{border-top:var(--border);max-width:var(--measure);margin:0 auto}
.faq details{border-bottom:var(--border)}
.faq summary{
  cursor:pointer;list-style:none;padding:var(--space-4) 0;
  font-weight:600;font-size:var(--text-md);display:flex;justify-content:space-between;gap:var(--space-3);
}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";color:var(--accent-ink);font-family:var(--font-body);font-weight:400;font-size:var(--text-lg);line-height:1}
.faq details[open] summary::after{content:"\2212"} /* U+2212 minus sign (not en-dash): Taste 9.G safe */
.faq .faq-body{padding:0 0 var(--space-4);color:var(--stone-body);max-width:64ch}

/* ---------- CTA band (ink, full width) - deliberate locked ink family ---------- */
.cta-band{background:var(--ink);color:var(--surface);padding:var(--space-16) 0;text-align:center;border-top:4px solid var(--accent)}
/* the CTA-band H2 keeps the Contralto Big all-caps flourish (one of the reserved slots) */
.cta-band h2{font-family:var(--font-display);font-weight:400;text-transform:uppercase;letter-spacing:var(--track-display);color:var(--surface);margin-bottom:var(--space-3)}
.cta-band p{color:var(--stone-30);max-width:48ch;margin:0 auto var(--space-6)}
.cta-band .btn{margin-top:0}

/* =========================================================================
   MOBILE STICKY CTA BAR - persistent "Get the pack" through a long mobile scroll.
   Mobile only. Hidden by default; JS reveals it once the hero form leaves the
   viewport, and hides it again on the success state. position:sticky is fine here
   (this is a live page, not an Express export). Respects reduced-motion (no slide).
   ========================================================================= */
.mcta{
  position:fixed;left:0;right:0;bottom:0;z-index:40;
  display:none;
  background:var(--ink);border-top:3px solid var(--accent);
  padding:var(--space-2) var(--space-4);
  padding-bottom:calc(var(--space-2) + env(safe-area-inset-bottom,0px));
  align-items:center;justify-content:space-between;gap:var(--space-3);
  transform:translateY(100%);transition:transform .28s var(--ease);
}
.mcta.is-shown{transform:none}
.mcta .mcta-label{color:var(--off);font-size:var(--text-sm);font-weight:600}
.mcta .mcta-label b{color:var(--accent)}
.mcta .btn{padding:.7rem 1.3rem;margin:0;flex-shrink:0}
@media (min-width:721px){.mcta{display:none!important}}
@media (max-width:720px){.mcta.is-active{display:flex}}
@media (prefers-reduced-motion:reduce){.mcta{transition:none}}

/* ---------- loom slot (guide) ---------- */
.loom-slot{background:var(--ink);color:var(--stone-30);padding:var(--space-12) var(--space-6);text-align:center;margin:var(--space-6) 0;font-size:var(--text-sm);border-top:3px solid var(--accent)}
.loom-slot .label{color:var(--accent);display:block;margin-bottom:var(--space-2)}

/* ---------- guide download row ---------- */
.dl{display:flex;gap:var(--space-3);align-items:center;flex-wrap:wrap;margin:var(--space-3) 0}
.dl .fine{font-size:var(--text-sm);color:var(--stone-body);margin:0}

/* ---------- footer ---------- */
.footer{border-top:var(--border);margin-top:0;padding:var(--space-8) 0;font-size:var(--text-xs);color:var(--stone-body)}
.footer .lockup{letter-spacing:var(--track-wide);text-transform:uppercase}
.footer .lockup b{color:var(--ink);font-weight:600}
.footer p{margin:0 0 var(--space-2);max-width:78ch}

/* ---------- scroll-reveal ----------
   a11y 1.3.1 + conversion safety: the hide-then-reveal ONLY applies once JS has
   stamped .js on <html> (head inline script). If JS never runs (or fails before
   IntersectionObserver), .reveal stays at its natural opacity:1, so no content
   below the hero (incl. the capture form region) is ever a blank void. */
.js .reveal{opacity:0;transform:translateY(16px);transition:opacity var(--reveal-dur) var(--ease),transform var(--reveal-dur) var(--ease)}
.js .reveal.is-in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.js .reveal{opacity:1;transform:none;transition:none}html{scroll-behavior:auto}}

/* ---------- responsive ---------- */
@media (max-width:560px){
  .hero{padding:var(--space-4) 0 var(--space-8)}
  .section{padding:var(--space-12) 0}
  .step .step-no{position:static;display:block;margin-bottom:var(--space-1)}
  .step h3{padding-right:0}
}
