/* Home tab — guided-tour landing page (home rebuild PR B).

   Ported from the committed design bundle at
   notes/design/home-page-handoff-2026-06/ (RHomePage in h2-refined.jsx
   with the resolved defaults: navy hero, display-lg 42/56 scale,
   Beyond-the-grades + bottom search band shown). Selector recipes come
   from the bundle's landing.css / h2-variants.css / h2-refined.css /
   forks.css (.fk-band) / paths.css (.pq-row, .pb-flow), adapted to the
   token scale — no hex, no :root here; the two display-scale tokens
   live at the end of styles/tokens.css.

   Dynamic per-instance values arrive as custom properties from
   js/tabs/home.js (`--w` widths, `--h` heights, `--seg-bg` fills,
   `--dot-bg` dots, `--x`/`--y` positions) — the sanctioned
   pass-through pattern; the rules below consume them. */

/* ── Full-bleed chrome (body class set by switchTab / renderHomeTab) ──
   Home is unfiltered: hide the filter toggle + active-filter strip and
   zero the .main-inner gutters so the .fk-band bands run edge to edge.
   Every rule is scoped under body.home-fullbleed — other tabs are
   pixel-identical. */
body.home-fullbleed .filter-toggle { display: none; }
body.home-fullbleed .active-filters-strip { display: none; }
body.home-fullbleed .main-inner {
  padding: 0;
  /* Un-cap the shell's var(--page-max) centered column too — the nav
     bar is full-bleed, so a centered content box left the hero/search
     bands floating ~100px in from the header at wide viewports (live
     review, 2026-06-10). Bands now share the nav's edges; their 56px
     inner padding carries the content inset, as in the mock. */
  max-width: none;
}
#tab-home.tab-content { padding: 0; }

/* Wordmark carries the active state while Home is the live tab (Home
   has no .tab button — the site title is its affordance). Scoped here,
   not in base.css (PR C restyles the site-wide chrome). */
.site-title.on { color: var(--accent); }

/* ── Shared width/height animation hooks ──────────────────────────
   Every data-driven segment is a .lp-w (width: var(--w)) or .lp-h
   (height: var(--h)). A view render starts with .lp-anim-pre on the
   step container; a rAF in home.js removes it so widths/heights
   animate in (the bundle's `width 0.45s cubic-bezier(0.25,1,0.4,1)`). */
#tab-home .lp-w {
  width: var(--w, 0%);
  transition: width var(--t-slow) cubic-bezier(0.25, 1, 0.4, 1);
}
#tab-home .lp-h {
  height: var(--h, 0%);
  transition: height var(--t-slow) cubic-bezier(0.25, 1, 0.4, 1);
}
#tab-home .lp-anim-pre .lp-w { width: 0; }
#tab-home .lp-anim-pre .lp-h { height: 0; }

/* ── Hero band (navy, display-lg paddings) ─────────────────────────
   SHARED WITH THE BOOT STATE: site/index.html paints a static hero
   (the cold-load LCP) reusing .lp-hero / .lp-kicker / .lp-home-h1 at
   <body> scope, before any JS runs. These rules must therefore keep
   working unscoped — do NOT nest them under #tab-home or
   body.home-fullbleed, and don't move them to a stylesheet that the
   boot path doesn't load, or the boot hero renders unstyled. The hero
   COPY is also duplicated into index.html; tests/test_boot_hero_parity.py
   fails if the two drift. */
.lp-hero {
  background: var(--surface-strong);
  padding: 40px 56px 36px;
}
/* Band content shares the shell's var(--page-max) column (the
   .main-inner cap on every other tab) so full-bleed band BACKGROUNDS
   keep running edge to edge while the content inside gains a centred
   buffer at wide viewports (live review round 2: "full bleed graphics,
   but a little bit of buffer"). The H1's own 26ch cap carries the hero
   measure. */
.lp-hero-inner,
.lp-band-grid,
.fk-band > .lp-step {
  max-width: var(--page-max);
  margin-inline: auto;
}
.lp-kicker {
  font-size: var(--text-xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: color-mix(in srgb, var(--surface-strong-ink) 62%, transparent);
}
.lp-home-h1 {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-weight: 600;
  font-size: var(--text-display);
  line-height: 1.12;
  letter-spacing: -0.015em;
  margin: 10px 0 0;
  max-width: 26ch;
  text-wrap: balance;
  color: var(--surface-strong-ink);
}

/* ── Banded rhythm + step scaffold ───────────────────────────────── */
.fk-band { padding: 30px 56px 34px; }
.fk-band--alt { background: var(--paper-2); }
.lp-step {
  display: grid;
  grid-template-columns: 340px minmax(0, 1fr);
  gap: 36px;
}
.lp-step-rail {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  align-items: flex-start;
}
/* Step numerals + kicker take --step-num (the site-wide navy chrome
   token; --step-num: lands in tokens.css with PR C). Until that token
   ships the var() fallback paints them --accent-2 rust — the bundle's
   pre-navy default — so this file works either side of the merge. */
.lp-step-n {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-weight: 700;
  font-size: var(--text-step-num);
  line-height: 1;
  color: var(--step-num, var(--accent-2));
}
.lp-step-title {
  font-size: var(--text-xl);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--ink);
  margin: 0;
  text-wrap: balance;
}
.lp-step-copy {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-size: var(--text-md);
  line-height: 1.55;
  color: var(--ink-2);
  margin: 0;
  text-wrap: pretty;
}
.lp-step-content { min-width: 0; }

/* Header row above each step's chart: optional eyebrow left, segmented
   toggle right. .toggle-group / .toggle-btn come from components.css —
   not redeclared here. */
.lp-row { display: flex; align-items: center; gap: var(--space-3); }
.lp-row .sp { flex: 1; }
.lp-row--head { margin-bottom: 14px; }
.lp-row--lede { margin-bottom: 6px; align-items: flex-start; }
.lp-eyebrow { margin: 0; }
.lp-note-sub {
  font-size: var(--text-sm);
  color: var(--ink-3);
  margin: 3px 0 0;
}

/* Chip-link — uppercase micro-CTA (the bundle's .chip-link; the site
   has no equivalent, so it lives here as .home-chip-link). */
.home-chip-link {
  font-size: var(--text-xs);
  font-weight: 600;
  color: var(--accent);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  text-decoration: none;
  border-bottom: 1px solid var(--accent);
  padding-bottom: 1px;
}
.home-chip-link:hover { color: var(--ink); border-bottom-color: var(--ink); }

/* ── Step 01 · grade-mix rows + shared readout line ──────────────────
   (The 58px Overall strip retired in live review — its panel height
   jumped against the row views; the readout line below survives it
   as the shared hover/focus surface for every mix-row view.) */
.lp-strip-readout {
  margin-top: 10px;
  min-height: 20px;
  font-size: var(--text-sm);
  color: var(--ink-2);
}
.lp-strip-readout .g { font-weight: 600; color: var(--ink); }
.lp-strip-readout .idle { color: var(--ink-3); }

/* Grade-mix rows (phase / region / size / FSM / SEN). */
.lp-mix-head {
  display: grid;
  /* Roomy label column (up to 300px) so the longer toolkit-area names —
     "Personal development & wellbeing" — and their appended grade count
     aren't clipped; the bar keeps a 72px floor so it survives on mobile,
     where the label track shrinks (min 0) and ellipsises instead. */
  grid-template-columns: minmax(0, 300px) minmax(72px, 1fr) 56px;
  gap: var(--space-3);
  padding: 0 4px 6px;
  border-bottom: 1px solid var(--rule);
  margin-bottom: var(--space-1);
}
.lp-mix-head span {
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--track-eyebrow);
  color: var(--ink-3);
  font-weight: 600;
}
.lp-mix-head span:last-child { text-align: right; }
/* Metric toggle reused from the step-03 sort button (.lp-tx-sort), sitting
   in the mix-head's right-aligned third column. justify-content already
   flush-ends its contents; width:100% lets it own the whole grid cell so
   the hit target spans the column. */
.lp-mix-metric { width: 100%; }
.lp-mix-row {
  display: grid;
  grid-template-columns: minmax(0, 300px) minmax(72px, 1fr) 56px;
  gap: var(--space-3);
  align-items: center;
  padding: var(--space-1);
  border-radius: var(--r-sm);
  cursor: default;
}
.lp-mix-row:hover { background: var(--surface-hover); }
.lp-mix-row .lbl {
  font-size: var(--text-base);
  color: var(--ink-2);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lp-mix-row .pct {
  font-size: var(--text-sm);
  font-variant-numeric: tabular-nums;
  color: var(--ink-2);
  text-align: right;
}
/* Step-01 label + grade count. The cell is a flex row so the count
   (flex:none) is never clipped — only the name (.lbl-t) ellipsises when the
   column is tight. */
.lp-mix-row .lbl--count {
  display: flex;
  align-items: baseline;
  gap: 5px;
  overflow: visible;
}
.lp-mix-row .lbl--count .lbl-t {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lp-mix-row .lbl-n {
  flex: none;
  color: var(--ink-3);
  font-size: var(--text-sm);
  font-variant-numeric: tabular-nums;
}
/* The bundle specs a 110px compact label column; at the site's system
   stack "Highest-FSM fifth" ellipsises there, so +22px keeps the
   primary label whole (noted as a deviation in the PR). */
.lp-mix-head--compact,
.lp-mix-row--compact { grid-template-columns: 132px minmax(0, 1fr) 56px; }

/* 100%-stacked mini bar (the bundle's StackedBar). Segments are .lp-w
   spans with --seg-bg fills. The .mix wrapper blockifies the grid cell
   when the bar isn't itself the grid child (step-03 table, latest
   rows) so percentage segment widths resolve against the column. */
.lp-tx-row .mix,
.lp-latest-row .mix { display: block; min-width: 0; }
.lp-bar {
  display: flex;
  border-radius: 3px;
  overflow: hidden;
  background: var(--rule-2);
  min-width: 0;
}
.lp-bar > .lp-w { background: var(--seg-bg, var(--rule)); }
.lp-bar--16 { height: 16px; }
.lp-bar--12 { height: 12px; }
.lp-step-footer { margin: 14px 0 0; }

/* Quiet capability-guard note (step 02 before PR A's quintiles ship). */
.lp-await-note {
  font-size: var(--text-base);
  color: var(--ink-3);
  font-style: italic;
  margin: 0;
}

/* ── Step-01 filter cog — inline with the view toggle (docs/HOME-CUSTOMISE.md)
   The cohort summary + Clear ride the lede (left) of step 01's toggle row;
   the cog itself (chart-customise recipe, from components.css) rides the
   toggle row's trailing slot, just after the toolkit/phase/region toggle,
   so it reads as a configuration option for this chart (operator
   2026-06-25). No separate strip — the toggle row's flex layout positions
   everything. */
.lp-cohort { font-size: var(--text-sm); color: var(--ink-2); }
.lp-cohort strong { color: var(--ink); font-weight: 600; }
.lp-cog-clear {
  border: 0;
  background: transparent;
  color: var(--accent);
  font: inherit;
  font-size: var(--text-sm);
  font-weight: 500;
  cursor: pointer;
  padding: 2px 4px;
}
.lp-cog-clear:hover { text-decoration: underline; }
.lp-cog-clear:focus-visible {
  outline: var(--focus-ring); outline-offset: var(--focus-ring-offset);
  border-radius: 3px;
}

/* ── Safeguarding (Met / Not met) — toolkit-view row only ─────────────
   Binary judgement, so it rides its own 2-segment Met(green)/Not-met(red)
   bar (the .lp-bar / .lp-w pass-through), not the 5-grade mix bar. */
/* Toolkit-view 9th row — divided off the eight evaluation-area rows. */
.lp-mix-row--sg {
  border-top: 1px dashed var(--rule);
  margin-top: 4px;
  padding-top: 8px;
}
.lp-mix-row--sg .lbl-t { color: var(--ink); font-weight: 600; }

/* ── Step 02 · 2-up characteristic panels ────────────────────────── */
.lp-duo {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 28px;
}
.lp-duo .eyebrow { margin-bottom: var(--space-2); }

/* ── Step 03 · trusts / LAs table ─────────────────────────────────── */
/* The table lists every trust / LA clearing the ≥3-inspected floor (no
   top-N cap), so it can run to hundreds of rows — cap the scroll height
   and pin the header so column meanings stay visible while scrolling. */
.lp-tx-scroll {
  max-height: 520px;
  overflow-y: auto;
}
.lp-tx-head {
  position: sticky;
  top: 0;
  z-index: 1;
  /* Opaque fill so scrolling rows don't bleed through the pinned header.
     Must match the background of the band this step sits in: the trusts /
     LA table renders in an alt band (.fk-band--alt = --paper-2), so track
     that, not --paper — otherwise the header reads as a paler band against
     the cream. Keep in step with the band if the table ever moves. */
  background: var(--paper-2);
}
.lp-tx-head,
.lp-tx-row {
  display: grid;
  grid-template-columns: 26px minmax(0, 1fr) 130px 90px minmax(180px, 300px) 56px;
  gap: var(--space-3);
  align-items: center;
}
.lp-tx-head {
  /* Pinned (position:sticky above) — top padding + no bottom margin keeps
     it a solid opaque block so scrolling rows don't show through a gap. */
  padding: 6px 10px;
  border-bottom: 1px solid var(--rule);
}
.lp-tx-head span {
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--track-eyebrow);
  color: var(--ink-3);
  font-weight: 600;
}
/* Sort toggle in the last header cell — styled to read as a header
   label but signals (caret + hover) that the column is clickable.
   font-family: inherit so the <button> picks up the site's system-ui
   stack like the sibling .lp-tx-head <span> cells (and every other
   button on the site) — without it a <button> falls back to the UA
   default form-control font (Arial), which the site uses nowhere and
   which left half the header row in a different typeface. */
.lp-tx-sort {
  font-family: inherit;
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--track-eyebrow);
  color: var(--ink-3);
  font-weight: 600;
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: flex-end;
  gap: 3px;
}
.lp-tx-sort:hover,
.lp-tx-sort[aria-pressed="true"] { color: var(--ink); }
.lp-tx-sort:focus-visible {
  outline: var(--focus-ring);
  outline-offset: var(--focus-ring-offset);
  border-radius: 3px;
  color: var(--ink);
}
/* Sort arrow — muted on an inactive sortable header (a quiet "you can
   sort by this" hint), full-strength accent on the active sort column so
   it's obvious which column is ranking the rows (▾ = the shown share,
   highest first). Operator 2026-06-25: make the arrow clearer. */
.lp-tx-sort .caret {
  font-size: 0.9em;
  line-height: 1;
  opacity: 0.55;
  transition: opacity var(--t-fast), color var(--t-fast);
}
.lp-tx-sort:hover .caret { opacity: 0.75; }
.lp-tx-sort--on .caret { opacity: 1; color: var(--accent); }
/* Numeric column sort headers fill their grid cell so the whole
   (right-aligned) column is a hit target, like .lp-mix-metric. */
.lp-tx-sort--num { width: 100%; }
/* First-column sort header (step 01's "default order" button) — fills its
   label cell and left-aligns, so the label sits flush like a plain header
   span (and like step 03's first column) instead of flush-ending. Declared
   after the base .lp-tx-sort so its justify-content wins. */
.lp-tx-sort--start { width: 100%; justify-content: flex-start; }
/* Active sort column — accent underline (no layout shift, unlike a
   border) on top of the aria-pressed ink colour. */
.lp-tx-sort--on {
  color: var(--ink);
  text-decoration: underline;
  text-decoration-color: var(--accent);
  text-underline-offset: 3px;
}
.lp-tx-row {
  padding: 9px 10px;
  border-radius: 5px;
  text-decoration: none;
}
.lp-tx-row:hover { background: var(--surface-hover); }
.lp-tx-row .rank {
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
  color: var(--ink-3);
}
.lp-tx-row .nm {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-size: var(--text-base);
  color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lp-tx-head .num, .lp-tx-row .num { text-align: right; }
.lp-tx-row .num {
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
  color: var(--ink-2);
}
.lp-tx-more {
  display: flex; align-items: baseline; gap: 10px;
  padding: 8px 10px 0;
  border-top: 1px solid var(--rule-2);
  margin-top: 6px;
}

/* ── Step 04 · trust journeys (master timeline embed) ────────────── */
/* Home cut uses the design's compact 3-item legend; the component's
   full <details> legend is suppressed here rather than edited out of
   charts/timeline.js (other mounts keep it). */
#tab-home .trust-master-timeline-legend-wrap { display: none; }
.lp-tl-legend {
  display: flex;
  gap: 18px;
  align-items: center;
  flex-wrap: wrap;
  margin: 8px 0 4px;
  font-size: var(--text-xs);
  color: var(--ink-3);
}
.lp-tl-legend .sample {
  display: inline-flex;
  gap: 1.5px;
  vertical-align: middle;
  margin-right: 5px;
}
.lp-tl-legend .sample i {
  display: block;
  width: 3px; height: 11px;
  border-radius: 1px;
  background: var(--seg-bg, var(--rule));
}
.lp-tl-legend .join-s {
  display: inline-block;
  width: 4px; height: 13px;
  background: var(--accent);
  border-radius: 1px;
  margin-right: 5px;
  vertical-align: -2px;
}
.lp-tl-legend .warn-s { color: var(--g-urgent); margin-right: 5px; }
/* Grade-colour key — the timeline ticks are grade-coloured but the
   component's full legend is hidden on Home, so spell out the five grades
   (operator 2026-06-25). Swatch fill rides the --seg-bg pass-through. */
.lp-tl-grades { display: inline-flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.lp-tl-grade { display: inline-flex; align-items: center; gap: 4px; }
.lp-tl-grade i {
  display: inline-block; flex: none;
  width: 9px; height: 9px;
  border-radius: 2px;
  background: var(--seg-bg, var(--rule));
}
.lp-journeys-mount { min-height: 120px; }
.lp-loading-note {
  font-size: var(--text-sm);
  color: var(--ink-3);
  font-style: italic;
  margin: 12px 0;
}
.lp-traj-summary {
  font-size: var(--text-sm);
  color: var(--ink-2);
  margin: 12px 0 0;
}
.lp-traj-summary .home-chip-link { margin-left: var(--space-2); }

/* ── Step 05 · reports over time ─────────────────────────────────── */
.lp-got-bars {
  display: flex;
  gap: var(--space-2);
  height: 210px;
  align-items: flex-end;
}
.lp-got-col {
  flex: 1;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  cursor: default;
}
.lp-got-stack {
  display: flex;
  flex-direction: column-reverse;
  border-radius: 2px;
  overflow: hidden;
}
.lp-got-stack > .lp-h {
  display: block;
  background: var(--seg-bg, var(--rule));
  /* Sub-pixel guard — thin months in the Counts view keep every
     non-zero grade segment visible. */
  min-height: 1px;
}
.lp-got-col:hover .lp-got-stack {
  outline: 1px solid var(--ink-3);
  outline-offset: 1px;
}
.lp-got-x {
  display: flex;
  gap: var(--space-2);
  margin-top: var(--space-2);
  font-size: var(--text-10);
  color: var(--ink-3);
}
.lp-got-x span { flex: 1; text-align: center; white-space: nowrap; overflow: hidden; }

/* Completion (cumulative) line view. */
.lp-compl {
  position: relative;
  height: 210px;
}
.lp-compl svg {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  display: block;
  overflow: visible;
}
.lp-compl .ltc-grid-line { stroke: var(--rule); stroke-width: 1; }
.lp-compl .ltc-area { fill: var(--accent); opacity: 0.08; }
.lp-compl .ltc-path {
  fill: none;
  stroke: var(--accent);
  stroke-width: 2.25;
  vector-effect: non-scaling-stroke;
  stroke-linejoin: round;
  stroke-linecap: round;
}
.lp-pos { position: absolute; left: var(--x, 0%); top: var(--y, 0%); }
.lp-compl .ltc-y {
  transform: translateY(-50%);
  font-size: var(--text-10);
  color: var(--ink-3);
  pointer-events: none;
}
.lp-compl .ltc-dot {
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--accent);
  border: 2px solid var(--paper);
  transform: translate(-50%, -50%);
  pointer-events: none;
  box-shadow: 0 0 0 1px var(--rule);
}
.lp-compl .ltc-dot[hidden] { display: none; }
.lp-compl .end-lbl {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-weight: 600;
  font-size: var(--text-xl);
  color: var(--ink);
  transform: translate(-104%, 14%);
  text-align: right;
  white-space: nowrap;
  pointer-events: none;
}
.lp-compl .end-cap {
  display: block;
  font-size: var(--text-10);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--ink-3);
}
.lp-compl-hit {
  position: absolute; inset: 0;
  display: flex;
}
.lp-compl-hit > div { flex: 1; }

/* Coverage-by-phase minis under the completion line. */
.lp-pop-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  margin-top: var(--space-4);
}
.lp-pop .ph {
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--track-eyebrow);
  color: var(--ink-3);
  font-weight: 600;
}
.lp-pop .pc {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-weight: 600;
  font-size: var(--text-md);
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.lp-pop .track {
  height: 8px;
  background: var(--rule-2);
  border-radius: 2px;
  overflow: hidden;
  margin: 7px 0 6px;
}
.lp-pop .track > .lp-w {
  display: block; height: 100%;
  background: var(--accent);
  border-radius: 2px;
}
.lp-pop .nums {
  font-size: var(--text-sm);
  color: var(--ink-2);
  font-variant-numeric: tabular-nums;
}

/* Latest-reports rows. */
.lp-latest-wrap { max-width: 760px; }
.lp-latest-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 170px 160px;
  gap: 14px;
  align-items: center;
  padding: 8px 0;
  border-bottom: 1px solid var(--rule-2);
  text-decoration: none;
}
.lp-latest-row:last-of-type { border-bottom: 0; }
.lp-latest-row:hover { background: var(--surface-hover); }
.lp-latest-row .nm {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-size: var(--text-base);
  color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lp-latest-row .when {
  font-size: var(--text-sm);
  color: var(--ink-3);
  white-space: nowrap;
  text-align: right;
}
.lp-foot-note {
  font-size: var(--text-xs);
  color: var(--ink-3);
  margin: 10px 0 0;
}

/* ── Step 06 · beyond the grades (ranked rows) ───────────────────── */
.pq-row {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr) 110px 88px;
  gap: 10px;
  align-items: center;
  padding: 7px 0;
  border-bottom: 1px solid var(--rule-2);
}
.pq-row:last-of-type { border-bottom: 0; }
.pq-row .rank {
  font-size: var(--text-xs);
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
.pq-row a.nm { color: var(--ink); text-decoration: none; }
.pq-row a.nm:hover { color: var(--accent); text-decoration: underline; }
.pq-row .nm {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-size: var(--text-md);
  color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pq-row .track {
  height: 8px;
  background: var(--rule-2);
  border-radius: 2px;
  overflow: hidden;
}
.pq-row .track > .lp-w {
  display: block; height: 100%;
  background: var(--accent);
}
.pq-row .val {
  font-size: var(--text-sm);
  font-variant-numeric: tabular-nums;
  color: var(--ink-2);
  text-align: right;
  font-weight: 500;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 1px;
}
/* Workforce row · the pupil-teacher ratio under the % leaving (the .val cell
   stacks them; the share leads, the ratio is the quiet second line). */
.lp-wf-sub {
  font-size: var(--text-10);
  font-weight: 400;
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
.pb-flow {
  display: flex;
  height: 12px;
  border-radius: 2px;
  overflow: hidden;
}
.pb-flow > .lp-w { display: block; height: 100%; background: var(--seg-bg, var(--rule)); }
.pb-legend {
  display: flex;
  gap: var(--space-3);
  font-size: var(--text-10);
  color: var(--ink-3);
  flex-wrap: wrap;
  align-self: flex-end;
}
.pb-legend .dot {
  display: inline-block;
  width: 8px; height: 8px;
  border-radius: 50%;
  margin-right: var(--space-1);
  vertical-align: -1px;
  background: var(--dot-bg, var(--rule));
}

/* Lede-row controls stack — the Staff-leavers flow legend (the only board
   with lede-row controls now; Finances / Growth sort in their column
   headers). Right-aligned to mirror the toggle row. */
.lp-s6-controls {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--space-2);
}
.lp-s6-controls .pb-legend { align-self: flex-end; }

/* Leavers / Growth boards scroll the full list (no top-N cap), matching
   step 03's scrollable table. */
.lp-pq-scroll {
  max-height: 480px;
  overflow-y: auto;
}

/* ── Step 06 · Finance + Growth click-to-sort tables ─────────────────
   Both reuse the step-03 .lp-tx-* table (sticky sortable header, scroll,
   row links); only the per-board column grid differs. Step 06 sits in a
   non-alt band (--paper), so its sticky header tracks --paper, not the
   --paper-2 step 03 (an alt band) uses. */
.lp-tx--fin .lp-tx-head,
.lp-tx--grow .lp-tx-head { background: var(--paper); }
.lp-tx--fin .lp-tx-head,
.lp-tx--fin .lp-tx-row {
  grid-template-columns: 26px minmax(0, 1fr) 96px 80px 96px 66px 80px;
}
.lp-tx--grow .lp-tx-head,
.lp-tx--grow .lp-tx-row {
  grid-template-columns: 26px minmax(0, 1fr) 96px 112px 72px 84px;
}
/* Distress cell — the 0–100 score with its decile chip riding alongside,
   right-aligned like the sibling numeric cells. */
.lp-tx-row .num.lp-dist {
  display: inline-flex;
  align-items: center;
  justify-content: flex-end;
  gap: 6px;
}
/* Decile chip — the trust's distress decile (10 = the most-distressed
   tenth). Neutral by default; the worst tenths carry a tint (modifier
   class, tokenised colour-mix — no inline hex). */
.lp-dist .dec {
  font-size: var(--text-10);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  text-align: center;
  min-width: 24px;
  padding: 1px 4px;
  border-radius: var(--r-full);
  background: var(--rule-2);
  color: var(--ink-3);
}
.lp-dist .dec.lp-dec--attention {
  background: color-mix(in srgb, var(--g-attention) 22%, transparent);
  color: var(--ink-2);
}
.lp-dist .dec.lp-dec--urgent {
  background: color-mix(in srgb, var(--g-urgent) 24%, transparent);
  color: var(--ink);
}

/* ── Bottom search band ──────────────────────────────────────────── */
.lp-hero-dark {
  background: var(--surface-strong);
  color: var(--surface-strong-ink);
  padding: 30px 56px 34px;
}
.lp-band-grid {
  display: grid;
  grid-template-columns: 320px minmax(0, 1fr);
  gap: 48px;
  align-items: start;
}
.lp-band-rail .lp-step-title { color: var(--surface-strong-ink); margin-top: 6px; }
.lp-band-rail .lp-step-copy {
  color: color-mix(in srgb, var(--surface-strong-ink) 70%, transparent);
  margin-top: var(--space-2);
}
.lp-band-main { padding-top: 14px; }

.lp-search { display: flex; flex-direction: column; gap: 10px; }
.lp-search-input {
  width: 100%;
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-size: var(--text-lg);
  color: var(--ink);
  background: var(--card);
  border: 1px solid var(--rule);
  border-radius: 7px;
  padding: 15px 18px 15px 52px;
  outline: none;
  /* Inline magnifier (bundle landing.css) — %237c8290 is the
     pre-token --ink-3 grey; a data URI can't resolve var(). */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%237c8290' stroke-width='1.6'%3E%3Ccircle cx='7' cy='7' r='4.5'/%3E%3Cpath d='M10.5 10.5 L13.5 13.5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: 18px center;
  background-size: 20px 20px;
  transition: border-color var(--t-fast), box-shadow var(--t-fast);
}
.lp-search-input::placeholder { color: var(--ink-3); font-style: italic; }
.lp-search-input:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent);
}
.lp-on-dark .lp-search-input { border-color: transparent; }
.lp-search-results {
  display: flex;
  flex-direction: column;
  /* Reserve space for the dropdown so typing fills a region that's
     already there instead of growing the band and pushing the page down
     (the old behaviour forced the user to scroll to see results). Sized
     to ~the max result set: up to 2 group rows + 6 school rows ≈ 8 × 44px.
     The idle (empty) band shows just the input above this reserved gap. */
  min-height: 352px;
}
.lp-search-row {
  display: grid;
  grid-template-columns: 10px minmax(0, 1fr) auto;
  gap: 10px;
  align-items: center;
  padding: 9px 6px;
  border-radius: var(--r-sm);
  text-decoration: none;
}
.lp-on-dark .lp-search-row {
  border-bottom: 1px solid color-mix(in srgb, var(--surface-strong-ink) 14%, transparent);
}
.lp-on-dark .lp-search-row:hover,
.lp-on-dark .lp-search-row.compare-explore-result--active {
  background: color-mix(in srgb, var(--surface-strong-ink) 8%, transparent);
}
.lp-search-row .g {
  width: 10px; height: 10px;
  border-radius: 2px;
  background: var(--dot-bg, var(--rule));
}
.lp-search-row .g--round { border-radius: 50%; }
/* Uninspected school — no grade to colour, so a hollow neutral marker. */
.lp-search-row .g--empty {
  background: transparent;
  border: 1px solid var(--rule);
}
.lp-on-dark .lp-search-row .g--empty {
  border-color: color-mix(in srgb, var(--surface-strong-ink) 30%, transparent);
}
.lp-search-row .nm {
  font-family: "Charter", "Iowan Old Style", "Cambria", Georgia, serif;
  font-size: var(--text-md);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lp-on-dark .lp-search-row .nm { color: var(--surface-strong-ink); }
.lp-search-row .nm .hl {
  background: color-mix(in srgb, var(--accent) 16%, transparent);
  border-radius: 2px;
}
.lp-on-dark .lp-search-row .nm .hl {
  background: color-mix(in srgb, var(--surface-strong-ink) 22%, transparent);
}
.lp-search-row .mt {
  font-size: var(--text-xs);
  white-space: nowrap;
}
.lp-on-dark .lp-search-row .mt {
  color: color-mix(in srgb, var(--surface-strong-ink) 60%, transparent);
}
.lp-search-none {
  font-size: var(--text-sm);
  font-style: italic;
  padding: 10px 4px;
}
.lp-on-dark .lp-search-none {
  color: color-mix(in srgb, var(--surface-strong-ink) 60%, transparent);
}

/* ── Narrow viewports (<1200px) — rail stacks above content, per the
   bundle's @media block; the step-03 table scrolls sideways instead
   of crushing its six columns. The ≤640px phone tier below re-flows
   that table in place rather than scrolling it. ──────────────────── */
@media (max-width: 1199px) {
  .lp-hero, .fk-band, .lp-hero-dark { padding-left: var(--space-6); padding-right: var(--space-6); }
  .lp-step { grid-template-columns: 1fr; gap: 14px; }
  .lp-band-grid { grid-template-columns: 1fr; gap: 18px; }
  .lp-duo { grid-template-columns: 1fr; gap: 18px; }
  .lp-tx-scroll { overflow-x: auto; }
  .lp-tx-scroll .lp-tx-head,
  .lp-tx-scroll .lp-tx-row { min-width: 720px; }
  /* The finance / growth tables carry more columns, so they need a wider
     scroll floor than the step-03 table. */
  .lp-tx--fin .lp-tx-head,
  .lp-tx--fin .lp-tx-row { min-width: 860px; }
  .lp-tx--grow .lp-tx-head,
  .lp-tx--grow .lp-tx-row { min-width: 780px; }
}

/* ── Touch-target floor (tablets / phones) ───────────────────────────
   The home controls (segmented toggles, sort headers, chip-links) sit
   ~12–26px tall by default — fine for a mouse, well under the 44px
   WCAG 2.5.5 / platform-guideline target. Bump them on coarse-pointer
   viewports, scoped to #tab-home so the site-wide toggle recipe is
   untouched. Sized from the same --touch-target-min token the
   cross-tab bumps in base.css use. */
@media (max-width: 1000px) {
  #tab-home .toggle-btn { min-height: var(--touch-target-min); display: inline-flex; align-items: center; }
  #tab-home .home-chip-link { min-height: var(--touch-target-min); display: inline-flex; align-items: center; }
  #tab-home .lp-tx-sort { min-height: var(--touch-target-min); }
}

/* ── Phone tier (≤640px) ─────────────────────────────────────────────
   The single 1199px stacking breakpoint left several steps with
   fixed-px column tracks wider than a phone viewport and a few
   desktop-only affordances (hover readouts, a reserved search gap, a
   sideways-scrolling table). This tier addresses them in place. */
@media (max-width: 640px) {
  /* Hero H1 — 42px is fine at 2 lines today but clamps gracefully for
     longer copy / very narrow screens. Unscoped so the boot hero in
     index.html (which shares .lp-home-h1) scales identically. */
  .lp-home-h1 { font-size: clamp(28px, 8.5vw, var(--text-display)); }

  /* Segmented toggles overflow off-screen on a phone: the group sits
     after the eyebrow in a non-wrapping flex row with `overflow:hidden`
     + `flex-shrink:0`, so trailing options (step 05 "Completion" /
     "Latest", the step-04 trailing pills) get clipped and become
     unreachable. Drop the spacer, let the head row wrap, and give the
     group its own full-width line with buttons sharing the width. */
  .lp-row--head, .lp-row--lede { flex-wrap: wrap; }
  .lp-row--head .sp, .lp-row--lede .sp { display: none; }
  .lp-row--head .toggle-group,
  .lp-row--lede .toggle-group {
    width: 100%;
    flex-wrap: wrap;
  }
  .lp-row--head .toggle-group .toggle-btn,
  .lp-row--lede .toggle-group .toggle-btn {
    flex: 1 0 auto;
    justify-content: center;
  }
  /* Step 01's head row carries the cohort summary + Clear + the filter cog
     on top of the toolkit/phase/region toggle. Keep those config controls
     on the top line (cohort left, cog pushed right) and send the toggle
     group to its own full-width line below — otherwise the cog orphans on a
     line of its own beneath the full-width toggle (optimisation item #7). */
  #home-step1 .lp-row--head .toggle-group { order: 1; }
  #home-step1 .lp-row--head .chart-customise { margin-left: auto; }
  /* Step 06 control stack goes full width, left-aligned under the lede. */
  .lp-s6-controls { width: 100%; align-items: stretch; }

  /* Step 03 table — reflow in place instead of a 720px sideways scroll
     (which truncated names to "Leig…" and pushed the grade-mix + Strong+
     columns off-screen). Keep the header as the column labels; drop the
     two numeric columns (schools inspected / % inspected — both on the
     linked detail page) so name · grade-mix · metric fit, and let names
     wrap fully. */
  /* Scoped to the step-03 table only (:not the finance / growth tables) —
     those carry too many columns to reflow, so they keep the sideways
     scroll below. */
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) { overflow-x: visible; }
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-head,
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-row {
    min-width: 0;
    grid-template-columns: 16px minmax(0, 1fr) minmax(52px, 84px) 44px;
    gap: var(--space-2);
  }
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-head > :nth-child(3),
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-head > :nth-child(4),
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-row > :nth-child(3),
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-row > :nth-child(4) { display: none; }
  /* Hide the "Grade mix" header text (the bars are self-evident) but keep
     its grid cell so the Strong+/Attention− header stays aligned over the
     metric column rather than colliding with it. */
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-head > :nth-child(5) { visibility: hidden; }
  .lp-tx-scroll:not(.lp-tx--fin):not(.lp-tx--grow) .lp-tx-row .nm { white-space: normal; }
  /* Finance / Growth tables keep the sideways scroll on phones. */
  .lp-tx--fin, .lp-tx--grow { overflow-x: auto; }

  /* Step 04 timeline — the SVG is wider than a phone; let the mount
     scroll it horizontally rather than clipping the recent years. */
  .lp-journeys-mount { overflow-x: auto; -webkit-overflow-scrolling: touch; }

  /* Step 05 month axis — tighter gaps as the window grows. Label
     collision past ~a year is handled in JS by thinning to every Nth
     label (step5LabelIndices in tabs/home.js); the thinned spans stay
     in the row to keep the axis 1:1 with the bars. */
  .lp-got-bars, .lp-got-x { gap: var(--space-1); }

  /* Search band — drop the desktop anti-jump reserve so the idle band
     isn't a ~352px empty navy void on a phone. */
  .lp-search-results { min-height: 0; }
}

/* ── Home Step 02 · School profile shapes ────────────────────────────
   Five flip cards (charts/profile-shapes.js) + an Overview/Detail toggle.
   FRONT = the shape: a monochrome var(--accent) glyph (shape reads from
   dot position, not shading) + share, count, name, description. BACK = the
   real grade combinations within that shape, as rows of grade-coloured
   cells (the usual palette) with count + share. Click a card to flip it;
   the toggle flips all. Faces share one grid cell so each card auto-sizes
   to its taller face, and align-items:stretch keeps the row even. */
.pshape-empty { font-size: var(--text-md); color: var(--ink-3); margin: 0; }
.pshape-strip {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: var(--space-3);
  align-items: stretch;
}
@media (max-width: 900px) {
  .pshape-strip { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 560px) {
  .pshape-strip { grid-template-columns: repeat(2, 1fr); }
}
.pshape-card {
  perspective: 1100px;
  cursor: pointer;
  border-radius: 10px;
}
.pshape-card:focus-visible {
  outline: var(--focus-ring);
  outline-offset: var(--focus-ring-offset);
}
/* Both faces occupy the same grid cell → the inner sizes to the taller
   face; the row's align-items:stretch then levels every card together. */
.pshape-card-inner {
  display: grid;
  height: 100%;
  transform-style: preserve-3d;
  transition: transform 0.45s ease;
}
.pshape-card.flipped .pshape-card-inner { transform: rotateY(180deg); }
.pshape-face {
  grid-area: 1 / 1;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  padding: var(--space-3);
  border: 1px solid var(--rule);
  border-radius: 10px;
  background: var(--card);
}
.pshape-card:hover .pshape-face { border-color: var(--accent); }
.pshape-face--back { transform: rotateY(180deg); }
/* Front face */
.pshape-glyph {
  display: flex;
  justify-content: center;
  margin-bottom: var(--space-2);
}
.pshape-svg { display: block; width: 100%; max-width: 168px; height: auto; }
.pshape-n {
  font-size: var(--text-xl);
  font-weight: 700;
  line-height: 1;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.pshape-count {
  margin-top: var(--space-1);
  font-size: var(--text-sm);
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
.pshape-nm {
  margin: var(--space-2) 0 var(--space-1);
  font-size: var(--text-md);
  font-weight: 600;
  color: var(--ink);
}
.pshape-ds {
  font-size: var(--text-sm);
  line-height: 1.4;
  color: var(--ink-3);
}
/* Front-face footer — fills the card's lower whitespace and signals the
   flip ("N grade combinations →"). Pushed to the bottom of the front face. */
.pshape-flip-hint {
  margin-top: auto;
  padding-top: var(--space-2);
  font-size: var(--text-xs);
  font-weight: 600;
  color: var(--accent);
}
.pshape-face--front { display: flex; flex-direction: column; }
/* Back face — the grade combinations within the shape. */
.pshape-back-name {
  font-size: var(--text-md);
  font-weight: 700;
  color: var(--ink);
  margin-bottom: var(--space-2);
}
.pshape-back-rows {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}
/* Card "+N more profiles" footer → hands off to the Full list. */
.pshape-bmore {
  margin-top: var(--space-1);
  padding: var(--space-1) 0;
  border: none;
  background: none;
  text-align: left;
  font-size: var(--text-xs);
  font-weight: 600;
  color: var(--accent);
  cursor: pointer;
}
.pshape-bmore:hover { text-decoration: underline; }
.pshape-bmore:focus-visible {
  outline: var(--focus-ring);
  outline-offset: var(--focus-ring-offset);
}
.pshape-brow {
  display: grid;
  grid-template-columns: 1fr auto auto;
  align-items: center;
  gap: var(--space-2);
}
.pshape-cells { display: flex; flex-wrap: wrap; gap: 2px; }
.pshape-cell {
  width: 11px;
  height: 11px;
  border-radius: 2px;
  background: var(--seg-bg, var(--rule));
}
.pshape-brow-n {
  font-size: var(--text-xs);
  font-weight: 700;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.pshape-brow-pct {
  min-width: 30px;
  text-align: right;
  font-size: var(--text-xs);
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
/* "View schools →" deep-link on a profile row (card back + full list). */
.pshape-goto {
  font-size: var(--text-xs);
  font-weight: 600;
  color: var(--accent);
  text-decoration: none;
  white-space: nowrap;
}
.pshape-goto:hover { text-decoration: underline; }

/* Step-02 "Full list" view — every grade-combination group in one place,
   shape-filterable via the pill row, each row deep-linking to its schools. */
.pshape-list { display: flex; flex-direction: column; gap: var(--space-3); }
.pshape-pills { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.pshape-pill {
  display: inline-flex;
  align-items: baseline;
  gap: var(--space-1);
  padding: var(--space-1) var(--space-2);
  border: 1px solid var(--rule);
  border-radius: var(--r-full);
  background: var(--card);
  color: var(--ink);
  font-size: var(--text-sm);
  cursor: pointer;
}
.pshape-pill:hover { border-color: var(--accent); }
.pshape-pill:focus-visible {
  outline: var(--focus-ring);
  outline-offset: var(--focus-ring-offset);
}
.pshape-pill.on {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--paper);
}
.pshape-pill-n {
  font-size: var(--text-xs);
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
.pshape-pill.on .pshape-pill-n { color: var(--paper); }
.pshape-lcount {
  font-size: var(--text-xs);
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
.pshape-lrows { display: flex; flex-direction: column; }
.pshape-lrow {
  display: grid;
  grid-template-columns: minmax(5.5rem, auto) auto 1fr auto auto auto;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-2) 0;
  border-bottom: 1px solid var(--rule);
}
.pshape-lrow-shape {
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--ink);
}
.pshape-lrow-comp {
  font-size: var(--text-sm);
  color: var(--ink-3);
}
.pshape-lrow-n {
  font-size: var(--text-sm);
  font-weight: 700;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.pshape-lrow-pct {
  min-width: 34px;
  text-align: right;
  font-size: var(--text-sm);
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}
@media (max-width: 640px) {
  /* Drop the composition column on narrow viewports — the coloured cells
     + shape name + counts carry the row; the prose label is the spill. */
  .pshape-lrow { grid-template-columns: minmax(4.5rem, auto) auto auto auto auto; gap: var(--space-2); }
  .pshape-lrow-comp { display: none; }
}

/* Step-02 "Range" view — slope chart, strongest area → weakest. */
.pshape-range { display: flex; flex-direction: column; gap: var(--space-3); }
.pshape-range-svg {
  display: block;
  width: 100%;
  height: auto;
  overflow: visible;
}
.pshape-range-axhead {
  fill: var(--ink-2);
  font-size: var(--text-xs);
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.pshape-range-tick { stroke: var(--rule); stroke-width: 1; }
.pshape-range-swatch { fill: var(--seg-bg, var(--rule)); }
.pshape-range-dot { fill: var(--seg-bg, var(--accent)); }
.pshape-range-glabel {
  fill: var(--ink-3);
  font-size: var(--text-xs);
}
.pshape-band-g:focus-visible { outline: none; }
/* Transparent wide hit area — catches hover/focus anywhere along the path
   so a hair-thin band is still easy to grab. */
.pshape-band-hit {
  fill: none;
  stroke: transparent;
  stroke-width: 22;
  pointer-events: stroke;
}
.pshape-band {
  fill: none;
  stroke: var(--accent);
  stroke-opacity: 0.5;
  stroke-linecap: round;
  pointer-events: none;
  transition: stroke-opacity 0.12s ease;
}
.pshape-band-g:hover .pshape-band,
.pshape-band-g:focus-visible .pshape-band { stroke-opacity: 0.92; }
.pshape-band-g:focus-visible .pshape-band { stroke: var(--accent-2); }
/* Range-pill filter dims the other bands rather than removing them, so
   the whole distribution stays in view for comparison. */
.pshape-band-g--dim .pshape-band { stroke-opacity: 0.12; }
/* Share labels on the major bands — haloed in the band background
   (step 02 renders in an alt band, --paper-2) so a label crossing a
   neighbouring band stays legible. */
.pshape-range-flab {
  fill: var(--ink-2);
  font-size: var(--text-xs);
  font-weight: 600;
  text-anchor: middle;
  paint-order: stroke;
  stroke: var(--paper-2);
  stroke-width: 3px;
}
.pshape-range-note {
  margin: 0;
  font-size: var(--text-sm);
  line-height: 1.4;
  color: var(--ink-3);
}
