/* ==========================================================================
   pp-tokens.css — shared design tokens
   ==========================================================================

   ONE source, consumed by both:
     - the WordPress theme (pivotalpath.com)
     - Vision's prerenderer (index pages, methodology, answer pages)

   ★ TWO COPIES, ONE PER SYSTEM, AT THE SAME PATH (revised 2026-09-14).

   This header used to read ONE COPY, ONE HOME, and forbade duplication
   outright: Vision hosted the file, both systems linked it as an absolute URL,
   and a second copy was described as a fork that defeats the purpose. That was
   right while one host served everything. It is now wrong, and following it
   would reintroduce the failure it was written to prevent.

   What changed: www.pivotalpath.com serves this file itself. Each system now
   holds its own copy and links it RELATIVELY --

     <link rel="stylesheet" href="/assets/pp-tokens.css">

   -- so a page's design comes from the host that served the page. The path is
   identical on both, which is what makes the two copies interchangeable.

   WHY THE RULE INVERTED. A single hosted copy means every page on BOTH
   properties depends on ONE host being up and correct. That is not a shared
   source, it is a cross-domain runtime dependency, and it failed exactly that
   way twice: the /a/ pages shipped an absolute link to a host that did not
   serve the file and rendered unstyled; later the same link pointed at a host
   running an older build, so the pages loaded a palette that had been replaced.
   Neither 404s visibly. Both look like "the theme overrode our CSS".

   THE COST, STATED PLAINLY: two copies CAN drift, and drift here is invisible
   -- two properties that are meant to be indistinguishable slowly stop being
   so, with nothing erroring. That is a real regression against the old
   arrangement, and it is accepted only because it is MECHANICALLY CHECKED.

   THE SYNC REQUIREMENT. The two served copies must be BYTE-IDENTICAL.
     - vision/public/assets/pp-tokens.css is the EDITABLE source. Change it here.
     - The WordPress copy is a mirror. Never edit it directly; copy this file
       over it, whole.
     - server/scripts/check_tokens_sync.py fetches both served URLs and fails if
       they differ by a single byte. It is a deploy gate, so a change that lands
       on one property and not the other cannot ship quietly.

   The seam between systems sits at LOGIN, not at the platform boundary.
   A visitor moving from /about/ to /hedge-fund-index/composite must see no
   change in typography, spacing, colour, header or navigation.

   Rules:
     - Public pages use these tokens only. No local colour or type values.
     - Application UI (behind login) may extend, never redefine.
     - Add a token rather than hardcoding a value in one system.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1 · Type
   -------------------------------------------------------------------------- */
@import url('https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;1,6..72,400&family=Archivo:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap');

:root {
  /* ★ NEWSREADER, not Instrument Serif (2026-09-14). Newsreader is what Vision
     actually ships on its public pages and what has been approved; Instrument
     Serif was this file's own choice and never matched. Vision loads it with
     optical sizing, which the import above preserves. */
  --pp-font-display: "Newsreader", Georgia, "Times New Roman", serif;
  --pp-font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
  --pp-font-body: Archivo, system-ui, -apple-system, "Segoe UI", sans-serif;

  /* Scale. Fluid where a heading must hold at both ends. */
  /* ★ CEILING 66px, WAS 72px (2026-09-17). The CLAMP stays: it holds at narrow
     widths where the Lab's flat 66px literal does not, so only the ceiling was
     wrong. */
  --pp-size-hero:      clamp(40px, 6.2vw, 66px);
  --pp-size-page:      clamp(36px, 5.4vw, 60px);
  --pp-size-section:   clamp(29px, 4vw, 42px);
  --pp-size-sub:       27px;
  --pp-size-lede:      19px;
  /* ★ 16px, WAS 16.5px (2026-09-17). The Lab's base, adopted for the same
     reason as the measure and the CTA. Half a pixel sounds like nothing and
     is inherited by every element that does not set its own size, so it was
     the reason the lede and the nav line-heights differed even where their
     font sizes already agreed. */
  --pp-size-body:      16px;
  --pp-size-ui:        15px;
  --pp-size-small:     14px;
  --pp-size-caption:   12.5px;
  --pp-size-label:     12px;

  --pp-lh-tight:  1.05;
  --pp-lh-head:   1.12;
  /* ★ 1.6, THE LAB'S (2026-09-17). These two were the SECOND inherited value
     the two systems disagreed about - the first was the base font-size - and
     between them they accounted for every remaining line-height difference
     across the estate, in elements whose font sizes already agreed. */
  --pp-lh-body:   1.6;
  --pp-lh-lede:   1.6;

  --pp-track-display: -0.02em;   /* display type needs negative tracking */
  --pp-track-label:    0.09em;   /* uppercase labels need positive */
}

/* --------------------------------------------------------------------------
   2 · Colour — VISION'S PUBLIC PALETTE, adopted verbatim 2026-09-14

   Every value below is lifted from the `.pp-app` block in
   src/pages/lab/PivotalPathPrototype.jsx, which is what Vision actually serves
   on its public pages. The NAMES here are semantic and load-bearing — 32 uses
   of --pp-accent alone across the prerenderer and the chrome — so the values
   changed and the names did not.

   ★★ global.css IS A DIFFERENT DESIGN SYSTEM. DO NOT RECONCILE AGAINST IT.
   src/styles/global.css is the SIGNED-IN APPLICATION's palette: its --blue is
   #1a4d80, its --gold #e3a330, its --navy-header #243a60. Those are not these.
   This file previously carried #243a60 as --pp-brand, --pp-panel and
   --pp-theme-color, taken from the application via the <meta name="theme-color">
   tag — a plausible-looking route to the wrong colour, since the app and the
   public pages are different surfaces that happen to share a company. Vision's
   public navy is #0b1620. Anyone reconciling these later must take the public
   values from PivotalPathPrototype.jsx, never from global.css.

   Three of these were INLINE LITERALS in Vision and never variables: the
   stats-band grey, the ticker green, and the two hero gradient stops. They are
   named here because a value used once is still a decision, and an unnamed one
   is the value that silently diverges.
   -------------------------------------------------------------------------- */
:root {
  /* ink ramp — Vision --text/--ink, --ink2, --muted */
  --pp-ink:        #0b1620;   /* primary text, and the dark ground */
  --pp-ink-2:      #13202e;   /* secondary ink */
  --pp-ink-3:      #637080;   /* labels, captions, de-emphasis (Vision --muted) */

  /* paper — Vision --paper is the PAGE ground; --white is the card surface */
  --pp-ground:     #faf9f6;   /* warm off-white page ground */
  --pp-surface:    #ffffff;   /* cards and panels sitting on the ground */
  --pp-wash:       #f1efe9;   /* stats band. WAS INLINE in Vision, never a var */

  --pp-rule:       #d8d4c9;   /* structural rules (Vision --line2) */
  --pp-rule-fine:  #e7e4dd;   /* within-component rules (Vision --line) */

  --pp-accent:     #1a46c0;   /* links, emphasis, active state (Vision --blue) */
  --pp-accent-strong: #1140b8;/* hover/pressed (Vision --blue2) */

  /* The dark surface: hero and footer. Vision paints it as a GRADIENT, not a
     flat fill — a flat #0b1620 is visibly not the same hero. */
  --pp-brand:      #0b1620;
  --pp-panel:      #0b1620;
  --pp-panel-from: #1c2e50;   /* gradient stop 1. WAS INLINE */
  --pp-panel-to:   #0b1620;   /* gradient stop 2. WAS INLINE */
  --pp-panel-grad: radial-gradient(ellipse 120% 80% at 60% -10%,
                     var(--pp-panel-from) 0%, var(--pp-panel-to) 65%);
  --pp-panel-ink:  #eef2f8;   /* text on dark */
  --pp-panel-mute: #8a98ac;   /* de-emphasised text on dark */
  --pp-panel-rule: rgba(255,255,255,.10);
  --pp-panel-border:#48597E;  /* ghost button on dark */

  /* status. Vision uses a DIFFERENT green on dark: #0f7a4d has too little
     contrast against the navy, so the ticker uses #5fd08c. Both are kept. */
  --pp-positive:   #0f7a4d;
  --pp-positive-on-dark: #5fd08c;   /* ticker figures. WAS INLINE */
  --pp-negative:   #b9202e;
  --pp-negative-bg:#F6E9E6;
  --pp-caution:    #b08d57;   /* the FREE & PUBLIC tag (Vision --gold) */
  --pp-caution-bg: #f7f3ec;   /* its ground (Vision --gold-bg) */
  --pp-focus:      #1a46c0;   /* focus ring follows the accent */

  --pp-theme-color:#0b1620;   /* <meta name="theme-color">. Was #243a60, which
                                 came from the APPLICATION, not from here. */
}

/* --------------------------------------------------------------------------
   2b · The values Vision's public pages use INLINE, named (2026-09-14)

   Added because the /a/ pages are now a PORT of those pages rather than a
   reimplementation of a description of them, and a port cannot be faithful
   while the values it needs have no names. Every one below is lifted from the
   CSS string in src/pages/lab/PivotalPathPrototype.jsx, where it appears as a
   literal inside a rule — Vision's `.pp-app` block names only the 14 colours,
   and these are the rest of what its components actually use.

   This file's own rule says: add a token rather than hardcoding a value in one
   system. That is what this is. The alternative was to hardcode a shadow and a
   radius into the /a/ page stylesheet and let the two properties drift on
   exactly the values nobody would think to compare.

   ★ --pp-radius STAYS 0. It is used by the existing pp-* components and is a
   deliberate choice for them; Vision's cards and buttons are rounded and get
   their own names. Two radii that mean different things need two tokens, not
   one token with a changed value.
   -------------------------------------------------------------------------- */
:root {
  /* radii, as Vision sets them per component */
  --pp-radius-card:  4px;     /* .card, .cap */
  --pp-radius-ui:    2px;     /* .btn, .tag */
  --pp-radius-icon:  3px;     /* .capicon plate */

  /* elevation. Vision lifts a card on hover; flat cards on a warm ground read
     as boxes drawn on the page rather than objects sitting on it. */
  --pp-shadow-card:  0 1px 2px rgba(11,22,32,.04), 0 3px 8px rgba(11,22,32,.04);
  --pp-shadow-cap:   0 1px 3px rgba(11,22,32,.05);
  --pp-shadow-lift:  0 4px 16px rgba(11,22,32,.09);

  /* the primary button is a GRADIENT with a coloured shadow, not a flat fill */
  --pp-accent-grad:        linear-gradient(160deg, #2456d8 0%, #1a46c0 100%);
  --pp-accent-grad-hover:  linear-gradient(160deg, #1c4bc4 0%, #1438a8 100%);
  --pp-shadow-accent:        0 1px 3px rgba(26,70,192,.35);
  --pp-shadow-accent-strong: 0 2px 8px rgba(26,70,192,.40);

  /* accent tints: the icon plate, and the row-hover wash */
  --pp-accent-plate: #eef2fb;
  --pp-accent-wash:  #f0f4ff;

  /* on the dark panel Vision uses a LIGHTER accent and a lighter mute than the
     ones used on paper — #8fb0ff and #aab6c6, neither of which is --pp-accent
     or --pp-panel-mute. */
  --pp-accent-on-dark:     #8fb0ff;
  --pp-panel-ink-2:        #aab6c6;
  --pp-panel-btn-ink:      #eaf0ff;
  --pp-panel-rule-strong:  rgba(255,255,255,.28);

  /* the status chip's ground (Vision's .tag) */
  --pp-positive-bg:  #eef6f0;
}

/* --------------------------------------------------------------------------
   3 · Space and measure
   -------------------------------------------------------------------------- */
:root {
  /* ★ 1080px, THE LAB'S MEASURE (2026-09-17). Was 1240px. The corporate
     pages and the Lab's home view are the same design tuned twice - the Lab
     as a component with literal values, this as tokens - and where they
     disagreed the Lab wins, because the Lab is the design that was approved.
     160px narrower, and the estate now shares one measure. */
  --pp-wrap:        1080px;   /* corporate pages */
  --pp-wrap-read:    940px;   /* document pages — index, methodology, answers */
  --pp-gutter:        32px;

  --pp-space-1:  4px;
  --pp-space-2:  8px;
  --pp-space-3:  14px;
  --pp-space-4:  22px;
  --pp-space-5:  34px;
  --pp-space-6:  52px;
  --pp-space-7:  88px;

  --pp-measure:      68ch;    /* body copy */
  --pp-measure-lede: 60ch;
  --pp-measure-head: 22ch;

  --pp-header-h:     72px;
  --pp-border:       1px;
  --pp-border-heavy: 2px;
  --pp-radius:       0;       /* deliberate: nothing is rounded */
}

/* --------------------------------------------------------------------------
   4 · Base

   Applied by both systems. WordPress themes will need these scoped or
   !important-free overrides checked against the active theme.
   -------------------------------------------------------------------------- */
.pp, body.pp {
  font-family: var(--pp-font-body);
  font-size: var(--pp-size-body);
  line-height: var(--pp-lh-body);
  color: var(--pp-ink);
  background: var(--pp-ground);
  -webkit-font-smoothing: antialiased;
}

.pp-wrap      { max-width: var(--pp-wrap);      margin-inline: auto; padding-inline: var(--pp-gutter); }
.pp-wrap-read { max-width: var(--pp-wrap-read); margin-inline: auto; padding-inline: var(--pp-gutter); }

/* Figures. Tabular numerals so columns align and digits are comparable. */
.pp-num { font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }

/* --------------------------------------------------------------------------
   5 · Headings
   -------------------------------------------------------------------------- */
.pp-h-hero, .pp-h-page, .pp-h-section, .pp-h-sub {
  font-family: var(--pp-font-display);
  font-weight: 400;
  letter-spacing: var(--pp-track-display);
  margin: 0 0 var(--pp-space-4);
}
/* The hero tracks tighter than the other display sizes: -0.025em against the
   -0.02em the rest share. Display type needs more negative tracking the larger
   it is set, and the hero is the largest thing on the estate. */
.pp-h-hero    { font-size: var(--pp-size-hero);    line-height: var(--pp-lh-tight); max-width: var(--pp-measure-head); letter-spacing: -0.025em; }
.pp-h-page    { font-size: var(--pp-size-page);    line-height: var(--pp-lh-tight); max-width: var(--pp-measure-head); }
.pp-h-section { font-size: var(--pp-size-section); line-height: var(--pp-lh-head); }
.pp-h-sub     { font-size: var(--pp-size-sub);     line-height: var(--pp-lh-head); }

/* ★ THE EYEBROW IS ITS OWN DIVERGENCE (2026-09-17): 12.5px/600 at .09em here
   against the Lab's 12px/500 at .13em, three properties none of which followed
   from anything else. Taken to the Lab's.

   --pp-size-label (12px) rather than a literal, since that token exists and is
   exactly this size. The tracking is written out: --pp-track-label is .09em
   and is shared with the footer headings, which are 12px/700 and not the same
   control - a token moved to suit one user is how the next reader finds a
   value that means two things. */
.pp-eyebrow {
  font-size: var(--pp-size-label);
  font-weight: 500;
  letter-spacing: 0.13em;
  line-height: 1;
  text-transform: uppercase;
  color: var(--pp-accent);
  margin: 0 0 var(--pp-space-4);
}

.pp-lede {
  font-size: var(--pp-size-lede);
  line-height: var(--pp-lh-lede);
  color: var(--pp-ink-2);
  max-width: var(--pp-measure-lede);
  margin: 0 0 var(--pp-space-6);
}

.pp-body { font-size: var(--pp-size-body); color: var(--pp-ink-2); max-width: var(--pp-measure); margin: 0 0 var(--pp-space-3); }

/* --------------------------------------------------------------------------
   6 · Header and footer

   These must be markup-identical across systems. If the nav changes in one,
   it changes in both — that is the strongest single signal of "same site".
   -------------------------------------------------------------------------- */
.pp-header {
  border-bottom: var(--pp-border) solid var(--pp-rule);
  position: sticky; top: 0; z-index: 20;
  /* ★ THE PAPER GROUND, NOT WHITE (2026-09-14). This was rgba(255,255,255,.95)
     -- a hardcoded literal, and the only white on a page whose ground is
     #faf9f6, which made the header read as a separate object sitting on the
     page rather than part of it. There is no --pp-paper token; the paper ground
     is --pp-ground, and that is what this now uses. The translucency goes with
     it: it existed to let content show through on scroll, and at a 1.5%
     difference from the ground it bought nothing but the mismatch. */
  background: var(--pp-ground);
}
.pp-header-row {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--pp-space-5);
  height: var(--pp-header-h);
  max-width: var(--pp-wrap); margin-inline: auto; padding-inline: var(--pp-gutter);
}
.pp-logo { font-family: var(--pp-font-display); font-size: 26px; letter-spacing: -0.01em; text-decoration: none; color: var(--pp-ink); }
/* The brand mark's two halves differ in COLOUR only -- "Pivotal" ink, "Path"
   accent. The markup comes from pp_chrome (_LOGO); this is the rule that makes
   it visible, and it lives here rather than in a page-local block so BOTH
   properties get it. Without it the span is inert and the mark renders flat. */
.pp-logo .lg-2 { color: var(--pp-accent); font-weight: inherit; }
.pp-nav { display: flex; gap: 30px; font-size: 14.5px; font-weight: 500; }
.pp-nav a { color: var(--pp-ink-2); text-decoration: none; }
.pp-nav a:hover { color: var(--pp-ink); }
.pp-nav a[aria-current="page"] { color: var(--pp-ink); }

.pp-footer { padding: var(--pp-space-6) 0 var(--pp-space-5); font-size: var(--pp-size-small); }
.pp-footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: var(--pp-space-5); padding-bottom: var(--pp-space-5); border-bottom: var(--pp-border) solid var(--pp-rule); }
.pp-footer h4 { font-size: var(--pp-size-label); font-weight: 700; letter-spacing: var(--pp-track-label); text-transform: uppercase; color: var(--pp-ink-3); margin: 0 0 var(--pp-space-3); }
.pp-footer a { display: block; color: var(--pp-ink-2); text-decoration: none; padding: 5px 0; }
.pp-footer a:hover { color: var(--pp-ink); }

/* --------------------------------------------------------------------------
   7 · Actions
   -------------------------------------------------------------------------- */
.pp-cta {
  display: inline-block; white-space: nowrap; cursor: pointer;
  /* ★ A NAV-BAR BUTTON, NOT A STANDALONE CALL TO ACTION (2026-09-17). Was
     14px/600 with 10px 20px padding, rendering 44px tall - the proportions of
     a button that owns its own line. In a header it sat 10px taller than the
     Lab's, which is the same control in the same place. The Lab's values:
     13.5px/500, 9px 15px, 34px rendered. */
  font: inherit; font-size: 13.5px; font-weight: 500;
  /* line-height 1, like the Lab's .btn. Without it the control inherits the
     body's 1.55 and stands 41px rather than 34px - the padding was matched and
     the button was still the wrong height. */
  line-height: 1;
  padding: 9px 15px;
  /* ★ ACCENT, NOT NEAR-BLACK (2026-09-14). The one action in the header should
     read as the accent colour the rest of the site uses for action, and #fff
     was a literal where --pp-surface is the token. */
  border: var(--pp-border) solid var(--pp-accent);
  background: var(--pp-accent); color: var(--pp-surface); text-decoration: none;
  border-radius: var(--pp-radius);
}
.pp-cta:hover { opacity: .85; }
.pp-cta--ghost { background: none; color: var(--pp-accent); }
.pp-cta:focus-visible { outline: 2px solid var(--pp-focus); outline-offset: 2px; }

.pp-link {
  font-weight: 600; text-decoration: none;
  border-bottom: var(--pp-border-heavy) solid var(--pp-accent);
  padding-bottom: 2px; cursor: pointer;
}

/* --------------------------------------------------------------------------
   8 · Data display

   Figures are the product. These are used identically on corporate pages and
   on generated index pages.
   -------------------------------------------------------------------------- */
.pp-figs { display: grid; grid-template-columns: repeat(auto-fit, minmax(165px, 1fr)); }
.pp-fig  { padding-inline: 26px; border-left: var(--pp-border) solid var(--pp-panel-rule); }
.pp-fig:first-child { padding-left: 0; border-left: 0; }
.pp-fig-v { font-size: 33px; font-weight: 600; line-height: var(--pp-lh-tight); letter-spacing: -0.025em; font-variant-numeric: tabular-nums; }
.pp-fig-k { font-size: var(--pp-size-caption); color: var(--pp-panel-mute); margin-top: 7px; line-height: 1.35; }

.pp-panel { background: var(--pp-panel); color: var(--pp-panel-ink); }

.pp-table { width: 100%; border-collapse: collapse; font-size: 14.5px; margin: var(--pp-space-4) 0 var(--pp-space-3); }
.pp-table th, .pp-table td { text-align: right; padding: 10px 8px; border-bottom: var(--pp-border) solid var(--pp-rule-fine); white-space: nowrap; }
.pp-table th:first-child, .pp-table td:first-child { text-align: left; white-space: normal; }
.pp-table th { font-size: 11.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--pp-ink-3); border-bottom: var(--pp-border) solid var(--pp-rule); }
.pp-table caption { caption-side: bottom; text-align: left; font-size: var(--pp-size-caption); color: var(--pp-ink-3); padding-top: 10px; line-height: 1.45; }
.pp-table tr.pp-hl td { background: var(--pp-wash); font-weight: 600; }
.pp-table td.pp-neg { color: var(--pp-negative); }

.pp-note {
  font-size: var(--pp-size-small); color: var(--pp-ink-3);
  border-left: var(--pp-border-heavy) solid var(--pp-rule);
  padding-left: var(--pp-space-3); margin: var(--pp-space-4) 0;
  max-width: 64ch;
}

/* Attribution block closing every generated page. */
.pp-source {
  margin-top: var(--pp-space-6); padding-top: var(--pp-space-4);
  border-top: var(--pp-border) solid var(--pp-rule);
  font-size: 13.5px; color: var(--pp-ink-3); max-width: 70ch;
}


/* --------------------------------------------------------------------------
   8b · Additions requested by the prerenderer
   -------------------------------------------------------------------------- */

/* Table overflow. .pp-table sets nowrap, so a wide reference table must scroll
   within its own container rather than dragging the page sideways on a phone. */
.pp-tablewrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: var(--pp-space-4) 0 var(--pp-space-3); }
.pp-tablewrap > .pp-table { margin: 0; }

/* Display equations. Monospace is justified here: alignment and character
   distinction carry meaning in a formula. */
.pp-eq {
  font-family: ui-monospace, "SFMono-Regular", "IBM Plex Mono", Menlo, monospace;
  font-size: 14px; line-height: 1.7;
  background: var(--pp-wash);
  border-left: var(--pp-border-heavy) solid var(--pp-rule);
  padding: var(--pp-space-3) var(--pp-space-4);
  margin: var(--pp-space-3) 0 var(--pp-space-4);
  overflow-x: auto; white-space: pre;
}
.pp-eq-n { float: right; color: var(--pp-ink-3); font-size: 13px; }

/* Definition lists — Issue/Solution pairs in the methodology. */
.pp-dl { margin: 0 0 var(--pp-space-4); border-left: var(--pp-border-heavy) solid var(--pp-rule); padding-left: var(--pp-space-4); max-width: var(--pp-measure); }
.pp-dl dt { font-weight: 600; font-size: 15.5px; margin-top: var(--pp-space-3); color: var(--pp-ink); }
.pp-dl dt:first-child { margin-top: 0; }
.pp-dl dd { margin: var(--pp-space-1) 0 0; font-size: 15.5px; color: var(--pp-ink-2); }

/* Body lists, outside boxes. */
.pp-list { margin: 0 0 var(--pp-space-3); padding-left: var(--pp-space-4); max-width: var(--pp-measure); }
.pp-list li { font-size: var(--pp-size-body); color: var(--pp-ink-2); margin-bottom: var(--pp-space-2); line-height: var(--pp-lh-body); }
.pp-list li::marker { color: var(--pp-ink-3); }
.pp-list--tight li { margin-bottom: var(--pp-space-1); }

/* Negative figures. Meaning, never decoration. */
.pp-neg { color: var(--pp-negative); }

/* --------------------------------------------------------------------------
   9 · Sections and boxes
   -------------------------------------------------------------------------- */
.pp-section       { padding-block: var(--pp-space-7); }
.pp-section--wash { background: var(--pp-wash); }
.pp-section--tight{ padding-block: var(--pp-space-6); }

.pp-boxes { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--pp-border); background: var(--pp-rule); border: var(--pp-border) solid var(--pp-rule); }
.pp-boxes--2 { grid-template-columns: repeat(2, 1fr); }
.pp-box { background: var(--pp-ground); padding: var(--pp-space-5) 30px 30px; display: flex; flex-direction: column; }
.pp-section--wash .pp-box { background: var(--pp-wash); }
.pp-box ul { margin: 0 0 var(--pp-space-4); padding: 0; list-style: none; flex: 1; }
.pp-box li { font-size: var(--pp-size-ui); color: var(--pp-ink-2); padding: 9px 0; border-top: var(--pp-border) solid var(--pp-rule-fine); line-height: 1.4; }
.pp-box li:first-child { border-top: 0; padding-top: 0; }

/* --------------------------------------------------------------------------
   10 · Responsive
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .pp-boxes, .pp-boxes--2 { grid-template-columns: 1fr; }
  .pp-footer-grid { grid-template-columns: 1fr 1fr; }
  .pp-nav { display: none; }
  .pp-fig { padding-left: 0; border-left: 0; border-top: var(--pp-border) solid var(--pp-panel-rule); padding-top: 17px; margin-top: 17px; }
  .pp-fig:first-child { border-top: 0; margin-top: 0; padding-top: 0; }
}
@media (max-width: 720px) {
  .pp-table { font-size: 13px; }
  .pp-table th, .pp-table td { padding: 8px 5px; }
}

/* --------------------------------------------------------------------------
   11 · Ownership

   Owner: [UNASSIGNED — see O6]

   Served from: <host>/assets/pp-tokens.css  (host: server/scripts/site.json)
                (Vision hosts it: vision/public/assets/pp-tokens.css; Caddy
                rewrites the host-root /assets/pp-tokens.css to the container
                copy under /vision/. See ops/caddy-root-seo.snippet.)
                The WordPress theme links this absolute URL.

   Changing a value here changes both properties. Any change should be checked
   against a corporate page and a generated index page side by side before it
   ships.
   -------------------------------------------------------------------------- */
