/* components.css — Stablecoin Beat Design System v1.0
   Recurring components lifted from design/reference/*.html (homepage,
   article, chart archetypes). Loads after tokens.css + base.css; class
   selectors here win over base.css's bare-element defaults by specificity.
   See DESIGN.md §5 for the component catalogue this file implements. */

/* ── layout shell ─────────────────────────────────────────────── */
.wrap{max-width:var(--max);margin:0 auto;padding:0 32px}
section{padding-top:34px}
/* 2026-08-20: matches .feat-lead/.weekly-card's own top rule so every
   horizontal band on the homepage opens the same way — a section without
   this read as a continuation of whatever's above it instead of its own
   thing (see _hp_analysis.html's comment on "More From Insights"). */
.sechead-band{border-top:2px solid var(--ink);padding-top:16px}
/* align-items:start — CSS Grid stretches items to the tallest column's
   height by default, which left visible dead space under whichever column
   had less content (flagged repeatedly 2026-08-17/18 as misaligned bottoms
   / gaps before this was traced to its actual cause). */
.duo{display:grid;grid-template-columns:1.5fr 1fr;gap:52px;align-items:start}

/* the security thread: page + footer top edge (DESIGN.md §5 "The thread") */
body::before{content:"";display:block;height:2px;background:var(--thread)}

/* ── text utilities ───────────────────────────────────────────── */
.caps{font-weight:700;font-size:10.5px;letter-spacing:.17em;text-transform:uppercase;color:var(--ink-2)}
.caps.blue{color:var(--blue)}
.meta{font-size:12px;color:var(--ink-2)}
.meta b{color:var(--ink);font-weight:600}
.alert{color:var(--alert)}

/* series-code chip (DESIGN.md §5 ".plate") */
.plate{
  display:inline-block;background:var(--blue);color:#fff;
  font-family:var(--disp);font-weight:800;font-size:17px;line-height:1;
  padding:6px 9px 4px;letter-spacing:.04em;vertical-align:middle;
}

/* section header: plate/title left, "all X ->" link right */
.sechead{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:14px}
.sechead .lhs{display:flex;align-items:center;gap:12px}
.sechead h2{font-family:var(--disp);font-weight:800;font-size:21px;letter-spacing:.03em;text-transform:uppercase;margin:0;padding:0;border-top:0}
.sechead a{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--blue);border-bottom:0}
.sechead a:hover{color:var(--blue-dk);text-decoration:underline}

/* ── header / brand lockup / nav (shared across all page types) ── */
header{background:#fff;border-bottom:1px solid var(--line)}
header .wrap{display:flex;align-items:center;justify-content:space-between;gap:20px;padding-top:11px;padding-bottom:11px;flex-wrap:wrap}
/* 2026-08-20: now an <a>, not a <div> (logo links home) — border-bottom:0
   kills base.css's generic bare-<a> underline-on-hover treatment, which
   would otherwise draw a line under the whole logo lockup. */
.brandlock{display:flex;align-items:center;gap:11px;border-bottom:0}
.mark{width:34px;height:34px;background:var(--blue);display:flex;align-items:center;justify-content:center;position:relative;flex:none}
.mark span{font-family:var(--disp);font-weight:900;font-size:18px;color:#fff}
.mark::after{content:"";position:absolute;left:0;right:0;top:50%;height:2px;background:#fff;opacity:.92}
.brandname{font-family:var(--disp);font-weight:800;font-size:20px;letter-spacing:.05em;text-transform:uppercase;line-height:1;border-bottom:0}
/* The descriptor under the wordmark, header and footer alike. Owner copy since
   edce56b — "Statistics and intelligence for the stablecoin economy", which is a
   SENTENCE where the retired "Statistical Office of the Stablecoin Economy" was
   a TITLE, and it is 52 characters against that one's 43.

   `text-transform:none` is the load-bearing line: `.brandname` sets
   uppercase and `small` inherits it, so the new descriptor was rendering as
   52 characters of tracked capitals. At the old 8.5px/.22em that is ~360px of
   micro-caps — wider than the footer brand column's 34ch, so it wrapped there,
   and it widened the header lockup enough to push the nav down early. Tracking
   that heavy is a capitals treatment anyway; on a sentence it reads as
   shouting. Sentence case at .04em is narrower than the old caps line was, so
   the header lockup gets SMALLER, not bigger.

   The words are the owner's and are not mine to touch (edce56b); the treatment
   is the CSS call he left open. Guarded by tests/test_v2_footer.py. */
.brandname small{display:block;font-family:var(--sans);font-weight:500;font-size:11px;letter-spacing:.03em;text-transform:none;color:var(--ink-2);margin-top:5px}
nav{display:flex;gap:20px;flex-wrap:wrap}
nav a{font-size:11.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-2);border-bottom:0}
nav a:hover{color:var(--ink)}
nav a.on{color:var(--blue)}

/* ── footer (shared) ───────────────────────────────────────────
   REGISTER FIXED 2026-09-05 — owner picked variant B (decision sheet A24) after
   "the footer looks like shit". The three candidates were rendered side by side
   at /preview/footer-lab/, which is deleted now that the pick is made; the two
   losing variants are recoverable from commit 55e52f6 if this is reopened.

   THE INK GROUND AND THE THREAD STAY. DESIGN.md §2 names --ink the footer
   background and all four reference archetypes render dark, so B is the option
   that amends no locked spec. What changed is everything the footer had
   invented for itself:

   · #8FA7F0 (heads) and #C6D0EA (links) are GONE. They were the only two colors
     on the site that appeared in tokens.css nowhere and in the rest of this file
     nowhere — the footer was the one surface with a private palette, which is
     the measurable form of "it reads as a different site". Heads take --faint,
     links take --on-blue; both are real tokens. --faint also replaces the four
     places it was spelled as the literal #9AA5BE.
   · That UN-INVERTS the hierarchy. The heads used to be the brightest,
     heaviest, most tracked thing in the block (700 / .18em / periwinkle) while
     the links they labelled were dimmer and lighter — the labels shouted and
     the navigation whispered. The links are now the bright layer.
   · The heads move onto the system's own label spec (DESIGN.md §3 "CAPS
     labels": Sans 700, 10.5–11px, tracking .14–.17em) instead of a private
     10px / .18em, and the links onto its UI-body range (13–14.5px).
   · The brand stack gets ONE rhythm — a flex column with a single gap — instead
     of four ad-hoc inline margin-tops (12 / 8 / 6 / 14px) in the template.
   · The operator and legal lines move OUT of the brand stack into their own bar
     under a hairline, which is the live footer's structure (custom.css §21).

   The dark slab itself came from ONE reference file: sb-option-b-rev3.html is
   the homepage mock, and its column footer got applied to all 385 pages while
   the three page archetypes each carry a one-or-two-line footer. Keeping it is
   the owner's call; the register above is what makes it belong to this site. */
footer{margin-top:48px;background:var(--ink);color:#fff;border-top:2px solid var(--thread)}
footer .wrap{padding-top:30px;padding-bottom:0}
.footer-main{display:flex;justify-content:space-between;gap:44px;flex-wrap:wrap;padding-bottom:26px}
.footer-brand{flex:0 0 300px;display:flex;flex-direction:column;gap:11px}
.footer-brand p{margin:0}
footer .brandname{color:#fff}
footer .brandname small{color:var(--faint)}
footer .meta{color:var(--faint)}
/* The brand lockup and the bar sit OUTSIDE .cols, so outside its link color:
   without an explicit color they fall back to base.css's --blue-dk — dark blue
   on the dark ground, effectively invisible. Same class of cascade miss as the
   archived weekly charts inverting on --paper. */
footer .brandname a{color:inherit;border-bottom:0}
footer .brandname a:hover{color:#fff}
/* Equal columns on a grid, not flex. Under `flex` each column was only as wide
   as its own longest link, so the 48px gap sat between boxes of four different
   widths and the gutters rendered visibly unequal (~90 / ~123 / ~72px in the
   owner's 2026-09-05 screenshot). A grid of four equal tracks makes the gutters
   equal by construction, which is the only thing that reads as a column set.
   The brand column takes a fixed basis so it stops being sized by whatever the
   tagline happens to be — live's own structure (custom.css §21). */
footer .cols{flex:1;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px}
footer .cols>div{display:flex;flex-direction:column;gap:9px}
/* 2026-09-05, second pass — the owner: the sublinks are bigger than the headings
   and "something is just off".

   HE IS DESCRIBING AN OVER-CORRECTION OF MINE. The first pass fixed the block's
   inverted color hierarchy by dimming the heads to --faint and brightening the
   links to --on-blue, but the heads were ALSO the smaller of the two (10.5px
   against 13.5px). Three axes — size, weight and brightness — then all pointed
   the same way, so the group label stopped reading as a label at all and four
   columns collapsed into one flat list of links. The live footer gets away with
   the same 11px-head/14px-link ratio only because there both take the SAME
   color, so capitals alone carry the distinction.

   So the head stops being a micro-label and becomes a real heading in the
   site's own heading language: the display face, uppercase, ABOVE the links it
   labels rather than below them. That is `.sechead h2` (Disp 800 caps 21px) at
   footer scale — nothing invented. Capitals stay because they are what the
   display face does everywhere on this site; it is the SIZE relationship that
   was wrong, and it is now the right way round. The links drop 13.5 -> 13px,
   still inside DESIGN.md §3's 13–14.5px UI-body range. */
footer h5{font-family:var(--disp);font-size:16px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:#fff;margin:0 0 6px}
/* 🚨 text-transform:none and letter-spacing:0 ARE THE FIX, not tidiness.
   The footer columns are a <nav>, so `nav a` — the HEADER nav rule, 30 lines
   up — applied to every one of them: uppercase, .07em tracking, weight 700.
   This rule out-specifies it (0,1,2 vs 0,0,2) only for the properties it
   DECLARES, and it declared neither, so nineteen footer links rendered as
   tracked capitals — "MARKET STRUCTURE", "MONTHLY REPORT" — while nothing in
   the footer block said so. The owner reported "all-caps link columns" twice
   and both times I read it as visual presence rather than the literal fact,
   because I checked base.css and tokens.css for collisions and never asked
   what components.css itself was already doing to a <nav>. Trace the cascade
   from the ELEMENT, not from the new class (feedback_css_workflow). */
footer .cols a{display:block;font-size:13px;font-weight:500;line-height:1.35;letter-spacing:0;text-transform:none;color:var(--on-blue);margin:0;border-bottom:0;transition:color .15s ease}
footer .cols a:hover{color:#fff}
.footer-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--faint);border-top:1px solid var(--line-on-blue);padding:14px 0 22px}
.footer-bar a{color:var(--faint);border-bottom:0;transition:color .15s ease}
.footer-bar a:hover{color:#fff}
.footer-bar .sep{opacity:.55;padding:0 7px}
.footer-social{display:flex;gap:14px;margin-top:2px}
.footer-social a{color:var(--faint);display:inline-flex;align-items:center;border-bottom:0;transition:color .15s ease}
.footer-social a:hover{color:#fff}
/* Four columns plus a brand stack: below ~900px the row cannot hold both, so
   the brand goes above the columns rather than wrapping into them. */
@media(max-width:900px){
  .footer-main{flex-direction:column;gap:30px}
  .footer-brand{flex:none}
  footer .cols{grid-template-columns:repeat(2,minmax(0,1fr));gap:28px}
}
@media(max-width:460px){ footer .cols{grid-template-columns:minmax(0,1fr)} }

/* ── live pulse (DESIGN.md §5 "The pulse") — one per page max ──── */
.pulse{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;font-weight:600;color:var(--ink-2)}
.pulse i{width:7px;height:7px;border-radius:50%;background:var(--thread);animation:beat 2.4s ease-in-out infinite}
@keyframes beat{0%,100%{opacity:1}50%{opacity:.25}}
@media(prefers-reduced-motion:reduce){.pulse i{animation:none}}

/* ── deviation bar: tick vs. blue center line, table scale ──────
   (.devbar = inline/table use, .pm-bar = the peg-strip mobile list) */
.devbar{display:inline-block;height:10px;width:60px;position:relative;vertical-align:baseline;margin-left:8px}
.devbar::before{content:"";position:absolute;left:50%;top:-2px;bottom:-2px;width:2px;background:var(--blue)}
.devbar i{position:absolute;top:3.5px;height:3px;background:var(--ink)}
.devbar i.bad{background:var(--alert)}

/* ── bureau table (DESIGN.md §5) ─────────────────────────────── */
table.bureau{width:100%;border-collapse:collapse}
table.bureau th{
  font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  color:var(--faint);text-align:left;padding:0 12px 7px 0;border-bottom:2px solid var(--ink);
}
table.bureau th.r, table.bureau td.r{text-align:right}
table.bureau td{padding:8px 12px 8px 0;border-bottom:1px solid var(--line);font-size:13px;vertical-align:baseline}
table.bureau td.name{font-weight:600}
table.bureau td.name small{font-weight:400;color:var(--faint);font-size:11.5px;margin-left:6px}
table.bureau td.code{font-family:var(--disp);font-weight:800;font-size:14px;color:var(--blue);width:40px;letter-spacing:.04em}
table.bureau td.val{font-family:var(--disp);font-weight:800;font-size:17px;font-feature-settings:'tnum' 1;white-space:nowrap}
table.bureau td.read{font-size:12px;color:var(--ink-2)}
table.bureau td.spk{width:80px;padding-right:0}
table.bureau tr:hover td{background:var(--blue-tint)}
table.bureau tr.bad td.name, table.bureau tr.bad td.val, table.bureau tr.bad td.read, table.bureau tr.bad td.code{color:var(--alert)}

/* ── signals list ─────────────────────────────────────────────── */
.signals .sig{display:flex;gap:12px;padding:8px 0 7px;border-bottom:1px solid var(--line);align-items:baseline}
.signals .d{font-family:var(--disp);font-weight:700;font-size:12px;color:var(--blue);white-space:nowrap;min-width:50px;letter-spacing:.05em}
.signals .t{font-size:13px;line-height:1.45}
.signals .t:hover{color:var(--blue-dk);cursor:pointer}

/* ── homepage hero band (the brand-blue plate) ───────────────── */
.heroband{background:var(--blue);color:#fff}
/* 2026-08-20: column-gap/row-gap split, not the "gap" shorthand — the
   shorthand set 52px BETWEEN THE ROWS too (the two-column row and the
   herofoot row below it), which combined with herofoot's own
   margin-top:16px into a ~68px dead zone. Fine when content filled more
   space; with fewer stats now it read as broken ("squished to the top"). */
.heroband .wrap{display:grid;grid-template-columns:1.45fr 1fr;column-gap:52px;row-gap:16px;padding-top:26px;padding-bottom:0;align-items:start}
.herofig{
  font-family:var(--disp);font-weight:900;font-size:104px;line-height:.88;
  font-feature-settings:'tnum' 1;color:#fff;
}
.herofig .cur{font-size:40px;font-weight:700;color:var(--on-blue);opacity:.85;vertical-align:40px;margin-right:5px}
.herofig .unit{font-size:36px;font-weight:700;color:var(--on-blue);opacity:.85;margin-left:6px}
.hero-eyebrow{margin-bottom:8px}
.hero-eyebrow .caps{color:#fff;opacity:.85}
.herolede{margin-top:12px;font-size:13.5px;line-height:1.55;color:var(--on-blue);max-width:52ch}
.herolede b{color:#fff;font-weight:700}
/* 2026-08-20: centered, not top-aligned — dropping from 4 stats to 3 (the
   S0/S1/S2 aggregates) made this column noticeably shorter than the hero
   figure + lede beside it, and align-items:start (correct for the earlier
   column-height bugs) left a dead gap of blue below it instead of looking
   intentional. align-self overrides the grid default for this one column. */
.herostats{border-top:2px solid #fff;padding-top:2px;align-self:center}
.hstat{display:flex;justify-content:space-between;align-items:baseline;padding:8px 0 7px;border-bottom:1px solid var(--line-on-blue);gap:14px}
.hstat dt{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--on-blue);opacity:.85}
.hstat dd{font-family:var(--disp);font-weight:800;font-size:20px;color:#fff;font-feature-settings:'tnum' 1;white-space:nowrap}
.herofootnote{margin-top:8px;font-size:11px;line-height:1.4;color:var(--on-blue);opacity:.85}
.herofootnote a{color:var(--on-blue);text-decoration:underline}
.herofootnote a:hover{color:#fff}
.herofoot{grid-column:1 / -1;display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;padding:12px 0 12px;border-top:1px solid var(--line-on-blue);margin-top:16px}
.herofoot .meta{color:var(--on-blue)}
.herofoot .meta b{color:#fff}

/* calibration ruler: SVG tick strip on the hero plate's bottom edge
   (DESIGN.md §5) — homepage + report covers only, not every page */
.ruler{display:block;width:100%;background:var(--blue)}

/* ── peg strip: desktop SVG + designed mobile list (DESIGN.md §6.11) ── */
.pegstrip{background:#fff;border-bottom:1px solid var(--line)}
.pegstrip .wrap{padding-top:22px;padding-bottom:8px}
.peg-mobile{display:none}
.pm-row{display:flex;align-items:center;gap:12px;padding:8px 0;border-bottom:1px solid var(--line)}
.pm-row .c{font-family:var(--disp);font-weight:800;font-size:15px;width:58px;flex:none}
.pm-row .p{font-size:13px;font-feature-settings:'tnum' 1;width:60px;flex:none;text-align:right;color:var(--ink-2)}
.pm-bar{flex:1;height:12px;position:relative}
.pm-bar::before{content:"";position:absolute;left:50%;top:-2px;bottom:-2px;width:2px;background:var(--blue)}
.pm-bar i{position:absolute;top:4.5px;height:3px;background:var(--ink)}
.pm-row.bad .c,.pm-row.bad .p{color:var(--alert)}
.pm-row.bad .pm-bar i{background:var(--alert)}

/* ── analysis / bulletin / monthly-report blue plate block ──────
   (DESIGN.md §5 "Blue plate blocks") ── */
.bulls{display:grid;grid-template-columns:1fr 1fr 1.05fr;gap:40px;align-items:start}
.bulletin h3{font-family:var(--sans);font-size:17px;font-weight:800;line-height:1.28;letter-spacing:-.01em;margin:8px 0 7px}
.bulletin h3 a{border-bottom:0}
.bulletin h3 a:hover{color:var(--blue-dk)}
.bulletin p{font-size:12.5px;color:var(--ink-2);line-height:1.6;margin:0}
.bulletin .byline{margin-top:8px;display:block}
.report{background:var(--blue);color:#fff;padding:22px 24px 24px}
.report .caps{color:#fff;opacity:.85}
.report h3{font-family:var(--disp);font-weight:800;font-size:23px;letter-spacing:.03em;text-transform:uppercase;margin:8px 0 5px;line-height:1.05}
.report .meta{color:var(--on-blue)}
.report p{font-size:12.5px;color:var(--on-blue);line-height:1.6;margin:10px 0 14px}
.report .links{margin-bottom:16px;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.report .links a{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#fff;border-bottom:1px solid var(--line-on-blue)}
.report .links a:hover{border-bottom-color:#fff}
/* 2026-08-20: real button, not another text link next to "Read online" —
   matches .nl-submit's white-fill treatment so the two boxes' CTAs read
   as the same tier of action. */
.report-pdf-btn{
  background:#fff;color:var(--blue-dk)!important;padding:9px 16px;border:0!important;
  display:inline-flex;align-items:center;
}
.report-pdf-btn:hover{background:var(--paper)}

/* 2026-08-20: this ONE .duo pairing (report + newsletter) stretches to
   equal height — both are solid-fill blue plates, not text columns, so a
   matched bottom edge reads as intentional. .report becomes a flex
   column so the extra height (when the newsletter form is taller) goes
   into breathing room, not a stretched gap in the middle: .links pins to
   the bottom via margin-top:auto instead of just trailing off. */
.duo--plates{align-items:stretch}
.duo--plates .report{display:flex;flex-direction:column}
.duo--plates .report .links{margin-top:auto}

/* 2026-08-20: 3 real KPI tiles from the report's own published numbers
   (monthly.kpi_tiles) — fills the box with content instead of leaving
   margin-top:auto do all the work. Compact 3-col row, distinct from
   .hstat (hero, on-blue too, but a stacked list not a grid) so it reads
   as its own thing at this smaller scale. */
.report-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;padding:14px 0;margin-bottom:6px;border-top:1px solid var(--line-on-blue);border-bottom:1px solid var(--line-on-blue)}
.report-kpi-v{font-family:var(--disp);font-weight:800;font-size:19px;color:#fff;font-feature-settings:'tnum' 1;line-height:1.05}
.report-kpi-l{font-size:10.5px;color:var(--on-blue);opacity:.85;margin-top:3px;letter-spacing:.02em}
.subscribe{display:flex;border:1px solid #fff}
.subscribe input{
  flex:1;border:0;border-radius:0;background:var(--blue-dk);padding:10px 11px;min-height:0;
  font-family:var(--sans);font-size:13px;color:#fff;outline:none;min-width:0;
}
.subscribe input::placeholder{color:var(--on-blue);opacity:.7}
.subscribe button{
  border:0;background:#fff;color:var(--blue-dk);font-family:var(--sans);min-height:0;
  font-weight:800;font-size:11px;letter-spacing:.13em;text-transform:uppercase;
  padding:0 16px;cursor:pointer;
}
.subscribe button:hover{background:var(--paper)}

/* ── exhibit chart title row (homepage) ──────────────────────── */
.charttitle{font-size:15.5px;font-weight:800}
.charttitle span{font-weight:400;color:var(--ink-2)}
.titlerow{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:8px;margin:0 0 10px}

/* ── article header (arthead) + byline + pull-stat + artfoot ────
   (design/reference/sb-archetype-article.html) ── */
.arthead{background:#fff;border-bottom:1px solid var(--line)}
.arthead .wrap{max-width:calc(var(--measure) + 64px);padding-top:40px;padding-bottom:32px}
h1.title{
  font-family:var(--disp);font-weight:800;font-size:52px;line-height:.98;
  letter-spacing:.005em;text-transform:uppercase;margin:14px 0 16px;
  display:block;gap:0;
}
.standfirst{font-size:17px;line-height:1.6;color:var(--ink-2);font-weight:400}
.bylinebar{display:flex;justify-content:space-between;align-items:baseline;gap:14px;flex-wrap:wrap;margin-top:22px;padding-top:14px;border-top:2px solid var(--ink)}
.bylinebar .author{font-weight:700;font-size:13px}
.bylinebar .author span{font-weight:400;color:var(--ink-2)}

.body{max-width:calc(var(--measure) + 64px);margin:0 auto;padding:36px 32px 0}

.pullstat{margin:30px 0;padding:18px 0;border-top:2px solid var(--ink);border-bottom:1px solid var(--line);display:flex;align-items:baseline;gap:20px;flex-wrap:wrap}
.pullstat .v{font-family:var(--disp);font-weight:900;font-size:56px;line-height:.9;font-feature-settings:'tnum' 1}
.pullstat .l{font-size:13px;color:var(--ink-2);max-width:32ch;line-height:1.5}

.artfoot{max-width:calc(var(--measure) + 64px);margin:0 auto;padding:8px 32px 0}
.provenance{border-top:2px solid var(--ink);padding:14px 0;display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap}
.related{margin-top:26px}
.related a{display:block;padding:10px 0;border-bottom:1px solid var(--line);font-weight:600;font-size:14px}
.related a span{display:block;font-weight:400;font-size:12px;color:var(--ink-2);margin-top:2px}
.related a:hover{color:var(--blue-dk)}

/* ── chart detail page: series crumbs, pagehead, readings, panel ──
   (design/reference/sb-archetype-chart.html) ── */
/* 2026-08-21 owner feedback round 2: on white the strip read as a second
   masthead row (same font, same ground). Blue-tint ground makes the chrome
   read as three levels — white masthead, tinted section ribbon, paper page.
   Hover flips to white (blue-tint hover would vanish on this ground). */
/* 2026-08-21, final form after four iterations (flush tabs → tinted ribbon →
   unboxed sibling row → THIS), owner-decided: a plain breadcrumb trail.
   Every sibling-strip variant read as chrome competing with the masthead;
   the trail is quiet page furniture, matches the BreadcrumbList schema,
   and its group crumb deep-links to the hub's group anchor so siblings
   stay one click away. Leaf chart pages only; the /charts/ hub carries
   no trail (its body IS the navigation). */
/* §E-E8 (2026-09-09): ONE crumb markup sitewide — <div class="wrap crumbs">.
   The chart pages' nested form (<div class="crumbs"><div class="wrap">) was
   flattened to match the other 25 templates; two markups meant two rules for
   one component, and the 18px top-gap bug (owner, 2026-09-06: "squished up
   towards the top nav") lived in exactly that split. Top padding only —
   .wrap's own side padding stands. */
.crumbs{background:transparent}
.crumbs a{font-size:12px;font-weight:600;color:var(--ink-2);white-space:nowrap;border-bottom:1px solid transparent}
.crumbs a:hover{color:var(--blue-dk);border-bottom-color:var(--blue-tint)}
.crumbs .sep{color:var(--faint);font-size:12px}
.crumbs .here{font-size:12px;font-weight:700;color:var(--ink);white-space:nowrap}
.wrap.crumbs{display:flex;gap:8px;align-items:baseline;overflow-x:auto;padding-top:18px}
/* dateline under the h1 (statistical-publication convention; replaces the
   right-aligned .row meta that floated in dead space next to the intro) */
.pagehead .dateline{margin-top:8px}

.pagehead{padding:28px 0 0}
.pagehead .row{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap}
.pagehead .sub{margin-top:8px;font-size:14px;color:var(--ink-2);max-width:74ch;line-height:1.6}
/* .ch-answer / .ch-page-lead (2026-08-21) — the AEO answer-block + lead
   slots every chart page carries (ui_restyle_plan §3b: citation machinery
   survives every redesign; class names match the live templates so the
   consistency auditor / speakable selectors keep one vocabulary). */
.pagehead .ch-answer{font-size:14px;color:var(--ink);margin-top:14px;max-width:80ch;line-height:1.6}
.pagehead .ch-page-lead{margin-top:10px;font-size:13.5px;color:var(--ink-2);max-width:80ch;line-height:1.65}
.pagehead .ch-page-lead strong{color:var(--ink);font-weight:700}

.readings{display:flex;gap:0;margin-top:20px;border-top:2px solid var(--ink);flex-wrap:wrap}
.readings div{padding:10px 26px 12px 0;margin-right:26px;border-right:1px solid var(--line)}
.readings div:last-child{border-right:0}
.readings dt{font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}
.readings dd{font-family:var(--disp);font-weight:800;font-size:30px;font-feature-settings:'tnum' 1;margin-top:2px}
.readings dd small{font-family:var(--sans);font-size:12px;font-weight:600;color:var(--faint)}
.readings dd.alert{color:var(--alert)}
/* sub-hub KPI band (2026-08-22): the same tiles, but these sub-labels are
   short sentences ("90D r · moderate inverse · range −0.68 to +0.21") rather
   than the hub's "vs 90D". Inline, each tile ran ~250px wide and the
   four-across row collapsed to two; grid + a block sub-label keeps four equal
   columns and gives the sentence its own line. dd.txt is for the one tile
   whose value is a label, not a figure (the news hub's rising topic) — a
   30px tabular-numeral treatment on words looks like a mistake. */
.readings--kpi{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:0}
.readings--kpi div{padding:10px 20px 12px 0;margin-right:20px}
.readings--kpi dd{font-size:26px}
.readings--kpi dd small{display:block;margin-top:4px;line-height:1.4;font-weight:600}
/* dd.txt also belongs on the plain .readings row, not just the --kpi grid: the
   macro pages each carry one label-valued tile (VIX level, real-rate level,
   curve state, Fed regime) and they were rendering the whole value inside
   <small>, so the tile had no 30px part at all and read as a CSS fault next to
   the figures beside it (2026-08-30). Grouped rather than widened so the --kpi
   half keeps its own specificity and those pages are untouched. */
.readings dd.txt,.readings--kpi dd.txt{font-size:19px;line-height:1.15}
/* Tiles in one row mix 26px figures with 19px .txt words, so their sub-labels
   started at different heights and the row read as misaligned. Column-flex the
   tile and push the sub to the bottom: value lines top-align, sub-labels
   bottom-align, whatever the value's size or wrap (2026-08-22). */
.readings--kpi div{display:flex;flex-direction:column}
.readings--kpi dd{display:flex;flex-direction:column;flex:1}
.readings--kpi dd small{margin-top:auto;padding-top:4px}

.chartpanel{background:#fff;border:1px solid var(--line);margin-top:24px;padding:18px 20px 14px}
/* was an inline style repeated on every chartpanel h2 (2026-08-21 sweep —
   the restyle's own rule is to REMOVE inline styles, not add them) */
.chartpanel h2{font-family:var(--disp);font-weight:800;font-size:19px;letter-spacing:.03em;text-transform:uppercase;margin-bottom:10px;padding-top:0;border-top:0}
.controls{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:14px}
/* Peg page (2026-08-21): the date-range toggle sits BETWEEN chartpanels and
   scopes the charts BELOW it. Default spacing left it hugging the panel
   above (0 above vs ~38px below) — proximity read as "belongs to the
   ranking chart", the exact confusion the 2026-08-20 reorder was meant to
   fix. Sibling-scoped so .controls used in any other position keeps the
   default spacing. flex-start puts the scope label right next to the
   buttons instead of stranded at the far edge. */
.chartpanel + .controls{margin-top:32px;justify-content:flex-start}
/* 2026-08-23: .controls only ever had a top margin when it FOLLOWED a chart
   panel, so as the first element after the KPI band it sat flush against it —
   the toggle read as part of the readings row. Affected every page with a range
   toggle (velocity, concentration, dominance, market-cap); surfaced on velocity
   because five readings make the band wide enough to collide visibly. 24px
   against the band's own 12px bottom padding lands close to the 32px used after
   a panel. */
.wrap > .controls:first-child{margin-top:24px}
.controls + .chartpanel{margin-top:10px}

/* ── charts hub (2026-08-21, from design/reference/sb-hub-charts.html) ──
   Index cards on white plates in three taxonomy groups, then the four
   sub-hubs as blue plates. Depth from rules and plates only (DESIGN.md §2):
   no shadows, no radius. */
.group{margin-top:38px}
/* the margin:0 / border-top:0 / padding-top:0 resets below matter: base.css
   bare h2 carries margin:40px 0 14px + border-top:2px solid var(--ink) —
   inside the blue .hub plates that ink border rendered as a stray BLACK rule
   (owner-spotted 2026-08-21), and the margins fight the flex gap layouts. */
.group>h2{font-family:var(--disp);font-weight:800;font-size:21px;letter-spacing:.03em;text-transform:uppercase;margin:0;padding-top:14px;border-top:2px solid var(--ink)}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:18px;margin-top:16px}
.card{background:var(--panel);border:1px solid var(--line);padding:16px 18px 14px;display:flex;flex-direction:column;gap:8px}
.card .kind{font-size:10px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}
.card h3{font-family:var(--disp);font-weight:800;font-size:17px;letter-spacing:.03em;text-transform:uppercase;line-height:1.1;margin:0}
.card h3 a{color:var(--ink);border-bottom:0}
.card h3 a:hover{color:var(--blue)}
.card p{font-size:12.5px;line-height:1.55;color:var(--ink-2);flex:1;max-width:none;margin-bottom:0}
.card .val{display:flex;align-items:baseline;gap:10px;border-top:1px solid var(--line);padding-top:8px}
.card .val b{font-family:var(--disp);font-weight:800;font-size:24px;font-feature-settings:'tnum' 1;color:var(--ink)}
.card .val span{font-size:11px;font-weight:600;color:var(--faint)}
.card .go{font-size:12px;font-weight:700;border-bottom:0}
.card .go:hover{border-bottom:1px solid var(--thread)}
.hubs{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:18px;margin-top:44px}
.hub{background:var(--blue);color:#fff;padding:18px 20px 16px;display:flex;flex-direction:column;gap:10px}
.hub h2{font-family:var(--disp);font-weight:800;font-size:20px;letter-spacing:.03em;text-transform:uppercase;line-height:1.05;margin:0;padding-top:0;border-top:0}
.hub h2 a{color:#fff;border-bottom:0}
.hub h2 a:hover{color:var(--on-blue)}
.hub .count{font-size:10px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--on-blue)}
.hub ul{list-style:none;border-top:1px solid var(--line-on-blue);padding-top:10px;display:flex;flex-wrap:wrap;gap:6px 14px;margin:0}
.hub li{margin:0}
.hub li a{font-size:12px;font-weight:600;color:var(--on-blue);border-bottom:1px solid var(--line-on-blue)}
.hub li a:hover{color:#fff;border-bottom-color:#fff}
.builtfor{margin-top:44px;border-top:2px solid var(--ink);padding-top:14px}
.builtfor>h2{font-family:var(--disp);font-weight:800;font-size:21px;letter-spacing:.03em;text-transform:uppercase;margin:0;padding-top:0;border-top:0}
.audiences{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:24px;margin-top:14px}
.aud{border-top:2px solid var(--line);padding-top:12px}
.aud .lbl{font-family:var(--disp);font-weight:800;font-size:12.5px;letter-spacing:.03em;text-transform:uppercase;color:var(--blue)}
.aud p{font-size:12.5px;line-height:1.6;color:var(--ink-2);margin-top:8px;max-width:none;margin-bottom:0}
.ranges{display:flex;border:1px solid var(--ink)}
.ranges button{
  border:0;background:#fff;font-family:var(--sans);font-weight:700;font-size:11px;
  letter-spacing:.08em;padding:7px 13px;min-height:0;cursor:pointer;color:var(--ink-2);
  border-right:1px solid var(--line);
}
.ranges button:last-child{border-right:0}
.ranges button:hover{background:var(--blue-tint);color:var(--ink)}
.ranges button.on{background:var(--blue);color:#fff}
/* 2026-08-23, adoption S-curve explorer: a 12-item coin picker. .ranges is a
   segmented control with ONE outer border and no wrap, so twelve buttons
   overflow the panel on anything narrow. Same visual language, wrapping, with
   the border on each button instead of around the set. */
.pills{display:flex;flex-wrap:wrap;gap:6px}
.pills button{
  background:#fff;font-family:var(--sans);font-weight:700;font-size:11px;
  letter-spacing:.08em;padding:6px 10px;min-height:0;cursor:pointer;
  color:var(--ink-2);border:1px solid var(--line);
}
.pills button:hover{background:var(--blue-tint);color:var(--ink);border-color:var(--blue)}
.pills button.on{background:var(--blue);border-color:var(--blue);color:#fff}
/* Display formula on its own line (adoption lead). Not a heading and not code:
   it is the sentence's own object, so it keeps the prose face and gains room. */
.ch-formula{margin:14px 0;font-size:16px;letter-spacing:.01em}
/* table.bureau already pairs a display-weight code with a faint name; the plain
   <table> the chart pages use did not, so a <small> beside a ticker sat at the
   browser default. */
table td.name small{font-weight:400;color:var(--faint);font-size:11.5px;margin-left:6px}
/* Segment swatch (2026-08-23, clustering). Tone only, and square: the SHAPE
   half of the encoding lives in the scatter's own legend (pointStyle), where up
   to five segments need separating and the palette has four inks. A swatch that
   carried shape too would have to invent a radius DESIGN.md §2 does not have. */
.cmark{display:inline-block;width:9px;height:9px;margin-right:7px;background:var(--ink-2)}
.cmark--blue{background:var(--blue)}
.cmark--ink{background:var(--ink)}
.cmark--ink2{background:var(--ink-2)}
.cmark--faint{background:var(--faint)}
.chartfoot{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.chartfoot a{color:var(--blue-dk);font-weight:700;border-bottom:0}

.interp h2{font-family:var(--disp);font-weight:800;font-size:21px;letter-spacing:.03em;text-transform:uppercase;margin-bottom:12px;padding-top:14px;border-top:2px solid var(--ink)}
.interp p{font-size:14.5px;line-height:1.7;color:var(--ink);margin-bottom:16px;max-width:66ch}
.interp p b{font-weight:700}
.interp a{color:var(--blue-dk);font-weight:600}
.interp + .interp{margin-top:34px}
/* sub-hub pages (2026-08-22) stack .interp prose blocks directly after a
   .group card section, which carries no bottom margin of its own — without
   this the next block's 2px ink rule lands right on top of the cards. */
.group + .interp{margin-top:34px}

/* ── footnote refs + "Sources & Citations" lists (2026-08-22, sub-hub pages)
   Class names deliberately match the live templates' .ch-cite / .ch-footnotes
   (same reasoning as .ch-answer / .ch-page-lead above: one vocabulary across
   both systems, so the consistency auditor and any citation tooling keep
   working after cutover). Values are v2 tokens, not custom.css's. ── */
/* 2026-08-22: was `vertical-align:super`, which GROWS the line box — inside a
   12px .readings small it pushed that one tile's sub-label a few pixels below
   its neighbours' (owner: "something funny in the vertical alignment").
   relative+top lifts the marker without touching line height. */
.ch-cite{font-size:.68em;vertical-align:baseline;position:relative;top:-.35em;line-height:0;margin-left:1px;font-weight:700}
.ch-cite a{color:var(--blue);border-bottom:0}
.ch-cite a:hover{border-bottom:1px solid var(--thread)}
.ch-footnotes{font-size:12.5px;line-height:1.65;color:var(--ink-2);padding-left:20px;margin:0}
.ch-footnotes li{margin-bottom:8px}
.ch-footnotes li:target{background:var(--blue-tint)}
.ch-footnotes a{word-break:break-word}

/* "Cite as" line (2026-08-23, aggregates page) — live styles this as
   .ch-citeas in custom.css, which v2 does not load. Same role: a quiet
   attribution footer, set off from the last content block. */
.citeas{margin-top:30px;padding-top:12px;border-top:1px solid var(--line);max-width:96ch}

/* a table row whose value is deliberately NOT in the total above it
   (2026-08-23, aggregates: an admitted wrapper whose base sits outside S0
   coverage this vintage). --faint on the row, same signal the concentration
   page's muted bars use for provisional entries. Kept to a row class so the
   footnote marker in the first cell stays at link colour and remains
   findable. */
tr.rowmuted td{color:var(--faint)}
tr.rowmuted td b{color:var(--faint);font-weight:600}

/* canvas needs an explicit-height container or it collapses to 0 (2026-08-18,
   chart archetype build — caught by actually rendering, not by reading the CSS) */
.ch-wrap--tall{position:relative;height:320px;margin-top:4px}
.ch-wrap--tall canvas{width:100% !important;height:100% !important}
@media(max-width:680px){.ch-wrap--tall{height:260px}}
/* --short: the paired half-width panels (2026-08-22, market-cap page) — 320px
   in a 2-up grid makes each chart taller than it is wide. */
.ch-wrap--short{position:relative;height:230px;margin-top:4px}
.ch-wrap--short canvas{width:100% !important;height:100% !important}
@media(max-width:680px){.ch-wrap--short{height:210px}}

/* two-up chart grid (2026-08-22) — the v2 equivalent of live's .ch-grid, for
   pages that pair related charts (market-cap runs nine). Panels carry their
   own top margin in flow; inside the grid the gap owns the spacing. */
.chartgrid{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:16px}
.chartgrid > .chartpanel{margin-top:0}
.chartpanel h3{font-family:var(--disp);font-weight:800;font-size:16px;letter-spacing:.03em;text-transform:uppercase;margin:0 0 6px}
.chartpanel > .meta{display:block;max-width:80ch;line-height:1.5}
@media(max-width:900px){.chartgrid{grid-template-columns:1fr}}

/* interpretation tiers (2026-08-18, chart archetype) — the real page uses
   green/amber/red; DESIGN.md has neither ("There is no green" — §2), so
   this maps to the actual locked semantics instead: blue = good/reference
   (§1: "blue means the institution and the peg"), alert/wine = broken peg
   ONLY (the bottom, genuinely-bad tier), plain ink for the quiet middle
   tier rather than inventing an amber. */
.interp-tiers{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;margin-top:14px}
.interp-tier{border-top:2px solid var(--line);padding-top:12px}
.interp-tier.good{border-top-color:var(--blue)}
.interp-tier.bad{border-top-color:var(--alert)}
.interp-tier .lbl{font-family:var(--disp);font-weight:800;font-size:12.5px;letter-spacing:.03em;text-transform:uppercase;margin-bottom:8px;color:var(--ink)}
.interp-tier.good .lbl{color:var(--blue)}
.interp-tier.bad .lbl{color:var(--alert)}
.interp-tier p{font-size:12.5px;line-height:1.6;color:var(--ink-2);max-width:none;margin-bottom:0}
/* .strong = the most-concentrated / most-severe tier where the wine --alert
   would be WRONG: DESIGN.md §2 reserves wine for broken pegs, and "highly
   concentrated" is not a broken peg. Ink is the strongest neutral, so the three
   tiers still rank (blue → line → ink) without borrowing the alert semantics.
   Added 2026-08-22 with /charts/concentration/. */
.interp-tier.strong{border-top-color:var(--ink)}
.interp-tier.strong .lbl{color:var(--ink)}
@media(max-width:820px){.interp-tiers{grid-template-columns:1fr;gap:16px}}
/* 4-tier variant (2026-08-23, cross-chain entropy guide): four bands in a
   3-column grid leaves one orphan on a second row. Collapses to 2-up before
   1-up so the labels never crush. */
.interp-tiers--4{grid-template-columns:repeat(4,1fr);gap:20px}
@media(max-width:1000px){.interp-tiers--4{grid-template-columns:repeat(2,1fr)}}
@media(max-width:640px){.interp-tiers--4{grid-template-columns:1fr}}
/* 5-tier variant (2026-08-23, clustering segment names): the pipeline can assign
   five labels, so the guide describes five. Five equal columns crush the labels,
   which are two-word names on one line; 3-up leaves a pair on the second row,
   which reads as a deliberate group rather than an orphan. */
.interp-tiers--5{grid-template-columns:repeat(3,1fr);gap:20px}
@media(max-width:1000px){.interp-tiers--5{grid-template-columns:repeat(2,1fr)}}
@media(max-width:640px){.interp-tiers--5{grid-template-columns:1fr}}

/* share bar for ranked tables (2026-08-23, cross-chain top-10). Live built
   this in JS with an inline border-radius; DESIGN.md §2 has no radius. Track
   is the hairline, fill is blue, both square. */
.sharebar{display:block;width:100%;min-width:60px;height:8px;background:var(--line)}
.sharebar i{display:block;height:100%;background:var(--blue);min-width:2px}

/* callout: the one highlighted prose block on a chart page (concentration's
   compliance/settlement note). Blue-tint ground + a blue rule, no shadow, no
   radius — the same plate grammar as everything else. */
.callout{background:var(--blue-tint);border-left:3px solid var(--blue);padding:16px 20px;margin:22px 0}
.callout p{font-size:13.5px;line-height:1.65;color:var(--ink);margin:0;max-width:88ch}
.callout p b{font-weight:700}

/* details.acc: the compact accordion variant used for chart-page
   interpretation panels (methodology/revisions/coverage) — a tighter
   sibling of the bare `details` contract in base.css */
details.acc{border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin:22px 0}
details.acc + details.acc{margin-top:-23px;border-top:0}
details.acc summary{list-style:none;cursor:pointer;padding:12px 0;display:flex;justify-content:space-between;align-items:center;font-weight:700;font-size:13.5px}
details.acc summary::-webkit-details-marker{display:none}
details.acc summary::after{content:"+";font-family:var(--disp);font-weight:800;font-size:20px;color:var(--blue);line-height:1}
details.acc[open] summary::after{content:"\2212"}
details.acc summary:hover{color:var(--blue-dk)}
details.acc p{font-size:13px;line-height:1.65;color:var(--ink-2);margin-bottom:14px}
details.acc code{font-family:ui-monospace,monospace;font-size:.9em;background:var(--blue-tint);padding:1px 5px}

/* data access: the blue plate block (DESIGN.md §5) */
.access{background:var(--blue);color:#fff;padding:22px 24px 24px;align-self:start}
.access .caps{color:#fff;opacity:.85}
.access h3{font-family:var(--disp);font-weight:800;font-size:22px;letter-spacing:.03em;text-transform:uppercase;margin:8px 0 10px;line-height:1.05}
.access p{font-size:12.5px;color:#E7EBFB;line-height:1.6;margin-bottom:14px}
.access .row{display:flex;justify-content:space-between;align-items:baseline;padding:9px 0;border-top:1px solid rgba(255,255,255,.28);gap:12px}
.access .row .k{font-size:12px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:#E7EBFB;opacity:.9}
.access .row a{font-weight:700;font-size:12.5px;color:#fff;border-bottom:1px solid rgba(255,255,255,.4)}
.access .row a:hover{border-bottom-color:var(--thread)}
.access .note{margin-top:12px;font-size:11.5px;color:#E7EBFB;opacity:.85;line-height:1.55}

.relgrid{margin-top:40px}
.relgrid h2{font-family:var(--disp);font-weight:800;font-size:21px;letter-spacing:.03em;text-transform:uppercase;margin-bottom:0;padding-bottom:10px;border-bottom:2px solid var(--ink);padding-top:0;border-top:0}
.relrow{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:11px 0;border-bottom:1px solid var(--line)}
.relrow:hover{background:var(--blue-tint);cursor:pointer}
.relrow .code{font-family:var(--disp);font-weight:800;font-size:15px;color:var(--blue);width:40px;flex:none}
.relrow .n{font-weight:600;font-size:13.5px;flex:1}
.relrow .v{font-family:var(--disp);font-weight:800;font-size:17px;font-feature-settings:'tnum' 1;white-space:nowrap}
.relrow .spark{width:84px;flex:none}

/* ── responsive (union of all three archetypes' breakpoints) ───── */
@media(max-width:1020px){
  .heroband .wrap{grid-template-columns:1fr;gap:18px}
  .herofig{font-size:84px}
  .herofig .cur{font-size:32px;vertical-align:30px}
  .herofig .unit{font-size:28px}
  .duo{grid-template-columns:1fr;gap:30px}
  .bulls{grid-template-columns:1fr}
}
@media(max-width:680px){
  .wrap{padding:0 18px}
  .brandname{font-size:17px}
  /* The tagline (~330px at 11px) is wider than the space beside the
     hamburger on phones and wrapped the whole header row under the logo
     (owner, 2026-09-06). Hidden on mobile — it stays on desktop and in the
     footer. The FOOTER's copy is untouched: this selector is header-scoped
     because footer .brandname small has its own color rules below. */
  header .brandname small{display:none}
  .herofig{font-size:62px}
  .herofig .cur{font-size:24px;vertical-align:22px}
  .herofig .unit{font-size:22px}
  .hide-m{display:none}
  nav{gap:12px}
  .peg-desktop{display:none}
  .peg-mobile{display:block}
  h1.title{font-size:34px}
  .body{padding:28px 18px 0}
  .arthead .wrap{padding-top:28px}
  .pullstat .v{font-size:42px}
  .readings div{padding-right:16px;margin-right:16px}
  .readings dd{font-size:24px}
}

/* ── scope paragraph (2026-08-18) — the page's real crawlable <h1>,
   deliberately quiet: the hero band already carries the page's visual
   weight, this block's job is SEO substantiation, not a second headline. ── */
.scope{padding-top:22px}
.scope h1{
  font-family:var(--sans);font-weight:700;font-size:12.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-2);margin-bottom:10px;
}
.scope p{font-size:13.5px;line-height:1.75;color:var(--ink-2);max-width:96ch}
.scope p strong{color:var(--ink);font-weight:700}

/* ── featured article, no image — real weight via type scale (matches
   the article archetype's h1.title treatment), not a photo (2026-08-18,
   replacing the equal-weight-with-older-articles version from 08-17) ── */
/* 2026-08-20: matching top rule with .weekly-card (below) — the pairing
   read as two unrelated components when only one side had a divider
   line; both now open the same way so they read as one "this week, two
   ways" unit, not a headline mismatched against a stray sidebar box. */
.feat-lead{border-top:2px solid var(--ink);padding-top:16px}
.feat-lead h2.feat-title{
  font-family:var(--disp);font-weight:800;font-size:40px;line-height:1.02;
  letter-spacing:.005em;text-transform:uppercase;margin:10px 0 14px;padding:0;border:0;
}
.feat-lead p{font-size:15px;line-height:1.72;color:var(--ink-2);max-width:60ch;margin-bottom:14px}

/* ── weekly recap, paired beside the featured article (2026-08-18) — a
   real companion card, not a thin easy-to-miss strip ── */
.weekly-card{border-top:2px solid var(--ink);padding-top:16px}
/* 2026-08-20: was a bare <h3> — base.css's h3 rule is deliberately the ONE
   heading level that does NOT switch to the display face (documented
   there: "lifted from .body h3 ... note it does NOT switch to the display
   face" — correct for a subsection heading buried in article prose, wrong
   here). Next to .feat-title's 40px uppercase display headline, the
   unstyled body h3 read as an unrelated, weaker component, not a peer
   companion card (the "looks terrible" report). Now shares feat-title's
   font family/weight for family consistency, sized down to keep the
   featured piece primary; case left as sentence-case (not uppercase like
   feat-title) since weekly headlines are full generated sentences, not
   short punchy phrases — forcing those into caps read worse, not better. */
.weekly-card h3{font-family:var(--disp);font-weight:800;font-size:20px;line-height:1.18;letter-spacing:.005em;margin:10px 0 8px}
.weekly-card p{font-size:12.5px;color:var(--ink-2);line-height:1.6;margin-bottom:10px;max-width:44ch}
/* 2026-08-20: week-over-week delta tiles — bold display face, same
   grammar as .report-kpis (blue plate) but dark-on-paper since this card
   sits on the page background, not a color plate. */
.weekly-kpis{display:flex;gap:22px;padding:10px 0;margin-bottom:10px;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.weekly-kpi-v{font-family:var(--disp);font-weight:800;font-size:19px;color:var(--blue);font-feature-settings:'tnum' 1;line-height:1.05}
.weekly-kpi-l{font-size:10.5px;color:var(--ink-2);margin-top:3px;letter-spacing:.02em}

/* ── discovery list (2026-08-17, no mockup precedent) — ledger rows,
   not the old system's card grid ── */
/* ── "More From Insights" ledger row (2026-08-18) — replaces the .duo
   pairing against the newsletter that produced a huge height mismatch;
   full-width rows immune to that entirely (no adjacent column to
   mismatch against). Same date+content shape as .signals .sig. */
.insight-row{display:flex;gap:20px;padding:12px 0;border-bottom:1px solid var(--line);align-items:baseline}
.insight-row .d{font-family:var(--disp);font-weight:700;font-size:12px;color:var(--ink-2);white-space:nowrap;min-width:64px;letter-spacing:.05em}
.insight-row-title{display:block;font-weight:700;font-size:14px;color:var(--ink);border-bottom:0}
.insight-row-title:hover{color:var(--blue-dk)}
.insight-row-sum{font-size:12.5px;color:var(--ink-2);line-height:1.55;margin-top:4px;max-width:70ch}

.discover-row{display:flex;justify-content:space-between;align-items:baseline;gap:16px;padding:12px 0;border-bottom:1px solid var(--line)}
.discover-row .k{font-family:var(--disp);font-weight:800;font-size:14px;letter-spacing:.03em;text-transform:uppercase;color:var(--ink);width:140px;flex:none}
.discover-row .d{font-size:13px;color:var(--ink-2);flex:1}
.discover-row:hover{background:var(--blue-tint)}
.discover-row:hover .k{color:var(--blue-dk)}

/* ── newsletter box (2026-08-17) — styles the REAL templates/_newsletter.html
   partial's existing classes (.nl-*), not a reimplementation. Sits beside
   .report in a .duo (2026-08-18: was stacked under it, but that pairing
   only worked when BOTH were also paired against unrelated content that
   made the whole row look broken — see docs/ui_decisions_log.md). No
   margin-top: it's a grid child now, not flow-stacked under .report, and
   a leftover top margin here offset it below .report's top edge.

   2026-08-20: background changed from var(--blue) (matched .report) to
   var(--ink) — two identical solid-blue plates side by side were reading
   as one merged mass, not two cards (owner: "I don't like the two boxes,
   same blue"). --ink is already a locked-palette token (tokens.css: "primary
   text, data lines, footer bg" — used elsewhere for exactly this kind of
   dark plate), not a new color. .nl-email/.nl-role keep var(--blue-dk),
   so the form fields still carry the brand blue as an accent against the
   darker card — .report stays the "institutional blue" flagship plate,
   this becomes the quieter utility/conversion action beside it. */
.nl-box{background:var(--ink);color:#fff;padding:20px 22px 22px}
.nl-title{font-family:var(--disp);font-weight:800;font-size:19px;letter-spacing:.03em;text-transform:uppercase;margin-bottom:6px}
.nl-sub{font-size:12.5px;color:var(--on-blue);line-height:1.5;margin:0 0 14px}
.nl-form{display:flex;flex-direction:column;gap:10px}
/* 2026-08-20 (round 2): the round-1 fix wasn't enough — base.css's generic
   field rule (`input:not([type="checkbox"]):not([type="radio"]),textarea,
   select{background:var(--panel);color:var(--ink)}`) has HIGHER CSS
   specificity than a plain class here: two :not([type=...]) clauses each
   count as an attribute selector, so that compound beats .nl-email's
   (0,1,0) even though components.css loads after base.css — specificity
   always wins over source order. Result: .nl-email's background silently
   lost to base.css's light --panel, while .nl-email::placeholder still won
   (pseudo-elements aren't part of that compound) and kept its light
   --on-blue color — light text on a light background, invisible ("you
   forgot to change the color... white on white"). !important on exactly
   the properties that compound rule contests, nothing broader. */
/* 2026-08-20 (round 3): three visually distinct surfaces on this card, no
   blue anywhere — card = --ink (near-black), fields = --paper (light
   neutral, clearly not the card), submit = solid white (brighter than
   --paper, reads as the one filled CTA). !important still needed for the
   reason documented above (base.css's compound field-rule specificity). */
.nl-email,.nl-role{
  width:100%!important;border:1px solid var(--ink)!important;
  background-color:var(--paper)!important;color:var(--ink)!important;
  min-height:44px;padding:10px 12px;font-family:var(--sans);font-size:13px;
}
.nl-email::placeholder{color:var(--ink-2);opacity:.85}
/* appearance:none + explicit chevron — a bare <select> also lets the
   browser's native dropdown chrome override custom color/background
   inconsistently on top of the specificity issue above. Chevron replaces
   the native arrow that appearance:none removes. */
.nl-role{
  color:var(--ink)!important;appearance:none;-webkit-appearance:none;-moz-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%2310182B' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:11px;padding-right:34px;
}
.nl-consent{display:flex;gap:8px;align-items:flex-start;font-size:11.5px;color:var(--on-blue);line-height:1.4}
.nl-consent input[type="checkbox"]{margin-top:2px;accent-color:#fff}
.nl-consent a{color:#fff;border-bottom:1px solid rgba(255,255,255,.4)}
.nl-hp{display:none}
.nl-turnstile{margin:2px 0}
.nl-submit{
  background:#fff;color:var(--ink);font-weight:800;font-size:11px;letter-spacing:.13em;
  text-transform:uppercase;border:0;min-height:44px;padding:0 16px;cursor:pointer;
}
.nl-submit:hover{background:var(--paper)}
.nl-status{font-size:11.5px;color:var(--on-blue);margin:6px 0 0}
.nl-status.ok,.nl-status.err{color:#fff;font-weight:600}

/* ── mobile nav: hamburger + drawer ──────────────────────────────
   Not in DESIGN.md or the approved mockup (neither addressed mobile
   nav) — added 2026-08-17, kept to the same restraint rules as
   everything else: square, no shadow, no gradient. */
.nav-toggle{
  display:none;border:0;background:none;padding:8px;cursor:pointer;
  width:34px;height:34px;flex:none;
}
/* base.css's bare `button:hover{background:var(--blue-dk)}` outranks the
   class rule above (0,1,1 vs 0,1,0) — the documented bare-element-beats-
   component trap. On touch, a tap's :hover STICKS after the menu closes,
   which painted the hamburger blue (owner, 2026-09-06). Same specificity,
   later file: this wins. */
.nav-toggle:hover{background:none}
.nav-toggle span{
  display:block;width:100%;height:2px;background:var(--ink);margin:7px 0;
  transition:transform .15s,opacity .15s;
}
.nav-toggle.open span:nth-child(1){transform:translateY(9px) rotate(45deg)}
.nav-toggle.open span:nth-child(2){opacity:0}
.nav-toggle.open span:nth-child(3){transform:translateY(-9px) rotate(-45deg)}

.mobile-nav{display:none}

@media(max-width:820px){
  .nav-desktop{display:none}
  .nav-toggle{display:block}
  .mobile-nav{
    display:none;flex-direction:column;background:#fff;border-bottom:1px solid var(--line);
  }
  .mobile-nav.open{display:flex}
  .mobile-nav a{
    padding:14px 18px;border-bottom:1px solid var(--line);font-weight:700;font-size:13px;
    letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2);border-bottom-width:1px;
  }
  .mobile-nav a.on{color:var(--blue)}
}

@media(max-width:680px){
  .discover-row{flex-direction:column;gap:2px}
  .discover-row .k{width:auto}
}

/* ── Correlation heatmap (/charts/correlation/) ─────────────────────────────
   A diverging scale, because on this page the SIGN is the measurement: blue for
   positive, wine for negative, per DESIGN.md §2's third sanctioned use of
   --alert. Intensity is bucketed into classes rather than written as a per-cell
   inline style — a data-driven inline style is how the cross-chain share bar
   acquired an inline border-radius that §2 bans, and 100 cells of inline CSS is
   also 100 chances to ship something unreviewable.
   The DIAGONAL is deliberately NOT painted at full intensity: it is 1.00 by
   definition, not a finding, and rendering the one non-measurement on the grid
   as its strongest signal would be a chart lying about its own contents. */
.hm-scroll{overflow-x:auto;margin-top:10px}
table.hm{border-collapse:collapse;font-variant-numeric:tabular-nums;font-size:12px}
table.hm caption{caption-side:bottom;text-align:left;padding-top:8px}
table.hm th{
  font-family:var(--disp);font-weight:800;font-size:11px;letter-spacing:.04em;
  color:var(--faint);text-transform:uppercase;padding:6px 8px;white-space:nowrap;
  border-bottom:1px solid var(--line);text-align:right;
}
table.hm th[scope=row]{text-align:left;border-bottom:none;border-right:1px solid var(--line);color:var(--ink)}
table.hm td{padding:6px 8px;text-align:right;white-space:nowrap;color:var(--ink)}
.hm-z,.hm-na{color:var(--faint)}
.hm-d{background:var(--line);color:var(--faint)}
.hm-p1{background:rgba(33,63,213,.09)}
.hm-p2{background:rgba(33,63,213,.20)}
.hm-p3{background:rgba(33,63,213,.33)}
.hm-p4{background:rgba(33,63,213,.48);color:#fff}
.hm-p5{background:rgba(33,63,213,.70);color:#fff}
.hm-n1{background:rgba(126,43,62,.09)}
.hm-n2{background:rgba(126,43,62,.20)}
.hm-n3{background:rgba(126,43,62,.33)}
.hm-n4{background:rgba(126,43,62,.48);color:#fff}
.hm-n5{background:rgba(126,43,62,.70);color:#fff}
/* Visually hidden, for the empty corner cell's header text. */
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ── /tracker/ (v2, 2026-09-02) ─────────────────────────────────────────
   Option A: full instrument treatment above a stated display line, a compact
   index below it. Two tables, one census.

   TWO CASCADE TRAPS TRACED BEFORE WRITING THIS, both of the shape memory
   warns about (base.css bare-element and :not() selectors silently beating
   components.css classes despite load order):

   1. base.css styles `input:not([type=checkbox]):not([type=radio])` at
      specificity 0,2,1 — higher than a bare `.tk-search`. So the search box
      DELIBERATELY inherits that rule (16px for iOS, 44px min-height, ink
      border, zero radius, all correct here) and this block only sets the two
      properties base.css never touches: flex growth and a max width.
   2. `.readings dd small` sets color:var(--faint) at 0,1,2, which beats the
      shared `.alert` helper at 0,1,0 — so a negative 7-day change in the
      hero would have rendered faint grey instead of wine, the one place on
      the page where the sign carries meaning. Hence the explicit pairing
      below rather than relying on .alert alone. */
.tk-search{flex:1 1 260px;max-width:340px}
.tk-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.readings dd small.alert{color:var(--alert)}

/* Numeric columns are tabular and never wrap: a market cap that breaks across
   two lines destroys the column's scannability, which is the only reason a
   table beats prose here. */
.tk-table{font-feature-settings:'tnum' 1}
.tk-table td.val,.tk-table .tk-chg,.tk-table .tk-share,
.tk-table .tk-drift{white-space:nowrap;font-feature-settings:'tnum' 1}
.tk-table td.code{width:34px;font-size:12.5px;color:var(--faint)}
.tk-table td.val{font-size:15px}
.tk-table td.spk{width:88px}
.tk-table .tk-chg,.tk-table .tk-share{font-weight:600}
/* The index table publishes fewer columns, so its rows can be quieter — the
   figure is no longer the point of the row, the entry is. */
.tk-table--index td.val{font-size:13.5px;font-weight:700}

.tk-peg{font-family:var(--disp);font-weight:800;font-size:12px;letter-spacing:.06em;color:var(--ink-2)}
.tk-yb{color:var(--blue);font-size:10px;margin-left:4px;vertical-align:super}

/* One treatment for every backing type, not six colors. 43% of the universe
   has no published type at all, so a palette of category colors would mostly
   be encoding absence — and DESIGN.md §7 bans the card-badge soup that comes
   with it. The per-type class hook is kept for a future page that needs it;
   only the missing state is styled differently, and it recedes. */
.tk-type{font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--ink-2);white-space:nowrap}
.tk-type.type-other{color:var(--faint)}

.tk-n{display:inline-block;margin-left:5px;font-size:10px;font-weight:700;color:inherit;opacity:.65}
.tk-chips{margin-bottom:22px}
/* The fixed-window sentence sits directly under the toggle it qualifies, the
   same placement /charts/peg-stability/ uses for the same sentence. */
.tk-fixed{margin:0 0 14px;max-width:88ch}
/* The control cluster (search + timeframe + chips) governs the WHOLE page —
   the chips filter both tables and the toggle drives the market table's
   columns — but at the chips' own 22px it sat close enough to section 01's
   head to read as that section's controls. Third time this exact confusion
   has come up in this file: `.chartpanel + .controls` and
   `.wrap > .controls:first-child` above are the same complaint from the other
   direction, a toggle hugging what it does not belong to. Sibling-scoped, and
   margins collapse in normal flow so this is the total gap, landing on the
   same rhythm as .tk-sechead-2's 38px below. */
.tk-chips + .sechead{margin-top:36px}

.tk-note{margin:12px 0 0;padding:12px 0 0;border-top:1px solid var(--line);
  font-size:12px;line-height:1.6;max-width:96ch}
/* Owner copy above each table — a lead, so it takes the measure of running text
   rather than the table's full width, and reads a step up from the .meta
   default it shares a class with. */
.tk-split{margin:0 0 16px;font-size:13px;line-height:1.65;max-width:88ch;color:var(--ink-2)}
.tk-sechead-2{margin-top:38px}
.tk-empty{padding:18px 0}
.tk-more{margin:14px 0 0}
.tk-more button{background:#fff;color:var(--ink-2);border:1px solid var(--ink);
  font-size:11px;letter-spacing:.08em;min-height:0;padding:8px 14px}
.tk-more button:hover{background:var(--blue-tint);color:var(--ink);border-color:var(--blue)}

@media(max-width:680px){
  .tk-search{max-width:none}
  .tk-table td.spk{display:none}
  .tk-table th:nth-child(5){display:none}
}
/* Visible marker for a copy slot awaiting owner/GPT words. Preview-only by
   construction: a cutover page carrying one fails the citable-anatomy test. */
.tk-draft{display:inline-block;margin-left:6px;padding:1px 6px;background:var(--blue-tint);
  color:var(--blue-dk);font-size:10.5px;font-weight:700;letter-spacing:.06em}

/* ── /networks/ (v2, 2026-09-02) ────────────────────────────────────────
   Hub is a ranked table; each chain page leads with its mix. Reuses
   table.bureau and .tk-scroll rather than growing a second table system. */
.nw-table{font-feature-settings:'tnum' 1}
.nw-table td.val{font-size:14px}
.nw-table td.code{width:34px;font-size:12.5px;color:var(--faint)}
.nw-tier{font-size:12px;color:var(--ink-2);white-space:nowrap}
.nw-sym{color:var(--faint);font-size:11px;margin-left:3px}
.nw-evm{display:inline-block;margin-left:6px;padding:1px 4px;border:1px solid var(--line);
  font-size:9.5px;font-weight:700;letter-spacing:.08em;color:var(--ink-2)}
/* Facts table: two columns, label left and value right, no header row — a
   definition list rendered as a table because that is what live used and the
   consistency auditor reads pages through their markup. */
.nw-facts{max-width:520px;margin-top:0}
.nw-facts td{font-size:13px}
.nw-facts td:first-child{color:var(--ink-2)}
.nw-badges{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 0}
.nw-badge{display:inline-block;padding:3px 8px;border:1px solid var(--line);
  font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2)}
.nw-badge--on{border-color:var(--blue);color:var(--blue)}

/* ── /companies/ (v2, 2026-09-02) ───────────────────────────────────────
   Option A: the provenance line is the section's identity, so it is styled to
   be READ rather than tucked away — it sits between the dateline and the
   first fact on every one of the 91 entity pages. */
.cp-prov{margin:12px 0 0;padding:9px 12px;background:var(--blue-tint);
  border-left:3px solid var(--blue);font-size:12px;line-height:1.6;max-width:88ch}
.cp-table{font-feature-settings:'tnum' 1}
.cp-table td.val{font-size:14px;white-space:nowrap}
.cp-table td.code{width:34px;font-size:12.5px;color:var(--faint)}
.cp-stage{font-size:12px;color:var(--ink-2);white-space:nowrap}
.cp-date{font-size:11.5px;color:var(--ink-2);white-space:nowrap}
/* A pending count is a fact about our records, not a fault in the issuer —
   so it takes the wine as a SIGN (a value worth noticing) and never a red
   badge treatment. Same rule as every other sign on the site. */
.cp-num--unver{color:var(--alert);font-weight:700}

/* the fact table */
.cp-facts{max-width:760px}
.cp-facts td{font-size:13px;vertical-align:top}
.cp-facts td.cp-key{width:170px;color:var(--ink-2);white-space:nowrap}
.cp-facts td.cp-val{line-height:1.6}
.cp-sub{display:flex;flex-direction:column;gap:3px}
.cp-subrow{font-size:12.5px}
.cp-subrow b{color:var(--ink-2);font-weight:600;margin-right:5px}
/* The marker: small, beside the value, never mid-prose (owner instruction). */
.cp-unver{display:inline-block;margin-left:8px;padding:1px 5px;border:1px solid var(--alert);
  color:var(--alert);font-size:9.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;white-space:nowrap;vertical-align:1px}
.cp-row--unver > .cp-key{color:var(--alert)}
.cp-prose{font-size:14px;line-height:1.7;max-width:var(--measure);margin-top:0}

@media(max-width:680px){
  .cp-facts td.cp-key{width:auto}
  .cp-facts,.cp-facts tbody,.cp-facts tr,.cp-facts td{display:block;width:auto}
  .cp-facts td.cp-key{padding-bottom:0;font-size:11px;text-transform:uppercase;letter-spacing:.08em}
  .cp-facts tr{padding:8px 0;border-bottom:1px solid var(--line)}
  .cp-facts td{border-bottom:0}
}
/* product page: the market band sits above the provenance line, because it is
   a daily measurement rather than a directory record and is not what the
   provenance sentence counts. */
.cp-market{margin-top:14px}
.cp-market dd.cp-spark{padding-top:6px}
.cp-market dd.cp-spark svg{width:120px;height:24px}
.cp-asof{margin:8px 0 0;max-width:88ch}
.cp-chains td.val{font-size:13.5px}
/* contract addresses: data, not prose — full address, monospace, selectable.
   Never truncated: a reader copies these, and an elided address is worse than
   none. Wraps rather than scrolls on narrow screens for the same reason. */
.cp-contracts td{vertical-align:middle}
.cp-addr{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;
  word-break:break-all;color:var(--ink);background:var(--paper);padding:2px 5px}
.cp-links{margin-top:14px}
.cp-links a{font-weight:600}

/* ── glossary (v2) ────────────────────────────────────────────────
   The corpus is rectangular: 107 entries, every field populated, 133-198
   words of prose each. So there is no pending state to style and no coverage
   to publish — every rule here is about making a 152-word reference page
   read as authoritative rather than thin. Reuses table.bureau, .pills,
   .controls, .readings and .provenance rather than growing a parallel
   system; only the glossary-specific parts are below. */

/* HUB + SECTION LIST. The definition column carries a full sentence, so it
   gets the reading measure while the term column stays narrow and scannable.
   Definitions are 106-294 characters, which is why this is a table with a
   wrapping cell rather than the two-line list live used. */
.gl-page-desc{font-size:15px;line-height:1.65;color:var(--ink-2);max-width:var(--measure);margin-top:10px}
.gl-table td.name{width:22%;min-width:150px}
.gl-table td.name a{font-weight:600}
.gl-table td.gl-short{line-height:1.55;max-width:64ch}
.gl-table td.gl-sec{width:14%;white-space:nowrap;font-size:11.5px;letter-spacing:.02em}
.gl-table td.gl-sec a{color:var(--ink-2)}
.gl-table td.gl-sec a:hover{color:var(--blue)}
.gl-controls{margin-bottom:12px}
.gl-count{white-space:nowrap;font-feature-settings:'tnum' 1}
.gl-chips{margin-bottom:20px}
.gl-empty{margin-top:16px}

/* TERM PAGE. One measure column: the page is a definition, not a dashboard,
   and nothing on it is a number to line up. */
.gl-head h1{max-width:var(--measure)}
/* The canonical definition. Larger than the body and sitting above the first
   heading, because a reader or a machine that takes only this paragraph should
   still come away right — which is the whole design of the corpus. */
.gl-def{font-size:19px;line-height:1.6;max-width:var(--measure);margin-top:18px;
  padding-top:18px;border-top:2px solid var(--ink)}
.gl-body{margin-top:30px}
.gl-block{max-width:var(--measure);margin-bottom:30px}
.gl-block h2{font-family:var(--disp);font-weight:800;font-size:13px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--faint);margin:0 0 8px;padding:0;border-top:0}
.gl-block p{font-size:15px;line-height:1.75;margin:0}
/* DISTINCTION gets a plate. "X is not Y" is the most quotable line on the page
   and the easiest thing for a reader to get wrong, and it was rendered nowhere
   before this port. Blue rule, not wine: it marks a boundary, not a fault. */
.gl-distinction{border-left:3px solid var(--blue);padding:2px 0 2px 16px}
.gl-distinction h2{color:var(--blue)}
.gl-example{font-size:14.5px;color:var(--ink-2)}
.gl-related a,.gl-related span{
  display:inline-block;background:#fff;font-size:11.5px;font-weight:700;
  letter-spacing:.04em;padding:6px 10px;border:1px solid var(--line);color:var(--ink-2)}
.gl-related a:hover{background:var(--blue-tint);color:var(--ink);border-color:var(--blue)}
/* A related term with no page is a span, not a link. It should read as a term
   we name but do not define, never as a link that failed. Faint, no border
   hover. Zero of these render today — the four that used to were a builder
   reading the display label instead of the canonical one. */
.gl-related span{color:var(--faint);border-style:dashed}

/* SOURCES. The credibility surface: 2-3 keyed citations per entry, each
   stating its authority class, because a Basel standard and an author-views
   working paper are not the same kind of evidence. */
.gl-sources ol{margin:0;padding-left:20px}
.gl-sources li{font-size:13px;line-height:1.6;color:var(--ink-2);margin-bottom:10px}
.gl-sources a{font-weight:600}
.gl-src-authors{color:var(--ink)}
.gl-src-pub{color:var(--faint)}
.gl-src-doi{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;
  color:var(--faint);word-break:break-all}
.gl-authority{display:inline-block;margin-left:4px;padding:1px 5px;background:var(--paper);
  border:1px solid var(--line);font-size:9.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-2);white-space:nowrap;vertical-align:1px}

@media(max-width:680px){
  .gl-def{font-size:17px}
  .gl-table td.name{width:auto;min-width:0}
  /* The section column goes on narrow screens — it is a filter axis, not
     information the row needs. Its HEADER goes with it: hiding the cells
     alone leaves a third th over two columns, which is how a table ends up
     with its headings one column out of step. */
  .gl-table td.gl-sec,.gl-table thead th:nth-child(3){display:none}
}

/* ── topics (v2) ──────────────────────────────────────────────────
   Thirteen topics, 3 to 16 articles each. No filter and no chips: a
   thirteen-row list does not need to be searched, and the /glossary/ and
   /networks/ controls would be chrome over nothing. Reuses table.bureau. */
.tp-table td.name{width:auto}
.tp-table td.name a{font-weight:600}
/* The summary sits under its title rather than in its own column: summaries
   run 121 to 819 characters, so a column would set the row height by the
   longest one and leave the short ones stranded. */
.tp-sum{display:block;margin-top:4px;font-size:12.5px;line-height:1.55;color:var(--ink-2);
  max-width:72ch}
.tp-date{white-space:nowrap;font-size:12px;color:var(--ink-2);
  font-feature-settings:'tnum' 1;vertical-align:top}
.tp-date small{display:block;color:var(--faint);font-size:11px;margin-top:2px}
.tp-latest{font-size:13px;color:var(--ink-2);max-width:46ch}
.tp-latest small{color:var(--faint);white-space:nowrap}

@media(max-width:680px){
  /* The latest-article column goes; it is context, not the row's identity,
     and its header goes with it so the headings stay over their columns. */
  .tp-table td.tp-latest,.tp-table thead th:nth-child(3){display:none}
  .tp-sum{max-width:none}
}

/* ── research library (v2) ────────────────────────────────────────
   A lopsided corpus: 18 fields on all 24 entries, 11 between 4% and 38%. So
   every block below is conditional and the page's weight rests on the four
   fields that ARE always there — summary, key_findings, relevance and the
   bibliographic head. Reuses table.bureau, .pills, .controls, .readings. */
.rs-table td.name a{font-weight:600}
.rs-authors{display:block;margin-top:3px;font-size:12px;color:var(--ink-2)}
.rs-sum{display:block;margin-top:4px;font-size:12.5px;line-height:1.55;
  color:var(--ink-2);max-width:72ch}
.rs-venue{font-size:12.5px;color:var(--ink-2);max-width:34ch}
/* The top tier only, per the owner ruling — grey renders nothing at all, so
   this must never acquire a `--grey` variant. */
.rs-tier{display:inline-block;margin-left:6px;padding:1px 5px;background:var(--blue-tint);
  border:1px solid var(--blue);color:var(--blue);font-size:9.5px;font-weight:700;
  letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;vertical-align:1px}
.rs-constructs{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1px;
  background:var(--line);border:1px solid var(--line);margin-bottom:26px}
.rs-construct{display:block;padding:14px 16px;background:#fff;text-decoration:none}
.rs-construct:hover{background:var(--blue-tint)}
.rs-construct-name{display:block;font-weight:700;font-size:13.5px;color:var(--ink)}
.rs-construct:hover .rs-construct-name{color:var(--blue-dk)}
.rs-construct-desc{display:block;margin-top:4px;font-size:12px;line-height:1.5;color:var(--ink-2)}

/* ENTRY PAGE. One reading measure; nothing here is a number to align. */
.rs-head h1{max-width:var(--measure)}
.rs-kind{margin-bottom:6px}
.rs-lead{font-size:17px;line-height:1.6;max-width:var(--measure);margin-top:16px;
  padding-top:16px;border-top:2px solid var(--ink)}
.rs-source{margin-top:14px;display:flex;gap:14px;flex-wrap:wrap;align-items:center;
  font-size:12.5px}
.rs-btn{display:inline-block;padding:7px 14px;background:var(--blue);color:#fff;
  font-weight:700;font-size:12px;letter-spacing:.04em}
.rs-btn:hover{background:var(--blue-dk);color:#fff}
.rs-body{margin-top:30px}
.rs-block{max-width:var(--measure);margin-bottom:30px}
.rs-block h2{font-family:var(--disp);font-weight:800;font-size:13px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--faint);margin:0 0 8px;padding:0;border-top:0}
.rs-block p{font-size:15px;line-height:1.75;margin:0}
/* RELEVANCE gets the plate: 24 of 24 entries carry it, nothing rendered it
   before this port, and it is the one judgement the source itself cannot make. */
.rs-relevance{border-left:3px solid var(--blue);padding:2px 0 2px 16px}
.rs-relevance h2{color:var(--blue)}
.rs-findings{margin:0;padding-left:20px}
.rs-findings li{font-size:14.5px;line-height:1.65;margin-bottom:7px}
.rs-quote{margin:0 0 12px;padding:10px 0 10px 16px;border-left:3px solid var(--line);
  font-size:14.5px;line-height:1.6;color:var(--ink-2);font-style:italic}
.rs-facts td.rs-key{width:34%;font-size:11.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);vertical-align:top}
.rs-facts td.rs-val{font-size:13.5px;line-height:1.6}
.rs-row--unver td.rs-key{color:var(--alert)}
.rs-unver{display:inline-block;margin-left:8px;padding:1px 5px;border:1px solid var(--alert);
  color:var(--alert);font-size:9.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;white-space:nowrap;vertical-align:1px}
.rs-abstract{font-size:14px;line-height:1.7;color:var(--ink-2)}
.rs-tags a,.rs-tags span{display:inline-block;background:#fff;font-size:11.5px;font-weight:700;
  letter-spacing:.04em;padding:6px 10px;border:1px solid var(--line);color:var(--ink-2)}
.rs-tags a:hover{background:var(--blue-tint);color:var(--ink);border-color:var(--blue)}
.rs-tags .rs-jel{font-family:var(--disp);font-weight:800;color:var(--faint)}
.rs-apa{font-size:13.5px;line-height:1.6}
.rs-cite pre{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;
  line-height:1.55;background:var(--paper);padding:12px;overflow-x:auto;margin-top:8px}

@media(max-width:680px){
  .rs-lead{font-size:15.5px}
  .rs-venue,.rs-table thead th:nth-child(2){display:none}
  .rs-facts td.rs-key{width:auto}
}

/* ── long-form article (v2): /insights/ ───────────────────────────
   THE FIRST LONG-FORM PAGE IN THE V2 SYSTEM. Median 3,646 words, so the
   reading measure and the type scale carry it. base.css already styles the
   bare p / h2 / h3 / ul / li / blockquote / a / code that markdown emits, so
   nothing below restyles prose — it sets the column, the furniture around it,
   and the classes render_sources() emits (.sources/.src-num/.src-body/.src-pub
   live in custom.css, which v2 never loads). */
.art{max-width:var(--measure);margin:0 auto}
.art-head{margin-bottom:28px}
.art-kind{font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  color:var(--blue);margin-bottom:8px}
.art-head h1{margin-bottom:12px}
.art-byline{font-size:12.5px;color:var(--ink-2);margin-bottom:0}
.art-byline a{font-weight:600}
/* The lede is the authored summary — 121 to 819 chars on all 16 — set larger
   than the body so the reader can stop after it and still have the piece. */
.art-lede{font-size:18px;line-height:1.6;margin:18px 0 0;padding-top:18px;
  border-top:2px solid var(--ink)}
.art-hero{margin:26px 0}
.art-hero img{width:100%;height:auto;display:block}
.art-body{margin-top:26px}
/* Citation anchors: render_body() turns "[9]" into a link into the sources
   list, so it must not read as body prose. */
.art-body a[href^="#source-"]{font-size:.78em;font-weight:700;vertical-align:super;
  border-bottom:0;padding:0 1px}
.art-sources{margin-top:34px;padding-top:20px;border-top:2px solid var(--ink)}
.art-sources h2,.art-tags h2{font-family:var(--disp);font-weight:800;font-size:13px;
  letter-spacing:.14em;text-transform:uppercase;color:var(--faint);
  margin:0 0 12px;padding:0;border-top:0}
.art-sources ol{margin:0;padding-left:0;list-style:none}
.art-sources li{display:flex;gap:8px;font-size:12.5px;line-height:1.6;margin-bottom:9px;
  color:var(--ink-2)}
.art-sources li::marker{content:none}
.src-num{flex:0 0 auto;font-family:var(--disp);font-weight:800;color:var(--blue)}
.src-body a{font-weight:600}
.src-pub{color:var(--faint)}
.art-tags{margin-top:30px}
/* A tag whose topic fell below the article floor has no page, so it is a
   SPAN: still true of the article, not a link that bounces to the hub. 108 of
   the 174 pills are in this state. Faint and dashed, like the glossary's
   unresolved related terms — the same signal for the same situation. */
.art-tags .pills a,.art-tags .pills span{display:inline-block;background:#fff;
  font-size:11.5px;font-weight:700;letter-spacing:.04em;padding:6px 10px;
  border:1px solid var(--line);color:var(--ink-2)}
.art-tags .pills a:hover{background:var(--blue-tint);color:var(--ink);border-color:var(--blue)}
.art-tags .pills span{color:var(--faint);border-style:dashed}

/* /insights/ listing — 16 rows, shown whole. */
.ins-list{border-top:2px solid var(--ink)}
.ins-row{padding:20px 0;border-bottom:1px solid var(--line)}
.ins-row h2{font-size:19px;letter-spacing:-.01em;margin:0 0 6px;padding:0;border-top:0;
  text-transform:none;font-family:var(--sans);font-weight:700}
.ins-row h2 a{border-bottom:0}
.ins-row h2 a:hover{color:var(--blue-dk)}
.ins-row-meta{font-size:12px;color:var(--faint);margin:0 0 8px}
/* /archive/ mixes two content types in one chronological list, so each row
   states which it is. /insights/ passes no `kind` and renders none — a badge
   reading "Insight" on every row of /insights/ is chrome. */
.ins-kind{font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  font-size:10px;color:var(--blue)}
.ins-row-sum{font-size:14px;line-height:1.65;color:var(--ink-2);margin:0;max-width:var(--measure)}

/* ── static documents (v2): /about/, /privacy/, /terms/, 404 ──────
   The four pages that read no data at all. Measured 2026-09-04: 24 sections
   across the four, median 47 words, min 17, max 147 — only 2 of 24 over 100.
   base.css gives a bare h2 a 27px uppercase display face over a 2px rule,
   which is right for a chart page's sections and much too heavy here: ten
   17-to-85-word clauses under ten of those read as ten separate articles
   instead of one document. So h2 is quieted to a clause heading.

   IT ADDS NO COUNTER. /privacy/ and /terms/ carry their own "1." … "10."
   inside the copy, which is the operator's published legal text; a CSS
   counter would either duplicate those or renumber them. */
.doc{max-width:var(--measure);margin:0 auto}
.doc-lead{font-size:17px;line-height:1.6;color:var(--ink);margin:0 0 4px}
.doc h2{font-family:var(--sans);font-weight:700;font-size:16.5px;letter-spacing:-.005em;
  text-transform:none;line-height:1.35;margin:30px 0 8px;padding-top:0;border-top:0}
.doc h2:first-child{margin-top:8px}
.doc .provenance{margin-top:34px}
/* The one 147-word section — /about/'s "What Stablecoin Beat is not" — opens
   with a standing statement rather than running prose (the live page marks it
   .meth-note). Set apart so the disclaimer cannot read as the first line of
   the list that follows it. */
.doc-note{border-left:3px solid var(--blue);padding:2px 0 2px 16px;margin:0 0 18px;
  font-size:16px;line-height:1.6}

/* ── the contact form (v2) ────────────────────────────────────────
   base.css already styles bare input / select / textarea / button, including
   the focus ring, so this is layout and state only. Stacked rows rather than
   a grid: four fields at the reading measure, and a label above its control
   is the one arrangement that never truncates on a phone. */
.contact-form{margin:20px 0 0;display:flex;flex-direction:column;gap:16px}
.cf-row{display:flex;flex-direction:column;gap:5px}
.cf-row label{font-size:11px;font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;color:var(--faint)}
.cf-btn{align-self:flex-start;padding:11px 26px}
.cf-btn:disabled{opacity:.55;cursor:default}
/* The honeypot is hidden from EVERYONE by CSS, not wrapped in aria-hidden —
   a focusable input inside aria-hidden="true" is an ARIA violation, and
   hiding it visually is what makes a honeypot work in the first place. */
.cf-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.cf-turnstile{min-height:0}
/* The status line is the form's only feedback channel — the form is
   `novalidate`, so nothing else speaks. Wine for an error, ink for success:
   DESIGN.md §7 bans green, and a confirmation is not a measurement needing a
   colour of its own. */
.cf-status{font-size:13px;line-height:1.5;margin:0;min-height:1.2em}
.cf-status.err{color:var(--alert);font-weight:600}
.cf-status.ok{color:var(--ink);font-weight:600}
.cf-note{font-size:12.5px;line-height:1.6;margin:22px 0 0}

/* ── /yield-bearing/ ─────────────────────────────────────────────
   Reuses the tracker's table idioms (.bureau .tk-table, .code, .val, .spk,
   .tk-chg) because it IS the tracker's problem: 95 rows where 19 hold 93.27%
   of the segment and the tail reaches ten dollars. Only three additions. */
/* The compact index carries three columns, so it does not need the market
   table's row height or its numeric emphasis. */
.tk-index td{padding-top:6px;padding-bottom:6px}
.tk-index .val{font-weight:600}
/* The implied-yield marker. Blue rather than faint: it is the difference
   between a pool-reported figure and one annualized from a 30-day price move,
   which is the single most load-bearing distinction in that column — 45 of the
   49 populated cells are implied. */
.yb-star{color:var(--blue);font-weight:800;font-size:.85em;vertical-align:super;
  margin-left:1px}
.yb-note{font-size:12px;line-height:1.6;margin:14px 0 0;max-width:var(--measure)}

/* ── /regulation/ ────────────────────────────────────────────────
   NO COLOUR PER STATUS. The live page maps five statuses onto five colours
   built on #16a34a, which DESIGN.md §7 bans, and it had no entry for
   `finalised` — so that row borrowed the consultation grey while its own chip
   read "Framework finalised". A status is a CATEGORY, not a sign, so wine is
   out as well (it encodes a sign, never a judgment), and a five-colour legend
   is a thing the reader has to learn. The word is text; only `in_force` takes
   the blue tint, because that is the one distinction someone scanning for
   "can issuers operate here" is actually after. */
.rg-status{font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--ink-2);
  border:1px solid var(--line);padding:3px 8px;display:inline-block;white-space:nowrap}
.rg-status.on{background:var(--blue-tint);border-color:var(--blue);color:var(--ink)}
.rg-table td{vertical-align:top}
.rg-table .read{max-width:34ch}
/* One section per jurisdiction. The rule above each is the only separator they
   need — seven bordered cards on one page read as seven pages. */
.rg-card{max-width:var(--measure);padding-top:8px;margin-top:34px;
  border-top:2px solid var(--ink)}
.rg-card h2{font-size:21px;margin:0 0 8px;padding-top:0;border-top:0;
  text-transform:none;font-family:var(--sans);font-weight:700;letter-spacing:-.01em}
.rg-card h3{font-size:11px;font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;color:var(--faint);margin:20px 0 8px}
.rg-meta{margin:0 0 14px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.rg-regs,.rg-src{font-size:12px;line-height:1.6;margin:12px 0 0}
.rg-news{margin:0;padding-left:0;list-style:none}
.rg-news li{font-size:13.5px;line-height:1.6;margin-bottom:6px;display:flex;gap:8px}
.rg-news li .meta{flex:0 0 auto;font-variant-numeric:tabular-nums}
/* A visible marker for the status the legend does not define — the same
   pending-copy convention /tracker/ uses, so a gap in owner copy is on the
   page rather than in a session note nobody reads. */
.rg-draft{background:var(--blue-tint);border:1px dashed var(--blue);
  padding:1px 6px;font-size:11.5px;color:var(--ink-2)}

/* ── /monthly/ ───────────────────────────────────────────────────
   The report bodies are pre-rendered by the monthly engine, so base.css's
   bare p / h3 / ul / table rules do the typography and only the furniture
   is set here. Sections get a rule rather than a card: 11 to 14 bordered
   boxes down one page read as 14 pages. */
.mr-sec{margin-top:34px;padding-top:10px;border-top:1px solid var(--line)}
.mr-sec:first-of-type{border-top:2px solid var(--ink)}
.mr-cap{font-size:12px;line-height:1.6;margin:10px 0 0;color:var(--faint)}
/* The contents list earns its place at 11+ sections and is a plain list, so
   it cannot drift from the headings it points at. */
.mr-toc{columns:2;column-gap:28px;margin:14px 0 0;padding-left:18px}
.mr-toc li{margin-bottom:5px;font-size:14px;break-inside:avoid}
/* Wide generated tables inside a report body must scroll themselves rather
   than pushing the page sideways. */
.mr .mr-sec table{display:block;overflow-x:auto;max-width:100%}
@media(max-width:680px){ .mr-toc{columns:1} }

/* ── answer pages (v2): /now/ ─────────────────────────────────────
   Sections are QUESTIONS, not clauses, so h2 gets a little more presence than
   .doc h2 gives a legal sub-head — but nowhere near the bare 27px, because
   /now/ answers six of them in 321 words and the page's job is to be scanned
   in one screen. The blue rule marks a question without shouting. */
.ans h2{font-size:18px;font-weight:700;color:var(--ink);margin:28px 0 6px;
  padding-top:14px;border-top:1px solid var(--line)}
.ans .answers h2:first-child{margin-top:14px}
.ans-lead{font-size:16px;line-height:1.65;color:var(--ink-2);margin:0 0 4px;
  padding-bottom:16px;border-bottom:2px solid var(--ink)}
/* The citation line is the reason this page exists in machine-readable form;
   it should read as an instruction, not as a footnote nobody sees. */
.ans-cite{font-size:13px;line-height:1.6;color:var(--ink-2);margin:26px 0 0;
  padding:12px 0 0;border-top:1px solid var(--line)}

/* ── definition lists (v2): /methodology/'s 21 metric cards ───────
   The live page renders these as a grid of bordered cards. Twenty-one of them
   is a wall, and only ten carry a formula — so they become a definition list:
   the NAME is the scannable thing, the definition takes the reading measure,
   and the formula sits under it as code where one exists. Two columns only
   where there is room for both to keep a real measure. */
.defs{margin:18px 0 0}
.defs > div{padding:14px 0;border-top:1px solid var(--line)}
.defs > div:first-child{border-top:2px solid var(--ink)}
.defs dt{font-weight:700;font-size:15px;letter-spacing:-.005em;margin-bottom:4px}
.defs dd{margin:0;font-size:14.5px;line-height:1.65;color:var(--ink-2)}
/* Formulas are the one place on this page where a monospace face is doing
   semantic work, so they get their own line rather than sitting inline. */
.defs-f{display:block;margin-top:8px;font-size:12.5px;color:var(--ink);
  background:var(--blue-tint);padding:6px 9px;overflow-x:auto}
/* The live template's section wrappers are RENAMED, not removed: dropping the
   openers and stripping the loose closers unbalanced the document on the first
   attempt and moved a whole section above the FAQ. A rename cannot. */
.doc-block{margin-bottom:6px}
.doc-block:last-of-type{margin-bottom:0}
/* The source table's cadence column is a short label, not a figure. */
.doc .bureau td:last-child{white-space:nowrap;color:var(--ink-2)}

@media(max-width:680px){
  .art-lede{font-size:16.5px}
  .ins-row h2{font-size:17px}
  .doc-lead{font-size:16px}
  .doc h2{font-size:15.5px}
}

/* Hero aggregates tiles link to /charts/aggregates/ since 174cda8 — but the
   hero sits ON BLUE and the global link rule painted the labels var(--blue):
   blue-on-blue, invisible (owner, 2026-09-06). Links on the hero inherit the
   on-blue ink; hover brightens to white like the hero's other links. */
.hstat dt a{color:inherit;border-bottom:0}
.hstat dt a:hover{color:#fff;border-bottom:0}
