/* ===================================================================
   whatifnowai — Report v2 shared layer
   Components common to all four tier reports (SCAN / MAP / BUILD / LAUNCH).
   Loaded AFTER whatifnowai.css. Tier-specific styles stay in the tier file.
   =================================================================== */

/* ---- Depth switching ---------------------------------------------- */
/* Depth visibility is defined ONCE, at the very end of this file, as "hide what does not
   match" — see the closing block. Do not add a default-hidden rule here: it loses to any
   component rule that sets its own display (that is how full-only evidence cards leaked into
   Report depth), and forcing display:block back on would flatten flex and grid components. */
.doc-switch button { background: transparent; border: 0; color: var(--ink-3); padding: 6px 14px; font-family: var(--mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; font-weight: 500; cursor: pointer; }
.doc-switch button.on { background: var(--ink); color: var(--cream); }
.doc-switch button:hover:not(.on) { color: var(--ink); }
.masthead-meta span { white-space: nowrap; }
.masthead-row { flex-wrap: wrap; row-gap: 10px; }

/* The verdict ladder carries the same two variables: ticks before the tier name, and the
   active tier's name in display italic. Its ink plate predates this and stays — in a
   four-column data row the plate reads as the selected row, not as navigation. */
/* .vl-t is a FLEX row: the depth tick sits beside the tier name. This used to be a separate rule
   ahead of the typography one below, which re-declared display: block at the same specificity and
   won — leaving .tb-tick an inline span, so its 18px width did not apply, it computed to 0 and the
   tick collapsed against the label on every step of every ladder. The two rules are one now. */
.vladder .vl-step.on .vl-t { font-family: var(--display); font-style: italic; font-size: 15px; letter-spacing: normal; text-transform: none; opacity: 1; }
.vladder .vl-step .tb-tick { flex: 0 0 18px; }
.vladder .vl-step.on .tb-tick { background-image: repeating-linear-gradient(to right, rgba(244,238,230,0.28) 0 3px, transparent 3px 5px); }
.vladder .vl-step.on .tb-tick::before { background-image: repeating-linear-gradient(to right, var(--accent-on-ink) 0 3px, transparent 3px 5px); }

/* ---- Masthead: back link ----------------------------------------------------------
   A delivered report was a leaf node — no route to the founder's other runs. Sits left of the
   export bar, weighted as navigation rather than an action: quiet until hovered. */
.mast-back { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.13em; text-transform: uppercase; color: var(--ink-3); text-decoration: none; white-space: nowrap; }
.mast-back:hover { color: var(--ink); }
@media (max-width: 700px) { .mast-back { display: none; } }
@media print { .mast-back { display: none; } }

/* ---- Escalate band: payments-off variant -----------------------------------------
   While payments_live is false the next tier cannot be bought, so "Run MAP → $49" is a dead
   button at the end of every report. The band stays pixel-identical (it is one of the four
   shared blocks); only the price cell and the CTA change, plus one line of copy.

   This is rendered SERVER-SIDE from the same flag the site reads — reports are static artifacts
   and must not depend on a client fetch to be honest about what you can buy. */
.esc-band .eb-soon { color: var(--cream); margin-top: 6px; }
.esc-band .eb-soon .soon-k { display: block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent-on-ink); }
.esc-band .eb-gate { font-size: 13px; line-height: 1.5; color: var(--cream-deep); margin: 14px 0 0; max-width: 460px; }
.esc-band .eb-gate b { color: var(--cream); font-weight: 600; }
/* V3 · nowrap, on the terminal tier's only button. A 0.18em-tracked mono pill orphaned its arrow
   onto a second line inside the radius — the same defect as .btn-cta below, which is the LAUNCH
   calendar pill the plan flagged (confirmed in launch-report-v2/index.html:905, class `btn-cta`, not
   the mockup's demo class). Both fixed together because they are one shape in two rules. */
.esc-band a.eb-cta-off { display: inline-block; white-space: nowrap; background: transparent; color: var(--cream); border: 1px solid rgba(244,238,230,0.5); text-decoration: none; padding: 11px 21px; border-radius: 999px; font-family: var(--mono); font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.18em; font-weight: 600; }
.esc-band a.eb-cta-off:hover { background: var(--accent); border-color: var(--accent); color: var(--ink); }

/* ---- Recommendation provenance (VERD-1) ------------------------------------------
   The recommendation is IDEA-level: anchored once, revisable only with a stated reason.
   Two components carry it, and they are deliberately at different depths:

     .vladder [data-prov]   report depth — WHERE the call was anchored and where it moved
     .prov                  full depth  — WHY it moved (the reason runs 400+ chars)

   Showing a verdict without its provenance is what let four tiers drift apart, so the
   anchor marker is not optional chrome: it is the thing that lets a reader tell a
   considered revision from drift. */
.vladder .vl-p { display: block; font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.15em; text-transform: uppercase; margin-top: 6px; color: var(--ink-3); }
.vl-step[data-prov="anchor"] .vl-p { color: var(--accent-ink); }
.vl-step[data-prov="revision"] .vl-p { color: var(--ink); }
.vl-step[data-prov="held"] .vl-p { color: var(--ink-3); }
/* Drop AL (§0ab): a tier that ran AFTER this report was written. The step carries no value —
   this document cannot know it — so the track is DASHED rather than filled or flat: dashed is
   this product's provisional weight (the depth tick, .prov-sup's divider, the stale chip), and it
   reads apart from an unrun tier's flat empty track at 3px, which a colour change would not.
   Specificity: (0,3,0) against .vladder .vl-m's (0,2,0) — measured against the computed value,
   not assumed from the rule existing (§0m). A later step is never .on, so there is no ink
   variant: the current tier cannot be later than itself. */
.vl-step[data-prov="later"] .vl-p { color: var(--ink-3); }
.vl-step[data-prov="later"] .vl-m { background-color: transparent; background-image: repeating-linear-gradient(to right, var(--rule-strong) 0 3px, transparent 3px 5px); }
.vl-step.on[data-prov="anchor"] .vl-p { color: var(--accent-on-ink); }
.vl-step.on[data-prov="revision"] .vl-p,
.vl-step.on[data-prov="held"] .vl-p { color: var(--cream-deep); }

.prov { border: 1px solid var(--rule); border-left: 3px solid var(--ink); background: var(--paper); padding: 20px 24px 22px; margin-top: 16px; }
.prov .prov-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.17em; text-transform: uppercase; color: var(--ink-3); }
.prov .prov-call { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-top: 9px; }
.prov .prov-w { font-family: var(--display); font-size: 30px; line-height: 1; color: var(--ink); }
.prov .prov-s { font-family: var(--mono); font-size: 13px; color: var(--ink-2); letter-spacing: 0.04em; }
/* .prov .prov-chain and its b are RETIRED (drop AF, review): the chain restated the verdict
   ladder's own data-prov three sections above it, prov-chain-step.html and prov-chain-note.html are
   deleted, and a rule no partial can emit is the unreachable-class defect (§0q). */
.prov .prov-why { font-size: 14.5px; line-height: 1.6; color: var(--ink-2); margin: 14px 0 0; max-width: 78ch; text-wrap: pretty; }
.prov .prov-why b { color: var(--ink); font-weight: 500; }
/* A revision proposed with NO reason — rejected, so the anchor stood. Rare; one line. And the
   drop-AL neighbour: the call moved at a LATER tier than this report (§0ab). One rule, two
   emitters — same row, same weight, two different facts, and they can co-occur. */
.prov .prov-sup,
.prov .prov-moved { display: flex; gap: 9px; align-items: baseline; margin-top: 14px; padding-top: 12px; border-top: 1px dashed var(--rule-strong); font-size: 13px; line-height: 1.5; color: var(--ink-2); }
.prov .prov-sup .sup-k,
.prov .prov-moved .pm-k { flex: 0 0 auto; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.15em; text-transform: uppercase; color: var(--accent-ink); }
.prov .prov-moved a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--rule-strong); }
.prov .prov-moved a:hover { color: var(--accent); border-bottom-color: var(--accent); }

/* ---- Escalate band: the ownership ladder on a non-latest report (drop AM, §0ab) ----
   ENGINE-48 §3.1. The axis here is OWNERSHIP; the verdict ladder three sections up carries the
   recommendation. Two four-cell strips in one document, and they must never read as the same claim —
   so this one is inside the ink band, uses no score bar, and labels every cell in words.
   The comb comes free: .esc-band .tb-tick is already the ink treatment and [data-rank] already sets
   --tb-f, so a rung's fill is the tier's position and nothing else. Only the ::before COLOUR varies
   by state, which is the one thing ownership is allowed to say. */
.esc-band .eb-recap { display: grid; grid-template-columns: repeat(4, 1fr); border: 1px solid rgba(244,238,230,0.22); margin-top: 16px; }
.esc-band .eb-recap .ebr-step { display: block; padding: 10px 12px; border-right: 1px solid rgba(244,238,230,0.22); text-decoration: none; min-width: 0; }
.esc-band .eb-recap .ebr-step:last-child { border-right: 0; }
.esc-band .eb-recap .tb-tick { display: block; margin-bottom: 8px; }
.esc-band .eb-recap .ebr-n { display: block; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--cream-deep); }
.esc-band .eb-recap .ebr-s { display: block; font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.15em; text-transform: uppercase; margin-top: 5px; color: var(--cream-deep); }
.esc-band .eb-recap [data-state="yours"] .tb-tick::before { background-image: repeating-linear-gradient(to right, var(--cream) 0 3px, transparent 3px 5px); }
.esc-band .eb-recap [data-state="yours"] .ebr-n { color: var(--cream); }
/* A WELL, not a lift — ENGINE-42 §4's rule, applied where nobody had searched for it. This rung was
   rgba(244,238,230,0.09), which composites --ink to #333D79 and takes --accent-on-ink on the 8.5px
   sub-label to 3.63:1. On the BARE surface the same pair is 4.62:1, which is the ratio the token was
   chosen for and the ratio its comment claims — so neither the token nor the size is the defect: the
   GROUND was lifted, and --accent-on-ink's own comment already names a lift toward cream as the one
   direction that costs contrast. ENGINE-71 §2 measured it in a browser on three delivered tiers.
   The general form was computed: SIX rgba lifts across the two sheets, four are combs, tracks and
   markers with no text on them (adjacency has no floor), and both text-bearing ones are on this
   element — so this is the whole sweep, not the first instalment. Sinking separates the current rung
   MORE and reads as recessed, which is what `here` is. */
.esc-band .eb-recap [data-state="here"] { background: rgba(0,0,0,0.14); }
.esc-band .eb-recap [data-state="here"] .ebr-n { font-family: var(--display); font-style: italic; font-size: 15px; letter-spacing: normal; text-transform: none; color: var(--cream); }
.esc-band .eb-recap [data-state="here"] .ebr-s { color: var(--accent-on-ink); }
.esc-band .eb-recap [data-state="next"] .tb-tick::before { background-image: none; }
.esc-band .eb-recap [data-state="next"] .ebr-s { color: var(--accent-on-ink); }
.esc-band .eb-recap [data-state="after"] .tb-tick::before { background-image: none; }
/* No blanket opacity on `after`. The first cut dimmed the whole rung, which composited with the
   sub-label's own alpha to well under the non-text floor — and `after` was the one state no reference drew, so the
   least legible cell was also the invisible one. Both halves of that are rules of ours: a legibility
   claim is measured at the size the surface renders, and a state with no document is a state the
   engine renders blind. Every cream on this ink surface is now a TOKEN at full opacity — the two
   8.5px sub-labels were rgba alphas below AA, and --cream-deep is what .vl-p already uses for 8.5px
   mono on ink. Measured per leaf node in PACK-MANIFEST's invariants.contrast_audit; the quiet states
   are distinguished by the comb and by the word, not by dimming type past reading. */
/* Same well: hover put the same accent sub-label on the same lifted ground, so the two states that
   invite the reader were the two below AA. */
.esc-band .eb-recap a.ebr-step:hover { background: rgba(0,0,0,0.14); }
@media (max-width: 640px) { .esc-band .eb-recap { grid-template-columns: repeat(2, 1fr); } .esc-band .eb-recap .ebr-step { border-bottom: 1px solid rgba(244,238,230,0.22); } }

/* ---- Verdict ladder — the four-tier trajectory --------------------- */
.vladder { display: flex; align-items: stretch; gap: 0; border: 1px solid var(--rule); background: var(--paper); margin-top: 14px; }
.vladder .vl-step { flex: 1; display: block; text-decoration: none; padding: 9px 14px; border-right: 1px solid var(--rule); position: relative; min-width: 0; }
.vladder .vl-step:last-child { border-right: 0; }
.vladder .vl-t { display: flex; align-items: center; gap: 7px; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3); }
.vladder .vl-row { display: flex; width: 100%; align-items: baseline; gap: 7px; margin-top: 3px; }
.vladder .vl-w { font-family: var(--display); font-size: 17px; line-height: 1; color: var(--ink-3); }
.vladder .vl-s { font-family: var(--mono); font-size: 10px; color: var(--ink-3); margin-left: auto; }
.vladder .vl-m { display: block; height: 3px; background: var(--cream-deep); margin-top: 7px; overflow: hidden; }
.vladder .vl-m span { display: block; height: 100%; background: var(--rule-strong); }
.vladder .vl-step.on { background: var(--ink); border-right-color: rgba(244,238,230,0.2); }
.vladder .vl-step.on .vl-t { color: var(--cream-deep); opacity: 0.75; }
.vladder .vl-step.on .vl-w { color: var(--cream); }
.vladder .vl-step.on .vl-s { color: var(--cream-deep); }
.vladder .vl-step.on .vl-m { background: rgba(244,238,230,0.25); }
.vladder .vl-step.on .vl-m span { background: var(--accent); }
.vladder a.vl-step:hover .vl-w { color: var(--ink); }
.vladder a.vl-step:hover .vl-m span { background: var(--ink-2); }
@media (max-width: 760px) { .vladder { flex-wrap: wrap; } .vladder .vl-step { flex: 1 1 50%; border-bottom: 1px solid var(--rule); } }

/* Pressed states for the report layer's own controls (drop AP, P3.1). Same two recipes as
   whatifnowai.css: buttons take a 1px nudge, links and step rows deepen their ink. The ladder and
   recap steps are anchors, so they deepen; the depth switch is a button, so it moves. */
.doc-switch button:active:not(.on) { transform: translateY(1px); }
.mast-back:active,
.esc-band a.eb-cta-off:active,
.prov .prov-moved a:active,
.comp-row .cp-n a:active { color: var(--ink); }
.esc-band .eb-recap a.ebr-step:active,
.vladder a.vl-step:active .vl-w { color: var(--ink); }
.toc-spine a:active .dot { background: var(--accent); }

/* ---- Riskiest / wedge pair ----------------------------------------- */
.rtf { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 14px; }
.rtf-card { padding: 26px 30px; display: flex; flex-direction: column; gap: 10px; }
.rtf-card .rtf-k { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.2em; text-transform: uppercase; font-weight: 600; }
.rtf-card .rtf-t { font-family: var(--display); font-size: clamp(20px, 2vw, 26px); line-height: 1.3; margin: 0; }
.rtf-card .rtf-n { font-size: 13px; line-height: 1.5; margin: 0; }
.rtf-risk { background: var(--paper); border: 1px solid var(--rule); border-left: 5px solid var(--ink); }
.rtf-risk .rtf-k, .rtf-risk .rtf-n { color: var(--ink-2); }
.rtf-tar { background: var(--ink); color: var(--cream); }
.rtf-tar .rtf-k { color: var(--cream-deep); opacity: 0.75; }
.rtf-tar .rtf-t { color: var(--cream); font-style: italic; }
.rtf-tar .rtf-n { color: var(--cream-deep); }
@media (max-width: 820px) { .rtf { grid-template-columns: 1fr; } }

/* ---- Full-depth extension block ------------------------------------ */
.fk { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); font-weight: 600; margin: 14px 0 5px; }
.fk:first-child { margin-top: 0; }
.why-ul { list-style: none; padding: 0; margin: 4px 0 0; }
.why-ul li { font-size: 12.5px; color: var(--ink-2); padding: 5px 0; border-bottom: 1px dotted var(--rule); line-height: 1.5; }
.why-ul li:last-child { border-bottom: 0; }
.why-ul li b { color: var(--ink); font-weight: 600; }
.hyp-xtra { border-top: 1px solid var(--rule); margin-top: 16px; padding-top: 14px; }

/* ---- Thin depth ----------------------------------------------------- */
.thin-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 14px; }
@media (max-width: 720px) { .thin-stats { grid-template-columns: 1fr 1fr; } }

/* ---- Callout note ---------------------------------------------------- */
.som-note { display: grid; grid-template-columns: auto 1fr; gap: 16px; align-items: start; background: var(--cream-deep); padding: 18px 22px; margin-top: 24px; }
.som-note .sg-ic { font-family: var(--display); font-style: italic; font-size: 30px; color: var(--ink-3); line-height: 1; }
.som-note .sg-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink); font-weight: 700; margin-bottom: 5px; }
.som-note p { font-size: 13px; color: var(--ink-2); line-height: 1.55; margin: 0; }

/* ---- Escalate / closing band ---------------------------------------- */
.esc-band { background: var(--ink); color: var(--cream); padding: 44px 48px; display: grid; grid-template-columns: 1.15fr 1fr; gap: 48px; align-items: center; }
.esc-band .eb-right { border-left: 1px solid rgba(244,238,230,0.2); padding-left: 48px; }
.esc-band ul { list-style: none; padding: 0; margin: 10px 0 0; display: grid; grid-template-columns: 1fr 1fr; gap: 6px 16px; font-size: 12.5px; color: var(--cream); }
.esc-band ul li span { color: var(--accent); margin-right: 6px; }
.esc-band .eb-meta { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-top: 20px; padding-top: 18px; border-top: 1px solid rgba(244,238,230,0.2); }
/* V4 · The adds list went one-column at 820px, with the band itself. But the band is a 1.15fr/1fr
   grid until then, so between ~1000 and 820 the list is two columns inside the narrow half at
   12.5px, and the deliverable names broke mid-word. The list needs its own earlier step. */
@media (max-width: 1000px) { .esc-band ul { grid-template-columns: 1fr; } }
@media (max-width: 820px) { .esc-band { grid-template-columns: 1fr; padding: 30px 26px; gap: 24px; } .esc-band .eb-right { border-left: 0; padding-left: 0; border-top: 1px solid rgba(244,238,230,0.2); padding-top: 24px; } .esc-band ul { grid-template-columns: 1fr; } }

/* A2.2 · 2.4.11. The spine rail's click handler scrolls with a hand-written -90 offset
   (report-v2.js:45-48) and keyboard focus had no equivalent, so tabbing or following an in-report
   anchor landed the target under the sticky masthead. 90px is the same number as .cs-right's sticky
   top and the rail's offset; the third copy is in the JS and is named here so the drift is visible
   rather than discovered. */
section[id], .shell[id] { scroll-margin-top: 90px; }

/* A5.4 · The report layer's own motion. whatifnowai.css carries the blanket rule; these two are
   here because they are report chrome and because the smooth scroll is the one piece CSS cannot
   reach — report-v2.js passes behavior:'smooth' directly, so it must read the query itself. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .toc-spine a .lbl { transition: none; }
}

/* ---- Trust & method strip -------------------------------------------- */
.trust-strip { margin-top: 64px; border-top: 1px solid var(--rule-strong); padding-top: 26px; }
.trust-strip .label { margin-bottom: 20px; }
.trust-grid { display: grid; grid-template-columns: 240px 1fr 1fr 1fr; gap: 32px; align-items: start; }
.trust-grid .tk { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); margin-bottom: 8px; }
.trust-grid .tv { font-family: var(--display); font-size: 30px; line-height: 1; color: var(--ink); }
.trust-grid .tv .of { font-family: var(--mono); font-size: 11px; color: var(--ink-3); }
.trust-bar { height: 4px; background: var(--cream-deep); border-radius: 999px; margin-top: 10px; max-width: 190px; overflow: hidden; }
.trust-bar span { display: block; height: 100%; background: var(--ink-3); border-radius: 999px; }
.trust-chips { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 4px; }
.trust-chips .tc { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; padding: 4px 10px; border-radius: 999px; }
.trust-chips .tc.h { background: var(--ink); color: var(--cream); }
.trust-chips .tc.m { background: var(--cream-deep); color: var(--ink); }
.trust-chips .tc.l { border: 1px solid var(--rule-strong); color: var(--ink-2); }
.trust-note { font-size: 12px; color: var(--ink-3); line-height: 1.55; margin: 22px 0 0; max-width: 760px; }
@media (max-width: 820px) { .trust-grid { grid-template-columns: 1fr 1fr; gap: 24px; } }

/* ---- Evidence mosaic --------------------------------------------------- */
.evm { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.evm .card-b { background: var(--paper); border: 1px solid var(--rule); padding: 14px 16px; display: flex; flex-direction: column; gap: 8px; }
.evm .top { display: flex; gap: 8px; align-items: baseline; font-family: var(--mono); font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); }
.evm .top .cat { color: var(--ink-2); font-weight: 700; }
.evm .claim { font-size: 13.5px; font-weight: 500; line-height: 1.45; color: var(--ink); margin: 0; }
.evm .q { font-family: var(--display); font-style: italic; font-size: 12.5px; color: var(--ink-2); line-height: 1.45; margin: 0; border-left: 2px solid var(--rule-strong); padding-left: 10px; }
.evm .ft { margin-top: auto; padding-top: 8px; border-top: 1px solid var(--rule); font-family: var(--mono); font-size: 9px; letter-spacing: 0.04em; color: var(--ink-3); display: flex; justify-content: space-between; gap: 8px; }
.evm .ft a { color: var(--ink-2); }
.evm .conf-chip { font-size: 9.5px; }
@media (max-width: 760px) { .evm { grid-template-columns: 1fr; } }

/* ---- Viability contribution ledger ------------------------------------ */
.vd { border-top: 1px solid var(--rule-strong); }
.vd-row { display: grid; grid-template-columns: 185px 150px 78px 1fr; gap: 18px; align-items: center; padding: 10px 0; border-bottom: 1px dotted var(--rule); }
.vd-row .vd-name { font-size: 13.5px; font-weight: 600; color: var(--ink); }
.vd-row .vd-name small { display: block; font-family: var(--mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-3); font-weight: 400; margin-top: 2px; }
.vd-bar { height: 12px; background: repeating-linear-gradient(135deg, var(--cream-deep) 0 4px, var(--paper) 4px 8px); border: 1px solid var(--rule-strong); border-radius: 3px; overflow: hidden; }
.vd-bar span { display: block; height: 100%; background: var(--ink); }
.vd-row .vd-pts { font-family: var(--display); font-size: 19px; color: var(--ink); white-space: nowrap; }
.vd-row .vd-pts small { font-family: var(--mono); font-size: 9px; color: var(--ink-3); }
.vd-row .vd-note { font-size: 12px; color: var(--ink-2); line-height: 1.45; margin: 0; }
.vd-total { display: flex; justify-content: space-between; align-items: baseline; gap: 20px; padding-top: 14px; }
.vd-total .vt-n { font-size: 13px; color: var(--ink-2); line-height: 1.5; max-width: 760px; margin: 0; }
.vd-total .vt-v { font-family: var(--display); font-size: 30px; color: var(--ink); text-align: right; white-space: nowrap; }
.vd-total .vt-v .a { color: var(--ink-3); font-size: 20px; }
@media (max-width: 900px) { .vd-row { grid-template-columns: 1fr 78px; } .vd-row .vd-bar { display: none; } .vd-row .vd-note { grid-column: 1 / -1; margin-top: -2px; } }

/* ---- Dimension row (thin depth) ---------------------------------------- */
.dim-row { display: grid; grid-template-columns: 195px minmax(120px, 0.9fr) 30px 70px 1.3fr; gap: 18px; align-items: center; padding: 13px 0; border-bottom: 1px solid var(--rule); }
.dim-row:last-child { border-bottom: 0; }
.dim-row .dk { font-size: 14px; font-weight: 500; color: var(--ink); }
.dim-row .track { height: 5px; background: var(--cream-deep); border-radius: 999px; overflow: hidden; }
.dim-row .track span { display: block; height: 100%; border-radius: 999px; background: var(--ink-3); }
.dim-row .dv { font-family: var(--display); font-size: 20px; color: var(--ink); text-align: right; }
.dim-row .wt { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; color: var(--ink-3); text-transform: uppercase; }
.dim-row .dn { font-size: 12px; color: var(--ink-2); line-height: 1.45; }
@media (max-width: 900px) { .dim-row { grid-template-columns: 1fr 30px 70px; } .dim-row .track { display: none; } .dim-row .dn { grid-column: 1 / -1; margin-top: -4px; } }

/* ---- Assumption / critical cards --------------------------------------- */
.ca-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; align-items: stretch; }
.ca-card { background: var(--paper); border: 1px solid var(--rule); border-left: 4px solid var(--ink-3); padding: 16px 20px; display: flex; flex-direction: column; }
.ca-card.hi { border-left-color: var(--ink); background: var(--cream-deep); }
.ca-card .ca-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; margin-bottom: 8px; }
.ca-card .ca-num { font-family: var(--mono); font-size: 11px; letter-spacing: 0.08em; color: var(--ink-3); }
.ca-card .ca-sev { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; font-weight: 700; padding: 3px 9px; border-radius: 2px; white-space: nowrap; }
.ca-card .ca-sev.hi { background: var(--ink); color: var(--cream); }
.ca-card .ca-sev.md { background: transparent; box-shadow: inset 0 0 0 1.5px var(--ink-2); color: var(--ink-2); }
.ca-card .ca-stmt { font-size: 14px; line-height: 1.5; margin: 0 0 12px; color: var(--ink); font-weight: 500; }
.ca-card dl.ca-rows { margin: auto 0 0; }
.ca-card .ca-rows .ca-row { display: grid; grid-template-columns: 88px 1fr; gap: 12px; padding: 6px 0; border-top: 1px dotted var(--rule); font-size: 12.5px; line-height: 1.45; }
.ca-card .ca-rows dt { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); }
.ca-card .ca-rows dd { margin: 0; color: var(--ink-2); }
@media (max-width: 760px) { .ca-grid { grid-template-columns: 1fr; } }

/* ---- Financial honest-state -------------------------------------------- */
.fin-banner { background: var(--ink); color: var(--cream); padding: 26px 30px; display: grid; grid-template-columns: auto 1fr; gap: 20px; align-items: start; margin-bottom: 26px; }
.fin-banner .fb-ic { font-family: var(--display); font-style: italic; font-size: 44px; line-height: 1; color: var(--accent); }
.fin-banner .fb-t { font-family: var(--display); font-size: clamp(20px, 2.2vw, 28px); line-height: 1.25; margin: 0 0 8px; }
.fin-banner p { font-size: 13.5px; line-height: 1.55; color: var(--cream-deep); margin: 0; }
.fin-banner .fb-meta { display: flex; gap: 18px; flex-wrap: wrap; margin-top: 12px; font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(244,238,230,0.65); }
.fin-banner .fb-meta b { color: var(--cream); }
@media (max-width: 700px) { .fin-banner { grid-template-columns: 1fr; padding: 22px 20px; } }
.scen-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.scen { background: var(--paper); border: 1px solid var(--rule); border-top: 3px solid var(--rule-strong); padding: 15px 17px; }
.scen.base { border-top-color: var(--ink); }
.scen .sc-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-2); font-weight: 700; }
.scen .sc-rev { font-family: var(--display); font-size: 26px; color: var(--ink); margin: 6px 0 2px; }
.scen .sc-sub { font-size: 11.5px; color: var(--ink-2); line-height: 1.45; }
.scen .sc-rows { margin-top: 10px; padding-top: 8px; border-top: 1px dotted var(--rule); font-family: var(--mono); font-size: 10px; color: var(--ink-3); line-height: 1.8; letter-spacing: 0.04em; }
@media (max-width: 820px) { .scen-grid { grid-template-columns: 1fr 1fr; } }

/* ---- Voice of the market ------------------------------------------------ */
.vom-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.vom { background: var(--cream); border: 1px solid var(--rule); border-radius: 10px; padding: 14px 16px; }
.vom .vm-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink); font-weight: 700; }
.vom .vm-src { font-family: var(--mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-3); margin-left: 8px; }
.vom .vm-q { font-family: var(--display); font-style: italic; font-size: 14.5px; line-height: 1.4; color: var(--ink); margin: 8px 0 0; }
.vom .vm-q::before { content: "\201C"; } .vom .vm-q::after { content: "\201D"; }
.vom .vm-q2 { font-family: var(--display); font-style: italic; font-size: 13px; line-height: 1.4; color: var(--ink-2); margin: 8px 0 0; }
@media (max-width: 760px) { .vom-grid { grid-template-columns: 1fr; } }

/* ---- Personas ------------------------------------------------------------ */
.persona-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.persona { background: var(--paper); border: 1px solid var(--rule); padding: 20px 22px; display: flex; flex-direction: column; gap: 10px; }
.persona .p-name { font-family: var(--display); font-size: 24px; line-height: 1.1; }
.persona .p-role { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); line-height: 1.6; }
.persona .p-q { font-family: var(--display); font-style: italic; font-size: 14.5px; line-height: 1.4; color: var(--ink); margin: 0; border-left: 3px solid var(--accent); padding-left: 12px; }
.persona .p-jtbd { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0; }
@media (max-width: 820px) { .persona-grid { grid-template-columns: 1fr; } }

/* ---- Workbook-style block ------------------------------------------------ */

/* ---- Readiness rows ------------------------------------------------------- */
.ready-row { display: grid; grid-template-columns: 78px 116px 1fr 28px; gap: 18px; align-items: start; padding: 11px 0; border-bottom: 1px dotted var(--rule); }
.ready-row:last-child { border-bottom: 0; }
.ready-row .rr-t { font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink); font-weight: 700; }
.ready-row .rr-b { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin: 0; }
/* Drop AF: the tier's own call, beside its blockers. Display serif for the verdict word (it is the
   asserted value), mono for the score (it is metadata) — the type system, unchanged. */
.ready-row .rr-v { display: flex; flex-direction: column; gap: 2px; }
.ready-row .rr-v .rv-w { font-family: var(--display); font-size: 17px; line-height: 1; color: var(--ink); }
.ready-row .rr-v .rv-s { font-family: var(--mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-3); }
.ready-row .rr-b em { color: var(--ink-3); font-style: normal; }
.ready-row .rr-m { font-family: var(--display); font-size: 18px; text-align: right; line-height: 1; }
body .ready-row .rr-m.no { color: var(--accent); } .ready-row .rr-m.yes { color: var(--ink); }

/* ---- Bullseye test block --------------------------------------------------- */
.bulls { background: var(--cream-deep); padding: 16px 20px; margin: 16px 0; border-left: 3px solid var(--accent); }
.bulls .b-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); font-weight: 600; margin-bottom: 8px; }
.bulls p { font-size: 13px; line-height: 1.55; color: var(--ink-2); margin: 0 0 6px; }
.bulls p:last-child { margin-bottom: 0; }
.bulls p b { color: var(--ink); font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; margin-right: 6px; }
.bulls .kill { color: var(--accent); }

/* ---- Mobile corrections to core components --------------------------------- */
@media (max-width: 760px) {
  .verdict-inner { grid-template-columns: 1fr !important; gap: 22px; padding: 32px 24px 28px; }
  .verdict .vscore { align-items: flex-start; }
  /* V2's release: nowrap is a desktop rule. Here the column is left-aligned and the label is free to
     take two lines — a wrap is correct at this width, an overflow never is. */
  .verdict .vscore-of { white-space: normal; }
  .verdict .vscore-num { font-size: clamp(72px, 22vw, 110px); }
  .verdict .vword { font-size: clamp(54px, 17vw, 92px); }
  .verdict .vsub { max-width: none; }
  /* The conditional keeps the inner grid's left edge at every width, so its padding tracks the
     override above it rather than being authored once at desktop. */
  .verdict .vcond { padding: 18px 24px 20px; font-size: 17px; }
  .verdict-bullets { grid-template-columns: 1fr; }
  .verdict-bullets > div { border-right: 0; border-bottom: 1px solid rgba(246, 241, 227, 0.2); }
  .verdict-bullets > div:last-child { border-bottom: 0; }
  .masthead-row { gap: 12px; }
  .masthead-meta { gap: 14px; font-size: 10px; }
  .section > .section-head { grid-template-columns: 1fr; gap: 4px; }
  .section > .section-head .nbr { font-size: 48px; }
  .section { padding-top: 56px; }
}

/* ---- Print ------------------------------------------------------------------ */
@media print {
  /* .toc-rail is NOT in this list: no report has ever emitted it (contract §4's retired
     cleanup line named it, and drop AO deleted the ~29 v1 .toc-rail/.toc-toggle rules). A print
     rule hiding a class the document cannot contain is §1c.1 in one selector. */
  .toc-spine, .doc-switch, .export-bar, .scroll-progress { display: none !important; }

  /* The calendar is TAB-BASED on screen: only one week is in flow at a time, and hiding the
     whole component was the old workaround. On paper there are no tabs — drop the tab strip
     and let all four weeks flow as stacked blocks. Printing §05 as nothing was the bug. */
  .launch-cal { display: block !important; }
  #calTabs, .lc-tabs { display: none !important; }
  .lc-week, .lc-week[hidden] { display: block !important; break-inside: avoid; margin-bottom: 26px; }

  /* Keep every label welded to the number or body it labels. A metric tile whose caption sits on
     page 5 and whose value sits on page 6 is not a tile, it is two orphans. */
  .hero-grid, .hero-grid > *, .napkin, .napkin > div, .metric-tile,
  .verdict, .vladder, .timing, .comp-row, .reg-item, .story-row, .rice-row,
  .ledger-row, .qa, .chg-row, .ready-row, .lp, .social-post, .screen-spec,
  .diff-card, .mvp-card, .epic, .jtbd, .brand-row, .segment-row, .market-tier,
  .tier-badge, .risk-card, .pivot-card, .fin-banner, .closing-band { break-inside: avoid; }

  /* A section head at the foot of a page is a promise the page does not keep. */
  .sec-head, .section > .head, .sub, .ttl { break-after: avoid; }
  .verdict { break-after: avoid; }

  /* The hero is one statement — headline, triptych and meta strip travel together, and the
     tier's opening page ends there. Export 1 broke the triptych mid-column: the "What SCAN
     answers" label printed on page 1 and its answer on page 2, leaving page 2 holding two
     orphaned lines. Export 2 then pushed the whole triptych to page 2, leaving page 1 as a
     bare headline. The hero only fits as a cover if it is SIZED like one — the screen
     headline is set for a 1400px viewport and simply does not fit a Letter page beside the
     triptych, so it steps down here. */
  section:has(> .hero-grid) { break-after: page; break-inside: avoid; padding-top: 24px !important; }
  section:has(> .hero-grid) .display-xl { font-size: 46px; line-height: 1.04; }
  section:has(> .hero-grid) .spacer-md { height: 20px; }
  section:has(> .hero-grid) .hero-grid { gap: 22px; }
  .hero, .hero + .meta-strip { break-inside: avoid; }

  /* On screen the competitor row is a wide 4-column band. At print width the edge column
     collapses to ~10 characters and sets one sentence as eight ragged lines. Two columns. */
  .comp-row { grid-template-columns: 1fr 1fr !important; row-gap: 10px; }

  .rtf-card, .ca-card, .persona, .scen, .vom, .evm .card-b,
  .bulls, .som-note, .esc-band, .trust-strip, .flow-block, .sprint-phase,
  .wk, .chan, .tier-c, .warm, .day-cell, .kpi-tile, .trigger-card, .gate { break-inside: avoid; }
  .section { padding-top: 40px; }

  /* ---- CONTENT LOSS, not cosmetics --------------------------------------------
     Chrome does not fragment a CSS grid container across pages: grid items that
     straddle a page boundary are CLIPPED AWAY rather than pushed to the next page.
     The first SCAN export silently lost 6 of 9 evidence cards, 2 of 3 critical
     assumptions and 1 of 5 competitors — the page count looked plausible and the
     content was simply gone.

     Block flow paginates reliably. Export 2 de-gridded everything and lost NOTHING (9/9
     evidence, 5/5 competitors, 3/3 assumptions) at a cost of 6 extra pages. Export 3 tried to
     win those pages back by keeping grids of ≤ 4 items and forbidding them to fragment — and
     the loss came straight back: 4 of 6 evidence cards, 1 of 5 competitors, 2 of 3 critical
     assumptions. `break-inside: avoid` is a HINT. On a container taller than the remaining
     page it is ignored, the grid fragments anyway, and the overflowing items are clipped.
     Three tall cards in a row are taller than a page, so the exception was never safe.

     So: no exceptions. Every multi-item card grid is block flow on paper. Six pages is the
     honest price of not silently deleting a third of the report, and one column of
     full-measure text is the better read on paper anyway — no hover, no scroll, no reason
     for two narrow columns. Only fixed-height peer ROWS keep their columns (below). */
  .evm, .ca-grid, .vom-grid, .grid-2, .grid-3, .scen-grid, .mkt-stack, .persona-grid,
  .ng-grid, .warm-grid, .pillar-grid, .hl-grid, .mc-grid, .wk-grid, .day-grid, .kpi-grid, .tier-grid, .risk-grid{
    display: block !important;
  }
  .evm > *, .ca-grid > *, .vom-grid > *, .grid-2 > *, .grid-3 > *, .scen-grid > *,
  .mkt-stack > *, .persona-grid > *, .ng-grid > *, .warm-grid > *, .pillar-grid > *,
  .hl-grid > *, .mc-grid > *, .wk-grid > *, .day-grid > *,
  .kpi-grid > *, .tier-grid > *, .risk-grid > *{
    break-inside: avoid; margin-bottom: 18px; max-width: 100%;
  }

  /* These are SHORT single rows — a strip of metric tiles, a trust row, four napkin cells.
     They fit inside one page with room to spare, so avoid is honoured and the row moves
     whole. Nothing here is ever tall enough to be clipped. */
  .grid-4, .napkin, .trust-grid, .verdict-bullets, .rtf, .hero-grid, .thin-stats,
  .dc-gates, .hyp-row, .dim-row, .comp-row, .lc-week-goal { break-inside: avoid; }

  /* Short peer rows stay side by side — but the CONTAINER gets break-inside: avoid so it
     jumps whole to the next page rather than fragmenting and shedding cells. This is the
     other half of the same bug: a grid that fits on a page is safe, a grid that is split
     is not, so never let one be split. */
  .grid-4, .napkin, .trust-grid, .verdict-bullets, .rtf, .hero-grid, .thin-stats,
  .dc-gates, .hyp-row, .dim-row, .comp-row, .lc-week-goal { break-inside: avoid; }
  .esc-band, .verdict, .rtf-tar, .fin-banner, .gate,
  .sec-card[data-prio="critical"] { -webkit-print-color-adjust: exact; print-color-adjust: exact; }

  /* Two lines of a paragraph alone at the top or foot of a page. */
  p, li, dd, blockquote { orphans: 3; widows: 3; }

  /* The appendix sign-off duplicated the running footer on the last page. Both are now
     replaced by real @page margin boxes below — CSS owns the running furniture. */
  .foot, .print-footer, .report-foot { display: none !important; }

  /* ---- Running furniture and page numbers -------------------------------------
     Chrome 131 shipped @page margin boxes with the `page` and `pages` counters, so the
     report can number itself in CSS — no polyfill, no fixed-position footer, no relying
     on the print dialog's "Headers and footers" checkbox (which prints the URL and the
     system date). Declaring ANY margin box also suppresses that browser default, so the
     furniture below is the only furniture.

     The bottom-centre box is intentionally EMPTY here: it carries the tier, run id and
     filing date, which differ per report, so each tier file overrides just that one box
     in its own <style>. See templates/chrome/page-furniture.html. */
  @page {
    margin: 13mm 13mm 15mm;
    @bottom-left {
      content: "whatifnowai.";
      font-family: "Instrument Serif", Georgia, serif; font-size: 9pt; color: var(--print-ink);
    }
    @bottom-center { content: ""; font-family: ui-monospace, monospace; font-size: 7.5pt; letter-spacing: 0.1em; color: var(--print-ink); }
    @bottom-right {
      content: counter(page) " / " counter(pages);
      font-family: ui-monospace, monospace; font-size: 8pt; letter-spacing: 0.08em; color: var(--print-ink);
    }
  }
  /* The cover carries the masthead already, so it needs no running line — but it DOES
     stay in the count, because "2 / 19" has to mean the second sheet of nineteen. */
  @page :first {
    @bottom-left { content: ""; }
    @bottom-center { content: ""; }
    @bottom-right { content: ""; }
  }
  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 9px; color: var(--print-ink); word-break: break-all; }
  .vladder a[href]::after, .tier-nav a[href]::after, .masthead a[href]::after { content: ""; }
}

/* ---- Accessibility layer (v1.0.2) ---------------------------------------
   Vermilion at full brightness is a fill colour. Wherever it carries SMALL
   TEXT on a light surface it drops to --accent-ink, which clears AA. Fills,
   rails, dots and text on the ink surface keep the full brand vermilion. */
body .bulls .kill,
body .tier-c .tc-badge,
body .hl .hl-k .use,
body .chk-row .ck-r.flag,
body .mkt .mk-c,
body .ready-row .rr-m.no,
body .sprint-phase .sp-days,
body .day-card .dc-k,
body .day-card .dc-gates .kl .g-k,
body .wk .wk-kill b,
body .wk-exp .fail .we-k,
body .comp-row .edge .cp-k,
body .brand-row .warn .br-k,
body .day-cell .day-metric,
body .trigger-card .tc-action strong,
body .timing.on .tg-box,
body .lp .lp-cta,
body .pivot-card .pv-k b { color: var(--accent-ink); }

/* accent CTA buttons: cream text needs the darker vermilion behind it */
body .esc-band a[style]{ background: var(--accent-ink) !important; }

/* accent text sitting on the ink surface needs to go lighter, not darker */
/* The .lr-col well is measured in whatifnowai.css: the panel sinks, so both of these clear AA
   against the surface they actually sit on rather than against the section behind it. */
body .launch-readiness .lr-col.miss .lr-label,
body .launch-readiness .miss li::before,
body .gate .g-rows .g-rk,
body .fin-banner .fb-ic,
body .gate .g-ic,
body .esc-band ul li span { color: var(--accent-on-ink); }

/* Regulatory severity is an ACTION signal in the brand channel, so it obeys the same rule as
   every other accent-as-small-text: --accent-ink on the light surface. whatifnowai.css defines
   mandatory and recommended only — conditional had no rule and fell through to inherited body ink. */
body .reg-item[data-sev="mandatory"]   .reg-sev { color: var(--accent-ink); }
body .reg-item[data-sev="conditional"] .reg-sev { color: var(--ink-2); }
body .reg-item[data-sev="recommended"] .reg-sev { color: var(--ink-3); }

/* ---- Section spine (replaces the boxed TOC rail) -------------------------
   At rest it is a column of dots flush to the right edge — ~20px wide, no
   panel, no backdrop, nothing over the text column. Labels reveal on hover. */
.toc-spine {
  position: fixed; top: 50%; right: 0; transform: translateY(-50%); z-index: 40;
  display: flex; flex-direction: column; align-items: flex-end;
  padding: 10px 9px; gap: 2px; pointer-events: auto;
}
.toc-spine a {
  display: flex; align-items: center; justify-content: flex-end; gap: 10px;
  text-decoration: none; padding: 4px 0; position: relative;
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--ink-3); line-height: 1;
}
.toc-spine a .lbl {
  opacity: 0; transform: translateX(8px); white-space: nowrap;
  transition: opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
  background: rgba(252, 248, 243, 0.96); padding: 4px 9px; border: 1px solid var(--rule);
  pointer-events: none; max-width: 168px; overflow: hidden; text-overflow: ellipsis;
  box-shadow: 0 1px 6px rgba(32, 44, 110, 0.07);
}
.toc-spine a .dot {
  width: 6px; height: 6px; border-radius: 50%; background: var(--rule-strong);
  flex: 0 0 6px; transition: background var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
}
.toc-spine a.active .dot { background: var(--accent); transform: scale(1.5); }
.toc-spine a:hover .dot { background: var(--ink); }
.toc-spine:hover a .lbl { opacity: 1; transform: translateX(0); }
.toc-spine a.active .lbl { color: var(--ink); border-color: var(--rule-strong); }
@media (max-width: 1180px) { .toc-spine { display: none; } }
@media print { .toc-spine { display: none !important; } }

/* The verdict period is DECORATIVE — a 110px glyph carrying no information, and the signature of
   the verdict band. It keeps full --accent and is marked aria-hidden in the markup
   so assistive tech and contrast audits both treat it as ornament, not text. It is the only
   sanctioned exception to the accent-as-text rule above. */
.vword-dot { pointer-events: none; }

/* ===================================================================
   COMPONENT LAYER — moved out of the per-tier <style> blocks, Aug 2026.
   Every class a partial emits MUST live here. A component whose CSS sits
   in a tier's local <style> cannot be rendered by the engine, which is
   exactly what broke the first golden render (section 04 came out naked).
   Tier files now carry no component CSS.
   =================================================================== */

/* Regulatory table header — mono micro-labels, like every other data table. */
.reg-item.reg-head > div { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); font-weight: 600; }
.reg-item.reg-head { padding-bottom: 8px; border-bottom: 1px solid var(--rule-strong); }

/* ---- from scan-report-v2 ---------------------------------------------------- */
.hyp-row { display: grid; grid-template-columns: 34px 1fr 92px 74px; gap: 16px; align-items: start; padding: 13px 0; border-bottom: 1px solid var(--rule); }
.hyp-row:last-child { border-bottom: 0; }
.hyp-row .h-n { font-family: var(--display); font-size: 22px; color: var(--ink-3); line-height: 1; font-style: italic; }
.hyp-row .h-p { font-size: 13.5px; line-height: 1.5; color: var(--ink); margin: 0 0 5px; font-weight: 500; }
.hyp-row .h-s { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0; }
.hyp-row .h-meter { height: 6px; background: var(--cream-deep); border-radius: 999px; overflow: hidden; margin-top: 7px; }
.hyp-row .h-meter span { display: block; height: 100%; background: var(--ink-3); border-radius: 999px; }
.hyp-row.sel .h-meter span { background: var(--ink); }
.hyp-row .h-v { font-family: var(--display); font-size: 21px; color: var(--ink); text-align: right; line-height: 1; }
.hyp-row .h-v small { font-family: var(--mono); font-size: 9.5px; color: var(--ink-3); display: block; margin-top: 5px; letter-spacing: 0.1em; text-transform: uppercase; }
.hyp-row .h-tag { justify-self: end; }
@media (max-width: 820px) { .hyp-row { grid-template-columns: 28px 1fr 70px; } .hyp-row .h-tag { grid-column: 2 / -1; justify-self: start; margin-top: 4px; }
  .hyp-row .h-tag:empty { margin-top: 0; } }
.napkin { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; border: 1px solid var(--rule); background: var(--paper); }
.napkin > div { padding: 18px 22px; border-right: 1px solid var(--rule); }
.napkin > div:last-child { border-right: 0; }
.napkin .nk-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); }
.napkin .nk-v { font-family: var(--display); font-size: 27px; color: var(--ink); margin-top: 7px; line-height: 1.05; }
@media (max-width: 760px) { .napkin { grid-template-columns: 1fr 1fr; } .napkin > div:nth-child(2n) { border-right: 0; } .napkin > div:nth-child(-n+2) { border-bottom: 1px solid var(--rule); } }
.comp-row { display: grid; grid-template-columns: 170px 84px 1fr 1fr; gap: 20px; align-items: start; padding: 13px 0; border-bottom: 1px solid var(--rule); }
.comp-row:last-child { border-bottom: 0; }
.comp-row .cp-n { font-size: 14px; font-weight: 600; }
.comp-row .cp-n a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--rule-strong); }
.comp-row .cp-n a:hover { color: var(--accent); border-bottom-color: var(--accent); }
.comp-row .cp-t { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-3); }
.comp-row p { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0; }
.comp-row .cp-k { font-family: var(--mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-3); display: block; margin-bottom: 4px; }
.comp-row .edge .cp-k { color: var(--accent); }
@media (max-width: 900px) { .comp-row { grid-template-columns: 1fr 84px; } .comp-row p { grid-column: 1 / -1; } }
.day-card { background: var(--paper); border: 1px solid var(--rule); border-top: 4px solid var(--ink); padding: 24px 28px; }
/* .accent = the day that asks for money. The reference authored this as an inline
   border-top-color for four drops (drop AJ, ENGINE-44 review C3): our own inline, in the document
   the goldens are diffed against, for a rule that is one declaration long. */
.day-card.accent { border-top-color: var(--accent); }
.day-card .dc-k { font-family: var(--mono); font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--accent); font-weight: 700; }
.day-card .dc-do { font-family: var(--display); font-size: clamp(19px, 2vw, 24px); line-height: 1.25; margin: 8px 0 14px; }
.day-card .dc-script { background: var(--cream-deep); padding: 14px 18px; font-size: 12.5px; line-height: 1.6; color: var(--ink-2); margin: 0 0 14px; border-left: 3px solid var(--rule-strong); }
.day-card .dc-gates { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; padding-top: 13px; border-top: 1px solid var(--rule); }
.day-card .dc-gates .g-k { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.16em; text-transform: uppercase; font-weight: 700; margin-bottom: 5px; }
.day-card .dc-gates .go .g-k { color: var(--ink); }
.day-card .dc-gates .pv .g-k { color: var(--ink-2); }
.day-card .dc-gates .kl .g-k { color: var(--accent); }
.day-card .dc-gates p { font-size: 12px; line-height: 1.5; color: var(--ink-2); margin: 0; }
@media (max-width: 760px) { .day-card .dc-gates { grid-template-columns: 1fr; gap: 10px; } }
.timing-list { border-top: 1px solid var(--rule-strong); max-width: 900px; }
.timing { display: grid; grid-template-columns: auto 1fr; gap: 14px; align-items: start; padding: 11px 0; border-bottom: 1px dotted var(--rule); }
.timing:last-child { border-bottom: 0; }
.timing .tg-box { font-family: var(--mono); font-size: 13px; color: var(--ink-3); line-height: 1; padding-top: 2px; }
.timing.on .tg-box { color: var(--accent); }
.timing .tg-n { font-size: 13.5px; font-weight: 600; color: var(--ink); }
.timing .tg-d { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin: 4px 0 0; }

/* ---- from map-report-v2 ---------------------------------------------------- */
.wk-exp { display: grid; grid-template-columns: 62px 1fr 1fr 1fr; gap: 18px; align-items: start; padding: 13px 0; border-bottom: 1px solid var(--rule); }
.wk-exp:last-child { border-bottom: 0; }
.wk-exp .we-w { font-family: var(--display); font-style: italic; font-size: 22px; color: var(--ink-3); line-height: 1; }
.wk-exp p { font-size: 12.5px; line-height: 1.5; margin: 0; color: var(--ink-2); }
.wk-exp .we-a { color: var(--ink); font-size: 13px; }
.wk-exp .we-k { font-family: var(--mono); font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); display: block; margin-bottom: 4px; }
.wk-exp .pass .we-k { color: var(--ink); } .wk-exp .fail .we-k { color: var(--accent); }
@media (max-width: 900px) { .wk-exp { grid-template-columns: 50px 1fr; } .wk-exp > div:nth-child(n+3) { grid-column: 2; } }
.mkt-stack { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.mkt { background: var(--paper); border: 1px solid var(--rule); border-top: 3px solid var(--rule-strong); padding: 20px 24px; }
.mkt.som { border-top-color: var(--ink); }
.mkt .mk-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); }
.mkt .mk-v { font-family: var(--display); font-size: 42px; line-height: 1; color: var(--ink); margin: 8px 0 4px; }
.mkt .mk-s { font-size: 12px; color: var(--ink-2); line-height: 1.5; margin: 8px 0 0; }
.mkt .mk-c { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); }
@media (max-width: 760px) { .mkt-stack { grid-template-columns: 1fr; } }
.seg-row { display: grid; grid-template-columns: 210px 1fr 108px 90px 96px; gap: 16px; align-items: start; padding: 13px 0; border-bottom: 1px solid var(--rule); }
.seg-row:last-child { border-bottom: 0; }
.seg-row .sg-n { font-size: 14px; font-weight: 600; color: var(--ink); line-height: 1.35; }
.seg-row p { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0; }
.seg-row .sg-m { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-2); }
.seg-row.avoid { opacity: 0.62; }
@media (max-width: 900px) { .seg-row { grid-template-columns: 1fr 96px; } .seg-row p { grid-column: 1 / -1; } .seg-row .sg-m { grid-column: auto; } }
/* The CONTAINER for the pivot set, and it had never been declared anywhere the engine can read.
   It existed as an inline style="gap: 14px" on .grid-3 in the reference only — no partial emitted it
   and no stylesheet carried it — so the engine had nothing to render and emitted three bare
   siblings: MAP §10 ships as a full-width vertical stack at gap 0, where each 1px bottom border
   meets the next card's 3px top and the accent cap that is the set's ONLY mark for the recommended
   option (MANIFEST: "there is no second highlight") reads as a divider between two cards instead.
   ENGINE-71 §2 measured the 0px gap and inferred our reference had it too; it does not, and the
   whole difference is this container. Emitted by body/pivot-grid.html, on body/ca-grid.html's model
   one section over. .grid-3 declares gap: 28px, so the reference's inline 14px was also an override
   no engine could reproduce — a layout value that lives in one HTML attribute is not a spec. */
.pivot-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; align-items: stretch; }
@media (max-width: 900px) { .pivot-grid { grid-template-columns: 1fr; } }
.pivot-card { background: var(--paper); border: 1px solid var(--rule); border-top: 3px solid var(--rule-strong); padding: 22px 26px; display: flex; flex-direction: column; }
.pivot-card.rec { border-top-color: var(--accent); background: var(--cream-deep); }
.pivot-card .pv-k { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); }
.pivot-card .pv-k b { color: var(--accent); }
.pivot-card h4 { font-family: var(--display); font-size: 23px; line-height: 1.15; margin: 6px 0 10px; }
.pivot-card > p { font-size: 13px; line-height: 1.55; color: var(--ink-2); margin: 0 0 14px; }
.pivot-card dl { margin: 0 0 14px; }
.pivot-card dl div { display: grid; grid-template-columns: 96px 1fr; gap: 12px; padding: 6px 0; border-top: 1px dotted var(--rule); font-size: 12px; line-height: 1.45; }
.pivot-card dt { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); }
.pivot-card dd { margin: 0; color: var(--ink-2); }
.pivot-card .pv-f { margin-top: auto; padding-top: 12px; border-top: 1px solid var(--rule); display: flex; justify-content: space-between; align-items: baseline; font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-3); }
.pivot-card .pv-f b { font-family: var(--display); font-size: 20px; color: var(--ink); letter-spacing: 0; }
.brand-row { display: grid; grid-template-columns: 110px 60px 1fr 1fr; gap: 18px; align-items: start; padding: 12px 0; border-bottom: 1px solid var(--rule); }
.brand-row:last-child { border-bottom: 0; }
.brand-row .br-n { font-family: var(--display); font-size: 24px; line-height: 1; }
.brand-row.top .br-n { color: var(--ink); } .brand-row .br-n { color: var(--ink-2); }
.brand-row .br-s { font-family: var(--display); font-size: 19px; color: var(--ink-3); }
.brand-row p { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0; }
.brand-row .br-k { font-family: var(--mono); font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-3); display: block; margin-bottom: 4px; }
.brand-row .warn .br-k { color: var(--accent); }
@media (max-width: 900px) { .brand-row { grid-template-columns: 1fr 60px; } .brand-row p { grid-column: 1 / -1; } }
.bsw-row { display: flex; gap: 10px; flex-wrap: wrap; align-items: flex-start; margin-bottom: 4px; }
.bsw { width: 92px; display: block; }
.bsw .bsw-chip { display: block; height: 54px; border: 1px solid var(--rule); }
.bsw .bsw-k { font-family: var(--mono); font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); margin-top: 6px; }
.bsw .bsw-h { font-family: var(--mono); font-size: 10.5px; color: var(--ink); }
.chk-row { display: grid; grid-template-columns: 1fr 108px 1.2fr; gap: 16px; align-items: baseline; padding: 9px 0; border-bottom: 1px dotted var(--rule); }
.chk-row:last-child { border-bottom: 0; }
.chk-row .ck-n { font-size: 13px; color: var(--ink); }
.chk-row .ck-r { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 700; }
.chk-row .ck-r.pass { color: var(--ink-3); }
.chk-row .ck-r.flag { color: var(--accent); }
.chk-row .ck-d { font-size: 12px; color: var(--ink-2); line-height: 1.45; margin: 0; }
@media (max-width: 820px) { .chk-row { grid-template-columns: 1fr 108px; } .chk-row .ck-d { grid-column: 1 / -1; } }
.qa { padding: 10px 0; border-bottom: 1px dotted var(--rule); }
.qa:last-child { border-bottom: 0; }
.qa .qa-q { font-size: 13.5px; line-height: 1.5; color: var(--ink); margin: 0; }
.qa .qa-m { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-3); margin-top: 4px; }

/* ---- from build-report-v2 ---------------------------------------------------- */
/* Gate — the no-build decision */
.gate { background: var(--ink); color: var(--cream); padding: 40px 44px; display: grid; grid-template-columns: auto 1fr; gap: 28px; align-items: start; }
.gate .g-ic { font-family: var(--display); font-style: italic; font-size: 60px; line-height: 0.9; color: var(--accent); }
.gate .g-k { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--cream-deep); opacity: 0.75; }
.gate .g-t { font-family: var(--display); font-size: clamp(26px, 3vw, 40px); line-height: 1.15; margin: 10px 0 12px; }
.gate p { font-size: 14.5px; line-height: 1.6; color: var(--cream-deep); margin: 0; max-width: 720px; }
.gate .g-rows { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; margin-top: 22px; padding-top: 18px; border-top: 1px solid rgba(244,238,230,0.22); }
.gate .g-rows .g-rk { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--accent); margin-bottom: 6px; }
.gate .g-rows p { font-size: 13px; }
@media (max-width: 820px) { .gate { grid-template-columns: 1fr; padding: 28px 24px; } .gate .g-rows { grid-template-columns: 1fr; } }
/* Interview script columns (MAP §09) and the metric band above a section body */
.qa-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; margin-top: 8px; }
@media (max-width: 760px) { .qa-cols { grid-template-columns: 1fr; gap: 18px; } }
.grid-4.band, .grid-2.band { margin-bottom: 28px; }
/* Labelled prose — a mono label above a paragraph (ENGINE-18). Three tones, all literals. */
.labelled-prose .label { margin: 0; }
.labelled-prose p { margin: 24px 0 0; font-size: 14.5px; line-height: 1.55; color: var(--ink); }
.labelled-prose[data-tone="note"] p, .labelled-prose[data-tone="key"] p { margin-top: 8px; font-size: 12.5px; color: var(--ink-2); max-width: 900px; }
.labelled-prose[data-tone="key"] .label { font-size: 10px; letter-spacing: 0.16em; font-weight: 600; }
.labelled-prose + .labelled-prose { margin-top: 24px; }
.grid-2.prose { gap: 40px; align-items: start; }
/* Screen index panel — the container around the scr-row repeater */
.scr-index { background: var(--paper); border: 1px solid var(--rule); padding: 6px 26px; }
.fk.spec-lead { margin-bottom: 10px; }
/* Screen index rows */
.scr-row { display: grid; grid-template-columns: 230px 190px 1fr; gap: 20px; align-items: start; padding: 13px 0; border-bottom: 1px solid var(--rule); }
.scr-row:last-child { border-bottom: 0; }
.scr-row .sr-n { font-size: 14.5px; font-weight: 600; color: var(--ink); line-height: 1.3; }
.scr-row .sr-n .prio-badge { margin-top: 6px; }
.scr-row .sr-r { font-family: var(--mono); font-size: 11px; color: var(--ink-2); background: var(--cream-deep); padding: 3px 8px; border-radius: 3px; justify-self: start; }
.scr-row .sr-p { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin: 0; }
@media (max-width: 860px) { .scr-row { grid-template-columns: 1fr; gap: 8px; } }
/* Full screen specification */
.spec { background: var(--paper); border: 1px solid var(--rule); border-left: 4px solid var(--ink); padding: 20px 24px; margin-bottom: 12px; }
.spec .sp-h { display: flex; justify-content: space-between; align-items: baseline; gap: 14px; flex-wrap: wrap; margin-bottom: 4px; }
.spec .sp-h h5 { font-family: var(--display); font-size: 21px; margin: 0; line-height: 1.15; }
.spec .sp-r { font-family: var(--mono); font-size: 10.5px; color: var(--ink-2); background: var(--cream-deep); padding: 2px 7px; border-radius: 3px; }
.spec .sp-p { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin: 0 0 12px; max-width: 860px; }
.spec .sp-cols { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 22px; }
.spec .sp-cols .fk { margin-top: 0; }
@media (max-width: 900px) { .spec .sp-cols { grid-template-columns: 1fr; gap: 12px; } }
.spec .sp-lay { font-size: 12px; color: var(--ink-3); line-height: 1.5; margin: 0 0 12px; font-style: italic; }
/* Flow block */
.flow-block { background: var(--paper); border: 1px solid var(--rule); border-top: 3px solid var(--ink); padding: 22px 26px; margin-bottom: 14px; }
.flow-block .fb-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; flex-wrap: wrap; margin-bottom: 4px; }
.flow-block .fb-head h4 { font-family: var(--display); font-size: 24px; line-height: 1.15; margin: 0; }
.flow-block .fb-meta { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-3); }
.flow-block .fb-trig { font-size: 12.5px; color: var(--ink-2); margin: 0 0 14px; }
.flow-block .fb-succ { font-family: var(--display); font-style: italic; font-size: 14.5px; color: var(--ink); border-left: 3px solid var(--accent); padding-left: 12px; margin: 14px 0 0; line-height: 1.4; }
/* Epics + stories */
.epic { margin-bottom: 26px; }
.epic .ep-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; flex-wrap: wrap; border-bottom: 1px solid var(--rule-strong); padding-bottom: 8px; margin-bottom: 12px; }
.epic .ep-head h4 { font-family: var(--display); font-size: 22px; margin: 0; }
.epic .ep-head .ep-c { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-3); }
.epic .ep-desc { font-size: 13px; color: var(--ink-2); margin: 0 0 14px; max-width: 860px; }
.st-row { display: grid; grid-template-columns: 68px 1fr 84px; gap: 16px; align-items: start; padding: 11px 0; border-bottom: 1px dotted var(--rule); }
.st-row:last-child { border-bottom: 0; }
.st-row .st-id { font-family: var(--mono); font-size: 11px; color: var(--ink-2); background: var(--cream-deep); padding: 3px 7px; border-radius: 3px; justify-self: start; }
.st-row .st-t { font-size: 13.5px; line-height: 1.5; color: var(--ink); margin: 0; }
.st-row .st-p { justify-self: end; }
.st-row .st-ac { margin-top: 8px; padding-top: 8px; }
@media (max-width: 760px) { .st-row { grid-template-columns: 68px 1fr; } .st-row .st-p { grid-column: 2; justify-self: start; } }
/* Sprint */
.sprint-phase { border-top: 3px solid var(--ink); background: var(--paper); border-left: 1px solid var(--rule); border-right: 1px solid var(--rule); border-bottom: 1px solid var(--rule); padding: 22px 26px; margin-bottom: 14px; }
.sprint-phase .sp-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; flex-wrap: wrap; }
.sprint-phase .sp-head h4 { font-family: var(--display); font-size: 24px; margin: 0; }
.sprint-phase .sp-days { font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); font-weight: 600; }
.sprint-phase .sp-obj { font-size: 13.5px; color: var(--ink-2); margin: 8px 0 18px; max-width: 860px; }
.wk-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.wk { background: var(--cream); border: 1px solid var(--rule); padding: 16px 18px; }
.wk .wk-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); }
.wk .wk-f { font-family: var(--display); font-size: 19px; line-height: 1.2; margin: 4px 0 10px; }
.wk ul { list-style: none; padding: 0; margin: 0; }
.wk ul li { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); padding: 5px 0 5px 20px; position: relative; border-bottom: 1px dotted var(--rule); }
.wk ul li:last-child { border-bottom: 0; }
.wk ul li::before { content: ""; position: absolute; left: 0; top: 9px; width: 11px; height: 11px; border: 1.5px solid var(--rule-strong); border-radius: 2px; }
.wk .wk-done, .wk .wk-kill { font-size: 12px; line-height: 1.5; margin: 10px 0 0; padding-top: 9px; border-top: 1px solid var(--rule); color: var(--ink-2); }
.wk .wk-done b { color: var(--ink); } .wk .wk-kill b { color: var(--accent); }
@media (max-width: 820px) { .wk-grid { grid-template-columns: 1fr; } }
/* Non-goals */
.ng-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.ng { border-left: 3px solid var(--rule-strong); padding: 8px 0 8px 14px; }
.ng .ng-w { font-size: 13.5px; font-weight: 600; color: var(--ink); line-height: 1.4; }
.ng .ng-y { font-size: 12px; color: var(--ink-3); line-height: 1.45; margin: 3px 0 0; }
@media (max-width: 760px) { .ng-grid { grid-template-columns: 1fr; } }

/* ---- from launch-report-v2 ---------------------------------------------------- */
/* Warm network archetypes */
.warm-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.warm { background: var(--paper); border: 1px solid var(--rule); border-left: 4px solid var(--rule-strong); padding: 16px 20px; }
.warm .w-who { font-size: 14px; font-weight: 600; color: var(--ink); line-height: 1.4; }
.warm .w-why { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin: 7px 0 10px; }
.warm .w-ask { font-family: var(--display); font-style: italic; font-size: 14px; line-height: 1.45; color: var(--ink); border-left: 2px solid var(--accent); padding-left: 11px; margin: 0; }
.warm .w-k { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); margin-bottom: 4px; }
@media (max-width: 760px) { .warm-grid { grid-template-columns: 1fr; } }
/* Pricing tiers */
.tier-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.tier-c { background: var(--paper); border: 1px solid var(--rule); border-top: 3px solid var(--rule-strong); padding: 20px 22px; display: flex; flex-direction: column; }
.tier-c.pop { border-top-color: var(--accent); background: var(--cream-deep); }
.tier-c .tc-n { font-family: var(--display); font-size: 22px; line-height: 1.1; }
.tier-c .tc-badge { font-family: var(--mono); font-size: 9px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent); font-weight: 700; }
.tier-c .tc-p { font-family: var(--display); font-size: 34px; line-height: 1; margin: 12px 0 2px; }
.tier-c .tc-pm { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; color: var(--ink-3); }
.tier-c .tc-for { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin: 12px 0; font-style: italic; }
.tier-c ul { list-style: none; padding: 0; margin: 0 0 14px; }
.tier-c ul li { font-size: 12.5px; color: var(--ink-2); padding: 4px 0 4px 15px; position: relative; line-height: 1.45; }
.tier-c ul li::before { content: "\00B7"; position: absolute; left: 2px; color: var(--ink-3); }
.tier-c .tc-cta { margin-top: auto; font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink); border-top: 1px solid var(--rule); padding-top: 12px; font-weight: 600; }
@media (max-width: 820px) { .tier-grid { grid-template-columns: 1fr; } }
/* Objections */
.obj-row { display: grid; grid-template-columns: 1fr 1.4fr; gap: 22px; padding: 12px 0; border-bottom: 1px dotted var(--rule); align-items: start; }
.obj-row:last-child { border-bottom: 0; }
.obj-row .ob-q { font-family: var(--display); font-style: italic; font-size: 15px; line-height: 1.35; color: var(--ink); }
.obj-row .ob-a { font-size: 13px; color: var(--ink-2); line-height: 1.55; margin: 0; }
@media (max-width: 760px) { .obj-row { grid-template-columns: 1fr; gap: 8px; } }
/* Channel */
.chan { background: var(--paper); border: 1px solid var(--rule); border-top: 4px solid var(--ink); padding: 26px 30px; margin-bottom: 14px; }
.chan.sec { border-top-color: var(--rule-strong); }
.chan .ch-head { display: flex; justify-content: space-between; align-items: baseline; gap: 18px; flex-wrap: wrap; margin-bottom: 14px; }
.chan .ch-head h4 { font-family: var(--display); font-size: 30px; margin: 0; line-height: 1.05; }
.chan .ch-facts { display: flex; gap: 22px; flex-wrap: wrap; font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-3); }
.chan .ch-facts b { color: var(--ink); display: block; margin-top: 4px; font-size: 11px; }
.chan .ch-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; }
@media (max-width: 820px) { .chan .ch-cols { grid-template-columns: 1fr; } .chan { padding: 22px 20px; } }
/* Headlines */
.hl-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.hl { background: var(--paper); border: 1px solid var(--rule); padding: 14px 18px; }
.hl.best { border-color: var(--ink); border-left: 4px solid var(--accent); }
.hl .hl-k { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); display: flex; justify-content: space-between; gap: 10px; }
.hl .hl-k .use { color: var(--accent); font-weight: 700; }
.hl .hl-t { font-family: var(--display); font-size: 17px; line-height: 1.3; color: var(--ink); margin: 8px 0 0; }
@media (max-width: 760px) { .hl-grid { grid-template-columns: 1fr; } }
/* Refinement changelog */
.chg-row { display: grid; grid-template-columns: 210px 90px 20px 90px 1fr; gap: 14px; align-items: center; padding: 11px 0; border-bottom: 1px dotted var(--rule); }
.chg-row:last-child { border-bottom: 0; }
.chg-row .cg-n { font-size: 13px; font-weight: 600; color: var(--ink); }
.chg-row .cg-b { font-family: var(--mono); font-size: 13px; color: var(--ink-3); text-decoration: line-through; }
.chg-row .cg-ar { font-family: var(--display); font-style: italic; color: var(--ink-3); text-align: center; }
.chg-row .cg-a { font-family: var(--mono); font-size: 13px; color: var(--ink); font-weight: 600; }
.chg-row .cg-w { font-size: 12px; color: var(--ink-2); line-height: 1.45; margin: 0; }
@media (max-width: 900px) { .chg-row { grid-template-columns: 1fr 80px 18px 80px; } .chg-row .cg-w { grid-column: 1 / -1; margin-top: -2px; } }
/* Landing page variant */
.lp { background: var(--paper); border: 1px solid var(--rule); border-left: 4px solid var(--rule-strong); padding: 20px 24px; margin-bottom: 12px; }
.lp.one { border-left-color: var(--ink); }
.lp .lp-k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-3); }
.lp .lp-h { font-family: var(--display); font-size: clamp(19px, 2vw, 24px); line-height: 1.25; margin: 8px 0 8px; color: var(--ink); }
.lp .lp-sub { font-size: 13px; line-height: 1.55; color: var(--ink-2); margin: 0 0 6px; }
.lp .lp-cta { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); font-weight: 700; margin: 0 0 14px; }
.lp .lp-cols { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 22px; padding-top: 12px; border-top: 1px solid var(--rule); }
@media (max-width: 900px) { .lp .lp-cols { grid-template-columns: 1fr; gap: 12px; } }
.lp .lp-cols .fk { margin-top: 0; }
.lp ol { margin: 4px 0 0; padding-left: 18px; font-size: 12.5px; line-height: 1.55; color: var(--ink-2); }
.mc-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 14px; }

/* ===================================================================
   DEPTH VISIBILITY — the final word. Must stay LAST in this file.
   Inverted on purpose: elements are visible by default and we hide only
   what does not match the active depth. That way a shown component keeps
   its own display type (flex, grid, block) instead of being forced to
   block, and no later component rule can accidentally reveal it.
   =================================================================== */
body[data-depth="thin"]   [data-depth-body]:not([data-depth-body~="thin"]),
body[data-depth="report"] [data-depth-body]:not([data-depth-body~="report"]),
body[data-depth="full"]   [data-depth-body]:not([data-depth-body~="full"]) { display: none !important; }

/* ---- LAUNCH §03 anchored pricing (.ah-*) ------------------------------------------
   Moved out of body/offer.html, which shipped its own <style> block and inline background
   colours — the engine must emit no style and no colour, and a component whose CSS lives in a
   partial cannot be restyled without a re-drop. --accent replaces the old --band-4 fill: no tier
   or section owns a colour, and the accent is the fill token. */
.ah { display: grid; grid-template-columns: 1.3fr 1fr; gap: 16px; align-items: stretch; }
.ah-main { background: var(--cream); border-top: 3px solid var(--accent); color: var(--ink); padding: 24px 26px; display: flex; flex-direction: column; }
.ah-main .ah-kicker { color: var(--accent-ink); }
.ah-main .pr { font-family: var(--display); font-size: 60px; line-height: 1; margin: 6px 0; }
.ah-main .pr small { font-family: var(--mono); font-size: 15px; color: var(--ink-3); }
.ah-benefits { list-style: none; padding: 0; margin: 4px 0 0; display: grid; gap: 6px; }
.ah-trial { margin-top: auto; text-align: right; font-family: var(--mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-3); padding-top: 16px; }
.ah-side { display: grid; gap: 12px; }
.ah-alt { border: 1px solid var(--rule); padding: 14px 16px; display: flex; justify-content: space-between; align-items: baseline; }
.ah-alt .pr2 { font-family: var(--display); font-size: 24px; }
.ah-frame-note { font-size: 12px; color: var(--ink-2); line-height: 1.45; }
.frame-bar { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--ink-2); flex-wrap: wrap; }
.frame-bar .seg { height: 22px; border-radius: 3px; display: inline-flex; align-items: center; padding: 0 10px; font-family: var(--mono); font-size: 10px; white-space: nowrap; }
.frame-bar .seg-now { background: var(--ink); color: var(--cream); }
.frame-bar .seg-alt { background: var(--rule-strong); color: var(--ink); }
@media (max-width: 760px) { .ah { grid-template-columns: 1fr; } }

/* ---- Section-body wrappers (ENGINE-1) ------------------------------
   These five classes exist so the engine stops authoring markup and inline style. Each replaces
   a tag the renderer was emitting by hand — the contract says the engine emits no markup, no
   colour and no CSS, and until now it had to. Restyling any of them is a stylesheet edit, never
   a re-drop. Partials: body/row-list, tile-grid, section-lead, section-note, thin-card. */
.row-list { border-top: 1px solid var(--rule-strong); }
/* Section-open scale (drop Z, §0u). The top space a shell section opens with was five inline
   padding-top values across seven partials — 32 / 40 / 48 / 64 / 88 — which is a scale the
   stylesheet did not contain, so the engine was emitting geometry. Values unchanged; only the
   emitter moved. [data-open] gives (0,2,0) against .shell's (0,1,0), so it wins on its own.
   Print still zeroes .shell padding with !important, exactly as it did over the inline styles. */
.shell[data-open="tight"] { padding-top: 32px; }
.shell[data-open="prov"]  { padding-top: 40px; }
.shell[data-open="brief"] { padding-top: 48px; }
.shell[data-open="hero"]  { padding-top: 64px; }
.shell[data-open="band"]  { padding-top: 88px; }
/* .flush = this block sits flush inside a section that already owns the space. */
.report-foot.flush { margin-top: 0; }
.report-foot .rf-row { display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; gap: 16px; }
/* The .carried-verdict family is RETIRED with the strip itself (drop AF, RESPONSE-50 §1): a prior
   tier's separate verdict beside a deliberately singular recommendation re-opened the question the
   recommendation exists to settle. Rules out of whatifnowai.css, partial deleted, no emitter left. */
/* Two more the reference inlined and no partial could reach (drop Z, §0v). .row-list.soft is the
   same container at the light rule weight — inside the .prov card, where the strong rule reads as
   a second card edge; body/readiness-ledger.html is its emitter. .kpi-tile.north
   marks the ONE north-star KPI: ink, never a ramp colour, because it is emphasis and not a
   position on a scale. */
.row-list.soft { border-top-color: var(--rule); }
.kpi-tile.north { border-top: 3px solid var(--ink); }
/* Drop AF: the per-tier readiness ledger inside the provenance card (ENGINE-39 ask 4). The rule
   ships with the class — body/readiness-ledger.html lands in the same drop (§0w). */
.prov .readiness-ledger { margin-top: 18px; }
.prov .readiness-ledger .fk { margin-bottom: 0; }
/* Drop AK: the pre-pivot marker on a section whose content a later pivot overtook (ENGINE-45 §3.1,
   our C1). body/stale-chip.html lands in the same drop — a class and its rule ship together (§0w).
   Dashed is this product's provisional weight (the depth tick, .prov-sup's divider); a solid
   outline is .ca-sev's severity. --accent-ink is the ACTION channel, and a ramp token here would be
   a category error: staleness is not a position on a low–high axis. The left margin lives in this
   rule so section-head can emit {{STALE}} with no literal space in front of it (§0i). */
.stale-chip { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.13em; text-transform: uppercase; color: var(--accent-ink); border: 1px dashed var(--rule-strong); border-radius: 2px; padding: 2px 8px; margin-left: 9px; white-space: nowrap; }

/* ---- Drop AB: the 42 static inline declarations ------------------------
   Every rule below replaces a declaration a partial was emitting inline. The engine emits no
   colour and no CSS, so each of these was a rule this stylesheet was missing (§0u/§0w). Grouped
   by the fact they state, not by the partial that happened to carry them — twelve of them were
   two facts about text on the ink ground, written out four times. */

/* Text on the ink ground. .esc-band is emitted by BOTH closing-cta and closing-band. */
.esc-band .label { color: var(--cream-deep); opacity: 0.7; }
.esc-band .band-meta .eb-k { opacity: 0.6; }
.esc-band .band-meta .eb-v { color: var(--cream); margin-top: 6px; }
/* An upgrade price never prints alone (drop AJ): direct entry is live, so the ladder remainder and
   the cold price are one line or neither is stated. Same mono sub-line as .eb-soon .soon-k. */
.esc-band .band-meta .eb-v .eb-alt { display: block; font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--cream-deep); opacity: 0.72; margin-top: 4px; }
.gate .g-rows strong { color: var(--cream); }

/* Masthead: the tools cluster and the depth readout. */
.masthead-row .mast-tools { display: flex; align-items: center; gap: 16px; margin-left: auto; }
.tier-nav .tier-bar { margin: 0; }
.tier-nav .depth-note { color: var(--ink-3); margin-left: auto; }
.tier-nav .depth-note .depth-now { color: var(--ink); }

/* Component geometry the partials were carrying. .lc-week's calendar is THREE day-cells to a
   week, against .day-grid's four — the base value was dead at this call site, like
   .trust-strip's 88px above it. */
.lc-week .day-grid { grid-template-columns: repeat(3, 1fr); }
.chan .ch-why { color: var(--ink-2); max-width: 880px; }
.diff-card p { margin-top: 8px; }
.card-b .top .conf-chip { margin-left: auto; }
.shell[data-open="hero"] > h1 { margin-top: 12px; }
.prov .prov-w .prov-dot { color: var(--accent); }
/* The sans lead paragraph under a section head. It owns BOTH margins: the references carried
   inline margin-top: 22px / margin-bottom: 20px / 22px / 24px — four values for one thing, and
   the class went unused in all four reports, i.e. unreachable. One value, one class. */
.section-lead { margin: 22px 0; }
.section-note { font-size: 12.5px; margin-top: 14px; }
.tile-grid { margin-bottom: 26px; }
.grid-2.tight, .grid-3.tight, .grid-4.tight { gap: 14px; }
/* .ro-value carries a NUMBER by default (44px). A text or id value needs its own size, and the
   engine may not emit inline style — so the size is an attribute the payload's own type picks:
   data-kind="text" for a word ("High"), "id" for a range ("R01-R03"). ENGINE-9 §1.
   The full selector is deliberate: the 44px base is .risk-overview .ro-tile .ro-value in
   whatifnowai.css, so a bare .ro-value[data-kind] loses on specificity and the attribute does
   nothing. A contract that renders no differently is a rule that landed in a doc, not the tree. */
/* .mt-value is 40px for a short number. Longer values were carrying an INLINE font-size — five
   different ones, 22/24/26/28/30, for the same kinds of string: drift, not a system, and the
   engine may not emit style at all. One scale, keyed on the value's own length, which the payload
   knows: <=3 chars default 40 - 4-7 "sm" 30 - >=8 "xs" 24. Specificity matches the base
   (.metric-tile .mt-value), so the attribute wins. ENGINE-9 follow-up. */
.metric-tile .mt-value[data-kind="sm"] { font-size: 30px; }
.metric-tile .mt-value[data-kind="xs"] { font-size: 24px; }
/* The unit suffix on a value. Was an inline style inside napkin-cell.html — CSS in a partial cannot
   be restyled without a re-drop, and the suffix is optional, so it is its own partial. Scoped to
   both hosts: a metric-tile value takes a unit too ("$3/mo"), and a rule scoped to .napkin alone
   left that one unstyled. */
.napkin .nk-v .unit, .metric-tile .mt-value .unit { font-size: 14px; color: var(--ink-3); }
.risk-overview .ro-tile .ro-value[data-kind="text"] { font-size: 30px; }
.risk-overview .ro-tile .ro-value[data-kind="id"] { font-size: 24px; }
/* The rail card. whatifnowai.css reaches this padding through .card.flat[style*="border-left"] —
   a rule only an INLINE STYLE can satisfy, so a partial-composed card missed it entirely. The
   class does it now; the attribute rule stays only for references still carrying the inline form. */
.card.flat.thin-card { padding: 16px 20px 16px 22px; border-top: 0; }
.thin-card .t-small { margin: 8px 0 0; color: var(--ink-2); }
.thin-card.rail-ink { border-left: 4px solid var(--ink); padding-left: 16px; }
.thin-card.rail-accent { border-left: 4px solid var(--accent); padding-left: 16px; }
.meta-strip.brief { margin-bottom: 14px; }

/* ==== Type + rhythm utilities (v1.0.3) ==================================
   Every rule here replaces an inline declaration in the reference reports.
   177 of them survived across the four tiers — the metric-tile defect one
   component over: the engine emits no CSS, so any block carrying its own
   font-size is unrenderable, and a shared class an inline style overrides is
   unreachable (0h). Sans stays 11.5-14.5px, always.
   Where two blocks differed by 0.5-2px for the same job the values collapse:
   that was drift, not design. */
.t-note { font-size: 12.5px; line-height: 1.55; }
.t-fine { font-size: 12px;   line-height: 1.5; }
.t-lead { font-size: 13px;   line-height: 1.55; }
.t-note.ital { font-style: italic; }
.t-list { padding-left: 20px; font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }
/* t-list-lead.html's <strong> and the gap between items. Both were inline in the MAP reference —
   a colour token riding in an attribute past the stylesheet that would have carried it (§0w). */
.t-list li strong { color: var(--ink); }
/* tag.html emits no style, so the optical alignment of a tag beside a heading lives here. It was
   a style="vertical-align: middle" inside the fixtures' pre-rendered <span> (ENGINE-42 §6). */
.ch-head h4 .tag, .sg-n .tag, .risk-name .tag { vertical-align: middle; }
.t-list li + li { margin-top: 10px; }
.flow-0 { margin: 0; }
.flow   { margin: 0 0 8px; }
.flow-t { margin-top: 14px; }
.w-900  { max-width: 900px; }
.label.inline { display: inline; color: var(--ink-3); margin-right: 7px; }
.label.xs { font-size: 10px; }
.mono-label { font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3); }
.mono-label.xs { font-size: 10px; letter-spacing: 0.14em; }
.mono-note { font-size: 11px; text-transform: uppercase; letter-spacing: 0.16em; margin-left: 16px; }
.d-note { font-family: var(--display); font-size: 18px; line-height: 1.3; margin: 10px 0 12px; }
/* A sec-card's own heading sits below the section ttl in the hierarchy: a fixed 26px, not the
   global h3 clamp(22px, 2.2vw, 32px) which would out-size the section title it lives under. */
.sec-card .sec-head h3 { font-size: 26px; }
/* Drop AE (ENGINE-38 §5a): LAUNCH §01's readiness wrapper had no partial and authored both of these
   inline, which is why sec-card.html could not be written before now. .pad is the §01 measure — the
   critical card's own 40px 44px is too much once a section-head sits above it; .tight closes the gap
   to a lede that follows immediately. */
.sec-card.pad { padding: 32px 36px; }
.sec-card .sec-head.tight { margin-bottom: 12px; }
.d-head { font-family: var(--display); font-size: 22px; line-height: 1.25; margin: 10px 0 8px; max-width: 820px; }

/* The lede inside a report section is denser than the marketing site's:
   19px against the identity's clamp(20px, 1.6vw, 26px). It was inline on all
   nine, which made .lede itself unreachable in every report. */
.shell .lede { font-size: 19px; }

/* In-section pulls run smaller than the identity's clamp(24px, 2.6vw, 36px) —
   18px standard, with two documented steps up. Inline before; the class rule
   had never once rendered. */
.shell blockquote.pull { font-size: 18px; }
.shell blockquote.pull[data-size="md"] { font-size: 22px; margin-bottom: 26px; }
.shell blockquote.pull[data-size="lg"] { font-size: 26px; margin-bottom: 28px; }

/* Verdict band bullets. The arrow is a block 28px glyph in its own right;
   inline beside a claim it is 22px. */
.verdict-bullets .vb-row { display: flex; gap: 9px; align-items: baseline; }
.verdict-bullets .arrow.inline { display: inline; margin: 0; font-size: 22px; }
/* V6's other half: these are headline-shaped claims of three to eight words, so they get balance
   rather than pretty — an even two-line split, not a widow-avoiding last line. */
.verdict-bullets .vb-k { color: var(--cream); font-size: 14px; text-wrap: balance; }
.verdict-bullets .vb-t { margin: 7px 0 0; padding-left: 22px; font-size: 13.5px; line-height: 1.5; }

/* The conditional line — ENGINE-73's ruling (option 3), drop BJ. Fills chrome/verdict-conditional.html.
   Two axes in ONE sentence, so two colours: readiness inherits --cream, the recommendation clause takes
   --accent-on-ink. It sits in the WELL the eb-recap `here` rung uses (ENGINE-42 §4, applied across this
   sheet at BI) rather than on the bare band, for two reasons that agree: a sunk ground reads as a
   statement of record instead of a fourth rationale, and it takes both pairs UP rather than down. The
   well's resolved hex and both ratios are computed per leaf node into PACK-MANIFEST
   invariants.contrast_audit and are NOT written here (no_ratio_in_comments). Left padding matches
   .verdict-inner so the sentence starts under the
   verdict word, not under the band edge. ZERO INSTANCES IN THE PACK and declared: no reference has ever
   carried a ready tier on a pivot recommendation. Release condition in invariants.dead_class_census. */
.verdict .vcond { margin: 0; padding: 20px 56px 22px; background: rgba(0,0,0,0.14); border-top: 1px solid rgba(246, 241, 227, 0.2); font-family: var(--display); font-size: clamp(18px, 1.6vw, 22px); line-height: 1.42; color: var(--cream); text-wrap: pretty; }
.verdict .vcond .vc-rec { color: var(--accent-on-ink); }

/* Ink-band furniture: title, note, meta row, CTA. */
/* margin and font-weight are pinned (drop AO, A3.1) so this can be the h2 it reads as without the
   UA sheet moving it: an h3's bottom margin is 1em and an h2's is 0.83em, which is a 5-7px shift at
   this clamp. 1em reproduces what three reference bands have rendered since v2. */
.band-title { color: var(--cream); font-size: clamp(28px, 3vw, 40px); margin: 10px 0 1em; font-weight: 700; }
/* The accent full stop that closes a band title. It was a style="color: var(--accent)" inline in
   the reference AND inside closing_band.headline in the fixture — a token travelling in payload. */
.band-title .stop { color: var(--accent); }
/* The last paragraph in a risk card. LAUNCH §01 renders the card without a trigger block, so its
   reference marked the mitigation .flow-0 while MAP's says .flow — one class apart, and the one
   partial that draws both could only say one of them (§0x). Spacing at the end of a card is the
   stylesheet's job. */
.risk-card > p:last-child { margin-bottom: 0; }
.band-note  { font-size: 14.5px; color: var(--cream-deep); margin-top: 14px; max-width: 480px; }
.band-meta  { display: flex; gap: 24px; font-family: var(--mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.18em; }
.btn-cta { display: inline-block; white-space: nowrap; background: var(--accent-ink); color: var(--cream); text-decoration: none; padding: 12px 22px; border-radius: 999px; font-family: var(--mono); font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.18em; font-weight: 600; }

/* The masthead's tier nav is a baseline mono row, not the section spine's
   bordered one — a modifier, not an inline override of its own class. */
.tier-nav[data-place="masthead"] { align-items: baseline; gap: 10px; padding-top: 0; border-top: 0; font-family: var(--mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; }

/* ==== Lifted out of partials (v1.0.3) ==================================
   competition.html and user-stories.html each shipped a full <style> block
   inside the partial. A component whose CSS lives in its own partial cannot
   be restyled without a re-drop — and the engine emits no CSS, so the block
   was riding along as markup. Verbatim, now shared. */
.comp-split { display: grid; grid-template-columns: 1.7fr 1fr; gap: 30px; align-items: start; margin-top: 22px; }
  .comp-split .cs-right { position: sticky; top: 90px; }
  .comp-map { position: relative; aspect-ratio: 1 / 1; background: var(--paper); border: 1px solid var(--rule); border-radius: 8px; }
  .comp-map .cm-axis { position: absolute; font-family: var(--mono); font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); }
  .comp-map .cm-x1 { left: 8px; top: 50%; } .comp-map .cm-x2 { right: 8px; top: 50%; text-align: right; }
  .comp-map .cm-y1 { top: 8px; left: 50%; transform: translateX(-50%); } .comp-map .cm-y2 { bottom: 8px; left: 50%; transform: translateX(-50%); }
  .comp-map .cm-mid-h { position: absolute; left: 12%; right: 12%; top: 50%; border-top: 1px dashed var(--rule-strong); }
  .comp-map .cm-mid-v { position: absolute; top: 12%; bottom: 12%; left: 50%; border-left: 1px dashed var(--rule-strong); }
  .comp-dot { position: absolute; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; gap: 3px; }
  .comp-dot .d { width: 10px; height: 10px; border-radius: 50%; background: var(--ink); }
  .comp-dot.us .d { background: var(--band-4); width: 13px; height: 13px; }
  .comp-dot .nm { font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.04em; color: var(--ink-2); white-space: nowrap; }
  @media (max-width: 820px) { .comp-split { grid-template-columns: 1fr; gap: 20px; } .comp-split .cs-right { position: static; } }
/* Partial-level type that was inline, now shared. Same collapse as the
   references: 0.5-2px differences for one job were drift. */
.hero-meta { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 9px 26px; padding-top: 16px; border-top: 1px solid var(--rule); }
.ah-alt .aa-n { font-size: 14px; }
.ah-alt .aa-s { font-size: 11px; color: var(--ink-3); }
.ah-alt .pr2 small { font-family: var(--mono); font-size: 11px; color: var(--ink-3); }
.ah-benefit { font-size: 12.5px; color: var(--ink-2); display: flex; gap: 9px; align-items: flex-start; line-height: 1.4; }
.ah-benefit .tick { color: var(--band-4-ink); flex: none; }
table.report.dense { font-size: 13px; }
table.report .col-type { width: 92px; }
