/* ============================================================================
   CallPro — site.css
   THE COUNTER TICKET design system, on the CallPro colorway.  (single
   stylesheet, no build step.)

   THE GROUND CHANGED, NOT THE GRAMMAR (2026-07-18).
   Daniel: "I hate the colors. We have a colorway for callpro." The ticket
   grammar stays — perforated modules, mono ticket-number chips, governed
   stamps, redaction bars, the two-door counter. What changed is the light:
   the counter is now DARK ROYAL BLUE (navy). Tickets are off-white receipt
   stock lying on that navy counter — crisp paper artifacts under counter
   light, not a light page.

   THE MARRIAGE
     * NAVY is the stage. navy-900 page ground, navy-950 masthead/bands,
       navy-800 cards. Text on navy is off-white (#F8F7F4), aluminum secondary.
     * PAPER is punctuation. .ticket / .sheet / .card--paper are off-white
       #F8F7F4 stock with near-black ink. Deliberate, for the readable/dense
       moments (a dispatch slip, a receipt, a pricing table, an FAQ answer,
       legal). They do NOT default the page to light.
     * PAPAYA (#FF8700, McLaren orange) is a BUDGET, not a paint: ONE solid
       papaya spend per screenful — the primary CTA or the headline payoff
       word. If you can't tap/click/call it and it isn't the payoff, it's not
       papaya. --papaya-soft (#FFA033) is the only papaya allowed as small
       text / inline links (AA on navy). Papaya buttons = papaya bg + navy-950
       text, NEVER white-on-papaya.
     * ALUMINUM (#A8AEB4) draws every rule/hairline at 1px, ALWAYS. Never
       thicker. On navy the hairline is rgba(248,247,244,.10), interactive .18.
     * COGNAC (#A0673F) is the sparing tertiary: stamp ink, pull-quote bars,
       footer trim. It is a GRAPHICAL proof-mark ink (a stamp is decorative
       reinforcement); it is never small legal body text (see AA note in [10]).
     * STATUS green (#3EC6A0) / amber (#FFB865) are SEMANTIC only — live-state,
       success, attention. Never decorative, never a papaya substitute.

   HOW TO CONSUME (pick exactly ONE per page — never both, or fonts double-load):
     - Marketing/new pages:  <link rel="stylesheet" href="/static/site.css">
     - Un-migrated pages:     <style>{% include '_page_shell.css' %}</style>
                              (_page_shell.css is a thin shim that @imports THIS)
     Then REMOVE any fonts.googleapis.com <link> from that page's <head>
     (self-hosted @font-face below replaces it — the CDN-kill deliverable).

   PAGE SURFACE (set on <body>):
     - default (no attribute) = MARKETING surface: navy ground + faint 7% grid.
     - <body data-surface="doc"> = LEGAL/UTILITY surface: no awning, ~3% grid.
       Set this on terms, privacy, opt-out, sms-consent, contractor join/terms, 404.

   ── COUNTER TICKET DISCIPLINE (violating these is a defect) ─────────────────
   * Papaya spend: at most ONE solid papaya element per screenful (the primary
     .btn or one .mark payoff word). Two papaya per screenful is a defect.
   * The ticket-number chip is NOT papaya (it would blow the budget on every
     ticket) — it is a governed mono stub.
   * Stamp ink is cognac (proof-marks) or semantic green (.stamp--live for
     LINE IS LIVE / FREE). Stamp red is retired. A stamp is never a button.
   * All rules/borders are 1px. The perforation is the shared grammar; at most
     ONE stamp per major module.
   * Off-white is opt-in (.ticket / .sheet / .card--paper / .beat--paper). At
     most ONE .beat--paper band per page — a second paper band on the same page
     is a defect. Do not turn a whole page back into a light site — navy dominates.
   ============================================================================ */


/* ============================================================================
   [1] modern-normalize v3.0.1  (MIT — https://github.com/sindresorhus/modern-normalize)
       inlined so there is zero external request.
   ============================================================================ */
*,::before,::after{box-sizing:border-box}
html{font-family:system-ui,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji';line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}
body{margin:0}
b,strong{font-weight:bolder}
code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}
sup{top:-0.5em}
table{border-color:currentcolor}
button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}
button,[type='button'],[type='reset'],[type='submit']{-webkit-appearance:button}
legend{padding:0}
progress{vertical-align:baseline}
::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}
[type='search']{-webkit-appearance:textfield;outline-offset:-2px}
::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
summary{display:list-item}


/* ============================================================================
   [2] @font-face — self-hosted woff2 (kills the Google Fonts CDN link)
       CANON TYPE: Archivo (display AND body) + IBM Plex Mono.
       Archivo carries the whole face — 400/500 body, 600/700/800/900 display.
       Big Shoulders + Public Sans are OFF-CANON and no longer referenced
       (files remain on disk, just unreferenced).
       Absolute /static paths so they resolve whether this file is <link>ed
       or @imported into an inline <style>.
   ============================================================================ */
@font-face{font-family:'Archivo';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/archivo-400.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:500;font-display:swap;src:url('/static/fonts/archivo-500.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:600;font-display:swap;src:url('/static/fonts/archivo-600.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:700;font-display:swap;src:url('/static/fonts/archivo-700.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:800;font-display:swap;src:url('/static/fonts/archivo-800.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:900;font-display:swap;src:url('/static/fonts/archivo-900.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url('/static/fonts/ibm-plex-mono-400.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:600;font-display:swap;src:url('/static/fonts/ibm-plex-mono-600.woff2') format('woff2')}


/* ============================================================================
   [3] TOKENS  — the CallPro colorway (brand-tokens.json is the SSOT)
   ============================================================================ */
:root{
  /* ── ground: dark royal blue (navy) — the counter ───────────────────────── */
  --navy-950: #060D1A;   /* masthead / bands / deepest panels / recessed fields */
  --navy-900: #0A1628;   /* page ground */
  --navy-800: #0F1E33;   /* cards */
  --navy-750: #13253D;   /* raised card / hover */

  /* ── text on navy ───────────────────────────────────────────────────────── */
  --text:   #F8F7F4;     /* ALL primary readable text on navy (16.9:1) */
  --text-2: #A8AEB4;     /* aluminum — secondary copy, muted (8.1:1) */
  --text-3: #8C97A4;     /* label — fine print, legal, eyebrows. Lightened from #7C8794
                            so it still clears AA over the warm ground bloom on
                            body (5.40:1 at the bloom peak; 6.1:1 on flat navy). */
  --aluminum: var(--text-2);   /* canon vocabulary aliases */
  --label:    var(--text-3);

  /* ── papaya — THE accent, a budget not a paint ──────────────────────────── */
  --papaya:      #FF8700;   /* solid spend: primary CTA / payoff. navy-950 text on it (8.1:1) */
  --papaya-soft: #FFA033;   /* the ONLY papaya for small text/inline links on navy (8.9:1) */
  --papaya-ink:  var(--navy-950);   /* text that sits ON a papaya fill — never white */
  --papaya-hover:#ff9422;   /* the lift on a papaya fill at :hover/:focus-visible — never a paint */

  /* ── cognac — sparing tertiary (stamp ink / pull-quote bars / footer trim) ── */
  --cognac: #A0673F;

  /* ── hairlines: aluminum at low alpha, 1px ALWAYS ───────────────────────── */
  --line:        rgba(248,247,244,.10);
  --line-strong: rgba(248,247,244,.18);   /* interactive: chips, ghost buttons, rules */
  --field-line:  #7C8794;                 /* form-field boundary on navy — WCAG 1.4.11: >=3:1 vs field fill navy-950 (5.3:1) AND ground navy-900 (4.96:1) */
  --field-bg:    var(--navy-950);         /* recessed field fill on navy */

  /* legacy alias names still referenced by out-of-scope templates */
  --line-2: var(--line);

  /* ── semantic status — never decorative ─────────────────────────────────── */
  --ok:      #3EC6A0;   --ok-bg:   rgba(62,198,160,.12);
  --warn:    #FFB865;   --warn-bg: rgba(255,184,101,.10);

  /* ── off-white paper stock (ticket / receipt / readable sheet) ──────────── */
  --paper:        #F8F7F4;   /* the ticket/receipt stock — never pure white */
  --paper-ink:    #0A0A0A;   /* near-black ink on paper (18.5:1) */
  --paper-ink-2:  #3A3A38;   /* muted body ink on paper (10.6:1) */
  --paper-ink-3:  #5C5C58;   /* faint caption ink on paper (6.3:1) */
  --paper-line:        rgba(10,10,10,.14);   /* hairline on paper */
  --paper-line-strong: rgba(10,10,10,.26);   /* perforation / rules on paper */
  --paper-field-line:  #5C5C58;              /* field boundary inside a paper scope (>=3:1 vs paper) */

  /* the surface directly BEHIND a ticket — the perforation "bites" show it.
     default = page ground (navy-900). Override where a ticket sits on paper. */
  --perf-bite: var(--navy-900);

  /* ── surfaces / shadow ──────────────────────────────────────────────────── */
  --ticket-shadow: 0 1px 0 rgba(0,0,0,.20), 0 24px 60px -30px rgba(0,0,0,.55);  /* soft ambient, never hard offset */
  --card-shadow:   0 24px 60px -34px rgba(0,0,0,.55);
  --mast-bg: rgba(6,13,26,.82);   /* navy-950 @ .82 for the blur */

  /* ── typography — Archivo (display AND body) + IBM Plex Mono ─────────────── */
  --font-display: 'Archivo', system-ui, 'Segoe UI', sans-serif;   /* 700/800/900 display */
  --font-body:    'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --font-mono:    'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;

  /* modular scale ~1.25 */
  --fs-hero:    clamp(2.75rem, 6.5vw, 5.25rem);   /* Archivo 800/900 — density-v1:
                               display type may cross the text measure (Linear/Stripe
                               pattern: H1 runs 2-3x body width; paragraphs never do) */
  --fs-title:   clamp(1.75rem, 4vw, 2.5rem);   /* Archivo 700/800 */
  --fs-head:    clamp(1.25rem, 2.4vw, 1.5rem); /* section heads */
  --fs-ticket:  1.0625rem;                     /* ticket & card heads */
  --fs-lede:    1.125rem;
  --fs-body:    1rem;
  --fs-small:   0.875rem;
  --fs-micro:   0.75rem;                        /* mono labels / tags */
  --lh-body:    1.6;
  --tracking-display: -0.02em;                  /* canon: -0.02 to -0.03em on Archivo display */

  /* ── 8px spatial rhythm ─────────────────────────────────────────────────── */
  --space-1: 8px;  --space-2: 16px; --space-3: 24px; --space-4: 32px;
  --space-6: 48px; --space-8: 64px; --space-12: 96px;

  /* ── OCD FOUNDATION: ONE gutter + ONE max-width scale ───────────────────── */
  --gutter:       clamp(1.25rem, 4vw, 2rem);   /* the single page gutter, everywhere */
  --maxw:         1240px;   /* content column (marketing) — density-v1: grids/doors/
                               steps/pairs spend the canvas; text measure UNCHANGED */
  --maxw-prose:   720px;    /* legal / long-form reading column */
  --maxw-narrow:  560px;    /* forms / focused single-column */
  /* section vertical rhythm — one consistent beat between sections */
  --section-y:       clamp(3.5rem, 7vw, 5.5rem);
  --section-y-tight: clamp(2.25rem, 4.5vw, 3.25rem);
  /* THE beat rhythm: the SINGLE vertical gap between every beat, every page.
     Resolves to one number per viewport (~60px mobile, ~86px desktop). Nothing
     may set a competing section padding/margin — beats live in a .beats flex
     column whose `gap` is this token, so the seam is identical everywhere. */
  --beat-gap:        clamp(3.5rem, 6vw, 5.5rem);

  /* THE SINGLE-COLUMN MEASURE — the one width every centered single-column
     element shares (section heads, ledes, prose reading columns, and every
     single-column module: tickets/cards/sheets/bands/forms). Because it is ONE
     token, every such element lands on the SAME left/right edge on every page,
     so content reads as "evened out" — the OCD bar the eye (not just the axis)
     must clear. Grids (.beat--pair/.steps/.counter) intentionally opt out to the
     full --maxw so a centered head over a wider centered grid reads as nested,
     intentional symmetry. Two edges total per page: text-edge + grid-edge. */
  --measure-text: 36rem;   /* 576px — one text column, one edge, site-wide */

  /* legacy measure names (kept so older inline refs resolve) */
  --measure-doc:  var(--maxw-prose);
  --measure-wide: var(--maxw);

  /* ── radii — crisp print-shop, not rounded-SaaS ─────────────────────────── */
  --radius-ticket: 4px;
  --radius-btn:    4px;
  --radius-chip:   3px;
  --radius-card:   var(--radius-ticket);
}


/* ============================================================================
   [4] BASE ELEMENTS
   ============================================================================ */
html{scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){ html{scroll-behavior:auto} }

body{
  font-family:var(--font-body);
  font-weight:400;
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  color:var(--text);
  background-color:var(--navy-900);
  /* The ground is not a flat fill. Three layers, back to front:
       1. a warm papaya bloom high on the page — the counter lamp. Very low
          alpha; it reads as warmth, never as a colour wash, and spends no
          papaya budget (that rule governs SOLID fills, site.css:20-24).
       2. a cool depth pool at the bottom, so the page has a floor.
       3. the blueprint grid on top, aluminum at ~7%.
     Fixed attachment so the light stays put while the page scrolls past it. */
  background-image:
    linear-gradient(rgba(248,247,244,.075) 1px, transparent 1px),
    linear-gradient(90deg, rgba(248,247,244,.075) 1px, transparent 1px),
    radial-gradient(1300px 700px at 50% -6%, rgba(255,135,0,.16), transparent 66%),
    radial-gradient(900px 520px at 50% 108%, rgba(6,13,26,.85), transparent 70%);
  background-size:28px 28px, 28px 28px, 100% 100%, 100% 100%;
  background-position:center top, center top, center top, center bottom;
  background-repeat:repeat, repeat, no-repeat, no-repeat;
  background-attachment:scroll, scroll, fixed, fixed;
  min-height:100vh;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
body[data-surface="doc"]{
  background-image:
    linear-gradient(rgba(248,247,244,.014) 1px, transparent 1px),
    linear-gradient(90deg, rgba(248,247,244,.014) 1px, transparent 1px);
}

h1,h2,h3,h4{
  font-family:var(--font-display);
  font-weight:700;
  line-height:1.06;
  letter-spacing:var(--tracking-display);
  color:var(--text);
  text-wrap:balance;
  /* CANON: mixed case. All-caps display reads juvenile — never uppercase headings. */
}
h1{font-weight:800}

p{margin:0}
a{color:inherit;text-decoration:none;transition:color .15s ease, border-color .15s ease}
strong{font-weight:600}

::selection{background:rgba(255,135,0,.30);color:var(--text)}
:focus-visible{outline:2px solid var(--papaya);outline-offset:2px;border-radius:2px}

img{max-width:100%;height:auto}


/* ============================================================================
   [5] LAYOUT  + OCD FOUNDATIONS
       ONE gutter, ONE max-width scale, ONE section rhythm, centered helpers,
       and a card-CTA baseline utility (flex column + margin-top:auto).
   ============================================================================ */
/* padding-INLINE only. The old `padding:0 var(--gutter)` shorthand cascaded
   over the `main` rule below at higher specificity and zeroed every classed
   <main>'s block padding — which also deadened the print and ≤600px main
   overrides. The gutter is horizontal; block breath belongs to `main`. */
.page{max-width:var(--maxw-prose);margin:0 auto;padding-inline:var(--gutter)}
.page-wide{max-width:var(--maxw);margin:0 auto;padding-inline:var(--gutter)}
.page-narrow{max-width:var(--maxw-narrow);margin:0 auto;padding-inline:var(--gutter)}
main{padding-block:var(--space-4)}   /* mast→first-beat and last-beat→footer breath */

/* section rhythm — every marketing beat uses the same vertical measure */
.section{padding-block:var(--section-y)}
.section--tight{padding-block:var(--section-y-tight)}
.section + .section{border-top:1px solid var(--line)}   /* optional hairline divider */

/* ── THE OCD GEOMETRY DOCTRINE ─────────────────────────────────────────────
   ONE alignment language for the whole public site: CENTER-AXIS COMPOSITION.
     * Every beat opens with a section head (eyebrow + h1/h2 + lede) CENTERED on
       the page axis at a fixed measure — .section-head. The head TEXT (not just
       its block) sits on the axis, so a left-aligned head is a defect the eye
       and geometry_check.py both catch.
     * Every beat lives in a container: a boxed module (.ticket/.card/.sheet) or
       a defined open band (.beat-band). No floating unboxed beats.
     * The whole run of beats is a .beats flex column whose single `gap` is
       --beat-gap, so the rhythm between every beat is identical on every page.
       No beat sets its own section padding/margin to fight it.
     * Two-column paired beats (.beat--pair) are symmetric about the axis and
       stretch so both columns share TOP and BOTTOM edges.
     * Single-column prose/legal pages keep ONE centered container; only the body
       reading column is left-aligned. The opening head is still centered.
   ────────────────────────────────────────────────────────────────────────── */

/* centered helpers */
.center{text-align:center}
.center-col{margin-inline:auto}
.measure{max-width:60ch;margin-inline:auto}
.measure-narrow{max-width:44ch;margin-inline:auto}

/* THE SECTION HEAD — the single head treatment. Centered block at a fixed
   measure; text-centered so the rendered glyph box lands on the axis. */
.section-head{max-width:var(--measure-text);margin-inline:auto;text-align:center}
.section-head > *{margin-left:auto;margin-right:auto}
.section-head .eyebrow,.section-head .section-label{margin-bottom:0.7rem}
.section-head .lede,.section-head .hero-lede,.section-head .subtitle,.section-head .sub{
  max-width:var(--measure-text);margin-bottom:0;text-align:center}
/* the hero head shares the ONE measure too, so its lede/eyebrow land on the same
   text-edge as every other beat; the big h1 balances within it (text-wrap:balance). */
.section-head--wide{max-width:var(--measure-text)}

/* THE BEATS COLUMN — the single source of vertical rhythm. Direct children are
   .beat elements; the flex `gap` IS --beat-gap, so every inter-beat seam is
   identical and no beat needs (or may add) its own section padding. */
.beats{display:flex;flex-direction:column;gap:var(--beat-gap)}
/* a beat carries no vertical margin of its own — rhythm is the .beats gap. It
   keeps any margin-inline:auto so a narrow single-beat container stays centered. */
.beat{margin-block:0;min-width:0}
.beat > .section-head{margin-bottom:var(--space-6)}   /* head-to-body inside a beat */
.beat > .section-head:only-child{margin-bottom:0}

/* THE PAIR — a two-column beat, symmetric about the axis, columns stretched so
   their TOPS and BOTTOMS align (defect: paper artifact ended above its column).
   Both columns are boxed (ticket/card) so equal-height reads as intentional;
   inner CTAs pin to the floor via .cta-foot so visible content shares a bottom. */
.beat--pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--space-6);align-items:stretch}
.beat--pair > *{min-width:0}

/* boxed OPEN band — content that isn't a paper module but must still be
   contained (trade chips, an faq teaser): a quiet hairline band on the navy. */
.beat-band{border:1px solid var(--line);border-radius:var(--radius-card);
  padding:var(--space-4);background:rgba(248,247,244,.02)}
.beat-band--center{text-align:center}

/* card-CTA baseline — sibling cards keep their CTAs on a shared baseline. */
.fill{display:flex;flex-direction:column;height:100%}
.cta-foot{margin-top:auto}

/* ============================================================================
   DENSITY LAYER (density-v1, Daniel's ruling 2026-07-19: "apply it all")
   Comp-v2's alignment grammar is UNTOUCHED — centered heads, left-read bodies,
   one axis, --measure-text stays 576px for every reading block. What changes
   is the WIDTH ECONOMY around the text: the canvas, the ground, and the type.
   Pixel-backed by the density research (tmp/density-refs): no measured site
   stretches body copy past ~70ch; they spend width on grids, split axes,
   full-bleed ground, and display type.
   ============================================================================ */

html{overflow-x:clip}   /* 100vw bands vs scrollbar width */

/* [D1] FULL-BLEED MATERIAL BAND — the GROUND fills the flank, not the text.
   A beat wrapped in .beat--bleed paints edge-to-edge navy-950 with hairline
   seams; its content stays contained in .bleed-inner. Text inside may sit at
   the 576 measure and the flanks now read as intentional material, not
   leftover margin (klim/mercury pattern). */
.beat--bleed{width:100vw;margin-left:calc(50% - 50vw);background:var(--navy-950);
  /* band interior breathes MORE than the beat rhythm around it (x1.25), so the
     material band reads as a deliberate room, not a squeezed strip. */
  border-block:1px solid var(--line);padding-block:calc(var(--beat-gap) * 1.25)}
.beat--bleed > .bleed-inner{max-width:var(--maxw);margin-inline:auto;
  padding-inline:var(--gutter)}

/* [D1b] PAPER BAND — a full-bleed band printed on receipt stock instead of
   navy-950. Joins the paper token scope in [7] (which flips --text/--line/--ok
   etc.); the explicit `color` is MANDATORY — inherited color does not re-resolve
   from re-declared tokens on its own. At most ONE .beat--paper band per page —
   a second paper band on the same page is a defect (see header doctrine). */
.beat--paper{background:var(--paper);color:var(--paper-ink);--perf-bite:var(--paper);
  border-block:1px solid var(--paper-line-strong)}

/* [D2] SPLIT-AXIS BEAT — Vercel pattern: narrow columns spend the full canvas
   on AXIS SPACING, no column crosses a readable measure. Centered .section-head
   stays above (punctuation); the split is the content area: lede LEFT
   (left-read, own column) · paper artifact CENTER · open right flank symmetric
   with the lede's track. (The old .62fr mono spec-caption column restated
   on-page claims and skewed the artifact off-axis — retired.) */
.beat-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,var(--measure-text)) minmax(0,1fr);
  gap:var(--space-6);align-items:start}
.beat-split .split-lede{text-align:left;color:var(--text-2);font-size:var(--fs-lede);
  line-height:1.6;margin:0;max-width:none}

/* [D3] LEDGER TILING — a tall single-column filed list may tile 2-up: each row
   keeps its left-read icon+text grammar and its ≤70ch measure; the GRID spends
   the width (Stripe bento logic: cells narrow, grid wide). */
.cols-2{display:grid;grid-template-columns:1fr 1fr;gap:0 var(--space-6)}

/* [D4] DISPLAY HEAD — a hero H1 may cross the text measure (type is hierarchy,
   not reading copy). Ledes beneath keep --measure-text. */
.section-head--display{max-width:52rem}

@media (max-width: 980px){
  .beat-split{grid-template-columns:1fr;gap:var(--space-3)}
  .cols-2{grid-template-columns:1fr;gap:0}
}

/* utility */
.mono{font-family:var(--font-mono)}
.tnum{font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:-0.01em}
.stack > * + *{margin-top:var(--space-2)}
.mt-auto{margin-top:auto}


/* ============================================================================
   [6] MASTHEAD + FOOTER
   ============================================================================ */
/* Awning — the single counter-trim stripe. Cognac (tertiary), not papaya:
   persistent chrome never spends the papaya budget. */
.awning{height:3px;background:var(--cognac);width:100%}
body[data-surface="doc"] .awning{display:none}

header.mast{
  position:sticky;top:0;z-index:40;
  background:var(--mast-bg);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line);
}
.mast-in{
  display:flex;align-items:center;gap:1.25rem;flex-wrap:wrap;
  /* block-only: the horizontal gutter comes from the .page-wide class this
     element also carries, so the masthead column matches the body + footer.
     A `padding:0.7rem 0` shorthand here would clobber that gutter (this rule
     cascades after .page-wide) and float the whole masthead ~1 gutter left. */
  padding-block:0.7rem;
}
.mast-brand{
  font-family:var(--font-display);font-weight:800;font-size:1.2rem;
  letter-spacing:-0.01em;color:var(--text);
  line-height:1;margin-right:auto;
}
.mast-brand:hover,.mast-brand:focus-visible{color:var(--papaya-soft)}

.mast-nav{display:flex;align-items:center;gap:1.1rem;font-size:var(--fs-small)}
/* The two audience DOORS — the top-level split. Emphasized, never collapsed. */
.mast-door{
  font-weight:600;color:var(--text);
  padding:0.28rem 0;border-bottom:1px solid transparent;white-space:nowrap;
}
.mast-door:hover,.mast-door:focus-visible{border-bottom-color:var(--papaya)}
.mast-door[aria-current="page"]{border-bottom-color:var(--text)}
/* secondary links */
.mast-nav a:not(.mast-door){color:var(--text-2);font-weight:500}
.mast-nav a:not(.mast-door):hover,.mast-nav a:not(.mast-door):focus-visible{color:var(--text)}
.mast-nav a:not(.mast-door)[aria-current="page"]{color:var(--text)}

/* phone pill — the number IS the demo; pinned, mono, outline (never competes
   with the primary papaya CTA). */
.mast-phone{
  font-family:var(--font-mono);font-size:0.8125rem;font-weight:600;letter-spacing:0.01em;
  color:var(--text);background:transparent;
  border:1px solid var(--line-strong);border-radius:var(--radius-btn);
  padding:0.42rem 0.7rem;white-space:nowrap;display:inline-flex;align-items:center;gap:.4rem;
}
.mast-phone svg{width:1em;height:1em;color:var(--ok)}
.mast-phone:hover,.mast-phone:focus-visible{border-color:var(--text);background:rgba(248,247,244,.04)}

/* Footer — a navy-950 band with a hairline. CENTER-AXIS DOCTRINE: the footer is
   part of the public site, so it obeys the ONE alignment language — its content
   is centered on the same axis as every beat above it (never a hard-left block
   under centered content). */
footer.footer{
  margin-top:var(--section-y);
  border-top:1px solid var(--line);
  background:var(--navy-950);
  padding:var(--space-6) 0 var(--space-8);
  text-align:center;
}
.footer-doors{display:flex;gap:1.25rem;flex-wrap:wrap;justify-content:center;margin-bottom:1.25rem}
.footer-doors a{
  font-family:var(--font-display);font-weight:700;font-size:1.0625rem;
  letter-spacing:-0.01em;color:var(--text);border-bottom:1px solid var(--line-strong);padding-bottom:2px;
}
.footer-doors a:hover,.footer-doors a:focus-visible{border-bottom-color:var(--papaya)}
.footer-id{font-family:var(--font-display);font-weight:700;font-size:1.0625rem;color:var(--text);margin-bottom:0.4rem}
.footer-note{font-size:0.8125rem;color:var(--text-3);line-height:1.6;max-width:62ch;margin:0 auto 0.9rem}
.footer .disclaimer{font-size:0.8125rem;color:var(--text-2);line-height:1.6;max-width:62ch;margin:0 auto 1.25rem}
.footer .links{display:flex;flex-wrap:wrap;justify-content:center;gap:0.5rem 1.25rem;font-size:var(--fs-small);color:var(--text-2);margin-bottom:1.25rem}
.footer .links a{color:var(--text-2)}
.footer .links a:hover,.footer .links a:focus-visible{color:var(--text);text-decoration:underline;text-underline-offset:3px}
.footer .copy,.footer .legal{font-size:0.8125rem;color:var(--text-3);font-family:var(--font-mono)}


/* ============================================================================
   [7] THE TICKET  — perforated receipt-stock module (the shared grammar).
       PAPER SCOPE: a ticket redefines the text/line tokens locally, so every
       descendant (headings via var(--text), copy via var(--text-2), rules via
       var(--line)) flips to dark-ink-on-paper automatically. This is what
       makes the ghost button, chips, ledger, etc. "just work" on paper.
   ============================================================================ */
.ticket,.sheet,.card--paper,.beat--paper{
  --text:   var(--paper-ink);
  --text-2: var(--paper-ink-2);
  --text-3: var(--paper-ink-3);
  --line:        var(--paper-line);
  --line-strong: var(--paper-line-strong);
  --field-line:  var(--paper-field-line);
  --field-bg:    var(--paper);
  /* semantic green must darken on paper too: the navy --ok (#3EC6A0) is only
     2.0:1 on #F8F7F4 (AA FAIL). This paper value is 5.44:1 — same green family,
     AA on paper. Reaches every element that reads var(--ok) DIRECTLY on paper:
     .stamp--live, .elapsed, .tag--live, .log-event--final .tag, .live-dot — so
     every "live" mark reads as crisp ink. (Root aliases like --ledger-green
     resolve --ok at :root, so they'd keep navy green — but nothing consumes
     them, verified 2026-07-18; if a paper surface ever does, re-declare it here.) */
  --ok:     #18734F;
  /* cognac stamp ink darkens on paper too: root #A0673F is 4.29:1 on stock
     (under the 4.5:1 small-text bar); this value is 5.70:1 — same family,
     AA on paper. Reaches .stamp / .stamp::before / .faq-a a:hover. */
  --cognac: #8A5433;
  color:var(--paper-ink);
  background:var(--paper);
}

.ticket{
  position:relative;overflow:hidden;
  border:1px solid var(--paper-line-strong);
  border-radius:var(--radius-ticket);
  box-shadow:var(--ticket-shadow);
  padding:var(--space-3);
}
.ticket--pad-lg{padding:var(--space-4)}

/* mono ticket-number chip, top-left — a GOVERNED STUB, not papaya (a papaya
   chip on every ticket blows the budget). Dark mono on a faint fill.
   CO-EQUAL DOORS: give BOTH audience tickets the SAME chip so neither ranks. */
.ticket__no{
  display:inline-block;
  font-family:var(--font-mono);font-weight:600;font-size:var(--fs-micro);
  letter-spacing:0.06em;text-transform:uppercase;
  color:var(--paper-ink);background:rgba(10,10,10,.05);
  border:1px solid var(--paper-line);
  border-radius:var(--radius-chip);padding:0.15rem 0.5rem;margin-bottom:0.9rem;
}
.ticket__no--plain{color:var(--paper-ink-2);background:transparent;border-color:var(--paper-line)}

.ticket__kicker{
  font-family:var(--font-mono);font-size:var(--fs-micro);font-weight:600;
  letter-spacing:0.1em;text-transform:uppercase;color:var(--paper-ink-3);margin-bottom:0.5rem;
}
.ticket__title{font-family:var(--font-display);font-weight:800;font-size:var(--fs-title);letter-spacing:-0.02em;line-height:1.02;color:var(--paper-ink);margin-bottom:0.6rem}
.ticket__head{font-family:var(--font-display);font-weight:700;font-size:1.25rem;letter-spacing:-0.01em;color:var(--paper-ink);margin-bottom:0.5rem}
.ticket p{color:var(--paper-ink-2);line-height:1.55}
.ticket p + p{margin-top:0.6rem}

/* THE PERFORATION — a punched tear line + a semicircular bite at each edge.
   The bite is filled with --perf-bite (the surface BEHIND the ticket) so the
   punched-hole illusion holds. Pure CSS, no SVG.
   B8 (doctrine-v2): the tear is a FIXED-PITCH repeating-linear-gradient, not a
   browser-dependent `border-style:dashed` — so every perforation reads as one
   authored 4px-on / 3px-off punch at the same cadence everywhere, matching the
   control the ::before/::after bite circles already have. Same ink token
   (--paper-line-strong), zero markup. The rule is now height:1px (a real 1px band
   carrying the gradient); the bites re-center on it via top:50% (was top:0 over a
   0-height border). */
.perf{
  position:relative;height:1px;border:0;
  margin:var(--space-3) calc(-1 * var(--space-3));
  background:repeating-linear-gradient(to right,
    var(--paper-line-strong) 0 4px, transparent 4px 7px);
  /* overflow:visible so the bite circles escape the perf's own 1px box and get
     clipped to half-circles by the .ticket instead. Without this, an <hr class="perf">
     (frontdesk callslip) clips its own ::before/::after to a 1px sliver via the UA
     `hr{overflow:hidden}`, while a <div class="perf"> shows them fully — B8's whole
     point is one identical perforation on every ticket regardless of the element. */
  overflow:visible;
}
.ticket--pad-lg .perf{margin:var(--space-3) calc(-1 * var(--space-4))}
.perf::before,.perf::after{
  content:"";position:absolute;top:50%;width:14px;height:14px;border-radius:50%;
  background:var(--perf-bite);transform:translateY(-50%);
}
.perf::before{left:-7px}
.perf::after{right:-7px}

/* the stub below a perforation (the CTA half of a ticket) */
.ticket__stub{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);flex-wrap:wrap}

/* ticket lifts like a slip picked off the counter */
.ticket--lift{transition:transform .15s ease, box-shadow .15s ease}
.ticket--lift:hover,.ticket--lift:focus-within{transform:translateY(-2px);box-shadow:0 2px 0 rgba(0,0,0,.18), 0 30px 48px -28px rgba(0,0,0,.65)}

/* a ticket laid to fill its grid cell, CTA stub pinned to a shared baseline */
.ticket--fill{display:flex;flex-direction:column;height:100%}
.ticket--fill .perf{margin-top:auto}
/* LEFT-READ door chip (doctrine-v2). .ticket--fill makes .ticket__no a flex item,
   whose default align-self:stretch would blow the mono chip to full ticket width.
   Pin it left so a LEFT-READ door — the canonical /pricing spec: .ticket ticket--fill
   with NO .ticket--center — lands its No. chip top-left with NO inline style. This
   promotes the align-self:flex-start that /pricing + /contact door chips carry inline
   into the shared vocabulary, so the homepage agent flips the hero doors to left-read
   just by dropping .ticket--center (chip → top-left, kicker/title/body → left, stub →
   space-between: byte-matches the /pricing door). Placed BEFORE .ticket--center below:
   equal specificity (0,2,0) + earlier source order means .ticket--center .ticket__no
   {align-self:center} still wins on the un-flipped hero doors, so this is zero visual
   change until a page agent removes .ticket--center. */
.ticket--fill .ticket__no{align-self:flex-start}

/* the two audience doors, laid on the counter */
.counter{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);align-items:stretch}

/* CENTERED DOOR-TICKET INTERIOR - "even the cards and everything inside centered"
   (Daniel, 2026-07-18), applied to the two co-equal HERO doors (homepage counter).
   The chip, kicker, title, and copy center on the axis; the baseline-pinned CTA
   stub centers its button+stamp as ONE group. HERO doors only: the pricing/contact
   door slips carry two paragraphs of billing/booking copy and stay LEFT-READ
   (centering long copy rags). NOTE the perf line is a zero-content, full-bleed
   FLEX ITEM, so never set align-items:center on a .ticket--center (it collapses the
   perforation to 0 width). text-align + align-self on the chip is all that's needed;
   the chip is a flex item, so text-align cannot move it. align-self:center does. */
.ticket--center{text-align:center}
.ticket--center .ticket__no{align-self:center}
.ticket--center .ticket__title,.ticket--center p{text-wrap:balance}
.ticket--center .ticket__stub{justify-content:center}


/* ── THE FAQ ACCORDION (portable, doctrine-v2) ──────────────────────────────
   A left-read details/summary paper module: put it inside a .ticket (paper
   scope) as `<div class="ticket faq-ticket">` with `<details class="faq-row">`
   rows. Native <details>/<summary> only — no JS, keyboard + reduced-motion safe,
   and every answer stays in the DOM whether open or closed (so a collapsed
   answer is still indexed and still matches its FAQPage JSON-LD).
   HOISTED from the /faq page's local <style> into the shared system so the same
   component can be instantiated on the homepage (#questions PM set) and
   /front-desk (#questions shops set) during the FAQ fold-in. These selectors are
   plain classes (never scoped to a faq-page container), so they apply cleanly
   anywhere the markup lands. The /faq audience-toggle rules (.pill-toggle-group
   layout, .faq-set) stay page-local — they are page furniture, not the component. */
.faq-ticket{
  --faq-pad-x:1.25rem;
  --faq-pad-y:1rem;
  --faq-marker:1.75rem;             /* mono marker column; answer text starts past it */
  padding:0;                        /* rows own their padding, edge to edge */
  max-width:var(--measure-text);
  margin-inline:auto;
}
.faq-row{border-top:1px solid var(--paper-line)}   /* one hairline between rows */
.faq-row:first-child{border-top:0}                 /* no double line at the module's top edge */
.faq-q{
  display:flex;align-items:baseline;
  padding:var(--faq-pad-y) var(--faq-pad-x);
  font-family:var(--font-body);font-weight:600;    /* Archivo semibold */
  font-size:1.0625rem;line-height:1.35;
  color:var(--paper-ink);cursor:pointer;
  list-style:none;                                 /* kill the native disclosure marker */
  -webkit-tap-highlight-color:transparent;
}
.faq-q::-webkit-details-marker{display:none}       /* Safari / older Chrome */
/* the state marker: a mono glyph in a fixed-width column, ordered FIRST so the
   markers line up in one left column and answers indent past them. The `/ ""`
   empty alt-text keeps assistive tech from reading the glyph (<details> already
   announces expanded/collapsed). */
.faq-q::after{
  content:"+" / "";order:-1;
  flex:0 0 var(--faq-marker);
  font-family:var(--font-mono);font-weight:600;font-size:1rem;line-height:inherit;
  color:var(--paper-ink-3);
}
details[open] > .faq-q::after{content:"\2212" / ""}   /* minus sign when open */
.faq-q:hover{background:rgba(10,10,10,.03)}
/* inset ring so the focus outline is not clipped by the ticket's overflow:hidden */
.faq-q:focus-visible{outline:2px solid var(--papaya);outline-offset:-2px;border-radius:2px}
.faq-a{
  /* left pad = row pad + marker column, so answer text aligns under the QUESTION
     text, not under the marker. */
  padding:0.1rem var(--faq-pad-x) var(--faq-pad-y) calc(var(--faq-pad-x) + var(--faq-marker));
}
.faq-a p{margin:0}                                 /* .ticket p already sets paper-ink + leading */
.faq-a a{color:var(--paper-ink);text-decoration:underline;text-underline-offset:2px;text-decoration-color:var(--paper-line-strong)}
.faq-a a:hover{text-decoration-color:var(--cognac)}


/* ============================================================================
   [8] THE SHEET  — a full-width off-white readable panel (dense/legal light
       surface). Same paper scope as the ticket, but a plain filed sheet
       (no perforation) for pricing tables, FAQ answers, long legal reading.
   ============================================================================ */
.sheet{
  border:1px solid var(--paper-line-strong);
  border-radius:var(--radius-ticket);
  box-shadow:var(--card-shadow);
  padding:var(--space-4);
}
.sheet--flush{padding:var(--space-4) var(--gutter)}


/* ============================================================================
   [9] CARD  — the on-navy dark tile (navy dominates). Light text.
       For glanceable on-navy content modules (how-it-works steps, feature
       tiles, integration blurbs). Use .card--paper when you specifically want
       a readable paper card instead.
   ============================================================================ */
.card{
  background:var(--navy-800);
  border:1px solid var(--line);
  border-radius:var(--radius-card);
  padding:var(--space-3);
  box-shadow:var(--card-shadow);
  color:var(--text);
}
.card--raised{background:var(--navy-750)}
.card h3{font-family:var(--font-display);font-weight:700;font-size:var(--fs-ticket);letter-spacing:-0.01em;color:var(--text);margin-bottom:0.5rem}
.card p{color:var(--text-2);line-height:1.6}
.card p + p{margin-top:0.75rem}
.card a:not(.btn){color:var(--papaya-soft);text-decoration:underline;text-underline-offset:2px}
/* paper card = the ticket paper scope minus the perforation */
.card--paper{
  border:1px solid var(--paper-line-strong);
  border-radius:var(--radius-card);
  padding:var(--space-3);
  box-shadow:var(--ticket-shadow);
}
.card--paper h3{color:var(--paper-ink)}
.card--paper p{color:var(--paper-ink-2)}
.card--paper a:not(.btn){color:var(--paper-ink)}

/* CENTERED CARD INTERIOR - the "even the cards, everything inside centered"
   composition (Daniel, 2026-07-18). SHORT-CONTENT cards ONLY: icon top-center,
   heading + short copy centered beneath it, any footer link/stamp centered at the
   floor via .cta-foot. Applied PER-CARD in the templates, never as a blanket grid
   selector, so a long-copy card is simply left un-centered. Two hard rules keep
   centered copy from ragging:
     1. Copy is capped to the SHORT measure (~34ch) and balanced, so centered lines
        stay tidy instead of stretching the full card width.
     2. A card whose copy runs past ~5 centered lines at 1440 is LEFT-ALIGNED
        instead (and flagged), never force-centered.
   Paper DOCUMENTS are excluded ON PURPOSE and stay LEFT-READ: the example call
   slip, the text-back / dispatch tickets, /proof receipts, FAQ accordion answers,
   legal + about prose, and form fields/labels. A document is read from the left
   margin down; centering it would be a defect, not a fix. */
.card--center{display:flex;flex-direction:column;align-items:center;text-align:center}
.card--center > p{max-width:34ch;margin-inline:auto;text-wrap:balance}


/* ============================================================================
   [10] THE STAMP  — governed rubber stamp (crisp, flat, no distress).
        Default ink = COGNAC (proof-marks: NEW / RECORDED & AI-ASSISTED /
        ON THE LEDGER / AI-ASSISTED).
        .stamp--live = semantic GREEN (live-state facts: LINE IS LIVE / FREE).
        Honesty: assert only first-person facts. Never VERIFIED / CERTIFIED / counts.

        AA NOTE (conscious tension, per canon which mandates cognac stamps):
        cognac #A0673F on navy is 3.89:1 — it clears the 3:1 bar for a GRAPHICAL
        object (the double-bordered stamp frame) but is under 4.5:1 for small
        body text. (On paper the scope in [7] re-declares --cognac to #8A5433,
        5.70:1 on stock, so paper stamps clear AA outright.)
        A stamp is a decorative proof-mark reinforcing info stated in
        plain text nearby; it is never the sole carrier of essential prose. Small
        legal/fine-print copy uses --text-3 (aluminum-label, AA), never cognac.
        The live/free stamps use semantic green (8.45:1, AA) for real legibility.
   ============================================================================ */
.stamp{
  position:relative;display:inline-block;
  font-family:var(--font-mono);font-weight:600;font-size:var(--fs-micro);
  letter-spacing:0.12em;text-transform:uppercase;line-height:1;
  color:var(--cognac);
  border:1px solid var(--cognac);border-radius:2px;
  padding:0.42rem 0.6rem;
  /* matched size class: a floor width + centered text so a 3-letter stamp (NEW,
     FREE) carries the same visual weight as a longer sibling (LINE IS LIVE) —
     stamps on sibling modules must read as the same class, not two sizes. */
  min-width:5rem;text-align:center;
  transform:rotate(-3deg);transform-origin:center;
  background:transparent;
}
.stamp::before{         /* the inner line = the classic double-border stamp */
  content:"";position:absolute;inset:3px;border:1px solid var(--cognac);
  border-radius:1px;pointer-events:none;
}
.stamp--live{color:var(--ok);border-color:var(--ok)}
.stamp--live::before{border-color:var(--ok)}
.stamp--flat{transform:none}
.stamp--sm{font-size:0.6875rem;padding:0.32rem 0.5rem;letter-spacing:0.1em;min-width:4rem}


/* ============================================================================
   [11] BUTTONS
        PRIMARY (.btn) = the papaya spend: papaya bg + navy-950 text. ONE per
                         screenful. Works on navy AND on paper (papaya carries
                         its own ground).
        GHOST  (.btn-ghost) = secondary. Uses var(--text)/var(--line-strong),
                         so it auto-flips: light outline on navy, dark ink
                         outline inside a ticket/sheet paper scope.
        QUIET  (.btn-quiet) = solid workhorse that is NOT papaya (navy-800
                         fill), for when a solid button is needed but the papaya
                         budget is already spent.
   ============================================================================ */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:0.55rem;
  font-family:var(--font-body);font-weight:700;font-size:1rem;line-height:1;
  letter-spacing:-0.01em;
  color:var(--papaya-ink);background:var(--papaya);
  border:1px solid var(--papaya);border-radius:var(--radius-btn);
  padding:0.85rem 1.35rem;cursor:pointer;
  transition:transform .12s ease, background .15s ease, box-shadow .15s ease;
  text-align:center;
}
.btn:hover,.btn:focus-visible{background:var(--papaya-hover);transform:translateY(-2px);box-shadow:0 12px 26px -14px rgba(255,135,0,.6)}
.btn:active{transform:translateY(0)}
.btn svg{width:1.15em;height:1.15em;color:currentColor}
.btn .num{font-family:var(--font-mono);font-weight:600;letter-spacing:0}

/* secondary / ghost — outline; auto dual-ground via the scoped tokens */
.btn-ghost{
  color:var(--text);background:transparent;border:1px solid var(--line-strong);
}
.btn-ghost:hover,.btn-ghost:focus-visible{border-color:var(--text);background:rgba(248,247,244,.06);transform:translateY(-2px)}
.ticket .btn-ghost:hover,.sheet .btn-ghost:hover,.card--paper .btn-ghost:hover{background:rgba(10,10,10,.05)}
.btn-ghost svg{color:currentColor}

/* solid workhorse, non-papaya */
.btn-quiet{color:var(--text);background:var(--navy-800);border:1px solid var(--line-strong)}
.btn-quiet:hover,.btn-quiet:focus-visible{background:var(--navy-750);transform:translateY(-2px)}
.btn-quiet svg{color:currentColor}

.btn-lg{font-size:1.0625rem;padding:0.95rem 1.6rem}
.btn-block{display:flex;width:100%}


/* ============================================================================
   [12] PROSE + document typography  (about / legal / long-form)
        Renders light-on-navy by default. Wrap in .sheet / .card--paper to get
        the off-white readable treatment (paper scope flips the tokens).
   ============================================================================ */
.section-label{
  font-family:var(--font-mono);font-size:var(--fs-micro);font-weight:600;
  letter-spacing:0.14em;text-transform:uppercase;color:var(--papaya-soft);
  margin-bottom:0.75rem;
}
.eyebrow{font-family:var(--font-mono);font-size:var(--fs-micro);font-weight:600;letter-spacing:0.12em;text-transform:uppercase;color:var(--papaya-soft);margin-bottom:0.6rem}

.section-title{font-family:var(--font-display);font-weight:800;font-size:var(--fs-title);letter-spacing:-0.02em;line-height:1.06;color:var(--text);margin-bottom:0.6rem}

h1.page-h1,.prose h1{font-size:var(--fs-title);letter-spacing:-0.02em;line-height:1.06;margin-bottom:1.1rem}
.lede{font-size:var(--fs-lede);color:var(--text-2);line-height:1.6;margin-bottom:2.25rem;max-width:var(--measure-text)}

.prose{max-width:var(--measure-text);margin-inline:auto}   /* reading column on the ONE text-edge (text reads left, column centered) */
/* legal/long-form pages ARE their prose container (.page.prose): the .page gutter
   padding would otherwise shrink the reading column below the token and pull its
   ink edge inward. Add the gutter back so the CONTENT resolves to exactly
   --measure-text — legal ink lands on the same text-edge as every marketing beat. */
.page.prose{max-width:calc(var(--measure-text) + 2 * var(--gutter))}
.prose h2{font-family:var(--font-display);font-weight:700;font-size:var(--fs-head);letter-spacing:-0.01em;margin:2.25rem 0 0.75rem}
.prose h3{font-family:var(--font-display);font-weight:700;font-size:1.1rem;letter-spacing:-0.01em;margin:1.6rem 0 0.5rem}
.prose p{color:var(--text-2);line-height:1.7;margin-bottom:1rem;max-width:var(--measure-text)}
.prose ul,.prose ol{color:var(--text-2);line-height:1.7;margin:0 0 1rem 1.25rem}
.prose li{margin-bottom:0.35rem}
/* in-prose links UNDERLINED — color-alone fails WCAG. On navy, papaya-soft;
   inside a paper scope, dark ink (papaya-soft fails AA on paper). */
.prose a,a.inline-link{color:var(--papaya-soft);font-weight:600;text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:2px;text-decoration-color:rgba(255,160,51,.5)}
.prose a:hover,.prose a:focus-visible,a.inline-link:hover{text-decoration-color:var(--papaya-soft)}
.ticket a.inline-link,.sheet a.inline-link,.card--paper a.inline-link,
.ticket .prose a,.sheet .prose a,.card--paper .prose a{color:var(--paper-ink);text-decoration-color:var(--paper-line-strong)}
.ticket a.inline-link:hover,.sheet a.inline-link:hover{text-decoration-color:var(--cognac)}

/* one highlighter payoff per page. FIX (P0): the old treatment painted a solid
   papaya stripe at 88% of the line box — mid-glyph — so it read as STRIKETHROUGH.
   The stripe is killed. The mark is now a full-line-height translucent papaya
   WASH behind the whole phrase (a real highlighter, behind the ink, never through
   it): it cannot read as a strike, and being translucent it never counts as a
   solid-papaya spend against the budget. */
.mark{
  background-color:rgba(255,135,0,.18);
  border-radius:2px;
  padding:0.04em 0.2em;
  color:inherit;
  box-decoration-break:clone;-webkit-box-decoration-break:clone;
}


/* ============================================================================
   [13] FORMS  (contractor join / opt-out / sms-consent).
        Field tokens (--field-bg / --field-line) are scoped: recessed navy on
        the navy ground, off-white inside a paper scope. AA field borders per
        WCAG 1.4.11 baked into the tokens (see [3]).
   ============================================================================ */
.form-group{margin-bottom:1.25rem}
label{display:block;font-weight:600;font-size:var(--fs-small);margin-bottom:0.4rem;color:var(--text)}
.optional{color:var(--text-3);font-weight:400}
.required{color:var(--papaya-soft)}

input[type=text],input[type=tel],input[type=email],input[type=password],
input[type=number],input[type=url],select,textarea{
  width:100%;font-family:var(--font-body);font-size:1rem;color:var(--text);
  background:var(--field-bg);border:1px solid var(--field-line);border-radius:var(--radius-btn);
  padding:0.7rem 0.8rem;transition:border-color .15s ease, box-shadow .15s ease;
}
input::placeholder,textarea::placeholder{color:var(--text-3)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--papaya);box-shadow:0 0 0 3px rgba(255,135,0,.18)}
input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none}
textarea{min-height:8rem;resize:vertical}

/* consent / checkbox rows */
.checkbox-item,.consent-box{
  display:flex;gap:0.7rem;align-items:flex-start;
  background:rgba(248,247,244,.03);border:1px solid var(--line-strong);border-radius:var(--radius-ticket);
  padding:1rem;margin-bottom:1rem;
}
.ticket .checkbox-item,.ticket .consent-box,.sheet .checkbox-item,.sheet .consent-box{background:rgba(10,10,10,.03)}
.checkbox-item input[type=checkbox],.consent-box input[type=checkbox]{
  width:1.15rem;height:1.15rem;margin-top:0.15rem;flex:0 0 auto;accent-color:var(--papaya);
}
.consent-text{font-size:0.85rem;color:var(--text-2);line-height:1.55}
.consent-text a{color:var(--papaya-soft);text-decoration:underline;text-underline-offset:2px}
/* on paper, papaya-soft links/asterisks fall to ~2.25:1 — flip to ink/red */
.ticket .consent-text a,.sheet .consent-text a,.card--paper .consent-text a{color:var(--paper-ink);text-decoration-color:var(--paper-line-strong)}
.ticket .required,.sheet .required,.card--paper .required{color:#A5331C}

.submit-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:0.55rem;
  font-family:var(--font-body);font-weight:700;font-size:1.0625rem;letter-spacing:-0.01em;
  color:var(--papaya-ink);background:var(--papaya);border:1px solid var(--papaya);
  border-radius:var(--radius-btn);padding:0.9rem 1.5rem;cursor:pointer;width:100%;
  transition:transform .12s ease, background .15s ease;
}
.submit-btn:hover,.submit-btn:focus-visible{background:var(--papaya-hover);transform:translateY(-2px)}

/* pill toggle (faq audience switch) rendered as two tabs */
.pill-toggle-group{display:inline-flex;gap:0;border:1px solid var(--line-strong);border-radius:var(--radius-ticket);overflow:hidden;background:rgba(248,247,244,.03)}
.ticket .pill-toggle-group,.sheet .pill-toggle-group{background:rgba(10,10,10,.03)}
.pill-toggle{
  font-family:var(--font-mono);font-size:0.8125rem;font-weight:600;letter-spacing:0.04em;text-transform:uppercase;
  color:var(--text-2);background:transparent;border:0;padding:0.55rem 1rem;cursor:pointer;
}
.pill-toggle + .pill-toggle{border-left:1px solid var(--line-strong)}
/* faq renders the pills as anchors inside .prose, whose `.prose a` color (0,1,1)
   otherwise bleeds papaya-soft onto the idle tab, beating plain `.pill-toggle`
   (0,1,0) and inverting the control. Re-assert the aluminum idle color at group
   scope; :not(.is-active) keeps it off the active pill so source order never
   matters. No-op on the button pages (already aluminum) — only faq's idle anchor. */
.pill-toggle-group .pill-toggle:not(.is-active){color:var(--text-2)}
/* Active pill is a lit receipt-stock tab (off-white paper, near-black ink) — NOT
   papaya: on the two-door pages the papaya budget is owned by the phone CTA in the
   same fold, and a papaya pill would be a second solid spend (defect). --paper /
   --paper-ink are fixed tokens, so this reads correctly on navy AND inside any
   paper scope without an override. */
.pill-toggle[aria-selected="true"],.pill-toggle.is-active,.pill-toggle[aria-current="true"]{color:var(--paper-ink);background:var(--paper)}

/* flash / status blocks */
.flash,.error,.success,.info-box{
  border-radius:var(--radius-ticket);padding:0.85rem 1rem;margin-bottom:1.25rem;
  font-size:var(--fs-small);line-height:1.55;border:1px solid var(--line);
}
.error{color:#FF8B7A;border-color:rgba(255,139,122,.5);background:rgba(255,139,122,.08)}
.success{color:var(--ok);border-color:rgba(62,198,160,.5);background:var(--ok-bg)}
.info-box{color:var(--text-2);background:rgba(248,247,244,.03)}
/* on paper, flashes read as ink on the sheet */
.ticket .error,.sheet .error{color:#A5331C;border-color:rgba(165,51,28,.5);background:rgba(165,51,28,.06)}
.ticket .success,.sheet .success{color:#1E5A40;border-color:rgba(30,90,64,.5);background:rgba(30,90,64,.06)}


/* ============================================================================
   [14] REDACTION BAR  — solid ink block over PII (FOIA register).
        On navy the bar is off-white ink (a censor bar under counter light);
        inside a paper scope it is near-black. Uses currentColor-independent
        explicit fills so it reads as a solid block on either ground.
   ============================================================================ */
.redact{
  color:transparent;background:var(--text);border-radius:2px;
  padding:0 0.15em;user-select:none;white-space:nowrap;
  box-shadow:0 0 0 1px var(--text);
}
.ticket .redact,.sheet .redact,.card--paper .redact{background:var(--paper-ink);box-shadow:0 0 0 1px var(--paper-ink)}
.redact::selection{background:var(--text);color:transparent}
.ticket .redact::selection,.sheet .redact::selection{background:var(--paper-ink);color:transparent}


/* ============================================================================
   [15] LEDGER / RECEIPT + chips  (mono event rows — /proof, dispatch mock).
        Lives inside a .ticket (paper scope), so its tokens are already dark.
   ============================================================================ */
.ledger{font-family:var(--font-mono);font-size:0.8125rem;line-height:1.7;color:var(--text)}
.ledger__row{display:flex;gap:0.75rem;align-items:baseline;padding:0.2rem 0;border-bottom:1px dotted var(--line)}
.ledger__row:last-child{border-bottom:0}
.ts{font-family:var(--font-mono);color:var(--text-3);font-variant-numeric:tabular-nums;white-space:nowrap}
.elapsed{color:var(--ok);font-weight:600;white-space:nowrap}

/* event-tag chip — bordered mono, framing not shouting */
.tag{
  display:inline-block;font-family:var(--font-mono);font-size:var(--fs-micro);font-weight:600;
  letter-spacing:0.04em;color:var(--text);background:transparent;
  border:1px solid var(--line-strong);border-radius:var(--radius-chip);padding:0.1rem 0.4rem;
}
.tag--live{color:var(--ok);border-color:var(--ok)}

/* live status dot (semantic green) */
.live-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--ok);vertical-align:middle}

/* icon sizing for inlined Lucide SVGs */
.icon{width:1.15em;height:1.15em;display:inline-block;vertical-align:-0.15em;flex:0 0 auto}
.icon-lg{width:1.6rem;height:1.6rem}

/* trade / vertical tag row */
.tags{display:flex;flex-wrap:wrap;gap:0.5rem}
.chip{
  font-family:var(--font-mono);font-size:var(--fs-micro);font-weight:600;letter-spacing:0.04em;
  color:var(--text-2);background:rgba(248,247,244,.04);border:1px solid var(--line);
  border-radius:var(--radius-chip);padding:0.28rem 0.6rem;display:inline-flex;align-items:center;gap:0.35rem;
}
.chip svg{width:1em;height:1em;color:var(--text-3)}
.ticket .chip,.sheet .chip{background:rgba(10,10,10,.04)}


/* ============================================================================
   [16] LEGACY porcelain aliases — keep un-migrated pages coherent on the new
        system until page agents move them onto ticket/card/prose markup.
        These map the RETIRED warm token names onto the canon. They reference
        the canon vars, so inside a .ticket/.sheet paper scope they re-resolve
        to the paper tones automatically.
        NOTE: page agents migrating a page should drop these names in favor of
        the canon tokens — they exist only as a bridge.
   ============================================================================ */
:root{
  --ink:    var(--text);
  --ink-2:  var(--text-2);
  --ink-3:  var(--text-3);
  --manila:  var(--navy-900);
  --receipt: var(--navy-800);   /* legacy "receipt" panels were dark surfaces in inline styles; map to the dark card so they read on navy. TRUE paper is .ticket/.sheet. */
  --rule:        var(--line);
  --rule-strong: var(--line-strong);
  --ledger-green: var(--ok);
  --stamp-red:    var(--cognac);   /* stamps are cognac now */
  --marigold:     var(--papaya-soft);  /* legacy accent → papaya-soft (a text/mark tone, never a fill here) */
  --stamp-ink:    var(--cognac);
  --live-ink:     var(--ok);
  --awning-fill:  var(--cognac);
  --chip-fill:    var(--papaya);
  --chip-ink:     var(--papaya-ink);
  --mark-fill:    var(--papaya);
  --grid-ink:     rgba(248,247,244,.075);
  --grid-ink-doc: rgba(248,247,244,.03);
}

/* the old orange phone-btn → the papaya primary */
.phone-btn{
  display:inline-flex;align-items:center;gap:0.6rem;
  background:var(--papaya);color:var(--papaya-ink);font-weight:700;font-size:1rem;
  padding:0.85rem 1.35rem;border-radius:var(--radius-btn);border:1px solid var(--papaya);
  font-family:var(--font-mono);letter-spacing:0;
  transition:transform .12s ease, background .15s ease;
}
.phone-btn:hover,.phone-btn:focus-visible{background:var(--papaya-hover);transform:translateY(-2px)}
.phone-btn svg{width:1.1em;height:1.1em;color:currentColor}
.prose a.phone-btn,.card a.phone-btn,.prose a.phone-btn:hover{color:var(--papaya-ink);text-decoration:none}

.subtitle{color:var(--text-2);font-size:var(--fs-lede);line-height:1.6;max-width:var(--measure-text)}
.reassurance{color:var(--text-2);line-height:1.6}


/* ============================================================================
   [17] MOTION
        Everything degrades to a legible static state.
        - Content is VISIBLE BY DEFAULT (scroll-reveal system removed Jul-18: decorative fades violated the motion honesty-binding and re-triggered the below-fold ghost-render bug class).
        (The animated .ringline retired Jul-30 — the hero shows a static
        machine-recorded receipt tape instead; stamp-set is the sole animation.)
   ============================================================================ */

@media (prefers-reduced-motion: no-preference){
  .stamp--set{animation:stamp-set .18s ease-out 1 both}
}
@keyframes stamp-set{
  0%  {transform:rotate(-3deg) scale(1.12);opacity:0}
  55% {opacity:1}
  100%{transform:rotate(-3deg) scale(1);opacity:1}
}
@media (prefers-reduced-motion: reduce){
  .stamp--set{animation:none}
    .ticket--lift{transition:none}
  .btn,.btn-ghost,.btn-quiet,.submit-btn,.phone-btn{transition:background .15s ease}
}


/* ============================================================================
   [18] PRINT  — legal / utility pages print as clean filed documents
   ============================================================================ */
@media print{
  :root{--grid-ink:transparent;--grid-ink-doc:transparent}
  body{background:#fff !important;color:#000;background-image:none}
  header.mast,footer.footer,.awning,.mast-phone{display:none !important}
  main{padding:0}
  .ticket,.sheet,.card,.card--paper{border:1px solid #000;box-shadow:none;background:#fff;color:#000;--text:#000;--text-2:#000;--text-3:#000}
  h1,h2,h3,h4,.card h3,.ticket__title,.ticket__head{color:#000}
  .prose a,a.inline-link{color:#000;text-decoration:underline}
  .stamp{color:#000;border-color:#000}
  .stamp::before{border-color:#000}
  .redact{background:#000;box-shadow:0 0 0 1px #000}
}


/* ============================================================================
   [19] RESPONSIVE  — mobile-first target is a TRUE 390px.
        Non-negotiable: both audience doors + the phone pill survive the collapse.
   ============================================================================ */
@media (max-width: 760px){
  /* THE DOOR STACK (doctrine-v2 P1): the two-door .counter collapses to ONE
     full-width column, so BOTH audience doors stack vertically — neither is ever
     hidden behind a tap. The old mobile pill-toggle that hid one door lived in
     the page-local <style> (`.door-enh .counter[data-active] .door--x{display:none}`),
     NOT here; once a page agent deletes that toggle markup/JS + its hide rules,
     this 1fr collapse is the whole stack — no toggle-dependent CSS in the system
     layer. Desktop keeps the bottom-aligned symmetric pair (see .counter above:
     grid 1fr 1fr + align-items:stretch, with .ticket--fill .perf{margin-top:auto}
     pinning each stub to a shared floor). */
  .counter{grid-template-columns:1fr;gap:var(--space-2)}
  /* every two-column paired beat collapses to a single centered column */
  .beat--pair{grid-template-columns:1fr;gap:var(--space-3)}
}
@media (max-width: 600px){
  /* mast becomes two rows: [brand ....... phone] then [doors] full width */
  .mast-in{gap:0.6rem 1rem}
  .mast-brand{order:1}
  .mast-phone{order:2;margin-left:auto}
  .mast-nav{order:3;flex-basis:100%;justify-content:flex-start;gap:1.1rem;padding-top:0.2rem}
  .mast-nav .hide-sm{display:none}   /* secondary links collapse; DOORS remain */
  .mast-door{font-size:0.9375rem}
  .footer-doors a{font-size:1rem}
}
@media (max-width: 380px){
  .mast-nav{gap:0.9rem}
  .stamp{font-size:0.6875rem}
}
