/* == SELF-HOSTED FACES (generated) == */
@font-face{font-family:"Cormorant Garamond";font-style:normal;font-weight:400;font-display:optional;src:url("../fonts/cormorant-garamond-400.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Cormorant Garamond";font-style:normal;font-weight:500;font-display:optional;src:url("../fonts/cormorant-garamond-500.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Cormorant Garamond";font-style:normal;font-weight:600;font-display:optional;src:url("../fonts/cormorant-garamond-600.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Cormorant Garamond";font-style:normal;font-weight:700;font-display:optional;src:url("../fonts/cormorant-garamond-700.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Inter";font-style:normal;font-weight:400;font-display:optional;src:url("../fonts/inter-400.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Inter";font-style:normal;font-weight:500;font-display:optional;src:url("../fonts/inter-500.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Inter";font-style:normal;font-weight:600;font-display:optional;src:url("../fonts/inter-600.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"Inter";font-style:normal;font-weight:700;font-display:optional;src:url("../fonts/inter-700.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:400;font-display:optional;src:url("../fonts/jetbrains-mono-400.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:500;font-display:optional;src:url("../fonts/jetbrains-mono-500.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:600;font-display:optional;src:url("../fonts/jetbrains-mono-600.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:700;font-display:optional;src:url("../fonts/jetbrains-mono-700.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
/* == END SELF-HOSTED FACES == */
/* ============================================================================
   PropSurvival — design tokens + shared components.
   ONE token set. Every page reads from this file; no per-page ad-hoc values.
   Language: "The Plate and the Page" — Swiss grid rigor + decision flow.
   Colour is MEANING, never a traffic light. ONE accent: wine = the binding constraint.
   ============================================================================ */

/* ═══════════════════════════════════════════════════════════════════════════
   AMENDMENT · "THE PLATE AND THE PAGE" — the approved visual constitution.
   See design-rounds/authority/VISUAL-CONSTITUTION.md.

   This block feeds ALL 16 pages. It previously carried the palette that the
   forensic profile of 18 rejected mocks identified as the rejected one: a warm
   cream paper that read "lifestyle", the muted oxblood ruby present in 13 of
   those 18, an ochre second accent, plus olive and terracotta — FOUR accents
   competing. That is why every page still looked old even where structure had
   been recomposed. (The old hex literals are deliberately not repeated here:
   they are grep-zero across the deploy surface and must stay that way.)

   THE LAW NOW:
     · ONE accent. Wine #7E1A2C, and it means THE BINDING CONSTRAINT — never
       pass/fail, never decoration, never an action.
     · The substrate is COOL institutional stone, not warm cream.
     · Judgment is struck onto INK; evidence is printed onto PAGE.
     · gold / olive / terra are RETIRED. Their tokens survive only as aliases so
       the 16 pages that reference them keep parsing — every one now resolves to
       ink or graphite, so no second voice can reappear through a legacy name.
   ═══════════════════════════════════════════════════════════════════════════ */
/* ── THE NAVIGATION REGISTER — one family sitewide ────────────────────────
   The primary nav was set in the text sans while the app's tab rank beneath it
   used other faces; a professional reads mixed faces in one horizontal region
   as "the CSS didn't load". Navigation is instrument LABELLING, so it takes the
   mono register everywhere — one family, one size, one rhythm, on all 16 pages.
   Rank inside navigation is expressed by weight and ink, never by a second face. */
.ps-nav a{
  font-family:var(--ps-mono,"JetBrains Mono",ui-monospace,monospace) !important;
  font-size:10.5px !important;
  letter-spacing:.13em !important;
  text-transform:uppercase !important;
  font-weight:400 !important;
}
.ps-nav a.ps-nav--cta{font-weight:600 !important}
.ps-mark__word{
  font-family:var(--ps-mono,"JetBrains Mono",ui-monospace,monospace) !important;
  font-size:12px !important;letter-spacing:.22em !important;text-transform:uppercase !important;
  font-weight:500 !important;
}

:root{
  /* ── canonical palette (new work should use these names) ───────────────── */
  --ps-plate:#0C0D0F;        /* THE PLATE — the ground of judgment            */
  --ps-plate-rule:#24272C;   /* structure on the plate                        */
  --ps-plate-dim:#6E737A;    /* subordinate voice on the plate                */
  --ps-plate-quiet:#9AA0A6;  /* readable secondary on the plate               */
  --ps-wine:#7E1A2C;         /* THE BINDING CONSTRAINT. once per composition. */
  --ps-wine-mark:#9B1B33;    /* same colour, compensated for small marks on ink */

  /* ── NAVY IS WITHDRAWN (operator ruling, 2026-07-25). Do not reintroduce it.
     Navy must never sit alongside black or dark gray, and this palette is
     exactly that: plate #0C0D0F plus ink #1A1C20 / graphite #4A4D52 / prose
     #3A3D42. Measured on the house reference page, navy was invisible at
     eyebrow size (indistinguishable from ink at 10.5px) and competed with the
     figure it captioned at prose size — it broke the gray ladder without
     earning a rung. `design-rounds/authority/navy_verdict_on_fresh_substrates.html`
     is a MOCK, not a theme file, and is explicitly not the example to follow.
     WINE is the emphasis colour; hierarchy otherwise comes from size, weight
     and letterspacing — never a second hue. ──────────────────────────────── */

  /* ── substrate: cool institutional stone — a record, not a lifestyle ───── */
  --ps-paper:#E7E7E4;
  --ps-card:#F2F2EF;
  --ps-wash:#DEDEDA;

  /* ── ink scale (cool) ──────────────────────────────────────────────────── */
  --ps-ink:#1A1C20;        /* headings, the record */
  --ps-ink-2:#3A3D42;      /* prose */
  --ps-ink-3:#82857F;      /* apparatus: labels, notes, provenance */

  /* ── rules: subordinate now. MASS is the structural device. ────────────── */
  --ps-rule:#CBCBC5;       /* hairline */
  --ps-rule-2:#DADAD4;     /* faint hairline */
  --ps-rule-hard:#1A1C20;  /* section boundary */

  /* ── colour = meaning. ONE job, ONE accent. ────────────────────────────── */
  --ps-ruby:#7E1A2C;       /* THE binding constraint. Legacy name, wine value. */
  --ps-gold:#1A1C20;       /* RETIRED as an accent → ink. A headline number is
                              carried by SIZE, never by hue. */
  --ps-olive:#4A4D52;      /* RETIRED → graphite. Provenance is subordinate,
                              not a green signal. */
  --ps-terra:#0C0D0F;      /* RETIRED → the plate. An ACTION IS NOT A
                              CONSTRAINT, so a CTA is ink, never wine. */
  --ps-graphite:#6E737A;   /* the mass of secondary data. Charts. */

  /* ── type ──────────────────────────────────────────────────────────────── */
  --ps-serif:"Cormorant Garamond",Georgia,"Times New Roman",serif;
  --ps-sans:Inter,system-ui,-apple-system,"Segoe UI",sans-serif;
  --ps-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;

  /* ── spacing scale (4px base) ──────────────────────────────────────────── */
  --ps-1:4px;  --ps-2:8px;  --ps-3:12px; --ps-4:16px; --ps-5:24px;
  --ps-6:32px; --ps-7:48px; --ps-8:64px; --ps-9:96px; --ps-10:128px;

  /* ── geometry: Swiss. no radius, no elevation, anywhere. ───────────────── */
  --ps-radius:0;
  --ps-gutter:clamp(20px,5vw,64px);
  --ps-maxw:1180px;
  --ps-measure:64ch;
}

/* ── base ─────────────────────────────────────────────────────────────────── */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--ps-paper);color:var(--ps-ink-2);
  font-family:var(--ps-sans);font-size:16px;line-height:1.62;
  -webkit-font-smoothing:antialiased;
}
img,svg{max-width:100%}
:where(a){color:var(--ps-terra)}
:focus-visible{outline:2px solid var(--ps-terra);outline-offset:3px}
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
}
.ps-wrap{max-width:var(--ps-maxw);margin:0 auto;padding:0 var(--ps-gutter)}
.ps-skip{position:absolute;left:-9999px}
.ps-skip:focus{left:var(--ps-gutter);top:var(--ps-2);z-index:99;background:var(--ps-ink);color:var(--ps-paper);padding:var(--ps-2) var(--ps-4)}

/* ── type hierarchy ───────────────────────────────────────────────────────── */
.ps-h1{font-family:var(--ps-serif);font-size:clamp(40px,6.2vw,78px);line-height:.99;letter-spacing:-.028em;font-weight:500;color:var(--ps-ink);margin:0}
.ps-h2{font-family:var(--ps-serif);font-size:clamp(28px,3.5vw,44px);line-height:1.06;letter-spacing:-.022em;font-weight:500;color:var(--ps-ink);margin:0}
.ps-h3{font-family:var(--ps-serif);font-size:clamp(21px,2.2vw,28px);line-height:1.14;letter-spacing:-.015em;font-weight:600;color:var(--ps-ink);margin:0}
.ps-deck{font-size:clamp(16.5px,1.5vw,19px);line-height:1.58;max-width:56ch;margin:0}
.ps-lede{font-size:15.5px;line-height:1.6;max-width:50ch;margin:0}
.ps-prose{max-width:var(--ps-measure)}
.ps-prose p{margin:0 0 var(--ps-4)}
strong,.ps-strong{font-weight:600;color:var(--ps-ink)}

/* apparatus label — the small voice of the document */
.ps-tag{font-family:var(--ps-mono);font-size:10.5px;font-weight:500;letter-spacing:.15em;text-transform:uppercase;color:var(--ps-ink-3)}
.ps-tag--olive{color:var(--ps-olive)}
.ps-tag--ruby{color:var(--ps-ruby)}
.ps-tag--terra{color:var(--ps-terra)}

/* numbers: a number is either a headline (serif) or a record (mono). never sans. */
.ps-num{font-family:var(--ps-mono);font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.ps-headline-num{font-family:var(--ps-serif);font-weight:600;color:var(--ps-ink);line-height:.9;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.ps-bind{color:var(--ps-ruby)}

/* ── ONE button. every button on every page is this button. ───────────────── */
.ps-btn{
  display:inline-block;font-family:var(--ps-sans);font-size:14px;font-weight:500;
  line-height:1.2;padding:13px 24px;text-decoration:none;cursor:pointer;
  border:1px solid var(--ps-terra);background:var(--ps-terra);color:#fff;
  border-radius:var(--ps-radius);transition:background .15s,border-color .15s;
}
.ps-btn:hover{background:#0C0D0F;border-color:#0C0D0F}
/* --ps-terra is annotated RETIRED → the plate in this sheet's own token block.
   It still resolves to #0C0D0F, so nothing was visibly wrong — but a live rule
   reading a retired alias is exactly the latent path HUB-04 removed from
   .ps-headline-num's --ps-gold read. Same computed value, real token. ───── */
.ps-btn--ghost{background:transparent;color:var(--ps-plate,#0C0D0F)}
/* was rgba(12,13,15,.06) — the sheet's LAST sub-1-alpha fill, and gratuitous:
   .ps-btn--quiet:hover one line below already does the same job with the flat
   --ps-wash token. An alpha wash over an unknown ground is an unmeasurable
   colour; a flat token is the same effect with a knowable value. ────────── */
.ps-btn--ghost:hover{background:var(--ps-wash,#DEDEDA);color:var(--ps-plate,#0C0D0F)}
.ps-btn--quiet{background:transparent;color:var(--ps-ink);border-color:var(--ps-rule)}
.ps-btn--quiet:hover{background:var(--ps-wash);border-color:var(--ps-ink-3)}
.ps-actions{display:flex;flex-wrap:wrap;gap:var(--ps-3) var(--ps-4);align-items:center}
.ps-aside-note{font-size:13px;color:var(--ps-ink-3)}

/* ── ONE card. hairline + whitespace. no shadow, no radius, ever. ─────────── */
.ps-card{background:var(--ps-card);border:1px solid var(--ps-rule);padding:clamp(18px,2.4vw,30px)}
.ps-card__head{display:flex;justify-content:space-between;align-items:baseline;gap:var(--ps-3);
  padding-bottom:var(--ps-3);border-bottom:1px solid var(--ps-rule-2);margin-bottom:var(--ps-4)}

/* ── ONE table. tabular, hairline-ruled, no zebra. ────────────────────────── */
.ps-tbl{width:100%;border-collapse:collapse}
.ps-tbl td,.ps-tbl th{padding:9px 0;border-bottom:1px solid var(--ps-rule-2);font-size:13.5px;text-align:left;vertical-align:baseline}
.ps-tbl thead td,.ps-tbl thead th{border-bottom:1px solid var(--ps-rule);padding-bottom:7px}
.ps-tbl tr:last-child td{border-bottom:0}
.ps-tbl .ps-v{text-align:right;font-family:var(--ps-mono);font-variant-numeric:tabular-nums;font-size:13.5px;color:var(--ps-ink);white-space:nowrap}
.ps-tbl tr.ps-row-bind td,.ps-tbl tr.ps-row-bind .ps-v{color:var(--ps-ruby)}
.ps-tbl .ps-sub{display:block;font-size:11.5px;color:var(--ps-ink-3);line-height:1.35;margin-top:2px}

/* ── section rhythm ───────────────────────────────────────────────────────── */
.ps-band{padding:clamp(48px,7vw,92px) 0;border-top:1px solid var(--ps-rule)}
.ps-band--hard{border-top:1px solid var(--ps-rule-hard)}
.ps-band__head{display:flex;justify-content:space-between;align-items:baseline;gap:var(--ps-5);
  flex-wrap:wrap;margin-bottom:clamp(24px,3vw,40px)}

/* ── figure: a chart that argues. caption states the ONE question it answers ─ */
.ps-fig{margin:0}
.ps-fig__cap{display:flex;justify-content:space-between;align-items:baseline;gap:var(--ps-3);
  padding-bottom:var(--ps-2);border-bottom:1px solid var(--ps-rule);margin-bottom:var(--ps-3)}
.ps-fig__q{font-size:12.5px;font-style:italic;color:var(--ps-ink-3);margin:0 0 var(--ps-3)}
.ps-fig__box{position:relative;width:100%;background:var(--ps-card);border:1px solid var(--ps-rule-2)}
.ps-fig__box>svg{display:block;width:100%;height:auto}
.ps-legend{display:flex;gap:var(--ps-4);flex-wrap:wrap;margin-top:var(--ps-3)}
.ps-legend span{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ps-ink-3);display:flex;align-items:center;gap:6px}
.ps-legend i{width:12px;height:2px;display:block;flex:none}

/* ── masthead / nav ───────────────────────────────────────────────────────── */
/* THE PAGE IS COOL, NOT CREAM (VISUAL-CONSTITUTION §"the page", line 134: the
   prior warmth "read lifestyle"). This band was the last surviving warm value:
   a translucent warm-cream scrim sat on the paper body, which put a visible
   warm/cool seam across the top of all 17 static pages. It survived the hex
   sweep only because it was written as rgba(), which is exactly the hiding
   place this sheet's own header comment claims to have cleared. REPOINTED
   below to --ps-paper; per the AMENDMENT above, the retired warm literal is not
   restated here either, so this file stays grep-zero for it.
   THE ALPHA IS NOW GONE TOO, and that was the actual defect. The earlier pass
   repointed the HUE but deliberately kept "the same alpha scrim", which was
   never justified on any axis. Measured consequence, reported independently by
   two page workers: at .93 the body text underneath BLEEDS THROUGH the sticky
   band, and `backdrop-filter:blur(6px)` smears it rather than hiding it — so
   the top 59px of every static page carried a faint smudge of whatever was
   scrolling beneath it. A translucent blurred scrim is the same class of soft
   effect as the shadows, gradients and radii this sheet bans: judgment is
   struck onto ink and evidence is printed onto page, and a printed instrument
   has no frosted glass. Opaque --ps-page, with the existing 1px rule carrying
   the edge, is the same colour with none of the smear.
   NB the token is --ps-paper, NOT --ps-page: no --ps-page is declared anywhere
   in this sheet, and writing it here would have resolved to nothing and made
   the sticky band TRANSPARENT — a worse defect than the one being fixed. ── */
.ps-head{position:sticky;top:0;z-index:50;background:var(--ps-paper,#E7E7E4);
  border-bottom:1px solid var(--ps-rule)}
.ps-head__in{max-width:var(--ps-maxw);margin:0 auto;padding:0 var(--ps-gutter);
  height:58px;display:flex;align-items:center;justify-content:space-between;gap:var(--ps-4)}
.ps-mark{font-family:var(--ps-mono);font-size:12px;font-weight:700;letter-spacing:.13em;
  text-transform:uppercase;color:var(--ps-ink);text-decoration:none;display:flex;align-items:center;gap:8px;flex:none}
/* the rotated-45deg diamond that used to live here is DELETED. No page emits an
   <i> inside .ps-mark, so it was dead — but §6 THE MARK is a true square with no
   optical rounding and no cleverness, and a rotated square sitting in the live
   mark block is a landmine for whoever reuses this class next. */
.ps-nav{display:flex;align-items:center;gap:var(--ps-5)}
.ps-nav a{font-size:13px;color:var(--ps-ink-2);text-decoration:none;padding-bottom:2px;border-bottom:1px solid transparent}
.ps-nav a:hover{border-bottom-color:var(--ps-rule)}
.ps-nav a.ps-nav--cta{color:var(--ps-terra)}
@media(max-width:820px){.ps-nav .ps-hide-s{display:none}}
/* X5 — mobile tap height: padding only, no restructure. Raises the anchor's
   own border-box to the >=40px touch-target floor on hand-held widths. */
@media(max-width:560px){.ps-nav a{padding-top:12px;padding-bottom:12px}}

/* ── colophon / footer ────────────────────────────────────────────────────── */
.ps-foot{border-top:1px solid var(--ps-rule-hard);padding:var(--ps-6) 0 var(--ps-8);color:var(--ps-ink-3)}
.ps-foot__cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:var(--ps-5)}
.ps-foot h4{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.15em;text-transform:uppercase;
  color:var(--ps-ink-3);margin:0 0 var(--ps-3);font-weight:500}
.ps-foot ul{list-style:none;margin:0;padding:0}
.ps-foot li{margin-bottom:var(--ps-2)}
.ps-foot a{font-size:13px;color:var(--ps-ink-2);text-decoration:none}
.ps-foot a:hover{color:var(--ps-terra)}
.ps-foot__legal{margin-top:var(--ps-6);padding-top:var(--ps-4);border-top:1px solid var(--ps-rule);
  display:flex;justify-content:space-between;gap:var(--ps-5);flex-wrap:wrap}
.ps-foot__legal p{margin:0;font-size:12px;line-height:1.6;max-width:56ch}
.ps-foot__legal .ps-colophon{font-family:var(--ps-mono);font-size:11px;letter-spacing:.04em;line-height:1.9;text-align:right}
@media(max-width:600px){.ps-foot__legal .ps-colophon{text-align:left}}
/* X5 — mobile tap height: padding only, no restructure. Raises the anchor's
   own border-box to the >=40px touch-target floor on hand-held widths. */
/* `display:inline-block` is LOAD-BEARING, not cosmetic. These anchors are
   inline by default, and vertical padding on an inline box inflates the border
   box WITHOUT reserving layout space — so the row *measures* 41px while the
   lines still sit 21px apart. Measured before this fix: 12 overlapping
   tap-target pairs with 7.1px vertical overlap on terms/privacy/faq/pricing.
   A >=40px assertion passes straight through that phantom box. Do not remove. */
@media(max-width:560px){.ps-foot a{display:inline-block;padding:12px 0}}

/* ── the ladder: four questions, not a feature wall ───────────────────────── */
.ps-ladder{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--ps-rule-hard)}
.ps-rung{padding:var(--ps-5) var(--ps-5) var(--ps-5) 0;border-right:1px solid var(--ps-rule-2);display:flex;flex-direction:column}
.ps-rung:last-child{border-right:0;padding-right:0}
.ps-rung__price{font-family:var(--ps-mono);font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--ps-ink-3)}
.ps-rung__price--now{color:var(--ps-terra)}
.ps-rung__q{font-family:var(--ps-serif);font-size:clamp(19px,1.85vw,24px);line-height:1.2;
  color:var(--ps-ink);margin:var(--ps-3) 0 var(--ps-2);font-weight:500}
.ps-rung__d{font-size:13px;line-height:1.5;color:var(--ps-ink-3);flex:1}
.ps-rung__who{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ps-olive);margin-top:var(--ps-3);line-height:1.5}
@media(max-width:880px){
  .ps-ladder{grid-template-columns:1fr 1fr}
  .ps-rung:nth-child(2n){border-right:0;padding-right:0}
  .ps-rung:nth-child(-n+2){border-bottom:1px solid var(--ps-rule-2)}
}
@media(max-width:540px){
  .ps-ladder{grid-template-columns:1fr}
  .ps-rung{border-right:0;padding:var(--ps-4) 0;border-bottom:1px solid var(--ps-rule-2)}
  .ps-rung:last-child{border-bottom:0}
}

/* ── evidence list (used by the data-locality moment) ─────────────────────── */
.ps-evidence{border-top:1px solid var(--ps-rule)}
.ps-evidence__row{display:flex;gap:var(--ps-3);align-items:baseline;padding:11px 0;
  border-bottom:1px solid var(--ps-rule-2);font-family:var(--ps-mono);font-size:12.5px;line-height:1.5}
.ps-evidence__row:last-child{border-bottom:0}
.ps-evidence__mark{flex:none;width:18px;color:var(--ps-olive)}
.ps-evidence__mark--none{color:var(--ps-ink-3)}
.ps-evidence__row span:last-child{color:var(--ps-ink-2);font-family:var(--ps-sans);font-size:13.5px}

/* ── decision chain: Evidence → Rule → Simulation → Verdict → Confidence ──── */
.ps-chain{border-top:1px solid var(--ps-rule-hard)}
.ps-chain__step{display:grid;grid-template-columns:64px 1fr;gap:var(--ps-4);
  padding:var(--ps-5) 0;border-bottom:1px solid var(--ps-rule);align-items:start}
.ps-chain__n{font-family:var(--ps-mono);font-size:11px;font-weight:700;letter-spacing:.1em;color:var(--ps-ruby);padding-top:5px}
.ps-chain__t{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ps-ink-3);margin-bottom:var(--ps-2)}
@media(max-width:640px){.ps-chain__step{grid-template-columns:44px 1fr;gap:var(--ps-3)}}

/* ── utilities (the only ones; add none per page) ─────────────────────────── */
.ps-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,4vw,56px);align-items:start}
.ps-grid-hero{display:grid;grid-template-columns:1.04fr .96fr;gap:clamp(28px,4.5vw,64px);align-items:start}
@media(max-width:940px){.ps-grid-2,.ps-grid-hero{grid-template-columns:1fr;gap:var(--ps-6)}}
.ps-hr{height:1px;background:var(--ps-rule);border:0;margin:0}
.ps-mt-4{margin-top:var(--ps-4)} .ps-mt-5{margin-top:var(--ps-5)} .ps-mt-6{margin-top:var(--ps-6)}

/* ── canonical brand mark (identical markup on every page) ────────────────── */
/* SQUARE SIZE. The glyph is a 24-unit viewBox carrying an 18-unit rect, so the
   painted square is 18/24 of this box. At 26px that rendered 19.5px against a
   12px word — 50% larger than the reference, which strikes a 13px square onto a
   12.5px word. A block placed BESIDE a label reads as a logo; a square struck
   ONTO the word reads as a mark (§6). 17.5px → 13.1px painted. */
.ps-mark__glyph{width:17.5px;height:17.5px;flex:none;display:block}
/* the duplicate .ps-mark__word declaration that stood here (12px/.13em/700) is
   removed: it always lost to the !important block near the top of this sheet
   (12px/.22em/500, which is the conforming one), so it did nothing but mislead
   anyone reading the sheet for the shipped values. */
.ps-mark__word span{color:var(--ps-ink);font-weight:500}

/* ── shared content-page components (privacy/terms/faq/changelog/glossary) ── */
.wrap{max-width:var(--ps-maxw);margin:0 auto;padding:0 var(--ps-gutter)}
main{padding-bottom:var(--ps-8)}
.kicker{font-family:var(--ps-mono);font-size:10.5px;font-weight:500;letter-spacing:.15em;text-transform:uppercase;color:var(--ps-ink-3)}
h1{font-family:var(--ps-serif);font-size:clamp(34px,5vw,60px);line-height:1.02;letter-spacing:-.026em;font-weight:500;color:var(--ps-ink);margin:var(--ps-4) 0 0}
h2{font-family:var(--ps-serif);font-size:clamp(23px,2.8vw,34px);line-height:1.1;letter-spacing:-.02em;font-weight:500;color:var(--ps-ink);margin:var(--ps-7) 0 var(--ps-3)}
h3{font-family:var(--ps-serif);font-size:clamp(18px,1.9vw,23px);line-height:1.2;font-weight:600;color:var(--ps-ink);margin:var(--ps-5) 0 var(--ps-2)}
main p,main li{max-width:var(--ps-measure)}
main p{margin:0 0 var(--ps-4)}
main ul,main ol{padding-left:var(--ps-5)}
main li{margin-bottom:var(--ps-2)}
.lede{font-size:clamp(16.5px,1.5vw,19px);line-height:1.58;max-width:56ch;color:var(--ps-ink-2)}
.updated,.fine,.note{font-family:var(--ps-mono);font-size:11px;letter-spacing:.05em;color:var(--ps-ink-3)}
.callout{border:1px solid var(--ps-rule);border-left:2px solid var(--ps-olive);background:var(--ps-card);padding:clamp(16px,2.2vw,26px);margin:var(--ps-5) 0}
.tbl,.tbl-wrap table{width:100%;border-collapse:collapse}
.tbl th,.tbl td{padding:9px 12px 9px 0;border-bottom:1px solid var(--ps-rule-2);font-size:13.5px;text-align:left;vertical-align:top}
.tbl th{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ps-ink-3);border-bottom:1px solid var(--ps-rule)}
.tbl-wrap{overflow-x:auto}
.entry{padding:var(--ps-5) 0;border-bottom:1px solid var(--ps-rule)}
.entry-date{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--ps-olive)}
.chip,.tag{font-family:var(--ps-mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ps-ink-3)}
.mono,.num{font-family:var(--ps-mono);font-variant-numeric:tabular-nums}
.ruby{color:var(--ps-ruby)} .gold{color:var(--ps-gold)} .olive{color:var(--ps-olive)}

/* ══ THE GRAY LADDER + ANCHOR CLEARANCE ═══════════════════════════════════════
   Both measured, both sitewide, both here rather than duplicated into 14 pages —
   and this is the ONLY route that reaches terms.html / privacy.html / 404.html,
   which carry no inline <style> at all.

   1 · ANCHOR CLEARANCE. The masthead is sticky and 59px at every viewport, and no
   rule in this sheet set scroll-margin-top — so 104 of the 105 ids on the site
   resolved to 0 and every #hash target landed 58.5-59.5px UNDER the header,
   including the frozen nav's own index.html#how and #firms (present on all 17
   pages) and #main, the skip-link destination. :where() keeps specificity at zero
   so any page can still override; svg/defs ids are excluded because they are
   never scroll destinations.

   2 · THE GRAY LADDER — this is the mechanical cause of "the pages are still
   gray", and the fix adds NO hue. Measured WCAG contrast on the four real light
   grounds (page #E7E7E4 / card #F2F2EF / wash #DEDEDA / hairline #DADAD4):
       --ps-ink-3  #82857F   3.02 / 3.34 / 2.77 / 2.67   <- the apparatus colour
       --ps-plate-dim #6E737A 3.86 / 4.26 / 3.54 / 3.40
       --ps-olive  #4A4D52   6.85 / 7.57 / 6.29 / 6.05
       --ps-ink-2  #3A3D42   8.80 / 9.72 / 8.08 / 7.77
       --ps-rule   #CBCBC5   1.32 / 1.45 / 1.21 / 1.16
   #82857F painted EVERY eyebrow, kicker, caption, .fine, .updated, .tag, .chip,
   footer h4, footer legal <p> and .ps-colophon at 10.5-12px, where AA needs 4.5.
   So the sheet declared three rungs between prose and rule but two of them landed
   inside the same 2.7-4.3 perceptual band while the rule sat at 1.2-1.5: the
   reader saw ONE gray where three were intended. Darkening apparatus one rung to
   #4A4D52 makes the labels legible AND opens a real ~4.7x separation between
   label and rule, so section boundaries become visible. --ps-ink-3 keeps its
   value for NON-TEXT use (borders, marks). Wine is untouched: it still means the
   binding constraint and nothing else. ────────────────────────────────────── */
:where([id]:not(svg [id]):not(defs [id])){scroll-margin-top:72px}

.ps-tag,.kicker,.updated,.fine,.note,.chip,.tag,
.ps-fig__cap,.ps-fig__q,.ps-legend span,.tbl th,
.ps-foot h4,.ps-foot__legal p,.ps-colophon{color:var(--ps-olive)}
.ps-foot h4{letter-spacing:.20em}

/* ── CP-13b · THE APPARATUS TEXT CP-13 COULD NOT NAME. CP-13 above darkened the
   label classes by name, but --ps-ink-3 #82857F is still painted as TEXT by six
   further selectors at 10.5–13px, measuring 3.02:1 on --ps-page #E7E7E4 where AA
   needs 4.5:1. --ps-ink-3 KEEPS its value for NON-TEXT use: .ps-btn--quiet's
   hover border and .ps-evidence__mark--none's mark are deliberately untouched,
   because a 1px rule and a dash are looked at, not read. ─────────────────── */
.ps-aside-note,.ps-tbl .ps-sub,.ps-foot,
.ps-rung__price,.ps-rung__d,.ps-chain__t{color:var(--ps-olive)}

/* ══ HUB-01 · THE PLATE AS A BAND ═══════════════════════════════════════════
   Judgment is struck onto ink; evidence is printed onto page. A page with no
   plate has no register change from masthead to footer, and that is the whole
   of "monotonous": measured plate area on the six hub pages is 0.0–0.2%, all of
   it buttons, against desk.html 28.2% and figures.html 20.2%.
   WINE ON THE PLATE IS AREA OR A RULE — NEVER TEXT. Measured: wine #7E1A2C on
   #0C0D0F = 1.89:1, and the compensated #9B1B33 = 2.39:1. Both fail 3:1, so a
   wine word on the plate is forbidden at any size. .ps-plate__bind therefore
   carries wine as GROUND with paper on top (8.18:1 measured) — the binding
   constraint still reads wine, and it is still the only thing that does.
   MEASURED CORRECTION to the spec: --ps-plate-dim #6E737A is 4.08:1 on the
   plate, not 4.29:1, so it is BELOW AA for the 10.5px mono labels it was
   assigned. The apparatus rung on the plate is therefore --ps-plate-quiet
   (7.38:1); --ps-plate-dim is reserved for rules and marks, which are not read.
   ───────────────────────────────────────────────────────────────────────── */
.ps-plate{background:var(--ps-plate);color:var(--ps-plate-quiet);
  padding:clamp(40px,6vw,80px) 0;border:0}
.ps-plate .ps-h1,.ps-plate .ps-h2,.ps-plate .ps-h3,
.ps-plate h1,.ps-plate h2,.ps-plate h3,
.ps-plate strong,.ps-plate .ps-strong{color:var(--ps-paper)}     /* 15.72:1 */
.ps-plate p,.ps-plate li,.ps-plate .ps-lede,.ps-plate .ps-deck,
.ps-plate .lede{color:var(--ps-plate-quiet)}                     /*  7.38:1 */
.ps-plate .ps-tag,.ps-plate .kicker,.ps-plate .ps-num{color:var(--ps-plate-quiet)}
.ps-plate hr,.ps-plate .ps-hr{background:var(--ps-plate-rule)}
.ps-plate .ps-btn{border-color:var(--ps-paper);background:var(--ps-paper);color:var(--ps-plate)}
.ps-plate .ps-btn--ghost{background:transparent;color:var(--ps-paper)}
.ps-plate :where(a){color:var(--ps-paper)}
.ps-plate__bind{display:block;background:var(--ps-wine);color:var(--ps-paper);
  padding:var(--ps-4) var(--ps-5)}   /* wine as AREA. paper on wine = 8.18:1 */

/* ══ HUB-02 · THE MONUMENT ══════════════════════════════════════════════════
   A decision instrument's largest object is a NUMBER, not a sentence. Measured,
   the mocks run 16–26x from apparatus to monument while these pages run
   5.7–7.4x, and that ratio IS the monotony. The unit is a grotesque riding the
   cap line, never the serif: at this size Cormorant's %/$ optically detaches
   from the numeral and reads as a defect.
   Wine is FORBIDDEN here — a monument is carried by SIZE, which is exactly why
   --ps-gold was retired to ink, and a number is not a constraint. ────────── */
.ps-monument{font-family:var(--ps-serif);font-weight:600;color:var(--ps-ink);
  font-size:clamp(72px,11vw,168px);line-height:.86;letter-spacing:-.035em;
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;
  display:block;margin:0}
.ps-monument__unit{font-family:var(--ps-sans);font-weight:500;
  font-size:.17em;letter-spacing:.02em;vertical-align:baseline;
  margin-left:.06em}
/* MEASURED CORRECTION: the cap was specified --ps-ink-3 #82857F, which is
   3.02:1 on --ps-page at 10.5px — it would ship a NEW AA failure into a
   brand-new component. --ps-olive #4A4D52 is 6.85:1 (browser-derived) and still
   one clear rung below --ps-ink-2 prose, so the cap stays subordinate. */
.ps-monument__cap{font-family:var(--ps-mono);font-size:10.5px;font-weight:500;
  letter-spacing:.22em;text-transform:uppercase;color:var(--ps-olive);
  display:block;margin-top:var(--ps-3)}
/* VERIFIED-CORPUS MODIFIER (CNV-012). The three freshness numerals encode two
   different things: 24 and 18 are claims of corpus STRENGTH, 6 is a DISCLOSURE
   ("published only as ranges"). Identical styling hid the distinction and made
   the page's largest type its flattest colour.

   Justification on the five axes, because a colour needs a reason:
   · meaning      wine marks what we verified; ink marks what we refused to guess
   · harmony      both tokens already live on this band (wine on its 13.5px date)
   · readability  #7E1A2C on the band it actually sits on measures 8.18:1 —
                  browser-sampled at 158.4px, not derived from the token pair
                  (the disclosure numeral measures 13.77:1)
   · perceptibility  the split never relies on hue alone: each caption states
                  which kind of number it is
   · theme-fit    wine is the product's one accent and this is a provenance
                  claim, its native subject
   The disclosure numeral deliberately does NOT take the accent — dressing a
   limitation as an achievement is the exact move this product refuses. */
.ps-monument--verified{color:var(--ps-wine)}
.ps-plate .ps-monument{color:var(--ps-paper)}
.ps-plate .ps-monument__cap{color:var(--ps-plate-quiet)}

/* ══ HUB-03 · THE MARGINALIA LANE ═══════════════════════════════════════════
   Measured: prose maxes at 552–574px inside a 1052px column, so 47–51% of every
   hub column is empty air while headings and boxes cross a measure the prose
   never reaches — the reader gets no column edge to hang on. The lane pins the
   second column so the FIRST column's right edge becomes a real, repeated line,
   and puts the apparatus (dates, counts, provenance) where the eye already is
   not reading. Breakpoint is 1080px, not 940: 64ch + 268px + a 72px gap needs
   ~1000px of column plus gutters. ───────────────────────────────────────── */
/* MEASURED CORRECTION to the spec: the columns were
   `minmax(0,var(--ps-measure)) 268px`. NEITHER track is flexible, so whenever the
   container is wider than 64ch + 268px + the gap, grid leaves the remainder empty
   at the right (justify-content defaults to start) and the aside floats INBOARD
   instead of pinning. Measured on pricing.html at 1440: 156px of dead grid and the
   aside 174.4px short of the edge — it failed HUB-16's own acceptance test.
   `minmax(0,1fr)` also serves the item's stated intent better: the first column's
   right edge then sits at container − 268 − gap, a fixed line that REPEATS at
   every width, where a ch-based track drifts with font metrics and never repeats.
   The grid owns the column edge; a CONSUMER caps its own prose at --ps-measure.
   A blanket cap here is deliberately NOT applied — it would strand tables and
   figures that legitimately want the full first column. ──────────────────── */
.ps-lane{display:grid;grid-template-columns:minmax(0,1fr) 268px;
  column-gap:clamp(32px,4vw,72px);align-items:start}
.ps-lane>*{min-width:0}
/* The one cost of `1fr`, measured and closed: the reading track is no longer
   capped by --ps-measure, so at 1440 it offers 84.2ch where 64ch was intended.
   Real creep is small (measured 66.5ch, because inner blocks self-limit), but a
   consumer dropping a bare <p> into the lane would get an 84ch line, which is
   past the readable range. So cap the TEXT, not the track — tables, figures and
   wide records keep the full column, which is exactly why a blanket cap on the
   track's child was rejected. :where() keeps specificity at 0 so any consumer
   can override with a single class and no !important. ────────────────────── */
.ps-lane>:first-child>:where(p,li,dd,blockquote,figcaption){max-width:var(--ps-measure)}
/* ⚠ CONSUMER FOOTGUN, measured the hard way. If you re-declare
   `grid-template-columns` on .ps-lane from a page's own sheet, you beat the
   collapse rule in the media query BELOW as well — same specificity, later
   cascade — and the body track goes to 0px. One page hit exactly this and its
   document became 69,841px tall. **Re-declare the breakpoint too**, or scope
   your override inside its own `@media(min-width:1081px)`.
   Note also what the `1fr` track means for you: it is deliberately uncapped so
   the aside can pin, and the rule above caps the TEXT instead. A page that
   wants a narrower reading TRACK (e.g. to hold 64ch exactly rather than the
   ~81 characters 1fr allows at 1440) should pin it locally — that is a
   legitimate override, not a workaround. Capping the track HERE was measured
   and rejected: it un-pins the aside unless paired with
   justify-content:space-between, which balloons the gutter 57.6px → 232px at
   1440 and re-creates the dead air this component exists to remove. ─────── */
/* same measured correction as .ps-monument__cap: --ps-ink-3 at 11px is 3.02:1 */
.ps-lane__aside{font-family:var(--ps-mono);font-size:11px;line-height:1.62;
  letter-spacing:.02em;color:var(--ps-olive);
  border-top:1px solid var(--ps-rule);padding-top:var(--ps-3);margin:0}
.ps-lane__aside dt{font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  font-size:10.5px;color:var(--ps-ink-2);margin-top:var(--ps-3)}
.ps-lane__aside dd{margin:2px 0 0}
/* REQUIRED, and absent from the spec: the aside sets its own colour, so inside
   .ps-plate it would paint #4A4D52 on #0C0D0F = 2.30:1 — unreadable. The plate
   variant is not optional decoration, it is the component's contrast floor. */
.ps-plate .ps-lane__aside{color:var(--ps-plate-quiet);
  border-top-color:var(--ps-plate-rule)}
.ps-plate .ps-lane__aside dt{color:var(--ps-paper)}
@media(max-width:1080px){
  .ps-lane{grid-template-columns:1fr}
  .ps-lane__aside{margin-top:var(--ps-5)}
}
