/* ═══════════════════════════════════════════════════════════════════
   proof-page.css — THE DISTRICT PAGE SHELL. One home for the shape every
   proof-district page arranges itself in: a centred column, a head band, a
   stage panel, a probe note. <link>ed AFTER brand.css and proof.css.

   WHY IT EXISTS (R2, 2026-07-29): this shell was hand-copied into THREE
   surfaces — `proof-A.html`/`emit-proof.mjs`, `proof-system.html`, and
   `cc-offer-research-dump.html`/`emit-cc.mjs`. Two of the three copies were
   byte-identical; the third differed by 2–3px on four declarations with no
   recorded reason. That is exactly the defect R1 found one pass earlier
   (13 selectors verbatim in two emitters — Promotion-Floor met and
   unobserved), at three consumers instead of two. Re-copying it into three
   per-surface namespaces would have reproduced the finding while citing it.

   WHAT THIS FILE IS: page COMPOSITION, shared. Every rule is box-model,
   flow, or a type register composed from the brand tiers. It answers the
   classification test (proof-surface/r1-inline-codification.md §3) with
   semantic=NO, reusable=YES, contract-bearing=NO → composition, not canon.

   WHAT THIS FILE IS NOT: district canon. The `page-` namespace is the
   honest signal — a `pr-` class authored here would fail verify.mjs's
   pr-canon-home gate (gate 7), which is the point. It is also NOT a
   cascade override layer: nothing here names a `pr-*` selector, so
   loading after proof.css cannot retune canon the way the pre-R1 inline
   blocks did.

   VALUES: snapped onto the --space-* tier in the move (max shift 6.4px,
   on one vertical margin). Where the three copies disagreed, they are
   converged — the disagreements were drift, not design, and are recorded
   in r2-migration-backlog.md §3 rather than preserved.
   ═══════════════════════════════════════════════════════════════════ */

/* ── the centred column ──────────────────────────────────────────────
   --wide is a NAMED divergence, not a cascade override: the research
   dump runs a 1120px column against the 1080px default. Recorded as a
   modifier so the difference is legible in one file instead of being an
   override discovered later from a second stylesheet. ── */
.page{max-width:1080px;margin:0 auto;padding:clamp(24px,5vw,64px) clamp(20px,5vw,56px)}
.page--wide{max-width:1120px}

/* ── the head band ── */
.page-head{border-bottom:1px solid var(--hairline);padding-bottom:var(--space-6);margin-bottom:var(--space-10)}

/* ── the stage: the inset panel the walk sits in ──
   --flow is the styleguide's variant (a stacked column of specimens); the
   probe pages hand the stage a single child and need no flow. ── */
.page-stage{background:var(--inset);border:1px solid var(--hairline);border-radius:var(--radius-panel);
  padding:clamp(18px,3vw,32px)}
.page-stage--flow{display:flex;flex-direction:column;gap:var(--space-5)}

/* ── the probe note: the mono aside under the stage that says what was
   computed rather than authored. --text-micro is below the prose-size
   band, so gate 6 (prose-measure-coverage) correctly does not ask it for
   a measure cap — it is a fine-mono label, not running prose. ── */
.page-note{font-family:var(--font-mono);font-size:var(--text-micro);color:var(--muted);
  letter-spacing:var(--track-mono);margin-top:var(--space-8);line-height:var(--leading-relaxed)}
.page-note b{color:var(--ink-2);font-weight:400}

/* ═══════════════════════════════════════════════════════════════════
   THE TWO READING REGISTERS (2026-08-08) — PROMOTED, NOT AUTHORED.

   Both shapes already existed ONCE, as `.cc-beat-heading` and
   `.cc-beat-prose` in cc-offer.css, written for the depth layer. The CC
   front artifact is their SECOND consumer, so re-authoring them under a
   second per-surface prefix would be the exact defect this file exists to
   end — R1's (13 selectors verbatim in two emitters, Promotion-Floor met
   and unobserved) and R2's (one shell hand-copied into three surfaces).
   Every TYPE value below is carried across unchanged; nothing is retuned.

   THE SPACING HALF WAS AUTHORED 2026-08-09 (Steward, D2), NOT carried —
   because the donor had none to carry: on the depth surface both registers
   sit inside `.cc-beat`'s flex column, whose `gap:var(--space-5)` supplied
   every vertical relationship. The gap belongs to that LAYOUT and did not
   travel with the registers, so the promoted shapes composed in bare flow
   with zero margin — the subhead sat tight against the panel it heads
   (D2), and `.lede + .page-prose` met at 0px (the same absence, one seam
   over). A register promoted out of a flex-gap container must bring its
   own spacing relationship or its new host silently supplies none.

   PLACEMENT WALKED, NOT ASSUMED (Design System Steward — Corvus,
   `steward-ruling-cc-front.md` §3.3 + §5). T1 passes for both: the
   contract of each register can be written with no district vocabulary
   (no claim / evidence / confidence / band / pole / verdict). This file's
   own classification test then admits them — semantic=NO, reusable=YES,
   contract-bearing=NO → composition, and "a type register composed from
   the brand tiers" is already what `.page-note` is.

   ⚠️ STAGED OBLIGATION 1 — the HEADING register belongs in brand core.
   T2 puts it there and the ruling records the verdict: transplanted onto
   a non-proof Corvus surface, every rule in its contract still holds, and
   the landing page has the same need. It is sited here this round because
   the brand-core walk is a six-step chain across three files, a generator
   and two hardcoded card counts — real work, and not what the front-page
   authoring step is. Siting it one tier low WITH the promotion recorded
   is the honest interim; siting it low silently is the stranding
   direction CODIFICATION.md names — it works, nothing fails, and every
   future non-proof surface re-derives a parallel shape.
   TRIGGER: the first non-proof Corvus surface needing a sub-display
   heading, OR a third consumer — whichever comes first.

   ⚠️ STAGED OBLIGATION 2 — `.cc-beat-heading` / `.cc-beat-prose`
   converge onto these. They are now a second definition of what this file
   defines, and they are deliberately NOT retired here: the depth layer is
   held unchanged this round by the artifact-shape decision, so touching
   its sheet would re-open a frozen surface for a stylesheet edit. This is
   the R2 pattern — promote the shell, converge the surfaces — run in two
   steps rather than one, because one of the surfaces is frozen.
   TRIGGER: the cc-offer depth re-cut. Converge then; do not fork now.
   CONVERGENCE NOTE (added 2026-08-09 with the spacing half): margins do
   NOT collapse inside a flex container, so when `.cc-beat-heading` /
   `.cc-beat-prose` converge onto these registers the depth layout must
   ABSORB the registers' own spacing (drop the now-redundant flex gap at
   that seam) or the beats double-space. The values were chosen to make
   that absorption exact: the subhead's margin-bottom IS `.cc-beat`'s
   observed --space-5 rhythm, carried across.
   ═══════════════════════════════════════════════════════════════════ */

/* ── the reading-prose register ──────────────────────────────────────
   The page's running-prose block: capped, reading leading, --ink-2. It
   exists because brand core caps prose measure on exactly ONE selector
   (`.compare-note`) and a bare <p> in `.page` runs to ~130 characters.

   --ink-2 and the cap are both load-bearing INSIDE a panel: `.panel p`
   is --muted with no leading token and no cap, which the sibling surface
   already ruled a reading-comfort defect for multi-sentence bodies
   (Steward F4) — right for a twenty-word feature card, wrong for a
   multi-paragraph argument. This sheet loads AFTER brand.css and the two
   selectors are equal specificity, so `.page-prose p` wins inside a panel
   by source order. That ordering is the mechanism, not an accident. ── */
.page-prose{max-width:var(--measure-prose);display:flex;flex-direction:column;gap:var(--space-4)}
.page-prose p{font-family:var(--font-text);font-size:var(--text-body);
  line-height:var(--leading-relaxed);color:var(--ink-2);max-width:var(--measure-prose)}
/* List rows are subordinate content and read at the prose register, not above it.
   Unstyled, an <li> inherits --ink and renders BRIGHTER than the paragraph it
   details — the ink inversion the Stage-8 pass named (R3, 2026-08-09). Scoped to
   .page-prose so link lists composed OUTSIDE the prose register (the depth maps,
   where brighter anchor rows are correct) stay untouched. */
.page-prose li{font-family:var(--font-text);font-size:var(--text-body);
  line-height:var(--leading-relaxed);color:var(--ink-2);max-width:var(--measure-prose)}
/* THE FLOW HALF (D2 sibling, 2026-08-09): a prose block composed after anything must space
   itself from it — on the donor surface `.cc-beat`'s flex gap did this; in bare flow nothing
   did, and `.lede + .page-prose` rendered at 0px. `* + ` scopes the margin to non-first
   position, so prose that OPENS a container (the panel case, where it is the only child)
   stays flush against the panel's own padding. Adjacent block margins collapse, so after a
   `.page-subhead` (margin-bottom --space-5) the seam resolves to --space-5, not the sum. */
* + .page-prose{margin-top:var(--space-4)}

/* ── the sub-display heading register ────────────────────────────────
   Brand core's ladder runs h1/.h1 (--text-display, 16ch) → .h2
   (--text-h2, 17ch) → nothing. `.panel h3` is the right tier scoped to
   the wrong place. A section heading of sentence length has no carrier.

   NAMED `subhead`, NOT `heading`, deliberately: `.page-head` is a real
   class in this same file and is a PREFIX of `page-heading`, so a
   truncated typo would land silently on the head band. `subhead` has no
   such truncation path.

   30ch and 40ch are display BALANCE caps, not reading measures — they
   bound the wrap of a short display line, and the empirical 45–75ch
   reading band does not govern them. That is why they are raw `ch` named
   in verify.mjs's gate-5 allowlist rather than folded into --measure-*:
   folding them in would imply the reading band governs them.
     · 30ch is `.cc-beat-heading`'s value, carried across for a 2–6-word
       heading.
     · --wide is the ONE difference that survives, and it survives because
       it has a recorded reason: the CC front page's headings are full
       questions of ~45 characters. At 30ch a 31–40-character question is
       forced to break; 40ch lets it hold one line and breaks the longer
       ones into two balanced lines. 40 sits below the reading band's 45ch
       floor by construction, so the cap cannot be misread as a measure.
   Carried across as-is: the promoted shape sets no `text-wrap:balance`,
   unlike brand core's h1/.h2/.catch caps. Adding it is a Steward call,
   not a promotion's. ── */
.page-subhead{font-family:var(--font-display);font-weight:600;font-size:var(--text-h3);
  letter-spacing:var(--track-tight);line-height:var(--leading-snug);color:var(--ink);max-width:30ch;
  /* The Steward call the promotion note above left open, made 2026-08-09 when a real
     heading fired the trigger: a 41ch heading against the 40ch --wide cap breaks with a
     two-word orphan line. Balance matches brand core's own display caps (h1/.h2/.catch). */
  text-wrap:balance;
  /* THE SPACING HALF (D2, 2026-08-09). The register declared type and no spacing relationship
     to what follows — the half of a heading register that does the visible work — because the
     donor's spacing lived in `.cc-beat`'s flex gap (see the header block). The global reset
     zeroes h2 margins, so the subhead sat FLUSH against the panel/prose it heads.
     --space-5 is the donor's observed heading→content rhythm, carried with its reason; on the
     heading rather than the follower because a heading's followers vary (prose, panel, list)
     and each would otherwise re-derive the gap — the `.label` / `.panel h3` precedent, not
     the `.terms`/.stat-row follower-carries-margin one, which breaks for first-child panels. */
  margin-bottom:var(--space-5)}
.page-subhead--wide{max-width:40ch}
