/* OmniAlts editorial design language. Shared vocabulary with the static HTML
   report: Georgia serif VOICE (fund names, editorial headings, takeaway/
   finding sentences, methodology prose) + one system-ui sans for ALL data/UI
   (labels, values, tables, nav, badges, buttons, metadata, chart text).
   Design D1 (operator-ratified "dune meets ocean" palette, docs/design_direction.md):
   warm-sand ground stays; the three competing blues (#24627e ink / #1c74a8
   accent / #2f6d8f digest) consolidate into ONE ocean family; body text
   retires blue for near-black warm ink. Named type scale, no orphan sizes:
   11 (micro-label) / 12 (metadata) / 13 (data body) / 15 (editorial body) /
   18 (section) / 21 (stat value) / 22 (fund title) / 30 (brand). */
:root {
  --urgent: #7d2733;      /* oxblood -- alerts, negatives, active gating (unchanged) */
  --notify: #8a5a0e;      /* amber, deepened ~10% from #9a6410 (D1 severity calibration:
                              Notify is now an outline badge, amber as FOREGROUND text on
                              the sand/eggshell ground rather than white-on-amber-fill, so
                              it needs its own AA pass -- #9a6410 measured 3.99:1 on --bg
                              and 4.44:1 on --card, both short of the 4.5:1 text minimum;
                              #8a5a0e measures 4.72:1 / 5.26:1, see docs/coverage_fill_report.md) */
  --ocean-deep: #114a6d;  /* active/selected structure: nav active underline, th border, masthead rule */
  --ocean-mid: #1a6a96;   /* links + all interactive affordances (hover, buttons) */
  --ocean-pale: #d7e4e9;  /* ambient tints / hover washes (sky, not sand) */
  --ink: #2b2722;         /* near-black warm -- body text (D1: blue body text retires) */
  --label: #5f584d;       /* deep sand/taupe -- secondary UI labels (h3, th text) */
  --muted: #857f74;       /* mid gray -- fine print / metadata, de-emphasized */
  --line: #d3c9b6;        /* warm hairline */
  --bg: #ece5d8;          /* light sand ground (D1: lightened slightly for freshness) */
  --card: #f6f1e7;        /* eggshell -- lighter than the ground for contrast */
  --good: #4c6b2f;         /* olive-forest green, used sparingly */
  --tint: #e2d9c8;         /* warm tint for zebra rows (D1 judgment call: kept warm --
                               a cool sky tint fought the sand ground in table contexts;
                               pale-sky is instead reserved for hover, see tr:hover) */
  --chronic: #9c5b1f;      /* burnt rust -- heavy historical gating (attention, not alarm) */
  --font-sans: system-ui, sans-serif;
  --font-serif: Georgia, 'Times New Roman', serif;
}

/* -------------------------------------------------------------------------
   Fund research rollout — approved Shore R2, with operator deltas.
   Scoped to .fund-page so the dashboard, universe, audit, and utility routes
   retain their established presentation. No gradients, photographs, or data
   animation are used in this surface.
   ------------------------------------------------------------------------- */
@font-face {
  font-family: "Newsreader";
  src: url("/static/fonts/newsreader/Newsreader-latin-wght-opsz.woff2") format("woff2");
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
}

/* Shore tokens live at :root so every surface can consume them as the
   rollout reaches it (phase 2: the dashboard reuses the fund-page table and
   stat-strip families). The fund page keeps its own ground overrides. */
:root {
  --shore-paper: #faf6ee;
  --shore-cream: #f4eddd;
  --shore-sand: #e7dcc6;
  --shore-line: #d9cdb4;
  --shore-ink: #2b2722;
  --shore-muted: #6f6557;
  --shore-deep: #082a3f;
  --shore-ocean: #0f4c6e;
  --shore-ocean-mid: #1a6a96;
  --shore-mist: #d7e4e9;
  --shore-gold: #d9b98a;
  --shore-oxblood: #7a2e2e;
  --urgent-solid: #7a2e2e;
  --urgent-edge: #7a2e2e;
  /* Server SVG paint tokens. Day values preserve the approved Shore palette
     and the prior colorblind-safe categorical series. */
  --ch-text: #2b2722;
  --ch-axis: #857f74;
  --ch-line: #d3c9b6;
  --ch-grid: #e6e2d8;
  --ch-positive: #4c6b2f;
  --ch-negative: #7a2e2e;
  --ch-primary: #1a6a96;
  --ch-secondary: #0f4c6e;
  --ch-reference: #8a5a0e;
  --ch-halo: #fff;
  --ch-series-1: #0072b2; --ch-series-2: #d55e00;
  --ch-series-3: #009e73; --ch-series-4: #cc79a7;
  --ch-series-5: #e69f00; --ch-series-6: #56b4e9;
  --ch-series-7: #8b7355; --ch-series-8: #1c2833;
  --ch-series-9: #666666; --ch-series-10: #7b52ab;
  --ch-series-11: #a0a0a0; --ch-series-12: #004d40;
  --ch-series-13: #b2182b; --ch-series-14: #2166ac;
  --fund-progress: 0%;
}
.fund-page {
  background: var(--shore-paper);
  color: var(--shore-ink);
}
.fund-page .wrap { width: 100%; max-width: none; padding: 0; }
.fund-page .wrap > footer { margin: 0; padding: 36px max(28px, calc((100vw - 1500px)/2)); background: #061e2e; color: #b9c7cc; }
/* Operator, 2026-07-12 round 3: the chrome is permanent SITE-WIDE -- the
   horizon band and masthead (with the turning fan) stay pinned on every
   page, exactly as on the fund pages. The band's gold progress fill is
   REMOVED ("we don't need 2-3 different dynamic page scrollers"): the
   ledger's fill and the turning fan are the only scroll indicators. */
.horizon-band { position: sticky; top: 0; z-index: 90; }
header.masthead { position: sticky; top: 13px; z-index: 80; background: rgba(250,246,238,.97); border-bottom-color: var(--shore-line); }
body.dashboard header.masthead { top: 20px; }
.fund-page h1, .fund-page h2, .fund-stat-strip dd, .fund-page .fund-dune-caption strong,
.dash-hero h1, .dash-section h2 {
  font-family: "Newsreader", Constantia, "Palatino Linotype", Georgia, serif;
  font-optical-sizing: auto;
}

.fund-contextbar { position: sticky; top: var(--fund-masthead-h, 74px); z-index: 75; display: flex; justify-content: space-between; align-items: center; gap: 20px; padding: 9px max(28px, calc((100vw - 1500px)/2)); background: #fff; border-bottom: 1px solid var(--shore-line); color: var(--shore-muted); font-size: 11px; }
.fund-context-actions { display: flex; align-items: center; gap: 18px; }
.fund-context-actions .chart-controls { margin: 0; }

.fund-ledger { position: fixed; z-index: 70; left: 0; top: var(--fund-ledger-top, 190px); bottom: 0; width: 60px; display: flex; flex-direction: column; align-items: center; padding: 22px 0 14px; color: #faf6ee; background: var(--shore-deep); border-right: 1px solid rgba(215,228,233,.16); }
.fund-ledger-track { position: relative; width: 100%; flex: 1; display: flex; flex-direction: column; justify-content: space-between; align-items: center; padding: 5px 0 12px; }
.fund-ledger-track::before { content: ""; position: absolute; top: 9px; bottom: 20px; left: 50%; width: 1px; background: rgba(215,228,233,.2); }
.fund-ledger-fill { position: absolute; top: 9px; left: calc(50% - 1px); width: 3px; height: var(--fund-progress); max-height: calc(100% - 29px); background: var(--shore-gold); }
.fund-ledger-link { position: relative; z-index: 1; display: grid; width: 100%; height: 30px; place-items: center; text-decoration: none; }
.fund-ledger-dot { width: 9px; height: 9px; border: 2px solid var(--shore-deep); border-radius: 50%; background: #5d7484; box-shadow: 0 0 0 1px rgba(215,228,233,.35); }
.fund-ledger-link.active .fund-ledger-dot { width: 15px; height: 15px; background: var(--shore-gold); box-shadow: 0 0 0 3px rgba(217,185,138,.25); }
.fund-ledger-label { position: absolute; left: 46px; width: 180px; padding: 8px 11px; color: #faf6ee; background: var(--shore-deep); border-left: 3px solid var(--shore-gold); opacity: 0; pointer-events: none; transform: translateX(-6px); font-size: 11px; }
/* Operator feedback 2026-07-12 (round 2): on NARROW screens the popouts
   must not sit over the content -- the newly active label bursts out for a
   couple of seconds on section transition (JS adds .label-burst), then
   recedes; hovering the rail reveals the full list. On wide viewports the
   gutter is empty, so every label shows statically as quiet ink text. */
.fund-ledger-label { transition: opacity .18s ease, transform .18s ease; }
@media (prefers-reduced-motion: reduce) { .fund-ledger-label { transition: none; } }
.fund-ledger-link:hover .fund-ledger-label, .fund-ledger-link:focus .fund-ledger-label,
.fund-ledger:hover .fund-ledger-label, .fund-ledger-label.label-burst { opacity: 1; transform: none; }
/* Wide screens (operator refinement, 2026-07-12): the deep-water band
   itself widens so the section titles sit INSIDE it rather than floating as
   disconnected boxes. The ::after extension + labels total ~238px, so the
   breakpoint is 1920px -- below that the content column would collide and
   the burst behavior applies instead. */
@media (min-width: 1920px) {
  .fund-ledger::after { content: ""; position: absolute; left: 100%; top: 0; bottom: 0; width: 178px; background: var(--shore-deep); }
  .fund-ledger-track { z-index: 1; }
  .fund-ledger-label { opacity: .62; transform: none; background: transparent; border-left-color: transparent; color: #faf6ee; font-weight: 600; }
  .fund-ledger-link.active .fund-ledger-label { opacity: 1; border-left-color: var(--shore-gold); }
  .fund-ledger:hover .fund-ledger-label { opacity: 1; }
}
/* Share classes as ONE proportional bar summing to 100% (operator feedback
   2026-07-12), with a hatched band for net assets the filings do not
   attribute to a captured class. */
.fund-class-stack { display: flex; height: 34px; border: 1px solid #d9cdb4; background: #f1e9da; overflow: hidden; margin: 0 0 8px; }
.fund-class-stack span { display: block; height: 100%; flex-shrink: 1; min-width: 0; }
.fund-class-stack .unattributed, .fund-class-legend i.unattributed { background: repeating-linear-gradient(45deg, #e7dcc6, #e7dcc6 6px, #f1e9da 6px, #f1e9da 12px); }
.fund-class-legend { display: flex; flex-wrap: wrap; gap: 5px 16px; margin: 0 0 4px; font-size: 11.5px; color: #6f6557; }
.fund-class-legend i { display: inline-block; width: 11px; height: 11px; margin-right: 5px; vertical-align: -1px; border: 1px solid rgba(43,39,34,.2); }
/* Chart lightbox (operator feedback 2026-07-12 round 2): charts uniform at
   rest, click to enlarge. The overlay clone scales the same SVG up. */
.fund-chart-card.chart-zoomable { cursor: zoom-in; }
.fund-chart-card.chart-zoomable:hover { outline: 1px solid var(--shore-gold); outline-offset: 2px; }
.chart-lightbox { position: fixed; inset: 0; z-index: 200; display: grid; place-items: center; background: rgba(43,39,34,.55); cursor: zoom-out; padding: 4vh 4vw; }
.chart-lightbox-box { margin: 0; width: min(1240px, 92vw); max-height: 90vh; overflow: auto; padding: 22px 26px; background: var(--shore-paper, #faf6ee); border: 1px solid #d9cdb4; box-shadow: 0 12px 40px rgba(43,39,34,.35); }
.chart-lightbox-box svg { width: 100%; height: auto; display: block; }
.chart-lightbox-hint { margin: 10px 0 0; color: #988c79; font-size: 11px; text-align: center; }
/* Shore rollout phase 2: the dashboard front door. Editorial statement hero
   on the warm ground, one plain status sentence, and the fund-page stat
   strip reused so the surfaces cohere. */
.dash-hero { padding: 30px 0 8px; }
.dash-hero h1 { margin: 0 0 10px; font-family: "Newsreader", Constantia, "Palatino Linotype", Georgia, serif; font-size: clamp(38px, 4.4vw, 62px); font-weight: 600; line-height: .98; letter-spacing: -.03em; color: var(--shore-deep, #0f4c6e); }
.dash-deck { max-width: 78ch; margin: 0 0 14px; color: #6f6557; font-size: 15px; line-height: 1.65; }
.audit-heading { font-family: "Newsreader", Constantia, "Palatino Linotype", Georgia, serif; color: var(--shore-deep); }
.shore-banner { max-width: 94ch; margin: 0 0 18px; padding: 12px 16px; background: #fff; border: 1px solid #d9cdb4; border-left: 6px solid var(--shore-ocean, #1a6a96); font-size: 14px; line-height: 1.6; }
.shore-banner.hot { border-left-color: #7a2e2e; background: #f7ece9; }
.shore-banner.clear { border-left-color: #1a6a96; }
.shore-banner .meta { display: block; margin-top: 4px; }
.dash-stats { margin-bottom: 6px; }
.dash-action dd a.btn { font-size: 13px; }
.dash-section { padding: 34px 0 8px; border-top: 1px solid #d9cdb4; margin-top: 26px; }

.fund-shore { margin-left: 60px; }
.fund-hero { padding: 34px max(26px, calc((100vw - 1500px)/2)) 26px; background: var(--shore-cream); border-bottom: 1px solid var(--shore-line); scroll-margin-top: 130px; }
.fund-hero-grid { display: grid; grid-template-columns: minmax(0,1.18fr) minmax(380px,.82fr); gap: 22px; }
.fund-identity { min-height: 420px; display: flex; flex-direction: column; justify-content: space-between; padding: 38px; color: var(--shore-paper); background: var(--shore-deep); }
.shore-eyebrow, .fund-section-head > span, .fund-chart-card figcaption span, .fund-stat-strip dt { font: 700 9px ui-monospace, monospace; letter-spacing: .11em; text-transform: uppercase; }
.shore-eyebrow { color: var(--shore-gold); }
.fund-identity h1 { max-width: 830px; margin: 14px 0 16px; color: #fff; font-size: clamp(42px,4.8vw,76px); font-weight: 520; line-height: .96; letter-spacing: -.035em; }
.fund-deck { max-width: 690px; color: #d3dfe2; font-size: 15px; }
.fund-chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 18px; }
.fund-chips span { padding: 5px 9px; border: 1px solid rgba(215,228,233,.27); color: #d7e4e9; font-size: 10px; }
.fund-hero-meta { display: grid; grid-template-columns: repeat(4,minmax(0,1fr)); column-gap: 24px; row-gap: 12px; margin: 28px 0 0; }
.fund-hero-meta > div { min-width: 0; }
.fund-hero-meta dt { color: #8ba2ad; font: 8px ui-monospace, monospace; letter-spacing: .1em; text-transform: uppercase; }
.fund-hero-meta dd { margin: 3px 0 0; color: #fff; font-size: 12px; }
.fund-dune { position: relative; min-height: 420px; overflow: hidden; background: var(--shore-mist); }
.fund-dune > svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.fund-dune-caption { position: absolute; right: 16px; bottom: 16px; left: 16px; display: flex; justify-content: space-between; gap: 16px; align-items: flex-end; padding: 14px 16px; color: #fff; background: rgba(8,42,63,.88); }
.fund-dune-caption strong { font-size: 20px; font-weight: 560; }
.fund-dune-caption span { display: block; margin-top: 4px; color: #b8c9cf; font: 9px ui-monospace, monospace; letter-spacing: .08em; text-transform: uppercase; }
.fund-dune-caption i { width: 9px; height: 9px; margin-bottom: 5px; border-radius: 50%; background: var(--shore-ocean-mid); }
.fund-dune-caption i.is-urgent { background: var(--shore-oxblood); box-shadow: 0 0 0 4px rgba(122,46,46,.25); }

/* Sortable board headings keep the same high-contrast ink as their static
   neighbours.  The arrow is the affordance; link-blue is not. */
.table-compact table th .sort-link { display: inline-flex; gap: 5px; align-items: center; color: inherit; text-decoration: none; }
.table-compact table th .sort-link:hover,
.table-compact table th .sort-link:focus-visible { text-decoration: underline; text-underline-offset: 3px; }
.table-compact table th .sort-arrow { font-size: 10px; line-height: 1; }

.fund-stat-strip { display: grid; grid-template-columns: repeat(6,1fr); margin: 22px 0 0; border: 1px solid var(--shore-line); background: var(--shore-paper); }
.fund-stat-strip > div { min-width: 0; min-height: 96px; padding: 15px 17px; border-right: 1px solid var(--shore-line); }
.fund-stat-strip > div:last-child { border-right: 0; }
.fund-stat-strip dt { color: var(--shore-muted); }
.fund-stat-strip dd { margin: 8px 0 2px; color: var(--shore-ocean); font-size: clamp(19px,1.6vw,26px); font-weight: 580; line-height: 1; font-variant-numeric: tabular-nums; }
.fund-stat-strip dd.neg { color: var(--shore-oxblood); }
.fund-stat-strip small { display: block; overflow-wrap: anywhere; color: var(--shore-muted); font-size: 9.5px; }
.fund-stat-strip .citation-trigger { display: inline-block; margin-left: 4px; font-family: system-ui, sans-serif; font-size: 9px; }

.fund-rsec { max-width: 1500px; margin: 0 auto; padding: 64px 28px; border-bottom: 1px solid var(--shore-line); scroll-margin-top: 130px; }
.fund-section-head { display: grid; grid-template-columns: 150px minmax(0,1fr); gap: 26px; margin-bottom: 26px; }
.fund-section-head > span { padding-top: 8px; color: var(--shore-ocean); border-top: 2px solid var(--shore-ocean); }
.fund-section-head h2 { margin: 0; color: var(--shore-deep); font-size: clamp(31px,3vw,47px); font-weight: 520; line-height: 1.03; letter-spacing: -.025em; }
.fund-section-head p { max-width: 770px; margin: 10px 0 0; color: var(--shore-muted); font-size: 13.5px; }
.fund-empty { padding: 18px; color: var(--shore-muted); border: 1px solid var(--shore-line); background: #fff; }
.fund-alert-list { display: grid; gap: 10px; }
.fund-alert { display: grid; grid-template-columns: 78px 1fr; gap: 16px; padding: 15px 17px; border: 1px solid var(--shore-line); background: #fff; }
.fund-alert-type { align-self: start; padding: 6px; text-align: center; color: var(--shore-ocean); border: 1px solid var(--shore-ocean); font: 700 8.5px ui-monospace, monospace; letter-spacing: .08em; text-transform: uppercase; }
.fund-alert.urgent .fund-alert-type { color: #fff; background: var(--shore-oxblood); border-color: var(--shore-oxblood); }
.fund-alert h3 { margin: 1px 0 4px; font-size: 14px; }
.fund-alert p { margin: 3px 0; color: var(--shore-muted); }
.fund-alert details { margin-top: 7px; font-size: 12px; }

.fund-chart-grid { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 16px; }
.fund-chart-card { min-width: 0; margin: 0; border: 1px solid var(--shore-line); background: #fff; }
.fund-chart-wide { grid-column: 1 / -1; }
.fund-chart-card figcaption { display: flex; justify-content: space-between; gap: 20px; padding: 12px 14px; border-bottom: 1px solid var(--shore-line); background: var(--shore-cream); }
.fund-chart-card figcaption strong { font-size: 13px; }
.fund-chart-card figcaption span { color: var(--shore-muted); }
.fund-chart-card > svg { display: block; width: 100%; height: auto; padding: 14px; }
.utility-chart-grid { grid-template-columns: repeat(auto-fit,minmax(min(460px,100%),720px)); justify-content: start; margin: 18px 0 28px; }
.compare-chart-grid { align-items: start; }
.compare-chart-wide { max-width: 760px; margin-right: auto; margin-left: auto; }
.compare-chart-actions { margin-top: 9px; }
.shore-method-hero { display: grid; grid-template-columns: minmax(0,1fr) minmax(300px,420px); gap: 42px; align-items: end; border-bottom: 1px solid var(--shore-line); padding-bottom: 28px; }
.shore-method-vignette { display: block; width: 100%; height: auto; border: 1px solid var(--shore-line); background: var(--shore-mist); }
.methodology-prose { max-width: 70ch; margin: 38px 0 0; }
.methodology-prose > p, .methodology-prose > ul { font-size: 15px; line-height: 1.72; }
.methodology-prose > h3 { margin-top: 34px; color: var(--shore-deep); font-family: "Newsreader", Constantia, "Palatino Linotype", Georgia, serif; font-size: 24px; }
.error-page { background: var(--shore-paper); color: var(--shore-ink); }
.error-shore { display: grid; grid-template-columns: minmax(0,.8fr) minmax(380px,1.2fr); gap: 50px; align-items: center; min-height: 62vh; }
.error-shore h1 { margin: 6px 0 15px; color: var(--shore-deep); font: 560 clamp(42px,5vw,72px)/.98 "Newsreader", Constantia, "Palatino Linotype", Georgia, serif; letter-spacing: -.03em; }
.error-shore > div > p:not(.shore-eyebrow) { max-width: 52ch; font-size: 15px; line-height: 1.65; }
.error-dune { display: block; width: 100%; height: auto; border: 1px solid var(--shore-line); }
@media (max-width: 759px) {
  .shore-method-hero, .error-shore { grid-template-columns: 1fr; gap: 24px; }
  .shore-method-vignette { max-width: 520px; }
  .error-shore { padding: 30px 0; }
}
.fund-health-strip { display: grid; grid-template-columns: repeat(3,1fr); margin-bottom: 20px; border: 1px solid var(--shore-line); }
.fund-health-strip > div { padding: 16px; border-right: 1px solid var(--shore-line); }
.fund-health-strip > div:last-child { border-right: 0; }
.fund-health-strip dt { color: var(--shore-muted); font-size: 10px; text-transform: uppercase; }
.fund-health-strip dd { margin: 3px 0; color: var(--shore-ocean); font: 600 26px "Newsreader", Constantia, "Palatino Linotype", Georgia, serif; }

.fund-page .table-scroll { max-width: 100%; overflow-x: auto; border: 1px solid var(--shore-line); }
.fund-table { width: 100%; min-width: 680px; border-collapse: collapse; background: #fff; font-size: 12px; }
/* Shore phase 3: the compact-data and narrative table families (liquidity
   board, portfolio boards, gating/position-event lists) join the fund-table
   look so every board on the site shares one language. The liquidity
   board's bare <table> tag is test-load-bearing, hence container selectors. */
.fund-table th, .table-compact table th, table.table-narrative th { padding: 9px 12px; color: #fff; background: var(--shore-deep); border-right: 1px solid rgba(255,255,255,.14); text-align: left; font: 700 9px ui-monospace, monospace; letter-spacing: .07em; text-transform: uppercase; }
.fund-table td, .table-compact table td, table.table-narrative td { padding: 10px 12px; border-right: 1px solid #e7dfd0; border-bottom: 1px solid #e7dfd0; vertical-align: top; }
.fund-table tbody tr:nth-child(even), .table-compact table tbody tr:nth-child(even), table.table-narrative tbody tr:nth-child(even) { background: #f5efe4; }
.fund-table td.num, .fund-table th.num { text-align: right; font-variant-numeric: tabular-nums; }
.fund-table td small { display: block; color: var(--shore-muted); }
.fund-urgent-label, .fund-page .neg { color: var(--shore-oxblood); font-weight: 700; }
.fund-evidence-lines { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 12px; margin-top: 14px; }
.fund-evidence-lines p, .fund-evidence-line { padding: 13px; border-left: 3px solid var(--shore-gold); background: var(--shore-cream); }
.fund-class-bars { display: grid; gap: 7px; max-width: 920px; margin-bottom: 10px; }
.fund-class-bars label { display: grid; grid-template-columns: 120px minmax(160px,1fr) 55px; gap: 10px; align-items: center; font-size: 11px; }
.fund-class-bars meter { width: 100%; height: 14px; accent-color: var(--shore-ocean); }
.fund-class-bars b { text-align: right; font-variant-numeric: tabular-nums; }
.fund-page .disclosure { margin-top: 18px; border-color: var(--shore-line); }
.fund-page .disclosure > summary { background: var(--shore-cream); }

@media (max-width: 1050px) {
  .fund-stat-strip { grid-template-columns: repeat(3,1fr); }
  .fund-stat-strip > div:nth-child(3n) { border-right: 0; }
  .fund-stat-strip > div:nth-child(-n+3) { border-bottom: 1px solid var(--shore-line); }
  .fund-hero-grid { grid-template-columns: 1fr; }
  .fund-identity, .fund-dune { min-height: 360px; }
}
@media (max-width: 760px) {
  .fund-contextbar { align-items: flex-start; padding: 8px 14px; }
  .fund-context-actions { display: none; }
  .fund-ledger { display: none; }
  .fund-shore { margin-left: 0; }
  .fund-hero { padding: 18px 14px; }
  .fund-identity { min-height: 330px; padding: 25px 22px; }
  .fund-dune { min-height: 290px; }
  .fund-hero-meta { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .fund-stat-strip { grid-template-columns: repeat(2,1fr); }
  .fund-stat-strip > div, .fund-stat-strip > div:nth-child(3n) { border-right: 1px solid var(--shore-line); border-bottom: 1px solid var(--shore-line); }
  .fund-stat-strip > div:nth-child(even) { border-right: 0; }
  .fund-rsec { padding: 46px 16px; }
  .fund-section-head { grid-template-columns: 1fr; gap: 12px; }
  .fund-section-head > span { width: 130px; }
  .fund-chart-grid, .fund-evidence-lines { grid-template-columns: 1fr; }
  .fund-chart-wide { grid-column: auto; }
  .fund-alert { grid-template-columns: 1fr; }
  .fund-alert-type { width: max-content; }
  .fund-health-strip { grid-template-columns: 1fr; }
  .fund-health-strip > div { border-right: 0; border-bottom: 1px solid var(--shore-line); }
  .fund-class-bars label { grid-template-columns: 76px minmax(100px,1fr) 44px; gap: 6px; }
}
@media (max-width: 420px) {
  .fund-identity h1 { font-size: 40px; }
  .fund-stat-strip { grid-template-columns: 1fr; }
  .fund-stat-strip > div { border-right: 0 !important; }
  .fund-dune-caption { right: 10px; bottom: 10px; left: 10px; }
}
@media (prefers-reduced-motion: reduce) {
  .fund-page *, .fund-page *::before, .fund-page *::after { scroll-behavior: auto !important; transition: none !important; animation: none !important; }
}
* { box-sizing: border-box; }
body { font-family: var(--font-serif); color: var(--ink);
       background: var(--bg); margin: 0; line-height: 1.55; }
/* Design D4 WS1 (operator: "why is the entire site squeezed into the middle
   of the page still instead of filling it more"): widened again from 1240px
   -- on a 1920px monitor the old centered column read as a letter in an
   envelope. .wrap now governs CONTENT width only (the masthead lives outside
   it, see header.masthead below); dense boards (watchlist/universe/liquidity
   tables, already width:100% internally) get the full ~1536px of usable
   space at 1920px viewports instead of ~1192px. Fund-page PROSE blocks still
   cap their own measure via .measure/.measure-narrow (~72ch) so editorial
   text never stretches to this width -- only data sections go wide. */
.wrap { max-width: 1600px; margin: 0 auto; padding: 24px 32px 64px; }

/* Design D4 WS3: the horizon band -- docs/design_direction.md's "one
   permitted expressive moment," a full-viewport-width ribbon at the very
   top of every page, above/behind the masthead, never behind data (it
   never recurs lower on the page). Three literal stacked flat-fill <span>s
   (base.html/error.html), not a CSS gradient -- the brief is explicit
   ("flat fills only, no gradients"), and separate elements with solid
   background-colors make that unambiguous rather than relying on hard
   gradient stops that could read as a gradient in the source. Default
   total height 13px (5+6+2), inside the 10-14px target; the dashboard-only
   taller variant (body.dashboard, ~20px) is the brief's "subtle emphasis
   on the front door." */
.horizon-band { display: flex; flex-direction: column; width: 100%; }
.horizon-band .horizon-sky { display: block; height: 5px; background: var(--ocean-pale); }
.horizon-band .horizon-ocean { display: block; height: 6px; background: var(--ocean-deep); }
.horizon-band .horizon-sand { display: block; height: 2px; background: #d9b98a; }
body.dashboard .horizon-band .horizon-sky { height: 8px; }
body.dashboard .horizon-band .horizon-ocean { height: 9px; }
body.dashboard .horizon-band .horizon-sand { height: 3px; }

/* Masthead + navigation. Operator-ratified D1 addendum: the fan-on-horizon
   lockup (_brand.html). The old 3px-double border-bottom on the masthead
   retires; the rule is now a single solid 3px ink border-TOP on the wordmark
   block -- the horizon line -- and the fan SVG's baseline (its viewBox bottom
   edge, y=64) sits flush on that rule because .brand-fan is a display:block
   element stacked directly above the bordered .brand-word block (no absolute
   positioning needed; zero gap by construction). Rule-to-cap-height gap is
   deliberately tight (operator: ~4-6px): 4px padding + line-height 1.1.
   Design D4 WS1: the masthead is now a full-VIEWPORT-width band living
   OUTSIDE .wrap (base.html) -- its own 32px edge gutter (not .wrap's
   centered-column gutter) is what puts the brand at the true viewport left
   edge on wide screens. brand-block and the nav are the band's two flex
   items: side-by-side when there's room, nav wrapping to its own row below
   the brand when there isn't (judgment call over a fixed breakpoint --
   flex-wrap handles every width from 375 to 1920 without a special case). */
header.masthead { width: 100%; box-sizing: border-box; padding: 20px 32px 14px;
  position: sticky;
  display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between;
  gap: 10px 32px; }
.brand-block { flex: 0 0 auto; }
.brand { font-size: 30px; font-weight: bold; letter-spacing: .01em; margin: 0; }
.brand-lockup { color: var(--ink); text-decoration: none; display: inline-block; }
.brand-fan { display: block; width: 120px; height: auto; margin: 0 auto; }
.brand-word { display: block; border-top: 3px solid var(--ink); /* the horizon */
              padding-top: 4px; line-height: 1.1; text-align: center; }
.brand .tm { font-size: 12px; color: var(--muted); font-weight: normal;
             font-family: var(--font-sans); text-transform: uppercase; letter-spacing: .08em; }
.tagline { color: var(--muted); font-size: 15px; margin: 2px 0 10px; }
.theme-switcher { position: absolute; top: 8px; right: 32px; z-index: 3;
  display: inline-grid; grid-template-columns: repeat(2,auto); padding: 2px;
  border: 1px solid var(--line); border-radius: 3px; background: var(--card); }
.theme-toggle { min-width: 48px; padding: 3px 8px; border: 0; border-radius: 2px;
  color: var(--muted); background: transparent; cursor: pointer;
  font: 700 10px ui-monospace, monospace; letter-spacing: .08em; text-transform: uppercase; }
.theme-toggle:hover, .theme-toggle:focus-visible { color: var(--ocean-mid); }
.theme-toggle[aria-pressed="true"] { color: #fff; background: var(--ocean-deep); }
/* Design D4 WS2 (nav by purpose): nav.primary is now a row of labeled
   .nav-group columns (Monitor / Investigate / Compare / Utility) instead of
   a flat list -- see base.html. Group gap replaces the old per-link
   margin-right; .nav-group-utility rides margin-left:auto so it drifts to
   the band's right edge whenever there's spare room (1920/1440), and simply
   sits after the other groups when there isn't (wrapped rows, narrow
   widths) -- no separate breakpoint needed. */
nav.primary { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 14px 32px;
              font-family: var(--font-sans); font-size: 13px; letter-spacing: .05em;
              text-transform: uppercase; }
.nav-group { display: flex; flex-direction: column; gap: 4px; }
.nav-group-utility { margin-left: auto; }
.nav-group-label { font-size: 11px; font-weight: 600; letter-spacing: .08em;
                    color: var(--label); }
.nav-group-links { display: flex; flex-wrap: wrap; gap: 4px 18px; }
nav.primary a { color: var(--ink); text-decoration: none; padding-bottom: 4px; }
nav.primary a:hover { color: var(--ocean-mid); }
nav.primary a.active { color: var(--ocean-deep); border-bottom: 2px solid var(--ocean-deep); }

h2 { font-size: 18px; margin: 36px 0 6px; border-bottom: 1px solid var(--line); padding-bottom: 6px; }
/* Design D4 WS4 (color-presence pass, operator: the palette "reads
   invisible" after D1-D3 -- err toward presence): every SECTION h2
   ("Watchlist", "Redemptions", "Compare funds", ...) gets a short
   ocean-deep leading rule via ::before -- a pseudo-element, so it adds no
   DOM/text node and cannot affect any text-content assertion.
   h2.fund-title (the giant Georgia fund-name heading, its own D1 scale
   step) is deliberately excluded: it isn't reading as a "section" the way
   the others are. */
h2:not(.fund-title)::before { content: ""; display: block; width: 36px; height: 3px;
    background: var(--ocean-deep); margin-bottom: 8px; }
h2.fund-title { font-size: 22px; }  /* fund name = its own scale step, distinct from a section h2 */
h3 { font-size: 13px; margin: 22px 0 8px; text-transform: uppercase; letter-spacing: .06em;
     color: var(--label); font-family: var(--font-sans); }
h4 { font-size: 15px; margin: 0 0 6px; }
a { color: var(--ocean-mid); }
/* Fund-name links keep the voice typeface even inside data tables/lists --
   every other cell (values, dates, labels) stays sans (see table rule below). */
.fund-link { font-family: var(--font-serif); }

/* Tables. D2 (docs/design_implementation_register.md, "Table families and
   complete census"): the old single global rule (incl. blanket zebra on every
   table) retires in favor of three named families layered on this shared
   base -- compact-data (dense numeric boards), evidence (citation-forward
   audit/reports/register tables), narrative-event (prose-forward logs). Zebra
   is now opt-in per family/row-count, not a global default (critique finding
   6: "the generic hover tint is more app-like than terminal-like"). */
table { border-collapse: collapse; width: 100%; font-size: 14px; font-family: var(--font-sans); }
th { text-align: left; border-bottom: 2px solid var(--ocean-deep); padding: 6px 10px 6px 0;
     font-size: 12px; text-transform: uppercase; letter-spacing: .05em;
     font-family: var(--font-sans); color: var(--label); }
td { border-bottom: 1px solid var(--line); padding: 8px 10px 8px 0; vertical-align: top; }
.num { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--font-sans); }
tr:hover td { background: var(--ocean-pale); }

/* table-scroll (shared contract): a focusable, labeled overflow wrapper for
   any table wide enough to need one. Exact breakpoint thresholds per family
   are D3 (docs/design_implementation_register.md Responsive/D3); this ships
   the always-available scoped-overflow structure the register's shared
   contracts call for now. */
.table-scroll { overflow-x: auto; }
.table-scroll:focus { outline: 2px solid var(--ocean-mid); outline-offset: 2px; }

/* compact-data: dense numeric board (watchlist/universe/compare/liquidity/
   portfolio-glance/fund redemptions/financing). Quiet rules, tabular numerals
   (inherited from .num), zebra only when a template opts in via .zebra
   (register: "optional zebra only >12 rows"). */
.table-compact th { font-size: 12px; }
/* HOTFIX (operator report, 2026-07-12): blanket nowrap on every cell forced
   prose columns (e.g. Notable recent development) to their unwrapped width,
   pushing dense boards far past the page and cutting them off. Nowrap now
   applies only to numeric/date cells; text columns wrap naturally. */
.table-compact td.num, .table-compact th, .table-compact td.nowrap { white-space: nowrap; }
.table-compact td.wrap { white-space: normal; }
.table-compact.zebra tr:nth-child(even) td { background: rgba(241, 237, 227, .35); }

/* evidence: citation-forward tables (audit_metric/audit_leverage/audit_return,
   Reports, fund ownership classes/term register/recent filings). The source/
   description column stays flexible width; identifier/date/value columns stay
   fixed-width via nowrap on .num cells (already tabular). Citation-card
   redesign itself (human-first Provenance) is D3; this D2 pass only assigns
   the family's alignment/rhythm/overflow. */
.table-evidence td, .table-evidence th { vertical-align: top; }
.table-evidence .num { white-space: nowrap; }

/* narrative-event: prose-forward event logs (Liquidity gating events,
   Portfolio position changes, Health findings, Review queue). Narrow date/
   status columns, the narrative column owns remaining width, no zebra ever. */
.table-narrative td, .table-narrative th { vertical-align: top; }
.table-narrative tr:nth-child(even) td { background: none; }
.table-narrative td:first-child, .table-narrative th:first-child { white-space: nowrap; width: 1%; }

/* Badges, banners, cards */
.badge { display: inline-block; font-family: var(--font-sans); font-size: 11px;
         font-weight: 700; padding: 1px 8px; border-radius: 3px;
         letter-spacing: .04em; border: 1px solid transparent; }
/* Severity calibration (D1): a filled badge is reserved for Urgent only.
   Notify and Digest become outline badges (border + tinted text, transparent
   background) so the truly actionable state keeps the strongest visual pull. */
.badge.Urgent { background: var(--urgent); color: #fff; border-color: var(--urgent); }
.badge.Notify { background: transparent; color: var(--notify); border-color: var(--notify); }
.badge.Digest { background: transparent; color: var(--ocean-mid); border-color: var(--ocean-mid); }
.badge.role { background: #e6ddcc; color: var(--muted); font-weight: 600; }
/* Gating badges (operator, iteration 10): two flat, consistent colors, no
   recency logic -- a distinct categorical system from severity, kept filled
   (D1 judgment call: these mark that a rationing/expansion EVENT occurred,
   not a graduated severity tier, so the "filled = Urgent only" rule for the
   Urgent/Notify/Digest trio is not read to apply to this separate family). */
.badge.gate-prorated { background: var(--urgent); color: #fff; }
.badge.gate-expanded { background: var(--chronic); color: #fff; }
.allclear { color: var(--good); font-weight: bold; }
.attention { color: var(--urgent); font-weight: bold; }
.neg { color: var(--urgent); font-weight: bold; }
.meta { font-size: 12px; color: var(--muted); font-family: var(--font-sans); }
.banner { border: 1px solid var(--line); border-left: 4px solid var(--good);
          background: var(--card); border-radius: 4px; padding: 12px 18px; margin: 20px 0; }
.banner.hot { border-left-color: var(--urgent); }

/* D2 box restraint (docs/design_implementation_register.md box inventory):
   .takeaways DISSOLVES from a bordered card into an open list -- its only
   remaining consumer is the dashboard's "Latest watchlist alerts" list (the
   fund page's own takeaways now live inside .status-panel, the one ordinary
   boxed fund-page region). No background/border/radius/shadow here anymore. */
.takeaways ol { margin: 6px 0; padding-left: 20px; font-size: 15px; }
.takeaways li { margin: 8px 0; }

/* status-panel (shared contract): the ONE ordinary boxed information region
   on the fund page -- current-assessment sentence, up to three takeaways, and
   the disclosure that holds the full current-finding records. Everything
   else that used to be a stat/takeaway/chart card dissolves into open
   structure below. */
.status-panel { background: var(--card); border: 1px solid var(--line); border-radius: 4px;
                padding: 14px 20px 16px; margin: 14px 0 20px; }
.status-panel h3 { margin: 0 0 4px; }
.status-panel .assessment-line { font-family: var(--font-serif); font-size: 15px; margin: 4px 0 8px; }
.status-panel ol.assessment-takeaways { margin: 8px 0 4px; padding-left: 20px; font-size: 15px; }
.status-panel ol.assessment-takeaways li { margin: 8px 0; }
.status-panel > details { margin-top: 10px; }

/* chart-figure (shared contract): <figure>+<figcaption>+SVG, replacing chart
   cards -- charts sit on the page ground like any other exhibit, separated by
   whitespace, not another bordered box. */
.charts { display: grid; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
          gap: 22px 28px; margin: 18px 0; }
/* Full-width stacked variant (operator, iteration 10): the portfolio-health
   charts are illegible at the 2-up grid width, so stack them one per row at the
   full content width where axis labels and lines read clearly. */
.charts.charts-stacked { grid-template-columns: 1fr; }
.chart-figure { margin: 0; }
/* Most chart-figures are a <figure>+<figcaption>; the liquidity fill-rate
   chart stays a <div><h4> (test_app.py's chart-scoping test locates it by
   its next-</div> boundary) -- both get identical caption styling. */
.chart-figure figcaption, .chart-figure h4 { margin: 0 0 4px; font-size: 13px;
    font-family: var(--font-sans); color: var(--label); font-weight: normal; }
.chart-figure svg { width: 100%; height: auto; display: block; }
.chart-figure .meta { margin: 4px 0 0; }

/* disclosure (shared contract): native <details> with a one-sentence summary,
   used for the "ordinary disclosures" step of D2 sequencing -- methodology,
   term register, recent filings, and similar subordinate evidence that stays
   fully present in the HTML but collapsed by default. Financing-explainer
   per-line reveal is a SEPARATE, D3-scoped interaction and does not use this
   class (docs/design_direction.md "the explainer decision": those paragraphs
   stay visible in D2). */
details.disclosure { margin: 10px 0; }
details.disclosure > summary { cursor: pointer; font-family: var(--font-sans); font-size: 13px;
                                 color: var(--ocean-mid); list-style: none; }
details.disclosure > summary::-webkit-details-marker { display: none; }
details.disclosure > summary::before { content: "\25B8\A0"; color: var(--muted); white-space: pre; }
details.disclosure[open] > summary::before { content: "\25BE\A0"; }
details.disclosure .disclosure-body { margin-top: 8px; }
details.disclosure .disclosure-body > :first-child { margin-top: 0; }

/* empty-state taxonomy (register: four causes -- nothing happened, not
   disclosed, not extracted, filter returned nothing). The first three read as
   plain quiet text (an honest gap is not an alarm); only the filter/error
   case keeps a light box, matching the box inventory's KEEP list. */
.empty-state { font-size: 13px; color: var(--muted); font-family: var(--font-sans); margin: 10px 0; }
.empty-state--filter { background: var(--tint); border: 1px solid var(--line); border-radius: 4px;
                         padding: 10px 16px; margin: 12px 0; }

details.hist > summary { cursor: pointer; color: var(--muted); font-size: 13px;
                          font-family: var(--font-sans); margin: 16px 0 6px; }
footer { margin-top: 48px; border-top: 1px solid var(--line); padding-top: 12px;
         font-size: 12px; color: var(--muted); font-family: var(--font-sans); }
input.filter { font-family: var(--font-sans); font-size: 13px; padding: 6px 10px;
               border: 1px solid var(--line); border-radius: 4px; width: 320px;
               margin: 8px 0; }

/* Explorer */
.explorer-form { background: var(--card); border: 1px solid var(--line); border-radius: 4px;
                 padding: 12px 16px; margin: 14px 0; }
.controls { display: flex; flex-wrap: wrap; gap: 16px; align-items: flex-end; }
.control label { display: block; font-family: var(--font-sans); font-size: 11px;
                 text-transform: uppercase; letter-spacing: .06em; color: var(--muted);
                 margin-bottom: 3px; }
.control select { font-family: var(--font-sans); font-size: 13px; padding: 6px 8px;
                  border: 1px solid var(--line); border-radius: 4px; background: #fff;
                  max-width: 360px; }
.control button { font-family: var(--font-sans); font-size: 13px; font-weight: 600;
                  letter-spacing: .04em; padding: 7px 18px; border: none; border-radius: 4px;
                  background: var(--ocean-deep); color: #fff; cursor: pointer; }
.control button:hover { background: var(--ocean-mid); }
/* input.filter's own 8px top/bottom margin (used elsewhere as a standalone
   search box, e.g. above an Explorer table) makes a .control box that wraps
   it taller than its select/button siblings; since .controls aligns items to
   the row's bottom (align-items: flex-end), the extra height pushed the
   whole label+input block upward relative to the asset-class/min-assets
   selects (operator-reported: "search sits higher"). Inside a .control the
   label already provides the gap, so the margin is redundant there. */
.control input.filter { margin: 0; }
.fund-picker { margin-top: 12px; }
.fund-picker > summary { cursor: pointer; font-family: var(--font-sans); font-size: 13px;
                          color: var(--ocean-mid); }
/* Universe filter-bar unification (operator feedback, July 12 2026): the
   sponsor multi-select is the same .fund-picker/<details> the Explorer/
   Liquidity/Portfolio/Alerts fund-picker macro uses (_chart_controls.html),
   but here it sits inside a .control box alongside search/asset-class/
   min-assets and needs the SAME control treatment (height, border, font) so
   the row reads as one filter surface -- scoped to ".control .fund-picker"
   (the shared macro's own <details> is never nested in a .control div, so
   this cannot touch those other pages) rather than editing the base
   .fund-picker rules above. */
.control .fund-picker { margin-top: 0; position: relative; }
/* Explicit height + flex-centered text on all 4 interactive boxes in the
   universe filter bar specifically (rather than relying on each element's
   native padding/line-height math to happen to agree) is what actually gets
   every .control's top edge to line up there: a plain <select>/<input>/
   <button> already render ~2px apart at this padding (a native cross-browser
   quirk, tolerated elsewhere on the site and not worth fighting more
   broadly), but <summary> has no comparable native sizing at all, so it
   needs the explicit height to land in that same band. Scoped to
   .universe-filters so /universe's row tightens up without changing the
   Explorer/Liquidity/Portfolio/Alerts .control rows (out of scope for this
   pass -- full design-language treatment comes with the v2 prototype). */
.universe-filters .control select, .universe-filters .control input.filter,
.universe-filters .control button, .universe-filters .control .fund-picker > summary {
  height: 33px; box-sizing: border-box;
}
.universe-filters .control button { display: inline-flex; align-items: center; justify-content: center; }
.control .fund-picker > summary {
  font-family: var(--font-sans); font-size: 13px; padding: 6px 8px;
  border: 1px solid var(--line); border-radius: 4px; background: #fff;
  color: var(--ink); min-width: 160px; max-width: 240px; list-style: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.universe-filters .control .fund-picker > summary { display: flex; align-items: center; }
.control .fund-picker > summary::-webkit-details-marker { display: none; }
.control .fund-picker[open] > summary { border-color: var(--ocean-mid); }
/* Absolute so opening the picker adds a floating panel instead of growing
   the .control flex item -- otherwise .controls' align-items: flex-end would
   re-flow every OTHER control downward the moment this one opens, undoing
   the row's alignment on interaction. */
.control .fund-picker .picker-groups {
  position: absolute; top: 100%; left: 0; z-index: 5; margin-top: 4px;
  background: var(--card); border: 1px solid var(--line); border-radius: 4px;
  padding: 10px; min-width: 260px; box-shadow: 0 2px 8px rgba(43, 39, 34, .12);
}
.picker-groups { display: flex; flex-wrap: wrap; gap: 24px; padding: 10px 4px; }
.picker-group h3 { margin: 4px 0 6px; }
label.pick { display: block; font-size: 13px; margin: 3px 0; cursor: pointer; }
label.pick-off { color: var(--muted); opacity: .65; cursor: not-allowed; }
label.pick input[data-group-select] { margin-right: 5px; }
.picker-group label.pick:has(input[data-group-select]) { border-bottom: 1px solid var(--line);
  padding-bottom: 4px; margin-bottom: 6px; }
.pick-select-all { font-weight: 600; }
.window-links { font-size: 12px; color: var(--muted); font-family: var(--font-sans); }
.window-links a { color: var(--ocean-mid); text-decoration: none; margin-right: 4px; }
.window-links a.on { color: var(--ocean-deep); font-weight: 700; text-decoration: underline; }
.window-links strong { color: var(--ocean-deep); }
/* fund-toolbar (register item 4: "One toolbar: window links, Compare with
   peers, watchlist action"): visually merges chart_controls.window_links'
   own <p> with the compare/watchlist line into a single row without touching
   that macro's markup contract. */
.fund-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 16px; margin: 6px 0 4px; }
.fund-toolbar .window-links, .fund-toolbar > p.meta { margin: 0; }
/* .hero: dashboard's dissolved hero row -- now just the Workbook download
   action beside the metric-strip (D2 box inventory: "Workbook becomes
   action"), not a row of stat cards. */
.hero { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin: 12px 0 6px; }
.btn { display: inline-block; font-family: var(--font-sans); font-size: 13px;
       font-weight: 600; letter-spacing: .04em; padding: 8px 18px; border-radius: 4px;
       background: var(--ocean-deep); color: #fff !important; text-decoration: none; }
.btn:hover { background: var(--ocean-mid); }
.btn.ghost { background: var(--card); color: var(--ocean-deep) !important; border: 1px solid var(--line); }
.btn.btn-sm { padding: 2px 10px; font-size: 11px; }

/* Iteration 4 polish */
.dim { color: var(--muted); font-size: 12px; font-weight: normal; font-family: var(--font-sans); }
.dim.micro, .micro { font-size: 11px; }
/* Iteration 5: auditable numbers -- quiet by default, obviously clickable on hover */
.audlink { color: inherit; text-decoration: none;
           border-bottom: 1px dotted rgba(93, 109, 126, .55); }
.audlink:hover { color: var(--ocean-mid); border-bottom-color: var(--ocean-mid); }
blockquote.meta { border-left: 3px solid var(--line); margin: 6px 0; padding: 4px 10px;
                  background: var(--tint); }
input.month { font-family: var(--font-sans); font-size: 13px; padding: 5px 6px;
              border: 1px solid var(--line); border-radius: 4px; background: #fff; }
.fund-picker summary a { font-weight: normal; }
/* D2 box restraint: the Compare "not charted, and why" card DISSOLVES into a
   disclosure (register box inventory: "Compare notshown card -> disclosure/
   empty state"); this list styling now lives inside details.disclosure's
   .disclosure-body instead of a standalone bordered card. */
.disclosure-body ul.reason-list { margin: 4px 0 0; padding-left: 18px; font-size: 12px;
                                    font-family: var(--font-sans); }
.disclosure-body ul.reason-list li { margin: 2px 0; color: var(--muted); }

/* citation-card (shared contract, D3 workstream 1 -- docs/design_implementation_
   register.md "Audit citations"): the human-first reveal next to every
   .audlink. A quiet inline "source" trigger (reuses details.disclosure's
   caret convention at a smaller scale) opens a small card: filing type +
   date first, the plain-language line description, an optional "why this
   source" basis note, method, links out, and the raw locator collapsed
   inside its own nested Technical-locator disclosure. Native <details> means
   click AND keyboard work with no script. */
details.citation-trigger { display: inline; margin-left: 6px; }
details.citation-trigger > summary { cursor: pointer; font-family: var(--font-sans);
    font-size: 11px; color: var(--muted); list-style: none; text-transform: uppercase;
    letter-spacing: .05em; }
details.citation-trigger > summary::-webkit-details-marker { display: none; }
details.citation-trigger > summary::before { content: "\25B8\A0"; white-space: pre; }
details.citation-trigger[open] > summary::before { content: "\25BE\A0"; }
details.citation-trigger > summary:hover { color: var(--ocean-mid); }
.citation-card { background: var(--card); border: 1px solid var(--line); border-radius: 4px;
    padding: 10px 14px; margin: 6px 0 4px; max-width: 480px;
    font-family: var(--font-sans); font-size: 12px; }
.citation-card p { margin: 5px 0; }
.citation-card p:first-child { margin-top: 0; }
.citation-card-head { color: var(--label); font-weight: 600; }
.citation-card-line { color: var(--ink); font-size: 13px; }
.citation-card .label { font-size: 11px; font-weight: 700; text-transform: uppercase;
    letter-spacing: .05em; color: var(--muted); }
.citation-card blockquote.meta { font-size: 12px; }
.citation-card-links a { margin-right: 2px; }
.citation-card-tech { margin-top: 6px; }
.citation-card-tech > summary { cursor: pointer; font-size: 11px; color: var(--muted); }
.citation-card-tech p { font-size: 11px; margin: 4px 0 0; }

/* Financing-explainer per-line reveal (D3 workstream 2, operator-ratified
   "the explainer decision": hover previews, click is the accessible
   fallback, full text preserved verbatim -- docs/design_direction.md). The
   trigger is a plain-reset <button> styled like .audlink (quiet dotted
   underline) so the line item keeps reading as prose, not a form control.
   `.fin-line:has(.fin-trigger:hover/:focus)` shows the body with NO script
   required at all -- a mouse hover or a keyboard Tab-to-focus both work with
   JS entirely disabled, and :has() means the trigger and its explain span
   don't need to be strict adjacent siblings (a citation link or punctuation
   may sit between them in reading order). The delegated listener in
   omnialts.js only adds click-to-persist (stays open after the pointer/
   focus leaves) and Escape-to-close on top of that already-working
   baseline, by toggling the `hidden` attribute directly. */
.fin-trigger { font: inherit; color: inherit; background: none; border: none; padding: 0;
    margin: 0; cursor: pointer; text-align: left;
    border-bottom: 1px dotted rgba(93, 109, 126, .55); }
.fin-trigger:hover, .fin-trigger:focus { color: var(--ocean-mid); border-bottom-color: var(--ocean-mid); }
.fin-explain { display: none; background: var(--tint); border-radius: 4px; padding: 8px 12px;
    margin: 6px 0 4px; font-family: var(--font-sans); font-size: 12px; color: var(--label); }
.fin-explain:not([hidden]) { display: block; }
.fin-line:has(.fin-trigger:hover) .fin-explain[hidden],
.fin-line:has(.fin-trigger:focus) .fin-explain[hidden] { display: block; }

/* Inline-style consolidation (D1, critique finding 10): a small, named
   utility vocabulary replacing one-off style="" attributes scattered through
   templates. Spacing utilities preserve each site's exact prior px value
   (zero visual regression); .measure/.breakable/.micro/.inline-form are
   reused verbatim across every template that needs them. */
.measure { max-width: 640px; }
.measure-narrow { max-width: 560px; }
.breakable { word-break: break-all; }
.inline-form { display: inline; }
.small { font-size: 13px; }  /* a de-emphasized inline note, e.g. a stat's parenthetical or fallback reason */
.mt-4 { margin-top: 4px; }
.mt-8 { margin-top: 8px; }
.mt-10 { margin-top: 10px; }
.mt-16 { margin-top: 16px; }
.mt-18 { margin-top: 18px; }
.mb-12 { margin-bottom: 12px; }

/* D3 responsive (finding 11; register "Responsive and print" breakpoint
   spec). Reduced motion respected throughout: every interactive reveal here
   is a plain display toggle, no transition/animation is declared anywhere
   in this file, so there is nothing to disable. */
ul.identity-list { list-style: none; margin: 4px 0 0; padding: 0; }
ul.identity-list li { display: inline; }
ul.identity-list li:not(:first-child)::before { content: " \00B7 "; }

/* nav-sections: forced open (script-free) at >=760px so desktop/tablet
   behavior is exactly the old flat nav row; a real collapsible <details>
   below that (register: "520-759: primary nav becomes semantic Sections
   disclosure" -- applied at the same 760px breakpoint as every other nav/
   control collapse below, since the register gives no separate nav rule for
   <520). */
details.nav-sections > summary { display: none; }
@media (min-width: 760px) {
  /* D4 WS2: nav.primary's own rule (above) now sets display:flex for the
     grouped-column layout; this override must match or the !important
     block display from the D3 invisible-nav hotfix would stack the groups
     even at desktop widths. */
  details.nav-sections > nav.primary { display: flex !important; }
}
@media (max-width: 759px) {
  details.nav-sections > summary { display: block; cursor: pointer; font-family: var(--font-sans);
      font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em;
      color: var(--ocean-deep); padding: 6px 0; list-style: none; }
  details.nav-sections > summary::-webkit-details-marker { display: none; }
  details.nav-sections > summary::before { content: "\2261\A0"; white-space: pre; }
  details.nav-sections[open] > nav.primary { display: block; padding-top: 4px; }
  /* Design D4 WS2: "update the mobile <details> collapse to show the same
     groups stacked" -- the desktop flex-row/flex-column group structure
     collapses to a plain block stack: each .nav-group full-width with its
     label above its links, both stacked, same as the pre-D4 flat list. */
  .nav-group { display: block; margin-bottom: 14px; }
  .nav-group:last-child { margin-bottom: 0; }
  .nav-group-utility { margin-left: 0; }
  .nav-group-label { display: block; margin-bottom: 4px; }
  .nav-group-links { display: block; }
  nav.primary a { display: block; margin: 0 0 12px; padding-bottom: 0; }
  nav.primary a.active { border-bottom: none; padding-left: 8px; border-left: 3px solid var(--ocean-deep); }
}

/* >=1080: charts two-up only with a genuine >=440px plot. */
@media (min-width: 1080px) {
  .charts { grid-template-columns: repeat(auto-fit, minmax(440px, 1fr)); }
}
/* 760-1079: charts stack (a 2-up grid has no room for a
   >=440px plot at this width); >4-column tables already scroll unconditionally
   via .table-scroll's overflow-x, so no extra rule is needed for that part. */
@media (min-width: 760px) and (max-width: 1079px) {
  .charts { grid-template-columns: 1fr; }
}
/* <760: charts stack; explorer/picker controls stack; narrative
   tables stack (register table-families spec: "stacks below 620px" -- this
   breakpoint is the nearest shared one and comfortably covers it). */
@media (max-width: 759px) {
  .charts { grid-template-columns: 1fr; }
  .controls { flex-direction: column; align-items: stretch; }
  .control select, .control button { max-width: none; width: 100%; }
  .control input.filter { width: 100%; }
  .picker-groups { flex-direction: column; gap: 14px; }
  /* Universe filter bar: the sponsor picker's floating panel (see the
     ".control .fund-picker" rules above) reverts to plain static flow at
     this width, full-width like every other stacked control, so it never
     overlaps content or overflows the narrow viewport. */
  .control .fund-picker { position: static; }
  .control .fund-picker > summary { max-width: none; width: 100%; }
  .control .fund-picker .picker-groups { position: static; box-shadow: none; margin-top: 8px; width: 100%; }
}
@media (max-width: 619px) {
  table.table-narrative, table.table-narrative thead, table.table-narrative tbody,
  table.table-narrative tr, table.table-narrative th, table.table-narrative td {
    display: block; width: 100%; }
  table.table-narrative thead { display: none; }
  table.table-narrative tr { border-bottom: 1px solid var(--line); padding: 8px 0; }
  table.table-narrative td { border-bottom: none; padding: 2px 0; white-space: normal; }
  table.table-narrative td:first-child { font-weight: 600; color: var(--label); }
}
/* <520: metadata list stacks (see ul.identity-list); 16px minimum page padding; wide tables keep their
   focus/keyboard region and get a persistent right-edge fade as a first-use
   "there is more here" hint (no JS/scroll-position tracking needed). */
@media (max-width: 519px) {
  .wrap { padding: 24px 16px 64px; }
  /* Design D4 WS1: keep the masthead's edge gutter matched to .wrap's at the
     narrowest tier so the brand and the content column below share the same
     left edge instead of the header looking "wider" than the page under it. */
  header.masthead { padding: 16px 16px 10px; }
  ul.identity-list li { display: block; margin: 2px 0; }
  ul.identity-list li:not(:first-child)::before { content: none; }
  .table-scroll { position: relative; }
  .table-scroll::after { content: ""; position: absolute; top: 0; right: 0; bottom: 0; width: 18px;
      background: linear-gradient(to right, transparent, var(--bg) 92%); pointer-events: none; }
  .charts { gap: 16px; }
  .picker-groups { gap: 10px; }
  .theme-switcher { right: 16px; }
}

/* -------------------------------------------------------------------------
   Night theme — approved inverted Shore treatment. Night is the markup and
   no-JavaScript default; .theme-day simply falls through to the Day tokens
   above. There are no transitions: switching is immediate and data remains
   visually stable.
   ------------------------------------------------------------------------- */
body.theme-night {
  --urgent: #c46a6a;
  --urgent-solid: #7a2e2e;
  --urgent-edge: #c46a6a;
  --notify: #d9b98a;
  --ocean-deep: #d9b98a;
  --ocean-mid: #d7e4e9;
  --ocean-pale: #0c3a55;
  --ink: #e7dcc6;
  --label: #f1e9da;
  --muted: #b9ab8d;
  --line: rgba(231,220,198,.2);
  --bg: #0f4c6e;
  --card: #082a3f;
  --good: #9fbd7f;
  --tint: rgba(231,220,198,.06);
  --chronic: #c88a55;
  --shore-paper: #0f4c6e;
  --shore-cream: #0c3a55;
  --shore-sand: #e7dcc6;
  --shore-line: rgba(231,220,198,.18);
  --shore-ink: #e7dcc6;
  --shore-muted: #b9ab8d;
  --shore-deep: #082a3f;
  --shore-ocean: #d7e4e9;
  --shore-ocean-mid: #d9b98a;
  --shore-mist: #d7e4e9;
  --shore-gold: #d9b98a;
  --shore-oxblood: #c46a6a;
  --ch-text: #e7dcc6;
  --ch-axis: #b9ab8d;
  --ch-line: rgba(231,220,198,.42);
  --ch-grid: rgba(231,220,198,.14);
  --ch-positive: #d7e4e9;
  --ch-negative: #c46a6a;
  --ch-primary: #d9b98a;
  --ch-secondary: #d7e4e9;
  --ch-reference: #c4a06a;
  --ch-halo: #0c3a55;
  --ch-series-1: #78b8d3; --ch-series-2: #e2a46f;
  --ch-series-3: #79c5b8; --ch-series-4: #d89aae;
  --ch-series-5: #e8c36c; --ch-series-6: #9acbe0;
  --ch-series-7: #c7a77b; --ch-series-8: #f1e9da;
  --ch-series-9: #a7b4bc; --ch-series-10: #c3a0de;
  --ch-series-11: #b9ab8d; --ch-series-12: #5bb2a4;
  --ch-series-13: #c46a6a; --ch-series-14: #72a7d6;
  color: #e7dcc6;
  background: #0f4c6e;
}
body.theme-night header.masthead { background: rgba(8,42,63,.97); border-bottom-color: rgba(231,220,198,.18); }
body.theme-night .theme-switcher { background: #082a3f; border-color: rgba(217,185,138,.45); }
body.theme-night .theme-toggle { color: #b9ab8d; }
body.theme-night .theme-toggle:hover, body.theme-night .theme-toggle:focus-visible { color: #f1e9da; }
body.theme-night .theme-toggle[aria-pressed="true"] { color: #082a3f; background: #d9b98a; }
body.theme-night .brand-lockup, body.theme-night .brand-word { color: #faf6ee; }
body.theme-night .brand-word { border-top-color: #e7dcc6; }
body.theme-night .brand .tm, body.theme-night .tagline { color: #b9ab8d; }
/* Night keeps the Day fan's deliberate pale/sand/ocean cadence.  The mirrored
   half starts on sand so the rotating wheel is seam-safe: the old selectors
   restarted on pale and could place two pale-blue slices side by side. */
body.theme-night .brand-fan .fan-rays > path:nth-child(1),
body.theme-night .brand-fan .fan-rays > path:nth-child(7) { fill: #d7e4e9; }
body.theme-night .brand-fan .fan-rays > path:nth-child(2),
body.theme-night .brand-fan .fan-rays > path:nth-child(4),
body.theme-night .brand-fan .fan-rays > path:nth-child(6) { fill: #d9b98a; }
body.theme-night .brand-fan .fan-rays > path:nth-child(3),
body.theme-night .brand-fan .fan-rays > path:nth-child(5) { fill: #1a6a96; }
body.theme-night .brand-fan .fan-rays > g path:nth-child(odd) { fill: #d9b98a; }
body.theme-night .brand-fan .fan-rays > g path:nth-child(even) { fill: #1a6a96; }
body.theme-night .brand-fan > path { fill: #e7dcc6; }
body.theme-night nav.primary a { color: #d7e4e9; }
body.theme-night nav.primary a:hover, body.theme-night nav.primary a.active { color: #d9b98a; }
body.theme-night nav.primary a.active { border-bottom-color: #d9b98a; }
body.theme-night .nav-group-label { color: #b9ab8d; }
body.theme-night h1, body.theme-night h2, body.theme-night .dash-hero h1,
body.theme-night .audit-heading, body.theme-night .fund-section-head h2,
body.theme-night .methodology-prose > h3, body.theme-night .error-shore h1 { color: #faf6ee; }
body.theme-night .dash-deck, body.theme-night .fund-section-head p { color: #b9ab8d; }
body.theme-night .shore-eyebrow, body.theme-night .fund-section-head > span { color: #d9b98a; border-color: #d9b98a; }
body.theme-night .horizon-band .horizon-sky { background: #d7e4e9; }
body.theme-night .horizon-band .horizon-ocean { background: #082a3f; }
body.theme-night .horizon-band .horizon-sand { background: #d9b98a; }

body.theme-night table, body.theme-night .fund-table { color: #e7dcc6; background: #082a3f; }
body.theme-night th,
body.theme-night .fund-table th,
body.theme-night .table-compact table th,
body.theme-night table.table-narrative th { color: #082a3f; background: #e7dcc6; border-color: rgba(8,42,63,.24); }
body.theme-night td,
body.theme-night .fund-table td,
body.theme-night .table-compact table td,
body.theme-night table.table-narrative td { border-color: rgba(231,220,198,.16); }
body.theme-night .fund-table tbody tr:nth-child(even),
body.theme-night .table-compact table tbody tr:nth-child(even),
body.theme-night table.table-narrative tbody tr:nth-child(even),
body.theme-night .table-compact.table-zebra tbody tr:nth-child(even) td,
body.theme-night .table-evidence.table-zebra tbody tr:nth-child(even) td { background: rgba(231,220,198,.05); }
body.theme-night tr:hover td { background: rgba(215,228,233,.09); }
body.theme-night table.table-narrative tr:nth-child(even) td { background: none; }

body.theme-night input.filter, body.theme-night input.month,
body.theme-night .control select, body.theme-night .control .fund-picker > summary {
  color: #e7dcc6; background: #0c3a55; border-color: rgba(231,220,198,.24);
}
body.theme-night input::placeholder { color: #8d9aa5; }
body.theme-night .control button, body.theme-night .btn { color: #082a3f !important; background: #d9b98a; }
body.theme-night .control button:hover, body.theme-night .btn:hover { background: #c4a06a; }
body.theme-night .btn.ghost { color: #e7dcc6 !important; background: #082a3f; border-color: rgba(231,220,198,.22); }
body.theme-night .badge.Urgent, body.theme-night .badge.gate-prorated,
body.theme-night .fund-alert.urgent .fund-alert-type { color: #faf6ee; background: #7a2e2e; border-color: #7a2e2e; }
body.theme-night .badge.role { color: #b9ab8d; background: rgba(231,220,198,.08); }
body.theme-night .banner.hot, body.theme-night .shore-banner.hot { border-left-color: #c46a6a; }

body.theme-night.fund-page, body.theme-night.error-page { color: #e7dcc6; background: #0f4c6e; }
body.theme-night .fund-contextbar { color: #b9ab8d; background: #082a3f; border-color: rgba(231,220,198,.18); }
body.theme-night .fund-hero { background: #0f4c6e; }
body.theme-night .fund-identity { color: #2b2722; background: #f4eddd; }
body.theme-night .fund-identity h1 { color: #2b2722; }
body.theme-night .fund-identity .fund-deck { color: #5f584d; }
body.theme-night .fund-identity .shore-eyebrow { color: #8a5a0e; }
body.theme-night .fund-chips span { color: #faf6ee; background: #082a3f; border-color: #082a3f; }
body.theme-night .fund-hero-meta dt { color: #6f6557; }
body.theme-night .fund-hero-meta dd { color: #2b2722; }
body.theme-night .fund-stat-strip, body.theme-night .fund-health-strip { color: #e7dcc6; background: #082a3f; border-color: rgba(231,220,198,.18); }
body.theme-night .fund-stat-strip > div, body.theme-night .fund-health-strip > div { border-color: rgba(231,220,198,.18); }
body.theme-night .fund-stat-strip dt, body.theme-night .fund-stat-strip small,
body.theme-night .fund-health-strip dt { color: #b9ab8d; }
body.theme-night .fund-stat-strip dd, body.theme-night .fund-health-strip dd { color: #f1e9da; }
body.theme-night .fund-stat-strip dd.neg, body.theme-night .fund-page .neg,
body.theme-night .fund-urgent-label { color: #c46a6a; }
body.theme-night .shore-banner, body.theme-night .fund-empty,
body.theme-night .fund-alert, body.theme-night .fund-chart-card { color: #e7dcc6; background: #0c3a55; border-color: rgba(231,220,198,.18); }
body.theme-night .fund-alert { border-left: 3px solid #c4a06a; }
body.theme-night .fund-alert.urgent { border-left-color: #c46a6a; }
body.theme-night .fund-alert p, body.theme-night .fund-chart-card figcaption span { color: #b9ab8d; }
body.theme-night .fund-alert-type { color: #d9b98a; border-color: #c4a06a; }
body.theme-night .fund-chart-card figcaption, body.theme-night .fund-page .disclosure > summary,
body.theme-night .fund-evidence-lines p, body.theme-night .fund-evidence-line { color: #e7dcc6; background: #082a3f; }
body.theme-night .chart-lightbox-box { color: #e7dcc6; background: #0c3a55; border-color: rgba(231,220,198,.22); }
body.theme-night .fund-class-stack { background: #0c3a55; border-color: rgba(231,220,198,.2); }
body.theme-night .fund-class-legend { color: #b9ab8d; }
body.theme-night .error-shore > div > p { color: #e7dcc6; }

/* Night cards and explanatory regions on non-fund surfaces. */
body.theme-night .banner, body.theme-night .status-panel, body.theme-night .explorer-form,
body.theme-night .citation-card, body.theme-night .control .fund-picker .picker-groups {
  color: #e7dcc6; background: #082a3f; border-color: rgba(231,220,198,.2);
}
body.theme-night blockquote.meta, body.theme-night .fin-explain,
body.theme-night .empty-state--filter { background: rgba(231,220,198,.06); }
body.theme-night .citation-card-line { color: #e7dcc6; }
body.theme-night .chart-figure svg { color: #e7dcc6; }

/* D3 print (finding 15 remainder; register "Responsive and print" print-memo
   spec): a printed page should read like a finished research memo -- a
   repeating header/footer, generous but controlled page breaks, every
   disclosure expanded (there is no reader to click "reveal" on paper), and
   status that survives grayscale by its own label text, not color alone. */
.print-header, .print-source { display: none; }
@page { margin: 1.7cm 1.5cm; }
@page landscape-audit { size: landscape; }
@media print {
  /* Printing is always the Day research-memo treatment, regardless of the
     reader's saved screen theme. Re-declare the semantic tokens on body so
     SVG charts and every component inherit Day paint as well. */
  body, body.theme-night, body.theme-day {
    --urgent: #7d2733; --urgent-solid: #7a2e2e; --urgent-edge: #7a2e2e;
    --notify: #8a5a0e; --ocean-deep: #114a6d; --ocean-mid: #1a6a96;
    --ocean-pale: #d7e4e9; --ink: #2b2722; --label: #5f584d;
    --muted: #857f74; --line: #d3c9b6; --bg: #ece5d8; --card: #f6f1e7;
    --shore-paper: #faf6ee; --shore-cream: #f4eddd; --shore-sand: #e7dcc6;
    --shore-line: #d9cdb4; --shore-ink: #2b2722; --shore-muted: #6f6557;
    --shore-deep: #082a3f; --shore-ocean: #0f4c6e; --shore-ocean-mid: #1a6a96;
    --shore-gold: #d9b98a; --shore-oxblood: #7a2e2e;
    --ch-text: #2b2722; --ch-axis: #857f74; --ch-line: #d3c9b6;
    --ch-grid: #e6e2d8; --ch-positive: #4c6b2f; --ch-negative: #7a2e2e;
    --ch-primary: #1a6a96; --ch-secondary: #0f4c6e; --ch-reference: #8a5a0e;
    --ch-halo: #fff;
    color: #2b2722 !important; background: #fff !important;
  }
  /* Header/footer. position:fixed on a print stylesheet repeats the element
     on every printed page in Chromium/most engines; browsers that don't
     support it simply print it once at the top of page 1 instead of not at
     all, a safe degrade. */
  .print-header { display: block; position: fixed; top: 0; left: 0; right: 0;
      border-bottom: 1px solid #000; padding: 4px 0 6px; margin-bottom: 8px;
      font-family: var(--font-sans); font-size: 9px; color: #000; background: #fff; }
  .print-header .print-asof { float: right; }
  body { padding-top: 34px; }
  .print-source { display: block; word-break: break-all; }
  @page { @bottom-right { content: "Page " counter(page) " of " counter(pages); font-size: 9px; } }
  body.print-landscape { page: landscape-audit; }

  /* Hide nav/forms/actions -- nothing on paper can submit a GET form or
     click a toggle, so every control disappears; the data it would have
     filtered is not affected (server already rendered the current selection). */
  nav.primary, details.nav-sections > summary, .theme-switcher, .explorer-form, .btn, footer form,
  .fund-toolbar form, .window-links, .fund-picker, input.filter, .controls,
  button:not(.fin-trigger) { display: none; }

  /* Expand every disclosure -- current findings, methodologies, financing
     explainers, citation excerpts, terms and filings -- there is no
     interaction on paper, so nothing should stay collapsed. Native <details>
     content past `open` is a normal (overridable) UA style rule per the
     HTML standard; nav-sections is excluded since its content (nav.primary)
     is hidden outright above. */
  details:not(.nav-sections):not([open]) > *:not(summary) { display: block !important; }
  details > summary { cursor: default; }
  details.citation-trigger > summary::before, details.disclosure > summary::before,
  details.citation-card-tech > summary::before { content: ""; }
  .fin-explain[hidden] { display: block !important; }

  /* Avoid breaks inside status/alert/citation/chart. */
  .status-panel, .citation-card, .chart-figure,
  .banner, table tr { break-inside: avoid; page-break-inside: avoid; }

  /* Status survives grayscale by rule/label, not color alone: the badge/neg
     TEXT already carries the meaning ("Urgent", "prorated", a signed
     number); this adds a non-color reinforcement so severity is legible
     even if a printer renders every ink as the same gray. */
  .badge.Urgent { text-decoration: underline; font-weight: 800; }
  .neg, .attention { text-decoration: underline; }

  body { background: #fff; }
  table, .status-panel { box-shadow: none; }
}
