/* Self-hosted fonts (no external dependencies). DESIGN.md §typography is the
   canonical role split. Doto + Space Mono were originally a Nothing-design
   bounded experiment (2026-04-25) that grew page-wide; blessed and self-hosted
   on 2026-04-27 to drop the fonts.googleapis.com runtime dependency (network
   drag + privacy + brittle CDN coupling). */
@font-face { font-family: 'Lato'; src: url('/static/cw/fonts/lato-300.woff2') format('woff2'); font-weight: 300; font-display: swap; font-style: normal; }
@font-face { font-family: 'Lato'; src: url('/static/cw/fonts/lato-400.woff2') format('woff2'); font-weight: 400; font-display: swap; font-style: normal; }
@font-face { font-family: 'Lato'; src: url('/static/cw/fonts/lato-700.woff2') format('woff2'); font-weight: 700; font-display: swap; font-style: normal; }
@font-face { font-family: 'Fira Code'; src: url('/static/cw/fonts/firacode-400.woff2') format('woff2'); font-weight: 400 700; font-display: swap; font-style: normal; }
@font-face { font-family: 'Switzer'; src: url('/static/cw/fonts/switzer-400.woff2') format('woff2'); font-weight: 400; font-display: swap; font-style: normal; }
@font-face { font-family: 'Switzer'; src: url('/static/cw/fonts/switzer-500.woff2') format('woff2'); font-weight: 500; font-display: swap; font-style: normal; }
@font-face { font-family: 'Switzer'; src: url('/static/cw/fonts/switzer-600.woff2') format('woff2'); font-weight: 600; font-display: swap; font-style: normal; }
@font-face { font-family: 'Switzer'; src: url('/static/cw/fonts/switzer-700.woff2') format('woff2'); font-weight: 700; font-display: swap; font-style: normal; }
@font-face { font-family: 'Switzer'; src: url('/static/cw/fonts/switzer-800.woff2') format('woff2'); font-weight: 800; font-display: swap; font-style: normal; }
/* Doto: dot-matrix display face for hero numerals (composite score, fear/greed,
   heat thermometer). Variable woff2 — same file serves 400/500/700; browser
   interpolates the weight axis. Latin subset only (English-only dashboard). */
@font-face { font-family: 'Doto'; src: url('/static/cw/fonts/doto-400.woff2') format('woff2'); font-weight: 400 700; font-display: swap; font-style: normal; }
/* Space Mono: panel-head display face (ALL CAPS labels) and BTC-price chip. */
@font-face { font-family: 'Space Mono'; src: url('/static/cw/fonts/space-mono-400.woff2') format('woff2'); font-weight: 400; font-display: swap; font-style: normal; }
@font-face { font-family: 'Space Mono'; src: url('/static/cw/fonts/space-mono-700.woff2') format('woff2'); font-weight: 700; font-display: swap; font-style: normal; }

  :root {
    --bg: #0b0e14;
    --bg-panel: #141821;
    --bg-panel-2: #1a1f2c;
    --border: #242938;
    --text: #e6e8ef;
    --text-dim: #8a92a8;

    /* Cryptowatch brand palette (from 2018 brand guide) */
    --brand-neon-blue:  #507DFC;   /* primary, 90% usage */
    --brand-maya-blue:  #7498FD;   /* secondary */
    --brand-aquamarine: #50FCD1;   /* accent — vivid mint */
    --brand-sky-blue:   #8BDBEC;
    --brand-ship-gray:  #313A3D;
    --brand-charcoal:   #3C5266;

    /* semantic — remapped to brand */
    --blue:   #507DFC;   /* Neon Blue */
    --cyan:   #50FCD1;   /* Aquamarine */
    --purple: #7498FD;   /* Maya Blue */

    /* P&L semantics — rebranded to harmonize with the blue/mint palette.
       Positive uses Aquamarine (native brand mint). Negative uses a warm
       rose that complements the neon-blue without clashing (brand has no red). */
    --green:  #50FCD1;     /* Aquamarine — was #50FCD1 */
    --red:    #FF5E7F;     /* Brand-harmonized rose — was #FF5E7F */
    --yellow: #FFD166;     /* Warmer yellow that sits with the cool palette */
    --orange: #FF9457;     /* Softer orange */

    --font-display: 'Switzer', ui-sans-serif, system-ui, sans-serif;
    --font-body:    'Lato', ui-sans-serif, system-ui, sans-serif;
    --mono: 'Fira Code', ui-monospace, "SF Mono", "Menlo", "Monaco", "Consolas", monospace;
    --gold: #F59E0B;
    --gold-dim: rgba(245,158,11,0.15);

    /* DESIGN.md motion tokens — ship the signature easing + duration scale.
       Previously the spec values were hardcoded inline (0.9s cubic-bezier(0.16,1,0.3,1))
       in ~7 places without a token, so "change the signature motion" meant a
       global find-replace. Tokens let one edit ripple. 2026-04-24. */
    --dur-instant:       120ms;
    --dur-fast:          200ms;
    --dur-base:          300ms;
    --dur-slow:          600ms;
    --dur-data-reveal:   900ms;   /* KPI tick-ups, gauge fills, progress settle */
    --ease-out:          cubic-bezier(0, 0, 0.2, 1);
    --ease-in:           cubic-bezier(0.4, 0, 1, 1);
    --ease-in-out:       cubic-bezier(0.4, 0, 0.2, 1);
    --ease-data-reveal:  cubic-bezier(0.16, 1, 0.3, 1);   /* signature */

    /* Aliases for legacy/imported CSS that referenced names which were never
       declared at :root. Each one was silently falling through to the inline
       fallback value in `var(--x, #fallback)` calls. Aliasing them to the
       canonical token means a single edit to the canonical token now ripples
       everywhere — and any new alias use without a fallback won't render
       blank. (2026-04-27 design-review hardening.) */
    --panel-bg:     var(--bg-panel);
    --panel-border: var(--border);
    --muted:        var(--text-dim);
    --text-strong:  var(--text);
    --fg-muted:     var(--text-dim);
    --aqua:         var(--brand-aquamarine);
    --rose:         var(--red);
    --positive:     var(--green);
    --negative:     var(--red);
    --font-sans:    var(--font-body);

    /* DESIGN.md § Layout § Spacing — base unit 4px, all spacing snaps to this scale.
       2026-05-01 (F8 design-audit residual): tokens declared so future panels
       can use `var(--sp-*)` instead of raw px. The first-pass migration of
       padding/margin/gap exact-match values landed in the same commit; off-scale
       values (5/7/11/13px etc.) are still raw and tagged as drift. */
    --sp-2xs:  2px;   /* icon-to-text inside tight pills */
    --sp-xs:   4px;   /* inline gaps, pill padding y */
    --sp-sm:   8px;   /* standard inline gaps, button padding y */
    --sp-md:  12px;   /* panel internal padding (compact), row gap */
    --sp-lg:  16px;   /* panel padding (default), section gap */
    --sp-xl:  24px;   /* section break, dashboard grid gap */
    --sp-2xl: 32px;   /* major section separator */
    --sp-3xl: 48px;   /* page top padding, hero breathing room */
    --sp-4xl: 96px;   /* desk landing-page hero whitespace, full-width section breaks */

    /* DESIGN.md § Shapes — radius scale */
    --r-xs:    2px;   /* pill stems, tiny inline badges, legend swatches */
    --r-sm:    4px;   /* inputs, small buttons, inline tags, small KPI cards */
    --r-md:    6px;   /* cards, panels, medium buttons, chart containers */
    --r-lg:   10px;   /* hero panels, modals, feature promo cards */
    --r-pill: 999px;  /* live-pulse dots, full pills, progress bar ends */

    /* DESIGN.md § Typography § Type scale — pick from these only */
    --fs-mono-xs:      9px;
    --fs-mono-sm:     10px;
    --fs-mono:        11px;
    --fs-body-sm:     12px;
    --fs-body:        13px;   /* base body */
    --fs-body-lg:     14px;
    --fs-ui:          16px;
    --fs-ui-lg:       18px;
    --fs-display-sm:  20px;
    --fs-display-md:  24px;   /* added 2026-05-02: cw_desk hero numerals + section heads */
    --fs-display:     28px;
    --fs-display-hero: 48px;
  }

  /* DESIGN.md § Accessibility — brand focus ring */
  :focus { outline: none; }
  :focus-visible {
    outline: 2px solid var(--blue);
    outline-offset: 2px;
    border-radius: inherit;
  }

  /* DESIGN.md § Accessibility — respect prefers-reduced-motion */
  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }

  * { box-sizing: border-box; margin: 0; padding: 0; }
  html { background: var(--bg); color-scheme: dark; }
  html, body {
    color: var(--text);
    font: 13px/1.5 var(--font-body);
    -webkit-font-smoothing: antialiased;
  }
  body {
    padding:
      max(var(--sp-lg), env(safe-area-inset-top))
      max(var(--sp-lg), env(safe-area-inset-right))
      max(var(--sp-lg), env(safe-area-inset-bottom))
      max(var(--sp-lg), env(safe-area-inset-left));
    max-width: 1600px; margin: 0 auto;
    position: relative;
    min-height: 100vh;
  }

  /* Supergraphic pattern — fixed in the page background (below all content).
     Two rotated-square clusters inspired by the brand guide's cover / identity
     spreads: top-right mint/neon-blue cluster, bottom-left sky-blue accent.
     Low opacity so data stays readable, pointer-events: none so it's non-interactive. */
  body::before {
    content: '';
    position: fixed; inset: 0; z-index: -1;
    pointer-events: none;
    background-color: var(--bg);
    background-image:
      /* bottom-left soft sky cluster */
      radial-gradient(
        ellipse 620px 520px at -8% 108%,
        rgba(139, 219, 236, 0.10) 0%,
        rgba(139, 219, 236, 0) 60%
      ),
      /* top-right mint cluster */
      radial-gradient(
        ellipse 700px 600px at 112% -12%,
        rgba(80, 252, 209, 0.10) 0%,
        rgba(80, 252, 209, 0) 60%
      ),
      /* center neon glow */
      radial-gradient(
        ellipse 900px 700px at 50% 50%,
        rgba(80, 125, 252, 0.05) 0%,
        rgba(80, 125, 252, 0) 65%
      );
  }
  body::after {
    content: '';
    position: fixed;
    top: -120px; right: -160px;
    width: 520px; height: 520px;
    z-index: -1;
    pointer-events: none;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 520 520'><g opacity='0.08'><rect x='270' y='60' width='130' height='130' fill='%23507DFC' transform='rotate(45 335 125)'/><rect x='370' y='120' width='130' height='130' fill='%2350FCD1' transform='rotate(45 435 185)'/><rect x='200' y='160' width='130' height='130' fill='%238BDBEC' transform='rotate(45 265 225)'/><rect x='300' y='220' width='130' height='130' fill='%237498FD' transform='rotate(45 365 285)'/></g></svg>");
    background-size: contain;
    background-repeat: no-repeat;
  }

  /* Display font on headings + nav — brand requires Klavika (paid);
     Switzer is a modern grotesque from Fontshare (free, OFL, self-hostable) */
  h1, h2, h3, h4 { font-family: var(--font-display); letter-spacing: 0.01em; }

  header.topbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 0;
    padding-bottom: 14px;
    border-bottom: 1px solid var(--border);
  }
  header.topbar .brand {
    display: flex; align-items: center; gap: 14px;
  }
  /* Full CRYPTOWATCH wordmark (1288x165) — sized so the W icon reads ~34px tall */
  header.topbar .brand-logo {
    height: 32px; width: auto; display: block;
    filter: drop-shadow(0 0 14px rgba(80, 125, 252, 0.2));
  }
  /* "MACRO" product-name divider that pairs with the wordmark */
  header.topbar .brand-divider {
    width: 1px; height: 26px;
    background: linear-gradient(180deg, transparent, var(--brand-neon-blue), transparent);
  }
  header.topbar .brand-product {
    font-family: var(--font-display);
    font-size: var(--fs-ui-lg);
    font-weight: 600;
    letter-spacing: 0.28em;
    text-transform: uppercase;
    color: var(--brand-aquamarine);
    line-height: 1;
  }
  /* Surface-switch nav — Macro ↔ Hunter. Sits in the left brand block
     so both product surfaces appear side-by-side as peers, not a hidden
     link in the topbar-right utility area. */
  header.topbar .surface-nav {
    display: flex;
    gap: 10px;
    margin-left: 20px;
    padding-left: 20px;
    border-left: 1px solid var(--border);
    font-family: var(--mono);
    font-size: var(--fs-mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
  }
  header.topbar .surface-nav a {
    color: var(--text-dim);
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    min-height: 32px;
    padding: var(--sp-2xs) 6px;
    border-radius: var(--r-sm);
    transition: color 140ms ease-out, background 140ms ease-out;
  }
  header.topbar .surface-nav a:hover { color: var(--text); background: rgba(255,255,255,0.04); }
  header.topbar .surface-nav a.active {
    color: var(--brand-aquamarine);
    background: rgba(80, 252, 209, 0.06);
  }
  header.topbar .brand-docs-link {
    margin-left: 14px;
    padding: var(--sp-xs) 10px;
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--text-dim);
    text-decoration: none;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    transition: all 0.15s;
  }
  header.topbar .brand-docs-link:hover {
    color: var(--cyan);
    border-color: var(--cyan);
    background: rgba(80,252,209,0.06);
  }
  @media (max-width: 768px) {
    header.topbar .brand-docs-link { font-size: var(--fs-mono-xs); padding: 3px var(--sp-sm); margin-left: var(--sp-sm); }
  }
  /* Keep h1 class for screen readers / compatibility but hide visually
     since the logo image already contains CRYPTOWATCH */
  .sr-only,
  header.topbar h1.sr-only {
    position: absolute; width: 1px; height: 1px;
    padding: 0; margin: -1px; overflow: hidden;
    clip: rect(0,0,0,0); white-space: nowrap; border: 0;
  }
  /* Secondary nav (Track Record / Ledger / Docs / Changelog). Case +
     letter-spacing match .surface-nav so the two nav groups read as one
     visual row. A vertical border-left acts as the divider between
     primary (product surfaces) and secondary (accountability + reference)
     so users see two clear groups rather than one running blob. */
  .nav-links {
    display: flex; gap: var(--sp-md); font-size: var(--fs-mono); font-family: var(--mono);
    padding-left: var(--sp-lg); margin-left: var(--sp-xs);
    border-left: 1px solid var(--border);
    text-transform: uppercase; letter-spacing: 0.08em;
  }
  .nav-links a {
    color: var(--text-dim);
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    min-height: 32px;
    padding: var(--sp-2xs) 6px;
    border-radius: var(--r-sm);
    transition: color 140ms ease-out, background 140ms ease-out;
  }
  .nav-links a:hover { color: var(--text); background: rgba(255,255,255,0.04); }
  .nav-links a.active { color: var(--cyan); background: rgba(80, 252, 209, 0.06); }
  /* Touch target minimum (DESIGN.md a11y §line 401) */
  .screen-pill { min-height: 32px !important; }
  .topbar button, .topbar a, .tm-trigger { min-height: 32px; }
  .status-strip {
    display: flex; gap: var(--sp-md); font-size: var(--fs-mono);
    font-family: var(--mono); color: var(--text-dim);
  }
  .status-strip .dot {
    display: inline-block; width: 8px; height: 8px;
    border-radius: 50%; background: var(--text-dim);
    margin-right: var(--sp-xs); vertical-align: middle;
  }
  .status-strip .dot.ok { background: var(--green); }
  .status-strip .dot.err { background: var(--red); }

  /* Time machine controls */
  .topbar-controls {
    display: flex; align-items: center; gap: var(--sp-lg);
    flex-wrap: wrap;
  }
  .time-machine { position: relative; }
  /* 2026-05-05 (Round 9 P1-8 follow-up): bump visibility — the audit
     thought no time-travel UI existed because the trigger was easy to
     miss in the topbar. Aqua-tinted background + visible "AS-OF" prefix
     turn the button into a clear affordance. */
  .tm-trigger {
    position: relative;
    display: inline-flex; align-items: center; gap: 6px;
    background: linear-gradient(135deg, rgba(80, 252, 209, 0.14), rgba(80, 252, 209, 0.06));
    border: 1px solid rgba(80, 252, 209, 0.55);
    color: var(--cyan);
    padding: var(--sp-xs) 12px;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    text-transform: uppercase; letter-spacing: 0.08em;
    font-weight: 700;
    cursor: pointer; border-radius: var(--r-sm);
    transition: all 0.15s;
    box-shadow: 0 0 0 1px rgba(80, 252, 209, 0.10);
  }
  .tm-trigger:hover {
    border-color: var(--cyan); background: rgba(80,252,209,0.18);
    box-shadow: 0 0 0 1px rgba(80, 252, 209, 0.35);
  }
  .tm-trigger:focus-visible {
    outline: 2px solid var(--cyan); outline-offset: 2px;
  }
  /* "NEW" badge removed — Time Machine shipped 2026-04 and is no longer new */
  .tm-trigger .tm-tick { font-size: var(--fs-mono); }
  /* position:fixed (not absolute) so .cw-nav-inner's overflow-x:auto
     doesn't clip the popover — same fix used by .jump-menu. JS sets
     top/left from the trigger rect on open. Mobile's @media block at
     ~7786 overrides with position:fixed !important + centered modal.
     max-width + flex-wrap keeps the popover compact (date row + preset
     row) so it stays visually anchored to the trigger; without the cap,
     `white-space: nowrap` made it ~1100px wide and the right-aligned
     left edge ended up halfway across the page. */
  .tm-popover {
    position: fixed; top: 0; left: 0;
    display: none; align-items: center; gap: 10px;
    flex-wrap: wrap;
    max-width: 380px;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    padding: var(--sp-md) 14px;
    border: 1px solid rgba(80, 252, 209, 0.35);
    background: var(--bg-panel);
    border-radius: var(--r-md);
    box-shadow: 0 12px 32px rgba(0,0,0,0.55);
    z-index: 100;
  }
  /* Either selector wins — `.tm-popover.is-open` covers the portaled-to-body
     case where the popover is no longer a descendant of `.time-machine`. */
  .time-machine.is-open .tm-popover,
  .tm-popover.is-open { display: flex; }
  .time-machine.is-open .tm-trigger { border-color: var(--cyan); background: rgba(80,252,209,0.08); }
  .tm-popover .tm-hint {
    color: var(--text-dim); font-size: var(--fs-mono-xs);
    letter-spacing: 0.03em;
  }
  .tm-popover .tm-input {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    color: var(--text); padding: var(--sp-xs) var(--sp-sm);
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    border-radius: var(--r-sm);
    color-scheme: dark;
  }
  .tm-popover .tm-btn {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    color: var(--text-dim); padding: var(--sp-xs) 10px;
    font-family: var(--mono); font-size: var(--fs-mono-xs);
    text-transform: uppercase; letter-spacing: 0.06em;
    cursor: pointer; border-radius: var(--r-sm);
    transition: all 0.15s;
  }
  .tm-popover .tm-btn:hover { color: var(--blue); border-color: var(--blue); }
  .tm-popover .tm-btn.primary {
    color: var(--cyan); border-color: var(--cyan);
    background: rgba(80,252,209,0.08);
  }
  .tm-popover .tm-presets { display: flex; gap: var(--sp-xs); flex-wrap: wrap; }
  .tm-popover .tm-presets button {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    color: var(--text-dim); padding: 3px var(--sp-sm);
    font-family: var(--mono); font-size: var(--fs-mono-xs);
    cursor: pointer; border-radius: var(--r-xs);
    transition: all 0.15s;
  }
  .tm-popover .tm-presets button:hover { color: var(--blue); border-color: var(--blue); }
  @media (max-width: 768px) {
    .topbar-controls { width: 100%; justify-content: space-between; }
    .tm-popover { right: auto; left: 0; flex-wrap: wrap; white-space: normal; }
    .tm-popover .tm-presets { flex-wrap: wrap; }
    .tm-popover .tm-hint { display: none; }
  }
  .historical-banner {
    background: linear-gradient(90deg, rgba(116,152,253,0.20), rgba(80,125,252,0.10));
    border: 1px solid var(--purple);
    border-radius: var(--r-sm);
    padding: 10px var(--sp-lg);
    margin-bottom: var(--sp-lg);
    display: flex; align-items: center; gap: 14px;
    font-family: var(--mono); font-size: var(--fs-mono);
    color: var(--text);
    flex-wrap: wrap;
  }
  .historical-banner .hb-icon { font-size: var(--fs-ui); }
  .historical-banner b { color: var(--cyan); }
  .historical-banner .hb-note {
    color: var(--text-dim); font-size: var(--fs-mono-sm);
    margin-left: auto;
  }
  .historical-banner .hb-exit {
    background: var(--cyan); border: none;
    color: var(--bg); padding: var(--sp-xs) var(--sp-md);
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    text-transform: uppercase; letter-spacing: 0.06em;
    font-weight: 700; cursor: pointer; border-radius: var(--r-sm);
  }

  .kpi-row {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-md); margin-bottom: var(--sp-lg);
  }
  .kpi {
    background: var(--bg-panel); border: 1px solid var(--border);
    border-radius: var(--r-md); padding: 12px var(--sp-lg);
    transition: background 0.25s ease-out, border-color 0.25s ease-out;
    /* Uniform card height + flex layout 2026-05-05 — label/value/sub on a
       shared baseline grid. Value gets flex:1 + center so different value
       string lengths don't shift the sub-line up or down. */
    display: flex;
    flex-direction: column;
    min-height: 116px;
  }
  .kpi-label { flex-shrink: 0; }
  .kpi-sub { flex-shrink: 0; }
  /* State-tinted KPI cards (FINDING-007 from external review) */
  .kpi:has(.kpi-value.positive) {
    background: linear-gradient(180deg, rgba(80,252,209,0.06) 0%, rgba(80,252,209,0.02) 60%, transparent 100%);
    border-color: rgba(80,252,209,0.28);
  }
  .kpi:has(.kpi-value.negative) {
    background: linear-gradient(180deg, rgba(255,94,127,0.07) 0%, rgba(255,94,127,0.02) 60%, transparent 100%);
    border-color: rgba(255,94,127,0.28);
  }
  .kpi:has(.kpi-value.warn) {
    background: linear-gradient(180deg, rgba(255,209,102,0.07) 0%, rgba(255,209,102,0.02) 60%, transparent 100%);
    border-color: rgba(255,209,102,0.30);
  }
  .kpi:has(.kpi-value.hot) {
    background: linear-gradient(180deg, rgba(255,148,87,0.07) 0%, rgba(255,148,87,0.02) 60%, transparent 100%);
    border-color: rgba(255,148,87,0.28);
  }
  .kpi:has(.kpi-value.cool) {
    background: linear-gradient(180deg, rgba(80,125,252,0.06) 0%, rgba(80,125,252,0.02) 60%, transparent 100%);
    border-color: rgba(80,125,252,0.28);
  }
  .kpi-label {
    font-size: var(--fs-body-sm); text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text-dim); margin-bottom: 6px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .kpi-label .kpi-label-tag {
    font-weight: 400; opacity: 0.55;
    font-size: var(--fs-mono-sm);
  }
  /* Multi-Asset radar cards 2026-05-04 — replaces 6-col mock table with
     a 4-asset card grid, each card showing a 5-axis mini-radar so the
     cross-asset rotation is scannable at a glance. */
  .ma-radar-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--sp-md);
    margin-top: var(--sp-md);
  }
  .ma-card {
    background: rgba(20, 24, 33, 0.55);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: var(--sp-sm) var(--sp-md) var(--sp-md);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--sp-xs);
    transition: border-color 0.2s ease-out, background 0.2s ease-out;
  }
  .ma-card[data-tone="bull"] { border-color: rgba(80, 252, 209, 0.30); background: rgba(80, 252, 209, 0.04); }
  .ma-card[data-tone="warn"] { border-color: rgba(255, 209, 102, 0.30); background: rgba(255, 209, 102, 0.04); }
  .ma-card[data-tone="bear"] { border-color: rgba(255, 94, 127, 0.30); background: rgba(255, 94, 127, 0.04); }
  .ma-card-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    width: 100%;
    gap: var(--sp-xs);
  }
  .ma-ticker {
    font-family: 'Doto', 'Fira Code', var(--mono);
    font-size: 24px;
    font-weight: 700;
    letter-spacing: 0.04em;
    line-height: 1;
    color: var(--text);
  }
  .ma-verdict {
    font-family: var(--mono);
    font-size: 9px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    padding: 3px 6px;
    border-radius: var(--r-pill);
    border: 1px solid currentColor;
    white-space: nowrap;
  }
  .ma-verdict.bull { color: var(--green); background: rgba(80, 252, 209, 0.10); }
  .ma-verdict.warn { color: var(--yellow); background: rgba(255, 209, 102, 0.10); }
  .ma-verdict.bear { color: var(--red); background: rgba(255, 94, 127, 0.10); }
  .ma-radar {
    width: 100%;
    height: auto;
    max-width: 140px;
    aspect-ratio: 1 / 1;
    overflow: visible;
  }
  .ma-radar-grid-bg {
    fill: none;
    stroke: var(--border);
    stroke-width: 0.6;
    opacity: 0.7;
  }
  .ma-radar-fill {
    stroke-width: 1.5;
    transition: opacity 0.25s;
  }
  .ma-radar-fill.bull    { fill: rgba(80, 252, 209, 0.22); stroke: var(--green); }
  .ma-radar-fill.warn    { fill: rgba(255, 209, 102, 0.18); stroke: var(--yellow); }
  .ma-radar-fill.bear    { fill: rgba(255, 94, 127, 0.20); stroke: var(--red); }
  .ma-radar-fill.neutral { fill: rgba(138, 146, 168, 0.15); stroke: var(--text-dim); }
  /* Polygon points transition smoothly when data updates (CSS animation
     of the points attribute is browser-supported via SMIL on Chrome/Safari
     and via attribute interpolation in modern browsers). */
  .ma-radar-fill {
    transition: fill 0.4s ease-out, stroke 0.4s ease-out;
  }
  .ma-verdict.neutral { color: var(--text-dim); background: rgba(138, 146, 168, 0.10); }
  .ma-card[data-tone="neutral"] { border-color: var(--border); background: rgba(255, 255, 255, 0.015); }
  .ma-axis {
    font-family: var(--mono);
    font-size: 7.5px;
    font-weight: 600;
    fill: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.06em;
  }
  .ma-card-foot {
    font: 500 var(--fs-mono-xs) var(--mono);
    color: var(--text-dim);
    text-align: center;
    margin-top: 2px;
    line-height: 1.3;
  }
  .ma-phase-badge {
    font: 600 var(--fs-mono-xs) var(--mono);
    text-align: center;
    margin-top: 4px;
    padding: 2px 6px;
    border-radius: var(--r-pill);
    border: 1px solid currentColor;
    white-space: nowrap;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .ma-phase-badge.bull {
    color: var(--green);
    background: rgba(80, 252, 209, 0.10);
    border-color: rgba(80, 252, 209, 0.25);
  }
  .ma-phase-badge.bear {
    color: var(--red);
    background: rgba(255, 94, 127, 0.10);
    border-color: rgba(255, 94, 127, 0.25);
  }
  .ma-phase-badge.warn {
    color: var(--yellow);
    background: rgba(255, 209, 102, 0.10);
    border-color: rgba(255, 209, 102, 0.25);
  }
  .ma-phase-badge.neutral {
    color: var(--text-dim);
    background: rgba(138, 146, 168, 0.10);
    border-color: rgba(138, 146, 168, 0.20);
  }
  @media (max-width: 900px) {
    .ma-radar-grid { grid-template-columns: repeat(2, 1fr); }
  }
  @media (max-width: 480px) {
    .ma-radar-grid { grid-template-columns: 1fr; }
  }

  /* KPI value polish — Doto + neon glow keyed by tone classes. Doto is a
     7-segment-style dot-matrix face designed for digits, not words, so
     text-only KPIs (MA Stack pills, BTC Cycle phase name) override
     font-family back to Switzer below. */
  .kpi-value {
    font-family: 'Doto', 'Fira Code', var(--mono);
    font-size: 30px;
    font-weight: 700;
    letter-spacing: 0.02em;
    line-height: 1;
    white-space: nowrap;
    overflow: hidden;
    /* Vertically center the value in the middle slot of the card so
       sub-line stays anchored at the bottom regardless of value length */
    flex: 1;
    display: flex;
    align-items: center;
    min-width: 0;
    transition: text-shadow var(--dur-data-reveal, 900ms) var(--ease-data-reveal, cubic-bezier(0.16, 1, 0.3, 1));
  }
  /* Text-only KPI values — drop Doto, use the display face at a smaller
     size since words need more horizontal room than digits. */
  #kpi-ma-stack,
  #kpi-cycle {
    font-family: var(--font-display);
    font-size: 20px;
    font-weight: 700;
    letter-spacing: 0;
  }
  .kpi-value.positive {
    text-shadow: 0 0 4px rgba(80, 252, 209, 0.85),
                 0 0 14px rgba(80, 252, 209, 0.45);
  }
  .kpi-value.negative {
    text-shadow: 0 0 4px rgba(255, 94, 127, 0.85),
                 0 0 14px rgba(255, 94, 127, 0.40);
  }
  .kpi-value.warn {
    text-shadow: 0 0 4px rgba(255, 209, 102, 0.80),
                 0 0 14px rgba(255, 209, 102, 0.35);
  }
  .kpi-value.cool {
    text-shadow: 0 0 4px rgba(80, 125, 252, 0.85),
                 0 0 14px rgba(80, 125, 252, 0.40);
  }
  .kpi-value.hot {
    text-shadow: 0 0 4px rgba(255, 148, 87, 0.85),
                 0 0 14px rgba(255, 148, 87, 0.40);
  }
  /* MA bonus strip — Compression + Velocity Divergence + Weekly RSI (paper #2/3/4) */
  .ma-bonus-strip {
    margin-top: 14px; padding-top: var(--sp-md);
    border-top: 1px solid var(--border);
    display: grid; grid-template-columns: 1fr 1fr 1fr;
    gap: 14px;
    font-family: var(--mono); font-size: var(--fs-mono);
  }
  @media (max-width: 900px) { .ma-bonus-strip { grid-template-columns: 1fr 1fr; } }
  @media (max-width: 600px) { .ma-bonus-strip { grid-template-columns: 1fr; } }
  .ma-bonus-cell {
    display: flex; flex-direction: column; gap: 3px;
  }
  .ma-bonus-cell .label {
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim);
  }
  .ma-bonus-cell .value {
    font-size: var(--fs-body-lg); font-weight: 600; color: var(--text);
    font-variant-numeric: tabular-nums;
  }
  .ma-bonus-cell .value.green  { color: var(--green); }
  .ma-bonus-cell .value.cyan   { color: var(--cyan); }
  .ma-bonus-cell .value.warn   { color: var(--yellow); }
  .ma-bonus-cell .value.red    { color: var(--red); }
  .ma-bonus-cell .interp {
    font-size: var(--fs-mono-xs); color: var(--text-dim);
    margin-top: 1px;
  }
  .ma-bonus-cell .scale {
    margin-top: var(--sp-xs); height: 4px;
    background: var(--bg-panel); border: 1px solid var(--border);
    border-radius: var(--r-pill); overflow: hidden;
    position: relative;
  }
  .ma-bonus-cell .scale .marker {
    position: absolute; top: -2px; bottom: -2px;
    width: 2px; background: var(--text);
    transition: left 0.5s ease;
  }
  .ma-bonus-cell .scale .zone-buy {
    position: absolute; top: 0; bottom: 0;
    background: rgba(80,252,209,0.15);
  }

  /* MA Stack dot pattern */
  .ma-stack-dots {
    display: inline-flex; gap: var(--sp-xs);
    align-items: center;
    font-family: var(--mono);
    font-size: var(--fs-ui-lg); line-height: 1;
  }
  .ma-stack-dots .dot {
    width: 14px; height: 14px; border-radius: 50%;
    border: 1.5px solid var(--text-dim);
    background: transparent;
    transition: background 0.2s;
  }
  .ma-stack-dots .dot.on  { background: var(--cyan); border-color: var(--cyan); }
  .ma-stack-dots.score-0 .dot.on { background: var(--red); border-color: var(--red); }
  .ma-stack-dots.score-1 .dot.on { background: var(--orange); border-color: var(--orange); }
  .ma-stack-dots.score-2 .dot.on { background: var(--yellow); border-color: var(--yellow); }
  .ma-stack-dots.score-3 .dot.on { background: var(--green); border-color: var(--green); }
  .ma-stack-dots.score-4 .dot.on { background: var(--cyan); border-color: var(--cyan); }
  .ma-stack-dots .num {
    margin-left: 6px;
    font-size: var(--fs-body-lg); font-weight: 700;
    color: var(--text);
  }
  .kpi-value.positive { color: var(--green); }
  .kpi-value.negative { color: var(--red); }
  .kpi-value.warn { color: var(--yellow); }
  .kpi-value.cool { color: var(--blue); }
  .kpi-value.hot { color: var(--orange); }

  /* Color-blind affordance — Kimi audit #7. Hue-only red/green excludes
     ~8% of male users. Add a directional glyph to value-bearing elements
     so signal direction reads without color. Scoped narrowly to *value*
     classes (numbers/percent/ratio displays) to avoid double-glyphing
     chips, badges, or icon labels. 2026-04-26. */
  .kpi-value.positive::before,
  .vsb-value.positive::before,
  .vsb-ratio-chip.positive::before,
  .macro-bento-grid .bento-value.positive::before { content: '▲ '; font-size: 0.78em; }
  .kpi-value.negative::before,
  .vsb-value.negative::before,
  .vsb-ratio-chip.negative::before,
  .macro-bento-grid .bento-value.negative::before { content: '▼ '; font-size: 0.78em; }
  .kpi-sub {
    font-family: var(--mono); font-size: var(--fs-mono);
    color: var(--text-dim); margin-top: var(--sp-xs);
  }

  .panel {
    background: var(--bg-panel); border: 1px solid rgba(35,40,56,0.6);
    border-radius: var(--r-lg); margin-bottom: var(--sp-lg);
    position: relative;
  }
  /* Inline panel-head MOCK badge — sits next to the panel title on panels
     whose data is still scaffolded (per CLAUDE.md § Mock-vs-real endpoint
     discipline). External audit 2026-04-24 (C2): originally 9px which
     users routinely missed. Bumped to 12px with solid amber fill so it's
     impossible to overlook next to a 13px panel title. */
  .panel-mock-badge {
    display: inline-flex;
    align-items: center;
    padding: var(--sp-2xs) var(--sp-sm);
    margin-left: var(--sp-sm);
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    font-weight: 800;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: #1a1410;
    background: rgba(255, 209, 102, 0.95);
    border: 1px solid rgba(255, 209, 102, 1);
    border-radius: var(--r-sm);
    line-height: 1.2;
    box-shadow: 0 0 0 1px rgba(0,0,0,0.4), 0 1px 2px rgba(0,0,0,0.3);
  }
  .panel-mock-badge::before { content: "⚠ "; margin-right: var(--sp-2xs); font-size: var(--fs-mono); }

  /* Full-width in-panel MOCK DATA banner — auto-injected by JS into the
     .panel-body of any panel that has a .panel-mock-badge in its head.
     Audit C2: unmissable in-body signal beyond the header badge. */
  .panel-mock-banner {
    display: flex; align-items: center; gap: 10px;
    margin: 0 0 var(--sp-md) 0; padding: var(--sp-sm) var(--sp-md);
    background: rgba(255, 209, 102, 0.12);
    border: 1px solid rgba(255, 209, 102, 0.55);
    border-left: 3px solid rgba(255, 209, 102, 1);
    border-radius: var(--r-sm);
    font-family: var(--mono); font-size: var(--fs-mono);
    color: var(--text); line-height: 1.45;
  }
  .panel-mock-banner .pmb-icon  { font-size: var(--fs-ui); flex-shrink: 0; color: var(--yellow); }
  .panel-mock-banner .pmb-label {
    font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
    color: var(--yellow); flex-shrink: 0;
  }
  .panel-mock-banner .pmb-msg   { color: var(--text-dim); flex: 1; }

  /* Build-drift toast — surfaces "new version available" when the snapshot
     reports a different build_sha than the page was loaded with.
     external_audit P0-5: closes the silent-stale-assets failure mode that
     used to be papered over with a "Cmd+Shift+R" usage instruction. */
  .cw-update-toast {
    position: fixed; right: var(--sp-md, 16px); bottom: var(--sp-md, 16px);
    z-index: 9999; max-width: 360px;
    padding: var(--sp-sm, 10px) var(--sp-md, 16px);
    display: flex; align-items: center; gap: var(--sp-sm, 10px);
    background: rgba(13, 17, 26, 0.95);
    border: 1px solid var(--aqua, #50FCD1);
    border-left: 3px solid var(--aqua, #50FCD1);
    border-radius: var(--r-md, 6px);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(80, 252, 209, 0.18);
    font-family: var(--mono, ui-monospace, monospace);
    font-size: var(--fs-mono-sm, 12px);
    color: var(--text, #e6e8ef);
    backdrop-filter: blur(6px);
    animation: cw-update-toast-in 220ms ease-out;
  }
  @keyframes cw-update-toast-in {
    from { transform: translateY(8px); opacity: 0; }
    to   { transform: translateY(0);   opacity: 1; }
  }
  .cw-update-toast .ut-label {
    font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
    color: var(--aqua, #50FCD1);
  }
  .cw-update-toast .ut-msg { color: var(--text-dim, #8a92a8); flex: 1; }
  .cw-update-toast .ut-action {
    color: var(--aqua, #50FCD1); cursor: pointer; text-decoration: none;
    font-weight: 700; padding: 2px 8px; border: 1px solid rgba(80,252,209,0.45);
    border-radius: var(--r-sm, 4px); white-space: nowrap;
  }
  .cw-update-toast .ut-action:hover { background: rgba(80,252,209,0.12); }
  .cw-update-toast .ut-dismiss {
    color: var(--text-dim, #8a92a8); cursor: pointer; padding: 0 4px;
    background: transparent; border: 0; font-size: 14px;
  }
  .cw-update-toast .ut-dismiss:hover { color: var(--text, #e6e8ef); }

  .panel-head {
    display: flex; justify-content: space-between; align-items: center;
    padding: var(--sp-md) var(--sp-lg); border-bottom: 1px solid rgba(35,40,56,0.5);
    font-family: var(--font-display);
    font-size: var(--fs-body); font-weight: 600;
    text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text);
    background: var(--bg-panel);
    border-top-left-radius: var(--r-lg);
    border-top-right-radius: var(--r-lg);
  }
  .panel-head.is-current {
    box-shadow: 0 0 0 1px rgba(80, 252, 209, 0.25), 0 4px 12px rgba(80, 252, 209, 0.08);
  }
  .panel-head > .panel-title {
    color: var(--text);
    margin: 0;
    font: inherit;
    min-width: 0;
  }

  /* Diff feed — "what changed today" panel. Round 9 P1-7. */
  #sec-diff-feed .diff-feed-rows {
    display: flex; flex-direction: column; gap: 6px;
    font-family: var(--mono, ui-monospace, monospace);
    font-size: var(--fs-mono-sm);
  }
  #sec-diff-feed .df-row {
    display: grid;
    grid-template-columns: 64px 1fr 110px 90px 64px;
    gap: var(--sp-sm);
    align-items: center;
    padding: 8px 12px;
    background: rgba(255,255,255,0.02);
    border: 1px solid rgba(255,255,255,0.06);
    border-radius: var(--r-sm);
    transition: background 120ms ease-out;
  }
  #sec-diff-feed .df-row.is-extreme {
    border-color: rgba(255, 209, 102, 0.45);
    background: linear-gradient(135deg, rgba(255,209,102,0.08), rgba(255,209,102,0.02));
  }
  #sec-diff-feed .df-row.is-bull-extreme {
    border-color: rgba(80, 252, 209, 0.45);
    background: linear-gradient(135deg, rgba(80, 252, 209, 0.10), rgba(80, 252, 209, 0.02));
  }
  #sec-diff-feed .df-row.is-bear-extreme {
    border-color: rgba(255, 94, 127, 0.45);
    background: linear-gradient(135deg, rgba(255, 94, 127, 0.08), rgba(255, 94, 127, 0.02));
  }
  #sec-diff-feed .df-z {
    font-weight: 800; font-size: 14px; letter-spacing: 0;
    text-align: left; color: var(--text-strong, #e6e8ef);
  }
  #sec-diff-feed .df-z.bull { color: var(--aqua, #50FCD1); }
  #sec-diff-feed .df-z.bear { color: var(--rose, #FF5E7F); }
  #sec-diff-feed .df-label { color: var(--text); }
  #sec-diff-feed .df-source {
    font-size: 10px; color: var(--text-dim); letter-spacing: 0.06em; text-transform: uppercase;
  }
  #sec-diff-feed .df-value {
    text-align: right; color: var(--text); font-weight: 600;
  }
  #sec-diff-feed .df-delta {
    text-align: right; font-weight: 700;
  }
  #sec-diff-feed .df-delta.bull { color: var(--aqua, #50FCD1); }
  #sec-diff-feed .df-delta.bear { color: var(--rose, #FF5E7F); }
  #sec-diff-feed .df-bar {
    height: 6px; background: rgba(255,255,255,0.06); border-radius: 3px;
    position: relative; overflow: hidden;
  }
  #sec-diff-feed .df-bar > .df-bar-fill {
    position: absolute; top: 0; bottom: 0;
  }
  #sec-diff-feed .df-bar > .df-bar-fill.bull {
    left: 50%; background: linear-gradient(90deg, rgba(80,252,209,0.30), var(--aqua, #50FCD1));
  }
  #sec-diff-feed .df-bar > .df-bar-fill.bear {
    right: 50%; background: linear-gradient(270deg, rgba(255,94,127,0.30), var(--rose, #FF5E7F));
  }
  #sec-diff-feed .df-bar::before {
    content: ''; position: absolute; left: 50%; top: 0; bottom: 0; width: 1px;
    background: rgba(255,255,255,0.18);
  }
  @media (max-width: 720px) {
    #sec-diff-feed .df-row {
      grid-template-columns: 48px 1fr 80px 64px;
    }
    #sec-diff-feed .df-bar { display: none; }
  }
  #sec-diff-feed .df-empty { color: var(--text-dim); padding: var(--sp-md); text-align: center; }

  /* Forward-return panel — the decision-system layer. external_audit P0-2.
     Layout: a current-band hero line, then a 7-card horizontal grid of
     score bands with median 90d forward return + sample count, then a
     plain-language caption. */
  #sec-fwd-returns .fwd-current {
    margin-bottom: var(--sp-md);
    padding: var(--sp-md) var(--sp-lg);
    background: linear-gradient(135deg, rgba(80, 252, 209, 0.06), rgba(116, 152, 253, 0.04));
    border: 1px solid var(--border, rgba(36,41,56,0.65));
    border-left: 3px solid var(--aqua, #50FCD1);
    border-radius: var(--r-md, 6px);
    font-family: var(--mono, ui-monospace, monospace);
    font-size: var(--fs-body);
    line-height: 1.5;
  }
  #sec-fwd-returns .fwd-current .fc-label {
    font-size: var(--fs-mono-xs);
    text-transform: uppercase; letter-spacing: 0.12em;
    color: var(--text-dim, #8a92a8);
    margin-bottom: 4px;
  }
  #sec-fwd-returns .fwd-current .fc-line { color: var(--text); font-weight: 600; }
  #sec-fwd-returns .fwd-current .fc-line b { font-weight: 800; letter-spacing: 0; }
  #sec-fwd-returns .fwd-current .fc-line b.bull { color: var(--aqua, #50FCD1); }
  #sec-fwd-returns .fwd-current .fc-line b.bear { color: var(--rose, #FF5E7F); }
  #sec-fwd-returns .fwd-current .fc-detail {
    margin-top: 6px; font-size: var(--fs-mono-sm); color: var(--text-dim);
  }

  #sec-fwd-returns .fwd-band-grid {
    display: grid;
    grid-template-columns: repeat(6, minmax(0, 1fr));
    gap: 6px;
    margin-bottom: var(--sp-md);
  }
  @media (max-width: 720px) {
    #sec-fwd-returns .fwd-band-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  }

  #sec-fwd-returns .fwd-band-card {
    position: relative;
    padding: 10px 8px;
    background: rgba(255,255,255,0.02);
    border: 1px solid rgba(255,255,255,0.06);
    border-radius: var(--r-sm, 4px);
    text-align: center;
    font-family: var(--mono, ui-monospace, monospace);
  }
  #sec-fwd-returns .fwd-band-card.is-current {
    background: linear-gradient(135deg, rgba(80, 252, 209, 0.10), rgba(80, 252, 209, 0.04));
    border-color: var(--aqua, #50FCD1);
    box-shadow: 0 0 0 1px rgba(80, 252, 209, 0.25);
  }
  #sec-fwd-returns .fwd-band-label {
    font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;
    color: var(--text-dim);
    margin-bottom: 4px;
  }
  #sec-fwd-returns .fwd-band-card.is-current .fwd-band-label {
    color: var(--aqua, #50FCD1); font-weight: 700;
  }
  #sec-fwd-returns .fwd-band-pin {
    display: inline-block; margin-right: 4px; font-size: 9px;
  }
  #sec-fwd-returns .fwd-band-median {
    font-size: 18px; font-weight: 800; letter-spacing: -0.02em;
    color: var(--text-strong, #e6e8ef); margin: 2px 0;
  }
  #sec-fwd-returns .fwd-band-median.bull { color: var(--aqua, #50FCD1); }
  #sec-fwd-returns .fwd-band-median.bear { color: var(--rose, #FF5E7F); }
  #sec-fwd-returns .fwd-band-median.flat { color: var(--text-dim); }
  #sec-fwd-returns .fwd-band-iqr {
    font-size: 10px; color: var(--text-dim); margin-top: 2px;
    font-family: var(--mono, ui-monospace, monospace);
  }
  #sec-fwd-returns .fwd-v1v2 {
    margin-top: 8px;
    font-family: var(--mono, ui-monospace, monospace);
    font-size: 11px;
    line-height: 1.4;
  }
  #sec-fwd-returns .fwd-band-verdict {
    margin-top: 4px;
    font-family: var(--mono, ui-monospace, monospace);
    font-size: 9px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
  }
  #sec-fwd-returns .fwd-band-verdict.strong-buy  { color: var(--cyan); }
  #sec-fwd-returns .fwd-band-verdict.buy         { color: var(--aqua); }
  #sec-fwd-returns .fwd-band-verdict.mild-buy    { color: var(--aqua); opacity: 0.8; }
  #sec-fwd-returns .fwd-band-verdict.wait        { color: var(--text-dim); }
  #sec-fwd-returns .fwd-band-verdict.mild-sell   { color: var(--rose); opacity: 0.8; }
  #sec-fwd-returns .fwd-band-verdict.sell        { color: var(--rose); }
  #sec-fwd-returns .fwd-band-verdict.strong-sell { color: var(--red); }
  #sec-fwd-returns .fwd-band-n {
    font-size: 9px; color: var(--text-dim); margin-top: 4px;
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  #sec-fwd-returns .fwd-caption {
    font-size: var(--fs-mono-sm);
    line-height: 1.5;
    padding: 0 var(--sp-sm);
  }

  /* Panel source-link icon — auto-injected next to the panel title for
     panels with a known canonical source. Closes external_audit P0-3 /
     Round 9 P0-3 / Codex P2-3 (4/5 auditors): 49 outbound links across
     1.22MB of HTML, ~0 to glassnode/tradingview/cryptoquant/deribit. The
     link is visual evidence of the source claim; the tooltip names it. */
  .panel-source-link {
    display: inline-flex; align-items: center; justify-content: center;
    width: 18px; height: 18px;
    margin-left: 8px;
    color: var(--text-dim, #8a92a8);
    text-decoration: none;
    font-family: var(--mono, ui-monospace, monospace);
    font-size: 11px; font-weight: 700; letter-spacing: 0;
    border: 1px solid rgba(255,255,255,0.10);
    border-radius: 3px;
    background: rgba(255,255,255,0.02);
    transition: color 120ms ease-out, border-color 120ms ease-out, background 120ms ease-out;
    text-transform: none;
    flex-shrink: 0;
  }
  .panel-source-link:hover {
    color: var(--aqua, #50FCD1);
    border-color: rgba(80, 252, 209, 0.45);
    background: rgba(80, 252, 209, 0.08);
  }
  .panel-source-link:focus-visible {
    outline: 2px solid var(--aqua, #50FCD1);
    outline-offset: 2px;
  }

  /* Panel info-icon — matches .panel-source-link visual rhythm. Closes
     Round 9 audit P1-3 ("176 hidden tooltips, 0 visible help affordances").
     Sits before the source-link icon (info first, then source) so the
     reading order is "what is this" → "where does it come from". */
  .panel-info-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 18px; height: 18px;
    margin-left: 6px;
    padding: 0;
    color: var(--text-dim, #8a92a8);
    background: rgba(255,255,255,0.02);
    border: 1px solid rgba(255,255,255,0.10);
    border-radius: 3px;
    font-family: var(--mono, ui-monospace, monospace);
    font-size: 12px; font-weight: 600; line-height: 1;
    cursor: pointer;
    transition: color 120ms ease-out, border-color 120ms ease-out, background 120ms ease-out;
    flex-shrink: 0;
  }
  .panel-info-icon:hover {
    color: var(--aqua, #50FCD1);
    border-color: rgba(80, 252, 209, 0.45);
    background: rgba(80, 252, 209, 0.08);
  }

  /* D3: Per-panel source badges for time-machine reconstructed mode */
  .panel-source-badge {
    display: inline-block;
    margin-left: 8px;
    padding: 1px 5px;
    border-radius: 3px;
    font-family: var(--mono, ui-monospace, monospace);
    font-size: 9px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    line-height: 1.4;
    flex-shrink: 0;
  }
  .panel-source-badge.source-historical {
    color: var(--aqua, #50FCD1);
    background: rgba(80, 252, 209, 0.08);
    border: 1px solid rgba(80, 252, 209, 0.25);
  }
  .panel-source-badge.source-live {
    color: var(--text-dim, #8a92a8);
    background: rgba(255,255,255,0.02);
    border: 1px solid rgba(255,255,255,0.08);
  }
  .panel-info-icon:focus-visible {
    outline: 2px solid var(--aqua, #50FCD1);
    outline-offset: 2px;
  }
  .panel-info-icon[aria-expanded="true"] {
    color: var(--aqua, #50FCD1);
    border-color: rgba(80, 252, 209, 0.45);
    background: rgba(80, 252, 209, 0.12);
  }

  .panel-body { padding: var(--sp-lg) var(--sp-lg); }

  /* Info blocks (FINDING-008): hide the inline summary, surface as popover.
     F3 (audit 2026-05-02): popover body is running prose; promote color to
     --text. --text-dim reserved for meta labels only. */
  details.panel-info {
    display: none;
    font-size: var(--fs-mono); line-height: 1.55;
    color: var(--text); font-family: var(--mono);
  }
  details.panel-info[open] {
    display: block;
    opacity: 1;
    position: absolute;
    top: 44px; right: 14px;
    z-index: 80;
    width: min(380px, calc(100vw - 32px));
    max-width: calc(100% - 28px);
    max-height: min(420px, calc(100vh - 120px));
    overflow-y: auto;
    overscroll-behavior: contain;
    margin: 0;
    padding: 14px var(--sp-lg);
    border: 1px solid var(--blue);
    border-radius: var(--r-sm);
    background: var(--bg-panel-2);
    box-shadow: 0 18px 48px rgba(0,0,0,0.6), 0 0 0 1px rgba(80,125,252,0.15);
  }
  @keyframes cw-popover-in {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  details.panel-info > summary { display: none; }
  details.panel-info > div { padding: 0; }
  details.panel-info > div p { margin: 6px 0; }
  details.panel-info > div p:first-child { margin-top: 0; }
  details.panel-info > div p:last-child { margin-bottom: 0; }
  details.panel-info > div b { color: var(--text); font-weight: 600; }
  details.panel-info > div .warn { color: var(--yellow); }
  @media (max-width: 640px) {
    details.panel-info[open] {
      left: 10px;
      right: 10px;
      width: auto;
      max-width: none;
      max-height: min(360px, calc(100vh - 96px));
    }
  }

  /* Round 9 P2-4 — glossary drawer. Definitions live in hidden #sec-glossary
     as a DOM source so reference material stays out of the main terminal flow. */
  body.glossary-open { overflow: hidden; }
  .glossary-fab {
    position: fixed;
    right: var(--sp-lg);
    bottom: var(--sp-lg);
    z-index: 180;
    width: 44px;
    height: 44px;
    border: 1px solid rgba(80,252,209,0.34);
    border-radius: var(--r-pill);
    background: rgba(20,24,33,0.96);
    color: var(--cyan);
    box-shadow: 0 16px 42px rgba(0,0,0,0.48), 0 0 0 1px rgba(80,252,209,0.08);
    cursor: pointer;
    font-family: var(--mono);
    font-size: var(--fs-ui-lg);
    font-weight: 700;
    line-height: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: transform 140ms ease-out, border-color 140ms ease-out, background 140ms ease-out;
  }
  .glossary-fab:hover,
  .glossary-fab[aria-expanded="true"] {
    border-color: var(--cyan);
    background: rgba(80,252,209,0.10);
    transform: translateY(-1px);
  }
  .glossary-fab:focus-visible,
  .glossary-close:focus-visible,
  .glossary-search:focus-visible {
    outline: 2px solid var(--cyan);
    outline-offset: 2px;
  }
  .glossary-shell[hidden] { display: none; }
  .glossary-shell {
    position: fixed;
    inset: 0;
    z-index: 9998;
    pointer-events: none;
  }
  .glossary-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(0,0,0,0.58);
    opacity: 0;
    transition: opacity 160ms ease-out;
  }
  .glossary-drawer {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: min(390px, calc(100vw - 32px));
    box-sizing: border-box;
    border-left: 1px solid var(--border);
    background: rgba(20,24,33,0.98);
    box-shadow: -18px 0 56px rgba(0,0,0,0.56);
    overflow-y: auto;
    transform: translateX(100%);
    transition: transform 180ms ease-out;
    padding: var(--sp-lg);
    color: var(--text);
  }
  .glossary-shell.is-open {
    pointer-events: auto;
  }
  .glossary-shell.is-open .glossary-backdrop {
    opacity: 1;
  }
  .glossary-shell.is-open .glossary-drawer {
    transform: translateX(0);
  }
  .glossary-drawer-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-md);
    padding-bottom: var(--sp-md);
    border-bottom: 1px solid var(--border);
  }
  .glossary-kicker,
  .glossary-drawer-term h3,
  .glossary-term h3 {
    font-family: var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
  }
  .glossary-kicker {
    color: var(--text-dim);
    font-size: var(--fs-mono-xs);
    margin-bottom: var(--sp-xs);
  }
  .glossary-title {
    margin: 0;
    color: var(--text);
    font-family: var(--font-display);
    font-size: var(--fs-ui-lg);
    line-height: 1.2;
  }
  .glossary-close {
    width: 32px;
    height: 32px;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    background: rgba(255,255,255,0.02);
    color: var(--text-dim);
    cursor: pointer;
    font-family: var(--mono);
    font-size: var(--fs-body-lg);
  }
  .glossary-close:hover {
    color: var(--text);
    border-color: var(--text-dim);
  }
  .glossary-search-wrap {
    display: block;
    margin: var(--sp-md) 0;
  }
  .glossary-search {
    width: 100%;
    box-sizing: border-box;
    min-height: 40px;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    background: var(--bg);
    color: var(--text);
    font-family: var(--mono);
    font-size: var(--fs-body);
    padding: 0 var(--sp-md);
  }
  .glossary-drawer-list,
  .glossary-term-list {
    display: grid;
    gap: var(--sp-md);
  }
  .glossary-term-list {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .glossary-drawer-term,
  .glossary-term {
    border-top: 1px solid rgba(255,255,255,0.08);
    padding-top: var(--sp-md);
  }
  .glossary-drawer-term h3,
  .glossary-term h3 {
    margin: 0 0 var(--sp-xs);
    color: var(--cyan);
    font-size: var(--fs-mono);
    line-height: 1.35;
  }
  .glossary-drawer-term p,
  .glossary-term p,
  .glossary-intro,
  .glossary-footnote {
    margin: 0;
    color: var(--text-dim);
    font-family: var(--font-body);
    font-size: var(--fs-body);
    line-height: 1.5;
  }
  .glossary-intro {
    margin-bottom: var(--sp-lg);
    max-width: 780px;
  }
  .glossary-footnote {
    margin-top: var(--sp-md);
    padding-top: var(--sp-md);
    border-top: 1px solid var(--border);
    font-size: var(--fs-body-sm);
  }
  @media (max-width: 768px) {
    .glossary-fab {
      right: var(--sp-md);
      bottom: calc(env(safe-area-inset-bottom, 0px) + 76px);
    }
    .glossary-drawer {
      width: 100vw;
      max-width: none;
      border-left: 0;
    }
    .glossary-term-list {
      grid-template-columns: 1fr;
    }
  }

  /* Source-attribution chip injected onto indicator cards by JS — Round 7
     §7 #8 fix (2026-05-04). Every Tier 1 / Tier 2 / Tactical Layer card
     gets a small chip showing its raw data source + series name. Lets
     users spot when two cards read the same underlying series (e.g.,
     STH cost basis + STH NUPL both derive from STH realized price).
     Tooltip on hover shows the full series description. */
  .cw-source-chip {
    display: inline-flex; align-items: center;
    margin-top: var(--sp-xs);
    padding: 2px var(--sp-sm);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    background: var(--bg-panel-2);
    color: var(--text-dim);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 500;
    letter-spacing: 0.02em;
    line-height: 1.3;
    cursor: help;
    user-select: none;
  }
  .cw-source-chip .cw-source-vendor {
    color: var(--text);
    font-weight: 600;
    margin-right: 6px;
  }
  .cw-source-chip[data-vendor="Glassnode"] .cw-source-vendor { color: var(--cyan); }
  .cw-source-chip[data-vendor="Deribit"]   .cw-source-vendor { color: var(--gold); }
  .cw-source-chip[data-vendor="Hyperliquid"] .cw-source-vendor { color: var(--blue); }
  .t1-card .cw-source-chip,
  .cg-cyc-card .cw-source-chip {
    margin-top: var(--sp-sm);
  }

  /* Methodology link injected into panel headers by JS — Round 7 §7 #5
     fix (2026-05-04). Every verdict-bearing panel gets a one-click jump
     to its /docs section. Sits in the right-side meta cluster, dim by
     default, blue on hover. Hidden on narrow viewports to preserve the
     two-line panel-head layout. */
  .panel-doc-link {
    display: inline-flex; align-items: center;
    margin-left: var(--sp-sm);
    padding: 2px var(--sp-sm);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    color: var(--text-dim);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 500;
    letter-spacing: 0.04em;
    text-transform: none;
    text-decoration: none;
    line-height: 1.4;
    transition: color 0.15s, border-color 0.15s, background 0.15s;
    flex-shrink: 0;
  }
  .panel-doc-link:hover,
  .panel-doc-link:focus-visible {
    color: var(--blue); border-color: var(--blue);
    background: rgba(80,125,252,0.08);
    outline: none;
  }

  /* ===== Tabbed panel composites ===== */
  .tab-bar {
    display: flex;
    gap: 0;
    border-bottom: 1px solid var(--border);
    margin: -var(--sp-2xs) -var(--sp-lg) 14px;
    padding: 0 var(--sp-lg);
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  .tab-btn {
    padding: var(--sp-sm) var(--sp-lg) var(--sp-sm);
    font-size: 10.5px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.07em;
    background: none;
    border: none;
    color: var(--muted);
    cursor: pointer;
    border-bottom: 2px solid transparent;
    transition: color 0.15s, border-color 0.15s;
    white-space: nowrap;
    font-family: inherit;
  }
  .tab-btn:hover { color: var(--text); }
  .tab-btn.active {
    color: var(--aqua);
    border-bottom-color: var(--aqua);
  }
  .tab-pane { display: none; }
  .tab-pane.active { display: block; }

  #sec-cycle-position-hero .tab-pane {
    padding-top: var(--sp-md);
  }

  @media (max-width: 480px) {
    .tab-bar { margin: -var(--sp-2xs) -var(--sp-md) var(--sp-md); padding: 0 var(--sp-md); }
    .tab-btn { padding: var(--sp-sm) var(--sp-md) 6px; font-size: 9.5px; }
  }
  @media (max-width: 720px) {
    .panel-doc-link { display: none; }
  }

  /* collapsible panel bodies (default collapsed on mobile for heavy panels) */
  .panel-head .panel-head-right {
    display: flex; align-items: center; gap: 10px;
    margin-left: auto;
  }
  .collapse-btn {
    background: none; border: 1px solid var(--border);
    color: var(--text-dim); cursor: pointer;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    padding: var(--sp-2xs) var(--sp-sm); border-radius: var(--r-sm);
    transition: background 0.15s;
  }
  .collapse-btn:hover { background: var(--bg-panel-2); color: var(--text); }
  .collapse-btn::before { content: '▾ hide'; }
  .panel.collapsed .collapse-btn::before { content: '▸ show'; }
  .panel.collapsed .panel-body { display: none; }

  /* ── Tabular-lining numerals for data-dense contexts ── */
  .kpi-value, .kpi-sub,
  .gauge-score-num, .gauge-conf-num,
  .opt-value, .ct-value,
  .macro-val, .inst-val,
  .dist-val, .dc-value,
  .bmvz-kpi strong,
  .hv-day, .heat-score,
  .spot-val, .dca-pill,
  .liq-meta .item b,
  td, th,
  .synth-hero-line,
  .pm-card-hero,
  .cap-num,
  .tier-row .val {
    font-variant-numeric: tabular-nums;
  }

  /* ── Auto-collapse for reference/lower panels ── */
  .panel.auto-collapsed .panel-body { display: none; }
  .panel.auto-collapsed .panel-head { cursor: pointer; opacity: 0.85; }
  .panel.auto-collapsed .panel-head:hover { opacity: 1; }
  .panel.auto-collapsed .panel-head::after {
    content: '▸ expand';
    font-family: var(--mono); font-size: var(--fs-mono-sm); color: var(--text-dim);
    margin-left: auto; padding: var(--sp-2xs) var(--sp-sm);
    border: 1px solid var(--border); border-radius: var(--r-sm);
  }
  .panel.auto-collapsed .panel-head .muted { display: inline; }
  .panel.auto-collapsed .panel-head .panel-head-right { display: none; }


  /* cycle phase — thermometer-style smooth gradient */
  .cycle-wrap { display: flex; gap: var(--sp-xl); align-items: center; }
  .cycle-bar-wrap { flex: 1; }
  .cycle-bar {
    height: 36px; border-radius: var(--r-sm); position: relative;
    background: linear-gradient(90deg,
      #FF5E7F 0%,
      #FF5E7F 14%,
      #507DFC 32%,
      #507DFC 43%,
      #50FCD1 57%,
      #50FCD1 68%,
      #FFD166 86%,
      #FFD166 100%);
    border: 1px solid var(--border);
  }
  .cycle-labels {
    display: grid; grid-template-columns: repeat(4, 1fr);
    margin-top: 6px; font-size: var(--fs-mono-xs); font-family: var(--mono);
    color: var(--text-dim); text-transform: uppercase;
    letter-spacing: 0.05em;
  }
  .cycle-labels span { text-align: center; }
  .cycle-labels span:first-child { text-align: left; }
  .cycle-labels span:last-child { text-align: right; }
  .cycle-needle {
    position: absolute; top: -6px; bottom: -6px; width: 3px;
    background: var(--text); box-shadow: 0 0 8px rgba(255,255,255,0.7);
    transition: left 0.4s ease;
  }
  .cycle-ghost {
    position: absolute; top: 2px; bottom: 2px; width: 2px;
    background: rgba(255,255,255,0.35);
    border-left: 1px dashed rgba(255,255,255,0.55);
    transition: left 0.4s ease;
  }
  /* Always-visible legend so users don't have to expand the panel-info
     details to figure out what the dashed ghost marker means. */
  .cycle-legend {
    display: flex; gap: 14px; margin-top: 6px;
    font-family: var(--mono); font-size: var(--fs-mono-xs);
    color: var(--text-dim); letter-spacing: 0.05em; text-transform: uppercase;
  }
  .cycle-legend .cl-item { display: inline-flex; align-items: center; gap: var(--sp-xs); }
  .cycle-legend .cl-swatch { display: inline-block; width: 2px; height: 10px; }
  .cycle-legend .cl-solid { background: var(--text); box-shadow: 0 0 4px rgba(255,255,255,0.7); }
  .cycle-legend .cl-dashed { background: transparent; border-left: 1px dashed rgba(255,255,255,0.55); }
  .cycle-trend-line {
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    color: var(--text-dim); margin-top: var(--sp-xs);
  }
  .cycle-trend-arrow {
    display: inline-block; padding: 1px 6px; border-radius: var(--r-sm);
    font-weight: 700; letter-spacing: 0.05em;
  }
  .cycle-trend-arrow.flat { background: rgba(138,146,168,0.15); color: var(--text-dim); }
  .cycle-trend-arrow.cooling, .cycle-trend-arrow.cooling_fast {
    background: rgba(96,165,250,0.2); color: var(--blue);
  }
  .cycle-trend-arrow.warming, .cycle-trend-arrow.warming_fast {
    background: rgba(248,113,113,0.2); color: var(--red);
  }
  .cycle-summary { min-width: 220px; font-family: var(--mono); }
  .cycle-phase { font-size: var(--fs-ui-lg); font-weight: 600; margin-bottom: var(--sp-xs); }
  .cycle-phase.capitulation { color: var(--red); }
  .cycle-phase.accumulation { color: var(--blue); }
  .cycle-phase.markup       { color: var(--green); }
  .cycle-phase.distribution { color: var(--yellow); }
  .cycle-pos { font-size: var(--fs-mono); color: var(--text-dim); }
  .cycle-conf { font-size: var(--fs-mono-sm); color: var(--text-dim); margin-top: var(--sp-xs); }
  .cycle-signals {
    display: grid; grid-template-columns: repeat(5, 1fr);
    gap: var(--sp-md); margin-top: var(--sp-lg); font-family: var(--mono); font-size: var(--fs-mono);
  }
  .cycle-sig-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-sm) 10px;
  }
  .cycle-sig-label { font-size: var(--fs-mono-xs); color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.06em; }
  .cycle-sig-val { font-size: var(--fs-body); margin-top: var(--sp-2xs); }

  /* heat thermometer */
  .heat-wrap { display: flex; gap: var(--sp-xl); align-items: center; }
  .heat-bar-wrap { flex: 1; }
  .heat-bar {
    height: 36px; border-radius: var(--r-sm); position: relative;
    background: linear-gradient(90deg, #507DFC 0%, #50FCD1 25%, #FFD166 60%, #FF9457 80%, #FF5E7F 100%);
    border: 1px solid var(--border);
  }
  .heat-needle {
    position: absolute; top: -6px; bottom: -6px; width: 3px;
    background: var(--text); box-shadow: 0 0 8px rgba(255,255,255,0.7);
    transition: left 0.4s ease;
  }
  .heat-labels {
    display: grid; grid-template-columns: repeat(5, 1fr);
    margin-top: 6px; font-size: var(--fs-mono-xs); font-family: var(--mono);
    color: var(--text-dim); text-transform: uppercase;
  }
  .heat-labels span:nth-child(2), .heat-labels span:nth-child(4) { text-align: center; }
  .heat-labels span:nth-child(3) { text-align: center; }
  .heat-labels span:last-child { text-align: right; }
  .heat-summary { min-width: 220px; font-family: var(--mono); }
  .heat-score { font-size: 32px; font-weight: 700; }
  .heat-score.cool { color: var(--blue); }
  .heat-score.neutral { color: var(--text); }
  .heat-score.warm { color: var(--yellow); }
  .heat-score.hot { color: var(--orange); }
  .heat-score.overheat { color: var(--red); }
  .heat-label-text { font-size: var(--fs-body); color: var(--text-dim); margin-top: var(--sp-2xs); }
  .heat-coverage { font-size: var(--fs-mono-sm); color: var(--text-dim); margin-top: var(--sp-xs); }
  .heat-comp-grid {
    display: grid; grid-template-columns: repeat(2, 1fr);
    gap: 6px; margin-top: var(--sp-lg);
  }
  .heat-comp {
    display: flex; justify-content: space-between; align-items: center;
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: 6px 10px;
    font-family: var(--mono); font-size: var(--fs-mono);
  }
  .heat-comp-name { color: var(--text-dim); }
  .heat-comp-vals { display: flex; gap: var(--sp-md); }
  .heat-comp-score { color: var(--text); }
  .heat-comp-contrib { color: var(--cyan); }

  /* asset-row layout */
  .two-col {
    display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-lg);
  }
  .three-col {
    display: grid; grid-template-columns: 1.2fr 1fr 1fr; gap: var(--sp-lg);
  }

  /* sentiment */
  .sentiment-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-md);
  }
  .sentiment-head {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: var(--sp-sm);
  }
  .sentiment-coin { font-weight: 600; font-size: var(--fs-body-lg); }
  .sentiment-score { font-family: var(--mono); font-size: var(--fs-body); }
  .sentiment-bias {
    font-size: var(--fs-mono-sm); font-family: var(--mono); text-transform: uppercase;
    padding: var(--sp-2xs) 6px; border-radius: var(--r-sm); margin-left: 6px;
  }
  .sentiment-bias.bullish { background: rgba(74,222,128,0.18); color: var(--green); }
  .sentiment-bias.bearish { background: rgba(248,113,113,0.18); color: var(--red); }
  .sentiment-bias.neutral { background: rgba(138,146,168,0.18); color: var(--text-dim); }
  .sentiment-narratives {
    font-size: var(--fs-mono); line-height: 1.5; color: var(--text-dim);
    border-top: 1px solid var(--border); padding-top: var(--sp-sm);
  }
  .sentiment-narratives li { padding: var(--sp-2xs) 0; list-style: disc; margin-left: 14px; }

  /* Verdict summary bento — compact cards that preview the 4 in-screen
     panels (Market Pulse, Daily Context, Signal Conflict, Intel Feed)
     with mini-visualizations. Click any card to scroll to the full panel.
     order: 11.5 equivalent — sits between #sec-overview (11) and
     #sec-conflict-resolver (12). */
  .panel-stack > .verdict-summary-bento { order: 11; }
  .verdict-summary-bento {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--sp-md);
    margin-bottom: var(--sp-lg);
    margin-top: var(--sp-xs);
  }
  @media (max-width: 900px) {
    .verdict-summary-bento { grid-template-columns: repeat(2, 1fr); }
  }
  .verdict-summary-bento .vsb-card {
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: var(--sp-md) 14px;
    display: flex;
    flex-direction: column;
    gap: 6px;
    text-decoration: none;
    color: var(--text);
    cursor: pointer;
    transition: border-color 120ms ease-out, background 120ms ease-out;
    min-height: 100px;
    position: relative;
    overflow: hidden;
  }
  .verdict-summary-bento .vsb-card:hover {
    border-color: rgba(80, 125, 252, 0.45);
    background: var(--bg-panel-2);
  }
  .verdict-summary-bento .vsb-card::after {
    content: '→';
    position: absolute;
    top: 12px;
    right: 14px;
    font-size: var(--fs-mono);
    color: var(--text-dim);
    opacity: 0;
    transition: opacity 120ms, transform 120ms;
  }
  .verdict-summary-bento .vsb-card:hover::after {
    opacity: 1;
    transform: translateX(2px);
    color: var(--blue);
  }
  .verdict-summary-bento .vsb-label {
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  .verdict-summary-bento .vsb-value {
    font-family: var(--mono);
    font-size: var(--fs-ui-lg);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--text);
    line-height: 1.15;
    letter-spacing: 0;
  }
  .verdict-summary-bento .vsb-value.positive { color: var(--green); }
  .verdict-summary-bento .vsb-value.negative { color: var(--red); }
  .verdict-summary-bento .vsb-value.warn { color: var(--yellow); }
  .verdict-summary-bento .vsb-value.info { color: var(--blue); }
  .verdict-summary-bento .vsb-sub {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* Mini viz: pulse dot strip */
  .verdict-summary-bento .vsb-pulse-strip {
    display: flex;
    gap: var(--sp-xs);
    margin-top: var(--sp-xs);
  }
  .verdict-summary-bento .vsb-pulse-dot {
    width: 14px;
    height: 4px;
    border-radius: var(--r-xs);
    background: var(--border);
  }
  .verdict-summary-bento .vsb-pulse-dot.high { background: var(--blue); }
  .verdict-summary-bento .vsb-pulse-dot.low { background: var(--orange, #FF9457); }
  .verdict-summary-bento .vsb-pulse-dot.mod { background: var(--text-dim); opacity: 0.6; }
  .verdict-summary-bento .vsb-pulse-dot.polar-bull { background: var(--green); }
  .verdict-summary-bento .vsb-pulse-dot.polar-bear { background: var(--red); }
  /* Mini viz: confidence ring (pseudo via linear gradient bar) */
  .verdict-summary-bento .vsb-conf-bar {
    margin-top: var(--sp-xs);
    height: 4px;
    background: var(--bg-panel-2);
    border-radius: var(--r-xs);
    overflow: hidden;
  }
  .verdict-summary-bento .vsb-conf-fill {
    height: 100%;
    background: var(--blue);
    border-radius: var(--r-xs);
    transition: width var(--dur-data-reveal) var(--ease-data-reveal);
  }
  .verdict-summary-bento .vsb-conf-fill.positive { background: var(--green); }
  .verdict-summary-bento .vsb-conf-fill.negative { background: var(--red); }
  .verdict-summary-bento .vsb-conf-fill.warn { background: var(--yellow); }
  /* Mini viz: conflict agreement ratio */
  .verdict-summary-bento .vsb-ratio {
    display: flex; align-items: center; gap: 6px;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    color: var(--text-dim); font-variant-numeric: tabular-nums;
  }
  .verdict-summary-bento .vsb-ratio-chip {
    padding: var(--sp-2xs) 6px;
    border-radius: var(--r-sm);
    font-size: var(--fs-mono-xs);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    background: var(--bg-panel-2);
  }
  .verdict-summary-bento .vsb-ratio-chip.positive { color: var(--green); background: rgba(80,252,209,0.10); }
  .verdict-summary-bento .vsb-ratio-chip.warn { color: var(--yellow); background: rgba(255,209,102,0.10); }
  /* Mini viz: intel freshness pulse dot */
  .verdict-summary-bento .vsb-fresh-dot {
    display: inline-block;
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--green);
    margin-right: 6px;
    animation: cw-live-pulse 2s ease-in-out infinite;
  }
  .verdict-summary-bento .vsb-fresh-dot.stale { background: var(--yellow); animation: none; }
  .verdict-summary-bento .vsb-fresh-dot.cold { background: var(--text-dim); animation: none; }

  /* Macro Bento Grid — data tiles, not nav duplicates.
     Each card is a scannable KPI with primary value + context + sparkline. */
  .macro-bento-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--sp-md);
    margin-bottom: var(--sp-lg);
  }
  @media (max-width: 900px) {
    .macro-bento-grid { grid-template-columns: repeat(2, 1fr); }
  }
  .macro-bento-grid .bento-card {
    /* Reset button-default styling — these tiles became <button> elements
       (was <a onclick> with no href, which broke keyboard semantics). */
    font: inherit;
    text-align: left;
    appearance: none;
    width: 100%;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: var(--sp-md) 14px;
    display: flex;
    flex-direction: column;
    gap: 6px;
    text-decoration: none;
    color: var(--text);
    transition: border-color 120ms ease-out, background 120ms ease-out;
    cursor: pointer;
    min-height: 92px;
    position: relative;
    overflow: hidden;
  }
  .macro-bento-grid .bento-card:hover {
    border-color: rgba(80, 125, 252, 0.45);
    background: var(--bg-panel-2);
  }
  .macro-bento-grid .bento-label {
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text-dim);
  }
  .macro-bento-grid .bento-value {
    font-family: var(--mono);
    font-size: var(--fs-display-sm);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--text);
    line-height: 1.1;
    letter-spacing: 0;
  }
  .macro-bento-grid .bento-value.positive { color: var(--green); }
  .macro-bento-grid .bento-value.negative { color: var(--red); }
  .macro-bento-grid .bento-value.warn { color: var(--yellow); }
  .macro-bento-grid .bento-value.info { color: var(--blue); }
  .macro-bento-grid .bento-sub {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* .bento-spark removed 2026-04-25 per user feedback — sparklines in the
     bento cards were rendering as ugly 2-3-point squiggles. Clean values only. */
  .macro-bento-grid .bento-arrow {
    display: inline-block;
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    margin-right: var(--sp-xs);
  }
  .macro-bento-grid .bento-arrow.up { color: var(--green); }
  .macro-bento-grid .bento-arrow.down { color: var(--red); }
  .macro-bento-grid .bento-arrow.flat { color: var(--text-dim); }
  .macro-bento-grid .bento-value.loading {
    color: var(--text-dim);
    font-style: italic;
    font-weight: 400;
    font-size: var(--fs-mono);
  }

  /* feed lists */
  .feed-list { list-style: none; padding: 0; }
  .feed-item {
    padding: var(--sp-sm) var(--sp-md); border-bottom: 1px solid var(--border);
    font-size: var(--fs-body-sm); line-height: 1.5; display: flex; gap: 10px;
  }
  .feed-item:last-child { border-bottom: none; }
  .feed-dot {
    flex: 0 0 8px; width: 8px; height: 8px; border-radius: 50%;
    margin-top: var(--sp-xs); background: var(--text-dim);
  }
  .feed-dot.high { background: var(--red); }
  .feed-dot.med { background: var(--yellow); }
  .feed-dot.low { background: var(--text-dim); }
  .feed-dot.bull { background: var(--green); }
  .feed-dot.bear { background: var(--red); }
  .feed-dot.cyan { background: var(--cyan); }
  .feed-dot.purple { background: var(--purple); }
  .feed-text { flex: 1; }
  .feed-meta { color: var(--text-dim); font-size: var(--fs-mono-sm); font-family: var(--mono); margin-top: var(--sp-2xs); }

  /* funding table */
  table.funding {
    width: 100%; border-collapse: collapse;
    font-family: var(--mono); font-size: var(--fs-body-sm);
  }
  table.funding th, table.funding td {
    text-align: left; padding: 6px 10px; border-bottom: 1px solid var(--border);
  }
  table.funding th {
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); font-weight: 500;
  }
  table.funding th.num, table.funding td.num {
    text-align: right; font-variant-numeric: tabular-nums;
  }
  table.funding tr:last-child td { border-bottom: none; }
  table.funding td.coin-name { font-weight: 600; }

  /* polymarket */
  .pm-item {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: 10px var(--sp-md); margin-bottom: var(--sp-sm);
  }
  .pm-q { font-size: var(--fs-body-sm); line-height: 1.4; margin-bottom: 6px; }
  .pm-bar { display: flex; height: 6px; border-radius: var(--r-sm); overflow: hidden; background: var(--border); }
  .pm-bar-yes { background: var(--green); }
  .pm-bar-no { background: var(--red); }
  .pm-meta {
    display: flex; justify-content: space-between; margin-top: var(--sp-xs);
    font-size: var(--fs-mono-sm); font-family: var(--mono); color: var(--text-dim);
  }
  .pm-yes { color: var(--green); }
  .pm-no { color: var(--red); }

  /* polymarket synthesis cards (2026-04-16) */
  .pm-synth {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-md);
    margin-bottom: var(--sp-md);
  }
  @media (max-width: 900px) { .pm-synth { grid-template-columns: 1fr; } }
  .pm-card {
    padding: 14px var(--sp-lg);
    background: linear-gradient(135deg, rgba(116,152,253,0.05), rgba(80,252,209,0.02));
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    display: flex; flex-direction: column; gap: var(--sp-sm);
    font-family: var(--mono);
  }
  .pm-card-label {
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text-dim);
  }
  .pm-card-hero {
    font-size: var(--fs-ui); font-weight: 600;
    color: var(--text-strong, #e6e8ef);
    line-height: 1.3;
  }
  .pm-card-hero b.bull { color: #50FCD1; }
  .pm-card-hero b.bear { color: #FF5E7F; }
  .pm-card-hero b.neutral { color: #8BDBEC; }
  .pm-card-hero b.warn { color: #f59e0b; }
  .pm-card-breakdown {
    font-size: var(--fs-mono); color: var(--text-dim);
    line-height: 1.6;
    padding-top: 6px;
    border-top: 1px solid rgba(36,41,56,0.6);
  }
  .pm-card-breakdown .pm-bd-row {
    display: flex; justify-content: space-between;
    font-variant-numeric: tabular-nums;
  }
  .pm-card-breakdown .pm-bd-row b { color: var(--text-strong, #e6e8ef); }
  .pm-card-breakdown .pm-bd-row .pos { color: #50FCD1; }
  .pm-card-breakdown .pm-bd-row .neg { color: #FF5E7F; }
  .pm-dashboard-tie {
    padding: 10px 14px;
    background: rgba(36,41,56,0.3);
    border-left: 3px solid #8BDBEC;
    border-radius: var(--r-sm);
    font-family: var(--mono);
    font-size: var(--fs-mono); line-height: 1.55;
    color: var(--text-strong, #e6e8ef);
    margin-bottom: 10px;
  }
  .pm-dashboard-tie b.bull { color: #50FCD1; }
  .pm-dashboard-tie b.bear { color: #FF5E7F; }
  .pm-dashboard-tie b.warn { color: #f59e0b; }
  .pm-dashboard-tie .pm-tie-label {
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.08em;
    color: #8BDBEC;
    display: block;
    margin-bottom: var(--sp-xs);
  }
  .pm-raw summary {
    font-size: var(--fs-mono-sm); color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.06em;
    cursor: pointer; padding: var(--sp-xs) 0;
  }

  /* Conflict chip in Composite Signal panel-head — Phase 2 simplification
     (2026-05-04). Replaces the standalone Conflict Resolver panel. Single-
     line answer = single-line UI. Tooltip on the chip carries the active-
     rule names so detail isn't lost. */
  .composite-head-right {
    display: inline-flex; align-items: center; gap: var(--sp-sm);
    margin-left: auto;
  }
  .cs-conflict-chip {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 3px 9px;
    border: 1px solid var(--border);
    border-radius: var(--r-pill, 999px);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-dim);
    background: var(--bg-panel);
    cursor: help;
    user-select: none;
    transition: all 140ms ease-out;
  }
  .cs-conflict-chip[data-state="aligned"] {
    color: var(--aqua);
    border-color: rgba(80,252,209,0.45);
    background: rgba(80,252,209,0.06);
  }
  .cs-conflict-chip[data-state="conflict"] {
    color: var(--amber, #F59E0B);
    border-color: rgba(245,158,11,0.45);
    background: rgba(245,158,11,0.06);
  }
  .cs-conflict-chip[data-state="loading"] { opacity: 0.5; }

  /* --- Signal Conflict Resolver panel (advanced benchmark Phase A) --- */
  #sec-conflict-resolver .cr-resolver-rules {
    display: flex; flex-direction: column; gap: 10px;
  }
  #sec-conflict-resolver .cr-rule {
    padding: var(--sp-md) 14px;
    border: 1px solid var(--panel-border, #1a1f2c);
    border-left: 3px solid var(--muted, #8a92a8);
    border-radius: var(--r-md);
    font-family: var(--mono);
    background: rgba(36,41,56,0.3);
  }
  #sec-conflict-resolver .cr-rule.active {
    border-left-color: #f59e0b;
    background: linear-gradient(135deg, rgba(245,158,11,0.06), rgba(36,41,56,0.3));
  }
  #sec-conflict-resolver .cr-rule-head {
    display: flex; justify-content: space-between; align-items: baseline;
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
    margin-bottom: 6px;
  }
  #sec-conflict-resolver .cr-rule-head .cr-rule-tag {
    color: var(--text-dim, #8a92a8);
    padding: var(--sp-2xs) var(--sp-sm);
    border-radius: var(--r-lg);
    background: rgba(138,151,168,0.15);
    font-size: var(--fs-mono-xs);
  }
  #sec-conflict-resolver .cr-rule.active .cr-rule-tag {
    color: #f59e0b;
    background: rgba(245,158,11,0.15);
  }
  #sec-conflict-resolver .cr-rule-line {
    font-size: var(--fs-body); line-height: 1.5;
    color: var(--text-strong, #e6e8ef);
    font-weight: 500;
  }
  #sec-conflict-resolver .cr-rule-line b.bull { color: #50FCD1; }
  #sec-conflict-resolver .cr-rule-line b.bear { color: #FF5E7F; }
  #sec-conflict-resolver .cr-rule-line b.warn { color: #f59e0b; }
  #sec-conflict-resolver .cr-rule-line b.neutral { color: #8BDBEC; }
  #sec-conflict-resolver .cr-rule-verdict {
    font-size: var(--fs-mono); line-height: 1.55;
    color: var(--text-dim, #8a92a8);
    margin-top: 6px;
    padding-top: 6px;
    border-top: 1px dashed rgba(138,151,168,0.2);
  }
  #sec-conflict-resolver .cr-rule-verdict b { color: var(--text-strong, #e6e8ef); }
  #sec-conflict-resolver .cr-resolver-empty {
    padding: 14px var(--sp-lg);
    background: rgba(80,252,209,0.05);
    border: 1px solid rgba(80,252,209,0.2);
    border-radius: var(--r-md);
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    color: var(--text-strong, #e6e8ef);
  }

  /* --- Shared synthesis hero (audit fixes 2026-04-16) --- */
  .synth-hero {
    padding: 14px var(--sp-lg);
    background: linear-gradient(135deg, rgba(116,152,253,0.06), rgba(80,252,209,0.03));
    border: 1px solid var(--border, #1a1f2c);
    border-left: 3px solid #8BDBEC;
    border-radius: var(--r-md);
    margin-bottom: var(--sp-md);
    font-family: var(--mono);
  }
  .synth-hero-label {
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.08em;
    color: #8BDBEC;
    margin-bottom: 6px;
  }
  .synth-hero-line {
    font-size: var(--fs-body-lg); line-height: 1.45;
    color: var(--text-strong, #e6e8ef);
    font-weight: 500;
  }
  .synth-hero-line b.bull { color: #50FCD1; }
  .synth-hero-line b.bear { color: #FF5E7F; }
  .synth-hero-line b.warn { color: #f59e0b; }
  .synth-hero-line b.neutral { color: #8BDBEC; }
  .synth-hero-sub {
    font-size: var(--fs-mono);
    color: var(--text-dim, #8a92a8);
    margin-top: 6px;
    line-height: 1.5;
  }
  /* Macro V2 §4.B item 6 — historical-distribution percentile badge */
  .pred-signal-percentile {
    margin-top: var(--sp-sm);
    padding: var(--sp-xs) var(--sp-sm);
    background: var(--bg-panel-2, #1a1f2c);
    border: 1px solid var(--border, #242938);
    border-radius: var(--r-sm);
    font-size: var(--fs-mono-sm);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    display: inline-flex;
    gap: var(--sp-sm);
    align-items: center;
    flex-wrap: wrap;
  }
  .pred-signal-percentile .psp-label { letter-spacing: 0.06em; text-transform: uppercase; font-size: var(--fs-mono-xs); }
  .pred-signal-percentile .psp-pct   { color: var(--text, #e6e8ef); font-weight: 700; }
  .pred-signal-percentile .psp-pct.psp-strong { color: var(--green, #50FCD1); }
  .pred-signal-percentile .psp-pct.psp-weak   { color: var(--red, #FF5E7F); }
  .pred-signal-percentile .psp-detail { color: var(--text-dim, #8a92a8); }

  /* Cycle Bottom Radar v2 (2026-05-04 redesign) — score-gauge + grouped
     vote columns. Replaces the original 14-chip cloud + near-flat
     sparkline (both reading as visual noise). */

  /* Score + verdict hero */
  .cbr-hero {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-xl);
    margin-top: var(--sp-md);
  }
  .cbr-score {
    display: flex;
    align-items: baseline;
    gap: 4px;
    flex-shrink: 0;
    line-height: 1;
  }
  /* .cbr-score-num inherits Doto + glow + pulse from .cw-hero-numeral
     (added directly to the markup). All variants live on the utility now. */
  .cbr-score-frac {
    font-family: var(--font-display);
    font-size: var(--fs-display-sm);
    font-weight: 600;
    line-height: 1;
    color: var(--text-dim);
  }
  .cbr-verdict-block {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding-top: 6px;
    min-width: 0;
  }
  .cbr-verdict {
    font: 700 var(--fs-ui-lg)/1.25 var(--font-display);
    color: var(--text);
  }
  .cbr-verdict.bull { color: var(--green); }
  .cbr-verdict.bear { color: var(--red); }
  .cbr-verdict.warn { color: var(--yellow); }
  .cbr-verdict-sub {
    font: 400 var(--fs-body)/1.45 var(--font-body);
    color: var(--text-dim);
  }
  .cbr-trajectory {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sp-md);
    font: 600 var(--fs-mono-sm) var(--mono);
    color: var(--text-dim);
    letter-spacing: 0.05em;
    text-transform: uppercase;
    margin-top: 4px;
  }
  .cbr-trajectory .traj-up   { color: var(--green); margin-right: 4px; }
  .cbr-trajectory .traj-down { color: var(--red);   margin-right: 4px; }
  .cbr-trajectory .traj-flat { color: var(--text-dim); margin-right: 4px; opacity: 0.7; }

  /* Score gauge — 0-100 with band labels above and numeric ticks below */
  .cbr-gauge { margin-top: var(--sp-lg); }
  .cbr-gauge-band-labels {
    display: flex;
    margin-bottom: 6px;
  }
  .cbr-gauge-band-label {
    flex: 1;
    text-align: center;
    font: 700 var(--fs-mono-xs) var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text-dim);
    opacity: 0.55;
  }
  .cbr-gauge-band-label.band-top    { color: var(--red);    opacity: 0.85; }
  .cbr-gauge-band-label.band-mixed  { color: var(--yellow); opacity: 0.85; }
  .cbr-gauge-band-label.band-constr { color: var(--green);  opacity: 0.6;  }
  .cbr-gauge-band-label.band-strong { color: var(--green);  opacity: 0.95; }
  .cbr-gauge-track {
    position: relative;
    display: flex;
    height: 14px;
    border-radius: var(--r-sm);
    overflow: visible;
    border: 1px solid var(--border);
  }
  .cbr-gauge-band {
    flex: 1;
    height: 100%;
  }
  .cbr-gauge-band:first-child { border-radius: var(--r-sm) 0 0 var(--r-sm); }
  .cbr-gauge-band:last-child  { border-radius: 0 var(--r-sm) var(--r-sm) 0; }
  .cbr-gauge-band.band-top    { background: rgba(255, 94, 127, 0.22); }
  .cbr-gauge-band.band-mixed  { background: rgba(255, 209, 102, 0.18); }
  .cbr-gauge-band.band-constr { background: rgba(80, 252, 209, 0.15); }
  .cbr-gauge-band.band-strong { background: rgba(80, 252, 209, 0.32); }
  .cbr-gauge-marker {
    position: absolute;
    top: -4px;
    bottom: -4px;
    width: 3px;
    background: var(--text);
    transform: translateX(-50%);
    pointer-events: none;
    box-shadow: 0 0 0 2px var(--bg-panel),
                0 0 12px rgba(80, 252, 209, 0.55);
    /* Signature data-reveal motion — settles into final position over 900ms. */
    transition: left var(--dur-data-reveal) var(--ease-data-reveal);
  }
  .cbr-gauge-marker::before {
    content: "";
    position: absolute;
    top: -8px;
    left: 50%;
    transform: translateX(-50%);
    width: 0;
    height: 0;
    border-left: 6px solid transparent;
    border-right: 6px solid transparent;
    border-top: 7px solid var(--text);
  }
  .cbr-gauge-axis {
    display: flex;
    justify-content: space-between;
    margin-top: 6px;
    font: 500 var(--fs-mono-xs) var(--mono);
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.04em;
  }

  /* Vote columns — Bottom / Neutral / Top, tinted by category */
  .cbr-vote-cols {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-md);
    margin-top: var(--sp-xl);
  }
  .cbr-vote-col {
    border-radius: var(--r-md);
    border: 1px solid var(--border);
    padding: var(--sp-sm) var(--sp-md) var(--sp-md);
    background: rgba(255, 255, 255, 0.015);
  }
  /* 30-day sparkline below the gauge — Tufte trajectory companion. */
  .cbr-spark-wrap {
    margin: var(--sp-md) 0 var(--sp-sm);
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  .cbr-spark { width: 100%; height: 60px; display: block; }
  .cbr-spark-meta {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    font-family: var(--mono);
    font-size: 9.5px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  .cbr-spark-delta { font-weight: 700; letter-spacing: 0.04em; }
  .cbr-spark-delta.pos { color: var(--cyan, #50FCD1); }
  .cbr-spark-delta.neg { color: var(--rose, #FF5E7F); }
  .cbr-spark-delta.flat { color: var(--text-dim); }

  .cbr-vote-col.bottom  { background: rgba(80, 252, 209, 0.05);  border-color: rgba(80, 252, 209, 0.25); }
  .cbr-vote-col.top     { background: rgba(255, 94, 127, 0.05);  border-color: rgba(255, 94, 127, 0.25); }
  .cbr-vote-col.neutral { background: rgba(255, 255, 255, 0.02); }

  /* Stacked vote bar — added 2026-05-09 per Datawrapper part-to-whole
     guidance. Sits above the 3 detail columns, gives a single-glance
     read of "what's the cycle voting" before the user scans details. */
  .cbr-vote-stack {
    display: flex;
    flex-direction: column;
    gap: var(--sp-xs);
    margin: var(--sp-md) 0 var(--sp-lg);
  }
  .cbr-vote-stack-bar {
    display: flex;
    height: 22px;
    width: 100%;
    border-radius: var(--r-sm);
    overflow: hidden;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid var(--border);
    transition: width 720ms cubic-bezier(0.22, 1, 0.36, 1);
  }
  .cbr-vote-seg {
    display: flex;
    align-items: center;
    justify-content: center;
    transition: width 720ms cubic-bezier(0.22, 1, 0.36, 1);
    overflow: hidden;
    font-family: var(--mono);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    color: rgba(11, 14, 20, 0.9);
    white-space: nowrap;
  }
  .cbr-vote-seg.cbr-seg-narrow .cbr-seg-label { display: none; }
  .cbr-seg-bottom  { background: rgba(80, 252, 209, 0.85); }
  .cbr-seg-neutral { background: rgba(168, 175, 192, 0.55); color: var(--text); }
  .cbr-seg-top     { background: rgba(255, 94, 127, 0.85); }
  .cbr-vote-stack-legend {
    display: flex;
    gap: var(--sp-lg);
    flex-wrap: wrap;
    font-family: var(--mono);
    font-size: 10px;
    color: var(--text-dim);
    letter-spacing: 0.06em;
  }
  .cbr-vote-stack-legend span { display: inline-flex; align-items: center; gap: 6px; }
  .cbr-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
  .cbr-dot-bottom  { background: rgba(80, 252, 209, 0.85); }
  .cbr-dot-neutral { background: rgba(168, 175, 192, 0.6); }
  .cbr-dot-top     { background: rgba(255, 94, 127, 0.85); }
  @media (prefers-reduced-motion: reduce) {
    .cbr-vote-stack-bar, .cbr-vote-seg { transition: none; }
  }
  .cbr-vote-col-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-sm);
    font: 700 var(--fs-mono-sm) var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text-dim);
    padding-bottom: var(--sp-xs);
    margin-bottom: var(--sp-sm);
    border-bottom: 1px solid var(--border);
  }
  .cbr-vote-col.bottom .cbr-vote-col-head { color: var(--green); border-bottom-color: rgba(80, 252, 209, 0.25); }
  .cbr-vote-col.top    .cbr-vote-col-head { color: var(--red);   border-bottom-color: rgba(255, 94, 127, 0.25); }
  .cbr-vote-col-count {
    font-family: var(--font-display);
    font-size: var(--fs-display-sm);
    font-weight: 800;
    line-height: 1;
    color: inherit;
    font-variant-numeric: tabular-nums;
  }
  .cbr-vote-col-body {
    display: flex;
    flex-direction: column;
    gap: 2px;
  }
  .cbr-vote-col-empty {
    font: italic 400 var(--fs-body-sm) var(--font-body);
    color: var(--text-dim);
    opacity: 0.55;
  }
  .cbr-vote-row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-sm);
    font: var(--fs-body-sm)/1.5 var(--font-body);
    color: var(--text);
    padding: 3px 0;
    /* Staggered reveal on first paint — index-driven via inline style.
       Once revealed (animation-fill-mode: forwards), no perpetual motion. */
    opacity: 0;
    transform: translateY(4px);
    animation: cbr-row-in var(--dur-data-reveal) var(--ease-data-reveal) forwards;
    animation-delay: calc(var(--cbr-row-i, 0) * 30ms);
  }
  .cbr-vote-row + .cbr-vote-row { border-top: 1px solid rgba(255, 255, 255, 0.04); }
  @keyframes cbr-row-in {
    to { opacity: 1; transform: translateY(0); }
  }
  .cbr-vote-row-name {
    font-weight: 700;
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    gap: 6px;
  }
  .cbr-vote-row-name::before {
    content: "";
    display: inline-block;
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
    opacity: 0.6;
    flex-shrink: 0;
  }
  .cbr-vote-col.bottom  .cbr-vote-row-name { color: var(--green); }
  .cbr-vote-col.top     .cbr-vote-row-name { color: var(--red); }
  .cbr-vote-col.neutral .cbr-vote-row-name { color: var(--text); }
  .cbr-vote-row-detail {
    color: var(--text-dim);
    font: var(--fs-mono-sm) var(--mono);
    text-align: right;
    letter-spacing: 0.02em;
    min-width: 0;
    overflow-wrap: anywhere;
  }

  @media (max-width: 720px) {
    .cbr-hero { flex-direction: column; gap: var(--sp-sm); }
    .cbr-verdict-block { padding-top: 0; }
    .cbr-vote-cols { grid-template-columns: 1fr; gap: var(--sp-sm); margin-top: var(--sp-lg); }
    .cbr-gauge-band-label { font-size: 8px; letter-spacing: 0.04em; }
  }

  /* Hero-panel utility — static HUD/sci-fi chrome for headline panels.
     Ambient effects (all static, no perpetual motion):
       - dot-grid background pattern (Nothing-OS texture)
       - corner gradient meshes (aqua top-right, blue bottom-left)
       - inset glowing top edge + soft outer aqua glow
     Banned per operator (2026-05-04): cursor-reactive spotlight,
     scan-line one-shot, holographic moving gradient border. */
  .cw-hero-panel {
    position: relative;
    overflow: hidden;
    background:
      radial-gradient(120% 80% at 100% 0%, rgba(80, 252, 209, 0.06), transparent 60%),
      radial-gradient(80% 60% at 0% 100%, rgba(80, 125, 252, 0.04), transparent 70%),
      radial-gradient(circle at 1.5px 1.5px, rgba(80, 252, 209, 0.10) 1px, transparent 0) 0 0 / 16px 16px,
      var(--bg-panel);
    box-shadow: inset 0 1px 0 rgba(80, 252, 209, 0.35),
                0 0 80px rgba(80, 252, 209, 0.06),
                0 24px 60px -20px rgba(0, 0, 0, 0.6);
  }
  .cw-hero-panel > .panel-head,
  .cw-hero-panel > .panel-body {
    position: relative;
    z-index: 3;
  }
  /* Hero numeral utility — Doto dot-matrix + multi-stop neon glow stack
     keyed by .bull / .bear / .warn class. Apply via class="cw-hero-numeral"
     plus a tone modifier. Pair with .cw-hero-numeral.is-live to enable
     the cw-live-pulse signature animation. */
  .cw-hero-numeral {
    font-family: 'Doto', 'Fira Code', var(--mono);
    font-size: 64px;
    font-weight: 700;
    line-height: 1;
    color: var(--text);
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.02em;
    transition: text-shadow var(--dur-data-reveal) var(--ease-data-reveal),
                color var(--dur-base) var(--ease-out);
  }
  .cw-hero-numeral.bull {
    color: var(--green);
    text-shadow:
      0 0 4px rgba(80, 252, 209, 0.95),
      0 0 16px rgba(80, 252, 209, 0.75),
      0 0 48px rgba(80, 252, 209, 0.45);
  }
  .cw-hero-numeral.bear {
    color: var(--red);
    text-shadow:
      0 0 4px rgba(255, 94, 127, 0.95),
      0 0 16px rgba(255, 94, 127, 0.7),
      0 0 48px rgba(255, 94, 127, 0.4);
  }
  .cw-hero-numeral.warn {
    color: var(--yellow);
    text-shadow:
      0 0 4px rgba(255, 209, 102, 0.9),
      0 0 16px rgba(255, 209, 102, 0.6),
      0 0 48px rgba(255, 209, 102, 0.35);
  }
  .cw-hero-numeral.is-live { animation: cw-live-pulse 2s ease-in-out infinite; }
  .cw-hero-numeral.is-scrambling { opacity: 0.78; }
  /* Reduced motion neutralizes the live pulse on hero numerals. */
  @media (prefers-reduced-motion: reduce) {
    .cw-hero-numeral.is-live { animation: none; }
  }
  /* Mobile: shrink hero numerals so they don't overflow on phones */
  @media (max-width: 720px) {
    .cw-hero-numeral { font-size: 48px; }
  }
  /* Verdict sub-line as chips, not prose */
  .cbr-sub-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 4px;
  }
  .cbr-sub-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 10px 3px 8px;
    border-radius: 999px;
    font: 700 var(--fs-mono-xs)/1 var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    background: rgba(80, 252, 209, 0.08);
    border: 1px solid rgba(80, 252, 209, 0.25);
    color: var(--green);
    white-space: nowrap;
  }
  .cbr-sub-chip::before {
    content: "";
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
    box-shadow: 0 0 8px currentColor;
  }
  .cbr-sub-chip.bear {
    background: rgba(255, 94, 127, 0.08);
    border-color: rgba(255, 94, 127, 0.25);
    color: var(--red);
  }

  /* Reduced-motion: neutralize the staggered reveal + marker glide.
     The .cw-hero-* utilities have their own reduce-motion override. */
  @media (prefers-reduced-motion: reduce) {
    .cbr-vote-row {
      opacity: 1;
      transform: none;
      animation: none;
    }
    .cbr-gauge-marker { transition-duration: 0.01ms; }
  }

  /* v1.8 Tier C — Market State hero banner.
     Color tokens: --green/--red/--gold align with .synth-hero-line and
     .cg-cyc-value across the rest of /macro so all summary verdicts
     read in the same palette. Numbers in --mono per DESIGN.md
     (all numerics in mono) — labels stay in --font-display. */
  .ms-hero { display: flex; flex-direction: column; gap: var(--sp-sm); }
  .ms-hero-row {
    display: flex; align-items: baseline; justify-content: space-between;
    flex-wrap: wrap; gap: var(--sp-md);
  }
  .ms-state {
    font-family: var(--font-display);
    font-size: var(--fs-display);
    font-weight: 700;
    letter-spacing: 0.05em;
    line-height: 1.1;
    margin: 0;
  }
  .ms-state.bull { color: var(--green); text-shadow: 0 0 16px rgba(80, 252, 209, 0.25); }
  .ms-state.bear { color: var(--red); text-shadow: 0 0 16px rgba(255, 94, 127, 0.25); }
  .ms-state.warn { color: var(--gold); }
  /* .ms-score inherits font-family + size + glow from .cw-hero-numeral.
     Tone classes left here so older render code that still applies just
     `ms-score bull` keeps working without depending on the utility. */
  .ms-score.bull { color: var(--green); }
  .ms-score.bear { color: var(--red); }
  .ms-score.warn { color: var(--gold); }
  .ms-action {
    font: 600 var(--fs-ui-lg) var(--font-display);
    letter-spacing: 0.04em;
  }
  .ms-action.bull { color: var(--green); }
  .ms-action.bear { color: var(--red); }
  .ms-action.warn { color: var(--gold); }
  /* v1.9 — action+allocation share one row instead of stacking; tightens
     the hero by ~28px and reads as "verb + the number" (a paired idea). */
  .ms-action-row {
    display: flex; align-items: baseline; justify-content: space-between;
    flex-wrap: wrap; gap: var(--sp-md);
  }
  .ms-alloc {
    font: 600 var(--fs-display-md) var(--mono);
    letter-spacing: 0.04em;
    font-variant-numeric: tabular-nums;
    color: var(--text);
  }
  .ms-rationale {
    font: 400 var(--fs-body)/1.5 var(--font-body);
    color: var(--text);
    margin: var(--sp-2xs) 0 0;
  }
  .ms-trajectory {
    font: 400 var(--fs-mono-sm) var(--mono);
    color: var(--text-dim);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    border-top: 1px dashed var(--border);
    padding-top: var(--sp-sm);
    margin-top: var(--sp-sm);
  }

  /* v1.8 Tier D — Fair-Value Cluster composite.
     v1.9 — compacted to a horizontal layout so it doesn't visually
     compete with the Tier C Market State hero above it. State + score
     left, components right; note tucked underneath. Hero-stacking
     tightened so the whole panel reads as a sub-summary, not a
     second hero. */
  .fvc-hero { display: flex; flex-direction: column; gap: var(--sp-xs); }
  .fvc-hero-row {
    display: flex; align-items: baseline; justify-content: space-between;
    flex-wrap: wrap; gap: var(--sp-md);
  }
  .fvc-state {
    font-family: var(--font-display);
    font-size: var(--fs-ui-lg);
    font-weight: 700;
    letter-spacing: 0.05em;
    line-height: 1.1;
    margin: 0;
  }
  .fvc-state.bull { color: var(--green); }
  .fvc-state.bear { color: var(--red); }
  .fvc-state.warn { color: var(--gold); }
  /* .fvc-score inherits font-family + size + glow from .cw-hero-numeral. */
  .fvc-score.bull { color: var(--green); }
  .fvc-score.bear { color: var(--red); }
  .fvc-score.warn { color: var(--gold); }
  .fvc-note {
    font: 400 var(--fs-body)/1.5 var(--font-body);
    color: var(--text);
    margin: 0;
  }
  .fvc-components {
    font: 400 var(--fs-mono-sm) var(--mono);
    color: var(--text-dim);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    border-top: 1px dashed var(--border);
    padding-top: var(--sp-sm);
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-md);
  }
  .fvc-components .fvc-comp { display: inline-flex; gap: var(--sp-2xs); }
  .fvc-components .fvc-comp .fvc-comp-name { color: var(--text-dim); }
  .fvc-components .fvc-comp .fvc-comp-val  {
    color: var(--text);
    font-variant-numeric: tabular-nums;
  }

  /* Macro V2 §4.B item 5 — Risk-Parity vol-target slider */
  .dca-vol-slider-wrap {
    margin-top: var(--sp-md);
    padding: var(--sp-sm) var(--sp-md);
    background: var(--bg-panel-2, #1a1f2c);
    border: 1px solid var(--border, #242938);
    border-radius: var(--r-sm);
  }
  .dca-vol-slider-label {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    font-size: var(--fs-mono-sm);
    color: var(--text-dim, #8a92a8);
    margin-bottom: var(--sp-xs);
  }
  .dca-vol-slider-key { letter-spacing: 0.06em; text-transform: uppercase; }
  #dca-vol-slider-value {
    font-size: var(--fs-body-lg);
    font-weight: 700;
    color: var(--text, #e6e8ef);
    font-family: var(--mono);
  }
  #dca-vol-slider {
    width: 100%;
    accent-color: var(--blue, #507DFC);
    cursor: pointer;
  }
  .dca-vol-slider-out {
    margin-top: var(--sp-sm);
    font-size: var(--fs-mono-sm);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    line-height: 1.6;
  }
  .dca-vol-slider-out b { color: var(--text, #e6e8ef); }
  .dca-vol-slider-out b.bull { color: var(--green, #50FCD1); }
  .dca-vol-slider-out b.warn { color: var(--yellow, #FFD166); }
  .dca-vol-slider-out b.bear { color: var(--red, #FF5E7F); }
  .synth-raw summary {
    font-size: var(--fs-mono-sm); color: var(--text-dim, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.06em;
    cursor: pointer; padding: 6px 0;
  }
  .synth-raw[open] summary { color: #8BDBEC; }
  .funding-universe-control {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-md);
    margin: var(--sp-md) 0 var(--sp-sm);
    padding: var(--sp-sm) var(--sp-md);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    background: var(--bg-panel-2);
  }
  .funding-universe-kicker {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    line-height: 1.3;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim, #8a92a8);
  }
  .funding-universe-label {
    margin-top: var(--sp-2xs);
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    line-height: 1.35;
    color: var(--text, #e6e8ef);
  }
  .funding-universe-toggle {
    flex: 0 0 auto;
    min-height: 32px;
    padding: var(--sp-xs) var(--sp-md);
    border: 1px solid rgba(80, 252, 209, 0.45);
    border-radius: var(--r-sm);
    background: rgba(80, 252, 209, 0.09);
    color: var(--green, #50FCD1);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    cursor: pointer;
    white-space: nowrap;
  }
  .funding-universe-toggle[aria-pressed="true"] {
    border-color: rgba(139, 219, 236, 0.5);
    background: rgba(139, 219, 236, 0.09);
    color: #8BDBEC;
  }
  .funding-empty {
    padding: var(--sp-md);
    border: 1px dashed var(--border);
    border-radius: var(--r-sm);
    color: var(--text-dim, #8a92a8);
    font-size: var(--fs-body-sm);
    line-height: 1.5;
  }
  @media (max-width: 640px) {
    .funding-universe-control {
      align-items: stretch;
      flex-direction: column;
      gap: var(--sp-sm);
    }
    .funding-universe-toggle {
      width: 100%;
      white-space: normal;
    }
  }

  /* trending tags */
  .trending-tags { display: flex; flex-wrap: wrap; gap: 6px; padding-top: 6px; }
  .tag {
    display: inline-block; padding: 3px var(--sp-sm); border-radius: var(--r-sm);
    font-size: var(--fs-mono-sm); font-family: var(--mono);
    background: var(--bg-panel-2); color: var(--cyan);
    border: 1px solid var(--border);
  }

  /* tier 1 confluence panel */
  .t1-head {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: var(--sp-sm);
  }
  .t1-count {
    font-family: var(--mono); font-size: var(--fs-body); font-weight: 600;
  }
  .t1-count.none { color: var(--text-dim); }
  .t1-count.low { color: var(--blue); }
  .t1-count.medium { color: var(--yellow); }
  .t1-count.high { color: var(--orange); }
  .t1-count.max { color: var(--red); }
  .t1-conviction {
    font-family: var(--mono); font-size: var(--fs-mono); color: var(--text-dim);
  }
  .t1-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;
  }
  .t1-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-sm) var(--sp-md);
    font-family: var(--mono); font-size: var(--fs-mono);
    line-height: 1.35;
  }
  .t1-card.triggered { border-color: var(--green); background: rgba(74,222,128,0.08); }
  .t1-card .t1-name {
    font-size: var(--fs-body-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); margin-bottom: var(--sp-xs);
  }
  .t1-card .t1-raw {
    font-size: var(--fs-body-lg); font-weight: 600; color: var(--text);
  }
  .t1-card.triggered .t1-raw { color: var(--green); }
  .t1-card .t1-thresh {
    font-size: var(--fs-mono); color: var(--text-dim); margin-top: var(--sp-2xs);
  }
  .t1-card .t1-status {
    display: inline-block; padding: 1px 6px; border-radius: var(--r-xs);
    font-size: var(--fs-mono-xs); margin-top: var(--sp-xs); text-transform: uppercase;
    background: var(--border); color: var(--text-dim);
  }
  .t1-card.triggered .t1-status {
    background: rgba(74,222,128,0.2); color: var(--green);
  }
  /* Alert button + modal */
  .alert-btn {
    margin-left: 6px; cursor: pointer; user-select: none;
    background: none; border: 1px solid transparent;
    color: var(--text-dim); font-family: var(--mono); font-size: var(--fs-mono-xs);
    padding: 1px var(--sp-xs); border-radius: var(--r-sm); vertical-align: middle;
    opacity: 0; transition: opacity 0.15s, color 0.15s, border-color 0.15s;
  }
  .t1-card:hover .alert-btn,
  .t2-row:hover .alert-btn { opacity: 0.8; border-color: var(--border); }
  .alert-btn:hover { color: var(--blue); border-color: var(--blue) !important; opacity: 1 !important; }
  .alert-btn.set {
    color: var(--cyan); border-color: var(--cyan) !important;
    background: rgba(80,252,209,0.08); opacity: 1 !important;
  }
  .alert-modal-backdrop {
    position: fixed; inset: 0; z-index: 200;
    background: rgba(0,0,0,0.65);
    display: flex; align-items: center; justify-content: center;
    padding: 20px;
  }
  .alert-modal {
    background: var(--bg-panel); border: 1px solid var(--blue);
    border-radius: var(--r-md); padding: 20px;
    max-width: 420px; width: 100%;
    font-family: var(--mono); font-size: var(--fs-body-sm); color: var(--text);
  }
  .alert-modal h3 {
    margin: 0 0 var(--sp-md); font-family: var(--font-display);
    font-size: var(--fs-body-lg); color: var(--blue);
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  .alert-modal label {
    display: block; margin: 10px 0 var(--sp-xs);
    font-size: var(--fs-mono-sm); color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  .alert-modal select, .alert-modal input {
    width: 100%; padding: var(--sp-sm) 10px;
    background: var(--bg-panel-2); border: 1px solid var(--border);
    color: var(--text); font-family: var(--mono); font-size: var(--fs-body-sm);
    border-radius: var(--r-sm);
  }
  .alert-modal-actions {
    margin-top: var(--sp-lg); display: flex; gap: var(--sp-sm); justify-content: flex-end;
  }
  .alert-modal button {
    padding: var(--sp-sm) 14px; font-family: var(--mono); font-size: var(--fs-mono);
    text-transform: uppercase; letter-spacing: 0.06em;
    background: var(--bg-panel-2); border: 1px solid var(--border);
    color: var(--text); cursor: pointer; border-radius: var(--r-sm);
  }
  .alert-modal button.primary {
    background: rgba(80,125,252,0.15); border-color: var(--blue); color: var(--blue);
  }
  .alert-modal button.danger {
    color: var(--red); border-color: var(--red);
  }
  .alert-modal-info {
    margin-top: 10px; font-size: var(--fs-mono-sm); color: var(--text-dim); line-height: 1.55;
  }
  .alert-list {
    margin-top: var(--sp-md); padding-top: var(--sp-md);
    border-top: 1px solid var(--border);
  }
  .alert-list-item {
    display: flex; justify-content: space-between; align-items: center;
    padding: 6px 0; font-size: var(--fs-mono); gap: var(--sp-sm);
  }
  .alert-list-item .meta { color: var(--text-dim); font-size: var(--fs-mono-sm); }

  /* 90-day sparklines */
  .sparkline {
    display: block; margin-top: var(--sp-xs);
    width: 100%; max-width: 140px; height: 16px;
  }
  .sparkline path { fill: none; stroke-width: 1.5; }
  .sparkline path.line  { stroke: var(--text-dim); }
  .sparkline path.line.up   { stroke: var(--cyan); }
  .sparkline path.line.down { stroke: var(--orange); }
  .sparkline circle.last { fill: var(--text); }
  /* Distance-to-threshold progress bar */
  .t1-progress, .t2-progress {
    margin-top: var(--sp-xs);
    height: 5px; border-radius: var(--r-pill);
    background: var(--bg-panel); border: 1px solid var(--border);
    overflow: hidden; position: relative;
  }
  .t1-progress > div, .t2-progress > div {
    height: 100%; border-radius: var(--r-pill);
    background: var(--orange);
    transition: width var(--dur-slow) var(--ease-data-reveal);
  }
  .t1-progress.warn > div, .t2-progress.warn > div { background: var(--yellow); }
  .t1-progress.close > div, .t2-progress.close > div { background: var(--red); }
  .t1-progress.triggered > div, .t2-progress.triggered > div { background: var(--green); }
  .t1-distance, .t2-distance {
    margin-top: 3px;
    font-size: var(--fs-mono); color: var(--text-dim);
    font-family: var(--mono);
    font-weight: 500;
  }
  .t1-distance.triggered, .t2-distance.triggered { color: var(--green); }
  .t1-distance.close, .t2-distance.close { color: var(--red); }
  .t1-notes {
    font-size: var(--fs-mono-sm); color: var(--text-dim); margin-top: 10px;
    padding-top: var(--sp-sm); border-top: 1px solid var(--border);
    font-family: var(--mono); line-height: 1.5;
  }
  .t1-warn {
    margin: 0 0 var(--sp-md);
    padding: 10px var(--sp-md);
    background: rgba(255,94,127,0.08);
    border: 1px solid rgba(255,94,127,0.35);
    border-left: 3px solid var(--red);
    border-radius: var(--r-sm);
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    color: var(--text); line-height: 1.55;
  }
  .t1-warn b { color: var(--red); }
  .t1-history {
    margin-top: var(--sp-md); padding-top: 10px;
    border-top: 1px solid var(--border);
  }
  .t1-history h4 {
    font-size: var(--fs-mono-sm); color: var(--text-dim); font-weight: 600;
    text-transform: uppercase; letter-spacing: 0.06em;
    margin-bottom: 6px; font-family: var(--mono);
  }
  .t1-history table {
    width: 100%; border-collapse: collapse;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    font-variant-numeric: tabular-nums;
  }
  .t1-history th, .t1-history td {
    padding: var(--sp-xs) 6px; border-bottom: 1px solid var(--border);
    text-align: right;
  }
  .t1-history th:first-child, .t1-history td:first-child {
    text-align: left; color: var(--text-dim);
  }
  .t1-history th {
    font-weight: 600; color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.05em;
  }
  .t1-history tr:last-child td { border-bottom: none; }
  .t1-history td.est { color: var(--cyan); font-weight: 600; }

  /* Composite BUY/WAIT/SELL gauge */
  /* v10 fix: 7 pulse categories should fit in 1 row on wide screens.
     auto-fit with minmax(190px) gives 7 cols at 1366px+, balanced layout. */
  #sec-pulse .pulse-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
    gap: var(--sp-md);
    margin-top: var(--sp-md);
  }
  #sec-pulse .pulse-card {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
    padding: 14px 14px var(--sp-md);
    position: relative;
    overflow: hidden;
  }
  #sec-pulse .pulse-card::before {
    content: "";
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background: var(--pulse-accent, var(--border));
  }
  #sec-pulse .pulse-card.level-Low::before { background: #f59e0b; }
  #sec-pulse .pulse-card.level-Moderate::before { background: #8a92a8; }
  #sec-pulse .pulse-card.level-High::before { background: #8BDBEC; }
  #sec-pulse .pulse-card.level-unknown::before { background: #374151; }
  /* F7: Deprioritize Moderate cards so High/Low signals pop. Polar cards
     (bull/bear) always stay full-strength regardless of level. */
  #sec-pulse .pulse-card.level-Moderate:not(.polar-bull):not(.polar-bear) { opacity: 0.55; }
  #sec-pulse .pulse-card.level-Moderate:not(.polar-bull):not(.polar-bear) .pulse-level { color: var(--text-dim); }
  /* Audit v7 #2: polarity tinting — bull (contrarian setup) vs bear (risk-on complacent or topped) */
  #sec-pulse .pulse-card.polar-bull::before { background: #50FCD1; box-shadow: 0 0 0 1px rgba(80,252,209,0.2); }
  #sec-pulse .pulse-card.polar-bear::before { background: #FF5E7F; box-shadow: 0 0 0 1px rgba(248,113,113,0.2); }
  #sec-pulse .pulse-card.polar-bull .pulse-level { color: #50FCD1; }
  #sec-pulse .pulse-card.polar-bear .pulse-level { color: #FF5E7F; }
  #sec-pulse .pulse-label {
    font-size: var(--fs-mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
    margin-bottom: 6px;
  }
  #sec-pulse .pulse-state {
    display: flex;
    align-items: baseline;
    gap: 10px;
    font-weight: 600;
  }
  #sec-pulse .pulse-level {
    font-size: var(--fs-ui-lg);
    color: var(--text-strong, #e6e8ef);
  }
  #sec-pulse .pulse-level.low      { color: #f59e0b; }
  #sec-pulse .pulse-level.moderate { color: #e6e8ef; }
  #sec-pulse .pulse-level.high     { color: #8BDBEC; }
  #sec-pulse .pulse-direction {
    font-size: var(--fs-body-sm);
    color: var(--muted, #8a92a8);
  }
  #sec-pulse .pulse-direction.rising    { color: #50FCD1; }
  #sec-pulse .pulse-direction.declining { color: #FF5E7F; }
  #sec-pulse .pulse-submetrics {
    margin-top: 10px;
    display: grid;
    grid-template-columns: 1fr auto auto;
    gap: 3px 10px;
    font-size: 10.5px;
    color: var(--muted, #8a92a8);
    line-height: 1.55;
    align-items: baseline;
  }
  #sec-pulse .pulse-submetric {
    display: contents;
  }
  #sec-pulse .pulse-submetric .sm-name {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  #sec-pulse .pulse-submetric .sm-level {
    font-variant-numeric: tabular-nums;
    text-align: right;
    white-space: nowrap;
  }
  #sec-pulse .pulse-submetric .sm-val {
    font-variant-numeric: tabular-nums;
    text-align: right;
    white-space: nowrap;
    min-width: 48px;
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
  }
  #sec-pulse .pulse-submetric .sm-level.low      { color: #f59e0b; }
  #sec-pulse .pulse-submetric .sm-level.high     { color: #8BDBEC; }

  :is(#sec-bmvz, #cyc-bmvz) .bmvz-wrap {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--sp-lg);
    margin-top: 10px;
  }
  @media (max-width: 760px) {
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-wrap { grid-template-columns: 1fr; }
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-zone {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
    padding: 14px;
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-zone h4 {
    margin: 0 0 var(--sp-md);
    font-size: var(--fs-mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
  }
  /* Nothing-style segmented progress bar. 20 discrete ticks (5% each).
     Host carries the outline segments (unfilled); ::after carries the
     filled segments clipped to BTC position via --bmvz-fill. Replaces
     the continuous gradient + floating circle dot with an instrument-
     panel readout. 2026-04-25 iteration 3. */
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-host {
    --bmvz-fill: 50%;
    position: relative;
    height: 36px;
    border-radius: var(--r-xs);
    background: transparent;
    border: 1px solid #242938;
    margin: 10px 0 var(--sp-2xl);
    overflow: hidden;
    background-image:
      repeating-linear-gradient(
        90deg,
        rgba(138,146,168,0.18) 0,
        rgba(138,146,168,0.18) calc(5% - 1px),
        transparent calc(5% - 1px),
        transparent 5%
      );
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-host::after {
    content: '';
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
    background-image:
      repeating-linear-gradient(
        90deg,
        rgba(80,252,209,0.55) 0,
        rgba(80,252,209,0.55) calc(5% - 1px),
        transparent calc(5% - 1px),
        transparent 5%
      );
    clip-path: inset(0 calc(100% - var(--bmvz-fill, 50%)) 0 0);
    transition: clip-path var(--dur-base, 300ms) var(--ease-out, ease-out);
    pointer-events: none;
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-rp {
    position: absolute; left: 0; top: -6px; bottom: -6px;
    width: 2px; background: #50FCD1;
    z-index: 2;
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-tmm {
    position: absolute; right: 0; top: -6px; bottom: -6px;
    width: 2px; background: #e6e8ef;
    z-index: 2;
  }
  /* Segmented bar — BTC marker is now a tall vertical line, not a circle.
     Aligns with the segment grid and matches Nothing's instrument-panel
     aesthetic (no floating orb). */
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-dot {
    position: absolute; top: -4px; bottom: -4px;
    width: 2px; height: auto; border-radius: 0;
    background: #ffd166;
    border: none;
    transform: translateX(-1px);
    box-shadow: 0 0 0 1px rgba(11,14,20,0.8), 0 0 6px rgba(255,209,102,0.6);
    z-index: 3;
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label {
    position: absolute;
    top: 100%; margin-top: var(--sp-xs);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label.rp  { left: 0; }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label.tmm { right: 0; text-align: right; }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label.cur {
    transform: translateX(-50%);
    color: #ffd166;
    font-weight: 600;
  }
  /* Mobile: move BTC label ABOVE the bar so it can't collide with RP/TMM */
  @media (max-width: 640px) {
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-host { margin: var(--sp-xl) 0 28px; }
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label.cur {
      top: auto;
      bottom: 100%;
      margin-top: 0;
      margin-bottom: var(--sp-xs);
    }
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label {
      font-size: var(--fs-mono-xs);
    }
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpis {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin-top: var(--sp-sm);
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi {
    font-size: var(--fs-mono);
    color: var(--muted, #8a92a8);
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi strong {
    display: block;
    font-size: var(--fs-body-lg);
    color: var(--text-strong, #e6e8ef);
    font-variant-numeric: tabular-nums;
    margin-top: var(--sp-2xs);
  }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi.in-zone strong { color: #ffd166; }
  :is(#sec-bmvz, #cyc-bmvz) .cool-row {
    margin-top: 10px;
  }
  :is(#sec-bmvz, #cyc-bmvz) .cool-row + .cool-row { margin-top: 14px; }
  :is(#sec-bmvz, #cyc-bmvz) .cool-row .cool-head {
    display: flex;
    justify-content: space-between;
    font-size: var(--fs-mono);
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-xs);
  }
  :is(#sec-bmvz, #cyc-bmvz) .cool-row .cool-head strong {
    color: var(--text-strong, #e6e8ef);
    font-variant-numeric: tabular-nums;
  }
  :is(#sec-bmvz, #cyc-bmvz) .cool-bar {
    position: relative;
    height: 10px;
    background: rgba(36,41,56,0.6);
    border-radius: var(--r-sm);
    overflow: hidden;
  }
  :is(#sec-bmvz, #cyc-bmvz) .cool-bar-fill {
    position: absolute;
    left: 0; top: 0; bottom: 0;
    background: #FF5E7F;
    border-radius: var(--r-sm);
    transition: width 0.5s;
  }
  :is(#sec-bmvz, #cyc-bmvz) .cool-bar-fill.cooled { background: #50FCD1; }
  :is(#sec-bmvz, #cyc-bmvz) .cool-bar-threshold {
    position: absolute;
    top: -3px; bottom: -3px;
    width: 2px;
    background: #8BDBEC;
  }
  :is(#sec-bmvz, #cyc-bmvz) .cool-note {
    margin-top: 10px;
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    line-height: 1.4;
  }

  /* --- Surf F&G gauge panel --- */
  #sec-fg .fg-wrap {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 20px;
    align-items: center;
    padding: var(--sp-md) 6px;
  }
  #sec-fg .fg-gauge {
    display: flex;
    flex-direction: column;
    align-items: center;
    min-width: 140px;
  }
  #sec-fg .fg-value {
    font-family: var(--mono, ui-monospace);
    font-size: 58px;
    font-weight: 700;
    line-height: 1;
    font-variant-numeric: tabular-nums;
  }
  #sec-fg .fg-value.v-low    { color: #FF5E7F; }
  #sec-fg .fg-value.v-cool   { color: #FF9457; }
  #sec-fg .fg-value.v-neutral{ color: #e6e8ef; }
  #sec-fg .fg-value.v-warm   { color: #a3e635; }
  #sec-fg .fg-value.v-hot    { color: #8BDBEC; }
  #sec-fg .fg-class {
    font-size: var(--fs-mono);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    margin-top: var(--sp-xs);
    color: var(--muted, #8a92a8);
  }
  #sec-fg .fg-meta {
    display: flex;
    flex-direction: column;
    gap: var(--sp-sm);
  }
  #sec-fg .fg-deltas {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 10px;
  }
  #sec-fg .fg-delta {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
    padding: var(--sp-sm) 10px;
  }
  #sec-fg .fg-delta-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
    letter-spacing: 0.06em;
  }
  #sec-fg .fg-delta-val {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-ui);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    margin-top: var(--sp-2xs);
  }
  #sec-fg .fg-delta-val.pos { color: #50FCD1; }
  #sec-fg .fg-delta-val.neg { color: #FF5E7F; }
  #sec-fg .fg-spark {
    height: 52px;
    width: 100%;
    margin-top: 6px;
  }
  #sec-fg .fg-spark path.line   { fill: none; stroke: #7498fd; stroke-width: 1.5; }
  #sec-fg .fg-spark path.area   { fill: rgba(116,152,253,0.15); stroke: none; }
  #sec-fg .fg-spark .spark-mark { fill: #ffd166; stroke: #1a1f2c; stroke-width: 1.5; }
  @media (max-width: 640px) {
    #sec-fg .fg-wrap { grid-template-columns: 1fr; }
    #sec-fg .fg-value { font-size: var(--fs-display-hero); }
  }

  /* --- ETF breakdown table inside Institutional panel --- */
  .etf-breakdown {
    margin-top: 14px;
    padding-top: var(--sp-md);
    border-top: 1px solid var(--panel-border, #1a1f2c);
  }
  .etf-breakdown h4 {
    margin: 0 0 var(--sp-sm);
    font-size: var(--fs-mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
  }
  .etf-table {
    width: 100%;
    border-collapse: collapse;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono);
  }
  .etf-table th {
    text-align: right;
    font-weight: 500;
    color: var(--muted, #8a92a8);
    padding: var(--sp-xs) var(--sp-sm);
    border-bottom: 1px solid var(--panel-border, #1a1f2c);
  }
  .etf-table th:first-child { text-align: left; }
  .etf-table td {
    padding: var(--sp-xs) var(--sp-sm);
    font-variant-numeric: tabular-nums;
    text-align: right;
    color: var(--text-strong, #e6e8ef);
  }
  .etf-table td:first-child {
    text-align: left;
    font-weight: 600;
  }
  .etf-table td.pos { color: #50FCD1; }
  .etf-table td.neg { color: #FF5E7F; }
  .etf-table tr.total {
    border-top: 1px solid var(--panel-border, #1a1f2c);
  }
  .etf-table tr.total td { font-weight: 700; padding-top: 6px; }
  /* ETF 60-day bar chart */
  .etf-chart-wrap {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
    padding: var(--sp-md);
  }
  .etf-chart {
    display: block;
    width: 100%;
    height: 200px;
  }
  @media (max-width: 760px) { .etf-chart { height: 160px; } }
  .etf-chart rect.bar-pos { fill: #50FCD1; }
  .etf-chart rect.bar-neg { fill: #FF5E7F; }
  .etf-chart rect.bar-pos:hover,
  .etf-chart rect.bar-neg:hover { opacity: 0.85; }
  .etf-chart path.ma14   { fill: none; stroke: #ffd166; stroke-width: 2; }
  .etf-chart line.zero   { stroke: rgba(138,151,168,0.4); stroke-dasharray: 2 3; }
  .etf-chart text.axis   { fill: var(--muted, #8a92a8); font-family: var(--mono, ui-monospace); font-size: var(--fs-mono-xs); }
  .etf-chart-legend {
    display: flex;
    gap: var(--sp-lg);
    margin-top: var(--sp-sm);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
  }
  .etf-chart-legend span { display: inline-flex; align-items: center; gap: 6px; }
  .etf-chart-sw {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: var(--r-xs);
  }

  /* --- ETF Issuer On-Chain Flow: diverging-bar viz --- */
  #sec-etf-onchain .etf-onchain-axis {
    display: grid;
    grid-template-columns: 110px 1fr 90px;
    align-items: center;
    gap: var(--sp-md);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    color: var(--text-dim, #8a92a8);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding: var(--sp-2xs) 0 6px 0;
    border-bottom: 1px dashed rgba(255,255,255,0.08);
  }
  #sec-etf-onchain .etf-onchain-axis > span:nth-child(1) { text-align: left;  opacity: 0.6; }
  #sec-etf-onchain .etf-onchain-axis > span:nth-child(2) { text-align: center; opacity: 0.8; }
  #sec-etf-onchain .etf-onchain-axis > span:nth-child(3) { text-align: right; opacity: 0.6; }

  #sec-etf-onchain .etf-onchain-viz {
    display: flex;
    flex-direction: column;
    margin-top: var(--sp-xs);
  }

  #sec-etf-onchain .etf-row {
    display: grid;
    grid-template-columns: 110px 1fr 90px;
    align-items: center;
    gap: var(--sp-md);
    padding: var(--sp-sm) 0;
    border-bottom: 1px solid rgba(255,255,255,0.04);
  }
  #sec-etf-onchain .etf-row:last-child { border-bottom: none; }

  #sec-etf-onchain .etf-label { font-family: var(--mono); }
  #sec-etf-onchain .etf-label .ticker { font-weight: 600; font-size: var(--fs-body-lg); letter-spacing: 0.02em; }
  #sec-etf-onchain .etf-label .btc { font-size: var(--fs-mono-sm); color: var(--text-dim, #8a92a8); margin-top: var(--sp-2xs); }

  #sec-etf-onchain .etf-track {
    position: relative;
    height: 18px;
    background: rgba(255,255,255,0.025);
    border-radius: var(--r-sm);
    overflow: visible;
  }

  #sec-etf-onchain .etf-zero {
    position: absolute;
    left: 50%;
    top: -2px;
    bottom: -2px;
    width: 1px;
    background: rgba(255,255,255,0.18);
    pointer-events: none;
  }

  /* One clean bar per ETF extending from the zero line. Right (aqua) =
     on-chain inflow, Left (rose) = outflow. The secondary NAV-gap chip
     on the right column carries the divergence story. */
  #sec-etf-onchain .etf-bar {
    position: absolute;
    top: 4px;
    bottom: 4px;
    border-radius: var(--r-xs);
    transition: width 0.35s ease, left 0.35s ease;
  }
  #sec-etf-onchain .etf-bar.pos { background: rgba(80, 252, 209, 0.65); }
  #sec-etf-onchain .etf-bar.neg { background: rgba(255, 94, 127, 0.65); }

  #sec-etf-onchain .etf-div-chip {
    display: inline-block;
    margin-top: 3px;
    padding: 1px var(--sp-xs);
    border-radius: var(--r-xs);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    letter-spacing: 0.04em;
    white-space: nowrap;
  }
  #sec-etf-onchain .etf-div-chip.aligned { color: var(--text-dim); background: rgba(138,146,168,0.08); }
  #sec-etf-onchain .etf-div-chip.watch { color: #FFD166; background: rgba(255,209,102,0.10); }
  #sec-etf-onchain .etf-div-chip.severe { color: #FF5E7F; background: rgba(255,94,127,0.10); }

  #sec-etf-onchain .etf-div {
    text-align: right;
    font-family: var(--mono);
    font-size: var(--fs-body);
    font-weight: 600;
  }
  #sec-etf-onchain .etf-div.severe { color: #FF5E7F; }
  #sec-etf-onchain .etf-div.watch  { color: #ffd166; }
  #sec-etf-onchain .etf-div.aligned { color: #50FCD1; }
  #sec-etf-onchain .etf-div.navmissing { color: var(--text-dim, #8a92a8); font-weight: 400; }

  /* --- ETF Issuer On-Chain Flow: tier-2 regime badge + context strip --- */
  #sec-etf-onchain .etf-regime-badge {
    display: inline-block;
    padding: 3px 10px;
    border-radius: var(--r-sm);
    font-size: var(--fs-mono);
    font-family: var(--mono);
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin-left: 10px;
    border: 1px solid transparent;
  }
  #sec-etf-onchain .etf-regime-badge.accumulation  { background: rgba(80,252,209,0.12);  color: #50FCD1; border-color: rgba(80,252,209,0.35); }
  #sec-etf-onchain .etf-regime-badge.momentum_chase { background: rgba(139,219,236,0.12); color: #8BDBEC; border-color: rgba(139,219,236,0.35); }
  #sec-etf-onchain .etf-regime-badge.distribution  { background: rgba(255,94,127,0.12);  color: #FF5E7F; border-color: rgba(255,94,127,0.35); }
  #sec-etf-onchain .etf-regime-badge.capitulation  { background: rgba(255,94,127,0.18);  color: #FF5E7F; border-color: rgba(255,94,127,0.55); }
  #sec-etf-onchain .etf-regime-badge.churn         { background: rgba(255,255,255,0.06);  color: var(--text-dim, #8a92a8); border-color: rgba(255,255,255,0.12); }

  #sec-etf-onchain .etf-context-strip {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin: 10px 0 14px;
  }
  #sec-etf-onchain .etf-ctx-card {
    padding: 10px var(--sp-md);
    border: 1px solid rgba(255,255,255,0.06);
    border-radius: var(--r-sm);
    background: rgba(255,255,255,0.015);
  }
  #sec-etf-onchain .etf-ctx-label {
    font-size: var(--fs-mono-xs);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    text-transform: uppercase;
    letter-spacing: 0.06em;
  }
  #sec-etf-onchain .etf-ctx-value {
    font-size: var(--fs-ui);
    font-weight: 600;
    font-family: var(--mono);
    margin-top: var(--sp-xs);
    letter-spacing: 0.02em;
  }
  #sec-etf-onchain .etf-ctx-value.pos { color: #50FCD1; }
  #sec-etf-onchain .etf-ctx-value.neg { color: #FF5E7F; }
  #sec-etf-onchain .etf-ctx-sub {
    font-size: var(--fs-mono-sm);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    margin-top: 3px;
  }

  @media (max-width: 700px) {
    #sec-etf-onchain .etf-context-strip { grid-template-columns: 1fr; }
  }

  /* --- Exchange Flow Plumbing (Panel 2) — shares .etf-regime-badge/.etf-context-strip/.etf-ctx-* class names --- */
  #sec-exchange-plumbing .etf-regime-badge {
    display: inline-block;
    padding: 3px 10px;
    border-radius: var(--r-sm);
    font-size: var(--fs-mono);
    font-family: var(--mono);
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin-left: 10px;
    border: 1px solid transparent;
  }
  #sec-exchange-plumbing .etf-regime-badge.us_rotation        { background: rgba(80,252,209,0.12);  color: #50FCD1; border-color: rgba(80,252,209,0.35); }
  #sec-exchange-plumbing .etf-regime-badge.offshore_rotation  { background: rgba(255,94,127,0.12);  color: #FF5E7F; border-color: rgba(255,94,127,0.35); }
  #sec-exchange-plumbing .etf-regime-badge.mm_arbitrage       { background: rgba(139,219,236,0.12); color: #8BDBEC; border-color: rgba(139,219,236,0.35); }
  #sec-exchange-plumbing .etf-regime-badge.churn              { background: rgba(255,255,255,0.06); color: var(--text-dim, #8a92a8); border-color: rgba(255,255,255,0.12); }
  #sec-exchange-plumbing .etf-regime-badge.mixed              { background: rgba(255,209,102,0.12); color: #ffd166; border-color: rgba(255,209,102,0.35); }

  #sec-exchange-plumbing .etf-context-strip {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin: 10px 0 14px;
  }
  #sec-exchange-plumbing .etf-ctx-card {
    padding: 10px var(--sp-md);
    border: 1px solid rgba(255,255,255,0.06);
    border-radius: var(--r-sm);
    background: rgba(255,255,255,0.015);
  }
  #sec-exchange-plumbing .etf-ctx-label {
    font-size: var(--fs-mono-xs);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    text-transform: uppercase;
    letter-spacing: 0.06em;
  }
  #sec-exchange-plumbing .etf-ctx-value {
    font-size: var(--fs-ui);
    font-weight: 600;
    font-family: var(--mono);
    margin-top: var(--sp-xs);
    letter-spacing: 0.02em;
  }
  #sec-exchange-plumbing .etf-ctx-value.pos { color: #50FCD1; }
  #sec-exchange-plumbing .etf-ctx-value.neg { color: #FF5E7F; }
  #sec-exchange-plumbing .etf-ctx-sub {
    font-size: var(--fs-mono-sm);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    margin-top: 3px;
  }
  @media (max-width: 700px) {
    #sec-exchange-plumbing .etf-context-strip { grid-template-columns: 1fr; }
  }

  #sec-exchange-plumbing .ex-viz {
    display: flex;
    flex-direction: column;
    margin-top: var(--sp-xs);
  }

  #sec-exchange-plumbing .ex-row {
    display: grid;
    grid-template-columns: 200px 1fr 110px;
    align-items: center;
    gap: var(--sp-md);
    padding: var(--sp-sm) 0;
    border-bottom: 1px solid rgba(255,255,255,0.04);
    position: relative;
  }
  #sec-exchange-plumbing .ex-row:last-child { border-bottom: none; }

  #sec-exchange-plumbing .ex-row.mm {
    background: linear-gradient(90deg, rgba(80,252,209,0.04) 0%, transparent 40%);
    border-left: 2px solid rgba(80,252,209,0.35);
    padding-left: var(--sp-sm);
  }

  #sec-exchange-plumbing .ex-label {
    font-family: var(--mono);
    font-size: var(--fs-body);
    display: flex;
    align-items: center;
    gap: 6px;
  }
  #sec-exchange-plumbing .ex-label .arrow { color: var(--text-dim, #8a92a8); }
  #sec-exchange-plumbing .ex-label .entity { font-weight: 600; letter-spacing: 0.02em; }
  #sec-exchange-plumbing .ex-label .mm-badge {
    display: inline-block;
    font-size: var(--fs-mono-xs);
    padding: var(--sp-2xs) var(--sp-xs);
    border-radius: var(--r-sm);
    background: rgba(80,252,209,0.18);
    color: #50FCD1;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin-left: var(--sp-xs);
  }

  #sec-exchange-plumbing .ex-bar-track {
    position: relative;
    height: 14px;
    background: rgba(255,255,255,0.025);
    border-radius: var(--r-sm);
    overflow: hidden;
  }
  #sec-exchange-plumbing .ex-bar-fill {
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    background: linear-gradient(90deg, rgba(139,219,236,0.7) 0%, rgba(80,252,209,0.55) 100%);
    border-radius: var(--r-xs);
    transition: width 0.35s ease;
  }
  #sec-exchange-plumbing .ex-row.mm .ex-bar-fill {
    background: linear-gradient(90deg, rgba(80,252,209,0.8) 0%, rgba(139,219,236,0.6) 100%);
  }

  #sec-exchange-plumbing .ex-value {
    text-align: right;
    font-family: var(--mono);
    font-size: var(--fs-body);
    font-weight: 600;
  }
  #sec-exchange-plumbing .ex-value .txs {
    font-weight: 400;
    font-size: var(--fs-mono-sm);
    color: var(--text-dim, #8a92a8);
    margin-top: var(--sp-2xs);
    display: block;
  }
  #sec-exchange-plumbing .ex-chain-chip {
    display: inline-block;
    font-size: var(--fs-mono-xs);
    padding: 1px var(--sp-xs);
    margin-left: var(--sp-xs);
    border-radius: var(--r-xs);
    background: rgba(255,255,255,0.06);
    color: var(--text-dim, #8a92a8);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    vertical-align: middle;
  }

  /* --- Labeled Whale Digest (Panel 3) — shares .etf-regime-badge/.etf-context-strip/.etf-ctx-* class names --- */
  #sec-whale-digest .etf-regime-badge {
    display: inline-block;
    padding: 3px 10px;
    border-radius: var(--r-sm);
    font-size: var(--fs-mono);
    font-family: var(--mono);
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin-left: 10px;
    border: 1px solid transparent;
  }
  #sec-whale-digest .etf-regime-badge.sell_pressure  { background: rgba(255,94,127,0.18);  color: #FF5E7F; border-color: rgba(255,94,127,0.55); }
  #sec-whale-digest .etf-regime-badge.accumulation   { background: rgba(80,252,209,0.12);  color: #50FCD1; border-color: rgba(80,252,209,0.35); }
  #sec-whale-digest .etf-regime-badge.quiet          { background: rgba(255,255,255,0.06); color: var(--text-dim, #8a92a8); border-color: rgba(255,255,255,0.12); }
  #sec-whale-digest .etf-regime-badge.mixed          { background: rgba(255,209,102,0.12); color: #ffd166; border-color: rgba(255,209,102,0.35); }

  #sec-whale-digest .etf-context-strip {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin: 10px 0 14px;
  }
  #sec-whale-digest .etf-ctx-card {
    padding: 10px var(--sp-md);
    border: 1px solid rgba(255,255,255,0.06);
    border-radius: var(--r-sm);
    background: rgba(255,255,255,0.015);
  }
  #sec-whale-digest .etf-ctx-label {
    font-size: var(--fs-mono-xs);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    text-transform: uppercase;
    letter-spacing: 0.06em;
  }
  #sec-whale-digest .etf-ctx-value {
    font-size: var(--fs-ui);
    font-weight: 600;
    font-family: var(--mono);
    margin-top: var(--sp-xs);
    letter-spacing: 0.02em;
  }
  #sec-whale-digest .etf-ctx-value.pos { color: #50FCD1; }
  #sec-whale-digest .etf-ctx-value.neg { color: #FF5E7F; }
  #sec-whale-digest .etf-ctx-sub {
    font-size: var(--fs-mono-sm);
    font-family: var(--mono);
    color: var(--text-dim, #8a92a8);
    margin-top: 3px;
  }

  #sec-whale-digest .wh-mix-bar {
    display: flex;
    height: 10px;
    border-radius: var(--r-sm);
    overflow: hidden;
    margin-top: 6px;
    background: rgba(255,255,255,0.04);
  }
  #sec-whale-digest .wh-mix-seg {
    height: 100%;
    min-width: 1px;
  }

  #sec-whale-digest .wh-viz {
    display: flex;
    flex-direction: column;
    margin-top: 6px;
  }

  #sec-whale-digest .wh-row {
    display: grid;
    grid-template-columns: 56px 1fr 110px 110px;
    align-items: center;
    gap: 10px;
    padding: var(--sp-sm) 0;
    border-bottom: 1px solid rgba(255,255,255,0.04);
    position: relative;
  }
  #sec-whale-digest .wh-row:last-child { border-bottom: none; }

  #sec-whale-digest .wh-row-accent {
    position: absolute;
    left: 0;
    top: 2px;
    bottom: 2px;
    width: 3px;
    border-radius: 1px;
  }

  #sec-whale-digest .wh-time {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    color: var(--text-dim, #8a92a8);
    padding-left: 10px;
  }

  #sec-whale-digest .wh-label {
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
  }
  #sec-whale-digest .wh-label .entity { font-weight: 600; letter-spacing: 0.02em; }
  #sec-whale-digest .wh-label .entity.dim { color: var(--text-dim, #8a92a8); font-weight: 400; }
  #sec-whale-digest .wh-label .arrow { color: var(--text-dim, #8a92a8); }
  #sec-whale-digest .wh-role-chip {
    display: inline-block;
    font-size: var(--fs-mono-xs);
    padding: 1px var(--sp-xs);
    margin-left: var(--sp-2xs);
    border-radius: var(--r-xs);
    background: rgba(255,255,255,0.04);
    color: var(--text-dim, #8a92a8);
    font-weight: 400;
    letter-spacing: 0.04em;
    vertical-align: middle;
  }

  #sec-whale-digest .wh-type-chip {
    display: inline-block;
    font-size: var(--fs-mono-xs);
    padding: var(--sp-2xs) 6px;
    border-radius: var(--r-sm);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-weight: 600;
    white-space: nowrap;
  }
  #sec-whale-digest .wh-chain-chip {
    display: inline-block;
    font-size: var(--fs-mono-xs);
    padding: 1px var(--sp-xs);
    border-radius: var(--r-xs);
    background: rgba(255,255,255,0.06);
    color: var(--text-dim, #8a92a8);
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }

  /* Flow type colors — used for chips and bar fills and accent stripes */
  #sec-whale-digest .ft-cex_deposit      { color: #FF5E7F; background: rgba(255,94,127,0.12); }
  #sec-whale-digest .ft-cex_withdrawal   { color: #50FCD1; background: rgba(80,252,209,0.12); }
  #sec-whale-digest .ft-cex_to_cex       { color: #ffd166; background: rgba(255,209,102,0.12); }
  #sec-whale-digest .ft-mm_to_cex        { color: #8BDBEC; background: rgba(139,219,236,0.12); }
  #sec-whale-digest .ft-miner_to_cex     { color: #7498FD; background: rgba(192,132,252,0.12); }
  #sec-whale-digest .ft-issuer_flow      { color: #7498FD; background: rgba(116,152,253,0.12); }
  #sec-whale-digest .ft-entity_to_entity { color: #8a92a8; background: rgba(148,163,184,0.10); }

  /* Accent stripe colors for the row */
  #sec-whale-digest .wh-row[data-ft="cex_deposit"]      .wh-row-accent { background: #FF5E7F; }
  #sec-whale-digest .wh-row[data-ft="cex_withdrawal"]   .wh-row-accent { background: #50FCD1; }
  #sec-whale-digest .wh-row[data-ft="cex_to_cex"]       .wh-row-accent { background: #ffd166; }
  #sec-whale-digest .wh-row[data-ft="mm_to_cex"]        .wh-row-accent { background: #8BDBEC; }
  #sec-whale-digest .wh-row[data-ft="miner_to_cex"]     .wh-row-accent { background: #7498FD; }
  #sec-whale-digest .wh-row[data-ft="issuer_flow"]      .wh-row-accent { background: #7498FD; }
  #sec-whale-digest .wh-row[data-ft="entity_to_entity"] .wh-row-accent { background: rgba(148,163,184,0.5); }

  #sec-whale-digest .wh-bar-track {
    position: relative;
    height: 12px;
    background: rgba(255,255,255,0.025);
    border-radius: var(--r-sm);
    overflow: hidden;
  }
  #sec-whale-digest .wh-bar-fill {
    position: absolute;
    left: 0; top: 0; bottom: 0;
    border-radius: var(--r-xs);
    opacity: 0.75;
    transition: width 0.35s ease;
  }

  #sec-whale-digest .wh-value {
    text-align: right;
    font-family: var(--mono);
    font-size: var(--fs-body);
    font-weight: 600;
  }

  @media (max-width: 700px) {
    #sec-whale-digest .etf-context-strip { grid-template-columns: 1fr; }
    #sec-whale-digest .wh-row { grid-template-columns: 56px 1fr 90px 90px; }
  }

  /* --- Mindshare inline sparkline in sentiment header --- */
  .mindshare-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    margin-left: var(--sp-sm);
  }
  .mindshare-badge svg { display: block; }
  .mindshare-badge .ms-label { font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.06em; }
  .mindshare-badge .ms-trend.rising    { color: #50FCD1; }
  .mindshare-badge .ms-trend.declining { color: #FF5E7F; }
  .mindshare-badge .ms-trend.stable    { color: #e6e8ef; }

  /* --- Cohort Confluence panel --- */
  #sec-cohort-confluence .conf-hero {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-lg);
    padding: var(--sp-lg) var(--sp-xl);
    margin-top: 10px;
    text-align: center;
  }
  #sec-cohort-confluence .conf-hero-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.12em;
    color: var(--muted, #8a92a8);
    margin-bottom: 6px;
  }
  #sec-cohort-confluence .conf-level {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-display);
    font-weight: 700;
    letter-spacing: 0.02em;
    line-height: 1.1;
  }
  #sec-cohort-confluence .conf-level.highest-bull    { color: #50FCD1; }
  #sec-cohort-confluence .conf-level.highest-bear    { color: #FF5E7F; }
  #sec-cohort-confluence .conf-level.highest-neutral { color: #e6e8ef; }
  #sec-cohort-confluence .conf-level.medium-bull     { color: #a3e635; }
  #sec-cohort-confluence .conf-level.medium-bear     { color: #FF9457; }
  #sec-cohort-confluence .conf-level.medium-neutral  { color: #e6e8ef; }
  #sec-cohort-confluence .conf-level.low             { color: #8a92a8; }
  #sec-cohort-confluence .conf-level.unknown         { color: #8a92a8; }
  /* F3 (audit 2026-05-02): conf-verdict is running-body prose at 13-14px;
     promote color to --text per DESIGN.md "never use --text-dim for running
     body." */
  #sec-cohort-confluence .conf-verdict {
    margin-top: 10px;
    font-size: var(--fs-body);
    color: var(--text);
    line-height: 1.5;
  }

  /* Cohort Confluence v2 polish 2026-05-05 — replaces 3-card text grid
     with an alignment compass: a single distributing↔accumulating axis
     with 3 pins (LTH/ETF/SM) so cluster-vs-divergence is visible at a
     glance. Compact per-cohort rows below give the supporting detail. */
  #sec-cohort-confluence .conf-compass {
    margin-top: var(--sp-lg);
    padding: var(--sp-md) var(--sp-md) var(--sp-sm);
    background: rgba(20, 24, 33, 0.5);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
  }
  #sec-cohort-confluence .conf-compass-track {
    position: relative;
    height: 88px;
    margin: var(--sp-xs) 0 var(--sp-sm);
  }
  #sec-cohort-confluence .conf-compass-axis {
    position: absolute;
    left: 0; right: 0;
    top: 50%;
    height: 4px;
    border-radius: 2px;
    background: linear-gradient(90deg,
      rgba(255, 94, 127, 0.30) 0%,
      rgba(255, 209, 102, 0.20) 50%,
      rgba(80, 252, 209, 0.30) 100%);
    transform: translateY(-50%);
    border: 1px solid var(--border);
  }
  #sec-cohort-confluence .conf-compass-zero {
    position: absolute;
    top: 30%;
    bottom: 30%;
    left: 50%;
    width: 1px;
    background: var(--text-dim);
    opacity: 0.5;
  }
  #sec-cohort-confluence .conf-compass-pin {
    position: absolute;
    transform: translateX(-50%);
    font: 700 var(--fs-mono-sm)/1 var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    padding: 4px 8px;
    border-radius: var(--r-sm);
    border: 1px solid currentColor;
    background: var(--bg-panel);
    white-space: nowrap;
    transition: left var(--dur-data-reveal, 900ms) var(--ease-data-reveal, cubic-bezier(0.16, 1, 0.3, 1));
  }
  /* Stagger Y position so pins don't overlap if they cluster */
  #sec-cohort-confluence .conf-compass-pin[data-row="0"] { top: 0; }
  #sec-cohort-confluence .conf-compass-pin[data-row="1"] { top: 50%; transform: translate(-50%, -50%); }
  #sec-cohort-confluence .conf-compass-pin[data-row="2"] { bottom: 0; }
  /* Pin tone keyed to stance */
  #sec-cohort-confluence .conf-compass-pin.tone-bull    { color: var(--green); background: rgba(80, 252, 209, 0.10); }
  #sec-cohort-confluence .conf-compass-pin.tone-bear    { color: var(--red);   background: rgba(255, 94, 127, 0.10); }
  #sec-cohort-confluence .conf-compass-pin.tone-neutral { color: var(--text-dim); background: rgba(138, 146, 168, 0.08); }
  #sec-cohort-confluence .conf-compass-pin.tone-unknown { color: var(--text-dim); background: rgba(138, 146, 168, 0.05); opacity: 0.5; }
  #sec-cohort-confluence .conf-compass-axis-labels {
    display: flex;
    justify-content: space-between;
    font: 600 var(--fs-mono-xs) var(--mono);
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    opacity: 0.7;
  }
  /* Per-cohort rows below the compass — name, stance, supporting detail */
  #sec-cohort-confluence .conf-rows {
    display: flex;
    flex-direction: column;
    gap: var(--sp-xs);
    margin-top: var(--sp-md);
  }
  #sec-cohort-confluence .conf-row {
    display: grid;
    grid-template-columns: 18px 96px 110px 1fr;
    gap: var(--sp-md);
    align-items: baseline;
    padding: 6px 10px;
    border-radius: var(--r-sm);
    background: rgba(20, 24, 33, 0.35);
    border: 1px solid var(--border);
    font: var(--fs-body-sm)/1.4 var(--font-body);
  }
  #sec-cohort-confluence .conf-row.tone-bull    { border-left: 2px solid var(--green); }
  #sec-cohort-confluence .conf-row.tone-bear    { border-left: 2px solid var(--red); }
  #sec-cohort-confluence .conf-row.tone-neutral { border-left: 2px solid var(--text-dim); }
  #sec-cohort-confluence .conf-row.tone-unknown { border-left: 2px solid var(--text-dim); opacity: 0.55; }
  #sec-cohort-confluence .conf-row-icon {
    font-family: var(--mono);
    font-weight: 700;
    text-align: center;
  }
  #sec-cohort-confluence .conf-row.tone-bull .conf-row-icon { color: var(--green); }
  #sec-cohort-confluence .conf-row.tone-bear .conf-row-icon { color: var(--red); }
  #sec-cohort-confluence .conf-row-title {
    font: 700 var(--fs-mono-sm) var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text);
  }
  #sec-cohort-confluence .conf-row-stance {
    font: 600 var(--fs-mono-sm) var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--text-dim);
  }
  #sec-cohort-confluence .conf-row.tone-bull .conf-row-stance { color: var(--green); }
  #sec-cohort-confluence .conf-row.tone-bear .conf-row-stance { color: var(--red); }
  #sec-cohort-confluence .conf-row-detail {
    font: var(--fs-mono-sm) var(--mono);
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  @media (max-width: 720px) {
    #sec-cohort-confluence .conf-row {
      grid-template-columns: 18px 1fr auto;
      grid-template-rows: auto auto;
    }
    #sec-cohort-confluence .conf-row-detail {
      grid-column: 2 / 4;
      grid-row: 2;
      white-space: normal;
    }
  }

  /* --- LTH Tracker panel --- */
  :is(#sec-lth, #cyc-lth) .lth-wrap {
    display: grid;
    grid-template-columns: 1fr 1.3fr;
    gap: 14px;
    margin-top: 10px;
  }
  @media (max-width: 760px) {
    :is(#sec-lth, #cyc-lth) .lth-wrap { grid-template-columns: 1fr; }
  }
  :is(#sec-lth, #cyc-lth) .lth-hero {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-lg);
    padding: var(--sp-lg) var(--sp-lg);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
  }
  :is(#sec-lth, #cyc-lth) .lth-hero-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-sm);
  }
  :is(#sec-lth, #cyc-lth) .lth-hero-value {
    font-family: var(--mono, ui-monospace);
    font-size: 38px;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    line-height: 1;
  }
  :is(#sec-lth, #cyc-lth) .lth-hero-value.pos { color: #50FCD1; }
  :is(#sec-lth, #cyc-lth) .lth-hero-value.neg { color: #FF5E7F; }
  :is(#sec-lth, #cyc-lth) .lth-hero-value.flat { color: #e6e8ef; }
  :is(#sec-lth, #cyc-lth) .lth-hero-sub {
    margin-top: var(--sp-sm);
    font-size: var(--fs-body-sm);
    color: var(--muted, #8a92a8);
    text-align: center;
  }
  :is(#sec-lth, #cyc-lth) .lth-phase-card {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-left-width: 4px;
    border-radius: var(--r-lg);
    padding: var(--sp-lg) 20px;
  }
  :is(#sec-lth, #cyc-lth) .lth-phase-card.tone-bull    { border-left-color: #50FCD1; background: rgba(80,252,209,0.05); }
  :is(#sec-lth, #cyc-lth) .lth-phase-card.tone-bear    { border-left-color: #FF5E7F; background: rgba(248,113,113,0.05); }
  :is(#sec-lth, #cyc-lth) .lth-phase-card.tone-neutral { border-left-color: #8a92a8; }
  :is(#sec-lth, #cyc-lth) .lth-phase-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-xs);
  }
  :is(#sec-lth, #cyc-lth) .lth-phase-name {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-display-sm);
    font-weight: 700;
    letter-spacing: 0.02em;
    color: var(--text-strong, #e6e8ef);
    margin-bottom: var(--sp-sm);
  }
  :is(#sec-lth, #cyc-lth) .lth-phase-card.tone-bull .lth-phase-name { color: #50FCD1; }
  :is(#sec-lth, #cyc-lth) .lth-phase-card.tone-bear .lth-phase-name { color: #FF5E7F; }
  :is(#sec-lth, #cyc-lth) .lth-phase-desc {
    font-size: var(--fs-body-sm);
    color: var(--text-strong, #e6e8ef);
    line-height: 1.55;
    margin-bottom: 10px;
  }
  :is(#sec-lth, #cyc-lth) .lth-phase-history {
    font-size: var(--fs-mono);
    color: var(--muted, #8a92a8);
    line-height: 1.5;
    padding-top: 10px;
    border-top: 1px solid rgba(36,41,56,0.5);
  }

  :is(#sec-lth, #cyc-lth) .lth-deltas {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--sp-sm);
    margin-top: 14px;
  }
  @media (max-width: 640px) {
    :is(#sec-lth, #cyc-lth) .lth-deltas { grid-template-columns: repeat(2, 1fr); }
  }
  :is(#sec-lth, #cyc-lth) .lth-delta-cell {
    background: rgba(36,41,56,0.35);
    border-radius: var(--r-md);
    padding: 10px var(--sp-md);
    text-align: center;
  }
  :is(#sec-lth, #cyc-lth) .lth-delta-cell.lth-delta-primary {
    background: rgba(80,252,209,0.06);
    border: 1px solid rgba(80,252,209,0.2);
  }
  :is(#sec-lth, #cyc-lth) .lth-delta-label {
    display: block;
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--muted, #8a92a8);
  }
  :is(#sec-lth, #cyc-lth) .lth-delta-value {
    display: block;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-ui);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    margin-top: var(--sp-xs);
  }
  :is(#sec-lth, #cyc-lth) .lth-delta-value.pos { color: #50FCD1; }
  :is(#sec-lth, #cyc-lth) .lth-delta-value.neg { color: #FF5E7F; }

  :is(#sec-lth, #cyc-lth) .lth-chart-wrap {
    margin-top: 14px;
    padding: var(--sp-md) 14px;
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
  }
  :is(#sec-lth, #cyc-lth) .lth-chart-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
    margin-bottom: 6px;
  }
  :is(#sec-lth, #cyc-lth) .lth-chart {
    display: block;
    width: 100%;
    height: 120px;
  }
  :is(#sec-lth, #cyc-lth) .lth-chart path.area { fill: rgba(80,252,209,0.15); stroke: none; }
  :is(#sec-lth, #cyc-lth) .lth-chart path.line { fill: none; stroke: #50FCD1; stroke-width: 2; }
  :is(#sec-lth, #cyc-lth) .lth-chart text.axis { fill: var(--muted, #8a92a8); font-family: var(--mono, ui-monospace); font-size: var(--fs-mono-xs); }
  :is(#sec-lth, #cyc-lth) .lth-chart line.grid { stroke: rgba(138,151,168,0.15); stroke-dasharray: 2 3; }

  :is(#sec-lth, #cyc-lth) .lth-metrics {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: var(--sp-sm);
    margin-top: 14px;
  }
  @media (max-width: 640px) {
    :is(#sec-lth, #cyc-lth) .lth-metrics { grid-template-columns: repeat(3, 1fr); }
  }
  :is(#sec-lth, #cyc-lth) .lth-metric {
    background: rgba(36,41,56,0.3);
    border-radius: var(--r-md);
    padding: var(--sp-sm) 10px;
    display: flex;
    flex-direction: column;
    font-family: var(--mono, ui-monospace);
  }
  :is(#sec-lth, #cyc-lth) .lth-metric span {
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
  }
  :is(#sec-lth, #cyc-lth) .lth-metric strong {
    font-size: var(--fs-body-lg);
    color: var(--text-strong, #e6e8ef);
    font-variant-numeric: tabular-nums;
    margin-top: var(--sp-2xs);
  }

  :is(#sec-lth, #cyc-lth) .lth-historical {
    margin-top: var(--sp-lg);
    padding-top: var(--sp-md);
    border-top: 1px solid var(--panel-border, #1a1f2c);
  }
  :is(#sec-lth, #cyc-lth) .lth-historical-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
    margin-bottom: 6px;
  }
  :is(#sec-lth, #cyc-lth) .lth-historical-table {
    width: 100%;
    border-collapse: collapse;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono);
  }
  :is(#sec-lth, #cyc-lth) .lth-historical-table th,
  :is(#sec-lth, #cyc-lth) .lth-historical-table td {
    padding: var(--sp-xs) var(--sp-sm);
    text-align: right;
    border-bottom: 1px solid rgba(36,41,56,0.4);
    color: var(--muted, #8a92a8);
    font-variant-numeric: tabular-nums;
  }
  :is(#sec-lth, #cyc-lth) .lth-historical-table th:nth-child(1),
  :is(#sec-lth, #cyc-lth) .lth-historical-table th:nth-child(2),
  :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(1),
  :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(2) {
    text-align: left;
  }
  :is(#sec-lth, #cyc-lth) .lth-historical-table th { font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.06em; }
  :is(#sec-lth, #cyc-lth) .lth-historical-table td { color: var(--text-strong, #e6e8ef); }
  :is(#sec-lth, #cyc-lth) .lth-historical-table tr.kind-bottom td:nth-child(2) { color: #50FCD1; }
  :is(#sec-lth, #cyc-lth) .lth-historical-table tr.kind-top td:nth-child(2) { color: #FF5E7F; }

  /* v2 #10: Liquidation confidence bands legend */
  .liq-legend {
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
    align-items: center;
    padding: var(--sp-sm) 10px;
    margin-top: 6px;
    background: rgba(36,41,56,0.35);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
  }
  .liq-legend-item.measured { color: #50FCD1; }
  .liq-legend-item.estimated { color: #f59e0b; }
  .liq-legend-item b { color: var(--text-strong, #e6e8ef); }
  .liq-legend-note { font-size: var(--fs-mono-xs); color: #8a92a8; margin-left: auto; font-style: italic; }

  /* v2 #20: Time Machine — visually flag panels that still show LIVE data
     while the composite and on-chain panels are rewound to a historical date.
     Panels opt-in to this decoration by adding class .panel-live-only. */
  body.is-historical #sec-funding,
  body.is-historical #sec-options,
  body.is-historical #sec-liquidations,
  body.is-historical #sec-institutional,
  body.is-historical #sec-fg,
  body.is-historical #sec-mindshare,
  body.is-historical #sec-sentiment,
  body.is-historical #sec-trending,
  body.is-historical #sec-intel,
  body.is-historical #sec-full-report {
    position: relative;
    border-color: rgba(255, 94, 127, 0.55) !important;
    box-shadow: 0 0 0 1px rgba(255, 94, 127, 0.25), 0 0 18px rgba(255, 94, 127, 0.10);
  }
  body.is-historical #sec-funding::after,
  body.is-historical #sec-options::after,
  body.is-historical #sec-liquidations::after,
  body.is-historical #sec-institutional::after,
  body.is-historical #sec-fg::after,
  body.is-historical #sec-mindshare::after,
  body.is-historical #sec-sentiment::after,
  body.is-historical #sec-trending::after,
  body.is-historical #sec-intel::after,
  body.is-historical #sec-full-report::after {
    content: "▶ LIVE · not rewound";
    position: absolute;
    top: 10px;
    right: 12px;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #ff5e7f;
    background: rgba(255, 94, 127, 0.08);
    border: 1px solid rgba(255, 94, 127, 0.4);
    padding: 3px var(--sp-sm);
    border-radius: var(--r-pill);
    z-index: 35;
    pointer-events: none;
    animation: cw-live-pulse 2s ease-in-out infinite;
  }
  @keyframes cw-live-pulse {
    0%, 100% { opacity: 0.85; }
    50%      { opacity: 1; }
  }

  /* ────────── MONEY FLOW · 5-Zone Rotation Map (house style) ────────── */
  #sec-money-flow .mf-hero {
    padding: var(--sp-lg) var(--sp-lg) 14px;
    text-align: center;
    border-bottom: 1px solid var(--border);
    background: linear-gradient(180deg, rgba(80,252,209,0.04), transparent);
  }
  #sec-money-flow .mf-hero-label {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-xs);
  }
  #sec-money-flow .mf-hero-verdict {
    font-size: var(--fs-display-sm);
    font-weight: 700;
    color: var(--cyan, #50FCD1);
    letter-spacing: 0.02em;
    line-height: 1.2;
  }
  #sec-money-flow .mf-hero-sub {
    font-size: var(--fs-mono);
    color: var(--text-strong, #e6e8ef);
    margin-top: var(--sp-xs);
    font-family: var(--mono, ui-monospace);
    font-variant-numeric: tabular-nums;
  }
  #sec-money-flow .mf-section-label {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
    padding: var(--sp-lg) var(--sp-lg) var(--sp-sm);
    display: flex;
    align-items: baseline;
    gap: var(--sp-sm);
  }
  #sec-money-flow .mf-section-label .mf-section-meta {
    margin-left: auto;
    font-size: var(--fs-mono-xs);
    font-weight: 500;
    color: var(--muted, #8a92a8);
    letter-spacing: 0.05em;
  }

  /* ── 5-Zone horizontal bars ── */
  #sec-money-flow .mf-zones { padding: 0 var(--sp-lg) 6px; }
  #sec-money-flow .mf-zone-row {
    display: grid;
    grid-template-columns: 28px 110px 1fr 130px;
    gap: var(--sp-md);
    align-items: center;
    padding: var(--sp-sm) var(--sp-sm);
    border-bottom: 1px solid rgba(36,41,56,0.35);
    font-family: var(--mono, ui-monospace);
    border-radius: var(--r-sm);
    transition: background 0.2s;
  }
  #sec-money-flow .mf-zone-row:last-child { border-bottom: none; }
  #sec-money-flow .mf-zone-row.is-active {
    background: rgba(80,252,209,0.05);
    border-bottom-color: rgba(80,252,209,0.15);
  }
  #sec-money-flow .mf-zone-num {
    font-size: var(--fs-mono);
    font-weight: 700;
    color: var(--muted, #8a92a8);
    font-variant-numeric: tabular-nums;
  }
  #sec-money-flow .mf-zone-row.is-active .mf-zone-num { color: var(--cyan, #50FCD1); }
  #sec-money-flow .mf-zone-name {
    font-size: var(--fs-body-sm);
    color: var(--text-strong, #e6e8ef);
    font-weight: 600;
    font-family: var(--font, sans-serif);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  #sec-money-flow .mf-zone-bar-wrap {
    position: relative;
    height: 14px;
    background: rgba(36,41,56,0.55);
    border-radius: var(--r-xs);
    overflow: hidden;
  }
  #sec-money-flow .mf-zone-bar {
    height: 100%;
    transition: width 0.9s ease;
    border-radius: var(--r-xs);
  }
  #sec-money-flow .mf-zone-bar.status-filling  { background: linear-gradient(90deg, rgba(217,119,6,0.5), #f59e0b); }
  #sec-money-flow .mf-zone-bar.status-accum    { background: linear-gradient(90deg, rgba(13,148,136,0.5), #50FCD1); box-shadow: 0 0 10px rgba(80,252,209,0.2); }
  #sec-money-flow .mf-zone-bar.status-pockets  { background: linear-gradient(90deg, rgba(37,99,235,0.5), #507DFC); }
  #sec-money-flow .mf-zone-bar.status-draining { background: linear-gradient(90deg, rgba(185,28,28,0.5), #FF5E7F); }
  #sec-money-flow .mf-zone-bar.status-empty    { background: rgba(75,86,128,0.4); }
  #sec-money-flow .mf-zone-bar.status-stable   { background: rgba(148,163,184,0.4); }
  #sec-money-flow .mf-zone-bar.status-unknown  { background: rgba(55,65,81,0.4); }
  #sec-money-flow .mf-zone-bar-label {
    position: absolute;
    top: 50%;
    left: 8px;
    transform: translateY(-50%);
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    color: rgba(11,14,20,0.9);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    pointer-events: none;
  }
  #sec-money-flow .mf-zone-headline {
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    text-align: right;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-variant-numeric: tabular-nums;
  }
  #sec-money-flow .mf-zone-row.is-active .mf-zone-headline { color: var(--cyan, #50FCD1); }

  @media (max-width: 640px) {
    #sec-money-flow .mf-zone-row {
      grid-template-columns: 24px 1fr auto;
      gap: var(--sp-sm);
      padding: var(--sp-sm) var(--sp-xs);
    }
    #sec-money-flow .mf-zone-bar-wrap { grid-column: 2 / 4; grid-row: 2; margin-top: var(--sp-xs); }
    #sec-money-flow .mf-zone-headline { grid-column: 2 / 4; grid-row: 3; text-align: left; margin-top: var(--sp-2xs); font-size: var(--fs-mono-xs); }
    #sec-money-flow .mf-zone-name { grid-column: 2 / 4; grid-row: 1; }
    #sec-money-flow .mf-zone-num { grid-column: 1; grid-row: 1 / 4; align-self: start; padding-top: 1px; }
  }

  /* ── 4-step subway stepper ── */
  #sec-money-flow .mf-stepper-wrap { padding: 0 var(--sp-lg) var(--sp-xs); }
  #sec-money-flow .mf-stepper {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    position: relative;
    padding: var(--sp-md) var(--sp-md) var(--sp-sm);
  }
  #sec-money-flow .mf-stepper::before {
    content: "";
    position: absolute;
    top: 24px;
    left: 12.5%;
    right: 12.5%;
    height: 2px;
    background: var(--border);
    z-index: 0;
  }
  #sec-money-flow .mf-stepper-step {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    z-index: 1;
    padding: 0 var(--sp-xs);
  }
  #sec-money-flow .mf-stepper-node {
    width: 24px;
    height: 24px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    font-family: var(--mono, ui-monospace);
    border: 1.5px solid var(--border);
    background: var(--bg-panel, #0b0e14);
    color: var(--muted, #8a92a8);
    transition: all 0.3s ease;
  }
  #sec-money-flow .mf-stepper-step.state-partial .mf-stepper-node {
    border-color: #f59e0b;
    color: #f59e0b;
    background: rgba(245,158,11,0.14);
  }
  #sec-money-flow .mf-stepper-step.state-unlocked .mf-stepper-node {
    border-color: var(--cyan, #50FCD1);
    color: var(--cyan, #50FCD1);
    background: rgba(80,252,209,0.18);
  }
  /* F1 (audit 2026-05-02): replaced perpetual mf-step-pulse with a static
     decorative cue. Cyan border + static halo carries the "next step" meaning;
     DESIGN.md sanctions only cw-live-pulse for perpetual motion. */
  #sec-money-flow .mf-stepper-step.is-next .mf-stepper-node {
    border-color: var(--cyan, #50FCD1);
    box-shadow: 0 0 0 3px rgba(80,252,209,0.14);
  }
  #sec-money-flow .mf-stepper-label {
    font-size: var(--fs-mono-sm);
    font-weight: 600;
    color: var(--text-strong, #e6e8ef);
    text-align: center;
    line-height: 1.2;
    font-family: var(--font, sans-serif);
  }
  #sec-money-flow .mf-stepper-pct {
    font-size: var(--fs-mono-xs);
    font-family: var(--mono, ui-monospace);
    color: var(--muted, #8a92a8);
    font-variant-numeric: tabular-nums;
  }
  #sec-money-flow .mf-stepper-step.state-partial  .mf-stepper-pct { color: #f59e0b; }
  #sec-money-flow .mf-stepper-step.state-unlocked .mf-stepper-pct { color: var(--cyan, #50FCD1); }

  #sec-money-flow .mf-stepper-details {
    margin: 0 var(--sp-lg) 14px;
    padding: 10px 14px;
    background: rgba(80,252,209,0.04);
    border: 1px solid rgba(80,252,209,0.18);
    border-radius: var(--r-md);
  }
  #sec-money-flow .mf-stepper-details-title {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--cyan, #50FCD1);
    margin-bottom: var(--sp-sm);
  }
  #sec-money-flow .mf-stepper-cond {
    display: grid;
    grid-template-columns: 8px 1fr auto;
    gap: var(--sp-sm);
    align-items: center;
    padding: 3px 0;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    font-variant-numeric: tabular-nums;
  }
  #sec-money-flow .mf-stepper-cond .cdot {
    width: 6px; height: 6px; border-radius: 50%;
  }
  #sec-money-flow .mf-stepper-cond .cdot.state-met     { background: var(--cyan, #50FCD1); }
  #sec-money-flow .mf-stepper-cond .cdot.state-partial { background: #f59e0b; }
  #sec-money-flow .mf-stepper-cond .cdot.state-unmet   { background: #4b5680; }
  #sec-money-flow .mf-stepper-cond .label { color: var(--muted, #8a92a8); }
  #sec-money-flow .mf-stepper-cond .val   { color: var(--text-strong, #e6e8ef); font-weight: 600; white-space: nowrap; }
  #sec-money-flow .mf-stepper-cond .val.state-met     { color: var(--cyan, #50FCD1); }
  #sec-money-flow .mf-stepper-cond .val.state-partial { color: #f59e0b; }
  #sec-money-flow .mf-stepper-cond .val.state-unmet   { color: var(--muted, #8a92a8); }
  #sec-money-flow .mf-stepper-cond .target { color: #8a92a8; margin-left: 6px; font-weight: 400; }

  @media (max-width: 640px) {
    #sec-money-flow .mf-stepper { padding: 10px var(--sp-xs) 6px; }
    #sec-money-flow .mf-stepper::before { left: 12%; right: 12%; }
    #sec-money-flow .mf-stepper-label { font-size: var(--fs-mono-xs); }
    #sec-money-flow .mf-stepper-pct { font-size: 8px; }
  }

  /* ── Capital Allocation bars ── */
  #sec-money-flow .mf-alloc-wrap { padding: 0 var(--sp-lg) var(--sp-xs); }
  #sec-money-flow .mf-alloc-row {
    display: grid;
    grid-template-columns: 130px 1fr 80px;
    gap: var(--sp-md);
    align-items: center;
    padding: var(--sp-sm) var(--sp-sm);
    border-bottom: 1px solid rgba(36,41,56,0.35);
    font-family: var(--mono, ui-monospace);
  }
  #sec-money-flow .mf-alloc-row:last-child { border-bottom: none; }
  #sec-money-flow .mf-alloc-label {
    font-size: var(--fs-mono);
    color: var(--text-strong, #e6e8ef);
    font-family: var(--font, sans-serif);
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  #sec-money-flow .mf-alloc-track {
    height: 5px;
    background: rgba(36,41,56,0.55);
    border-radius: var(--r-xs);
    overflow: hidden;
  }
  #sec-money-flow .mf-alloc-fill { height: 100%; transition: width 0.9s ease; border-radius: var(--r-xs); }
  #sec-money-flow .mf-alloc-fill.pos { background: var(--cyan, #50FCD1); box-shadow: 0 0 8px rgba(80,252,209,0.3); }
  #sec-money-flow .mf-alloc-fill.neg { background: #FF5E7F; }
  #sec-money-flow .mf-alloc-amount {
    font-size: var(--fs-mono);
    font-weight: 700;
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
  }
  #sec-money-flow .mf-alloc-amount.pos { color: var(--cyan, #50FCD1); }
  #sec-money-flow .mf-alloc-amount.neg { color: #FF5E7F; }

  @media (max-width: 640px) {
    #sec-money-flow .mf-alloc-row { grid-template-columns: 90px 1fr 60px; gap: var(--sp-sm); padding: 6px var(--sp-xs); }
    #sec-money-flow .mf-alloc-label { font-size: var(--fs-mono-sm); }
    #sec-money-flow .mf-alloc-amount { font-size: var(--fs-mono-sm); }
  }

  /* ── Bottom watch callout ── */
  #sec-money-flow .mf-watch {
    margin: var(--sp-xs) var(--sp-lg) var(--sp-lg);
    padding: 10px 14px;
    background: rgba(80,252,209,0.05);
    border: 1px solid rgba(80,252,209,0.22);
    border-radius: var(--r-md);
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: var(--fs-mono);
    color: var(--text-strong, #e6e8ef);
  }
  #sec-money-flow .mf-watch-label {
    color: var(--cyan, #50FCD1);
    font-weight: 700;
    font-size: var(--fs-mono-xs);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    white-space: nowrap;
  }
  #sec-money-flow .mf-watch strong { color: var(--cyan, #50FCD1); font-variant-numeric: tabular-nums; }
  #sec-money-flow .mf-empty {
    padding: 20px;
    text-align: center;
    color: var(--muted, #8a92a8);
    font-size: var(--fs-mono);
  }


  /* ────────── CORRELATION RADAR ────────── */
  #sec-correlation-radar .cr-hero {
    padding: var(--sp-lg) var(--sp-lg) 14px;
    text-align: center;
    border-bottom: 1px solid var(--border);
    background: linear-gradient(180deg, rgba(80,252,209,0.04), transparent);
  }
  #sec-correlation-radar .cr-hero-label {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-xs);
  }
  #sec-correlation-radar .cr-hero-verdict {
    font-size: var(--fs-ui-lg);
    font-weight: 700;
    letter-spacing: 0.01em;
    line-height: 1.3;
  }
  #sec-correlation-radar .cr-hero-verdict.tone-pos     { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-hero-verdict.tone-warn    { color: #f59e0b; }
  #sec-correlation-radar .cr-hero-verdict.tone-neutral { color: var(--text-strong, #e6e8ef); }
  #sec-correlation-radar .cr-hero-note {
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    margin-top: 6px;
    font-family: var(--mono, ui-monospace);
  }
  #sec-correlation-radar .cr-hero-base {
    margin-top: var(--sp-sm);
    padding: 6px 10px;
    display: inline-block;
    background: rgba(80,252,209,0.06);
    border: 1px solid rgba(80,252,209,0.2);
    border-radius: var(--r-sm);
    font-size: var(--fs-mono-xs);
    font-family: var(--mono, ui-monospace);
    color: var(--cyan, #50FCD1);
    letter-spacing: 0.04em;
  }

  /* ── Three-Regime BTC Classifier (Hedge / Tech / Sponge) ── */
  #sec-correlation-radar .cr-three-regime {
    margin: 0 var(--sp-lg) var(--sp-md);
    padding: var(--sp-md) 14px;
    background: linear-gradient(180deg, rgba(80,125,252,0.04), rgba(36,41,56,0.35));
    border: 1px solid var(--border);
    border-radius: var(--r-md);
  }
  #sec-correlation-radar .cr-tr-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 10px;
    flex-wrap: wrap;
    gap: 6px;
  }
  #sec-correlation-radar .cr-tr-title {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
  }
  #sec-correlation-radar .cr-tr-sub {
    font-size: var(--fs-mono-xs);
    font-family: var(--mono, ui-monospace);
    letter-spacing: 0.04em;
    color: var(--muted, #8a92a8);
    opacity: 0.7;
  }
  #sec-correlation-radar .cr-tr-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-sm);
  }
  #sec-correlation-radar .cr-tr-card {
    padding: 10px;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    background: rgba(11,14,20,0.4);
    opacity: 0.45;
    transition: opacity 0.2s;
  }
  #sec-correlation-radar .cr-tr-card.active {
    opacity: 1;
    border-color: rgba(80,252,209,0.5);
    background: rgba(80,252,209,0.06);
    box-shadow: 0 0 0 1px rgba(80,252,209,0.15);
  }
  #sec-correlation-radar .cr-tr-card.dominant {
    border-color: var(--cyan, #50FCD1);
    box-shadow: 0 0 0 1px rgba(80,252,209,0.35), 0 0 12px rgba(80,252,209,0.18);
  }
  #sec-correlation-radar .cr-tr-name {
    font-size: var(--fs-mono);
    font-weight: 700;
    letter-spacing: 0.04em;
    color: var(--text-strong, #e6e8ef);
    margin-bottom: var(--sp-2xs);
  }
  #sec-correlation-radar .cr-tr-card.active .cr-tr-name { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-tr-status {
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
  }
  #sec-correlation-radar .cr-tr-card.active .cr-tr-status { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-tr-detail {
    font-size: var(--fs-mono-xs);
    font-family: var(--mono, ui-monospace);
    color: var(--muted, #8a92a8);
    margin-top: 6px;
    line-height: 1.4;
    font-variant-numeric: tabular-nums;
  }
  #sec-correlation-radar .cr-tr-rationale {
    margin-top: 10px;
    padding-top: var(--sp-sm);
    border-top: 1px dashed rgba(138,151,168,0.2);
    font-size: var(--fs-mono-sm);
    font-family: var(--mono, ui-monospace);
    color: var(--muted, #8a92a8);
    line-height: 1.5;
    letter-spacing: 0.02em;
  }
  @media (max-width: 600px) {
    #sec-correlation-radar .cr-tr-grid { grid-template-columns: 1fr; }
  }

  /* ── Regime detector ── */
  #sec-correlation-radar .cr-regime {
    margin: var(--sp-md) var(--sp-lg);
    padding: 10px 14px;
    background: rgba(36,41,56,0.35);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
  }
  #sec-correlation-radar .cr-regime-row {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 6px;
  }
  #sec-correlation-radar .cr-regime-label {
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
  }
  #sec-correlation-radar .cr-regime-key {
    font-size: var(--fs-body-sm);
    font-weight: 700;
    color: var(--cyan, #50FCD1);
    letter-spacing: 0.03em;
  }
  #sec-correlation-radar .cr-regime-key.key-low_vol  { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-regime-key.key-mid_vol  { color: #f59e0b; }
  #sec-correlation-radar .cr-regime-key.key-high_vol { color: #FF5E7F; }
  #sec-correlation-radar .cr-regime-meta {
    margin-left: auto;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    font-variant-numeric: tabular-nums;
  }
  #sec-correlation-radar .cr-regime-note {
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    line-height: 1.4;
  }

  /* ── Tier sections ── */
  #sec-correlation-radar .cr-tier { padding: 0 var(--sp-lg) var(--sp-sm); }
  #sec-correlation-radar .cr-tier-label {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
    padding: 14px 0 6px;
    border-bottom: 1px solid var(--border);
    margin-bottom: var(--sp-xs);
  }

  #sec-correlation-radar .cr-row {
    display: grid;
    grid-template-columns: 52px 54px 54px 24px 1fr;
    gap: 10px;
    align-items: center;
    padding: var(--sp-sm) var(--sp-xs);
    border-bottom: 1px solid rgba(36,41,56,0.35);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono);
    font-variant-numeric: tabular-nums;
  }
  #sec-correlation-radar .cr-row:last-child { border-bottom: none; }
  #sec-correlation-radar .cr-asset {
    font-weight: 700;
    color: var(--text-strong, #e6e8ef);
    font-size: var(--fs-body-sm);
  }
  #sec-correlation-radar .cr-val {
    text-align: right;
    font-weight: 600;
    color: var(--muted, #8a92a8);
  }
  #sec-correlation-radar .cr-val.tone-pos  { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-val.tone-neg  { color: #f59e0b; }
  #sec-correlation-radar .cr-val.tone-flat { color: var(--muted, #8a92a8); }
  #sec-correlation-radar .cr-val.grade-noise {
    color: #8a92a8 !important;
    opacity: 0.6;
  }
  #sec-correlation-radar .cr-val.grade-noise::after {
    content: " ·";
    font-size: 8px;
  }
  #sec-correlation-radar .cr-col-header {
    font-size: 8px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--muted, #8a92a8);
    font-weight: 600;
  }
  #sec-correlation-radar .cr-arrow {
    text-align: center;
    font-size: var(--fs-body-sm);
    color: var(--muted, #8a92a8);
  }
  #sec-correlation-radar .cr-arrow.up   { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-arrow.down { color: #FF5E7F; }
  #sec-correlation-radar .cr-note {
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    font-family: var(--font, sans-serif);
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  #sec-correlation-radar .cr-legend {
    padding: var(--sp-sm) var(--sp-lg) 14px;
    font-size: var(--fs-mono-xs);
    color: var(--muted, #8a92a8);
    font-family: var(--mono, ui-monospace);
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
  }
  #sec-correlation-radar .cr-legend span::before {
    content: "●";
    margin-right: var(--sp-xs);
  }
  #sec-correlation-radar .cr-legend .leg-pos::before   { color: var(--cyan, #50FCD1); }
  #sec-correlation-radar .cr-legend .leg-neg::before   { color: #f59e0b; }
  #sec-correlation-radar .cr-legend .leg-noise::before { color: #8a92a8; }

  @media (max-width: 640px) {
    /* --- Mobile: compact 2-column scorecard, notes hidden by default --- */
    #sec-correlation-radar .cr-hero { padding: var(--sp-md) var(--sp-md) 10px; }
    #sec-correlation-radar .cr-hero-label { font-size: var(--fs-mono-xs); margin-bottom: var(--sp-2xs); }
    #sec-correlation-radar .cr-hero-verdict { font-size: var(--fs-body-lg); line-height: 1.3; }
    #sec-correlation-radar .cr-hero-note { font-size: var(--fs-mono-sm); margin-top: var(--sp-xs); }
    #sec-correlation-radar .cr-hero-base {
      font-size: var(--fs-mono-xs);
      padding: var(--sp-xs) var(--sp-sm);
      margin-top: 6px;
    }

    /* Regime: condense to a single compact block */
    #sec-correlation-radar .cr-regime {
      margin: 10px var(--sp-md);
      padding: var(--sp-sm) 10px;
    }
    #sec-correlation-radar .cr-regime-row {
      flex-wrap: wrap;
      gap: 6px;
      margin-bottom: var(--sp-xs);
    }
    #sec-correlation-radar .cr-regime-label { font-size: 8px; }
    #sec-correlation-radar .cr-regime-key { font-size: var(--fs-mono); }
    #sec-correlation-radar .cr-regime-meta {
      font-size: var(--fs-mono-xs);
      margin-left: 0;
      flex-basis: 100%;
    }
    #sec-correlation-radar .cr-regime-note { font-size: var(--fs-mono-xs); line-height: 1.35; }

    /* Tier sections: 2-column grid of compact cells */
    #sec-correlation-radar .cr-tier { padding: 0 var(--sp-md) var(--sp-xs); }
    #sec-correlation-radar .cr-tier-label {
      font-size: var(--fs-mono-xs);
      padding: 10px 0 var(--sp-xs);
      margin-bottom: var(--sp-2xs);
    }

    /* Hide the column-header row on mobile (fields go inline per cell) */
    #sec-correlation-radar .cr-row.cr-row-header { display: none; }

    /* Transform tier grid into 2-col compact cells */
    #sec-correlation-radar .cr-tier {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: var(--sp-2xs) var(--sp-sm);
    }
    #sec-correlation-radar .cr-tier-label {
      grid-column: 1 / 3;
    }
    #sec-correlation-radar .cr-row {
      grid-template-columns: 46px 1fr 20px;
      gap: 6px;
      padding: 6px var(--sp-2xs);
      font-size: var(--fs-mono);
      border-bottom: 1px solid rgba(36,41,56,0.3);
    }
    #sec-correlation-radar .cr-asset {
      font-size: var(--fs-body-sm);
      font-weight: 700;
    }
    #sec-correlation-radar .cr-val {
      font-size: var(--fs-mono);
      text-align: left;
    }
    /* Hide 90d on mobile — 30d is the actionable window */
    #sec-correlation-radar .cr-row .cr-val + .cr-val { display: none; }
    #sec-correlation-radar .cr-arrow { font-size: var(--fs-mono); }
    /* Hide notes by default on mobile. Available via the panel-info (i) button */
    #sec-correlation-radar .cr-note { display: none; }

    #sec-correlation-radar .cr-legend {
      padding: var(--sp-sm) var(--sp-md) var(--sp-md);
      font-size: var(--fs-mono-xs);
      gap: 10px;
    }
  }



  /* ────────── Institutional Pulse (CoinGlass synthesis) ────────── */
  #sec-institutional-pulse .ip-hero {
    padding: var(--sp-lg) var(--sp-lg) var(--sp-md);
    text-align: center;
    border-bottom: 1px solid var(--border);
    background: linear-gradient(180deg, rgba(80,252,209,0.05), transparent);
  }
  #sec-institutional-pulse .ip-hero-label {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-xs);
  }
  #sec-institutional-pulse .ip-hero-verdict {
    font-size: var(--fs-display-sm);
    font-weight: 700;
    letter-spacing: 0.02em;
    line-height: 1.2;
  }
  #sec-institutional-pulse .ip-hero-verdict.tone-bull { color: var(--cyan, #50FCD1); }
  #sec-institutional-pulse .ip-hero-verdict.tone-warn { color: #f59e0b; }
  #sec-institutional-pulse .ip-hero-verdict.tone-bear { color: #FF5E7F; }
  #sec-institutional-pulse .ip-hero-verdict.tone-neutral { color: var(--text-strong, #e6e8ef); }
  #sec-institutional-pulse .ip-hero-note {
    font-size: var(--fs-body-sm);
    color: var(--muted, #8a92a8);
    margin-top: 6px;
    font-family: var(--font, sans-serif);
    line-height: 1.4;
  }

  #sec-institutional-pulse .ip-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-md);
    padding: 14px var(--sp-lg);
  }

  #sec-institutional-pulse .ip-card {
    background: var(--bg-panel-2, rgba(36,41,56,0.4));
    border: 1px solid var(--border);
    border-top-width: 2px;
    border-radius: var(--r-md);
    padding: 14px;
    display: flex;
    flex-direction: column;
    gap: var(--sp-sm);
    position: relative;
  }
  #sec-institutional-pulse .ip-card.tone-bull { border-top-color: var(--cyan, #50FCD1); background: rgba(80,252,209,0.04); }
  #sec-institutional-pulse .ip-card.tone-warn { border-top-color: #f59e0b; background: rgba(245,158,11,0.04); }
  #sec-institutional-pulse .ip-card.tone-bear { border-top-color: #FF5E7F; background: rgba(248,113,113,0.04); }
  #sec-institutional-pulse .ip-card.tone-neutral { border-top-color: #8a92a8; }

  #sec-institutional-pulse .ip-card-label {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
  }
  #sec-institutional-pulse .ip-card-value {
    font-size: var(--fs-display);
    font-weight: 700;
    font-family: var(--mono, ui-monospace);
    font-variant-numeric: tabular-nums;
    line-height: 1;
    color: var(--text-strong, #e6e8ef);
  }
  #sec-institutional-pulse .ip-card.tone-bull .ip-card-value { color: var(--cyan, #50FCD1); }
  #sec-institutional-pulse .ip-card.tone-warn .ip-card-value { color: #f59e0b; }
  #sec-institutional-pulse .ip-card.tone-bear .ip-card-value { color: #FF5E7F; }

  #sec-institutional-pulse .ip-card-verdict {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 3px var(--sp-sm);
    border-radius: var(--r-pill);
    align-self: flex-start;
    border: 1px solid;
  }
  #sec-institutional-pulse .ip-card.tone-bull .ip-card-verdict { background: rgba(80,252,209,0.12); color: var(--cyan, #50FCD1); border-color: rgba(80,252,209,0.3); }
  #sec-institutional-pulse .ip-card.tone-warn .ip-card-verdict { background: rgba(245,158,11,0.12); color: #f59e0b; border-color: rgba(245,158,11,0.3); }
  #sec-institutional-pulse .ip-card.tone-bear .ip-card-verdict { background: rgba(248,113,113,0.12); color: #FF5E7F; border-color: rgba(248,113,113,0.3); }
  #sec-institutional-pulse .ip-card.tone-neutral .ip-card-verdict { background: rgba(148,163,184,0.12); color: #8a92a8; border-color: rgba(148,163,184,0.3); }

  #sec-institutional-pulse .ip-card-note {
    font-size: var(--fs-mono);
    color: var(--muted, #8a92a8);
    line-height: 1.45;
    font-family: var(--font, sans-serif);
  }
  #sec-institutional-pulse .ip-card-detail {
    font-size: var(--fs-mono-sm);
    color: var(--text-dim, #8a92a8);
    font-family: var(--mono, ui-monospace);
    font-variant-numeric: tabular-nums;
    margin-top: auto;
    padding-top: var(--sp-xs);
    border-top: 1px solid rgba(36,41,56,0.4);
  }

  @media (max-width: 860px) {
    #sec-institutional-pulse .ip-grid { grid-template-columns: 1fr; gap: 10px; }
    #sec-institutional-pulse .ip-card { padding: var(--sp-md); }
    #sec-institutional-pulse .ip-card-value { font-size: var(--fs-display-sm); }
    #sec-institutional-pulse .ip-hero-verdict { font-size: var(--fs-ui-lg); }
  }

  /* ────────── CoinGlass: Cycle Indicators ────────── */
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    padding: var(--sp-md) var(--sp-lg);
  }
  /* Tactical Layer clusters — Phase 3.1 (2026-05-04). Three labeled
     sub-grids replace a single 11-card flat grid so the eye groups the
     indicators by what they measure (price-level anchors / derivatives
     regime / holder P&L) instead of scanning a uniform 11-row block. */
  #sec-tactical-layer .tactical-cluster {
    margin-bottom: var(--sp-md);
  }
  #sec-tactical-layer .tactical-cluster:last-of-type {
    margin-bottom: 0;
  }
  #sec-tactical-layer .tactical-cluster-label {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text-dim);
    margin: 0 var(--sp-lg) var(--sp-xs);
    padding: 0 0 4px;
    border-bottom: 1px solid var(--border);
  }
  /* Inside a cluster the grid keeps its own padding so the divider line
     stretches edge-to-edge of the panel-body. */
  #sec-tactical-layer .tactical-cluster .cg-cyc-grid {
    padding-top: 0;
  }

  /* Tactical card v2 polish 2026-05-04 — "less dense, more data viz."
     Original card had 5 rows: name, value, signal pill, prose note, anchor
     range. New card has 3 rows: head (name+value), mini-position-bar, tone
     pill. Note + anchor moved to the card's title attr for hover tooltip.
     The bar shows where the indicator sits on its meaningful range — visual
     position replaces the deleted prose. */
  #sec-tactical-layer .cg-cyc-card.tac-card {
    padding: var(--sp-sm) var(--sp-md) var(--sp-md);
    gap: var(--sp-xs);
    background: rgba(20, 24, 33, 0.6);
    cursor: help;
  }
  #sec-tactical-layer .tac-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-sm);
    margin-bottom: 2px;
  }
  #sec-tactical-layer .tac-card .cg-cyc-name {
    font-size: 10px;
    color: var(--text-dim);
  }
  /* Doto numeral inside tactical cards — smaller scale than the hero
     numerals (which are 64px) but same dot-matrix family + glow tinted
     by tone class. */
  #sec-tactical-layer .tac-card .cg-cyc-value {
    font-family: 'Doto', 'Fira Code', var(--mono);
    font-size: 28px;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.02em;
    align-self: baseline;
  }
  #sec-tactical-layer .tac-card .cg-cyc-value.tone-bull {
    color: var(--green);
    text-shadow: 0 0 4px rgba(80, 252, 209, 0.7),
                 0 0 12px rgba(80, 252, 209, 0.35);
  }
  #sec-tactical-layer .tac-card .cg-cyc-value.tone-bear {
    color: var(--red);
    text-shadow: 0 0 4px rgba(255, 94, 127, 0.7),
                 0 0 12px rgba(255, 94, 127, 0.35);
  }
  #sec-tactical-layer .tac-card .cg-cyc-value.tone-warn {
    color: var(--yellow);
    text-shadow: 0 0 4px rgba(255, 209, 102, 0.6),
                 0 0 12px rgba(255, 209, 102, 0.30);
  }

  /* Mini position-bar — shows where the indicator sits on its band. */
  #sec-tactical-layer .tac-bar {
    display: flex;
    flex-direction: column;
    gap: 2px;
    margin: 6px 0 4px;
  }
  #sec-tactical-layer .tac-bar-track {
    position: relative;
    height: 6px;
    border-radius: var(--r-sm);
    background: linear-gradient(90deg,
      rgba(255, 94, 127, 0.20) 0%,
      rgba(255, 209, 102, 0.18) 50%,
      rgba(80, 252, 209, 0.22) 100%);
    overflow: visible;
    border: 1px solid var(--border);
  }
  #sec-tactical-layer .tac-bar-marker {
    position: absolute;
    top: -3px;
    bottom: -3px;
    width: 3px;
    background: var(--text);
    transform: translateX(-50%);
    border-radius: 2px;
    box-shadow: 0 0 0 2px var(--bg-panel),
                0 0 10px currentColor;
    transition: left var(--dur-data-reveal, 900ms) var(--ease-data-reveal, cubic-bezier(0.16, 1, 0.3, 1));
  }
  #sec-tactical-layer .tac-bar-marker.tone-bull { color: var(--green); }
  #sec-tactical-layer .tac-bar-marker.tone-bear { color: var(--red); }
  #sec-tactical-layer .tac-bar-marker.tone-warn { color: var(--yellow); }
  #sec-tactical-layer .tac-bar-axis {
    display: flex;
    justify-content: space-between;
    font: 500 8px var(--mono);
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    opacity: 0.55;
  }

  /* Compact tone pill — single line, signal + brief context. */
  #sec-tactical-layer .tac-card .cg-cyc-signal.tac-signal {
    align-self: stretch;
    text-align: center;
    font-size: 9px;
    padding: 4px 6px;
    line-height: 1.3;
  }
  /* Hide elements moved to tooltip / removed entirely */
  #sec-tactical-layer .tac-card .cg-cyc-note,
  #sec-tactical-layer .tac-card .cg-cyc-anchor,
  #sec-tactical-layer .tac-card .panel-src-chip {
    display: none !important;
  }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-card {
    background: var(--bg-panel-2, rgba(36,41,56,0.4));
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: var(--sp-md);
    display: flex;
    flex-direction: column;
    gap: 6px;
  }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-name {
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--muted, #8a92a8);
  }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-value {
    font-size: var(--fs-display-sm);
    font-weight: 700;
    font-family: var(--mono, ui-monospace);
    color: var(--text-strong, #e6e8ef);
    font-variant-numeric: tabular-nums;
    line-height: 1;
  }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-value.tone-bull { color: var(--cyan, #50FCD1); }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-value.tone-warn { color: #f59e0b; }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-value.tone-bear { color: #FF5E7F; }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-signal {
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    padding: var(--sp-2xs) 6px;
    border-radius: var(--r-pill);
    align-self: flex-start;
  }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-signal.bull { background: rgba(80,252,209,0.12); color: var(--cyan, #50FCD1); border: 1px solid rgba(80,252,209,0.3); }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-signal.warn { background: rgba(245,158,11,0.12); color: #f59e0b; border: 1px solid rgba(245,158,11,0.3); }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-signal.bear { background: rgba(248,113,113,0.12); color: #FF5E7F; border: 1px solid rgba(248,113,113,0.3); }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-note {
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    line-height: 1.4;
  }
  /* Macro V2 item #2: BTC-USD translation line below the note. Tabular-num
     so the dollar figure aligns; cyan tint to mark it as a derived anchor
     (different role from the descriptive note above it). */
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-anchor {
    margin-top: 6px;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    font-variant-numeric: tabular-nums;
    color: var(--cyan, #50FCD1);
    opacity: 0.85;
    letter-spacing: 0.02em;
  }
  /* v1.4 — 2025 cycle-top backtest line. Brutal honesty: shows what each
     indicator printed at the actual $124,715 peak so the operator sees
     exactly which signals failed to call the top. */
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-bt {
    margin-top: var(--sp-sm);
    padding-top: var(--sp-sm);
    border-top: 1px dashed var(--border);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-xs);
    font-variant-numeric: tabular-nums;
    color: var(--text-dim);
    letter-spacing: 0.02em;
  }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-bt-label { opacity: 0.6; text-transform: uppercase; letter-spacing: 0.06em; }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-bt.fired { color: var(--cyan, #50FCD1); }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-bt.fired .cg-cyc-bt-label { color: var(--cyan, #50FCD1); opacity: 0.9; }
  :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-bt.failed { color: #FF5E7F; opacity: 0.75; }

  @media (max-width: 900px) {
    :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-grid { grid-template-columns: repeat(2, 1fr); }
  }
  @media (max-width: 480px) {
    :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-grid { grid-template-columns: 1fr; }
    :is(#sec-cg-cycles, #sec-tactical-layer) .cg-cyc-value { font-size: var(--fs-ui-lg); }
  }

  /* --- Mobile stack layout for LTH tables (480px) --- */
  @media (max-width: 480px) {
    :is(#sec-lth, #cyc-lth) .lth-metrics {
      grid-template-columns: repeat(2, 1fr);
    }
    :is(#sec-lth, #cyc-lth) .lth-metric span { font-size: var(--fs-mono-sm); }
    :is(#sec-lth, #cyc-lth) .lth-metric strong { font-size: var(--fs-body); }

    :is(#sec-lth, #cyc-lth) .lth-historical-table thead { display: none; }
    :is(#sec-lth, #cyc-lth) .lth-historical-table,
    :is(#sec-lth, #cyc-lth) .lth-historical-table tbody {
      display: block;
      width: 100%;
    }
    :is(#sec-lth, #cyc-lth) .lth-historical-table tr {
      display: flex;
      flex-wrap: wrap;
      align-items: baseline;
      gap: var(--sp-2xs) 10px;
      padding: var(--sp-sm) 0;
      border-bottom: 1px solid rgba(36,41,56,0.5);
    }
    :is(#sec-lth, #cyc-lth) .lth-historical-table td {
      display: inline-block;
      padding: 0;
      border-bottom: none;
      text-align: left !important;
      font-size: var(--fs-mono-sm);
      color: var(--muted, #8a92a8);
    }
    :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(1) {
      flex: 0 0 auto;
      font-size: var(--fs-mono-sm);
    }
    :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(2) {
      flex: 1 1 auto;
      font-weight: 600;
      font-size: var(--fs-mono);
    }
    :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(3),
    :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(4) {
      flex: 0 0 auto;
    }
    :is(#sec-lth, #cyc-lth) .lth-historical-table td:nth-child(5) {
      flex: 1 1 100%;
      color: var(--text-strong, #e6e8ef);
      font-size: var(--fs-mono);
      margin-top: var(--sp-2xs);
    }
  }


  /* --- Divergence Watch / Trap Detection panel --- */
  #sec-divergence .div-flags {
    display: flex;
    flex-direction: column;
    gap: 14px;
    margin-top: 10px;
  }
  #sec-divergence .div-flag {
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-left-width: 4px;
    border-radius: var(--r-md);
    padding: 14px var(--sp-lg);
  }
  #sec-divergence .div-flag.type-bull_trap     { border-left-color: #f59e0b; }
  #sec-divergence .div-flag.type-bear_trap     { border-left-color: #50FCD1; }
  #sec-divergence .div-flag.type-accumulation_regime { border-left-color: #50FCD1; background: rgba(80,252,209,0.04); }
  #sec-divergence .div-flag.type-dead_cat_bounce { border-left-color: #FF5E7F; }
  #sec-divergence .div-flag-head {
    display: flex;
    align-items: baseline;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 6px;
  }
  #sec-divergence .div-flag-icon { font-size: var(--fs-ui-lg); }
  #sec-divergence .div-flag-label {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-body);
    font-weight: 700;
    letter-spacing: 0.04em;
    color: var(--text-strong, #e6e8ef);
  }
  #sec-divergence .div-flag.type-bull_trap .div-flag-label     { color: #f59e0b; }
  #sec-divergence .div-flag.type-bear_trap .div-flag-label     { color: #50FCD1; }
  #sec-divergence .div-flag.type-accumulation_regime .div-flag-label { color: #50FCD1; }
  #sec-divergence .div-flag.type-dead_cat_bounce .div-flag-label { color: #FF5E7F; }
  #sec-divergence .div-flag-severity {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    padding: var(--sp-2xs) var(--sp-sm);
    border-radius: var(--r-lg);
    background: rgba(100,116,139,0.15);
    color: var(--muted, #8a92a8);
  }
  #sec-divergence .div-flag-severity.high   { background: rgba(80,252,209,0.18); color: #50FCD1; }
  #sec-divergence .div-flag-severity.medium { background: rgba(245,158,11,0.18); color: #f59e0b; }
  #sec-divergence .div-flag-severity.low    { background: rgba(100,116,139,0.18); color: #8a92a8; }
  #sec-divergence .div-flag-summary {
    font-size: var(--fs-body);
    color: var(--muted, #8a92a8);
    line-height: 1.55;
    margin: var(--sp-xs) 0 10px;
  }
  #sec-divergence .div-flag-evidence {
    display: flex;
    flex-direction: column;
    gap: var(--sp-xs);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono);
    padding-top: var(--sp-sm);
    border-top: 1px solid var(--panel-border, #1a1f2c);
  }
  #sec-divergence .div-evidence-row {
    display: grid;
    grid-template-columns: 16px 140px 1fr auto;
    gap: var(--sp-sm);
    align-items: baseline;
    padding: 3px 0;
    color: var(--muted, #8a92a8);
    line-height: 1.5;
  }
  #sec-divergence .div-evidence-marker { font-weight: 700; text-align: center; }
  #sec-divergence .div-evidence-row.bull .div-evidence-marker { color: #50FCD1; }
  #sec-divergence .div-evidence-row.bear .div-evidence-marker { color: #FF5E7F; }
  #sec-divergence .div-evidence-row.neutral .div-evidence-marker { color: #8a92a8; }
  #sec-divergence .div-evidence-metric {
    color: var(--text-strong, #e6e8ef);
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.04em;
  }
  #sec-divergence .div-evidence-read { color: var(--muted, #8a92a8); font-size: var(--fs-mono); }
  #sec-divergence .div-evidence-value {
    color: var(--text-strong, #e6e8ef);
    font-variant-numeric: tabular-nums;
    text-align: right;
    white-space: nowrap;
    font-size: var(--fs-mono);
  }
  @media (max-width: 640px) {
    #sec-divergence .div-evidence-row {
      grid-template-columns: 16px 1fr auto;
    }
    #sec-divergence .div-evidence-read { display: none; }
  }

  #sec-divergence .div-no-flags {
    display: flex;
    align-items: center;
    gap: var(--sp-md);
    padding: var(--sp-lg) var(--sp-lg);
    background: rgba(80,252,209,0.05);
    border: 1px solid rgba(80,252,209,0.2);
    border-radius: var(--r-md);
    color: var(--muted, #8a92a8);
    font-size: var(--fs-body);
    line-height: 1.5;
  }
  #sec-divergence .div-no-flags-icon { font-size: var(--fs-ui-lg); }

  /* --- Capital Pipeline panel --- */
  #sec-capital-pipeline .cap-headline {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: var(--sp-lg) 10px 14px;
    background: var(--panel-bg, #0b0e14);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-lg);
    margin-top: var(--sp-sm);
  }
  #sec-capital-pipeline .cap-headline-label {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--muted, #8a92a8);
    margin-bottom: var(--sp-sm);
  }
  #sec-capital-pipeline .cap-headline-value {
    font-family: var(--mono, ui-monospace);
    font-size: 46px;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    line-height: 1;
    color: var(--text-strong, #e6e8ef);
  }
  #sec-capital-pipeline .cap-headline-value.inflow  { color: #50FCD1; }
  #sec-capital-pipeline .cap-headline-value.outflow { color: #FF5E7F; }
  #sec-capital-pipeline .cap-headline-value.flat    { color: #e6e8ef; }
  #sec-capital-pipeline .cap-headline-direction {
    margin-top: var(--sp-sm);
    font-size: var(--fs-body);
    color: var(--muted, #8a92a8);
  }
  #sec-capital-pipeline .cap-headline-direction.inflow  { color: #50FCD1; }
  #sec-capital-pipeline .cap-headline-direction.outflow { color: #FF5E7F; }

  #sec-capital-pipeline .cap-horizons {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin-top: 14px;
  }
  @media (max-width: 640px) {
    #sec-capital-pipeline .cap-horizons { grid-template-columns: 1fr; }
  }
  #sec-capital-pipeline .cap-horizon-col {
    background: rgba(36,41,56,0.3);
    border-radius: var(--r-md);
    padding: var(--sp-md) 14px;
    text-align: center;
  }
  #sec-capital-pipeline .cap-horizon-col.cap-horizon-primary {
    background: rgba(80,252,209,0.06);
    border: 1px solid rgba(80,252,209,0.2);
  }
  #sec-capital-pipeline .cap-horizon-label {
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.12em;
    color: var(--muted, #8a92a8);
  }
  #sec-capital-pipeline .cap-horizon-total {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-display-sm);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    margin: 6px 0 var(--sp-sm);
  }
  #sec-capital-pipeline .cap-horizon-total.pos { color: #50FCD1; }
  #sec-capital-pipeline .cap-horizon-total.neg { color: #FF5E7F; }
  #sec-capital-pipeline .cap-horizon-sub {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    line-height: 1.6;
  }
  #sec-capital-pipeline .cap-horizon-sub span { font-variant-numeric: tabular-nums; }
  #sec-capital-pipeline .cap-horizon-sub span.pos { color: #50FCD1; }
  #sec-capital-pipeline .cap-horizon-sub span.neg { color: #FF5E7F; }

  #sec-capital-pipeline .cap-context {
    margin-top: 14px;
    padding-top: var(--sp-md);
    border-top: 1px solid var(--panel-border, #1a1f2c);
  }
  #sec-capital-pipeline .cap-context-head {
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text-dim, #8a92a8);
    margin-bottom: var(--sp-sm);
  }
  #sec-capital-pipeline .cap-context-head .cap-context-hint {
    text-transform: none;
    font-size: var(--fs-mono-xs);
    color: var(--text-dim, #8a92a8);
    letter-spacing: 0;
    font-style: italic;
    margin-left: 6px;
  }
  #sec-capital-pipeline .cap-context-row {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    gap: var(--sp-md);
    align-items: baseline;
    padding: 6px 0;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono);
  }
  #sec-capital-pipeline .cap-context-row span:first-child {
    color: var(--muted, #8a92a8);
  }
  #sec-capital-pipeline .cap-context-row strong {
    font-variant-numeric: tabular-nums;
    text-align: right;
    color: var(--text-strong, #e6e8ef);
  }
  #sec-capital-pipeline .cap-context-row strong.pos { color: #50FCD1; }
  #sec-capital-pipeline .cap-context-row strong.neg { color: #FF5E7F; }
  #sec-capital-pipeline .cap-context-row .cap-context-sub {
    font-size: var(--fs-mono-sm);
    color: var(--text-dim, #8a92a8);
    text-align: right;
  }

  /* --- Layer correlation heatmap --- */
  .corr-wrap {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 20px;
    align-items: start;
    margin-top: var(--sp-sm);
  }
  @media (max-width: 860px) {
    .corr-wrap { grid-template-columns: 1fr; }
  }
  @media (max-width: 720px) {
    /* Matrix is wider than viewport at 7 cols — enable horizontal swipe */
    .corr-wrap {
      overflow-x: auto;
      -webkit-overflow-scrolling: touch;
      min-width: 0;
      padding-bottom: var(--sp-xs);
    }
    .corr-matrix { max-width: none; }
  }
  .corr-matrix {
    display: grid;
    gap: var(--sp-2xs);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    max-width: 720px;
  }
  .corr-matrix .corr-cell {
    padding: var(--sp-sm) 6px;
    text-align: center;
    background: rgba(36,41,56,0.4);
    color: var(--muted, #8a92a8);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .corr-matrix .corr-header  {
    background: transparent;
    color: var(--muted, #8a92a8);
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    padding: var(--sp-xs) var(--sp-2xs);
  }
  .corr-matrix .corr-header.row-label {
    text-align: right;
    padding-right: var(--sp-sm);
  }
  .corr-matrix .corr-cell.diag {
    background: rgba(116,152,253,0.15);
    color: #7498fd;
    font-weight: 700;
  }
  .corr-summary {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    color: var(--muted, #8a92a8);
    min-width: 180px;
  }
  .corr-summary h4 {
    margin: 0 0 var(--sp-sm);
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
  }
  .corr-summary .corr-summary-row {
    display: flex;
    justify-content: space-between;
    padding: 3px 0;
    border-bottom: 1px solid rgba(36,41,56,0.4);
  }
  .corr-summary .corr-summary-row strong {
    color: var(--text-strong, #e6e8ef);
    font-variant-numeric: tabular-nums;
  }

  /* --- Historical backtest table --- */
  .backtest-wrap { overflow-x: auto; margin-top: var(--sp-sm); }
  .backtest-table {
    width: 100%;
    border-collapse: collapse;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono);
  }
  .backtest-table th {
    text-align: right;
    font-weight: 500;
    color: var(--muted, #8a92a8);
    padding: 6px var(--sp-sm);
    border-bottom: 1px solid var(--panel-border, #1a1f2c);
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    white-space: nowrap;
  }
  .backtest-table th:nth-child(1),
  .backtest-table th:nth-child(2) { text-align: left; }
  .backtest-table td {
    padding: 6px var(--sp-sm);
    text-align: right;
    font-variant-numeric: tabular-nums;
    color: var(--text-strong, #e6e8ef);
    border-bottom: 1px solid rgba(36,41,56,0.4);
  }
  .backtest-table td:nth-child(1),
  .backtest-table td:nth-child(2) { text-align: left; }
  .backtest-table tr.kind-bottom td:nth-child(2) { color: #50FCD1; }
  .backtest-table tr.kind-top    td:nth-child(2) { color: #FF5E7F; }
  .backtest-table td.move-pos { color: #50FCD1; }
  .backtest-table td.move-neg { color: #FF5E7F; }
  .accuracy-badge {
    display: inline-block;
    padding: var(--sp-2xs) var(--sp-sm);
    border-radius: var(--r-lg);
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
  }
  .accuracy-badge.exact   { background: rgba(80,252,209,0.15); color: #50FCD1; }
  .accuracy-badge.good    { background: rgba(116,152,253,0.15); color: #7498fd; }
  .accuracy-badge.partial { background: rgba(245,158,11,0.15); color: #f59e0b; }
  .accuracy-badge.miss    { background: rgba(248,113,113,0.15); color: #FF5E7F; }

  /* --- Synthesis cards (2026-04-16): replace raw tables with curated verdicts --- */
  .bt-synth {
    display: grid;
    grid-template-columns: 220px 1fr;
    gap: var(--sp-lg);
    align-items: stretch;
    padding: 14px var(--sp-lg);
    background: linear-gradient(135deg, rgba(80,252,209,0.04), rgba(116,152,253,0.04));
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
    margin-bottom: 10px;
  }
  @media (max-width: 640px) { .bt-synth { grid-template-columns: 1fr; } }
  .bt-hero {
    display: flex; flex-direction: column; justify-content: center;
    padding-right: 14px;
    border-right: 1px solid rgba(36,41,56,0.6);
  }
  @media (max-width: 640px) { .bt-hero { border-right: none; border-bottom: 1px solid rgba(36,41,56,0.6); padding-right: 0; padding-bottom: 10px; } }
  .bt-hero-num {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-display-hero); font-weight: 700; line-height: 1;
    color: #50FCD1;
    font-variant-numeric: tabular-nums;
  }
  .bt-hero-label {
    font-size: var(--fs-mono-xs); color: var(--muted, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.08em;
    margin-top: 6px;
  }
  .bt-hero-sub {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono); color: var(--text-dim, #8a92a8);
    margin-top: var(--sp-sm);
  }
  .bt-verdict {
    display: flex; flex-direction: column; gap: var(--sp-sm);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-body-sm); line-height: 1.5;
    color: var(--text-strong, #e6e8ef);
  }
  .bt-verdict .bt-v-line { display: flex; gap: var(--sp-sm); align-items: baseline; }
  .bt-verdict .bt-v-label {
    font-size: var(--fs-mono-xs); color: var(--muted, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.06em;
    min-width: 76px;
  }
  .bt-verdict .bt-v-val { color: var(--text-strong, #e6e8ef); }
  .bt-verdict .bt-v-val b { color: #50FCD1; }
  .bt-verdict .bt-v-val .neg { color: #FF5E7F; }
  .bt-raw summary {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm); color: var(--muted, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.06em;
    cursor: pointer; padding: 6px 0;
  }
  .bt-raw[open] summary { color: var(--text-dim, #8a92a8); }

  /* LTH historical synthesis */
  .lth-hist-synth {
    display: flex; flex-direction: column; gap: 10px;
    padding: var(--sp-md) 14px;
    background: rgba(36,41,56,0.3);
    border-radius: var(--r-md);
    font-family: var(--mono, ui-monospace);
  }
  .lth-hist-rule {
    font-size: var(--fs-body-sm); line-height: 1.5;
    color: var(--text-strong, #e6e8ef);
  }
  .lth-hist-rule b.bull { color: #50FCD1; }
  .lth-hist-rule b.bear { color: #FF5E7F; }
  .lth-hist-current {
    display: flex; gap: 10px; align-items: baseline;
    padding-top: var(--sp-sm);
    border-top: 1px solid rgba(36,41,56,0.6);
    font-size: var(--fs-mono);
  }
  .lth-hist-current .lhc-label {
    font-size: var(--fs-mono-xs); color: var(--muted, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.08em;
  }
  .lth-hist-current .lhc-val { color: var(--text-strong, #e6e8ef); }
  .lth-hist-current .lhc-val b.bull { color: #50FCD1; }
  .lth-hist-current .lhc-val b.bear { color: #FF5E7F; }
  .lth-hist-current .lhc-val b.neutral { color: #8a92a8; }
  .lth-hist-raw summary {
    font-size: var(--fs-mono-xs); color: var(--muted, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.06em;
    cursor: pointer; margin-top: var(--sp-sm);
  }

  /* T1 recalibrated synthesis */
  .t1-recal-synth {
    display: flex; flex-direction: column; gap: var(--sp-md);
    padding: var(--sp-md) 14px;
    background: rgba(36,41,56,0.3);
    border-radius: var(--r-md);
  }
  .t1-recal-line {
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono); line-height: 1.55;
    color: var(--text-strong, #e6e8ef);
  }
  .t1-recal-line b { color: var(--cyan, #8BDBEC); }
  .t1-recal-targets {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--sp-sm);
  }
  @media (max-width: 640px) { .t1-recal-targets { grid-template-columns: repeat(2, 1fr); } }
  .t1-recal-chip {
    display: flex; flex-direction: column; gap: 3px;
    padding: var(--sp-sm) 10px;
    background: rgba(15,22,30,0.5);
    border: 1px solid var(--panel-border, #1a1f2c);
    border-radius: var(--r-md);
    font-family: var(--mono, ui-monospace);
  }
  .t1-recal-chip span {
    font-size: var(--fs-mono-xs); color: var(--muted, #8a92a8);
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  .t1-recal-chip b {
    font-size: var(--fs-body);
    color: var(--cyan, #8BDBEC);
    font-variant-numeric: tabular-nums;
  }

  /* =========================================================================
     Panel Stack Ordering (2026-04-16 v2): grouped by layer + session workflow.
     Matches docs §02 "How to use CW Macro" 6-step workflow:
       Signal → L4 Execution → L3 On-Chain → L2 Cycle → L1 Macro → DCA

     Group A (The Verdict)         : 10-19
     Group B (L4 Execution)        : 20-29   — check first per docs
     Group C (L3 On-Chain)         : 30-49   — verify with evidence
     Group D (Institutional/Capital): 50-69   — dollar flows cluster
     Group E (L2 Cycle)            : 70-99   — cycle position cluster
     Group F (L1 Macro)            : 100-109 — macro permission
     Group G (Action/Planning)     : 110-119 — what to do
     Group H (Intelligence)        : 200-209 — reading material
     Group R (Reference)           : 500+    — auto-collapsed
     ========================================================================= */
  .panel-stack {
    display: flex;
    flex-direction: column;
  }

  /* --- Group A: The Verdict (always first) --- */
  .panel-stack #sec-composite          { order: 10; }  /* Composite Signal gauge */
  .panel-stack #sec-overview           { order: 11; }  /* KPI strip */

  .panel-stack #sec-prediction         { order: 14; }  /* AI Prediction (after Pulse) */

  /* --- Group B: L4 Execution (check first per docs workflow) --- */
  .panel-stack #sec-funding            { order: 20; }  /* Funding Regime */
  .panel-stack #sec-options            { order: 21; }  /* Options / Deribit */
  .panel-stack #sec-liquidations       { order: 22; }  /* Liquidation Levels */

  /* IA reorg 2026-04-24 — panels renumbered to group by screen journey.
     Verdict 10-19, Execution 20-29, Cycle 30-49, Capital 50-69, Plan 70-89.
     Old framework-layer comments preserved for traceability. */

  /* --- VERDICT extras (headline reads beyond the top bento + gauge) --- */
  .panel-stack #sec-heat               { order: 15; }  /* Market Heat Thermometer (moved from Cycle) */
  .panel-stack #sec-divergence         { order: 16; }  /* Divergence / Trap Detection (moved from Execution) */
  /* sec-intel and sec-full-report keep their 200/201 slot (tail reading) */

  /* --- EXECUTION (derivatives + price, tightened) --- */
  .panel-stack #sec-pricechart         { order: 20; }  /* BTC Price + DCA Zones — first read */
  .panel-stack #sec-options            { order: 21; }  /* Options / Deribit — was 21 */
  .panel-stack #sec-funding            { order: 22; }  /* Funding Regime — was 20 */
  .panel-stack #sec-liquidations       { order: 23; }  /* Liquidation Levels — was 22 */

  /* --- CYCLE (phase + cohort behavior) --- */
  .panel-stack #sec-cycle              { order: 30; }  /* BTC Cycle Phase — headline */
  .panel-stack #sec-cg-cycles          { order: 31; }  /* CoinGlass Cycle Cross-Check */
  .panel-stack #sec-proximity-fwd      { order: 31.5; } /* Bottom Proximity forward-returns (V2 upgrade) */
  /* Forward-return panel v2 polish 2026-05-04 — Macro V2 Q6 closure
     redesign. Operator: "what is this, i don't even understand, and it
     looks ugly and bulky." Replaced 260px fan chart + duplicate text
     card + table with: plain-English headline + 5 per-horizon mini-cards
     + compact comparison table. The whole panel now tells you in one
     sentence what edge (if any) the current proximity score implies. */
  .prox-fwd-body { font-family: var(--font-body); font-size: var(--fs-body); }
  .prox-fwd-loading { color: var(--text-dim); padding: var(--sp-md); text-align: center; }
  .prox-fwd-empty { color: var(--text-dim); padding: var(--sp-md); text-align: center; font-style: italic; }

  /* Headline strip — plain-English statement of the historical edge */
  .pfwd-headline {
    background: rgba(80, 252, 209, 0.06);
    border-left: 2px solid var(--cyan);
    border-radius: 0 var(--r-sm) var(--r-sm) 0;
    padding: 10px var(--sp-md);
    margin-bottom: var(--sp-md);
    font: 400 var(--fs-body)/1.5 var(--font-body);
    color: var(--text);
  }
  .pfwd-headline strong { color: var(--cyan); font-weight: 700; font-variant-numeric: tabular-nums; }
  .pfwd-headline .pfwd-headline-bear strong { color: var(--red); }
  .pfwd-headline-sub {
    display: block;
    margin-top: 4px;
    font-size: var(--fs-mono-sm);
    color: var(--text-dim);
    font-family: var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }

  /* Per-horizon mini-card grid — only short horizons stay visible so this
     panel reads as a decision summary, not a card wall. */
  .pfwd-horizon-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--sp-sm);
    margin-bottom: var(--sp-md);
  }
  .pfwd-horizon-card {
    background: rgba(20, 24, 33, 0.5);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    padding: var(--sp-sm) 10px var(--sp-sm);
    display: flex;
    flex-direction: column;
    gap: 4px;
    text-align: center;
  }
  .pfwd-horizon-card.is-empty { opacity: 0.45; }
  .pfwd-horizon-label {
    font: 700 var(--fs-mono-sm) var(--mono);
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.08em;
  }
  .pfwd-horizon-median {
    font: 700 var(--fs-ui-lg)/1 var(--mono);
    font-variant-numeric: tabular-nums;
    margin: 2px 0;
  }
  .pfwd-horizon-median.pos { color: var(--green); }
  .pfwd-horizon-median.neg { color: var(--red); }
  .pfwd-horizon-median.zero { color: var(--text-dim); }
  /* Mini bar shows p25 → p75 range with median tick */
  .pfwd-horizon-bar {
    position: relative;
    height: 4px;
    border-radius: 2px;
    background: var(--bg-panel-2);
    margin: 4px 4px 0;
  }
  .pfwd-horizon-bar-band {
    position: absolute;
    top: 0;
    bottom: 0;
    background: rgba(80, 252, 209, 0.30);
    border-radius: 2px;
  }
  .pfwd-horizon-bar-band.neg { background: rgba(255, 94, 127, 0.30); }
  .pfwd-horizon-bar-zero {
    position: absolute;
    top: -2px;
    bottom: -2px;
    width: 1px;
    background: var(--text-dim);
    opacity: 0.6;
  }
  .pfwd-horizon-bar-tick {
    position: absolute;
    top: -3px;
    bottom: -3px;
    width: 2px;
    background: var(--text);
    border-radius: 1px;
  }
  .pfwd-horizon-range {
    font: 500 var(--fs-mono-xs) var(--mono);
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    margin-top: 4px;
    letter-spacing: 0.02em;
  }
  .pfwd-horizon-n {
    font: 500 8px var(--mono);
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    opacity: 0.7;
  }

  /* Compact comparison table — bins × short horizons with current row
     highlighted. Drops the dense full-horizon grid; only shows 7d/30d/90d
     since those are the most decision-relevant. */
  .prox-fwd-compare {
    margin-top: var(--sp-sm);
  }
  .prox-fwd-compare summary {
    cursor: pointer;
    color: var(--text-dim);
    font: 600 var(--fs-mono-sm) var(--mono);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    padding: var(--sp-sm) 0;
  }
  .prox-fwd-compare summary:hover {
    color: var(--cyan);
  }
  .prox-fwd-table {
    width: 100%; border-collapse: collapse;
    font-family: var(--mono); font-size: var(--fs-mono);
    margin-top: var(--sp-xs);
  }
  .prox-fwd-table th, .prox-fwd-table td {
    padding: 5px var(--sp-sm); text-align: right;
    border-bottom: 1px solid var(--border);
  }
  .prox-fwd-table th:first-child, .prox-fwd-table td:first-child { text-align: left; }
  .prox-fwd-table th {
    color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.06em;
    font-size: var(--fs-mono-xs); font-weight: 600;
  }
  .prox-fwd-table tr.is-current td {
    background: rgba(80, 252, 209, 0.06);
    color: var(--cyan);
    font-weight: 700;
  }
  .prox-fwd-table tr.is-current td:first-child::before {
    content: "▶ ";
    color: var(--cyan);
    font-size: 10px;
  }
  .prox-fwd-table .pos { color: var(--green); }
  .prox-fwd-table .neg { color: var(--red); }
  .prox-fwd-table-caption {
    font: 600 var(--fs-mono-sm) var(--mono);
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: var(--sp-sm);
  }
  @media (max-width: 720px) {
    .pfwd-horizon-grid { grid-template-columns: 1fr; }
  }
  /* Methodology link chip next to panel title */
  .panel-methodology-link { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; margin-left: 6px; border-radius: 3px; background: rgba(80,252,209,0.08); color: var(--cyan); font-size: 11px; text-decoration: none; cursor: pointer; vertical-align: middle; }
  .panel-methodology-link:hover { background: rgba(80,252,209,0.18); }
  /* Staleness watchdog — stalled state overrides */
  .fresh-dot.stalled { background: var(--red); animation: freshPulse 1.2s infinite; }
  .fresh-label.stalled { color: var(--red); }
  .panel-fresh-badge.stalled { background: rgba(255,94,127,0.12); color: var(--red); border-color: var(--red); }
  .fresh-item.stalled { background: rgba(255,94,127,0.06); }
  .panel-stack #sec-bmvz               { order: 32; }  /* Bear Market Value Zone */
  .panel-stack #sec-cohort-confluence  { order: 33; }  /* Cohort Confluence (LTH + ETF + SM) */
  .panel-stack #sec-lth                { order: 34; }  /* LTH Behavior */
  .panel-stack #sec-cointime           { order: 35; }  /* Cointime (AVIV/Liveliness) */
  /* Deprecated cycle/L3 panels still hidden via deprecated[] list */
  .panel-stack #sec-tier1              { order: 37; }  /* Zero-FP Tier 1 (deprecated) */
  .panel-stack #sec-tier2              { order: 38; }  /* Tier 2 Confirming (deprecated) */
  .panel-stack #sec-whale-digest       { order: 39; }  /* Whale Digest (deprecated) */
  .panel-stack #sec-halving            { order: 31; }  /* Post-Halving Regime — time-driven 4-year cycle overlay; sits next to sec-cycle (data-driven). */
  .panel-stack #sec-confhistory        { order: 41; }  /* Bottom Proximity History (deprecated) */
  /* sec-cross merged into sec-multi-asset-hero */

  /* --- CAPITAL (flows + sentiment sub-group) --- */
  /* Flows (50-54) */
  .panel-stack #sec-macro              { order: 50; }  /* Macro Regime (M2/DXY/Corr) — L1 headline */
  .panel-stack #sec-institutional      { order: 51; }  /* IBIT + Coinbase Premium */
  .panel-stack #sec-capital-pipeline   { order: 52; }  /* Capital Pipeline */
  .panel-stack #sec-etf-onchain        { order: 53; }  /* ETF Issuer On-Chain Flow */
  .panel-stack #sec-money-flow         { order: 54; }  /* Money Flow 5-Zone */
  /* Sentiment sub-group (60-63) */
  .panel-stack #sec-sentiment          { order: 60; }  /* Sentiment + X Intelligence */
  .panel-stack #sec-fg                 { order: 61; }  /* Fear & Greed Index */
  .panel-stack #sec-polymarket         { order: 62; }  /* Polymarket macro (Fed/BTC implied) + sentiment skew (merged 2026-05-04) */
  .panel-stack #sec-trending           { order: 63; }  /* Narrative Pulse (moved from Execution) */
  /* Deprecated capital panels */
  .panel-stack #sec-exchange-plumbing   { order: 64; }  /* Exchange Flow Plumbing (deprecated) */
  .panel-stack #sec-institutional-pulse { order: 65; }  /* Institutional Pulse (deprecated) */

  /* --- PLAN & TRACK (ladder + scenarios + cross-asset + validation) --- */
  /* Entry planning (70-72) */
  .panel-stack #sec-dca                { order: 70; }  /* DCA Entry Zones */
  .panel-stack #sec-scenario-tree      { order: 71; }  /* Macro Scenario Tree (Sprint 5) */
  .panel-stack #sec-scenarios          { order: 72; }  /* Scenario Analysis (legacy) */
  /* Cross-asset context (75-77) */
  .panel-stack #sec-multi-asset-hero   { order: 75; }  /* Multi-Asset plan (ETH/SOL/HYPE) */
  .panel-stack #sec-correlation-radar  { order: 76; }  /* Correlation Radar (moved from Execution) */
  .panel-stack #sec-macro-forecast     { order: 77; }  /* Forecast Distributions (was orphaned) */
  /* Validation (80-82) */
  .panel-stack #sec-backtest           { order: 80; }  /* Historical Backtest (moved from Cycle) */
  .panel-stack #sec-track-record       { order: 81; }  /* Live Track Record */
  /* Deprecated plan panels */
  .panel-stack #sec-dist-confluence    { order: 85; }  /* Distribution Confluence (deprecated) */
  .panel-stack #sec-distribution       { order: 86; }  /* Distribution Playbook (deprecated) */

  /* --- Group H: Intelligence tail (Verdict) --- */
  .panel-stack #sec-intel              { order: 200; } /* Daily Intelligence */
  .panel-stack #sec-full-report        { order: 201; } /* Full Daily Report */
  /* sec-sentiment moved to Capital sentiment sub-group (order 60).
     sec-trending moved to Capital sentiment sub-group (order 63). */

  /* --- Group R: Reference / Diagnostic --- */
  .panel-stack #sec-correlation        { order: 501; } /* Layer Correlation Matrix (deprecated) */
  /* sec-backtest moved to Group G (Action & Planning) at order 116. */

  /* =========================================================================
     Typography polish (2026-04-15): the "readable tier" (tables, sub-metrics,
     nav, tooltip bodies, lists) was clustered at 9-11px which reads fine on a
     100%-zoom desktop but falls apart on retina / larger monitors / tired
     eyes. Multiple users gave the same "fonts too small" feedback.

     Strategy: bump the readable tier by +1-2px, keep "metadata labels"
     (uppercase tags, axis labels, source attribution) tight-but-not-tinier,
     and boost line-height across the board. Huge KPIs stay unchanged —
     they were already prominent.

     This block is loaded LAST so it wins on source-order specificity without
     needing !important.
     ========================================================================= */

  /* --- Tables: bump from 10-11px to 12px. Data is the #1 read element. --- */
  #funding-body table.funding th,
  #funding-body table.funding td,
  .etf-table th,
  .etf-table td,
  .backtest-table th,
  .backtest-table td {
    font-size: var(--fs-body-sm);
    line-height: 1.5;
  }
  #funding-body table.funding th,
  .etf-table th,
  .backtest-table th {
    font-size: var(--fs-mono-sm);  /* header stays smaller than data */
    letter-spacing: 0.08em;
  }

  /* --- Pulse sub-metrics: 10px → 11px, looser line-height --- */
  #sec-pulse .pulse-submetric {
    font-size: var(--fs-mono);
    line-height: 1.6;
  }
  #sec-pulse .pulse-label {
    font-size: var(--fs-mono-sm);
    letter-spacing: 0.1em;
  }
  #sec-pulse .pulse-level {
    font-size: var(--fs-ui-lg);  /* was 16 — tiny boost for the headline state */
  }

  /* --- Freshness banner: sticky element, users read it constantly --- */
  .freshness-banner { font-size: var(--fs-body-sm); }
  .fresh-detail { font-size: var(--fs-mono); }
  .freshness-details { font-size: var(--fs-mono); }
  .fresh-group-head { font-size: var(--fs-mono-sm); }

  /* --- Per-panel freshness badge: 9px was unreadable --- */
  .panel-fresh-badge {
    font-size: var(--fs-mono-sm);
    padding: var(--sp-2xs) var(--sp-sm);
    letter-spacing: 0.06em;
  }

  /* --- Nav bar: high-frequency click targets, bump from ~11px to 13px --- */
  .cw-nav-inner a,
  .cw-nav-more-btn,
  .cw-nav-more-group a {
    font-size: var(--fs-body);
    letter-spacing: 0.01em;
  }

  /* --- Panel info tooltips: educational content should breathe --- */
  details.panel-info > div p,
  details.panel-info > div ul,
  details.panel-info > div li {
    font-size: var(--fs-body);
    line-height: 1.65;
  }
  details.panel-info > summary {
    font-size: var(--fs-mono);
    letter-spacing: 0.04em;
  }

  /* --- BMVZ labels + KPIs --- */
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label { font-size: var(--fs-mono); }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi { font-size: var(--fs-body-sm); }
  :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi strong { font-size: var(--fs-ui); }
  :is(#sec-bmvz, #cyc-bmvz) .cool-row .cool-head { font-size: var(--fs-body-sm); }

  /* --- Macro card source line + zone metadata --- */
  .macro-card .macro-source { font-size: var(--fs-mono); }
  .macro-card .macro-zone { font-size: var(--fs-body-sm); line-height: 1.5; }
  .macro-card .macro-name { font-size: var(--fs-mono); letter-spacing: 0.08em; }

  /* --- Options panel cards --- */
  .opt-card .opt-name { font-size: var(--fs-mono); }
  .opt-card .opt-zone { font-size: var(--fs-body-sm); line-height: 1.5; }
  .opt-card .opt-source { font-size: var(--fs-mono); }

  /* --- Sentiment + intel feeds --- */
  #sentiment-body,
  #intel-feed li,
  #cat-feed li,
  #trending-body { font-size: var(--fs-body-sm); line-height: 1.55; }

  /* --- Correlation matrix cells: 10px was cramped in a 7x7 grid --- */
  .corr-matrix .corr-cell { font-size: var(--fs-mono); }
  .corr-matrix .corr-header { font-size: var(--fs-mono-sm); }

  /* --- Panel titles: snap to --fs-body-lg (14px) for base; desktop bumps
     to --fs-ui-lg (18px). F4 (audit 2026-05-02): 15px is off the
     9/10/11/12/13/14/16/18 scale. --- */
  .panel-head > .panel-title {
    font-size: var(--fs-body-lg);
    letter-spacing: 0.01em;
  }
  .panel-head .muted { font-size: var(--fs-mono); }

  /* --- DCA / Scenarios / history panels --- */
  .dca-zone-row,
  .scenario-row { font-size: var(--fs-body-sm); line-height: 1.5; }

  /* --- Feed list items --- */
  .feed-list li,
  .feed-item { font-size: var(--fs-body-sm); line-height: 1.55; }

  /* --- Mobile: let the bumped-up sizes reflow naturally, but keep tables
         from overflowing. The existing @media (max-width: 640px) rules above
         will still apply and shrink things back down where needed. --- */


  /* =========================================================================
     DESKTOP readability bump (min-width: 900px) — user feedback: still too
     small on a big monitor + tired eyes. Stacks on top of the 2026-04-15
     sweet-spot block, leaves mobile rules untouched because media queries
     below 640px override with their own smaller sizes.
     ========================================================================= */
  @media (min-width: 900px) {

    /* --- Tables: 12 → 14 --- */
    #funding-body table.funding th,
    #funding-body table.funding td,
    .etf-table th,
    .etf-table td,
    .backtest-table th,
    .backtest-table td {
      font-size: var(--fs-body-lg);
      line-height: 1.55;
    }
    #funding-body table.funding th,
    .etf-table th,
    .backtest-table th {
      font-size: var(--fs-mono);
    }

    /* --- Panel titles: snap to --fs-ui-lg (18px) per DESIGN.md scale.
       F4 (audit 2026-05-02): 17px is off-scale; 18px is the canonical
       Switzer ui-lg slot used elsewhere (panel-head retains Space Mono
       uppercase via global .panel-head rule, so the visual remains the
       canonical panel-head treatment at the correct scale tier). --- */
    .panel-head > .panel-title {
      font-size: var(--fs-ui-lg);
    }
    .panel-head .muted { font-size: var(--fs-body-sm); }

    /* --- Nav bar: 13 → 14 --- */
    .cw-nav-inner a,
    .cw-nav-more-btn,
    .cw-nav-more-group a {
      font-size: var(--fs-body-lg);
    }

    /* --- Info tooltips: snap to --fs-body-lg (14px), bigger line-height for
       reading comfort. F4 (audit 2026-05-02): 15px is off-scale. --- */
    details.panel-info > div p,
    details.panel-info > div ul,
    details.panel-info > div li {
      font-size: var(--fs-body-lg);
      line-height: 1.7;
    }
    details.panel-info > summary { font-size: var(--fs-body-sm); }

    /* --- Freshness banner: 12 → 13 --- */
    .freshness-banner { font-size: var(--fs-body); }
    .fresh-detail { font-size: var(--fs-body-sm); }
    .freshness-details { font-size: var(--fs-body-sm); }

    /* --- Pulse sub-metrics: 11 → 12 --- */
    #sec-pulse .pulse-submetric { font-size: var(--fs-body-sm); }
    #sec-pulse .pulse-label { font-size: var(--fs-mono); }
    #sec-pulse .pulse-level { font-size: var(--fs-display-sm); }

    /* --- Sentiment + intel + feed lists --- */
    #sentiment-body,
    #intel-feed li,
    #cat-feed li,
    #trending-body,
    .feed-list li,
    .feed-item { font-size: var(--fs-body); line-height: 1.6; }

    /* --- Macro + options card bodies --- */
    .macro-card .macro-zone,
    .opt-card .opt-zone { font-size: var(--fs-body); }
    .macro-card .macro-source,
    .macro-card .macro-name,
    .opt-card .opt-source,
    .opt-card .opt-name { font-size: var(--fs-body-sm); }

    /* --- DCA / scenarios --- */
    .dca-zone-row,
    .scenario-row { font-size: var(--fs-body); }

    /* --- BMVZ KPIs --- */
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-bar-label { font-size: var(--fs-body-sm); }
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi { font-size: var(--fs-body); }
    :is(#sec-bmvz, #cyc-bmvz) .bmvz-kpi strong { font-size: var(--fs-ui-lg); }
    :is(#sec-bmvz, #cyc-bmvz) .cool-row .cool-head { font-size: var(--fs-body); }

    /* --- LTH tracker --- */
    :is(#sec-lth, #cyc-lth) .lth-metric span { font-size: var(--fs-mono); }
    :is(#sec-lth, #cyc-lth) .lth-metric strong { font-size: var(--fs-ui); }
    :is(#sec-lth, #cyc-lth) .lth-historical-label { font-size: var(--fs-body-sm); }
    :is(#sec-lth, #cyc-lth) .lth-historical-table { font-size: var(--fs-body); }
    :is(#sec-lth, #cyc-lth) .lth-historical-table th { font-size: var(--fs-mono); }
    :is(#sec-lth, #cyc-lth) .lth-delta span { font-size: var(--fs-mono); }
    :is(#sec-lth, #cyc-lth) .lth-delta strong { font-size: var(--fs-ui); }

    /* --- Cohort Confluence (compass redesign 2026-05-05) --- */
    #sec-cohort-confluence .conf-verdict { font-size: var(--fs-body-lg); }

    /* --- Trap divergence panel --- */
    #sec-divergence .div-headline { font-size: var(--fs-body-lg); }
    #sec-divergence .div-evidence-row { font-size: var(--fs-body); }
    #sec-divergence .div-evidence-label { font-size: var(--fs-body-sm); }

    /* --- Money Flow panel --- */
    #sec-money-flow .mf-zone-name { font-size: var(--fs-body-lg); }
    #sec-money-flow .mf-zone-num { font-size: var(--fs-body-sm); }
    #sec-money-flow .mf-zone-headline { font-size: var(--fs-body-sm); }
    #sec-money-flow .mf-hero-verdict { font-size: var(--fs-display); }
    #sec-money-flow .mf-hero-sub { font-size: var(--fs-body); }
    #sec-money-flow .mf-section-label { font-size: var(--fs-body-sm); }
    #sec-money-flow .mf-stepper-label { font-size: var(--fs-body-sm); }
    #sec-money-flow .mf-stepper-pct { font-size: var(--fs-mono); }
    #sec-money-flow .mf-stepper-cond { font-size: var(--fs-body-sm); }
    #sec-money-flow .mf-alloc-label,
    #sec-money-flow .mf-alloc-amount { font-size: var(--fs-body); }
    #sec-money-flow .mf-watch { font-size: var(--fs-body); }

    /* --- Correlation Radar panel --- */
    #sec-correlation-radar .cr-hero-verdict { font-size: 21px; }
    #sec-correlation-radar .cr-hero-label { font-size: var(--fs-mono); }
    #sec-correlation-radar .cr-hero-note { font-size: var(--fs-body-sm); }
    #sec-correlation-radar .cr-regime-label { font-size: var(--fs-mono); }
    #sec-correlation-radar .cr-regime-key { font-size: var(--fs-body-lg); }
    #sec-correlation-radar .cr-regime-note { font-size: var(--fs-body-sm); }
    #sec-correlation-radar .cr-regime-meta { font-size: var(--fs-body-sm); }
    #sec-correlation-radar .cr-tier-label { font-size: var(--fs-body-sm); }
    #sec-correlation-radar .cr-row { font-size: var(--fs-body); }
    #sec-correlation-radar .cr-asset { font-size: var(--fs-body-lg); }
    #sec-correlation-radar .cr-note { font-size: var(--fs-body-sm); }
    #sec-correlation-radar .cr-col-header { font-size: var(--fs-mono-sm); }

    /* --- Correlation matrix (existing): 11 → 13 cells, 10 → 11 headers --- */
    .corr-matrix .corr-cell { font-size: var(--fs-body); padding: 10px var(--sp-sm); }
    .corr-matrix .corr-header { font-size: var(--fs-mono); padding: var(--sp-xs) 3px; }

    /* --- Panel info summary bumped --- */
    details.panel-info > summary { font-size: var(--fs-body); }
  }

  /* --- Mobile breakpoints for backtest table, correlation matrix, and
         other dense grids introduced in the Opus #5/#6/#7 session --- */
  @media (max-width: 760px) {
    .backtest-table th,
    .backtest-table td { padding: var(--sp-xs) var(--sp-xs); font-size: var(--fs-mono-sm); }
    /* Hide lower-signal columns at tight widths */
    .backtest-table th:nth-child(6),
    .backtest-table td:nth-child(6), /* MVRV */
    .backtest-table th:nth-child(7),
    .backtest-table td:nth-child(7), /* NUPL */
    .backtest-table th:nth-child(8),
    .backtest-table td:nth-child(8)  /* AVIV */
    { display: none; }
  }
  @media (max-width: 480px) {
    /* Ultra-narrow: drop Phase + T1 columns too; keep Date/Event/Price/180d/Accuracy */
    .backtest-table th:nth-child(4),
    .backtest-table td:nth-child(4), /* Phase */
    .backtest-table th:nth-child(5),
    .backtest-table td:nth-child(5)  /* Tier 1 */
    { display: none; }
  }

  @media (max-width: 860px) {
    .corr-matrix .corr-header { font-size: 8px; padding: var(--sp-2xs); }
    .corr-matrix .corr-cell   { padding: 6px 3px; font-size: var(--fs-mono-xs); }
  }
  @media (max-width: 640px) {
    .corr-matrix { font-size: 8px; }
    .corr-matrix .corr-cell { padding: var(--sp-xs) var(--sp-2xs); font-size: 8px; }
    .corr-matrix .corr-header { font-size: 7px; }
    /* Relabel-friendly: row labels stay visible; the top header row can shrink */
    .corr-summary { min-width: 0; font-size: var(--fs-mono-xs); }
    .corr-summary h4 { font-size: var(--fs-mono-xs); }
  }

  @media (max-width: 640px) {
    /* Freshness banner — make more compact on mobile */
    .freshness-banner { padding: 6px var(--sp-md); font-size: var(--fs-mono-sm); top: 44px; }
    .fresh-detail { font-size: var(--fs-mono-xs); }
    .fresh-toggle { padding: var(--sp-2xs) 6px; font-size: var(--fs-mono-xs); }
    /* ETF breakdown table — tighten */
    .etf-table th, .etf-table td { padding: 3px var(--sp-xs); font-size: var(--fs-mono-sm); }
    .etf-table th { font-size: var(--fs-mono-xs); }
    /* Funding regime cell — severity dots may wrap; tighten */
    #funding-body table.funding td,
    #funding-body table.funding th { padding: var(--sp-xs) var(--sp-xs); font-size: var(--fs-mono-xs); }
    /* Panel freshness badges — shrink */
    .panel-fresh-badge { font-size: 8px; padding: 1px var(--sp-xs); }
    /* Macro grid already collapses at 768px, confirm card text */
    .macro-card { padding: 10px var(--sp-md); }
    .macro-value { font-size: var(--fs-display-sm); }
    .macro-source { font-size: var(--fs-mono-xs); }
  }

  #sec-composite {
    background: linear-gradient(180deg, var(--bg-panel) 0%, rgba(20, 24, 33, 0.4) 100%);
  }
  /* gauge-wrap layout 2026-05-04 — gauge left, regime+altseason right,
     50/50 columns so both feel equal weight. Vertical divider between
     them; both inherit the panel's dot-grid + gradient mesh background.
     Mobile (<900px) stacks vertically. */
  .gauge-wrap {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-areas: "gauge regime";
    gap: var(--sp-xl);
    align-items: center;
  }
  .gauge-wrap > .gauge-col:nth-of-type(1) { grid-area: gauge; }
  .gauge-wrap > .gauge-col:nth-of-type(2) {
    grid-area: regime;
    border-left: 1px solid var(--border) !important;
    padding-left: var(--sp-xl) !important;
    border-top: 0 !important;
    padding-top: 0 !important;
    margin-top: 0 !important;
    align-self: center;
    background: transparent !important;
  }
  @media (max-width: 900px) {
    .gauge-wrap {
      grid-template-columns: 1fr;
      grid-template-areas: "gauge" "regime";
      gap: var(--sp-lg);
    }
    .gauge-wrap > .gauge-col:nth-of-type(2) {
      border-left: 0 !important;
      border-top: 1px dashed var(--border) !important;
      padding-left: 0 !important;
      padding-top: var(--sp-lg) !important;
      margin-top: var(--sp-sm);
    }
  }
  .gauge-col {
    display: flex; flex-direction: column; align-items: center;
    padding: var(--sp-sm) 0;
  }
  .gauge-svg {
    width: 100%; max-width: 400px; display: block;
    overflow: visible;
    filter: drop-shadow(0 0 20px rgba(80,125,252,0.08));
  }
  /* Track: subtle background ring */
  .gauge-svg .gauge-track {
    fill: none; stroke: rgba(255,255,255,0.06);
    stroke-width: 18; stroke-linecap: round;
  }
  /* Color zones underneath — sell red → wait grey → buy mint */
  .gauge-svg .gauge-zone {
    fill: none; stroke-width: 18; stroke-linecap: butt; opacity: 0.55;
  }
  /* Fill arc from center to needle position, colored by verdict */
  .gauge-svg .gauge-fill {
    fill: none; stroke-width: 18; stroke-linecap: round;
    transition: stroke-dasharray var(--dur-data-reveal) var(--ease-data-reveal),
                stroke-dashoffset var(--dur-data-reveal) var(--ease-data-reveal),
                stroke var(--dur-base), filter var(--dur-base);
  }
  .gauge-svg .gauge-fill.active { filter: drop-shadow(0 0 6px currentColor); }
  /* Needle: thick line from pivot to tip, with rounded tip */
  .gauge-svg .gauge-needle {
    transition: transform var(--dur-data-reveal) var(--ease-data-reveal);
  }
  .gauge-svg .gauge-needle line {
    stroke: var(--text);
    stroke-width: 3.5;
    stroke-linecap: round;
  }
  .gauge-svg .gauge-needle circle.tip {
    fill: var(--text);
  }
  .gauge-svg .gauge-pivot-outer { fill: var(--text); stroke: none; }
  .gauge-svg .gauge-pivot-inner { fill: var(--bg-panel-2); stroke: none; }
  /* Numeric tick labels along the arc */
  .gauge-svg text.gauge-num {
    fill: var(--text-dim); font-family: var(--mono);
    font-size: var(--fs-mono-sm); font-weight: 600;
  }
  /* Below-arc summary block, fully separated from SVG */
  .gauge-summary {
    text-align: center; margin-top: 14px; width: 100%;
  }
  /* F4 (audit 2026-05-02): 36 is off-scale; snap to --fs-display (28). */
  .gauge-verdict {
    font-family: var(--font-display);
    font-size: var(--fs-display); font-weight: 800;
    letter-spacing: 0.06em; text-transform: uppercase;
    line-height: 1;
  }
  .gauge-verdict.buy        { color: var(--green); }
  .gauge-verdict.strong-buy { color: var(--cyan); text-shadow: 0 0 20px rgba(80,252,209,0.6), 0 0 40px rgba(80,252,209,0.2); }
  .gauge-verdict.mild-buy   { color: var(--green); opacity: 0.88; }
  .gauge-verdict.wait       { color: var(--text); }
  .gauge-verdict.mild-sell  { color: var(--orange); }
  .gauge-verdict.sell       { color: var(--red); }
  .gauge-verdict.strong-sell{ color: var(--red); text-shadow: 0 0 20px rgba(255,94,127,0.6), 0 0 40px rgba(255,94,127,0.2); }
  /* 2026-05-02 — honest percentile readout under the score row.
     Mono caps to match the existing meta vocabulary; the value text
     reads as a calibration footnote, not as a verdict. */
  .gauge-percentile {
    margin-top: var(--sp-xs);
    text-align: center;
    font: 700 var(--fs-mono-sm) var(--mono);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  /* v1.9 — synthesis line. Bumped from fs-mono-sm (10px caps) to
     fs-body-sm (12px) sentence-case so it reads as a verdict, not
     as metadata. The line carries the most useful single sentence on
     the composite panel ("here's how the two time horizons resolve") —
     it deserves verdict weight. Long-term phrase on left, short-term
     on right; both get tone color from their respective signals. */
  .composite-synthesis {
    margin-top: var(--sp-md);
    font: 500 var(--fs-body-sm)/1.5 var(--font-body);
    letter-spacing: 0.01em;
    color: var(--text);
    text-align: center;
    max-width: 480px;
  }
  .composite-synthesis .cs-label { color: var(--text-dim); font-weight: 400; }
  .composite-synthesis .cs-value { color: var(--text); font-weight: 700; }
  .composite-synthesis .cs-value.bull { color: var(--green); }
  .composite-synthesis .cs-value.bear { color: var(--red); }
  .composite-synthesis .cs-value.warn { color: var(--gold); }
  .composite-synthesis .cs-value.cool { color: var(--blue); }
  .composite-synthesis .cs-sep { opacity: 0.4; padding: 0 var(--sp-xs); }
  .composite-evidence-trail {
    margin-top: var(--sp-lg);
    padding-top: var(--sp-md);
    border-top: 1px solid var(--border);
  }
  .cet-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--sp-md);
  }
  .cet-kicker {
    font: 700 var(--fs-mono-xs) var(--mono);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--cyan);
  }
  .cet-summary {
    margin-top: var(--sp-2xs);
    font: 500 var(--fs-body-sm)/1.45 var(--font-body);
    color: var(--text-dim);
  }
  .cet-toggle {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-sm);
    flex: 0 0 auto;
    min-height: 28px;
    padding: var(--sp-xs) var(--sp-sm);
    font: 700 var(--fs-mono-xs) var(--mono);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--cyan);
    background: rgba(80, 252, 209, 0.06);
    border: 1px solid rgba(80, 252, 209, 0.45);
    border-radius: var(--r-sm);
    cursor: pointer;
  }
  .cet-toggle:hover,
  .cet-toggle:focus-visible {
    background: rgba(80, 252, 209, 0.12);
    outline: none;
  }
  .cet-toggle:disabled {
    cursor: not-allowed;
    opacity: 0.45;
  }
  .cet-toggle-count {
    color: var(--text);
  }
  .cet-layer-strip {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: var(--sp-sm);
    margin-top: var(--sp-md);
  }
  .cet-layer-chip {
    min-width: 0;
    padding: var(--sp-sm);
    background: rgba(26, 31, 44, 0.58);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
  }
  .cet-layer-chip.positive { border-color: rgba(80, 252, 209, 0.42); }
  .cet-layer-chip.negative { border-color: rgba(255, 94, 127, 0.42); }
  .cet-layer-chip-name,
  .cet-layer-chip-meta {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font: 700 var(--fs-mono-xs) var(--mono);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  .cet-layer-chip-score {
    display: block;
    margin: var(--sp-xs) 0;
    font: 700 var(--fs-display-sm)/1 var(--font-display);
    color: var(--text);
  }
  .cet-layer-chip.positive .cet-layer-chip-score { color: var(--cyan); }
  .cet-layer-chip.negative .cet-layer-chip-score { color: var(--red); }

  /* Radar↔chip cross-highlight (design-review A+ pass).
     Hovering a radar axis label adds .is-radar-highlight on the matching
     L1/L2/L3/L4 chip; hovering a chip lights up all radar axes that map
     to that layer. Subtle aqua glow + brightness bump — non-distracting
     but clearly communicates the linkage. */
  .cet-layer-chip {
    transition: box-shadow 150ms var(--ease), border-color 150ms var(--ease), background 150ms var(--ease);
  }
  .cet-layer-chip.is-radar-highlight {
    border-color: rgba(80, 252, 209, 0.7);
    background: rgba(80, 252, 209, 0.06);
    box-shadow: 0 0 0 1px rgba(80, 252, 209, 0.4), 0 6px 18px rgba(80, 252, 209, 0.08);
  }
  .radar-axis-label {
    transition: fill 150ms var(--ease);
  }
  .radar-axis-label.is-radar-highlight {
    fill: var(--cyan, #50FCD1) !important;
  }
  @media (prefers-reduced-motion: reduce) {
    .cet-layer-chip, .radar-axis-label { transition: none; }
  }
  .cet-body {
    margin-top: var(--sp-sm);
    overflow: hidden;
    background: rgba(11, 14, 20, 0.38);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
  }
  .cet-layer {
    border-bottom: 1px solid var(--border);
  }
  .cet-layer:last-child {
    border-bottom: 0;
  }
  .cet-layer summary {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto auto;
    gap: var(--sp-md);
    align-items: center;
    min-height: 36px;
    padding: var(--sp-sm) var(--sp-md);
    cursor: pointer;
    list-style: none;
  }
  .cet-layer summary::-webkit-details-marker {
    display: none;
  }
  .cet-layer summary::marker {
    content: "";
  }
  .cet-layer-name,
  .cet-layer-count {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font: 700 var(--fs-mono-xs) var(--mono);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  .cet-layer-score {
    font: 700 var(--fs-mono) var(--mono);
    color: var(--text);
  }
  .cet-layer-score.positive,
  .cet-receipt-score.positive {
    color: var(--cyan);
  }
  .cet-layer-score.negative,
  .cet-receipt-score.negative {
    color: var(--red);
  }
  .cet-layer-score.neutral,
  .cet-receipt-score.neutral {
    color: var(--text-dim);
  }
  .cet-receipts {
    display: grid;
    border-top: 1px dashed var(--border);
  }
  .cet-receipt {
    display: grid;
    grid-template-columns: minmax(140px, 0.9fr) minmax(160px, 1.2fr) 56px;
    gap: var(--sp-md);
    align-items: center;
    padding: var(--sp-sm) var(--sp-md);
    border-top: 1px solid rgba(36, 41, 56, 0.62);
  }
  .cet-receipt:first-child {
    border-top: 0;
  }
  .cet-receipt-label,
  .cet-receipt-reading,
  .cet-receipt-score {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font: 500 var(--fs-mono-sm) var(--mono);
  }
  .cet-receipt-label {
    color: var(--text);
  }
  .cet-receipt-reading {
    color: var(--text-dim);
  }
  .cet-receipt-score {
    justify-self: end;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
  }
  @media (max-width: 900px) {
    .cet-layer-strip {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }
  }
  @media (max-width: 640px) {
    .cet-head {
      flex-direction: column;
    }
    .cet-toggle {
      width: 100%;
      justify-content: space-between;
    }
    .cet-layer-strip {
      grid-template-columns: 1fr;
    }
    .cet-layer summary,
    .cet-receipt {
      grid-template-columns: 1fr;
      gap: var(--sp-xs);
    }
    .cet-layer-score,
    .cet-layer-count,
    .cet-receipt-score {
      justify-self: start;
    }
  }
  /* CYCLE-screen mount sits inside the Market State hero, between
     rationale and trajectory. Borrow the same divider treatment as
     ms-trajectory so the layered hero reads as one stack. */
  .ms-hero .composite-synthesis-cycle {
    text-align: left;
    max-width: none;
    border-top: 1px dashed var(--border);
    padding-top: var(--sp-sm);
    margin-top: var(--sp-sm);
  }
  .gauge-score-row {
    margin-top: 10px;
    display: flex; justify-content: center; align-items: baseline; gap: var(--sp-lg);
    font-family: var(--mono);
  }
  .gauge-velocity {
    font-family: var(--mono); font-size: var(--fs-mono); font-weight: 600;
    font-variant-numeric: tabular-nums;
    margin-left: 6px; padding: var(--sp-2xs) 6px; border-radius: var(--r-sm);
    display: inline-block; vertical-align: middle;
  }
  .gauge-velocity.up   { color: #50FCD1; background: rgba(74,222,128,0.10); }
  .gauge-velocity.down { color: #FF5E7F; background: rgba(255,94,127,0.10); }
  .gauge-velocity.flat { color: #8a92a8; background: rgba(138,146,168,0.08); }
  /* Verdict-flip alert toggle — sits under the score row. Quiet when off,
     aqua dot + aqua text when on. Compact. */
  .verdict-alert-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 6px;
    padding: 3px var(--sp-sm);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
    background: transparent;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    cursor: pointer;
    transition: all var(--dur-instant) var(--ease-out);
  }
  .verdict-alert-toggle .vat-dot {
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--text-dim);
    transition: background var(--dur-instant) var(--ease-out);
  }
  .verdict-alert-toggle:hover { color: var(--text); border-color: var(--blue); }
  .verdict-alert-toggle.on {
    color: var(--cyan);
    border-color: var(--cyan);
    background: rgba(80, 252, 209, 0.08);
  }
  .verdict-alert-toggle.on .vat-dot { background: var(--cyan); animation: cw-live-pulse 2s ease-in-out infinite; }

  /* 30d signal history sparkline — sits below the score row inside the
     gauge summary. Small, quiet, informs the eye without stealing focus. */
  .gauge-history {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--sp-sm);
    margin-top: var(--sp-sm);
  }
  .gauge-history svg {
    width: 120px;
    height: 36px;
    display: block;
  }
  .gauge-history .gauge-history-label {
    font-family: var(--mono);
    font-size: var(--fs-mono);
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
    white-space: nowrap;
  }
  .gauge-score-num {
    font-size: 34px; font-weight: 700; color: var(--text);
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
  }
  .gauge-score-denom {
    font-size: var(--fs-mono); color: var(--text-dim);
  }
  .gauge-confidence {
    margin-top: var(--sp-sm);
    font-family: var(--mono); font-size: var(--fs-mono-sm); color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  .gauge-confidence b {
    color: var(--text); font-weight: 600;
    font-variant-numeric: tabular-nums;
  }
  .gauge-conf-bar {
    margin: 6px auto 0; height: 3px; width: 140px;
    background: var(--bg-panel-2); border-radius: var(--r-pill); overflow: hidden;
    border: 1px solid var(--border);
  }
  .gauge-conf-bar > div {
    height: 100%; background: var(--blue);
    transition: width 0.8s ease;
  }
  /* Indicator Breakdown CSS removed 2026-05-04 — table no longer rendered. */
  .gauge-coming {
    margin-bottom: 10px; padding: 6px 10px;
    background: rgba(80,125,252,0.06);
    border: 1px solid rgba(80,125,252,0.18);
    border-radius: var(--r-sm);
    font-size: var(--fs-mono-xs); color: var(--blue);
    font-family: var(--mono);
    text-transform: none; letter-spacing: 0;
    line-height: 1.4;
  }

  @media (max-width: 640px) {
    /* Whale Flow: collapse the 4-col grid into a 2-row card per row so
       the entity name gets real breathing room. Time + tag on line 1,
       amount + counterparty on line 2. */
    #sec-whale-digest .wh-row {
      grid-template-columns: 56px 1fr;
      grid-template-rows: auto auto;
      row-gap: var(--sp-2xs);
      padding: 10px 0 10px 10px;
    }
    #sec-whale-digest .wh-row > *:nth-child(3),
    #sec-whale-digest .wh-row > *:nth-child(4) {
      grid-column: 2;
      font-size: var(--fs-mono-sm);
      color: var(--text-dim);
    }

    /* Pulse Scorecard: tighter cards + 2-up layout on phones. */
    #sec-pulse .pulse-grid { grid-template-columns: repeat(2, 1fr); gap: var(--sp-sm); }
    #sec-pulse .pulse-card { padding: 10px 10px var(--sp-sm); }

    /* Panel padding reduced so content claims more of the viewport width. */
    .panel .panel-body { padding-left: var(--sp-md); padding-right: var(--sp-md); }
    .panel-head { padding: 10px var(--sp-md); }
  }

  /* Sticky section nav */
  .cw-nav {
    position: sticky; top: 0; z-index: 50;
    background: rgba(11, 14, 20, 0.92);
    backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
    border-bottom: 1px solid var(--border);
    padding: 14px 0; margin: 0 0 14px 0;
    display: flex;
    align-items: center;
  }
  /* Defensive: zero out any inherited / browser-default margins on pill-row
     descendants. Previous iterations had a phantom 8px margin-bottom via
     inline style that created visible asymmetry. */
  .cw-nav > *, .cw-nav-inner > * { margin: 0 !important; }
  .cw-nav-inner { margin: 0 !important; }
  .cw-nav::after {
    content: "";
    position: absolute; top: 0; right: 0; bottom: 0;
    width: 48px; pointer-events: none;
    background: linear-gradient(90deg, rgba(11,14,20,0) 0%, rgba(11,14,20,0.92) 70%, rgba(11,14,20,0.98) 100%);
    opacity: 1; transition: opacity 0.2s;
  }
  .cw-nav::before {
    content: "";
    position: absolute; top: 0; left: 0; bottom: 0;
    width: 40px; pointer-events: none; z-index: 1;
    background: linear-gradient(270deg, rgba(11,14,20,0) 0%, rgba(11,14,20,0.92) 70%, rgba(11,14,20,0.98) 100%);
    opacity: 0; transition: opacity 0.2s;
  }
  .cw-nav.scrolled-start::before { opacity: 1; }
  .cw-nav.scrolled-end::after { opacity: 0; }
  .cw-nav-inner {
    display: flex; gap: 6px; padding: 0;
    white-space: nowrap;
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .cw-nav-inner::-webkit-scrollbar { display: none; }
  /* Nothing-style segmented control. Squared-off, tighter tracking,
     Space Mono, inverse-filled active state. Preserves blue/cyan brand
     accent on the active/primary segments. 2026-04-25 iteration 3. */
  .cw-nav a {
    display: inline-block; padding: var(--sp-xs) var(--sp-md);
    font-family: "Space Mono", var(--mono); font-size: var(--fs-mono-sm);
    text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text-dim); text-decoration: none;
    border: 1px solid var(--border);
    border-radius: var(--r-xs); background: var(--bg-panel);
    transition: all 0.15s;
  }
  .cw-nav a:hover { color: var(--text); border-color: var(--blue); }
  /* Active = inverse fill (filled chip, dark text) — signature Nothing move. */
  .cw-nav a.active {
    color: #0b0e14; border-color: var(--blue);
    background: var(--blue);
    font-weight: 700;
  }
  .cw-nav a.primary {
    color: var(--cyan); border-color: var(--cyan);
    background: rgba(80,252,209,0.08);
    font-weight: 700;
  }
  .cw-nav a.primary.active {
    color: #0b0e14; border-color: var(--cyan);
    background: var(--cyan);
  }
  .cw-nav-sep {
    color: var(--text-dim); opacity: 0.4;
    align-self: center; padding: 0 var(--sp-2xs);
    font-size: var(--fs-body-sm); user-select: none;
  }
  @media (max-width: 768px) {
    .cw-nav { margin: 0 -10px 10px; padding: 6px 0; }
    .cw-nav a { font-size: var(--fs-mono-xs); padding: var(--sp-xs) 9px; }
  }
  /* Scroll-margin so anchored sections don't sit under the sticky nav */
  .panel[id^="sec-"], div[id^="sec-"] { scroll-margin-top: 60px; }


  /* Liquidation Levels panel */
  .liq-wrap {
    display: grid; grid-template-columns: 1fr;
    gap: var(--sp-md);
  }
  .liq-meta {
    display: flex; flex-wrap: wrap; gap: 14px;
    font-family: var(--mono); font-size: var(--fs-mono);
    padding: 10px var(--sp-md);
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm);
  }
  .liq-meta .item { display: flex; align-items: center; gap: 6px; }
  .liq-meta .item b { color: var(--text); font-weight: 700; font-variant-numeric: tabular-nums; }
  .liq-meta .item .lbl { color: var(--text-dim); }

  .liq-ladder {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    gap: 0 14px;
    align-items: stretch;
  }
  @media (max-width: 768px) {
    .liq-ladder { grid-template-columns: 1fr; gap: 10px 0; }
  }
  .liq-side h5 {
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text-dim); margin-bottom: 6px;
  }
  .liq-side.shorts h5 { color: var(--green); }
  .liq-side.longs  h5 { color: var(--red); }

  /* Current-price spot divider — vertical on desktop, horizontal on mobile */
  .liq-spot-divider {
    display: flex; align-items: center; justify-content: center;
    position: relative;
    padding: 0 var(--sp-xs);
  }
  .liq-spot-divider::before {
    content: "";
    position: absolute;
    left: 50%; top: 24px; bottom: 12px;
    width: 1px;
    background: linear-gradient(180deg, transparent, var(--cyan) 20%, var(--cyan) 80%, transparent);
    opacity: 0.65;
  }
  .liq-spot-label {
    background: var(--bg-panel);
    border: 1px solid var(--cyan);
    border-radius: var(--r-sm);
    padding: var(--sp-sm) 10px;
    font-family: var(--mono);
    text-align: center;
    position: relative; z-index: 1;
    box-shadow: 0 0 12px rgba(80,252,209,0.22);
  }
  .liq-spot-label .spot-lbl {
    display: block;
    font-size: 8px;
    text-transform: uppercase;
    letter-spacing: 0.12em;
    color: var(--cyan);
    margin-bottom: var(--sp-2xs);
  }
  .liq-spot-label .spot-val {
    display: block;
    font-size: var(--fs-body);
    font-weight: 700;
    color: var(--text);
    font-variant-numeric: tabular-nums;
  }
  @media (max-width: 768px) {
    .liq-spot-divider { padding: var(--sp-xs) 0; }
    .liq-spot-divider::before {
      left: 12px; right: 12px; top: 50%; bottom: auto;
      width: auto; height: 1px;
      background: linear-gradient(90deg, transparent, var(--cyan) 20%, var(--cyan) 80%, transparent);
    }
    .liq-spot-label { padding: var(--sp-xs) var(--sp-md); }
  }

  .liq-row {
    display: grid; grid-template-columns: 30px 82px 48px 1fr 60px;
    align-items: center; gap: var(--sp-sm); margin-bottom: var(--sp-xs);
    font-family: var(--mono); font-size: var(--fs-mono-sm);
  }
  .liq-row .dist {
    font-size: var(--fs-mono-xs);
    text-align: right;
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
  }
  .liq-row.closest {
    background: rgba(80,252,209,0.05);
    border-left: 2px solid var(--cyan);
    padding-left: var(--sp-xs);
    margin-left: -6px;
    border-radius: var(--r-xs);
  }
  /* The "magnet" cluster is the one with the highest score (cluster size /
     distance) — biggest + closest pull on price. Highlighted more strongly
     than .closest because magnitude matters more than proximity for the
     gravity read. (Macro-V2 Panel Upgrade — LIQ ladder magnets, 2026-04-26.) */
  .liq-row.magnet {
    background: rgba(255,209,102,0.10);
    border-left: 2px solid var(--yellow);
    padding-left: var(--sp-xs);
    margin-left: -6px;
    border-radius: var(--r-xs);
    box-shadow: 0 0 0 1px rgba(255,209,102,0.18);
  }
  .liq-row.magnet .lev::after {
    content: ' ⚡';
    color: var(--yellow);
  }
  .liq-row.magnet.closest {
    /* When the closest cluster is also the magnet, magnet styling wins. */
    background: rgba(255,209,102,0.14);
  }
  .liq-row .lev {
    font-weight: 700;
    text-align: right; color: var(--text-dim);
  }
  .liq-row .px {
    color: var(--text); font-variant-numeric: tabular-nums;
    font-weight: 600;
  }
  .liq-side.shorts .liq-row .px { color: var(--green); }
  .liq-side.longs  .liq-row .px { color: var(--red); }
  .liq-row .bar {
    height: 12px; background: var(--bg-panel); border: 1px solid var(--border);
    border-radius: var(--r-xs); overflow: hidden; position: relative;
  }
  .liq-row .bar > div {
    height: 100%;
    background: linear-gradient(90deg, rgba(255,148,87,0.4), rgba(255,148,87,0.7));
    border-radius: var(--r-xs);
  }
  .liq-side.shorts .liq-row .bar > div {
    background: linear-gradient(90deg, rgba(80,252,209,0.4), rgba(80,252,209,0.7));
  }
  .liq-side.longs .liq-row .bar > div {
    background: linear-gradient(90deg, rgba(255,94,127,0.4), rgba(255,94,127,0.7));
  }
  .liq-row .usd {
    font-size: var(--fs-mono-xs); color: var(--text-dim);
    text-align: right; font-variant-numeric: tabular-nums;
  }

  .liq-pin {
    margin-top: var(--sp-xs);
    padding: var(--sp-sm) var(--sp-md);
    background: rgba(116,152,253,0.08);
    border: 1px solid rgba(116,152,253,0.25);
    border-radius: var(--r-sm);
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    color: var(--text-dim); line-height: 1.55;
  }
  .liq-pin b { color: var(--purple); font-weight: 600; }

  /* Options · Execution Layer panel */
  .opt-grid {
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;
  }
  @media (max-width: 900px)  { .opt-grid { grid-template-columns: 1fr; } }
  .opt-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-md) var(--sp-md);
    font-family: var(--mono);
  }
  .opt-card.risk-on  { border-color: var(--green); background: rgba(74,222,128,0.05); }
  .opt-card.risk-off { border-color: var(--red); background: rgba(255,94,127,0.05); }
  .opt-card.warn     { border-color: var(--yellow); background: rgba(251,191,36,0.05); }
  .opt-name {
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); margin-bottom: var(--sp-xs);
  }
  .opt-value {
    font-size: var(--fs-display-sm); font-weight: 700; color: var(--text);
    line-height: 1.1; font-variant-numeric: tabular-nums;
  }
  .opt-value.green { color: var(--green); }
  .opt-value.red   { color: var(--red); }
  .opt-value.warn  { color: var(--yellow); }
  .opt-zone {
    margin-top: 6px;
    font-size: var(--fs-mono-sm); color: var(--text-dim);
  }
  .opt-zone b { color: var(--text); font-weight: 600; }
  .opt-curve {
    margin-top: 6px;
    display: grid; grid-template-columns: repeat(4, 1fr);
    gap: var(--sp-xs); font-size: var(--fs-mono-xs); color: var(--text-dim);
  }
  .opt-curve div { text-align: center; padding: var(--sp-2xs); background: var(--bg-panel); border-radius: var(--r-xs); }
  .opt-curve div b { color: var(--text); font-weight: 600; display: block; }
  .opt-source {
    margin-top: 6px;
    font-size: var(--fs-mono-xs); color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.05em;
  }

  /* Institutional panel — IBIT + Coinbase Premium */
  .inst-grid {
    display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px;
  }
  @media (max-width: 768px) { .inst-grid { grid-template-columns: 1fr; } }
  .inst-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-md) var(--sp-lg);
    font-family: var(--mono);
  }
  .inst-card.risk-on  { border-color: var(--green); background: rgba(74,222,128,0.05); }
  .inst-card.risk-off { border-color: var(--red); background: rgba(255,94,127,0.05); }
  .inst-card.warn     { border-color: var(--yellow); background: rgba(251,191,36,0.05); }
  .inst-card.neutral  { }
  .inst-name {
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); margin-bottom: 6px;
  }
  .inst-row {
    display: flex; justify-content: space-between; align-items: baseline;
    gap: var(--sp-md); margin-bottom: var(--sp-xs);
  }
  .inst-value {
    font-size: var(--fs-display-sm); font-weight: 700; color: var(--text);
    line-height: 1.1; font-variant-numeric: tabular-nums;
  }
  .inst-value.green { color: var(--green); }
  .inst-value.red   { color: var(--red); }
  .inst-value.warn  { color: var(--yellow); }
  .inst-sub {
    font-size: var(--fs-mono-sm); color: var(--text-dim);
  }
  .inst-zone {
    margin-top: var(--sp-sm);
    font-size: var(--fs-mono-sm); color: var(--text-dim);
  }
  .inst-zone b { color: var(--text); font-weight: 600; }
  .inst-source {
    margin-top: 6px;
    font-size: 8px; color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.05em;
  }

  /* Macro Regime panel */
  .macro-grid {
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;
  }
  @media (max-width: 768px) { .macro-grid { grid-template-columns: 1fr; } }
  .macro-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-md) var(--sp-md);
    font-family: var(--mono);
  }
  .macro-card.risk-on  { border-color: var(--green); background: rgba(74,222,128,0.05); }
  .macro-card.risk-off { border-color: var(--red); background: rgba(255,94,127,0.05); }
  .macro-card.neutral  { border-color: var(--border); }
  .macro-name {
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); margin-bottom: var(--sp-xs);
  }
  .macro-value {
    font-size: var(--fs-ui-lg); font-weight: 700; color: var(--text);
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
  }
  .macro-value.green { color: var(--green); }
  .macro-value.red   { color: var(--red); }
  .macro-value.warn  { color: var(--yellow); }
  /* F3 (audit 2026-05-02): macro-zone is running-body prose; promote color
     to --text per DESIGN.md "never use --text-dim for running body." */
  .macro-zone {
    margin-top: var(--sp-xs);
    font-size: var(--fs-mono-sm); color: var(--text);
  }
  .macro-zone b { color: var(--text); font-weight: 600; }
  .macro-source {
    margin-top: 6px;
    font-size: 8px; color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.05em;
  }

  /* Cointime Layer panel */
  .cointime-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;
  }
  @media (max-width: 1024px) { .cointime-grid { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 480px)  { .cointime-grid { grid-template-columns: 1fr; } }
  .ct-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-md) var(--sp-md);
    font-family: var(--mono);
  }
  .ct-card.signal-strong-buy { border-color: var(--cyan); background: rgba(80,252,209,0.06); }
  .ct-card.signal-buy        { border-color: var(--green); background: rgba(74,222,128,0.05); }
  .ct-card.signal-sell       { border-color: var(--orange); background: rgba(255,148,87,0.05); }
  .ct-card.signal-strong-sell{ border-color: var(--red); background: rgba(255,94,127,0.06); }
  .ct-name {
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); margin-bottom: var(--sp-xs);
  }
  .ct-value {
    font-size: var(--fs-ui-lg); font-weight: 700; color: var(--text);
    line-height: 1.1;
  }
  .ct-value.cyan  { color: var(--cyan); }
  .ct-value.green { color: var(--green); }
  .ct-value.warn  { color: var(--yellow); }
  .ct-value.orange { color: var(--orange); }
  .ct-value.red   { color: var(--red); }
  .ct-zone {
    margin-top: var(--sp-xs);
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.05em;
    color: var(--text-dim);
  }
  .ct-zone b { color: var(--text); font-weight: 600; }
  .ct-bands {
    margin-top: 6px; font-size: var(--fs-mono-xs);
    color: var(--text-dim); line-height: 1.45;
  }

  /* Confluence history chart */
  .conf-chart-wrap { position: relative; }
  .conf-chart svg { width: 100%; height: 220px; display: block; }
  .conf-chart .grid {
    stroke: var(--border); stroke-width: 1;
    stroke-dasharray: 2 4; opacity: 0.4;
  }
  .conf-chart .label {
    fill: var(--text-dim);
    font-size: var(--fs-mono);
    font-family: var(--mono);
  }
  .conf-chart .thresh-label {
    font-size: var(--fs-mono-sm);
  }
  .conf-chart .area { fill: url(#proximity-area-grad); }
  .conf-chart .line {
    fill: none; stroke: var(--blue); stroke-width: 2.5;
    stroke-linejoin: round; stroke-linecap: round;
    filter: drop-shadow(0 0 4px rgba(80,125,252,0.35));
  }
  .conf-chart .now-dot {
    fill: var(--text);
    stroke: var(--cyan); stroke-width: 2.5;
    filter: drop-shadow(0 0 6px rgba(80,252,209,0.55));
  }
  .conf-chart .now-pulse {
    fill: none;
    stroke: var(--cyan);
    stroke-width: 2;
    transform-origin: center;
    transform-box: fill-box;
    animation: cw-proximity-pulse 2.2s ease-out infinite;
  }
  @keyframes cw-proximity-pulse {
    0%   { r: 4;  opacity: 0.85; }
    70%  { r: 16; opacity: 0; }
    100% { r: 16; opacity: 0; }
  }
  .conf-chart .hi-mark,
  .conf-chart .lo-mark {
    fill: var(--bg);
    stroke-width: 2;
  }
  .conf-chart .hi-mark { stroke: var(--green); }
  .conf-chart .lo-mark { stroke: var(--red); }
  .conf-chart .hi-label,
  .conf-chart .lo-label {
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 600;
    pointer-events: none;
  }
  .conf-chart .hi-label { fill: var(--green); }
  .conf-chart .lo-label { fill: var(--red); }
  .conf-chart .thresh {
    stroke-width: 1.2;
    stroke-dasharray: 6 4;
  }
  .conf-chart .thresh-50 { stroke: var(--yellow); }
  .conf-chart .thresh-65 { stroke: var(--orange); }
  .conf-chart .thresh-80 { stroke: var(--green); }
  .conf-empty {
    text-align: center; padding: var(--sp-2xl) var(--sp-lg);
    font-family: var(--mono); font-size: var(--fs-mono); color: var(--text-dim);
  }

  /* Site footer */
  .cw-footer {
    margin-top: var(--sp-xl); padding: var(--sp-lg) var(--sp-lg);
    border-top: 1px solid var(--border);
    font-family: var(--mono); font-size: var(--fs-mono);
    color: var(--text-dim); line-height: 1.6;
    display: flex; justify-content: space-between; align-items: flex-start;
    flex-wrap: wrap; gap: var(--sp-lg);
  }
  .cw-footer .foot-sources b { color: var(--text); font-weight: 600; }
  .cw-footer .foot-sources span { margin-right: var(--sp-sm); }
  .cw-footer .foot-disclaimer {
    color: var(--text-dim); font-size: var(--fs-mono-sm); max-width: 540px;
  }
  .cw-footer .foot-copy {
    color: var(--text-dim); font-size: var(--fs-mono-sm);
  }
  @media (max-width: 768px) {
    .cw-footer { flex-direction: column; gap: 10px; padding: 14px; }
  }

  /* tier 2 confirming signals */
  .t2-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;
  }
  @media (min-width: 1600px) {
    .t2-grid { grid-template-columns: repeat(5, 1fr); }
  }
  .t2-row {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: 10px var(--sp-md);
    font-family: var(--mono); font-size: var(--fs-mono);
  }
  .t2-row.triggered { border-color: var(--green); background: rgba(74,222,128,0.08); }
  .t2-row .t2-name {
    font-size: var(--fs-body-sm); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); margin-bottom: var(--sp-xs);
  }
  .t2-row .t2-val {
    font-size: var(--fs-body); color: var(--text);
  }
  .t2-row.triggered .t2-val { color: var(--green); }
  .t2-row .t2-sub {
    font-size: var(--fs-mono-sm); color: var(--text-dim); margin-top: var(--sp-xs);
  }
  .t2-row .t2-status {
    display: inline-block; padding: 1px 6px; border-radius: var(--r-xs);
    font-size: var(--fs-mono-xs); margin-top: var(--sp-xs); text-transform: uppercase;
    background: var(--border); color: var(--text-dim);
  }
  .t2-row.triggered .t2-status {
    background: rgba(74,222,128,0.2); color: var(--green);
  }

  /* cross-asset bottom signals */
  .crossx-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;
  }
  .crossx-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: var(--sp-md);
    font-family: var(--mono); font-size: var(--fs-mono);
  }
  .crossx-card.deep_breach {
    border-color: var(--red);
    background: rgba(248,113,113,0.10);
  }
  .crossx-card.breach {
    border-color: var(--orange);
    background: rgba(251,146,60,0.08);
  }
  .crossx-card.touching {
    border-color: var(--yellow);
    background: rgba(251,191,36,0.06);
  }
  .crossx-card .cx-coin {
    font-size: var(--fs-body-lg); font-weight: 700; letter-spacing: 0.04em;
    color: var(--text); margin-bottom: 6px;
  }
  .crossx-card .cx-row {
    display: flex; justify-content: space-between; align-items: baseline;
    font-size: var(--fs-mono-sm); color: var(--text-dim); margin: var(--sp-2xs) 0;
  }
  .crossx-card .cx-row span:last-child {
    color: var(--text); font-variant-numeric: tabular-nums;
  }
  .crossx-card .cx-zone {
    display: inline-block; margin-top: 6px; padding: var(--sp-2xs) var(--sp-sm);
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.06em;
    border-radius: var(--r-sm); background: var(--border); color: var(--text-dim);
  }
  .crossx-card.deep_breach .cx-zone {
    background: rgba(248,113,113,0.2); color: var(--red);
  }
  .crossx-card.breach .cx-zone {
    background: rgba(251,146,60,0.2); color: var(--orange);
  }
  .crossx-card.touching .cx-zone {
    background: rgba(251,191,36,0.2); color: var(--yellow);
  }

  /* DCA Entry Zones */
  .dca-status {
    display: flex; align-items: center; gap: 10px; margin-bottom: 14px;
    font-family: var(--mono); font-size: var(--fs-mono);
  }
  .dca-status .dca-pill {
    display: inline-block; padding: 3px 10px; border-radius: var(--r-pill);
    font-weight: 600; font-size: var(--fs-mono-sm); letter-spacing: 0.06em;
    text-transform: uppercase;
    border: 1px solid var(--border); color: var(--text-dim);
    background: var(--bg-panel-2);
  }
  .dca-status .dca-pill.active {
    color: var(--orange); border-color: var(--orange);
    background: rgba(255,148,87,0.12);
  }
  .dca-status .dca-pill.above { color: var(--text-dim); }
  .dca-status .dca-deployed { color: var(--text-dim); }

  .dca-row {
    display: grid; grid-template-columns: 28px 95px 1fr 50px;
    align-items: center; gap: 10px; margin-bottom: var(--sp-sm);
    font-family: var(--mono);
  }
  .dca-letter {
    width: 26px; height: 26px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    font-family: var(--font-display); font-size: var(--fs-body-sm); font-weight: 800;
  }
  .dca-range {
    font-size: var(--fs-mono); color: var(--text-dim);
    font-variant-numeric: tabular-nums;
  }
  .dca-track {
    height: 22px; background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); overflow: hidden; position: relative;
  }
  .dca-fill {
    height: 100%; border-radius: var(--r-sm);
    display: flex; align-items: center; justify-content: flex-end;
    padding-right: var(--sp-sm); font-size: var(--fs-mono-sm); font-weight: 600;
    color: rgba(255,255,255,0.9);
    transition: width var(--dur-data-reveal) var(--ease-data-reveal);
  }
  .dca-alloc {
    font-size: var(--fs-body-sm); font-weight: 700; text-align: right;
    font-variant-numeric: tabular-nums;
  }
  .dca-row.active .dca-track { box-shadow: 0 0 0 1px var(--orange); }
  /* Zone color variants — CW brand-aligned */
  .za .dca-letter { background: rgba(255,148,87,0.20); color: var(--orange); }
  .za .dca-fill   { background: linear-gradient(90deg, rgba(255,148,87,0.3), rgba(255,148,87,0.7)); }
  .za .dca-alloc  { color: var(--orange); }
  .zb .dca-letter { background: rgba(255,209,102,0.20); color: var(--yellow); }
  .zb .dca-fill   { background: linear-gradient(90deg, rgba(255,209,102,0.3), rgba(255,209,102,0.7)); }
  .zb .dca-alloc  { color: var(--yellow); }
  .zc .dca-letter { background: rgba(80,125,252,0.20); color: var(--blue); }
  .zc .dca-fill   { background: linear-gradient(90deg, rgba(80,125,252,0.3), rgba(80,125,252,0.7)); }
  .zc .dca-alloc  { color: var(--blue); }
  .zd .dca-letter { background: rgba(80,252,209,0.20); color: var(--cyan); }
  .zd .dca-fill   { background: linear-gradient(90deg, rgba(80,252,209,0.3), rgba(80,252,209,0.7)); }
  .zd .dca-alloc  { color: var(--cyan); }
  .ze .dca-letter { background: rgba(116,152,253,0.20); color: var(--purple); }
  .ze .dca-fill   { background: linear-gradient(90deg, rgba(116,152,253,0.3), rgba(116,152,253,0.7)); }
  .ze .dca-alloc  { color: var(--purple); }

  .dca-note {
    margin-top: 14px; padding: var(--sp-sm) var(--sp-md);
    background: rgba(80,252,209,0.05);
    border: 1px solid rgba(80,252,209,0.18);
    border-radius: var(--r-sm);
    font-family: var(--mono); font-size: var(--fs-mono-sm); color: var(--text-dim);
  }
  /* Scenario Analysis table */
  .sc-table { width: 100%; border-collapse: collapse; }
  .sc-table th, .sc-table td {
    padding: var(--sp-sm) 10px; font-family: var(--mono); font-size: var(--fs-mono);
    border-bottom: 1px solid var(--border);
    font-variant-numeric: tabular-nums;
  }
  .sc-table th {
    text-align: left; color: var(--text-dim);
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.08em;
  }
  .sc-table td.num { text-align: right; }
  .sc-table tr:last-child td { border-bottom: none; }
  .sc-table tr.sc-base {
    border-left: 3px solid var(--blue);
    background: rgba(80,125,252,0.05);
  }
  .prob-bar-row {
    display: flex; align-items: center; gap: var(--sp-sm);
  }
  .prob-track {
    flex: 1; height: 6px; background: var(--bg-panel-2);
    border: 1px solid var(--border); border-radius: var(--r-pill); overflow: hidden;
  }
  .prob-fill { height: 100%; border-radius: var(--r-pill); }
  .base-tag {
    display: inline-block; margin-left: var(--sp-xs);
    background: rgba(80,125,252,0.15); color: var(--blue);
    border: 1px solid rgba(80,125,252,0.3); border-radius: var(--r-pill);
    padding: 0 6px; font-size: var(--fs-mono-xs); font-weight: 600;
  }
  /* Backtest-constant tag — marks values that come from research output,
     not live on-chain data. They only change when someone re-runs the
     backtest. */
  .const-tag {
    display: inline-block; margin-left: 6px;
    background: rgba(138,146,168,0.10); color: var(--text-dim);
    border: 1px solid var(--border); border-radius: var(--r-sm);
    padding: 0 var(--sp-xs); font-size: 8px; font-weight: 600;
    text-transform: uppercase; letter-spacing: 0.08em;
    font-family: var(--mono);
    vertical-align: middle;
  }
  .const-tag.live-mix {
    color: var(--cyan); border-color: rgba(80,252,209,0.3);
    background: rgba(80,252,209,0.08);
  }

  /* Distribution Playbook */
  .dist-row {
    display: flex; justify-content: space-between; align-items: center;
    gap: 14px; padding: var(--sp-sm) 0; border-bottom: 1px solid var(--border);
  }
  .dist-row:last-child { border-bottom: none; }
  .dist-lbl {
    font-size: var(--fs-mono); color: var(--text-dim); flex: 1;
  }
  .dist-val {
    font-family: var(--mono); font-size: var(--fs-mono); font-weight: 600;
    color: var(--purple); font-variant-numeric: tabular-nums;
    white-space: nowrap;
  }
  .dist-val .was { color: var(--text-dim); font-weight: 400; }

  /* halving cycle regime bar */
  .hv-bar-wrap { margin: var(--sp-xs) 0 14px; }
  .hv-bar {
    height: 32px; border-radius: var(--r-sm); position: relative;
    background: linear-gradient(90deg,
      #50FCD1 0%,
      #50FCD1 28%,
      #FFD166 32%,
      #FF5E7F 36%,
      #FF5E7F 38%,
      #FF9457 42%,
      #507DFC 50%,
      #2563eb 72%,
      #507DFC 88%,
      #50FCD1 100%);
    border: 1px solid var(--border);
  }
  .hv-needle {
    position: absolute; top: -6px; bottom: -6px; width: 3px;
    background: var(--text); box-shadow: 0 0 8px rgba(255,255,255,0.7);
    transition: left 0.4s ease;
  }
  .hv-labels {
    display: grid; grid-template-columns: 33% 5% 38% 24%;
    margin-top: 6px; font-size: var(--fs-mono-xs); font-family: var(--mono);
    color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em;
  }
  .hv-labels span { text-align: center; }
  .hv-labels span:first-child { text-align: left; }
  .hv-labels span:last-child { text-align: right; }
  .hv-summary {
    display: flex; justify-content: space-between; align-items: baseline;
    font-family: var(--mono); font-size: var(--fs-mono); gap: var(--sp-md); flex-wrap: wrap;
    padding: 10px var(--sp-md); background: var(--bg-panel-2);
    border: 1px solid var(--border); border-radius: var(--r-sm);
  }
  .hv-summary.danger { border-color: var(--red); background: rgba(248,113,113,0.08); }
  .hv-summary.warn { border-color: var(--yellow); background: rgba(251,191,36,0.08); }
  .hv-summary.cool { border-color: var(--blue); background: rgba(96,165,250,0.08); }
  .hv-summary.good { border-color: var(--green); background: rgba(74,222,128,0.08); }
  .hv-summary .hv-regime {
    font-size: var(--fs-body); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text); font-weight: 600;
  }
  .hv-summary .hv-notes { color: var(--text-dim); font-size: var(--fs-mono-sm); flex: 1 1 200px; }
  .hv-summary .hv-day { color: var(--text-dim); white-space: nowrap; }
  .hv-years {
    position: relative; height: 14px; margin-top: var(--sp-2xs);
    font-size: var(--fs-mono-xs); font-family: var(--mono); color: var(--text-dim);
  }
  .hv-years span {
    position: absolute; top: 0; transform: translateX(-50%);
    white-space: nowrap;
  }
  .hv-years span.now {
    color: var(--text); font-weight: 700;
  }
  .hv-year-tick {
    position: absolute; top: -4px; width: 1px; height: 6px;
    background: var(--text-dim); transform: translateX(-50%);
  }

  /* daily report — positioning cards */
  .positioning-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-md);
  }
  .positioning-grid-empty {
    grid-column: 1 / -1;
    border: 1px dashed var(--border);
    border-radius: var(--r-sm);
    padding: var(--sp-lg);
    color: var(--text-dim);
    font-size: var(--fs-body-sm);
    text-align: center;
  }
  .panel-empty-state {
    display: flex;
    flex-direction: column;
    justify-content: center;
    min-height: 96px;
    padding: var(--sp-lg);
    border: 1px solid rgba(80,252,209,0.16);
    border-radius: var(--r-md);
    background:
      linear-gradient(135deg, rgba(80,252,209,0.055), rgba(116,152,253,0.035)),
      var(--bg-panel-2);
    color: var(--text-dim);
    font-size: var(--fs-body-sm);
    line-height: 1.5;
  }
  .panel-empty-state.span-all {
    grid-column: 1 / -1;
  }
  .panel-empty-state.compact {
    min-height: 74px;
    padding: var(--sp-md);
  }
  .panel-empty-kicker {
    margin-bottom: var(--sp-xs);
    color: var(--text-dim);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  .panel-empty-title {
    color: var(--text);
    font-family: var(--font-display);
    font-size: var(--fs-body);
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
  }
  .panel-empty-detail {
    max-width: 680px;
    margin: var(--sp-xs) 0 0;
    color: var(--text-dim);
  }
  .scenario-live-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--sp-md);
    margin-top: var(--sp-lg);
  }
  .scenario-live-card {
    min-height: 96px;
    padding: var(--sp-md);
    border: 1px solid rgba(138,151,168,0.2);
    border-radius: var(--r-sm);
    background: rgba(14,18,27,0.56);
  }
  .scenario-live-card-wide {
    grid-column: 1 / -1;
  }
  .scenario-live-label {
    margin-bottom: var(--sp-sm);
    color: var(--text-dim);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    line-height: 1.2;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  .scenario-chip-grid {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-xs);
    color: var(--text-dim);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
  }
  .scenario-chip {
    padding: 4px 7px;
    border: 1px solid rgba(80,252,209,0.24);
    border-radius: var(--r-sm);
    background: rgba(80,252,209,0.06);
    color: var(--cyan);
  }
  .scenario-status {
    color: var(--text-dim);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    line-height: 1.45;
  }
  .scenario-status.ok {
    color: var(--cyan);
  }
  .scenario-status.warn {
    color: var(--yellow);
  }
  .scenario-path-list {
    display: grid;
    gap: var(--sp-xs);
  }
  .scenario-path-row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: var(--sp-sm);
    align-items: center;
    padding-top: var(--sp-xs);
    border-top: 1px solid rgba(138,151,168,0.16);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
  }
  .scenario-path-row:first-child {
    padding-top: 0;
    border-top: 0;
  }
  .scenario-path-name {
    min-width: 0;
    color: var(--text);
  }
  .scenario-path-meta {
    color: var(--cyan);
    white-space: nowrap;
  }
  @media (max-width: 760px) {
    .scenario-live-grid {
      grid-template-columns: 1fr;
    }
    .scenario-path-row {
      grid-template-columns: 1fr;
    }
    .scenario-path-meta {
      white-space: normal;
    }
  }
  .regime-bt-controls {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-xs);
    margin-bottom: var(--sp-md);
  }
  .regime-bt-preset {
    min-height: 34px;
    padding: 0 var(--sp-sm);
    border: 1px solid rgba(138,151,168,0.24);
    border-radius: var(--r-sm);
    background: var(--bg-elevated);
    color: var(--text-muted);
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    cursor: pointer;
  }
  .regime-bt-preset.active {
    border-color: var(--cyan);
    background: rgba(80,252,209,0.1);
    color: var(--cyan);
  }
  .regime-bt-table {
    display: grid;
    gap: 1px;
    margin-top: var(--sp-md);
    border: 1px solid rgba(138,151,168,0.18);
    border-radius: var(--r-sm);
    overflow: hidden;
  }
  .regime-bt-row {
    display: grid;
    grid-template-columns: 0.8fr repeat(5, minmax(0, 1fr));
    gap: var(--sp-sm);
    align-items: center;
    padding: var(--sp-sm);
    background: rgba(14,18,27,0.54);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
  }
  .regime-bt-head {
    color: var(--text-dim);
    font-size: var(--fs-mono-xs);
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  @media (max-width: 760px) {
    .regime-bt-row {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .regime-bt-head {
      display: none;
    }
  }
  .nansen-flow-card {
    background: var(--bg-elevated);
    border-radius: var(--r-md);
    padding: var(--sp-md);
    border: 1px solid var(--border);
  }
  .nansen-flow-title {
    margin-bottom: var(--sp-md);
    color: var(--text-bright);
    font-family: var(--font-display);
    font-size: var(--fs-body-lg);
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
  }
  .nansen-flow-row {
    display: flex;
    justify-content: space-between;
    gap: var(--sp-md);
    margin-bottom: var(--sp-sm);
    font-size: var(--fs-body);
  }
  .nansen-flow-row:last-child {
    margin-bottom: 0;
  }
  .nansen-flow-label {
    color: var(--text-dim);
  }
  .nansen-flow-value {
    font-family: var(--font-mono);
    white-space: nowrap;
  }
  .nansen-flow-value.positive { color: var(--positive); }
  .nansen-flow-value.negative { color: var(--negative); }
  .pos-card {
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-sm); padding: 14px;
  }
  .pos-card .pc-head {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: var(--sp-sm);
  }
  .pos-card .pc-coin { font-weight: 700; font-size: var(--fs-ui); letter-spacing: 0.04em; }
  .pos-card .pc-bias {
    font-family: var(--mono); font-size: var(--fs-mono); padding: var(--sp-2xs) var(--sp-sm); border-radius: var(--r-sm);
    background: rgba(96,165,250,0.15); color: var(--blue);
  }
  .pos-card .pc-bias.bull { background: rgba(74,222,128,0.18); color: var(--green); }
  .pos-card .pc-bias.bear { background: rgba(248,113,113,0.18); color: var(--red); }
  .pos-card .pc-meta {
    font-family: var(--mono); font-size: var(--fs-mono); color: var(--text-dim);
    margin-bottom: 10px; padding-bottom: var(--sp-sm); border-bottom: 1px solid var(--border);
  }
  .pos-card .pc-meta span + span { margin-left: var(--sp-md); }
  .pos-card .pc-section {
    font-size: var(--fs-mono); line-height: 1.5; margin-bottom: var(--sp-sm);
  }
  .pos-card .pc-label {
    font-size: var(--fs-mono-xs); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); display: block; margin-bottom: var(--sp-2xs);
  }
  .pos-card .pc-text { color: var(--text); }
  .pos-card .pc-text.mono { font-family: var(--mono); font-size: var(--fs-mono-sm); }

  /* full markdown report */
  .markdown-body {
    font-size: var(--fs-body); line-height: 1.55; color: var(--text);
    max-height: 720px; overflow-y: auto; padding: var(--sp-lg) 20px;
  }
  .markdown-body h1, .markdown-body h2, .markdown-body h3 {
    color: var(--text); font-weight: 600; margin-top: var(--sp-lg); margin-bottom: var(--sp-sm);
    line-height: 1.3;
  }
  .markdown-body h1 { font-size: var(--fs-ui-lg); border-bottom: 1px solid var(--border); padding-bottom: 6px; }
  .markdown-body h2 { font-size: var(--fs-body-lg); color: var(--cyan); text-transform: uppercase; letter-spacing: 0.05em; }
  .markdown-body h3 { font-size: var(--fs-body); color: var(--blue); }
  .markdown-body p { margin: 6px 0; color: var(--text-dim); }
  .markdown-body strong { color: var(--text); font-weight: 600; }
  .markdown-body em { color: var(--text); font-style: italic; }
  .markdown-body ul, .markdown-body ol { margin: 6px 0 6px 20px; color: var(--text-dim); }
  .markdown-body li { margin: 3px 0; }
  .markdown-body code {
    background: var(--bg-panel-2); padding: 1px var(--sp-xs); border-radius: var(--r-sm);
    font-family: var(--mono); font-size: var(--fs-mono); color: var(--cyan);
  }
  .markdown-body table {
    border-collapse: collapse; margin: 10px 0;
    font-family: var(--mono); font-size: var(--fs-mono); width: 100%;
  }
  .markdown-body th, .markdown-body td {
    border: 1px solid var(--border); padding: 6px 10px; text-align: left;
  }
  .markdown-body th { background: var(--bg-panel-2); color: var(--text); font-weight: 600; }
  .markdown-body td { color: var(--text-dim); }
  .markdown-body hr { border: none; border-top: 1px solid var(--border); margin: 14px 0; }
  .markdown-body blockquote {
    border-left: 3px solid var(--cyan); padding-left: var(--sp-md); margin: 10px 0;
    color: var(--text-dim);
  }
  .report-toggle {
    background: none; border: 1px solid var(--border); color: var(--text-dim);
    padding: var(--sp-xs) 10px; border-radius: var(--r-sm); cursor: pointer;
    font-family: var(--mono); font-size: var(--fs-mono);
    min-height: 32px;
  }
  .report-toggle:hover { color: var(--text); border-color: var(--cyan); }
  /* F1 (audit 2026-05-02): dropped perpetual reportPulse — color + border
     accent + dot indicator carry the "new report available" meaning without
     a non-sanctioned infinite animation. */
  .report-toggle.pulse {
    color: var(--cyan); border-color: var(--cyan);
    font-weight: 600;
  }
  .report-teaser {
    display: flex; align-items: center; gap: 14px;
    padding: var(--sp-lg) var(--sp-lg); margin: 0;
    background: linear-gradient(90deg, rgba(34,211,238,0.08), rgba(34,211,238,0.02));
    border-top: 1px solid rgba(34,211,238,0.25);
    cursor: pointer; transition: background 0.2s;
  }
  .report-teaser:hover { background: linear-gradient(90deg, rgba(34,211,238,0.15), rgba(34,211,238,0.04)); }
  /* F1 (audit 2026-05-02): dropped perpetual reportPulse + teaserArrow.
     Cyan-on-bg badge fill + arrow glyph carry the affordance without
     infinite animation. Only cw-live-pulse is sanctioned per DESIGN.md. */
  .report-teaser-badge {
    font-family: var(--mono); font-size: var(--fs-mono-sm); font-weight: 700;
    color: var(--bg); background: var(--cyan);
    padding: var(--sp-xs) var(--sp-sm); border-radius: var(--r-sm); letter-spacing: 0.08em;
    white-space: nowrap;
  }
  .report-teaser-text {
    flex: 1; font-size: var(--fs-body); color: var(--text);
    font-family: var(--mono); line-height: 1.5;
  }
  .report-teaser-arrow {
    font-size: var(--fs-display-sm); color: var(--cyan);
  }

  /* misc */
  .positive { color: var(--green); }
  .negative { color: var(--red); }
  .warn     { color: var(--yellow); }
  .neutral { color: var(--text-dim); }
  .muted { color: var(--text-dim); }
  .empty { color: var(--text-dim); font-style: italic; font-size: var(--fs-body-sm); padding: var(--sp-lg); text-align: center; }

  /* --- Freshness banner + details --- */
  .freshness-banner {
    display: none; /* hidden - panels have own freshness badges */
  }
  .freshness-banner .freshness-main {
    display: flex;
    align-items: center;
    gap: var(--sp-sm);
    flex-wrap: wrap;
  }
  .fresh-dot {
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #8a92a8;
    box-shadow: 0 0 0 0 rgba(80,252,209,0);
  }
  .fresh-dot.fresh      { background: #50FCD1; box-shadow: 0 0 6px rgba(80,252,209,0.6); }
  .fresh-dot.stale      { background: #f59e0b; box-shadow: 0 0 6px rgba(245,158,11,0.5); }
  .fresh-dot.very_stale { background: #FF5E7F; box-shadow: 0 0 8px rgba(248,113,113,0.6); }
  .fresh-dot.missing    { background: #4b5563; }
  .fresh-label {
    font-weight: 600;
    color: var(--text-strong, #e6e8ef);
  }
  .fresh-label.fresh      { color: #50FCD1; }
  .fresh-label.stale      { color: #f59e0b; }
  .fresh-label.very_stale { color: #FF5E7F; }
  .fresh-sep { color: var(--text-dim, #8a92a8); }
  .fresh-detail { color: var(--muted, #8a92a8); font-variant-numeric: tabular-nums; }
  /* F6 (audit 2026-05-02): snap 3px padding → --sp-xs (4) per scale. */
  .fresh-toggle {
    background: transparent;
    border: 1px solid var(--panel-border, #1a1f2c);
    color: var(--muted, #8a92a8);
    border-radius: var(--r-sm);
    padding: var(--sp-xs) var(--sp-sm);
    min-height: 32px;
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
    cursor: pointer;
  }
  .fresh-toggle:hover { color: var(--text-strong, #e6e8ef); border-color: var(--text-dim, #8a92a8); }
  /* F6 (audit 2026-05-02): snap 10px padding → --sp-sm (8). */
  .freshness-details {
    background: rgba(10, 14, 22, 0.95);
    border-bottom: 1px solid var(--panel-border, #1a1f2c);
    padding: var(--sp-sm) var(--sp-lg) var(--sp-md);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-sm);
  }
  .freshness-details[hidden] { display: none; }
  .fresh-group-head {
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-size: var(--fs-mono-xs);
    color: var(--text-dim, #8a92a8);
    margin: 6px 0 var(--sp-xs);
  }
  .fresh-list {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 3px var(--sp-md);
  }
  .fresh-item {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    padding: var(--sp-2xs) 0;
    color: var(--muted, #8a92a8);
  }
  .fresh-item .fresh-item-label {
    display: flex;
    align-items: center;
    gap: 6px;
  }
  .fresh-item .fresh-item-age {
    font-variant-numeric: tabular-nums;
    font-size: var(--fs-mono-xs);
  }
  .fresh-item.fresh      .fresh-item-age { color: #50FCD1; }
  .fresh-item.stale      .fresh-item-age { color: #f59e0b; }
  .fresh-item.very_stale .fresh-item-age { color: #FF5E7F; }
  /* Retry button — only rendered on stale/very_stale/missing rows
     (audit TC-20 fix, 2026-04-24). */
  .fresh-retry-btn {
    margin-left: 6px;
    padding: 1px 6px;
    font-size: var(--fs-mono);
    line-height: 1.2;
    background: rgba(80, 125, 252, 0.08);
    color: #7498FD;
    border: 1px solid rgba(80, 125, 252, 0.3);
    border-radius: var(--r-sm);
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
  }
  .fresh-retry-btn:hover { background: rgba(80, 125, 252, 0.18); color: var(--text); }
  .fresh-retry-btn:disabled { opacity: 0.5; cursor: wait; }

  /* Per-panel freshness micro-badge (goes inside .panel-head) */
  .panel-fresh-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-xs);
    margin-left: 6px;
    padding: 1px 6px;
    border-radius: var(--r-sm);
    font-family: var(--mono, ui-monospace);
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    background: rgba(100, 116, 139, 0.12);
    color: var(--muted, #8a92a8);
    white-space: nowrap;
  }
  .panel-fresh-badge.fresh      { background: rgba(80,252,209,0.10); color: #50FCD1; }
  .panel-fresh-badge.stale      { background: rgba(245,158,11,0.12); color: #f59e0b; }
  .panel-fresh-badge.very_stale { background: rgba(255,94,127,0.15); color: var(--red); }
  .panel-fresh-badge.missing    { background: rgba(100,116,139,0.12); color: #8a92a8; }

  .error-banner {
    background: rgba(255, 94, 127, 0.15); border: 1px solid var(--red);
    color: var(--red); padding: 10px 14px; border-radius: var(--r-sm);
    margin-bottom: var(--sp-lg); font-family: var(--mono); font-size: var(--fs-body-sm);
  }
  .error-banner.hidden { display: none; }

  /* ===========================================================================
     RESPONSIVE — mobile / tablet breakpoints
     1024px: tablet (3→2 col, 5→3 col)
     768px:  portrait tablet / large phone (collapse cycle+heat flex, 2 col)
     480px:  phone (everything single column, tighter padding)
     =========================================================================== */
  @media (max-width: 1024px) {
    body { padding: var(--sp-md); }
    .kpi-row,
    .kpi-row[style] { grid-template-columns: repeat(3, 1fr) !important; }
    .cycle-signals { grid-template-columns: repeat(3, 1fr); }
    .t1-grid { grid-template-columns: repeat(2, 1fr); }
    .t2-grid { grid-template-columns: repeat(3, 1fr); }
    .crossx-grid { grid-template-columns: repeat(2, 1fr); }
    .three-col { grid-template-columns: 1fr 1fr; }
  }

  @media (max-width: 768px) {
    body { padding: 10px; font-size: var(--fs-body); }
    header.topbar {
      flex-wrap: wrap; gap: 10px;
      padding: 10px var(--sp-md);
    }
    header.topbar h1 { font-size: var(--fs-body-lg); }
    .status-strip { flex-wrap: wrap; gap: 10px; font-size: var(--fs-mono-sm); }

    /* KPI row: 5 → 2 cols */
    .kpi-row,
    .kpi-row[style] { grid-template-columns: repeat(2, 1fr) !important; gap: var(--sp-sm); }
    .kpi-label { font-size: var(--fs-mono-sm); }
    .kpi-value { font-size: var(--fs-ui); }

    /* Panels: tighter */
    .panel-head {
      padding: 10px var(--sp-md); flex-wrap: wrap; gap: var(--sp-sm);
      font-size: var(--fs-mono);
    }
    .panel-body { padding: var(--sp-md); }

    /* Cycle phase: bar stacks above summary */
    .cycle-wrap { flex-direction: column; align-items: stretch; gap: 14px; }
    .cycle-summary { min-width: 0; width: 100%; }
    .cycle-phase { font-size: var(--fs-ui); }
    .cycle-labels { font-size: 8px; }
    .cycle-signals { grid-template-columns: repeat(2, 1fr); gap: var(--sp-sm); }

    /* Heat thermometer: bar stacks above score */
    .heat-wrap { flex-direction: column; align-items: stretch; gap: 14px; }
    .heat-summary { min-width: 0; width: 100%; text-align: left; }
    .heat-score { font-size: var(--fs-display); }
    .heat-labels { font-size: var(--fs-mono-xs); }
    .heat-comp-grid { grid-template-columns: repeat(2, 1fr); }

    /* Tier grids */
    .t1-grid { grid-template-columns: repeat(2, 1fr); gap: var(--sp-sm); }
    .t2-grid { grid-template-columns: repeat(2, 1fr); gap: var(--sp-sm); }
    .crossx-grid { grid-template-columns: repeat(2, 1fr); gap: var(--sp-sm); }

    /* Two/three col layouts collapse */
    .two-col,
    .three-col { grid-template-columns: 1fr; gap: var(--sp-md); }

    /* Positioning grid min-width smaller */
    /* Horizontal snap carousel on mobile — cards swipe L/R instead of stack */
    .positioning-grid {
      display: flex;
      grid-template-columns: none;
      gap: var(--sp-md);
      overflow-x: auto;
      overflow-y: hidden;
      scroll-snap-type: x mandatory;
      -webkit-overflow-scrolling: touch;
      padding: var(--sp-2xs) var(--sp-2xs) var(--sp-md);
      margin: 0 -var(--sp-xs);
      scrollbar-width: thin;
      scroll-padding-left: 4px;
    }
    .positioning-grid .pos-card {
      flex: 0 0 calc(100% - 24px);
      max-width: calc(100% - 24px);
      scroll-snap-align: start;
      scroll-snap-stop: always;
    }
    .positioning-grid::-webkit-scrollbar { height: 4px; }
    .positioning-grid::-webkit-scrollbar-thumb {
      background: var(--border); border-radius: var(--r-xs);
    }
    .positioning-grid::-webkit-scrollbar-thumb:hover {
      background: var(--text-dim);
    }

    /* Funding table: smaller font, hide non-essential columns if any */
    table.funding th, table.funding td {
      padding: 6px var(--sp-sm); font-size: var(--fs-mono-sm);
    }

    /* Report teaser: stack text + arrow */
    .report-teaser {
      flex-wrap: wrap; padding: 14px var(--sp-lg); gap: 10px;
    }
    .report-teaser-text { flex-basis: 100%; order: 3; font-size: var(--fs-body-sm); }
    .report-teaser-badge { font-size: var(--fs-mono-xs); padding: 3px 6px; }

    /* Markdown body: tighter */
    .markdown-body { padding: 14px var(--sp-lg); font-size: var(--fs-body-sm); }
    .markdown-body h1 { font-size: var(--fs-ui); }
    .markdown-body h2 { font-size: var(--fs-body-lg); }
    .markdown-body h3 { font-size: var(--fs-body); }

    /* Positioning cards */
    .pc-coin { font-size: var(--fs-body); }
    .pc-bias { font-size: var(--fs-mono); padding: var(--sp-2xs) 6px; }
  }

  @media (max-width: 480px) {
    body { padding: var(--sp-sm); }
    .kpi-row,
    .kpi-row[style] { grid-template-columns: repeat(2, 1fr) !important; gap: 6px; }
    .kpi-card { padding: var(--sp-sm) 10px; }
    .kpi-value { font-size: var(--fs-body-lg); }

    /* v1.9 F3 — KPI horizon tag would otherwise truncate (.kpi-label has
       white-space: nowrap + ellipsis). Hide the inline tag and surface the
       same text on the kpi-sub line so the time-horizon framing survives
       on mobile, where the conflict is most confusing. */
    .kpi-label .kpi-label-tag { display: none; }
    .kpi:has(.kpi-label-tag) .kpi-sub::before {
      content: 'weeks–months · ';
      opacity: 0.55;
      letter-spacing: 0.06em;
      text-transform: uppercase;
      font-family: var(--mono);
    }

    /* Single column everything that still has multi-col */
    .cycle-signals { grid-template-columns: 1fr; }
    .heat-comp-grid { grid-template-columns: 1fr; }
    .t1-grid { grid-template-columns: 1fr; }
    .t2-grid { grid-template-columns: 1fr; }
    .crossx-grid { grid-template-columns: 1fr; }

    .cycle-labels span { font-size: 8px; letter-spacing: 0; }
    .heat-labels span { font-size: 8px; letter-spacing: 0; }

    /* Hide the "Intel" badge text on tiny screens to save space */
    header.topbar h1 .badge { display: none; }

    /* Report toggle button shrinks */
    .report-toggle { padding: 3px var(--sp-sm); font-size: var(--fs-mono-sm); }

    /* Download button text shorter */
    #report-download { font-size: var(--fs-mono-sm); }
  }

  /* --------------------------------------------------------------------- */
  /* MOBILE DEEP DIVE — tighten Cointime / Options / Liquidation on phones */
  /* --------------------------------------------------------------------- */
  @media (max-width: 600px) {
    /* Options panel */
    .opt-card { padding: var(--sp-sm) var(--sp-md); }
    .opt-value { font-size: var(--fs-ui-lg); }
    .opt-curve { grid-template-columns: repeat(4, 1fr); gap: 3px; font-size: 8px; }
    .opt-curve div { padding: var(--sp-2xs) 1px; }
    .opt-curve div b { font-size: var(--fs-mono-xs); }
    .opt-zone { font-size: var(--fs-mono-xs); }
    .opt-source { font-size: 8px; }

    /* Cointime panel */
    .ct-card { padding: var(--sp-sm) var(--sp-md); }
    .ct-value { font-size: var(--fs-body-lg); }
    .ct-name { font-size: var(--fs-mono-xs); }
    .ct-zone { font-size: 8px; }
    .ct-bands { font-size: 8px; }

    /* Liquidation panel — tighter row layout */
    .liq-meta { gap: var(--sp-sm) 14px; font-size: var(--fs-mono-xs); }
    .liq-meta .item { gap: var(--sp-xs); }
    .liq-ladder { gap: var(--sp-sm) 0; }
    .liq-side h5 { font-size: var(--fs-mono-xs); margin-bottom: var(--sp-xs); }
    .liq-row {
      grid-template-columns: 26px 72px 40px 1fr 50px;
      gap: 6px; font-size: var(--fs-mono-xs);
      margin-bottom: 3px;
    }
    .liq-row .dist { font-size: 8px; }
    .liq-row .usd { font-size: 8px; }
    .liq-row .bar { height: 10px; }
    .liq-spot-label { padding: var(--sp-xs) 10px; }
    .liq-spot-label .spot-val { font-size: var(--fs-body-sm); }
    .liq-spot-label .spot-lbl { font-size: 7px; }
    .liq-pin { font-size: var(--fs-mono-xs); padding: 6px var(--sp-sm); }
  }

  @media (max-width: 400px) {
    /* Ultra-narrow — kill the dist column on liq rows, it's redundant with price */
    .liq-row { grid-template-columns: 24px 72px 1fr 48px; }
    .liq-row .dist { display: none; }
    /* Tighter options card headers */
    .opt-value { font-size: var(--fs-ui); }
    .opt-curve { grid-template-columns: repeat(2, 1fr); }
  }

  /* Design audit quick wins (2026-04-14) */
  .panel-head span,
  .panel h1, .panel h2, .panel h3, .panel h4, .panel h5,
  .panel-info p,
  .kpi-label {
    text-wrap: balance;
  }
  .panel-body,
  .kpi-row, .kpi-value, .kpi-sub,
  .liq-row, .macro-grid, .opt-card, .ct-card,
  .sc-table, .dca-zones, .hv-summary {
    font-variant-numeric: tabular-nums;
  }

  /* Skeleton shimmer on initial load (FINDING-002 + 003) */
  @keyframes cw-shimmer {
    0%   { opacity: 0.35; }
    50%  { opacity: 0.70; }
    100% { opacity: 0.35; }
  }
  body.is-loading .kpi-value,
  body.is-loading .kpi-sub,
  body.is-loading .gauge-verdict,
  body.is-loading .gauge-score-num,
  body.is-loading .gauge-conf-num,
  body.is-loading .opt-value,
  body.is-loading .ct-value,
  body.is-loading .hv-regime,
  body.is-loading .hv-day,
  body.is-loading .cycle-phase,
  body.is-loading .cycle-pos,
  body.is-loading .heat-score,
  body.is-loading .heat-label-text,
  body.is-loading .spot-val,
  body.is-loading .dca-pill,
  body.is-loading .dca-deployed,
  body.is-loading .liq-meta .item b,
  body.is-loading .macro-val,
  body.is-loading .inst-val,
  body.is-loading .muted {
    animation: cw-shimmer 1.4s ease-in-out infinite;
  }
  body.is-loading .gauge-verdict::after {
    content: " · computing";
    font-size: var(--fs-body);
    font-weight: 500;
    color: var(--text-dim);
    letter-spacing: 0.04em;
    text-transform: none;
  }
  /* Extend shimmer to panel body placeholder content */
  body.is-loading .panel-body .synth-hero-line,
  body.is-loading .panel-body .synth-hero-sub,
  body.is-loading .panel-body .pm-card-hero,
  body.is-loading .panel-body .pm-card-breakdown,
  body.is-loading .panel-body .hv-regime,
  body.is-loading .panel-body .hv-notes,
  body.is-loading .panel-body .bmvz-kpi strong,
  body.is-loading .panel-body .dist-val,
  body.is-loading .panel-body .cr-hero-line {
    animation: cw-shimmer 1.4s ease-in-out infinite;
  }
  /* Stop shimmer instantly when is-loading is removed */
  body:not(.is-loading) .kpi-value,
  body:not(.is-loading) .kpi-sub,
  body:not(.is-loading) .gauge-verdict,
  body:not(.is-loading) .gauge-score-num,
  body:not(.is-loading) .gauge-conf-num {
    animation: none;
  }

  /* ── Distribution Confluence (top-detection engine) ── */
  .dist-conf-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 10px; margin-bottom: var(--sp-md);
  }
  .dist-conf-card {
    background: var(--bg-panel-2); border-radius: var(--r-md); padding: var(--sp-md);
    border-left: 3px solid var(--border);
  }
  .dist-conf-card.triggered { border-left-color: #FF5E7F; }
  .dist-conf-card.safe { border-left-color: #50FCD1; }
  .dist-conf-card .dc-label { font-size: var(--fs-mono); color: var(--fg-muted); margin-bottom: var(--sp-xs); }
  .dist-conf-card .dc-value { font-size: var(--fs-ui-lg); font-weight: 700; font-family: var(--mono); }
  .dist-conf-card .dc-thresh { font-size: var(--fs-mono-sm); color: var(--fg-muted); margin-top: var(--sp-2xs); }
  .dist-conf-card .dc-value.warn { color: #FF5E7F; }
  .dist-conf-card .dc-value.ok { color: #50FCD1; }
  .dist-conf-hero {
    padding: 10px 14px; border-radius: var(--r-md); margin-bottom: 10px;
    border-left: 3px solid var(--cyan);
    background: rgba(80,125,252,0.06);
  }
  .dist-conf-hero .dc-hero-count { font-size: var(--fs-display-sm); font-weight: 800; font-family: var(--mono); }
  .dist-conf-hero .dc-hero-label { font-size: var(--fs-body-sm); color: var(--fg-muted); }
  .dist-conf-hero .dc-hero-verdict { font-size: var(--fs-body); font-weight: 600; margin-top: var(--sp-xs); }
  .dist-conf-hero .dc-hero-verdict.sell { color: #FF5E7F; }
  .dist-conf-hero .dc-hero-verdict.caution { color: #f59e0b; }
  .dist-conf-hero .dc-hero-verdict.safe { color: #50FCD1; }

  /* ── Prediction Panel v2 ── */
  /* Prediction panel — clean table layout */
  .pred-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  @media (max-width: 600px) {
    .pred-table { font-size: var(--fs-mono); }
    .pred-table .pred-dir-cell { font-size: var(--fs-body-sm); }
    .pred-tf-badge { font-size: var(--fs-mono-xs); }
    .pred-table th, .pred-table td { padding: var(--sp-sm) 6px; }
  }
  /* Evidence-trail popover — Audit ask #16 Phase 1. Click any
     evidence-bearing card and the helper inflates a modal showing
     inputs + weights + metadata. */
  .ev-trail-backdrop {
    position: fixed; inset: 0;
    background: rgba(0,0,0,0.6);
    display: flex; align-items: center; justify-content: center;
    z-index: 1000;
    padding: var(--sp-md);
  }
  .ev-trail-popover {
    background: var(--bg-panel, #1a1d24);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: var(--sp-lg);
    max-width: 480px; width: 100%;
    max-height: 80vh; overflow-y: auto;
    font-family: var(--mono);
  }
  .ev-trail-head {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: var(--sp-md);
    padding-bottom: var(--sp-sm);
    border-bottom: 1px solid var(--border);
  }
  .ev-trail-title {
    font-size: var(--fs-body-lg);
    font-weight: 600;
    color: var(--text);
  }
  .ev-trail-close {
    background: none;
    border: 1px solid var(--border);
    color: var(--text-dim);
    padding: 2px 10px;
    border-radius: var(--r-sm);
    cursor: pointer;
    font-family: var(--mono);
  }
  .ev-trail-close:hover {
    color: var(--text);
    border-color: var(--text-dim);
  }
  .ev-trail-rows {
    display: grid;
    grid-template-columns: 130px 1fr;
    gap: 6px 14px;
    font-size: var(--fs-mono-sm);
  }
  .ev-trail-rows .k {
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: var(--fs-mono-xs);
    padding-top: 3px;
  }
  .ev-trail-rows .v {
    color: var(--text);
    word-break: break-word;
    font-variant-numeric: tabular-nums;
  }
  .ev-trail-rows .v.triggered { color: var(--green, #4ade80); }
  .ev-trail-rows .v.pending   { color: var(--text-dim); }
  .ev-trail-meta-foot {
    margin-top: var(--sp-md);
    padding-top: var(--sp-sm);
    border-top: 1px solid var(--border);
    color: var(--text-dim);
    font-size: var(--fs-mono-xs);
    line-height: 1.5;
  }
  .t1-card { cursor: pointer; }
  .t1-card[data-ev-anchor]:hover {
    border-color: rgba(80, 252, 209, 0.4);
  }

  /* Steelman counter-case panel — Audit ask #19. Toggle button that
     expands to show the strongest opposing thesis. Visually rose-tinted
     when synthesis is BULL (showing the bear case), aqua when BEAR. */
  .pred-steelman-wrap {
    margin: var(--sp-md) 0;
  }
  .pred-steelman-toggle {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
    padding: 10px 14px;
    background: var(--bg-panel-2, rgba(255,255,255,0.02));
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    color: var(--text);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    cursor: pointer;
    transition: background 0.15s ease;
  }
  .pred-steelman-toggle:hover {
    background: rgba(255,255,255,0.05);
  }
  .pred-steelman-toggle .pred-steelman-stance {
    margin-left: auto;
    margin-right: 8px;
    font-size: var(--fs-mono-xs);
    padding: 2px 8px;
    border-radius: var(--r-xs, 4px);
    background: rgba(255,209,102,0.12);
    color: #FFD166;
  }
  .pred-steelman-toggle .pred-steelman-chevron {
    font-size: 10px;
    color: var(--text-dim);
    transition: transform 0.2s ease;
  }
  .pred-steelman-toggle[aria-expanded="true"] .pred-steelman-chevron {
    transform: rotate(180deg);
  }
  .pred-steelman-body {
    margin-top: 8px;
    padding: 14px;
    background: rgba(255,209,102,0.04);
    border: 1px solid rgba(255,209,102,0.2);
    border-radius: var(--r-sm);
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    line-height: 1.5;
  }
  .pred-steelman-thesis {
    color: var(--text);
    margin-bottom: 12px;
    line-height: 1.55;
  }
  .pred-steelman-evidence {
    margin: 10px 0;
    padding-left: 18px;
    color: var(--text-dim);
  }
  .pred-steelman-evidence li {
    margin-bottom: 5px;
    line-height: 1.5;
  }
  .pred-steelman-invalidation {
    margin-top: 10px;
    padding: 8px 12px;
    border-left: 2px solid #FFD166;
    color: var(--text-dim);
    font-size: var(--fs-mono-sm);
    font-style: italic;
  }
  .pred-steelman-invalidation::before {
    content: "Invalidates if: ";
    font-style: normal;
    color: #FFD166;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: var(--fs-mono-xs);
  }

  /* "What Changed" panel — Round 2 §6 / audit ask #20. Mirrors Hunter's
     sec-daily-story visual: severity-coded left borders, before/after
     before-and-after pair under the one-liner. */
  .pred-whats-changed {
    margin: var(--sp-md) 0 var(--sp-md);
    background: var(--bg-panel-2, rgba(255,255,255,0.02));
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    padding: 12px 14px;
  }
  .pred-whats-changed-head {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: 10px;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  .pred-whats-changed-body { display: flex; flex-direction: column; gap: 8px; }
  .pwc-change {
    padding: 6px 0 6px 10px;
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    line-height: 1.4;
  }
  .pwc-change.major   { border-left: 3px solid var(--rose, #ff6464); }
  .pwc-change.notable { border-left: 3px solid #FFD166; }
  .pwc-change.minor   { border-left: 3px solid var(--text-dim); }
  .pwc-change .pwc-line {
    color: var(--text);
  }
  .pwc-change .pwc-before-after {
    margin-top: 3px;
    color: var(--text-dim);
    font-size: var(--fs-mono-sm);
  }
  .pwc-change .pwc-before-after b { color: var(--text); font-weight: 600; }
  .pwc-change .pwc-sev {
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: var(--fs-mono-xs);
    margin-right: 8px;
  }
  .pwc-change.major   .pwc-sev { color: var(--rose, #ff6464); }
  .pwc-change.notable .pwc-sev { color: #FFD166; }
  .pwc-change.minor   .pwc-sev { color: var(--text-dim); }

  /* Disagreement Map — Round 2 §6 / Audit A.7. 3 analysts × 3 horizons,
     each cell shows directional call + confidence; cell color encodes
     whether the analyst matched the synthesis verdict for that horizon. */
  .pred-disagreement {
    margin: var(--sp-md) 0 var(--sp-md);
    background: var(--bg-panel-2, rgba(255,255,255,0.02));
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    padding: 12px 14px;
  }
  .pred-disagreement-head {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: 10px;
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    color: var(--text-dim);
    text-transform: uppercase; letter-spacing: 0.06em;
  }
  .pred-disagreement-grid {
    display: grid;
    grid-template-columns: 110px repeat(3, 1fr);
    gap: 4px;
    font-family: var(--mono);
  }
  .pred-disagreement-grid .dh {
    color: var(--text-dim);
    font-size: var(--fs-mono-sm);
    padding: 4px 8px;
    text-transform: uppercase;
    letter-spacing: 0.06em;
  }
  .pred-disagreement-grid .dh.row { text-align: left; }
  .pred-disagreement-grid .dh.col { text-align: center; }
  .pred-disagreement-grid .dcell {
    padding: 6px 8px;
    border-radius: var(--r-xs, 4px);
    text-align: center;
    font-size: var(--fs-mono-sm);
    line-height: 1.3;
    background: rgba(255,255,255,0.02);
    border: 1px solid var(--border);
  }
  .pred-disagreement-grid .dcell .dir {
    font-weight: 600; letter-spacing: 0.04em;
  }
  .pred-disagreement-grid .dcell .conf {
    color: var(--text-dim); font-size: var(--fs-mono-xs);
  }
  /* Match-state coloring: green = matches synthesis, amber = pair-disagrees,
     rose = lone wolf (disagrees with synthesis AND every other analyst). */
  .pred-disagreement-grid .dcell.match {
    background: rgba(74,222,128,0.08);
    border-color: rgba(74,222,128,0.30);
  }
  .pred-disagreement-grid .dcell.match .dir { color: var(--green, #4ade80); }
  .pred-disagreement-grid .dcell.split {
    background: rgba(255,209,102,0.08);
    border-color: rgba(255,209,102,0.30);
  }
  .pred-disagreement-grid .dcell.split .dir { color: #FFD166; }
  .pred-disagreement-grid .dcell.lone {
    background: rgba(255,100,100,0.08);
    border-color: rgba(255,100,100,0.30);
  }
  .pred-disagreement-grid .dcell.lone .dir { color: var(--rose, #ff6464); }
  .pred-table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-size: var(--fs-body-sm);
  }
  .pred-table th {
    text-align: left;
    font-size: var(--fs-mono-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--fg-muted, #8a92a8);
    font-weight: 600;
    padding: 6px var(--sp-md) var(--sp-sm);
    border-bottom: 1px solid var(--border);
  }
  .pred-table td {
    padding: 10px var(--sp-md);
    border-bottom: 1px solid var(--border);
    vertical-align: middle;
  }
  .pred-table tr:last-child td { border-bottom: none; }
  .pred-table .pred-tf-cell {
    width: 100px;
  }
  .pred-tf-badge {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    padding: 3px var(--sp-sm);
    border-radius: var(--r-sm);
    letter-spacing: 0.04em;
    white-space: nowrap;
  }
  .pred-tf-badge.today { background: rgba(245,158,11,0.15); color: #F59E0B; }
  .pred-tf-badge.week { background: rgba(80,125,252,0.12); color: #507DFC; }
  .pred-tf-badge.month { background: rgba(80,252,209,0.10); color: #50FCD1; }
  .pred-table .pred-scope {
    font-size: var(--fs-mono-xs);
    color: var(--fg-muted, #8a92a8);
    margin-top: var(--sp-2xs);
  }
  .pred-dir-cell {
    font-family: var(--mono);
    font-weight: 700;
    font-size: var(--fs-body-lg);
    letter-spacing: 0.02em;
  }
  .pred-dir-cell.up { color: #50FCD1; }
  .pred-dir-cell.down { color: #FF5E7F; }
  .pred-dir-cell.flat { color: #f59e0b; }
  .pred-dir-cell .pred-range-sub {
    font-size: var(--fs-mono-sm);
    font-weight: 400;
    color: var(--fg-muted);
    margin-top: 1px;
  }
  .pred-trade-cell {
    font-family: var(--mono);
    font-weight: 600;
    font-size: var(--fs-body-sm);
  }
  .pred-trade-cell.up { color: #50FCD1; }
  .pred-trade-cell.down { color: #FF5E7F; }
  .pred-trade-cell.flat { color: #f59e0b; }
  .pred-conf-cell {
    width: 90px;
  }
  .pred-conf-cell .pred-conf-bar {
    height: 2px; border-radius: 1px; background: var(--border);
    overflow: hidden; margin-bottom: var(--sp-2xs);
  }
  .pred-conf-cell .pred-conf-bar > div {
    height: 100%; border-radius: 1px;
  }
  .pred-conf-cell .pred-conf-bar .high { background: #50FCD1; }
  .pred-conf-cell .pred-conf-bar .mid { background: #f59e0b; }
  .pred-conf-cell .pred-conf-bar .low { background: #FF5E7F; }
  .pred-conf-cell .pred-conf-pct {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    color: var(--fg-muted);
    font-variant-numeric: tabular-nums;
  }

  /* Extra calls — inline chip row */
  .pred-extra-divider {
    display: flex; align-items: center; gap: 10px;
    margin: 14px 0 var(--sp-sm); font-size: var(--fs-mono-xs); text-transform: uppercase;
    letter-spacing: 0.1em; color: var(--fg-muted); font-weight: 600;
  }
  .pred-extra-divider::after {
    content: ''; flex: 1; height: 1px;
    background: linear-gradient(90deg, var(--border), transparent);
  }
  .pred-extra-grid {
    display: flex; flex-wrap: wrap; gap: 6px;
  }
  .pred-mini {
    background: var(--bg-panel-2); border-radius: var(--r-md); padding: 6px 10px;
    border: 1px solid var(--border); font-size: var(--fs-mono-sm);
    display: flex; align-items: center; gap: var(--sp-sm);
    white-space: nowrap;
  }
  .pred-mini.yes { border-color: rgba(74,222,128,0.25); }
  .pred-mini.no { border-color: rgba(248,113,113,0.25); }
  .pred-mini.neutral { border-color: rgba(245,158,11,0.20); }
  .pred-mini .pm-label { color: var(--fg-muted); font-size: var(--fs-mono-xs); }
  .pred-mini .pm-val { font-weight: 700; font-family: var(--mono); font-size: var(--fs-mono); }
  .pred-mini .pm-val.yes { color: #50FCD1; }
  .pred-mini .pm-val.no { color: #FF5E7F; }
  .pred-mini .pm-val.neutral { color: #f59e0b; }
  .pred-mini .pm-conf { font-family: var(--mono); font-size: 8px; color: var(--fg-muted); font-variant-numeric: tabular-nums; }
  /* ── Panel group dividers ── */
  .panel-group-divider {
    display: flex; align-items: center; gap: 10px;
    margin: 28px 0 var(--sp-md); padding: 0 var(--sp-xs);
  }
  .panel-group-divider .pgd-badge {
    font-family: var(--mono); font-size: var(--fs-mono-xs); font-weight: 700;
    letter-spacing: 0.1em; text-transform: uppercase;
    padding: 3px var(--sp-sm); border-radius: var(--r-sm);
    white-space: nowrap;
  }
  .panel-group-divider .pgd-badge.l4 { background: rgba(245,158,11,0.15); color: #F59E0B; }
  .panel-group-divider .pgd-badge.l3 { background: rgba(80,252,209,0.10); color: #50FCD1; }
  .panel-group-divider .pgd-badge.inst { background: rgba(116,152,253,0.12); color: #7498FD; }
  .panel-group-divider .pgd-badge.l2 { background: rgba(139,219,236,0.12); color: #8BDBEC; }
  .panel-group-divider .pgd-badge.l1 { background: rgba(255,148,87,0.12); color: #FF9457; }
  .panel-group-divider .pgd-badge.action { background: rgba(255,209,102,0.12); color: #FFD166; }
  .panel-group-divider .pgd-line {
    flex: 1; height: 1px; background: linear-gradient(90deg, var(--border), transparent);
  }
  .panel-group-divider .pgd-label {
    font-size: var(--fs-mono-sm); color: var(--text-dim); font-weight: 500; letter-spacing: 0.04em;
  }

  /* ── Accuracy tracker + expanded predictions ── */
  /* 2026-05-02 — predictions panel reframe banner. Sits at the top of
     #sec-prediction body; forces the "context not signal" frame above the
     numbers so operators don't anchor on the AI verdict in isolation.
     Blue tone (cool, informational) rather than red (alarm) so the panel
     doesn't read as broken — it reads as scoped. */
  /* Was a loud blue card with icon-in-circle, bold title, and body text — the
     same warning was being shown 3 times on the panel (header chip says
     "context only", info disclosure has a paragraph saying "this is a context
     layer", and this banner repeated both). Demoted to a single muted
     subtitle line so the actionable bit ("size positions off cycle/DCA/Desk")
     stays visible without triple-warning the user. */
  .pred-reframe-banner {
    display: block;
    padding: 0;
    margin: 0 0 var(--sp-sm);
    background: transparent;
    border: none;
    border-radius: 0;
  }
  .pred-reframe-banner .prb-icon { display: none; }
  .pred-reframe-banner .prb-body { display: block; }
  .pred-reframe-banner .prb-title {
    display: inline;
    font: 600 var(--fs-mono-sm)/1.5 var(--mono);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--text-dim);
  }
  .pred-reframe-banner .prb-title::after {
    content: " · ";
    color: var(--text-dim);
    opacity: 0.5;
  }
  .pred-reframe-banner .prb-text {
    display: inline;
    font: 400 var(--fs-mono-sm)/1.5 var(--mono);
    color: var(--text-dim);
  }

  .pred-accuracy {
    display: flex; gap: var(--sp-lg); align-items: center; padding: var(--sp-sm) 14px;
    background: var(--bg-panel-2); border-radius: var(--r-md); margin-bottom: var(--sp-md);
    font-size: var(--fs-mono); font-family: var(--mono); font-variant-numeric: tabular-nums;
  }
  .pred-accuracy .pa-stat { display: flex; flex-direction: column; align-items: center; }
  .pred-accuracy .pa-num { font-size: var(--fs-ui-lg); font-weight: 800; }
  .pred-accuracy .pa-num.good { color: #50FCD1; }
  .pred-accuracy .pa-num.ok { color: #f59e0b; }
  .pred-accuracy .pa-num.bad { color: #FF5E7F; }
  .pred-accuracy .pa-label { font-size: 8px; color: var(--fg-muted); text-transform: uppercase; letter-spacing: 0.06em; }
  .pred-accuracy .pa-streak { font-size: var(--fs-mono-sm); color: var(--fg-muted); margin-left: auto; }
  .pred-accuracy .pa-streak b { color: #50FCD1; }
  /* 2026-05-02 — honesty chip for prediction accuracy. Sub-50% accuracy is
     worse than coin-flip and shouldn't be marketed as a signal; the chip
     forces the credibility caveat into the same visual frame as the number. */
  .pred-accuracy .pa-chip {
    margin-top: var(--sp-2xs);
    padding: 2px 6px;
    font: 700 var(--fs-mono-xs) var(--mono);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    border-radius: var(--r-pill);
    white-space: nowrap;
  }
  .pred-accuracy .pa-chip-warn {
    background: rgba(255, 94, 127, 0.12);
    color: var(--red);
    border: 1px solid rgba(255, 94, 127, 0.35);
  }
  .pred-accuracy .pa-chip-tracking {
    background: rgba(116, 152, 253, 0.12);
    color: var(--blue);
    border: 1px solid rgba(116, 152, 253, 0.35);
  }
  /* 2026-05-02 reframe — per-field table groups (trade-grade vs tracking
     vs below-grade). Group label is mono caps, color-coded by group; the
     below-grade group is tucked inside <details> for transparency without
     defaulting to "wall of bad numbers." */
  .pa-group { margin-top: var(--sp-md); }
  .pa-group:first-child { margin-top: 0; }
  .pa-group-label {
    font: 700 var(--fs-mono-sm) var(--mono);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-dim);
    margin-bottom: 6px;
  }
  .pa-group-good .pa-group-label { color: var(--green); }
  .pa-group-tracking .pa-group-label { color: var(--blue); }
  .pa-group-bad .pa-group-label { color: var(--red); opacity: 0.85; }
  .pa-empty {
    padding: var(--sp-md);
    border: 1px dashed var(--border);
    border-radius: var(--r-md);
    color: var(--text-dim);
    font: 400 var(--fs-body-sm)/1.5 var(--font-body);
    background: rgba(255, 94, 127, 0.04);
  }
  .pa-subdetails {
    margin-top: var(--sp-md);
    padding-top: var(--sp-sm);
    border-top: 1px dashed var(--border);
  }
  .pa-subdetails > summary {
    font: 600 var(--fs-mono-sm) var(--mono);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--red);
    opacity: 0.75;
    cursor: pointer;
    padding: var(--sp-2xs) 0;
  }
  .pa-subdetails > summary:hover { opacity: 1; }
  .pa-subdetails[open] > summary { margin-bottom: var(--sp-sm); opacity: 1; }

  /* Closing price card — AI numeric prediction with range + confidence */
  .pred-close-card {
    display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-lg);
    background: var(--bg-panel-2); border: 1px solid var(--border);
    border-radius: var(--r-lg); padding: 14px var(--sp-lg); margin-bottom: var(--sp-md);
    font-family: var(--mono); font-variant-numeric: tabular-nums;
  }
  @media (max-width: 720px) { .pred-close-card { grid-template-columns: 1fr; } }
  .pred-close-card .pcc-col { display: flex; flex-direction: column; gap: var(--sp-xs); }
  .pred-close-card .pcc-label {
    font-size: var(--fs-mono-xs); letter-spacing: 0.08em; text-transform: uppercase;
    color: var(--fg-muted);
  }
  .pred-close-card .pcc-price { font-size: var(--fs-display-sm); font-weight: 700; color: var(--text); }
  .pred-close-card .pcc-price.up    { color: #50FCD1; }
  .pred-close-card .pcc-price.down  { color: #FF5E7F; }
  .pred-close-card .pcc-price.flat  { color: #FFD166; }
  .pred-close-card .pcc-range {
    font-size: var(--fs-mono); color: var(--fg-muted);
  }
  .pred-close-card .pcc-range b { color: var(--text); font-weight: 600; }
  .pred-close-card .pcc-conf-bar {
    height: 4px; background: rgba(138,146,168,0.15);
    border-radius: var(--r-xs); margin-top: var(--sp-xs); overflow: hidden;
  }
  .pred-close-card .pcc-conf-fill { height: 100%; background: #50FCD1; border-radius: var(--r-xs); }

  /* Per-field accuracy table (honest scorecard) */
  .pred-accuracy-table {
    width: 100%; border-collapse: collapse; font-family: var(--mono);
    font-size: var(--fs-mono); font-variant-numeric: tabular-nums;
  }
  .pred-accuracy-table th, .pred-accuracy-table td {
    padding: var(--sp-xs) var(--sp-sm); text-align: left; border-bottom: 1px dashed rgba(255,255,255,0.04);
  }
  .pred-accuracy-table th {
    font-size: var(--fs-mono-xs); letter-spacing: 0.06em; text-transform: uppercase;
    color: var(--fg-muted); font-weight: 500;
  }
  .pred-accuracy-table td.acc-pct { text-align: right; font-weight: 600; }
  .pred-accuracy-table td.acc-pct.good { color: #50FCD1; }
  .pred-accuracy-table td.acc-pct.ok   { color: #FFD166; }
  .pred-accuracy-table td.acc-pct.bad  { color: #FF5E7F; }
  .pred-accuracy-table td.acc-n { color: var(--fg-muted); text-align: right; }

  .pred-bold {
    background: linear-gradient(135deg, rgba(80,125,252,0.10), rgba(80,252,209,0.08));
    border: 1px solid rgba(80,125,252,0.25); border-radius: var(--r-lg);
    padding: var(--sp-lg) var(--sp-lg); margin-bottom: 14px;
    position: relative; overflow: hidden;
  }
  .pred-bold::after {
    content: ''; position: absolute; top: -20px; right: -20px;
    width: 100px; height: 100px; border-radius: 50%;
    background: radial-gradient(circle, rgba(80,252,209,0.08), transparent 70%);
  }
  .pred-bold .pb-label {
    font-size: var(--fs-mono-sm); text-transform: uppercase; letter-spacing: 0.12em;
    color: var(--cyan); font-weight: 800; margin-bottom: 6px;
  }
  .pred-bold .pb-statement {
    font-size: var(--fs-body-lg); font-weight: 600; color: var(--text); line-height: 1.5; margin-bottom: var(--sp-sm);
    position: relative; z-index: 1;
  }
  .pred-bold .pb-meta {
    font-size: var(--fs-mono-sm); color: var(--fg-muted); font-family: var(--mono);
    display: flex; gap: var(--sp-lg); position: relative; z-index: 1;
    flex-wrap: wrap;
  }
  .pred-bold .pb-now { color: var(--text); }
  .pred-bold .pb-now b { color: var(--text); font-weight: 700; }
  .pred-bold .pb-now.up b   { color: #50FCD1; }
  .pred-bold .pb-now.down b { color: #FF5E7F; }
  .pred-close-card .pcc-now { color: var(--text-dim); }
  .pred-close-card .pcc-now b { color: var(--text); font-weight: 700; }
  .pred-close-card .pcc-now.up b   { color: #50FCD1; }
  .pred-close-card .pcc-now.down b { color: #FF5E7F; }
  .pred-close-card .pcc-now.flat b { color: #FFD166; }

  .pred-extra-divider {
    display: flex; align-items: center; gap: 10px;
    margin: var(--sp-lg) 0 10px; font-size: var(--fs-mono-xs); text-transform: uppercase;
    letter-spacing: 0.1em; color: var(--fg-muted); font-weight: 600;
  }
  .pred-extra-divider::after {
    content: ''; flex: 1; height: 1px;
    background: linear-gradient(90deg, var(--border), transparent);
  }
  .pred-extra-grid {
    display: grid; grid-template-columns: repeat(6, 1fr);
    gap: var(--sp-sm);
  }
  @media (max-width: 900px) {
    .pred-extra-grid { grid-template-columns: repeat(3, 1fr); }
  }
  @media (max-width: 500px) {
    .pred-extra-grid { grid-template-columns: 1fr 1fr; }
    .pred-mini { white-space: normal; }
  }
  .pred-mini {
    background: var(--bg-panel-2); border-radius: var(--r-md); padding: 10px var(--sp-md);
    border: 1px solid var(--border); font-size: var(--fs-mono-sm);
  }
  .pred-mini.yes { border-color: rgba(74,222,128,0.25); }
  .pred-mini.no { border-color: rgba(248,113,113,0.25); }
  .pred-mini.neutral { border-color: rgba(245,158,11,0.20); }
  .pred-mini .pm-label { color: var(--fg-muted); font-size: var(--fs-mono-xs); margin-bottom: var(--sp-2xs); }
  .pred-mini .pm-val { font-weight: 700; font-family: var(--mono); font-size: var(--fs-body-sm); }
  .pred-mini .pm-val.yes { color: #50FCD1; }
  .pred-mini .pm-val.no { color: #FF5E7F; }
  .pred-mini .pm-conf { font-family: var(--mono); font-size: 8px; color: var(--fg-muted); font-variant-numeric: tabular-nums; }

  /* Nav "More" dropdown (FINDING-004) */
  .cw-nav { position: sticky; }
  .cw-nav-inner { position: relative; }
  .cw-nav-more-btn {
    display: inline-flex; align-items: center; gap: var(--sp-xs);
    padding: var(--sp-xs) var(--sp-md);
    font-family: var(--mono); font-size: var(--fs-mono-sm);
    text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--text-dim); text-decoration: none;
    border: 1px solid var(--border);
    border-radius: var(--r-pill);
    background: var(--bg-panel);
    cursor: pointer;
    transition: all 0.15s;
    white-space: nowrap;
  }
  .cw-nav-more-btn:hover {
    color: var(--text); border-color: var(--blue);
  }
  .cw-nav-more-btn[aria-expanded="true"] {
    color: var(--cyan); border-color: var(--cyan);
    background: rgba(80,252,209,0.08);
  }
  .cw-nav-more-btn.has-active {
    color: var(--cyan); border-color: var(--cyan);
    background: rgba(80,252,209,0.08);
  }
  .cw-nav-more-caret {
    font-size: var(--fs-mono-xs);
    transition: transform 0.15s ease-out;
  }
  .cw-nav-more-btn[aria-expanded="true"] .cw-nav-more-caret {
    transform: rotate(180deg);
  }

  /* Desktop: dropdown floating from the button — v10 fix: position:fixed
     so overflow:auto on .cw-nav-inner doesn't clip the dropdown. JS sets
     top/left coordinates from the button rect on open. */
  @media (min-width: 769px) {
    .cw-nav-more-group {
      position: fixed;
      top: 0; left: 0;
      display: none; flex-direction: column;
      padding: 6px; gap: 3px;
      background: var(--bg-panel);
      border: 1px solid var(--border);
      border-radius: var(--r-md);
      box-shadow: 0 12px 28px rgba(0,0,0,0.55),
                  0 0 0 1px rgba(80,125,252,0.12);
      z-index: 60;
      min-width: 160px;
    }
    .cw-nav-more-group.open {
      display: flex;
      animation: cw-more-pop 0.16s ease-out;
    }
    @keyframes cw-more-pop {
      from { opacity: 0; transform: translateY(-4px); }
      to   { opacity: 1; transform: translateY(0); }
    }
    .cw-nav-more-group a {
      text-align: left;
      background: transparent;
      border: 1px solid transparent;
      padding: var(--sp-sm) var(--sp-md);
      border-radius: var(--r-sm);
      font-family: var(--mono); font-size: var(--fs-mono-sm);
      text-transform: uppercase; letter-spacing: 0.06em;
      color: var(--text-dim); text-decoration: none;
      transition: all 0.12s;
    }
    .cw-nav-more-group a:hover {
      background: rgba(80,125,252,0.1);
      color: var(--text);
      border-color: transparent;
    }
    .cw-nav-more-group a.active {
      color: var(--cyan);
      background: rgba(80,252,209,0.08);
      border-color: transparent;
    }
  }

  /* Mobile: hide the More button entirely, let the group's links flow inline
     as normal nav pills (so the current scroll-fade behavior is preserved). */
  @media (max-width: 768px) {
    .cw-nav-more-btn { display: none; }
    .cw-nav-more-group { display: contents; }
  }


  /* Mobile brand shrink (topbar overflow fix) */
  @media (max-width: 600px) {
    header.topbar {
      padding: 10px 14px;
      flex-wrap: wrap;
      gap: 10px;
    }
    header.topbar .brand { gap: var(--sp-sm); }
    header.topbar .brand-logo {
      height: 22px;
      filter: drop-shadow(0 0 10px rgba(80,125,252,0.20));
    }
    header.topbar .brand-divider { height: 18px; }
    header.topbar .brand-product {
      font-size: var(--fs-mono);
      letter-spacing: 0.18em;
      padding-bottom: 1px;
    }
    header.topbar .brand-docs-link {
      font-size: var(--fs-mono-xs);
      padding: 3px var(--sp-sm);
      margin-left: var(--sp-sm);
      letter-spacing: 0.08em;
    }
  }
  @media (max-width: 420px) {
    header.topbar .brand-product { display: none; }
    header.topbar .brand-divider { display: none; }
  }

  /* ─── Mobile hamburger + drawer ────────────────────────────────────────
     Topbar collapses on ≤768px: secondary nav (Docs/Changelog/search/Time
     Machine) hides, ☰ button appears at right, drawer reveals the same
     actions. Status chips stay inline (already pending-hidden until data
     lands). Pill nav becomes single-row horizontal scroll. */
  .topbar-menu-btn {
    display: none;
    background: transparent;
    border: 1px solid var(--border);
    color: var(--text-dim);
    font-size: var(--fs-ui-lg);
    line-height: 1;
    width: 36px;
    height: 36px;
    border-radius: var(--r-md);
    cursor: pointer;
    transition: color .15s ease, border-color .15s ease, background .15s ease;
  }
  .topbar-menu-btn:hover { color: var(--cyan); border-color: var(--cyan); background: rgba(80,252,209,0.06); }
  .topbar-menu-btn[aria-expanded="true"] { color: var(--cyan); border-color: var(--cyan); background: rgba(80,252,209,0.08); }

  .topbar-drawer {
    position: absolute;
    top: 100%; right: 14px;
    margin-top: 6px;
    z-index: 90;
    display: flex;
    flex-direction: column;
    min-width: 220px;
    padding: 6px;
    background: var(--bg-panel);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    box-shadow: 0 12px 32px rgba(0,0,0,0.55);
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
  }
  .topbar-drawer[hidden] { display: none; }
  .topbar-drawer a,
  .topbar-drawer .td-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px var(--sp-md);
    color: var(--text-dim);
    text-decoration: none;
    background: transparent;
    border: 0;
    border-radius: var(--r-sm);
    cursor: pointer;
    font-family: inherit;
    font-size: inherit;
    text-align: left;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    transition: color .15s ease, background .15s ease;
  }
  .topbar-drawer a:hover,
  .topbar-drawer .td-item:hover { color: var(--text); background: rgba(255,255,255,0.04); }
  .topbar-drawer .td-icon { font-size: var(--fs-body-lg); line-height: 1; width: 16px; text-align: center; }

  /* On mobile, the TM popover repositions as a centered modal so it can
     render even when its inline parent is collapsed inside the topbar. */
  @media (max-width: 768px) {
    /* Force topbar back to a tight single row, kill horizontal scroll. */
    header.topbar {
      flex-wrap: nowrap !important;
      overflow-x: visible !important;
      gap: 10px !important;
      position: relative;
    }
    header.topbar .brand { flex-shrink: 1; min-width: 0; }
    header.topbar .topbar-right {
      display: contents !important; /* let status-strip flow inline; hide other kids */
    }
    /* Hide the inline secondary actions — they live in the drawer now. */
    header.topbar .topbar-right .nav-links,
    header.topbar .topbar-right .search-btn { display: none !important; }
    /* TM moved out of topbar-right (2026-04-28) — selector unscoped so the
       drawer entry remains the mobile path. */
    .time-machine .tm-trigger { display: none !important; }
    /* Status strip stays inline (BTC chip + regime are pending-hidden by
       default; conn dot stays small). Pushed right. */
    header.topbar .topbar-right .status-strip {
      margin-left: auto !important;
      gap: var(--sp-sm) !important;
      font-size: var(--fs-mono-sm) !important;
    }
    /* Show hamburger as last topbar child (use CSS order since markup
       places it before .topbar-right). */
    header.topbar .topbar-menu-btn {
      display: inline-flex; align-items: center; justify-content: center;
      flex-shrink: 0; order: 99; margin-left: auto;
    }
    /* Status strip then sits just before the hamburger. */
    header.topbar .topbar-right .status-strip { order: 98; margin-left: 0 !important; }
    /* TM popover becomes a centered modal so it shows even when the
       inline trigger is hidden. */
    .tm-popover {
      position: fixed !important;
      top: 50% !important; left: 50% !important;
      right: auto !important;
      transform: translate(-50%, -50%);
      width: calc(100vw - 32px);
      max-width: 360px;
      z-index: 200;
      flex-wrap: wrap;
      white-space: normal;
      box-shadow: 0 0 0 100vmax rgba(0,0,0,0.6), 0 12px 32px rgba(0,0,0,0.55);
    }
  }

  /* Pill nav: single-row horizontal scroll on mobile (was wrapping to
     2 rows which the user flagged as ugly). Hide scrollbar; subtle right
     edge fade hints scrollability. */
  @media (max-width: 768px) {
    .cw-nav-screens .cw-nav-inner.screen-pills {
      flex-wrap: nowrap !important;
      overflow-x: auto;
      -webkit-overflow-scrolling: touch;
      scroll-snap-type: x proximity;
      scrollbar-width: none;
      /* 2026-05-05 mobile fix — was 85% which clipped "5 PLAN & TRACK" at
         375px. Pushed to 92% so the fade hint is subtle but the last visible
         pill isn't chopped mid-word. Right padding gives the last pill room
         to scroll fully into view beyond the fade. */
      mask-image: linear-gradient(90deg, #000 0%, #000 92%, transparent 100%);
      -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 92%, transparent 100%);
      padding-right: 14px;
    }
    .cw-nav-screens .cw-nav-inner.screen-pills::-webkit-scrollbar { display: none; }
    .cw-nav-screens .screen-pill { flex: 0 0 auto; scroll-snap-align: start; }
    .cw-nav-screens .screen-pill.active { scroll-snap-align: center; }
  }

  /* 2026-05-02 audit follow-up — touch-target sizing on mobile.
     External audit flagged several controls below WCAG 2.5.5 (AAA) 44×44px:
       - .verdict-alert-toggle ("Notify me on verdict flip") was 21px tall
       - .report-toggle ("↓ Markdown") was 34px tall
     The legacy info-button path was removed 2026-05-06 after it caused
     duplicate ⓘ icons beside the newer panel info-icon injector. */
  @media (max-width: 768px) {
    .verdict-alert-toggle {
      min-height: 44px;
      padding: 10px var(--sp-md);
    }
    .report-toggle {
      min-height: 44px;
      padding: 10px var(--sp-md);
    }
  }

  /* Mobile overflow containment (fix horizontal page scroll leak) */
  @media (max-width: 900px) {
    html, body { overflow-x: clip; }
    #funding-body,
    .funding-scroll,
    .panel-body .scroll-x {
      overflow-x: auto;
      -webkit-overflow-scrolling: touch;
      scrollbar-width: thin;
    }
    #funding-body table.funding {
      min-width: 600px;
    }
    /* Give the scrolling area a visual affordance — subtle right-edge fade */
    #funding-body {
      position: relative;
      mask-image: linear-gradient(90deg, #000 0%, #000 94%, transparent 100%);
      -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 94%, transparent 100%);
    }
    #funding-body::-webkit-scrollbar { height: 4px; }
    #funding-body::-webkit-scrollbar-thumb {
      background: var(--border); border-radius: var(--r-xs);
    }
  }

  /* Perplexity catalysts panel */
  .cat-item {
    list-style: none;
    padding: 10px var(--sp-md);
    margin-bottom: 6px;
    background: var(--bg-panel-2);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    font-family: var(--mono);
  }
  .cat-item .cat-top {
    display: flex; align-items: center; gap: var(--sp-sm);
    margin-bottom: var(--sp-xs);
    flex-wrap: wrap;
  }
  .cat-item .cat-date {
    font-size: var(--fs-mono-sm);
    color: var(--cyan);
    background: rgba(80, 252, 209, 0.08);
    padding: var(--sp-2xs) 6px;
    border-radius: var(--r-xs);
    font-weight: 700;
    letter-spacing: 0.04em;
    white-space: nowrap;
  }
  .cat-item .cat-event {
    font-size: var(--fs-body-sm);
    color: var(--text);
    font-weight: 600;
    flex: 1;
    min-width: 0;
  }
  .cat-item .cat-tags { display: flex; gap: var(--sp-xs); }
  .cat-item .cat-tag {
    font-size: 8px;
    padding: var(--sp-2xs) var(--sp-xs);
    border-radius: var(--r-xs);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-weight: 700;
  }
  .cat-item .cat-tag.impact-high { background: rgba(255,94,127,0.15); color: var(--red); }
  .cat-item .cat-tag.impact-medium { background: rgba(255,148,87,0.15); color: var(--orange); }
  .cat-item .cat-tag.impact-low { background: rgba(138,146,168,0.15); color: var(--text-dim); }
  .cat-item .cat-tag.dir-bullish { background: rgba(80,252,209,0.15); color: var(--cyan); }
  .cat-item .cat-tag.dir-bearish { background: rgba(255,94,127,0.15); color: var(--red); }
  .cat-item .cat-tag.dir-neutral { background: rgba(138,146,168,0.15); color: var(--text-dim); }
  .cat-item .cat-tag.dir-volatile { background: rgba(255,209,102,0.15); color: var(--yellow); }
  .cat-item .cat-bot {
    display: flex; align-items: flex-start; gap: var(--sp-sm);
    font-size: var(--fs-mono-sm);
  }
  .cat-item .cat-cat {
    font-size: 8px;
    color: var(--purple);
    background: rgba(116,152,253,0.1);
    padding: var(--sp-2xs) var(--sp-xs);
    border-radius: var(--r-xs);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    white-space: nowrap;
  }
  .cat-item .cat-note {
    color: var(--text-dim);
    line-height: 1.45;
    flex: 1;
  }

  /* Perplexity trending panel */
  .trend-card {
    padding: 10px var(--sp-md);
    margin-bottom: 6px;
    background: var(--bg-panel-2);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
  }
  .trend-card .trend-head {
    display: flex; align-items: center; gap: var(--sp-sm);
    margin-bottom: var(--sp-xs);
    flex-wrap: wrap;
  }
  .trend-card .trend-topic {
    font-family: var(--mono);
    font-size: var(--fs-mono);
    font-weight: 700;
    color: var(--text);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    flex: 1;
    min-width: 0;
  }
  .trend-card .trend-tags { display: flex; gap: var(--sp-xs); }
  .trend-card .trend-tag {
    font-size: 8px;
    padding: var(--sp-2xs) var(--sp-xs);
    border-radius: var(--r-xs);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-weight: 700;
    font-family: var(--mono);
  }
  .trend-card .trend-tag.mom-rising { background: rgba(80,252,209,0.15); color: var(--cyan); }
  .trend-card .trend-tag.mom-sustained { background: rgba(80,125,252,0.15); color: var(--blue); }
  .trend-card .trend-tag.mom-fading { background: rgba(138,146,168,0.15); color: var(--text-dim); }
  .trend-card .trend-tag.sent-bullish { background: rgba(80,252,209,0.15); color: var(--cyan); }
  .trend-card .trend-tag.sent-bearish { background: rgba(255,94,127,0.15); color: var(--red); }
  .trend-card .trend-tag.sent-neutral { background: rgba(138,146,168,0.15); color: var(--text-dim); }
  .trend-card .trend-tag.sent-mixed { background: rgba(255,209,102,0.15); color: var(--yellow); }
  .trend-card .trend-desc {
    font-size: var(--fs-mono);
    color: var(--text-dim);
    line-height: 1.5;
    margin: var(--sp-xs) 0;
  }
  .trend-card .trend-source {
    font-family: var(--mono);
    font-size: var(--fs-mono-xs);
    color: var(--text-dimmer);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin-top: 3px;
  }

  /* Sentiment sparkline (Option C) */
  .sent-spark-wrap {
    margin: var(--sp-xs) 0 6px;
    height: 28px;
    width: 100%;
  }
  .sent-spark {
    width: 100%;
    height: 28px;
    display: block;
  }
  .sent-spark-zero {
    stroke: var(--border);
    stroke-width: 1;
    stroke-dasharray: 2 3;
    opacity: 0.5;
  }
  .sent-spark-area {
    fill: rgba(80, 125, 252, 0.15);
  }
  .sent-spark-line {
    fill: none;
    stroke: var(--blue);
    stroke-width: 1.5;
    stroke-linejoin: round;
    stroke-linecap: round;
  }
  .sent-spark-dot {
    fill: var(--cyan);
    stroke: var(--bg-panel-2);
    stroke-width: 1.5;
  }

  /* Panel Navigator FAB removed 2026-05-05 — operator: "delete this,
     not using this anymore." */
  /* WCAG Skip to content link */
  .skip-link {
    position: absolute;
    top: -40px;
    left: 0;
    background: var(--brand-neon-blue);
    color: white;
    padding: var(--sp-sm) var(--sp-lg);
    z-index: 9999;
    transition: top 0.2s;
    text-decoration: none;
    font-family: var(--font-display);
    font-weight: 600;
    border-radius: 0 0 var(--r-sm) 0;
  }
  .skip-link:focus {
    top: 0;
  }
  @media (max-width: 600px) {
  }

  /* Sprint 4 / Option B: Mobile Responsive Pass */
  @media (max-width: 768px) {
    .cw-container { flex-direction: column !important; }
    .sidebar { width: 100% !important; border-right: none !important; border-bottom: 1px solid var(--border); display: flex; flex-direction: row; overflow-x: auto; white-space: nowrap; padding: 10px; }
    .content { padding: 10px !important; }
    .t1-grid { grid-template-columns: 1fr !important; }
    .hunter-bento-grid { grid-template-columns: 1fr 1fr !important; }
    /* topbar layout handled by "Mobile topbar overrides (final)" block — single row */
    .whale-table { display: block; overflow-x: auto; white-space: nowrap; }
  }

  /* NOTE: a stray script block used to live here inside the style
     element (legacy light-mode cleanup). It broke CSS parsing for the
     mobile table-to-card rules below it, leaving Multi-Asset Intelligence
     and other sc-table panels as fixed-width tables overflowing past
     the viewport on phones. Script was moved out 2026-04-25.
     IMPORTANT: do not write the literal lt-slash-style sequence in
     comments inside this style block — the HTML parser closes the
     style element on it regardless of CSS comment syntax. */

  /* COM-102: Mobile Breakpoint Pass */
  @media (max-width: 768px) {
    /* Navigation: bottom tab bar.
       NOTE: must reset top/height here. The base .cw-nav rule sets
       `position: sticky; top: 0; align-items: center;` — without
       `top: auto`, the inherited `top: 0` combines with `bottom: 0`
       to stretch the fixed nav to full viewport height, vertically
       centering the pills with the panel's translucent backdrop
       hiding all content behind it. (2026-04-26 mobile regression fix.) */
    .cw-nav-screens {
      position: fixed;
      top: auto;
      bottom: 0;
      left: 0;
      right: 0;
      height: auto;
      background: var(--bg-panel);
      border-top: 1px solid var(--border);
      z-index: 1000;
      padding: var(--sp-sm) var(--sp-xs) var(--sp-lg);
      margin: 0 !important;
      overflow-x: auto;
      -webkit-overflow-scrolling: touch;
      scrollbar-width: none;
    }
    .cw-nav-screens::-webkit-scrollbar { display: none; }
    .cw-nav-screens .screen-pills {
      justify-content: flex-start;
      gap: var(--sp-xs) !important;
      flex-wrap: nowrap !important;
      margin-bottom: 0 !important;
      scroll-snap-type: x proximity;
    }
    .screen-pill {
      flex: 0 0 auto;
      padding: 6px var(--sp-md) !important;
      font-size: var(--fs-mono) !important;
      letter-spacing: 0.06em !important;
      text-align: center;
      min-height: 36px;
      display: flex;
      align-items: center;
      justify-content: center;
      white-space: nowrap;
      scroll-snap-align: start;
    }
    /* 2026-05-05 — 375px micro-breakpoint for iPhone SE / small phones.
       Tighter pill padding + smaller letter-spacing so more tab labels fit
       in the initial viewport without clipping. */
    @media (max-width: 390px) {
      .screen-pill {
        padding: 6px 10px !important;
        letter-spacing: 0.04em !important;
        font-size: 10px !important;
      }
      /* Ensure the last pill can scroll fully past the fade mask */
      .cw-nav-screens .cw-nav-inner.screen-pills {
        padding-right: 20px;
      }
      /* Tighter body padding on very small screens */
      body { padding: 6px !important; }
      .panel-body { padding: 10px !important; }
    }
    body { padding-bottom: 70px !important; }

    /* Mobile: hide the floating Panel Navigator FAB. The bottom tab bar
       (1 VERDICT / 2 CYCLE / ...) already segments the page and the FAB
       overlapped the tab bar at the right edge. Stays on desktop where
       it doesn't conflict. (2026-04-26.) */

    /* Stack priorities */
    .topbar { padding: var(--sp-md) var(--sp-lg) !important; }
    .status-strip { flex-direction: column; align-items: flex-start; gap: var(--sp-xs); }
    .panel-stack { display: flex; flex-direction: column; }

    /* Tables to Cards */
    .pred-table, .etf-table, .lth-historical-table, .sc-table, .backtest-table,
    .pred-table tbody, .etf-table tbody, .lth-historical-table tbody, .sc-table tbody, .backtest-table tbody,
    .pred-table tr, .etf-table tr, .lth-historical-table tr, .sc-table tr, .backtest-table tr,
    .pred-table td, .etf-table td, .lth-historical-table td, .sc-table td, .backtest-table td {
      display: block;
      width: 100%;
    }
    .pred-table thead, .etf-table thead, .lth-historical-table thead, .sc-table thead, .backtest-table thead {
      display: none;
    }
    .pred-table tr, .etf-table tr, .lth-historical-table tr, .sc-table tr, .backtest-table tr {
      margin-bottom: var(--sp-md);
      border: 1px solid var(--border);
      border-radius: var(--r-md);
      padding: var(--sp-sm);
      background: rgba(255,255,255,0.02);
    }
    .pred-table td, .etf-table td, .lth-historical-table td, .sc-table td, .backtest-table td {
      border: none !important;
      border-bottom: 1px solid rgba(255,255,255,0.05) !important;
      padding: 6px var(--sp-sm) 6px 40% !important;
      text-align: right !important;
      position: relative;
    }
    .pred-table td:last-child, .etf-table td:last-child, .lth-historical-table td:last-child, .sc-table td:last-child, .backtest-table td:last-child {
      border-bottom: none !important;
    }

    /* Label Injections */
    /* ETF Table */
    .etf-table td:nth-child(1)::before { content: "Fund"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .etf-table td:nth-child(2)::before { content: "Latest day"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .etf-table td:nth-child(3)::before { content: "7d net"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .etf-table td:nth-child(4)::before { content: "30d net"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }

    /* Scenarios Table */
    .sc-table td:nth-child(1)::before { content: "Asset"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .sc-table td:nth-child(2)::before { content: "Direction"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .sc-table td:nth-child(3)::before { content: "Confidence"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .sc-table td:nth-child(4)::before { content: "Trigger"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }

    /* Prediction Table */
    .pred-table td:nth-child(1)::before { content: "Engine"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .pred-table td:nth-child(2)::before { content: "Signal"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .pred-table td:nth-child(3)::before { content: "Conviction"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .pred-table td:nth-child(4)::before { content: "Logic"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }

    /* Backtest Table */
    .backtest-table td:nth-child(1)::before { content: "Metric"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .backtest-table td:nth-child(2)::before { content: "Longs"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .backtest-table td:nth-child(3)::before { content: "Shorts"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .backtest-table td:nth-child(4)::before { content: "Total"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }

    /* LTH Historical Table */
    .lth-historical-table td:nth-child(1)::before { content: "Cycle / Event"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .lth-historical-table td:nth-child(2)::before { content: "Peak Spend"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }
    .lth-historical-table td:nth-child(3)::before { content: "Capitulation Bottom"; position: absolute; left: 8px; font-weight: 600; color: var(--text-dim); }

    /* Pred-table override — labels (Engine/Signal/Conviction/Logic) max 10
       chars, don't need 40%. Was forcing "Funding + macro momentum" to wrap
       one word per line because the right column ended up ~210px. Drop label
       reserve to 28% (~110px) and let the value column breathe. Also unwrap
       the THIS WEEK chip + scope description so they sit on one logical
       block aligned right. */
    .pred-table td {
      padding: 8px var(--sp-sm) 8px 28% !important;
    }
    /* Desktop sets .pred-tf-cell { width: 100px } to constrain the timeframe
       column. On mobile the table reflows to stacked cards via display:block,
       but that 100px width became the cell width — value column got 8px after
       the 28% padding ate everything. Force full width on mobile. Same for
       all 4 cells in the row (dir, trade, conf) — any leftover desktop width
       constraints get reset. */
    .pred-table td.pred-tf-cell,
    .pred-table td.pred-dir-cell,
    .pred-table td.pred-trade-cell,
    .pred-table td.pred-conf-cell {
      width: 100% !important;
      max-width: none !important;
    }
    .pred-table td.pred-tf-cell .pred-tf-badge {
      display: inline-block;
      margin-bottom: 4px;
    }
    .pred-table td.pred-tf-cell .pred-scope {
      white-space: normal;
      word-break: normal;
      overflow-wrap: normal;
      line-height: 1.4;
    }
  }

  /* Pinch-zoomable charts */
  /* Timeframe pills on #sec-pricechart — match the 5-pill screen nav rhythm. */
  .tf-pill {
    /* Visual size kept tight (Bloomberg density) but min-height bumped to
       24px for WCAG AA Target Size (2.5.8). Hit-area extended to 44px via
       ::before pseudo so chart-timeframe pills stay precise on mouse and
       finger-friendly on touch — without inflating the painted chrome. */
    position: relative;
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    padding: var(--sp-xs) var(--sp-sm);
    min-height: 24px;
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    border-radius: var(--r-sm);
    background: var(--bg-panel);
    color: var(--text-dim);
    border: 1px solid var(--border);
    cursor: pointer;
    transition: color var(--dur-instant) var(--ease-out), border-color var(--dur-instant) var(--ease-out), background var(--dur-instant) var(--ease-out);
  }
  .tf-pill::before {
    content: "";
    position: absolute;
    inset: -10px -2px;
    /* invisible 44px-tall hit area for touch */
  }
  .tf-pill:hover { color: var(--text); border-color: var(--blue); }
  .tf-pill.active { color: var(--cyan); border-color: var(--cyan); background: rgba(80, 252, 209, 0.08); }
  .tf-pill:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

  .tv-lightweight-charts, .etf-chart, .backtest-chart {
    touch-action: pan-x pan-y pinch-zoom !important;
  }

  /* Sprint 4 / Option B: Mobile Responsive Pass */
  @media (max-width: 768px) {
    .cw-container { flex-direction: column !important; }
    .sidebar { width: 100% !important; border-right: none !important; border-bottom: 1px solid var(--border); display: flex; flex-direction: row; overflow-x: auto; white-space: nowrap; padding: 10px; }
    .content { padding: 10px !important; }
    .t1-grid { grid-template-columns: 1fr !important; }
    .hunter-bento-grid { grid-template-columns: 1fr 1fr !important; }
    /* topbar layout handled by "Mobile topbar overrides (final)" block — single row */
    .whale-table { display: block; overflow-x: auto; white-space: nowrap; }
  }


  /* Header topbar — 3-zone layout: [brand] [utilities] [controls].
     Single row at all viewports ≥1200px, items vertically centered, tight gaps.
     Uses !important to override scattered legacy overrides still in this file. */
  header.topbar {
    display: flex !important;
    align-items: center !important;
    gap: var(--sp-lg) !important;
    flex-wrap: nowrap !important;
    margin-bottom: var(--sp-lg);
    padding-bottom: var(--sp-md);
    border-bottom: 1px solid var(--border);
    overflow-x: auto;
  }
  header.topbar .brand { display: flex; align-items: center; gap: var(--sp-md); flex-shrink: 0; }
  /* Removed nested-in-.brand override that compressed gap to 4px and
     margin-left to 8px (was diverging from Hunter/Desk/Intelligence
     which all use 10px gap + 20px margin-left). Canonical .surface-nav
     rule at ~line 308 now applies uniformly. 2026-05-04. */
  header.topbar .brand h1.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
  header.topbar .topbar-utilities {
    display: flex !important; align-items: center !important; gap: 10px !important;
    padding-left: var(--sp-md) !important; border-left: 1px solid var(--border) !important;
    flex-shrink: 0;
  }
  header.topbar .search-btn {
    background: transparent !important; border: 1px solid var(--border) !important; border-radius: var(--r-sm) !important;
    color: var(--text-dim) !important; font-size: var(--fs-mono) !important; padding: 0 10px !important;
    min-height: 32px !important; cursor: pointer !important; font-family: var(--mono) !important;
    display: inline-flex !important; align-items: center !important;
  }
  header.topbar .search-btn:hover { background: rgba(255,255,255,0.04) !important; color: var(--text) !important; }
  header.topbar .brand-docs-link,
  header.topbar .changelog-link {
    color: var(--text-dim) !important; text-decoration: none !important;
    font-size: var(--fs-mono) !important; font-family: var(--mono) !important;
    text-transform: uppercase !important; letter-spacing: 0.08em !important;
    padding: 0 var(--sp-sm) !important; min-height: 32px !important;
    display: inline-flex !important; align-items: center !important;
    margin: 0 !important; border-radius: var(--r-sm) !important;
  }
  header.topbar .brand-docs-link:hover,
  header.topbar .changelog-link:hover { color: var(--text) !important; }
  header.topbar .topbar-controls {
    margin-left: auto !important;
    display: flex !important; align-items: center !important; gap: var(--sp-md) !important;
    flex-wrap: nowrap !important; flex-shrink: 0;
  }
  /* Unified right-side group, mirrors Hunter topbar structure (2026-04-24) */
  header.topbar .topbar-right {
    margin-left: auto !important;
    display: flex !important; align-items: center !important; gap: var(--sp-md) !important;
    flex-wrap: nowrap !important; flex-shrink: 0;
  }
  header.topbar .status-strip {
    display: flex !important; align-items: center !important; gap: var(--sp-md) !important;
    flex-wrap: nowrap !important;
  }
  header.topbar .btc-price-chip {
    font-weight: 700 !important; color: var(--text) !important; font-family: var(--mono) !important;
    white-space: nowrap !important; display: inline-flex !important; align-items: center !important;
    font-size: var(--fs-body-sm) !important; letter-spacing: 0 !important;
    font-variant-numeric: tabular-nums;
  }
  header.topbar .regime-badge {
    font-weight: 600 !important; font-family: var(--mono) !important;
    font-size: var(--fs-mono-sm) !important; text-transform: uppercase !important; letter-spacing: 0.06em !important;
    margin: 0 !important; padding: var(--sp-xs) var(--sp-sm) !important; border-radius: var(--r-sm) !important;
    background: var(--bg-panel-2) !important; white-space: nowrap !important;
    display: inline-flex !important; align-items: center !important;
  }
  /* Hide the BTC + regime chips until they hold real data — otherwise users
     see naked "—" placeholders right next to the Time Machine button during
     first page load. JS removes the .pending class once content lands. */
  header.topbar .btc-price-chip.pending,
  header.topbar .regime-badge.pending { display: none !important; }
  header.topbar .tradfi-strip {
    display: flex !important; align-items: center !important; gap: 10px !important;
    padding: 0 var(--sp-md) !important; margin: 0 !important;
    border-left: 1px solid var(--border) !important; border-right: 1px solid var(--border) !important;
    font-family: var(--mono) !important; font-size: var(--fs-mono-sm) !important; white-space: nowrap !important;
    color: var(--text-dim);
  }
  header.topbar .tradfi-strip .val { font-variant-numeric: tabular-nums; margin-left: var(--sp-2xs); }
  header.topbar .conn-status, header.topbar .last-update-text {
    white-space: nowrap !important; display: inline-flex !important; align-items: center !important;
    font-family: var(--mono); font-size: var(--fs-mono-sm); color: var(--text-dim);
  }
  header.topbar .tm-trigger { min-height: 32px; white-space: nowrap; }
  /* Hide the "NEW" badge on Time Machine — it's been NEW for weeks */
  header.topbar .tm-trigger .tm-new-badge, header.topbar [class*="badge"][data-new="true"] { display: none !important; }

  /* Equity Curve Backtest panel — audit recommendation #5. 2026-04-24. */
  .ec-stats {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-lg);
    margin: var(--sp-sm) 0 var(--sp-lg);
  }
  .ec-col {
    background: rgba(20, 24, 33, 0.4);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    padding: 10px 14px;
  }
  .ec-col-title {
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    margin-bottom: 6px;
  }
  .ec-kv {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    padding: 3px 0;
    font-size: var(--fs-mono);
    color: var(--text-dim);
    border-bottom: 1px dashed rgba(35,40,56,0.4);
  }
  .ec-kv:last-child { border-bottom: 0; }
  .ec-kv b {
    font-family: var(--mono);
    font-size: var(--fs-body-sm);
    color: var(--text);
    font-weight: 600;
  }
  .ec-chart-wrap {
    background: rgba(10, 13, 20, 0.5);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    padding: var(--sp-md) var(--sp-md) var(--sp-sm);
  }
  .ec-legend {
    display: flex;
    gap: var(--sp-lg);
    font-family: var(--mono);
    font-size: var(--fs-mono-sm);
    color: var(--text-dim);
    margin-top: var(--sp-sm);
    flex-wrap: wrap;
  }
  .ec-legend .ec-sw {
    display: inline-block;
    width: 10px;
    height: 3px;
    vertical-align: middle;
    margin-right: var(--sp-xs);
    border-radius: 1px;
  }
  @media (max-width: 720px) {
    .ec-stats { grid-template-columns: 1fr; }
  }

  /* ──────────────────────────────────────────────────────────────────
     Nothing design — iteration 2, 2026-04-25. Bounded experiment on
     #sec-composite landed well; now promoting selectively:
       - ALL panel heads get Space Mono ALL CAPS + subtle dot-grid
       - Composite score (+2) and Heat score (32px heroes) get Doto
       - Topbar BTC price gets Space Mono (12px — too small for Doto)
     Aquamarine signal preserved; red not introduced. Reversible by
     deleting this block + the Google Fonts <link> above.
     ────────────────────────────────────────────────────────────────── */

  /* Panel heads globally — 'instrument panel' treatment across all panels. */
  .panel-head {
    font-family: "Space Mono", var(--mono);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    background-image: radial-gradient(circle, rgba(255,255,255,0.06) 1px, transparent 1px);
    background-size: 14px 14px;
    background-position: 0 0;
  }
  /* Composite panel gets slightly more contrast on its dot-grid since it's
     the hero surface. */
  #sec-composite .panel-head {
    background-image: radial-gradient(circle, rgba(255,255,255,0.10) 1px, transparent 1px);
    letter-spacing: 0.1em;
  }
  /* Hero verdict text: Doto dot-matrix at display size. Preserves existing
     color classes (.bull/.bear/.warn/.neutral) — we're swapping the shape
     of the letters, not the palette. */
  #sec-composite .gauge-verdict {
    font-family: "Doto", "Space Mono", var(--mono);
    font-weight: 700;
    letter-spacing: 0.02em;
  }
  /* Hero-scale numbers across Macro — Doto is Nothing's dot-matrix
     display face, min 32px is where it reads cleanly. Applied to the
     biggest numbers on the page: composite score, altseason score,
     market heat, Fear & Greed (48-58px). LTH SOPR / Puell / Pi-Cycle
     values (.cg-cyc-value at 22px, 18px mobile) intentionally excluded
     — below Doto legibility floor. Tabular numerics elsewhere stay
     Fira Code per DESIGN.md. */
  #sec-composite #altseason-score,
  #sec-composite .gauge-score-num,
  #sec-heat .heat-score,
  #sec-fg .fg-value {
    font-family: "Doto", "Fira Code", var(--mono) !important;
    font-weight: 700;
    letter-spacing: 0.01em;
  }

  /* Topbar BTC price — 12px is below Doto's legibility floor, so we use
     Space Mono (Nothing-family, monospace) instead for the Nothing hit
     without killing readability. */
  header.topbar .btc-price-chip {
    font-family: "Space Mono", var(--mono) !important;
  }
  /* Labels in Nothing style: Space Mono ALL CAPS with wide tracking.
     Targets the three small labels inside #sec-composite only. */
  #sec-composite .gauge-score-denom,
  #sec-composite .vat-label,
  #sec-composite .gauge-history-label {
    font-family: "Space Mono", var(--mono);
    letter-spacing: 0.1em;
  }
  /* Per-column dot-grid removed 2026-05-04 — the .cw-hero-panel utility
     now provides a continuous dot-grid across the entire panel, so the
     per-column override created a visible "two boxes" look. */

  /* Loading skeletons — audit 2026-04-24 TC-20: "No loading skeletons.
     'Mock' labels used instead of loading states — deceptive UX pattern."
     Generic shimmer placeholder to use during initial data fetches.
     Usage: <span class="skeleton skeleton-text"></span> or .skeleton-bar. */
  .skeleton {
    display: inline-block;
    background: linear-gradient(90deg,
      rgba(80, 125, 252, 0.06) 0%,
      rgba(80, 125, 252, 0.14) 50%,
      rgba(80, 125, 252, 0.06) 100%);
    background-size: 200% 100%;
    animation: skelShimmer 1.6s ease-in-out infinite;
    border-radius: var(--r-sm);
    color: transparent !important;
    vertical-align: middle;
  }
  .skeleton-text    { min-width: 40px; height: 12px; }
  .skeleton-text-lg { min-width: 80px; height: 18px; }
  .skeleton-bar     { display: block; width: 100%; height: 14px; margin: var(--sp-xs) 0; }
  .skeleton-block   { display: block; width: 100%; height: 60px; }
  @keyframes skelShimmer {
    0%   { background-position: 200% 0; }
    100% { background-position: -200% 0; }
  }
  /* When the body is in initial-loading state, swap trivially-empty
     panel values for skeleton pulses. Elements mark themselves with
     .needs-data and JS removes the class once real data lands. */
  body.is-loading .needs-data {
    animation: skelShimmer 1.6s ease-in-out infinite;
    background: linear-gradient(90deg,
      rgba(80, 125, 252, 0.06) 0%,
      rgba(80, 125, 252, 0.14) 50%,
      rgba(80, 125, 252, 0.06) 100%);
    background-size: 200% 100%;
    color: transparent !important;
    border-radius: var(--r-sm);
  }

  /* Toast notifications (ported from Hunter 2026-04-24 — audit M4 fix).
     Replaces silent button-label-only feedback on verdict-flip Notify toggle
     and future clipboard actions. */
  .toast-container {
    position: fixed; top: 48px; right: 16px; z-index: 400;
    display: flex; flex-direction: column; gap: var(--sp-sm); pointer-events: none;
  }
  .toast {
    pointer-events: auto; background: rgba(20,24,33,0.97); backdrop-filter: blur(12px);
    border: 1px solid rgba(80,125,252,0.3); border-radius: var(--r-md);
    padding: 10px 14px; min-width: 240px; max-width: 340px;
    box-shadow: 0 8px 30px rgba(0,0,0,0.4);
    animation: toastSlideIn 300ms ease-out forwards;
    display: flex; gap: var(--sp-sm); align-items: flex-start; cursor: pointer;
    transition: opacity 200ms;
  }
  .toast.dismissing { opacity: 0; transform: translateX(20px); }
  .toast-icon { font-size: var(--fs-body-lg); flex-shrink: 0; margin-top: 1px; }
  .toast-body { flex: 1; }
  .toast-title {
    font-family: var(--mono); font-size: var(--fs-mono-sm); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.05em;
    color: var(--text); margin-bottom: var(--sp-2xs);
  }
  .toast-msg { font-size: var(--fs-mono); color: var(--text-dim); line-height: 1.4; }
  .toast.warn    { border-color: rgba(255,140,105,0.4); }
  .toast.success { border-color: rgba(80,252,209,0.4); }
  .toast.info    { border-color: rgba(80,125,252,0.3); }
  @keyframes toastSlideIn {
    from { opacity: 0; transform: translateX(40px); }
    to   { opacity: 1; transform: translateX(0); }
  }


  /* ─── Mobile topbar overrides (final — must win over earlier !important
     rules at lines ~6985 that force display:flex/nowrap on .topbar-right) ── */
  @media (max-width: 768px) {
    header.topbar {
      flex-wrap: nowrap !important;
      overflow-x: visible !important;
      gap: 10px !important;
      position: relative;
    }
    header.topbar .brand { flex-shrink: 1; min-width: 0; }
    /* Mobile uses /static/cw/icon-192.png via <picture>'s 768px source —
       a proper 192x192 square icon-only asset. No cropping needed; the
       image itself is the right shape for compact display. */
    header.topbar .brand-logo {
      width: 32px !important;
      height: 32px !important;
    }
    /* Hide product label + divider — surface-nav already says which product. */
    header.topbar .brand-divider,
    header.topbar .brand-product { display: none !important; }
    /* Hide BTC price chip on mobile — it's prominent in the body's KPI tiles
       and the ACCUMULATION cycle-phase chip is more useful here. */
    header.topbar .btc-price-chip { display: none !important; }
    /* Compact regime/cycle chip to fit alongside surface-nav + ☰. */
    header.topbar .regime-badge {
      font-size: var(--fs-mono-xs) !important;
      padding: 3px 6px !important;
      letter-spacing: 0.04em !important;
    }
    /* Unified mobile surface-nav (matches Hunter + Desk exactly).
       Drop the desktop border-left + wide padding since the brand-divider
       is already hidden — no visual separator needed when items are inline. */
    header.topbar .surface-nav {
      gap: var(--sp-xs) !important;
      margin-left: 10px !important;
      padding-left: 0 !important;
      border-left: 0 !important;
      font-size: var(--fs-mono-sm) !important;
    }
    header.topbar .surface-nav a { padding: var(--sp-2xs) var(--sp-xs) !important; }
    /* Collapse .topbar-right so its kids become direct flex children of header. */
    header.topbar .topbar-right {
      display: contents !important;
    }
    /* Hide the inline secondary actions — they live in the drawer now. */
    header.topbar .topbar-right .nav-links,
    header.topbar .topbar-right .search-btn { display: none !important; }
    /* TM moved out of topbar-right (2026-04-28); unscoped so the drawer
       entry remains the only mobile path to time-machine. */
    .time-machine .tm-trigger { display: none !important; }
    /* Hide entire status strip on mobile. The connection dot, BTC chip,
       regime chip, etc. all get suppressed so row 1 is identical to
       Hunter and Desk: [icon] [surface-nav] [☰]. Page-specific status
       belongs in the drawer or body, not the brand row. */
    header.topbar .topbar-right .status-strip { display: none !important; }
    /* Hamburger sits at far right. */
    header.topbar .topbar-menu-btn {
      display: inline-flex !important;
      order: 99 !important;
      flex-shrink: 0 !important;
    }
    /* TM popover becomes a centered modal so it shows even when its inline
       trigger is hidden (drawer entry calls #tm-trigger.click()). */
    .tm-popover {
      position: fixed !important;
      top: 50% !important; left: 50% !important;
      right: auto !important;
      transform: translate(-50%, -50%);
      width: calc(100vw - 32px);
      max-width: 360px;
      z-index: 200;
      flex-wrap: wrap;
      white-space: normal;
      box-shadow: 0 0 0 100vmax rgba(0,0,0,0.6), 0 12px 32px rgba(0,0,0,0.55);
    }
  }

  /* ─── Mobile a11y + ergonomics (UI/UX Pro Max audit) ──────────────
     Shared block applied identically across Macro/Hunter/Desk:
       - 44x44 minimum tap targets (WCAG 2.5.5, iOS HIG, MD)
       - 8px gap between adjacent tappables
       - touch-action: manipulation kills 300ms tap delay on mobile
       - 16px body font on mobile (DESIGN.md 13px stays on desktop) */
  @media (max-width: 768px) {
    body { font-size: var(--fs-ui); }
    a, button, summary, [role="button"], input[type="button"], input[type="submit"],
    .screen-pill, .screen-nav-pill, .topbar-menu-btn, .pin-btn,
    .tm-trigger, .tm-btn, .search-btn, .global-search-btn,
    .alerts-settings-btn, .scroll-top-btn {
      touch-action: manipulation;
    }
    header.topbar .topbar-menu-btn {
      width: 44px !important;
      height: 44px !important;
      font-size: var(--fs-display-sm) !important;
    }
    header.topbar .surface-nav { gap: var(--sp-sm) !important; }
    header.topbar .surface-nav a {
      min-height: 44px !important;
      padding: var(--sp-sm) 10px !important;
      display: inline-flex !important;
      align-items: center !important;
    }
    .cw-nav-screens .screen-pill,
    nav.screen-nav .screen-nav-pill {
      min-height: 44px !important;
      padding: var(--sp-md) 14px !important;
      display: inline-flex !important;
      align-items: center !important;
    }
    /* Kill the legacy `.cw-nav { margin: 0 -10px 10px }` negative pull that
       made the first pill clip against the viewport's left edge. Add
       scroll-padding so scrolled pills never butt up against the edge. */
    .cw-nav-screens {
      margin-left: 0 !important;
      margin-right: 0 !important;
      scroll-padding-inline: 14px;
    }
    .cw-nav-screens .cw-nav-inner.screen-pills {
      scroll-padding-inline: 14px;
    }
    .topbar-drawer a,
    .topbar-drawer .td-item {
      min-height: 44px !important;
      padding: var(--sp-md) 14px !important;
    }
    /* Universal data-label support for table-to-card transformations.
       Beats the older table-specific nth-child rules so each row can
       carry its own labels via data-label="..." on the cell. Used by
       Multi-Asset Intelligence (sec-multi-asset-hero) and any future table
       that has more than 4 columns (the legacy nth-child rules only
       defined positioning for cells 1-4 — without explicit absolute
       positioning, cells 5+ rendered the label inline with the value
       and you got "Verdict""SELL" jammed together). */
    [data-label]::before {
      content: attr(data-label) !important;
      position: absolute !important;
      left: 8px !important;
      font-weight: 600 !important;
      color: var(--text-dim) !important;
    }
  }

  /* Narrative synthesis v2 — italic prose block populated from
     /api/intelligence/narratives/<surface>/today. Mounted below the Market
     State hero on Macro (and below the equivalent hero on Hunter + Desk in
     subsequent tasks). Hidden when the API returns 404. Token mapping:
     --aqua = --accent-aqua; --text-dim = --text-muted; --text-dim is also
     reused for --text-faint (the page does not distinguish these two). */
  .cw-narrative {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--fs-ui);
    line-height: 1.55;
    color: var(--text-dim);
    border-left: 2px solid var(--aqua);
    padding: 12px 0 12px 14px;
    margin: 16px 0 24px 0;
    max-width: 720px;
  }
  .cw-narrative-meta {
    font-family: var(--mono);
    font-size: 11px;
    letter-spacing: 0.04em;
    color: var(--text-dim);
    text-transform: uppercase;
    margin-top: 6px;
    opacity: 0.75;
  }
  .cw-narrative.is-stale {
    border-left-color: var(--text-dim);
  }

  /* ─────────────────────────────────────────────────────────────────
     Truth Engine + Entity Regime visualizations (CRY-44/45 redesign
     2026-05-07): replaces the empty 4-column metric strip with proper
     gauges, progress bars, confidence rings, and evidence chips.
     ──────────────────────────────────────────────────────────────── */

  /* Truth Engine — score gauge + 3-bar metrics block */
  .te-vis {
    display: flex;
    flex-direction: column;
    gap: 18px;
    padding: 14px 16px;
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    background: rgba(138, 151, 168, 0.03);
  }
  .te-vis-label {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 8px;
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 11px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  .te-vis-value {
    font-size: 20px;
    font-weight: 700;
    color: var(--text);
    letter-spacing: 0;
    text-transform: none;
  }
  .te-gauge {
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  .te-gauge-track {
    position: relative;
    height: 14px;
    border-radius: 999px;
    overflow: hidden;
    display: flex;
    background: rgba(138, 151, 168, 0.08);
  }
  .te-gauge-zone {
    flex: 1;
    height: 100%;
  }
  .te-gauge-zone-bear { background: linear-gradient(90deg, rgba(255, 94, 127, 0.32), rgba(255, 94, 127, 0.10)); }
  .te-gauge-zone-neutral { background: rgba(138, 151, 168, 0.10); }
  .te-gauge-zone-bull { background: linear-gradient(90deg, rgba(80, 252, 209, 0.10), rgba(80, 252, 209, 0.32)); }
  .te-gauge-tick {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 1px;
    background: rgba(255, 255, 255, 0.18);
  }
  .te-gauge-tick-mid { left: 50%; }
  .te-gauge-needle {
    position: absolute;
    top: -4px;
    bottom: -4px;
    width: 3px;
    border-radius: 2px;
    background: var(--text);
    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.6), 0 0 8px rgba(255, 255, 255, 0.4);
    transform: translateX(-50%);
    transition: left 300ms cubic-bezier(0.4, 0, 0.2, 1);
  }
  .te-gauge-needle.is-bull { background: var(--aqua, #50fcd1); }
  .te-gauge-needle.is-bear { background: var(--rose, #ff5e7f); }
  .te-gauge-axis {
    display: flex;
    justify-content: space-between;
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 10px;
    color: var(--text-dim);
    letter-spacing: 0.05em;
  }
  .te-bars {
    display: grid;
    gap: 14px;
  }
  .te-bar-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 4px;
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 11px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dim);
  }
  .te-bar-val {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
    text-transform: none;
    letter-spacing: 0;
  }
  .te-bar-track {
    position: relative;
    height: 8px;
    border-radius: 999px;
    background: rgba(138, 151, 168, 0.10);
    overflow: hidden;
  }
  .te-bar-fill {
    height: 100%;
    border-radius: 999px;
    transition: width 400ms cubic-bezier(0.4, 0, 0.2, 1);
  }
  .te-bar-fill-conf { background: linear-gradient(90deg, rgba(80, 125, 252, 0.6), rgba(80, 125, 252, 0.95)); }
  .te-bar-fill-cov { background: linear-gradient(90deg, rgba(80, 252, 209, 0.5), rgba(80, 252, 209, 0.9)); }
  .te-bar-fill-agree { background: linear-gradient(90deg, rgba(245, 158, 11, 0.55), rgba(245, 158, 11, 0.95)); }
  .te-bar-sub {
    margin-top: 4px;
    font-size: 11px;
    color: var(--text-dim);
  }

  /* Entity Regime — confidence ring + breakdown bars */
  .er-vis {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 18px;
    padding: 14px 16px;
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    background: rgba(138, 151, 168, 0.03);
    align-items: center;
  }
  .er-ring-wrap {
    width: 120px;
    flex-shrink: 0;
  }
  .er-ring {
    width: 120px;
    height: 120px;
  }
  .er-ring-track {
    stroke: rgba(138, 151, 168, 0.12);
  }
  .er-ring-fill {
    stroke: var(--aqua, #50fcd1);
    transition: stroke-dasharray 500ms cubic-bezier(0.4, 0, 0.2, 1), stroke 200ms;
  }
  .er-ring-fill.is-bear { stroke: var(--rose, #ff5e7f); }
  .er-ring-fill.is-neutral { stroke: rgba(138, 151, 168, 0.6); }
  .er-ring-num {
    font-family: var(--mono, "Space Mono", monospace);
    font-size: var(--fs-body-lg);
    font-weight: 700;
    fill: var(--text);
  }
  .er-ring-label {
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 9px;
    fill: var(--text-dim);
    letter-spacing: 0.1em;
    text-transform: uppercase;
  }
  .er-breakdown {
    display: flex;
    flex-direction: column;
    gap: 10px;
    min-width: 0;
  }
  .er-bd-head {
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 10px;
    color: var(--text-dim);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    margin-bottom: 4px;
  }
  .er-bd-row {
    display: grid;
    grid-template-columns: minmax(110px, auto) 1fr 36px;
    align-items: center;
    gap: 10px;
    font-size: 12px;
  }
  .er-bd-label {
    color: var(--text-dim);
    white-space: nowrap;
  }
  .er-bd-bar {
    position: relative;
    height: 6px;
    border-radius: 999px;
    background: rgba(138, 151, 168, 0.10);
    overflow: hidden;
    display: block;
  }
  .er-bd-fill {
    display: block;
    height: 100%;
    background: linear-gradient(90deg, rgba(80, 252, 209, 0.45), rgba(80, 252, 209, 0.9));
    border-radius: 999px;
    transition: width 400ms cubic-bezier(0.4, 0, 0.2, 1);
  }
  .er-bd-val {
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 11px;
    font-weight: 700;
    color: var(--text);
    text-align: right;
  }

  /* Entity Regime evidence chips — replaces text-list bullets */
  .er-chip-cloud {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
  }
  .er-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 10px;
    border-radius: 999px;
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 11px;
    line-height: 1.3;
    border: 1px solid var(--border);
    background: rgba(138, 151, 168, 0.05);
    color: var(--text);
  }
  .er-chip-label { color: var(--text-dim); }
  .er-chip-val { font-weight: 700; }
  .er-chip.is-bull { border-color: rgba(80, 252, 209, 0.32); background: rgba(80, 252, 209, 0.06); }
  .er-chip.is-bull .er-chip-val { color: var(--aqua, #50fcd1); }
  .er-chip.is-bear { border-color: rgba(255, 94, 127, 0.32); background: rgba(255, 94, 127, 0.06); }
  .er-chip.is-bear .er-chip-val { color: var(--rose, #ff5e7f); }
  .er-chip.is-warn { border-color: rgba(245, 158, 11, 0.32); background: rgba(245, 158, 11, 0.06); }
  .er-chip.is-warn .er-chip-val { color: #f59e0b; }

  /* Top recipients horizontal bar */
  .er-recipient-row {
    display: grid;
    grid-template-columns: 130px 1fr 80px;
    gap: 10px;
    align-items: center;
    padding: 6px 0;
    font-size: 12px;
  }
  .er-recipient-name {
    color: var(--text);
    font-weight: 600;
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
  }
  .er-recipient-bar {
    position: relative;
    height: 6px;
    border-radius: 999px;
    background: rgba(138, 151, 168, 0.08);
    overflow: hidden;
  }
  .er-recipient-fill {
    height: 100%;
    background: linear-gradient(90deg, rgba(80, 125, 252, 0.4), rgba(80, 125, 252, 0.85));
    border-radius: 999px;
    transition: width 400ms cubic-bezier(0.4, 0, 0.2, 1);
  }
  .er-recipient-val {
    font-family: var(--mono, "Space Mono", monospace);
    font-size: 11px;
    font-weight: 700;
    color: var(--text);
    text-align: right;
  }

  /* Mobile: stack confidence ring above breakdown */
  @media (max-width: 600px) {
    .er-vis {
      grid-template-columns: 1fr;
      justify-items: center;
      text-align: left;
    }
    .er-breakdown { width: 100%; }
    .er-bd-row { grid-template-columns: minmax(90px, auto) 1fr 32px; }
  }
