
    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

    /* P5 (2026-09-25): the design tokens (both themes) live in /assets/sp-ui.css,
       linked above — one copy for the SPA and the server-rendered pages. */

    html, body { min-height: 100vh; background: var(--bg); color: var(--text); transition: background .3s, color .3s; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
    /* P5: the clean-fintech base — the tokens' font. 2026-09-30 (SPA visual pass):
       the body reads 15px like the server-rendered pages (sp-pages.css), every
       link takes the accent there too (no browser blue / purple, and one
       underline offset), and one focus ring serves every focusable element. */
    body { font-family: var(--font); font-size: var(--fs-base); line-height: 1.55; font-feature-settings: "cv11", "ss01", "tnum"; }
    a { color: var(--accent); text-underline-offset: 3px; }
    :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
    a:focus-visible { border-radius: 4px; }
    /* 2026-09-30: one disabled state for every control (it was .4 / .45 / .5 / .6 with
       wait / not-allowed / default cursors, and none on the chips or the Data buttons),
       and a disabled control answers no hover. */
    button:disabled, input:disabled, select:disabled, textarea:disabled, [aria-disabled="true"] { opacity: .5; cursor: default; }
    button:disabled:hover, [aria-disabled="true"]:hover { transform: none; box-shadow: none; }

    .sd-chart-card, .setup-card, .td-card, .pd-card {
      transition: background-color .3s, border-color .3s, color .3s;
    }

    #boot { display: flex; align-items: center; justify-content: center; min-height: 100vh; font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--mute); }
    #setup { display: none; min-height: 100vh; align-items: center; justify-content: center; padding: 32px; }
    #app { display: none; }

    @keyframes fadeUp { from { opacity:0; transform:translateY(10px); } to { opacity:1; transform:translateY(0); } }
    @keyframes fadeIn { from { opacity:0; } to { opacity:1; } }
    @keyframes pulse  { 0%,100%{opacity:1} 50%{opacity:.3} }
    @keyframes spin   { to { transform: rotate(360deg); } }
    .fade-in { animation: fadeUp .35s ease both; }

    ::-webkit-scrollbar       { width: 5px; height: 5px; }
    ::-webkit-scrollbar-track { background: var(--surf2); }
    ::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 3px; }

    .spinner { display: inline-block; width: 12px; height: 12px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin .8s linear infinite; vertical-align: middle; }

    /* ══════════════════ SETUP ══════════════════ */
    /* 2026-09-30: /admin/setup is an SSR card — --r-lg, 40px in (24px 20px on a phone) —
       with a 40px h1 in one colour, a 15px lede and its shell commands in --r-md blocks. */
    .setup-card { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 40px; max-width: 500px; width: 100%; box-shadow: var(--shadow); }
    .setup-card pre { border-radius: var(--r-md); }
    .setup-ey { font-size: 13px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); margin-bottom: 12px; }
    .setup-title { font-size: 40px; font-weight: 700; letter-spacing: -.028em; line-height: 1.12; margin-bottom: 12px; }
    .setup-title em { color: inherit; font-style: normal; font-weight: inherit; }
    .setup-body { color: var(--dim); font-size: var(--fs-base); line-height: 1.6; margin-bottom: 28px; }
    .setup-note { margin-top: 14px; font-size: 13px; color: var(--mute); text-align: center; line-height: 1.6; }
    @media (max-width: 640px) { #setup { padding: 16px; } .setup-card { padding: 24px 20px; } .setup-title { font-size: 30px; } }

    /* ══════════════════ TOP NAV — MOVED 2026-09-24 ══════════════════
       P3-C2 (contract C-SHELL2): the chrome's rules — the top nav, the brand,
       the You ▾ menu and its lock / Pricing / watchlist-dot rules, the bell
       badge, the icon buttons, the account chip, the search box, the phone tab
       bar, the footer and the cookie bar — live in web/src/ui/sp-shell.css,
       built into /assets/sp-ui.css, which this page links above. One stylesheet
       for both shells; this page keeps no selector for those ids and classes. */
    /* First-run strip on Today (D10 2026-08-16) — anon/free only: display is
       double-gated on body.sp-locked (paid never sees it; the class is
       seeded pre-paint) and .tfr-on (added at boot unless dismissed). */
    #today-firstrun { display: none; }
    body.sp-locked #today-firstrun.tfr-on { display: flex; align-items: center; gap: 12px; margin: 8px 0 16px; padding: 14px 12px 14px 20px; border: 0; border-radius: var(--r-lg); background: var(--accentbg); font-size: var(--fs-sm); color: var(--dim); line-height: 1.55; }
    #today-firstrun > span { flex: 1; min-width: 0; }
    #today-firstrun button { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 36px; height: 36px; background: transparent; border: none; border-radius: 50%; color: var(--mute); cursor: pointer; font-size: 14px; transition: background-color .15s, color .15s; }   /* A11Y-14: was 15×17 */
    #today-firstrun button:hover { color: var(--text); background: var(--surf); }
    /* ─── Legal pages (Terms / Privacy / Cookies) ─── */
    /* 2026-09-30: the SSR scale — body 15, h1 40 (.sp-h1), h2 22 (.sp-h2), h3 16
       sentence case (.sp-h3); How we grade's heading is an h2 under Proof's h1. */
    .lgl-wrap { max-width: 760px; line-height: 1.65; color: var(--text); }
    .lgl-wrap h1 { font-size: 40px; margin: 0 0 10px; font-weight: 700; letter-spacing: -.028em; line-height: 1.12; }
    .lgl-wrap h2.mth-title { font-size: 22px; margin: 0 0 6px; font-weight: 700; letter-spacing: -.018em; }   /* P3-C3: How we grade's heading is an h2 (Proof owns the h1) */
    .lgl-wrap .lgl-eff { color: var(--mute); font-size: 13px; margin-bottom: 32px; }
    /* scroll-margin: #/methodology/<anchor> deep-links land below the sticky
       64px top-nav instead of under it (2026-08-16, B5). */
    .lgl-wrap h2 { font-size: 22px; margin: 40px 0 12px; font-weight: 700; letter-spacing: -.018em; line-height: 1.25; scroll-margin-top: 84px; }
    /* Same for the #/alerts bell-landing scroll target (D7b 2026-08-16). */
    #alerts-content { scroll-margin-top: 84px; }
    .lgl-wrap h3 { font-size: 16px; margin: 24px 0 8px; font-weight: 600; color: var(--text); line-height: 1.35; }
    .lgl-wrap p { margin: 0 0 14px; color: var(--dim); }
    /* P1-B5: the methodology page's per-feed freshness list (#data-freshness). */
    .lgl-wrap .mth-fresh-list { columns: 2 22em; column-gap: 28px; padding-left: 18px; font-size: 13px; color: var(--dim); }
    .lgl-wrap .mth-fresh-list li { break-inside: avoid; margin: 0 0 4px; }
    .lgl-wrap ul { padding-left: 22px; margin: 0 0 14px; color: var(--dim); }
    .lgl-wrap li { margin-bottom: 6px; }
    .lgl-wrap table { width: 100%; border-collapse: collapse; font-size: 14px; line-height: 1.5; margin: 12px 0 24px; }
    .lgl-wrap th, .lgl-wrap td { padding: 12px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--border); }
    .lgl-wrap th { color: var(--mute); font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: .04em; }
    .lgl-wrap td:first-child { color: var(--text); font-weight: 600; white-space: nowrap; }
    /* Phones (2026-10-07): a Cookie Policy row is a block — the name, its purpose, then
       expiry and type side by side, each under its header word (the cell's data-label),
       as the pricing table does; four columns in 358px left Purpose one word a line and
       clipped Type (ml_32_s1–s4). Long keys wrap. */
    @media (max-width: 600px) {
      .lgl-wrap .lgl-scroll table, .lgl-wrap .lgl-scroll tbody { display: block; }
      .lgl-wrap .lgl-scroll thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
      .lgl-wrap .lgl-scroll tr { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 16px; padding: 14px 0; border-bottom: 1px solid var(--border); }
      .lgl-wrap .lgl-scroll td { min-width: 0; padding: 0; border: 0; overflow-wrap: anywhere; }
      .lgl-wrap .lgl-scroll td:first-child, .lgl-wrap .lgl-scroll td:nth-child(2) { grid-column: 1 / -1; white-space: normal; }
      .lgl-wrap .lgl-scroll td[data-label]::before { content: attr(data-label); display: block; margin-bottom: 2px; color: var(--mute); font-size: var(--fs-xs); font-weight: 600; letter-spacing: .04em; text-transform: uppercase; }
    }
    .mth-quick { margin: 16px 0 22px; padding: 18px; background: var(--accentbg); border-radius: var(--r-lg); }
    .lgl-wrap .mth-quick p:last-child { margin-bottom: 0; }
    .mth-grades { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 16px 0 24px; }
    .mth-grade { padding: 16px; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surf); }
    .lgl-wrap .mth-grade h3 { margin: 0 0 8px; font-size: 1rem; }
    .lgl-wrap .mth-grade p { margin-bottom: 8px; }
    .mth-grade summary { padding: 10px 0; min-height: 44px; cursor: pointer; color: var(--accent); }
    .mth-grade details p { font-size: .875rem; }
    .mth-example { padding: 16px; border-left: 3px solid var(--accent); background: var(--surf2); border-radius: var(--r-md); }
    .mth-example strong { color: var(--text); }
    @media (max-width: 600px) { .mth-grades { grid-template-columns: minmax(0, 1fr); } }
    /* Cookie bar (2026-09-17 R1-05; slim bar 2026-09-23 P0-F36): its rules
       moved to the one shell's stylesheet with its markup (P3-C2, C-SHELL2).
       initCookieBanner() still measures it into --cb-clear while it is up;
       the page padding, the scroll-top button and the unlock bar add that to
       their bottom clearance (the --unlock-clear pattern below). */
    /* P3-C1 (2026-09-24): the in-app welcome / About page's rules (.lp-*) are
       gone with the page — it had redirected to / since round 4 (U4-07); the
       server-rendered home is the one landing page. */
    /* Alerts page */
    .wal-section-head { font-size: 22px; font-weight: 700; letter-spacing: -.018em; line-height: 1.25; color: var(--text); margin: 56px 0 8px; }
    .wal-section-head + .page-sub { font-size: var(--fs-base); }
    .al-tabs { display: flex; gap: 4px; margin-bottom: 14px; overflow-x: auto; scrollbar-width: none; border-bottom: 1px solid var(--border); }
    .al-tab { flex: none; min-height: 44px; margin-bottom: -1px; background: transparent; border: none; color: var(--mute); padding: 11px 16px; cursor: pointer; font-family: inherit; font-size: var(--fs-base); font-weight: 500; white-space: nowrap; border-bottom: 2px solid transparent; transition: color .12s, border-color .12s; }
    .al-tab:hover { color: var(--text); }
    .al-tab.on { color: var(--text); border-bottom-color: var(--accent); font-weight: 600; }
    .al-tab .al-tab-count { display: inline-block; min-width: 20px; padding: 1px 8px; margin-left: 6px; background: var(--accentbg); color: var(--accent); font-size: 12px; font-weight: 600; text-align: center; border-radius: var(--r-pill); }
    .al-tab.on .al-tab-count { background: var(--sell); color: var(--bg); }
    /* (.wal-tabs / .wal-tab — the Watchlist & Alerts page's top-level tabs — removed 2026-09-30: no markup draws them.) */
    /* The SPA News feed's rows (.an-*) and the News page's phone layout —
       REMOVED 2026-09-24 with the SPA News view (P3-C5). */
    @media (max-width: 640px) {
      #news-overlay { padding: 10px !important; }
      #news-overlay .gloss-modal { max-height: 94vh; }
      #nw-ticker, #nw-link { flex: 1 1 45%; text-align: center; }
      /* (.news-filter-row's phone rule moved below its base rule, 2026-10-07.) */
    }
    /* News sentiment — per-item badge (-3..+3) shown next to each headline.
       2026-05-28: replaced color-only hardcoded hexes (failed WCAG color-
       contrast on light mode: 1.6:1) with --buy/--sell tokens that adapt
       to theme, and prepended a +/− glyph via ::before so the sign is
       conveyed without relying on color alone. */
    .news-score { display: inline-block; min-width: 28px; padding: 2px 8px; border-radius: var(--r-pill); font-size: 12px; font-weight: 700; text-align: center; letter-spacing: .02em; vertical-align: middle; }
    .news-score[data-s="3"]::before, .news-score[data-s="2"]::before, .news-score[data-s="1"]::before { content: "+"; }
    .news-score[data-s="-1"]::before, .news-score[data-s="-2"]::before, .news-score[data-s="-3"]::before { content: "−"; }
    .news-score[data-s="3"], .news-score[data-s="2"], .news-score[data-s="1"] { background: var(--buybg); color: var(--buy); }
    .news-score[data-s="0"]  { background: var(--surf2); color: var(--mute); }
    .news-score[data-s="-1"], .news-score[data-s="-2"], .news-score[data-s="-3"] { background: var(--sellbg); color: var(--sell); }
    /* (.news-gauge*, the stock page's news-sentiment gauge — REMOVED 2026-09-24 with the SPA stock page, P4c.) */
    /* Filter-chip row (New today's filters) */
    .news-filter-row { display: flex; gap: 8px; margin: 0 0 14px; flex-wrap: wrap; }
    /* Phones: the chips stay reachable deep in a long list — one line that scrolls
       sideways, stuck under the shell's live header height. 2026-10-07: it stuck at
       the retired --nav-h's 52px fallback, under the 107px phone header, and wrapped,
       so one chip floated over every card (ml_12_s2–s5). */
    @media (max-width: 640px) {
      .news-filter-row { position: sticky; top: var(--sp-header-h, 64px); z-index: 30; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; margin: 0 -16px 14px; padding: 8px 16px; background: var(--bg); border-bottom: 1px solid var(--border); }
      .news-filter-row::-webkit-scrollbar { display: none; }
      .news-filter-row > * { flex: none; }
    }

    /* ── Visual primitives (2026-06-12 readability pass) ──────────────────
       One vocabulary for "numbers instead of sentences": stat chips, fill
       meters, skeletons, pulse dots. Confident-financial: color is surgical
       (direction / grade / magnitude), motion is purposeful. */
    .stat-chip { display: inline-flex; align-items: center; gap: 5px; min-height: 24px; padding: 0 10px; border-radius: var(--r-pill); font-size: 12px; font-weight: 600; background: var(--surf2); border: 1px solid transparent; color: var(--dim); font-variant-numeric: tabular-nums; white-space: nowrap; }
    .stat-chip .scl { font-weight: 500; color: var(--mute); }
    /* C17 (2026-08-16): since-visit chips carry the firing strategy's short
       name in-text ("NVDA · Pelosi Tracker") — was title=-only. Ellipsis caps
       long nicknames so the chip row stays one line. */
    .stat-chip[role="button"], .tb-stack[role="button"] { cursor: pointer; transition: box-shadow .12s; }
    .stat-chip[role="button"]:hover, .tb-stack[role="button"]:hover { box-shadow: inset 0 0 0 1px currentColor; }
    .stat-chip .svr-strat { font-weight: 400; color: var(--mute); max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
    .stat-chip.pos { background: var(--buybg); border-color: transparent; color: var(--buy); }
    .stat-chip.neg { background: var(--sellbg); border-color: transparent; color: var(--sell); }
    .stat-chip.gold { background: var(--accentbg); border-color: transparent; color: var(--accent); }
    .meter { position: relative; height: 6px; border-radius: var(--r-pill); background: var(--surf2); overflow: hidden; min-width: 54px; }
    .meter > i { position: absolute; inset: 0 auto 0 0; width: 0; border-radius: var(--r-pill); background: var(--accent); transition: width .7s cubic-bezier(.22,.8,.36,1); }
    .meter.pos > i { background: var(--buy); }
    .meter.neg > i { background: var(--sell); }
    .pulse-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--buy); animation: pulse 2s ease-in-out infinite; vertical-align: middle; }
    .sk { background: linear-gradient(100deg, var(--surf2) 35%, var(--border) 50%, var(--surf2) 65%); background-size: 220% 100%; animation: skShimmer 1.3s linear infinite; border-radius: var(--r-sm); }
    @keyframes skShimmer { from { background-position: 130% 0; } to { background-position: -90% 0; } }
    .stagger-in { animation: fadeUp .4s ease both; }
    /* (.ci-band — the strategy page's range band — went with the SPA strategy page, P4d.) */
    /* Motion kill-switch — every animation/transition collapses for users who ask. */
    @media (prefers-reduced-motion: reduce) {
      *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
    }

    /* ── Today board (the answer surface) — td-card base + lb-pill chips ── */
    .tb-card { position: relative; background: var(--surf); border: 1px solid var(--border); box-shadow: var(--shadow); border-radius: var(--r-lg); padding: 24px; margin-bottom: 16px; }
    /* 2026-09-30 (heat): the warm / frosted card's top rule — sp-ui.css paints it, this gives it its place. */
    .tb-card.sp-heat--hot::after, .tb-card.sp-heat--cold::after { content: ""; position: absolute; inset: 0 0 auto 0; height: 3px; border-radius: var(--r-lg) var(--r-lg) 0 0; pointer-events: none; }
    .tb-stack .sp-fx--bolt { margin-right: 4px; }
    .tb-head .sp-fx--sparks { margin-left: -6px; }
    .tb-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
    .tb-rank { font-size: 13px; font-weight: 700; color: var(--mute); min-width: 26px; font-variant-numeric: tabular-nums; }
    .tb-ticker { font-size: 20px; font-weight: 700; letter-spacing: .01em; color: var(--text); text-decoration: none; }
    .tb-ticker:hover { color: var(--accent); }
    .tb-dir { display: inline-flex; align-items: center; min-height: 24px; font-size: 12px; font-weight: 700; padding: 0 10px; border-radius: var(--r-pill); letter-spacing: .04em; text-transform: uppercase; }
    .tb-dir-BUY { background: var(--buybg); color: var(--buy); }
    .tb-dir-SHORT { background: var(--sellbg); color: var(--sell); }
    .tb-dir-MIXED { background: var(--surf2); color: var(--mute); }
    .tb-score { margin-left: auto; font-size: 13px; font-weight: 700; color: var(--accent); white-space: nowrap; display: inline-flex; align-items: center; gap: 7px; }
    .tb-score .meter { width: 64px; }
    .tb-stack, .tb-free { display: inline-flex; align-items: center; min-height: 24px; font-size: 12px; font-weight: 700; padding: 0 10px; border-radius: var(--r-pill); letter-spacing: .04em; text-transform: uppercase; }
    .tb-stack { background: var(--accentbg); color: var(--accent); }
    .tb-free { background: var(--buybg); color: var(--buy); }
    .tb-agree { font-size: 12px; color: var(--dim); margin: 7px 0 9px; }
    .tb-layers { display: flex; flex-direction: column; gap: 5px; }
    .tb-layer { display: flex; align-items: baseline; gap: 8px; font-size: 13px; flex-wrap: wrap; padding: 8px 0; border-top: 1px solid var(--border); }
    .tb-layer-src { color: var(--mute); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: .06em; min-width: 110px; }
    .tb-layer-strat { color: var(--text); text-decoration: none; font-weight: 600; }
    .tb-layer-strat:hover { color: var(--accent); }
    .tb-layer-stats { color: var(--mute); font-size: 12px; margin-left: auto; white-space: nowrap; }
    /* P2-C4 (2026-09-24): the member behind a free Congress / OGE layer, at
       the row's own size; it wraps inside the row like the other parts. */
    .tb-layer-actor { color: var(--dim); }
    .tb-layer-actor .tb-layer-actor-name { color: var(--text); }
    .tb-layer-actor-more { color: var(--accent); text-decoration: none; }
    .tb-layer-actor-more:hover { text-decoration: underline; }
    .tb-grade { font-size: 12px; }
    .tb-actions { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
    /* P1-B4 (2026-09-24): a masked idea is one inline lock card (SP.ui.lockCard)
       filling the card — the blurred placeholder row and its overlay CTA are
       retired with their rules. */
    .tb-card.tb-masked { padding: 0; }
    .tb-masked .sp-lock-card { margin: 0; max-width: none; }
    @media (max-width: 640px) {
      .tb-card { padding: 20px 16px; }
      .tb-ticker { font-size: var(--fs-md); }
      .tb-layer-src { min-width: 0; width: 100%; }
      .tb-layer-stats { margin-left: 0; width: 100%; }
    }
    /* ── Top 10 portfolio page (.t10-*) — RETIRED 2026-09-25 (P5 Lane T) with the
       SPA's top10 view: /ideas is the server-rendered Top 10 (web/src/pages/
       Top10Page.tsx, styled by web/src/ui/pages/top10.css). ── */
    /* The News feed's filter chips, pulse bar, mood bar, trending strip and
       new-stories badge — REMOVED 2026-09-24 with the SPA News view (P3-C5). */
    .al-row { display: grid; grid-template-columns: 60px 80px 1fr auto auto; gap: 12px; align-items: center; padding: 12px 14px; border-bottom: 1px solid var(--border); font-size: 14px; transition: background .12s; }
    .al-row.unread { background: var(--bg-soft); box-shadow: inset 3px 0 0 var(--accent); }
    .al-row.unread .al-strat { font-weight: 600; }
    .al-row .al-ticker { font-weight: 600; color: var(--accent); cursor: pointer; }
    .al-row .al-strat { color: var(--text); cursor: pointer; }
    .al-row .al-strat:hover { text-decoration: underline; }
    .al-row .al-date { color: var(--mute); font-size: 13px; font-variant-numeric: tabular-nums; }
    .al-row .al-dismiss { display: inline-flex; align-items: center; min-height: 32px; background: transparent; border: 1px solid var(--border2); color: var(--dim); padding: 0 12px; cursor: pointer; font-family: inherit; font-size: 13px; font-weight: 600; border-radius: var(--r-pill); transition: color .15s, border-color .15s, background-color .15s; }
    .al-row .al-dismiss:hover { color: var(--sell); border-color: var(--sell); background: var(--sellbg); }
    /* (The nav's account chip and its avatar are styled by the shell's
       stylesheet since P3-C2 — #top-nav #btn-account .acc-avatar.) */
    /* Account page */
    .ap-heading { margin-bottom: 24px; }
    .ap-heading h1 { font-size: 40px; font-weight: 700; letter-spacing: -.028em; line-height: 1.12; margin: 6px 0 10px; }
    .ap-heading p { max-width: 62ch; margin: 0; color: var(--dim); font-size: var(--fs-md); line-height: 1.55; }
    .ap-eyebrow { color: var(--accent); font-size: var(--fs-sm); font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
    .ap-hero { display: flex; align-items: center; gap: 18px; padding: 22px; background: linear-gradient(115deg,var(--accentbg),var(--surf) 65%); border: 1px solid var(--border); border-radius: var(--r-lg); margin-bottom: 24px; }
    .ap-hero-avatar { width: 64px; height: 64px; border-radius: 50%; background: var(--accent-fill); color: #fff; font-size: var(--fs-xl); font-weight: 700; display: flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; }
    .ap-hero-avatar img { width: 100%; height: 100%; object-fit: cover; }
    .ap-identity { flex: 1; min-width: 0; }
    .ap-name { font-size: var(--fs-lg); font-weight: 700; overflow-wrap: anywhere; }
    .ap-email { font-size: var(--fs-sm); color: var(--mute); overflow-wrap: anywhere; }
    .ap-dev { color: var(--accent); margin-left: 8px; }
    .ap-grid { display: grid; grid-template-columns: minmax(0,1.15fr) minmax(0,1fr); gap: 20px; align-items: start; }
    .ap-grid > .ap-card { min-width: 0; margin: 0; height: 100%; }
    .ap-wide { grid-column: 1 / -1; }
    .ap-copy { color: var(--dim); line-height: 1.6; font-size: var(--fs-sm); margin: 8px 0 16px; }
    .ap-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
    .ap-actions .ap-btn { margin: 0 !important; }
    .ap-profile { display: grid; grid-template-columns: auto minmax(0,1fr); gap: 14px 18px; font-size: var(--fs-sm); margin: 16px 0 0; }
    .ap-profile dt { color: var(--mute); }
    .ap-profile dd { margin: 0; overflow-wrap: anywhere; }
    .ap-settings { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: 16px; }
    .ap-settings label { display: grid; gap: 6px; font-size: var(--fs-sm); color: var(--dim); }
    .ap-status { min-height: 22px; margin: 8px 0 0; color: var(--dim); font-size: var(--fs-sm); line-height: 1.55; }
    .ap-status[data-tone="success"] { color: var(--buy); }
    .ap-status[data-tone="error"] { color: var(--sell); }
    .ap-referral { position: relative; padding: 32px; margin-bottom: 24px; border: 1px solid var(--accent-soft); border-radius: var(--r-xl); background: radial-gradient(ellipse at 100% 0,var(--accentbg),transparent 60%),var(--surf); box-shadow: var(--shadow); }
    .ap-ref-intro { display: flex; justify-content: space-between; align-items: center; gap: 24px; }
    .ap-ref-intro > div { max-width: 600px; }
    .ap-referral h2 { font-size: var(--fs-xl); line-height: 1.2; letter-spacing: -.018em; margin: 10px 0 14px; }
    .ap-ref-lede { color: var(--dim); line-height: 1.65; margin: 0; }
    .ap-ref-lede strong { color: var(--text); }
    .ap-ref-art { width: 164px; height: 132px; flex: none; overflow: visible; }
    .ap-ref-orbit { fill: none; stroke: var(--accent-soft); stroke-width: 1.5; stroke-dasharray: 4 8; animation: ap-orbit 24s linear infinite; }
    .ap-ref-line { fill: none; stroke: var(--border2); stroke-width: 2; }
    .ap-ref-node { fill: var(--surf); stroke: var(--accent-soft); stroke-width: 2; }
    .ap-ref-center { fill: var(--accent-fill); }
    .ap-ref-person { fill: none; stroke: var(--accent); stroke-width: 2; stroke-linecap: round; }
    .ap-ref-check { fill: none; stroke: var(--surf); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }
    [data-theme="dark"] .ap-ref-check { stroke: var(--text); }
    .ap-ref-stats { display: grid; grid-template-columns: 1fr 1fr 1.3fr; gap: 1px; background: var(--border); border: 1px solid var(--border); border-radius: var(--r-md); overflow: hidden; margin: 24px 0; }
    .ap-ref-stats > div { padding: 18px 20px; background: var(--surf); min-width: 0; }
    .ap-ref-stats dt { color: var(--mute); font-size: var(--fs-xs); }
    .ap-ref-stats dd { font-size: var(--fs-xl); font-weight: 700; margin: 6px 0 0; }
    .ap-ref-stats dd small { color: var(--mute); font-size: var(--fs-xs); font-weight: 400; }
    .ap-ref-link-label { display: block; font-size: var(--fs-sm); font-weight: 600; margin: 20px 0 8px; }
    .ap-ref-link-row { display: flex; gap: 10px; }
    .ap-ref-link-row .ap-input { flex: 1; min-width: 0; }
    .ap-ref-link-row .ap-btn { flex: none; }
    .ap-ref-share { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 12px; }
    .ap-ref-share > a { font-size: var(--fs-sm); color: var(--accent); }
    .ap-plans-link { color: var(--accent); }   /* R13: the account card's link to the longer plans */
    .ap-ref-steps { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 20px; list-style: none; padding: 0; margin: 24px 0 18px; counter-reset: ref-step; }
    .ap-ref-steps li { counter-increment: ref-step; font-size: var(--fs-sm); color: var(--dim); line-height: 1.55; }
    .ap-ref-steps li::before { content: counter(ref-step); display: inline-grid; place-items: center; width: 26px; height: 26px; margin-bottom: 8px; background: var(--accentbg); color: var(--accent); border-radius: 50%; font-weight: 700; }
    .ap-ref-steps strong { display: block; color: var(--text); margin-bottom: 4px; }
    .ap-ref-note { color: var(--mute); font-size: var(--fs-xs); line-height: 1.65; margin: 12px 0 0; }
    .ap-ref-details { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--border); }
    .ap-ref-details summary { cursor: pointer; font-size: var(--fs-sm); font-weight: 600; color: var(--dim); }
    .ap-ref-details form { margin-top: 14px; }
    .ap-ref-people { list-style: none; padding: 0; margin: 14px 0 0; }
    .ap-ref-people li { display: flex; align-items: start; justify-content: space-between; gap: 16px; padding: 10px 0; font-size: var(--fs-sm); border-bottom: 1px solid var(--border); }
    .ap-ref-people li > span:first-child { min-width: 0; overflow-wrap: anywhere; }
    .ap-ref-people .ap-pill { white-space: nowrap; }
    .ap-ref-empty { margin-top: 18px; padding: 16px; border-radius: var(--r-md); color: var(--dim); background: var(--accentbg); font-size: var(--fs-sm); line-height: 1.6; }
    .ap-danger { border-color: var(--sell); }
    .ap-danger summary { cursor: pointer; color: var(--sell); font-size: var(--fs-sm); font-weight: 600; }
    @keyframes ap-orbit { to { stroke-dashoffset: -240; } }
    @media (prefers-reduced-motion: reduce) { .ap-ref-orbit { animation: none; } }
    @media (max-width: 700px) {
      .ap-grid { grid-template-columns: minmax(0,1fr); gap: 16px; }
      .ap-hero { gap: 12px; padding: 16px; flex-wrap: wrap; }
      .ap-hero-avatar { width: 48px; height: 48px; }
      .ap-name { font-size: var(--fs-md); }
      .ap-referral { padding: 22px 18px; }
      .ap-referral h2 { font-size: var(--fs-lg); }
      .ap-ref-art { position: absolute; right: 18px; top: 24px; width: 64px; height: 76px; }
      .ap-ref-intro { display: block; }
      .ap-ref-intro h2, .ap-ref-intro .ap-eyebrow { padding-right: 64px; }
      .ap-ref-stats { grid-template-columns: 1fr 1fr; }
      .ap-ref-stats > div { padding: 14px; }
      .ap-ref-stats > div:last-child { grid-column: 1 / -1; }
      .ap-ref-stats > div:last-child dd { margin-top: 4px; }
      .ap-ref-link-row { flex-wrap: wrap; }
      .ap-ref-link-row .ap-input { flex-basis: 100%; }
      .ap-ref-steps { grid-template-columns: minmax(0,1fr); gap: 14px; }
      .ap-ref-steps li { position: relative; padding-left: 38px; }
      .ap-ref-steps li::before { position: absolute; left: 0; top: 0; }
      .ap-settings { grid-template-columns: minmax(0,1fr); }
      .ap-wrap .ap-input { font-size: 16px; }
    }
    .ap-card { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); padding: 24px; margin-bottom: 16px; }
    /* 2026-09-30: the signed-out sign-in card is a focused 480px dialog-width card
       under the brand mark (the nav's .brand-mark, larger), not a 990px band for
       one button. */
    .ap-signin { max-width: 480px; margin: 8px auto 16px; padding: 32px; }
    .ap-signin-mark { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; margin: 0 auto 16px; color: #fff; font-size: 18px; font-weight: 800; background: var(--accent-fill); border-radius: 14px; box-shadow: var(--shadow); }
    .ap-signin-mark svg { display: block; width: 100%; height: 100%; }   /* 2026-09-30: the drawn monogram (public/icon.svg), not typeset letters */
    @media (max-width: 640px) { .ap-signin { padding: 24px 20px; } }
    .ap-card-title { font-size: var(--fs-xs); font-weight: 600; color: var(--mute); text-transform: uppercase; letter-spacing: .06em; margin: 0 0 6px; }
    .ap-card-head { font-size: var(--fs-md); font-weight: 600; color: var(--text); margin-bottom: 12px; }
    /* 2026-09-30 (SPA visual pass): the SPA's buttons are the SSR pills — .ap-btn is
       .sp-btn--primary (44px, 15px / 600, 0 22px, --accent-fill, the 1px lift on
       hover), .ap-btn.ghost is .sp-btn (--surf2), .wl-clear-btn is .sp-btn--ghost
       (accent text on a hairline). */
    .ap-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 44px; padding: 0 22px; background: var(--accent-fill); color: #fff; border: 1px solid transparent; cursor: pointer; font-weight: 600; font-size: var(--fs-base); line-height: 1.2; border-radius: var(--r-pill); font-family: inherit; text-decoration: none; transition: box-shadow .15s, transform .15s, background-color .15s, border-color .15s; }
    .ap-btn:hover { color: #fff; text-decoration: none; box-shadow: var(--shadow-lg); transform: translateY(-1px); }
    .ap-btn.ghost { background: var(--surf2); color: var(--text); }
    .ap-btn.ghost:hover { color: var(--text); background: var(--surf3); box-shadow: none; transform: none; }
    .ap-btn.danger { background: var(--sellbg); color: var(--sell); }
    .ap-btn.danger:hover { color: var(--sell); border-color: var(--sell); box-shadow: none; transform: none; }
    /* Sign in with Apple is black on the light theme and white on the dark (Apple's button rule — the one place a literal black is right). */
    .ap-btn.ap-btn-apple, .ap-btn.ap-btn-apple:hover { background: #000; color: #fff; border-color: #000; }
    [data-theme="dark"] .ap-btn.ap-btn-apple, [data-theme="dark"] .ap-btn.ap-btn-apple:hover { background: #fff; color: #000; border-color: #fff; }
    /* 2026-09-30: every SPA text field is the SSR .sp-field input — 44px (40px in a
       toolbar), --r-md, 1px --field-border, --surf, 15px (14px in a toolbar); focus
       is the accent edge and a 3px --accentbg halo. A select drawn with .ap-input
       loses the platform arrow for a chevron in --mute (two gradients, so it takes
       the theme). */
    .ap-input { min-height: 44px; min-width: 0; max-width: 100%; padding: 10px 12px; background: var(--surf); border: 1px solid var(--field-border); color: var(--text); font-family: inherit; font-size: var(--fs-base); border-radius: var(--r-md); }
    .ap-input::placeholder { color: var(--mute); text-transform: none; }
    select.ap-input { appearance: none; -webkit-appearance: none; padding-right: 36px; cursor: pointer; background-image: linear-gradient(45deg, transparent 50%, var(--mute) 50%), linear-gradient(135deg, var(--mute) 50%, transparent 50%); background-position: calc(100% - 19px) 50%, calc(100% - 14px) 50%; background-size: 5px 5px; background-repeat: no-repeat; }
    .ap-input:focus, .ap-tester-form input:focus, .bld-search:focus, .cmp-pick-input:focus, .data-sidebar-search:focus, .data-controls input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accentbg); }
    /* A11Y-08 (2026-09-29): every SPA field's edge reaches 3:1 in both themes (--field-border, WCAG 1.4.11) —
       classes and inline styles drew it in --border / --border2 at 1.2–1.7:1; !important outranks the inline
       ones, and a focused field keeps its accent edge. */
    #main :is(input:not([type=checkbox], [type=radio], [type=range], [type=hidden], [type=submit], [type=button]), select, textarea):not(:focus),
    #main .data-global-search:not(:focus-within) { border-color: var(--field-border) !important; }
    .ap-pill { display: inline-block; padding: 3px 10px; font-size: var(--fs-xs); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; border-radius: var(--r-pill); }
    .ap-pill.active { background: var(--buybg); color: var(--buy); }
    .ap-pill.free { background: var(--surf2); color: var(--mute); }
    .ap-pill.canceled { background: var(--sellbg); color: var(--sell); }
    .ap-pill.pastdue { background: var(--warnbg); color: var(--warn); }
    /* Tester access (2026-09-24): the sign-in card's tester form and the account card's tester note. */
    .ap-tester { margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--border); text-align: left; }
    .ap-tester > summary { cursor: pointer; color: var(--mute); font-size: .75rem; letter-spacing: .04em; text-transform: uppercase; }
    .ap-tester-form { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
    .ap-tester-form label { color: var(--mute); font-size: .75rem; }
    .ap-tester-form input { min-height: 44px; padding: 0 12px; border: 1px solid var(--field-border); border-radius: var(--r-md); background: var(--surf); color: var(--text); font: inherit; font-size: var(--fs-base); }
    .ap-tester-status { min-height: 1.2em; color: var(--mute); font-size: .75rem; }
    .ap-tester-status.err { color: var(--sell); }
    .ap-tester-note { margin: 6px 0; color: var(--mute); line-height: 1.5; }
    /* (The per-control focus rings — buttons, [role=button], .lb-pill, .lb-tab and
       links, in the old gold — are the one :focus-visible rule at the top, 2026-09-30.) */

    /* ─── Inline jargon tooltip (underlined term, hover for plain definition) ─── */
    .term { border-bottom: 1px dotted var(--mute); cursor: help; text-decoration: none; color: inherit; }
    .term:hover { color: var(--text); border-bottom-color: var(--accent); }

    /* ─── Glossary modal (foundation of plain-language layer) ─── */
    .gloss-overlay { position: fixed; inset: 0; background: var(--overlay); display: none; align-items: center; justify-content: center; z-index: 1000; padding: 20px; }
    .gloss-overlay.on { display: flex; }
    .gloss-modal { background: var(--surf); border: 1px solid var(--border); box-shadow: var(--shadow-lg); max-width: 880px; width: 100%; max-height: 88vh; display: flex; flex-direction: column; border-radius: var(--r-xl); overflow: hidden; }
    .gloss-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 24px; padding: 28px 20px 22px 32px; border-bottom: 1px solid var(--border); }
    .gloss-ey { font-size: 13px; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); margin-bottom: 10px; font-weight: 700; }
    .gloss-title { font-size: 24px; font-weight: 700; letter-spacing: -.02em; line-height: 1.2; color: var(--text); margin-bottom: 10px; }
    .gloss-sub { font-size: 13px; color: var(--dim); line-height: 1.55; max-width: 640px; }
    /* 2026-09-30: every dialog's close is the nav's icon button (#top-nav .btn-icon) —
       40px round, --dim, a --surf2 disc on hover. The palette's and the help's say
       "Esc" in it; the glossary's and the news card's draw ✕. */
    .gloss-close, #cmd-close, #help-close { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 40px; height: 40px; padding: 0; background: none; border: 0; border-radius: 50%; color: var(--dim); font-family: inherit; font-size: 16px; cursor: pointer; transition: background-color .15s, color .15s; }
    .gloss-close:hover, #cmd-close:hover, #help-close:hover { background: var(--surf2); color: var(--text); }
    #cmd-close, #help-close { font-size: 12px; font-weight: 600; letter-spacing: .04em; }
    .gloss-body { padding: 24px 32px 32px; overflow-y: auto; }
    .gloss-section { margin-bottom: 28px; }
    .gloss-section:last-child { margin-bottom: 0; }
    .gloss-section-title { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--mute); margin-bottom: 16px; padding-bottom: 8px; border-bottom: 1px solid var(--border); font-weight: 600; }
    .gloss-row { display: grid; grid-template-columns: 220px 1fr; gap: 24px; padding: 14px 0; border-bottom: 1px solid var(--border); align-items: baseline; }
    .gloss-row:last-child { border-bottom: none; }
    .gloss-row-hl { background: var(--accentbg); border-radius: var(--r-sm); transition: background .3s; }
    @media (max-width: 640px) {
      .gloss-row { grid-template-columns: 1fr; gap: 6px; }
      .gloss-head { gap: 12px; padding: 20px 12px 16px 20px; }
      .gloss-body { padding: 16px 20px 24px; }
      .gloss-title { font-size: var(--fs-lg); }
    }
    .gloss-term { font-weight: 700; color: var(--accent); font-size: 14px; }
    .gloss-tech { display: block; font-size: 12px; color: var(--mute); letter-spacing: 0; text-transform: none; font-weight: 400; margin-top: 4px; }
    .gloss-def { font-size: 13px; color: var(--text); line-height: 1.6; }

    /* P3-C2 (C-SHELL2 / C-SEARCH1): the nav's search trigger, New today's
       inline search button and the rail's icon buttons are the shell's now —
       the one search box and #btn-bell / #btn-theme / #btn-admin-gear, styled
       by the shell's stylesheet. */
    /* [hidden] must always hide (round 4, U4-03). The UA sheet's
       `[hidden] { display: none }` loses to ANY author `display` rule, so an
       icon button's display:flex painted the admin gear (markup `hidden`,
       shown only by updateAdminGearVisibility) for every visitor, signed in
       or not. One global !important reset instead of a per-element override
       each time an author display rule meets the attribute. */
    [hidden] { display: none !important; }

    /* ══════════════════ COMMAND PALETTE ══════════════════ */
    #cmd-overlay {
      display: none;
      position: fixed; inset: 0; z-index: 200;
      background: var(--overlay);   /* no backdrop blur — the site's rule: nothing is ever blurred (sp-ui.css) */
      align-items: flex-start; justify-content: center;
      padding-top: 12vh;
      animation: fadeIn .15s ease;
    }
    #cmd-overlay.on { display: flex; }
    #cmd-modal {
      width: 100%; max-width: 580px;
      background: var(--surf); border: 1px solid var(--border);
      border-radius: var(--r-xl); overflow: hidden;
      box-shadow: var(--shadow-lg);
      animation: fadeUp .2s ease both;
    }
    #cmd-search-wrap { display: flex; align-items: center; gap: 12px; padding: 12px 12px 12px 24px; border-bottom: 1px solid var(--border); }
    #cmd-search-wrap .sicon { font-size: 16px; color: var(--mute); }
    #cmd-input {
      flex: 1; border: none; outline: none; background: transparent;
      color: var(--text); font-family: inherit; font-size: 14px;
    }
    #cmd-input::placeholder { color: var(--mute); }
    #cmd-search-wrap:focus-within { box-shadow: inset 0 -2px 0 var(--accent); }   /* A11Y-02: the field's focus mark (it has no outline) */
    #cmd-results { max-height: 60vh; overflow-y: auto; }
    .cmd-section { padding: 12px 20px 8px; }
    .cmd-section-lbl { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--mute); margin-bottom: 4px; }
    .cmd-item {
      display: flex; align-items: center; gap: 12px;
      padding: 10px 20px; cursor: pointer;
      border-left: 2px solid transparent;
      transition: background .1s, border-color .1s;
    }
    .cmd-item:hover, .cmd-item.active { background: var(--surf2); border-left-color: var(--accent); }
    .cmd-icon { font-size: 13px; color: var(--accent); width: 18px; text-align: center; }
    .cmd-main { flex: 1; }
    .cmd-name { font-size: 14px; color: var(--text); }
    .cmd-meta { font-size: 12px; color: var(--mute); margin-top: 2px; }
    .cmd-trail { font-size: 12px; color: var(--mute); }
    .cmd-empty { padding: 32px 24px; text-align: center; color: var(--mute); font-size: 14px; }
    .cmd-hint { padding: 10px 20px; border-top: 1px solid var(--border); background: var(--surf2); font-size: 12px; color: var(--mute); display: flex; gap: 14px; }
    .cmd-hint kbd { background: var(--surf); border: 1px solid var(--border2); border-radius: var(--r-sm); padding: 1px 6px; font-family: inherit; font-size: 12px; }

    /* ══════════════════ SHORTCUT HELP MODAL ══════════════════ */
    #help-overlay { display: none; position: fixed; inset: 0; z-index: 200; background: var(--overlay); align-items: flex-start; justify-content: center; padding-top: 12vh; animation: fadeIn .15s ease; }
    #help-overlay.on { display: flex; }
    #help-modal { width: 100%; max-width: 520px; background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-xl); overflow: hidden; box-shadow: var(--shadow-lg); animation: fadeUp .2s ease both; }
    .help-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 16px 16px 24px; border-bottom: 1px solid var(--border); }
    .help-ey { font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); margin-bottom: 4px; }
    .help-title { font-size: var(--fs-lg); font-weight: 700; letter-spacing: -.015em; color: var(--text); }
    .help-title:focus, #main h1[tabindex="-1"]:focus { outline: none; }   /* A11Y-02 / A11Y-09: focus lands on these titles (a dialog opening, a view change) */
    .help-body { padding: 8px 0; }
    .help-section { padding: 16px 24px; border-bottom: 1px solid var(--border); }
    .help-section:last-child { border-bottom: none; }
    .help-section-lbl { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--mute); margin-bottom: 10px; }
    .help-row { display: flex; justify-content: space-between; align-items: center; padding: 5px 0; }
    .help-label { font-size: 14px; color: var(--text); }
    .help-row kbd { display: inline-block; min-width: 22px; padding: 2px 7px; background: var(--surf2); border: 1px solid var(--border2); border-radius: var(--r-sm); font-family: inherit; font-size: 12px; color: var(--dim); text-align: center; font-weight: 600; }

    /* ══════════════════ MAIN ══════════════════ */
    /* 2026-09-30 (SPA visual pass): one frame for every view, the server-rendered
       pages' .sp-page — var(--maxw) wide, 40px 32px 80px (24px 16px 48px on a
       phone) — so a view's h1 starts where an SSR page's does; the views keep no
       width or gutter of their own. */
    #main { max-width: var(--maxw); margin: 0 auto; padding: 40px 32px 80px; }
    /* The admin panel, its record browser and the miner log are dense ops tables
       (8–10 columns): the same frame, 1280px wide instead of --maxw. */
    body:has(#view-admin.on) #main, body:has(#view-admin-records.on) #main, body:has(#view-miner-log.on) #main { max-width: 1280px; }
    /* Phones: the server-rendered pages' type scale (sp-pages.css — h1 32, lede 15,
       h2 20). 2026-10-07: .page-title, .page-sub, .rc-sub and the Data explorer's
       head take it below their own base rules — listed here, above them, they never
       applied ("People" stayed 40px on a 390px phone). */
    @media (max-width: 640px) {
      #main { padding: 24px 16px 48px; }
      .lgl-wrap h1, .ap-heading h1 { font-size: var(--fs-2xl); }
      .lgl-wrap h2, .wal-section-head { font-size: var(--fs-lg); }
      .ap-heading p { font-size: var(--fs-base); }
    }
    /* P5: the SPA's footer sits inside <main>, so its soft band is a rounded panel, not a clipped strip. */
    #main > .sp-foot { border: 0; border-radius: var(--r-xl); }

    /* 2026-09-30 (SPA visual pass): a view's head is the SSR page head — the h1
       is .sp-h1 (40px / 700, 32px on a phone), its sentence .sp-lede (17px --dim,
       62ch), the block .sp-head (32px below). The accent word the SPA titles
       carried ("Strategy <em>Lab</em>", "New <em>today</em>") is plain now: no
       server-rendered heading colours a word. A sub-view's own title inside a
       merged page (New today under Ideas) is an h2.page-title, and reads as a
       section h2 (.sp-h2, 22px), not a second h1; the sentences under it read at
       the body size. */
    .page-head { margin-bottom: 32px; display: flex; justify-content: space-between; align-items: flex-end; gap: 24px; }
    .page-title { font-family: var(--font); font-size: 40px; font-weight: 700; letter-spacing: -.028em; line-height: 1.12; }
    .page-title em { color: inherit; font-style: normal; font-weight: inherit; }
    h2.page-title { font-size: 22px; letter-spacing: -.018em; line-height: 1.25; }
    .page-sub { margin-top: 10px; font-size: var(--fs-md); color: var(--dim); max-width: 62ch; line-height: 1.55; }
    h2.page-title ~ .page-sub { font-size: var(--fs-base); }
    @media (max-width: 640px) {
      .page-title { font-size: var(--fs-2xl); }
      h2.page-title { font-size: var(--fs-lg); }
      .page-sub { font-size: var(--fs-base); }
    }
    /* P3-C3 (C-IDEAS / C-PROOF): the merged pages' head — the page's one h1,
       its sentence and the sub-tab strip (Ideas: This week's Top 10 · New
       today; Proof: Record · Still open · How we grade). The
       strip scrolls sideways on a narrow phone instead of widening the page.
       Sizes inherit (the font-size ratchet: no new px literals). */
    .sp-merged-head { margin-bottom: 32px; }   /* the panel under the tab strip starts where an SSR page's first section would */
    .sp-merged-head .page-head { margin-bottom: 24px; }
    .sp-subtabs { display: flex; gap: 4px; overflow-x: auto; scrollbar-width: none; border-bottom: 1px solid var(--border); }
    .sp-subtabs::-webkit-scrollbar { display: none; }
    .sp-subtab { display: inline-flex; flex: none; align-items: center; margin-bottom: -1px; padding: 11px 16px; color: var(--mute); font-size: inherit; font-weight: 500; white-space: nowrap; text-decoration: none; border-bottom: 2px solid transparent; }
    .sp-subtab:hover { color: var(--text); text-decoration: none; }
    .sp-subtab.on { color: var(--text); font-weight: 600; border-bottom-color: var(--accent); }
    /* 2026-10-07: on a phone too the strip stays one line (it wrapped "How we grade"
       onto a row of its own, ml_13_s1); the three Track record tabs fit at 390px. */
    @media (max-width: 640px) { .sp-subtab { padding: 10px 9px; min-height: 44px; } }
    /* Proof › Record's own pieces (P3-C3): the ledger's line, the tables'
       captions (their headers read at the table's size, not 9px), the
       seed-cohort and how-it-works blocks. */
    .rc-fresh { margin: 8px 0 12px; }
    .rc-table { min-width: 560px; }
    .rc-table th { font-size: inherit; }
    .rc-table .rc-num { text-align: right; }
    .rc-table .rc-date { white-space: nowrap; }
    .rc-table .rc-tk { font-weight: 700; }
    .rc-caption { caption-side: top; padding: 0 0 6px; color: var(--mute); text-align: left; }
    .rc-note { margin: 10px 0 0; color: var(--mute); line-height: 1.6; }
    .rc-empty { color: var(--mute); line-height: 1.6; }
    .rc-empty strong { color: var(--text); }
    .rc-sub { margin: 40px 0 12px; color: var(--text); font-size: 22px; font-weight: 700; letter-spacing: -.018em; line-height: 1.25; }
    @media (max-width: 640px) { .rc-sub { font-size: var(--fs-lg); } }
    .rc-how { margin: 0; padding-left: 18px; color: var(--mute); line-height: 1.7; }
    /* R11 (FUN-02): the Top 10's record first, the tiles' gap, the folded closes. */
    .rc-sub--first { margin-top: 4px; }
    .strats-mini-dash.rc-tiles, .rc-card { margin-bottom: 14px; }
    .strats-mini-dash.rc-tiles { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }
    /* "See the basket's record →" under the tiles is the SSR .sp-more link */
    .rc-tiles + .rc-note > a { font-weight: 600; text-decoration: none; }
    .rc-tiles + .rc-note > a:hover { text-decoration: underline; }
    .rc-more > summary { margin-top: 10px; padding: 6px 0; color: var(--accent); font-weight: 600; cursor: pointer; }
    .rc-more > summary:hover { text-decoration: underline; text-underline-offset: 3px; }

    .view { display: none; }
    .view.on { display: block; animation: fadeUp .3s ease both; }
    /* PERF-05 (r11): a view holds a screen's height before its data lands, so
       the footer after it starts below the fold instead of being pushed down
       when the content renders (CLS 0.30 on /proof, 0.33 on /people). */
    #main > .view.on { min-height: calc(100vh - 80px); }

    /* 2026-09-30 (SPA visual pass, dead-rule sweep): rules no markup, script,
       app.js or web/src draws any more were removed — the retired Trades view's
       stat row, net-flow bar, date / filter pills (.pill, .date-pill, .fdiv,
       .flbl), volume chart and table (#tbl-wrap, .tbl-head, .th, .trow, .td,
       .tname …), the hot-stocks hero (.hs-*), the home hero heads (.hh-*,
       .home-page-head, .home-hero-head), the Master Portfolio strip (.mp-*),
       the weekly-picks cards (.wp-*), the trades sidebar (.sb-*, .tk*, .prow),
       the net-flow card (.nf-*), the activity heatmap (.hm-*), the top-picks
       grids (.htp-*, .tp-*) and the overlap modal (.overlap-*); the retired
       Strategies grid's cards and command bar (.strat-card, .sc-* but
       .sc-grade, .sig-preview, .stt-*, .scb-*, .stp-*, .strats-source-*,
       .strats-flat-*, .bld-entry*); and the one-off leftovers (.filter-chip-wrap,
       .wal-tab, .key-box / #btn-connect, .view-loading, .no-prices-warning,
       .tb-note, .lgl-todo, .live-dot, .adm-summary, .wl-pick-*, .tname-row,
       .smd-card-icon / -lbl). */
    .sicon { color: var(--mute); font-size: 13px; }   /* the command palette's search glyph */

    /* ── Pulse strip (F&G / Biotech / Options / Open signals) — always visible ──
       4 mini cards at the top of the strategies page. Each card doubles as a
       filter shortcut: clicking toggles the matching theme chip in the command
       bar below and scopes the strategy grid + reveals the contextual panel. */
    .strats-mini-dash { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin-top: 18px; }
    @media (max-width: 1100px) { .strats-mini-dash { grid-template-columns: repeat(2, 1fr); } }
    /* ≤600px (2026-07-14): one horizontal-scroll row instead of 4 stacked
       cards — the stack pushed the strategy grid another ~280px down the
       page. Snap + edge gradient mirror the .mobile-hscroll idiom. */
    @media (max-width: 600px)  {
      .strats-mini-dash {
        grid-template-columns: none;
        grid-auto-flow: column; grid-auto-columns: minmax(220px, 78%);
        overflow-x: auto; -webkit-overflow-scrolling: touch;
        scroll-snap-type: x proximity;
        background-image: linear-gradient(to right, transparent calc(100% - 14px), var(--bg) 100%);
        background-attachment: local;
      }
      .strats-mini-dash > * { scroll-snap-align: start; }
    }
    /* The News page's top-ticker sentiment cards (.tts-*) — REMOVED 2026-09-24 (P3-C5). */
    .smd-card { display: flex; align-items: flex-start; gap: 12px; padding: 16px 18px; background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); cursor: pointer; transition: border-color .12s, background .12s; text-align: left; font-family: inherit; color: var(--text); }
    .smd-card:hover { border-color: var(--accent-soft); }
    .smd-card.loading { color: var(--mute); cursor: progress; }
    .smd-card.active { border-color: var(--accent); background: var(--accentbg); }
    .smd-card-body { flex: 1; min-width: 0; }
    /* 2026-09-30: a Record tile is the SSR .sp-tile — label 13px / 500 --mute, the
       figure 24px / 700 in the site font, the line under it 13px --mute. */
    .smd-card-eyebrow { display: block; font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--mute); }
    .smd-card-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin-top: 6px; }
    .smd-card-num { font-variant-numeric: tabular-nums; font-size: 24px; font-weight: 700; line-height: 1.1; letter-spacing: -.02em; }
    .smd-card-sub { display: block; font-size: 13px; line-height: 1.4; color: var(--mute); margin-top: 6px; }
    /* The compare view's eyebrow. (section-head, section-title and section-sub went 2026-10-10: no SPA template
       emits them — the live heads are wal-section-head and gloss-section-title; git log -S section-title.) */
    .section-ey { font-size: 13px; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); font-weight: 700; }

    /* ══════════════════ STRATEGIES ══════════════════ */
    /* (.disclaimer — the retired Strategies page's banner — went 2026-09-30: no SPA markup draws it; the one disclaimer text is the shell footer's.) */

    .loading-sub { font-size: 12px; margin-top: 12px; max-width: 380px; margin-left: auto; margin-right: auto; line-height: 1.7; }

    /* (The retired Strategies grid's cards, compact mode, picks chips, signals
       strip, command bar, theme panels and flat-list head went with their
       markup — P3-C3 / Lane S; their last rules were swept 2026-09-30. The
       Record tab still lays its tiles out as .strats-mini-dash / .smd-card.) */
    /* (.ra-* — the strategy page's platform-wide recent-activity feed — went
       with the SPA strategy page, P4d.) */

    /* Confidence Grade pill (2026-05-29) — the watchlist's strategy cards. */
    .sc-grade { display: inline-flex; align-items: center; gap: 4px; min-height: 24px; padding: 0 10px; font-size: 12px; font-weight: 700; letter-spacing: .02em; border-radius: var(--r-pill); border: 0; }
    .sc-grade-strong    { background: var(--buybg);  color: var(--buy); }
    .sc-grade-promising { background: var(--warnbg); color: var(--warn); }
    .sc-grade-unproven, .sc-grade-unrated { background: var(--surf2); color: var(--mute); }
    .sc-grade-negative  { background: var(--sellbg); color: var(--sell); }

    /* P1-B4 (2026-09-24): two dead blur rules removed — the strategy page's
       "trade rows 7+" soft paywall (it matched .sd-trade-row / tr.tradeRow,
       classes no renderer emits; the gated payload ships five trades anyway)
       and the generic paywall-overlay class with its corner chip (no call
       site ever used it). The inline lock card is the only lock UI. */
    /* P1-B4 (2026-09-24, F30): the freemium CSS blur is retired — the rule
       that blurred the Strategies mini-dash, gated grid-card bodies, a gated
       strategy page and the Results "Still open" table for body.sp-locked
       visitors, and its .sc-cta exemption. A blur over data the visitor had
       already downloaded was not a paywall: the server gates the data, and
       every lock is one inline SP.ui.lockCard. (History of the retired rule:
       2026-05-30 "headlines only"; 2026-07-14 scoped to gated payloads;
       2026-07-31 verdict/short-banner exemptions; 2026-08-16 lock-card
       exemption; P0-F29 removed the News grid from it.) */
    /* Nav lock glyph — marks paid destinations for non-subscribers; hidden for
       paid users (body loses .sp-locked). P3-C2: the nav's rules (and one
       .ic.nav-lock rule for every glyph) are the shell's stylesheet's now. */
    /* Same convention for paid-destination CTAs outside the nav (2026-08-16:
       the account page's "Open the builder" button looked unlocked to free
       users but hits the paywall). Hidden for paid users, gold for locked. */
    .ap-btn .nav-lock { display: none; width: 11px; height: 11px; margin-left: 5px; color: inherit; vertical-align: -1px; }
    body.sp-locked .ap-btn .nav-lock { display: inline-block; }
    /* In-flow upgrade prompt — only while a locked user is ON a gated view. */
    #sp-unlock-bar { display: none; }
    body.sp-locked:has(#view-strategies.on) #sp-unlock-bar,
    body.sp-locked:has(#view-activity.on) #sp-unlock-bar { display: flex; }
    /* (#view-top10 left this list with the SPA's top10 view — P5.) */
    #sp-unlock-bar {
      position: relative; margin: 0 auto 24px; width: fit-content;
      align-items: center; gap: 14px; max-width: calc(100vw - 28px);
      background: var(--surf); border: 1px solid var(--accent-soft);
      box-shadow: var(--shadow-lg); border-radius: var(--r-md); padding: 12px 18px;
    }
    #sp-unlock-bar .spu-txt { font-size: 13px; color: var(--text); line-height: 1.4; }
    #sp-unlock-bar .spu-txt strong { color: var(--accent); }
    #sp-unlock-bar .spu-txt s { color: var(--mute); opacity: .6; font-weight: 500; }
    #sp-unlock-bar .spu-cta {
      display: inline-flex; align-items: center; min-height: 44px;
      background: var(--accent-fill); color: #fff; text-decoration: none; font-weight: 600;
      font-size: var(--fs-base); padding: 0 22px; border-radius: var(--r-pill); white-space: nowrap;
      transition: box-shadow .15s, transform .15s;
    }
    #sp-unlock-bar .spu-cta:hover { color: #fff; box-shadow: var(--shadow-lg); transform: translateY(-1px); }
    /* W5 (2026-07-30 walkthrough): the bar had no dismiss control. The ×
       hides it for 7 days (localStorage, wired in boot JS). The pricing
       page is unaffected either way — #view-pricing was never in the
       :has() show-list above. !important for the same specificity reason
       as body.cb-open below. */
    #sp-unlock-bar .spu-x {
      display: inline-flex; align-items: center; justify-content: center;
      background: none; border: none; border-radius: 50%; color: var(--mute); cursor: pointer;
      font-size: 18px; line-height: 1; min-width: 44px; min-height: 44px; padding: 0; align-self: center;
      transition: background-color .15s, color .15s;
    }
    #sp-unlock-bar .spu-x:hover { color: var(--text); background: var(--surf2); }
    body.spu-dismissed #sp-unlock-bar { display: none !important; }
    @media (max-width: 560px) {
      #sp-unlock-bar { flex-direction: column; gap: 8px; text-align: center; padding-right: 44px; }
      #sp-unlock-bar .spu-x { position: absolute; top: 4px; right: 4px; }
    }
    /* Bottom-slot manager (2026-07-14): only one fixed bottom surface at a
       time — while the cookie banner (z9999) is up, the unlock bar (z600)
       yields. !important because the show rules above ride :has(#view-…)
       selectors whose ID argument out-specifies any plain class chain. */
    body.cb-open #sp-unlock-bar { display: none !important; }
    /* Bottom-slot manager, part 2 (go-live audit 2026-07-31): the fixed
       unlock bar buried three other bottom-anchored surfaces — the
       scroll-to-top button (z100), the News "N new stories" pill (z150),
       and the page tail with the footer's Terms/Privacy links. The bar
       shows/hides via pure-CSS :has() rules, so a ResizeObserver in JS
       measures it into --unlock-clear (distance from viewport bottom to
       the bar's top edge; 0px while hidden). Body padding lets the footer
       scroll clear of the bar; scroll-top and the news pill add the same
       clearance to their bottom offsets at their own rules. */
    /* P0-F36: + --cb-clear, the cookie bar's measured height while it is up
       (0px otherwise; the unlock bar is hidden while it is up, so the two
       never add together). */
    body { padding-bottom: calc(var(--unlock-clear, 0px) + var(--cb-clear, 0px)); }
    /* (.sd-perf-block and its head, title and sub-line — the strategy page's
       holding-period cards — went with the SPA strategy page, P4d; the table
       rules below stay: the Record's closed table is .sd-perf-table.) */
    .sd-perf-table { width: 100%; border-collapse: collapse; font-size: 14px; }
    .sd-perf-table th { text-align: left; padding: 12px 16px; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; white-space: nowrap; color: var(--mute); font-weight: 600; background: var(--bg-soft); border-bottom: 1px solid var(--border); }
    .sd-perf-table td { padding: 14px 16px; font-variant-numeric: tabular-nums; border-bottom: 1px solid var(--border); color: var(--text); }
    .sd-perf-table tbody tr:hover { background: var(--bg-soft); }
    @media (min-width: 641px) {
      .rc-scroll { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); overflow: hidden; }
      .rc-scroll .rc-caption { padding: 14px 16px 10px; }
    }
    .sd-perf-table tr:last-child td { border-bottom: none; }
    .sd-perf-table td.up { color: var(--buy); }
    .sd-perf-table td.down { color: var(--sell); }
    .sd-perf-table td.muted { color: var(--mute); }
    .sd-perf-table th.num, .sd-perf-table td.num { text-align: right; }
    /* (The holding-period table's row highlight, .sd-dual, .sd-leak,
       .sd-current-signals and the model portfolio's .model-portfolio / .mp-*
       rules — the strategy page's — went with the SPA strategy page, P4d. The
       Master Portfolio strip's .mp-* rules above are an older back-compat
       leftover.) */

    /* (.sd-cs-* — the strategy page's ideas table — and .sd-tg-* — its winners /
       losers cards — went with the SPA strategy page, P4d.) */
    /* P4b: Still open's summary tiles — labels and sub-lines at 11px (they were inline 9px / 9.5px, under the snap floor). */
    .os-stat { flex: 1; min-width: 104px; padding: 9px 12px; }
    .os-stat-lbl { color: var(--mute); font-size: var(--fs-xs); letter-spacing: .06em; text-transform: uppercase; }
    .os-stat-val { margin-top: 2px; font-size: 1.25rem; font-weight: 700; font-variant-numeric: tabular-nums; }
    .os-stat-sub { margin-top: 1px; color: var(--mute); font-size: var(--fs-xs); }

    /* ══════════════════ STRATEGY DETAIL — REMOVED 2026-09-24 (P4d) ══════════════════
       /strategy/<key> is server-rendered; the SPA strategy page's rules went
       with it (the header, the short banner, the fired-on list, the
       verdict strip and its range band, the model portfolio, the ideas table
       and its filters, the winners / losers cards, the backtest section, the
       by-sell-rule bars, the all-trades modal, the grade hook, the star, the
       range pills, the recent-activity feed). Kept, used elsewhere: the back
       button (the two compare pages), .sd-chart-* (the Top 10, New today,
       Proof), .sd-grade* / .sd-disclosure* / .sd-receipts / .rcpt-* (the
       Strategy Lab's verdict) and .sd-perf-table (the Record's closed table). */
    .sd-back, .td-back {
      display: inline-flex; align-items: center; gap: 6px; min-height: 44px;
      font-size: var(--fs-base); font-weight: 600;
      color: var(--accent); background: none; border: none; cursor: pointer;
      font-family: inherit; padding: 0; margin-bottom: 8px;
    }
    .sd-back:hover, .td-back:hover { text-decoration: underline; text-underline-offset: 3px; }

    /* Confidence Grade banner (2026-05-29) — the one-glance "does this work?"
       verdict, above the verdict strip. Color keyed by grade. */
    .sd-grade { display: flex; gap: 16px; align-items: center; padding: 20px 24px; margin-bottom: 16px; border-radius: var(--r-lg); border: 1px solid var(--border); background: var(--surf); }
    .sd-grade-badge { flex-shrink: 0; font-size: 15px; font-weight: 700; padding: 8px 16px; border-radius: var(--r-pill); letter-spacing: .01em; white-space: nowrap; }
    .sd-grade-body { flex: 1; min-width: 0; }
    .sd-grade-sentence { font-size: 14px; line-height: 1.5; color: var(--text); }
    .sd-grade-sentence strong { font-weight: 700; }
    .sd-grade-ci { font-size: 12px; color: var(--mute); margin-top: 6px; }
    .sd-grade-flag { display: inline-block; margin-left: 8px; padding: 2px 10px; border-radius: var(--r-pill); background: var(--surf2); font-size: 12px; font-weight: 600; }
    /* 2026-09-30: the verdict is a tinted box — the grade's tint, no coloured edge —
       and its badge a --surf pill in the grade's colour (both themes). */
    .sd-grade-strong    { border-color: transparent; background: var(--buybg); }
    .sd-grade-strong    .sd-grade-badge { background: var(--surf); color: var(--buy); }
    .sd-grade-promising { border-color: transparent; background: var(--warnbg); }
    .sd-grade-promising .sd-grade-badge { background: var(--surf); color: var(--warn); }
    .sd-grade-unproven, .sd-grade-unrated { border-color: transparent; background: var(--bg-soft); }
    .sd-grade-unproven  .sd-grade-badge, .sd-grade-unrated .sd-grade-badge { background: var(--surf); color: var(--mute); }
    .sd-grade-negative  { border-color: transparent; background: var(--sellbg); }
    .sd-grade-negative  .sd-grade-badge { background: var(--surf); color: var(--sell); }
    @media (max-width: 600px) { .sd-grade { flex-direction: column; align-items: flex-start; gap: 10px; } }

    /* AI Signal Explainer styles removed 2026-06-06 — feature superseded by the
       plain-English strategy descriptions (_PLAIN_DEFS.json). */

    /* Disclosure styling for collapsed-by-default sections (the Strategy
       Lab's receipts and trades; the strategy page's drawers used it too,
       until P4d). Uses native <details> so it works without JS; the summary
       chevron rotates when open via the [open] selector. */
    .sd-disclosure { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); margin-bottom: 24px; overflow: hidden; }
    .sd-disclosure > summary { padding: 16px 24px; cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: 12px; font-size: 13px; color: var(--text); font-weight: 600; }
    .sd-disclosure > summary::-webkit-details-marker { display: none; }
    .sd-disclosure > summary::after { content: "▾"; color: var(--mute); font-size: 12px; transition: transform .15s ease; }
    .sd-disclosure[open] > summary::after { transform: rotate(180deg); }
    .sd-disclosure > summary:hover { background: var(--bg-soft); }
    .sd-disclosure-sub { font-size: 12px; color: var(--mute); font-weight: 400; margin-left: auto; padding-right: 12px; }
    .sd-disclosure-body { padding: 0 24px 22px; border-top: 1px solid var(--border); }
    .sd-disclosure-body > * + * { margin-top: 14px; }
    /* When the disclosure body wraps existing card-style children (drift +
       activity), give them transparent backgrounds + remove their own borders
       so the disclosure container provides the chrome. */
    .sd-disclosure-body .sd-chart-card { background: transparent; box-shadow: none; border: none; padding: 18px 0; }
    .sd-disclosure-body .sd-chart-card + .sd-chart-card { border-top: 1px solid var(--border); }

    /* Receipts Mode (2026-06-04) — honest, de-biased grade shown with its work,
       inside a collapsed <details> under the grade banner. The trust artifact. */
    .sd-receipts { margin-bottom: 14px; }
    .sd-receipts > summary { color: var(--accent); }
    .rcpt-table { width: 100%; border-collapse: collapse; font-size: 13px; }
    .rcpt-table td { padding: 7px 0; border-bottom: 1px solid var(--border); vertical-align: top; line-height: 1.45; }
    .rcpt-table tr:last-child td { border-bottom: none; }
    .rcpt-table td:first-child { color: var(--mute); width: 46%; padding-right: 14px; }
    .rcpt-table td:last-child { color: var(--text); font-variant-numeric: tabular-nums; }
    .rcpt-sub { color: var(--mute); font-size: 12px; font-weight: 400; }
    .rcpt-strike { text-decoration: line-through; color: var(--mute); opacity: .75; }
    .rcpt-vs { color: var(--mute); font-size: 12px; margin-left: 6px; }
    .rcpt-warn { color: var(--warn); font-size: 12px; margin-left: 4px; white-space: nowrap; }
    .rcpt-ok { color: var(--buy); font-size: 12px; margin-left: 4px; white-space: nowrap; }
    .rcpt-pending { color: var(--mute); font-style: italic; }
    .rcpt-catch { font-size: 13px; line-height: 1.55; color: var(--mute); margin: 12px 0 0; font-style: italic; }
    .rcpt-catch strong { color: var(--text); font-style: normal; }
    a.rcpt-method { display: inline-block; margin-top: 12px; font-size: 12px; color: var(--accent); text-decoration: none; }
    a.rcpt-method:hover { text-decoration: underline; }

    /* Strategy Lab (/#/builder) — Honest Strategy Builder. Reuses .sd-grade /
       .sd-receipts / .rcpt-* for the verdict (same receipts presentation as
       strategy detail — the barbell rule); these are just the picker chrome. */
    .bld-layout { display: grid; grid-template-columns: minmax(0, 340px) minmax(0, 1fr); gap: 18px; margin-top: 16px; align-items: start; }
    /* C1 (2026-08-16): one-column ≤900px used to render the ~700px picker
       FIRST, so a run's verdict/insufficient-banner/error all painted below
       the fold — "Run produces nothing". Once any result state exists the
       result column takes over the top slot, so re-runs keep it on screen;
       _bldScrollToResult() handles the first run's scroll. */
    @media (max-width: 900px) {
      .bld-layout { grid-template-columns: 1fr; }
      .bld-layout.bld-has-result .bld-picker-col { order: 2; }
    }
    .bld-result-col { scroll-margin-top: 84px; }   /* sticky 64px nav clearance for scrollIntoView */
    .bld-panel { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); padding: 24px; }
    .bld-slots { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 10px; min-height: 30px; }
    .bld-slot { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 8px 0 12px; border: 0; border-radius: var(--r-pill); font-size: 13px; font-weight: 600; color: var(--accent); background: var(--accentbg); }
    .bld-slot button { background: none; border: none; color: var(--mute); cursor: pointer; font-size: 13px; line-height: 1; padding: 1px 2px; }
    .bld-slot button:hover { color: var(--sell); }
    .bld-search { width: 100%; box-sizing: border-box; min-height: 40px; padding: 0 12px; border: 1px solid var(--field-border); border-radius: var(--r-md); background: var(--surf); color: var(--text); font-family: inherit; font-size: 14px; }
    .bld-mode-cap { font-size: 12px; color: var(--mute); line-height: 1.55; margin: -2px 0 10px; }
    .bld-mode-cap b { color: var(--dim); }
    .bld-palette-foot { font-size: 12px; color: var(--mute); line-height: 1.5; margin: 6px 0 0; }
    .bld-list-legend { font-size: 12px; color: var(--mute); text-transform: uppercase; letter-spacing: .05em; margin: 8px 0 0; }
    .bld-dir { font-size: 12px; flex: 0 0 auto; }
    .bld-clear { min-height: 32px; background: none; border: 1px solid var(--border2); border-radius: var(--r-pill); color: var(--dim); cursor: pointer; font-family: inherit; font-size: 13px; font-weight: 600; padding: 0 12px; }
    .bld-clear:hover { color: var(--sell); border-color: var(--sell); }
    .bld-list { max-height: 380px; overflow-y: auto; margin-top: 8px; border-top: 1px solid var(--border); }
    .bld-row { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left; padding: 8px 6px; border: none; border-bottom: 1px solid var(--border); background: transparent; color: var(--text); cursor: pointer; font-family: inherit; font-size: 14px; }
    .bld-row:hover { background: var(--surf2); }
    .bld-row .bld-row-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .bld-row .bld-row-alpha { font-variant-numeric: tabular-nums; font-size: 12px; color: var(--mute); white-space: nowrap; }
    .bld-mode { display: flex; gap: 4px; margin: 10px 0; padding: 4px; background: var(--surf2); border-radius: var(--r-pill); }
    .bld-mode button { flex: 1; min-height: 40px; padding: 0 12px; border: 0; background: transparent; color: var(--dim); border-radius: var(--r-pill); cursor: pointer; font-family: inherit; font-size: 14px; font-weight: 500; transition: background-color .15s, color .15s; }
    .bld-mode button:hover { color: var(--text); }
    .bld-mode button.on { color: var(--text); font-weight: 600; background: var(--surf); box-shadow: var(--shadow); }
    .bld-run { width: 100%; min-height: 44px; padding: 0 22px; border: none; border-radius: var(--r-pill); background: var(--accent-fill); color: #fff; font-weight: 600; font-size: var(--fs-base); cursor: pointer; font-family: inherit; margin-top: 4px; transition: box-shadow .15s, transform .15s; }
    .bld-run:hover:not(:disabled) { box-shadow: var(--shadow-lg); transform: translateY(-1px); }
    .bld-caveat { font-size: 13px; line-height: 1.55; color: var(--mute); border-left: 3px solid var(--border2); padding: 4px 0 4px 12px; margin: 14px 0 0; }
    /* A run too thin to grade is a verdict box in the "some evidence" tone: the tint, no coloured edge. */
    .bld-insufficient { margin: 0 0 12px; padding: 16px 20px; font-size: 14px; line-height: 1.55; color: var(--text); background: var(--warnbg); border-radius: var(--r-lg); }
    .bld-insufficient strong { color: var(--warn); }
    .bld-ing-table { width: 100%; border-collapse: collapse; font-size: 14px; }
    .bld-ing-table th { text-align: left; font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--mute); padding: 6px 8px; border-bottom: 1px solid var(--border); }
    .bld-ing-table td { padding: 7px 8px; border-bottom: 1px solid var(--border); font-variant-numeric: tabular-nums; }
    .bld-empty { padding: 26px 18px; text-align: center; color: var(--mute); font-size: 13px; line-height: 1.6; }
    .bld-saved-row { display: flex; align-items: center; gap: 8px; padding: 8px 6px; border-bottom: 1px solid var(--border); font-size: 14px; }
    .bld-saved-row .bld-saved-load { flex: 1; text-align: left; background: none; border: none; color: var(--text); cursor: pointer; font-family: inherit; font-size: 14px; padding: 0; }
    .bld-saved-row .bld-saved-load:hover { color: var(--accent); }
    .bld-saved-row .bld-saved-del { background: none; border: none; color: var(--mute); cursor: pointer; padding: 2px 4px; }
    .bld-saved-row .bld-saved-del:hover { color: var(--sell); }
    /* Locked teaser cards */
    .bld-teaser-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 14px; margin-top: 16px; }
    .bld-teaser-card { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 20px; }
    .bld-teaser-recipe { font-size: 13px; color: var(--mute); margin: 0 0 10px; line-height: 1.5; }
    .bld-teaser-recipe strong { color: var(--text); }
    /* Strategy-compare picker (C8, 2026-08-16) — reuses the Lab's .bld-* row
       idiom; the search+list fold behind a <details> once 2 are picked so the
       side-by-side receipts own the fold. */
    .cmps-pickbox { border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--surf); box-shadow: var(--shadow); padding: 12px 20px; }
    .cmps-pickbox > summary { cursor: pointer; font-size: var(--fs-base); font-weight: 600; color: var(--text); list-style: none; min-height: 44px; display: flex; align-items: center; gap: 8px; }
    .cmps-pickbox > summary::-webkit-details-marker { display: none; }
    .cmps-pickbox > summary::after { content: "▾"; color: var(--mute); font-size: 12px; margin-left: auto; }
    .cmps-pickbox[open] > summary::after { content: "▴"; }
    .cmps-pickbox .bld-list { max-height: none; overflow: visible; }
    .cmps-hold { padding: 14px 6px 6px; border-bottom: 1px solid var(--border); color: var(--dim); font-size: var(--fs-xs); font-weight: 600; }
    .cmps-empty { padding: 28px 20px; text-align: center; border: 1px dashed var(--border2); border-radius: var(--r-lg); color: var(--dim); font-size: var(--fs-base); line-height: 1.6; }
    .cmps-empty h2 { margin: 0 0 6px; color: var(--text); font-size: var(--fs-md); }
    .cmps-pairs { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 14px; }
    .cmps-pairs .lb-pill { white-space: normal; text-align: left; }
    /* C10 (2026-08-16): side-by-side is the entire point — ≤560px the
       auto-fit grid stacked the receipt columns vertically. Swipeable
       snap-scroll columns instead (the .strats-mini-dash idiom). */
    .cmps-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 14px; }
    .cmps-portrait { display:block; width:100%; height:auto; border-radius:6px; margin:0 0 18px; background:var(--surf2); }
    .cmps-timeline { list-style:none; padding:0; margin:14px 0 20px; display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; }
    .cmps-timeline li { position:relative; padding-top:17px; font-size:var(--fs-xs); line-height:1.45; border-top:1px solid var(--border); overflow-wrap:anywhere; }
    .cmps-timeline li::before { content:''; position:absolute; top:-4px; left:0; width:7px; height:7px; border-radius:50%; background:var(--mute); }
    .cmps-timeline strong { display:block; margin-bottom:4px; color:var(--text); }
    @media (max-width: 560px) {
      .cmps-cols {
        grid-template-columns: none;
        grid-auto-flow: column; grid-auto-columns: 80%;
        overflow-x: auto; -webkit-overflow-scrolling: touch;
        scroll-snap-type: x proximity;
        background-image: linear-gradient(to right, transparent calc(100% - 14px), var(--bg) 100%);
        background-attachment: local;
      }
      .cmps-cols > * { scroll-snap-align: start; }
    }
    /* P4c (2026-09-24): the two-person compare picker — #/compare/<name>/ names
       the first person and asks for the second (the server-rendered politician
       page's "Compare →"); sizes in rem, no inline styles. */
    .cmp-pick { max-width: 34rem; margin: 0 auto; padding: 24px; display: flex; flex-direction: column; gap: .6rem; background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); }
    .cmp-pick-ey { margin: 0; color: var(--accent); font-size: var(--fs-sm); font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
    .cmp-pick-title { margin: 0 0 .4rem; font-size: 1.5rem; line-height: 1.25; }
    .cmp-pick-vs { color: var(--mute); font-weight: 400; }
    .cmp-pick-lbl { color: var(--dim); font-size: var(--fs-sm); font-weight: 600; }
    .cmp-pick-input { min-height: 44px; padding: 0 12px; border: 1px solid var(--field-border); border-radius: var(--r-md); background: var(--surf); color: var(--text); font: inherit; }
    .cmp-pick-go { align-self: flex-start; }
    .cmp-pick-note { margin: .4rem 0 0; color: var(--mute); font-size: .8125rem; line-height: 1.5; }

    /* Conviction layer chips + receipt sheet — kept with their helpers (the P4c
       keep list); the stock page's conviction card that drew them, and its
       .conv-layers row and .conv-label pill, went with the SPA stock page
       (P4c). The board-only CSS went with the page fold into Today's
       "Stacked ideas (2+ agree)" filter (2026-08-19 dead-code sweep). */
    /* C12 (2026-08-16): chips are now <button>s opening the receipt sheet —
       cursor:help → pointer, plus button resets so the chip look survives. */
    .conv-layer { display: inline-flex; align-items: center; gap: 5px; min-height: 28px; padding: 0 10px; border-radius: var(--r-pill); background: var(--surf2); border: 1px solid transparent; font-size: 12px; color: var(--text); cursor: pointer; font-family: inherit; line-height: inherit; text-align: left; transition: border-color .12s, background-color .12s; }
    .conv-layer:hover { border-color: var(--accent); background: var(--accentbg); }
    .conv-layer b { font-weight: 600; }
    .conv-when { color: var(--mute); }
    .sd-chart-card { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); padding: 24px; }
    .sd-chart-empty { padding: 40px; text-align: center; color: var(--mute); font-size: 12px; }

    /* ── Admin data-sources table ───────────────────────────────────── */
    /* 2026-09-30: an admin table is the SSR table in its card (--r-lg, --shadow, a
       --bg-soft head at 12px / .04em), kept dense: 13px cells. */
    .adm-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 13px; background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); overflow: hidden; }
    .adm-table th { text-align: left; padding: 10px 14px; color: var(--mute); font-weight: 600; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; background: var(--bg-soft); border-bottom: 1px solid var(--border); white-space: nowrap; }
    .adm-table tbody tr:last-child > td { border-bottom: 0; }
    .adm-table th.num { text-align: right; }
    .adm-table td { padding: 12px 14px; border-bottom: 1px solid var(--border); vertical-align: middle; }
    .adm-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
    .adm-cat-row td { background: var(--surf2); padding: 6px 14px; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; color: var(--mute); font-weight: 600; }
    .adm-row:hover { background: var(--bg-soft); }
    .adm-label { font-size: 12px; font-weight: 500; color: var(--text); }
    .adm-source-link { color: var(--text); text-decoration: none; }
    .adm-source-link:hover { color: var(--accent); text-decoration: underline; }
    .adm-key { font-size: 12px; color: var(--dim); margin-top: 2px; }
    .adm-key code { background: none; padding: 0; }
    .adm-sched { min-height: 36px; background-color: var(--surf); border: 1px solid var(--field-border); border-radius: var(--r-md); color: var(--text); padding: 0 10px; font-size: 13px; font-family: inherit; cursor: pointer; appearance: none; -webkit-appearance: none; padding-right: 30px; background-image: linear-gradient(45deg, transparent 50%, var(--mute) 50%), linear-gradient(135deg, var(--mute) 50%, transparent 50%); background-position: calc(100% - 17px) 50%, calc(100% - 12px) 50%; background-size: 5px 5px; background-repeat: no-repeat; }
    /* 2026-09-30: the admin's buttons are the SSR pills at a toolbar size — 36px,
       13px / 600, --r-pill; the filled one keeps its fill and lifts on hover (it
       used to invert to an outline), the ghost one tints. */
    .adm-run { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 36px; padding: 0 16px; background: var(--accent-fill); color: #fff; border: 1px solid var(--accent-fill); border-radius: var(--r-pill); font-size: 13px; font-weight: 600; line-height: 1.2; white-space: nowrap; cursor: pointer; font-family: inherit; transition: box-shadow .15s, transform .15s, background-color .15s, border-color .15s; }
    .adm-run:hover:not(:disabled) { box-shadow: var(--shadow-lg); transform: translateY(-1px); }
    .adm-run:disabled { background: var(--surf2); color: var(--mute); border-color: var(--border); opacity: 1; }
    /* Admin tab strip (Sources | Strategies | Miner | Users | System) */
    /* Vitals strip — four always-visible ops answers above the tabs. */
    .adm-vitals { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin: 14px 0 4px; }
    /* 2026-09-30: a vital or a KPI is the SSR .sp-stat (--bg-soft, --r-lg / --r-md, no
       edge); a panel is the card (--r-lg, --shadow); a status badge is a tinted pill. */
    .adm-vital { background: var(--bg-soft); border: 1px solid transparent; border-radius: var(--r-lg); padding: 14px 16px; cursor: pointer; transition: border-color .15s, background-color .15s; }
    .adm-vital:hover { border-color: var(--border2); background: var(--surf2); }
    .adm-vital-ey { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--mute); font-weight: 700; margin-bottom: 4px; }
    .adm-vital-val { margin-top: 2px; font-size: 17px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; }
    .adm-vital-sub { font-size: 12px; color: var(--mute); margin-top: 2px; }
    .adm-vital.ok .adm-vital-val { color: var(--buy); }
    .adm-vital.warn .adm-vital-val { color: var(--warn); }
    .adm-vital.bad .adm-vital-val { color: var(--sell); }
    /* Stacked panes inside a merged tab get a visual seam. */
    .adm-tab-pane.on + .adm-tab-pane.on { margin-top: 28px; border-top: 1px solid var(--border); padding-top: 20px; }
    /* 2026-09-27 (the admin round): the bar sticks under the nav; a class vocabulary
       for every new admin block (no inline styles — the dashboard ratchets them). */
    .adm-tabs { position: sticky; top: var(--sp-header-h, 64px); z-index: 20; display: flex; gap: 2px; border-bottom: 1px solid var(--border); margin: 16px 0 18px 0; background: var(--bg); }
    .adm-loading { padding: 48px 24px; text-align: center; color: var(--mute); }
    .adm-panel { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); padding: 16px 20px; margin-bottom: 16px; }
    .adm-panel-h { display: flex; align-items: baseline; gap: 10px; margin: 0 0 10px; font-size: 0.75rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--text); }
    .adm-panel-h .adm-muted { font-weight: 500; letter-spacing: 0; text-transform: none; }
    .adm-panel-refresh { margin-left: auto; }
    .adm-muted { color: var(--mute); font-size: var(--fs-xs); }
    .adm-link { background: none; border: 0; padding: 0; color: var(--accent); font: inherit; font-size: 0.75rem; font-weight: 600; cursor: pointer; text-decoration: none; white-space: nowrap; }
    .adm-link:hover { text-decoration: underline; }
    .adm-grid-4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin-bottom: 10px; }
    .adm-grid-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-bottom: 10px; }
    .adm-kpi { padding: 12px 14px; background: var(--bg-soft); border-radius: var(--r-md); min-width: 0; }
    .adm-kpi-l { font-size: var(--fs-xs); letter-spacing: .06em; text-transform: uppercase; color: var(--mute); font-weight: 700; margin-bottom: 4px; }
    .adm-kpi-v { font-size: 1rem; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; }
    .adm-kpi-s { font-size: var(--fs-xs); color: var(--mute); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; }
    .adm-kpi.ok .adm-kpi-v { color: var(--buy); } .adm-kpi.warn .adm-kpi-v { color: var(--warn); } .adm-kpi.bad .adm-kpi-v { color: var(--sell); }
    .adm-attn { list-style: none; margin: 0; padding: 0; }
    .adm-attn-item { display: flex; align-items: flex-start; gap: 10px; padding: 9px 0; border-top: 1px solid var(--border); }
    .adm-attn-item:first-child { border-top: 0; }
    .adm-attn-dot { flex: none; width: 9px; height: 9px; margin-top: 5px; border-radius: 50%; background: var(--mute); }
    .adm-attn-item.bad .adm-attn-dot { background: var(--sell); } .adm-attn-item.warn .adm-attn-dot { background: var(--warn); } .adm-attn-item.info .adm-attn-dot { background: var(--accent); }
    .adm-attn-body { flex: 1; min-width: 0; }
    .adm-attn-text { font-size: 0.8125rem; font-weight: 600; color: var(--text); }
    .adm-attn-note { font-size: var(--fs-xs); color: var(--mute); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .adm-allclear { padding: 14px 0 6px; color: var(--buy); font-weight: 600; font-size: 0.8125rem; }
    .adm-progress { height: 8px; margin: 6px 0; overflow: hidden; background: var(--border); border-radius: var(--r-pill); }
    .adm-progress-fill { display: block; height: 100%; background: var(--accent); transition: width .3s; }
    .adm-progress--indet .adm-progress-fill { background: repeating-linear-gradient(90deg, var(--accent) 0 12px, var(--accent-soft) 12px 24px); }
    .adm-run-line { font-size: 0.75rem; color: var(--text); margin-bottom: 8px; }
    .adm-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-top: 10px; border-top: 1px solid var(--border); }
    .adm-actions .adm-link { margin-left: auto; }
    .adm-run--ghost { background: transparent; color: var(--accent); border-color: var(--border2); }
    .adm-run--ghost:hover:not(:disabled), .adm-run--danger:hover:not(:disabled) { box-shadow: none; transform: none; }
    .adm-run--ghost:hover:not(:disabled) { border-color: var(--accent); background: var(--accentbg); }
    .adm-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 12px; }
    .adm-toolbar .adm-filter { margin: 0; max-width: 260px; }
    .adm-check { display: inline-flex; align-items: center; gap: 5px; font-size: var(--fs-xs); color: var(--mute); cursor: pointer; }
    .adm-kpi-dim { color: var(--mute); font-weight: 500; font-size: .75rem; }
    .adm-note { margin-top: 8px; color: var(--mute); font-size: var(--fs-xs); }
    .adm-empty { padding: 26px; text-align: center; color: var(--mute); }
    .adm-load-error { color: var(--sell); }   /* AD-06: a failed read, never a zero */
    .adm-lines { display: grid; gap: 4px; margin-bottom: 10px; font-size: .75rem; }
    .adm-bad { color: var(--sell); }
    .adm-warn { color: var(--warn); }
    .adm-chips { display: flex; flex-wrap: wrap; gap: 4px; }
    .adm-panel--flush { margin-bottom: 0; }
    .adm-tracking { margin: 0 0 12px; }
    .adm-ok { color: var(--buy); }
    .adm-toolbar--tight { gap: 6px 10px; margin-bottom: 8px; }
    .adm-toolbar-end { margin-left: auto; }
    .adm-vsep { width: 1px; height: 18px; background: var(--border); margin: 0 2px; }
    .adm-num { width: 60px; min-height: 36px; padding: 0 8px; text-align: center; background: var(--surf); border: 1px solid var(--field-border); color: var(--text); font: inherit; font-size: 13px; border-radius: var(--r-md); }
    .adm-select { min-height: 36px; padding: 0 10px; background-color: var(--surf); border: 1px solid var(--field-border); color: var(--text); font: inherit; font-size: 13px; border-radius: var(--r-md); max-width: 320px; cursor: pointer; appearance: none; -webkit-appearance: none; padding-right: 30px; background-image: linear-gradient(45deg, transparent 50%, var(--mute) 50%), linear-gradient(135deg, var(--mute) 50%, transparent 50%); background-position: calc(100% - 17px) 50%, calc(100% - 12px) 50%; background-size: 5px 5px; background-repeat: no-repeat; }
    .adm-filter:focus, .adm-num:focus, .adm-select:focus, .adm-sched:focus, .adm-rec-search:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accentbg); }
    .adm-details > summary { cursor: pointer; color: var(--accent); font-size: .75rem; font-weight: 600; }
    .adm-details--row { padding: 6px 0; border-top: 1px solid var(--border); }
    .adm-details--row > div, .adm-details--row > .adm-jobs { margin-top: 8px; }
    .adm-jobs { font-size: var(--fs-xs); }
    .adm-sev { display: inline-block; padding: 2px 10px; font-size: var(--fs-xs); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--dim); background: var(--surf2); border-radius: var(--r-pill); }
    .adm-sev.bad { color: var(--sell); background: var(--sellbg); } .adm-sev.warn { color: var(--warn); background: var(--warnbg); }
    .adm-cell-time { white-space: nowrap; font-size: var(--fs-xs); color: var(--mute); vertical-align: top; }
    .adm-col-time { width: 150px; } .adm-col-sev { width: 80px; } .adm-col-scope { width: 100px; }
    .adm-msg { font-weight: 600; font-size: .75rem; }
    .adm-count-chip { display: inline-block; min-width: 2.2em; padding: 1px 6px; margin-right: 4px; text-align: center; font-variant-numeric: tabular-nums; font-size: var(--fs-xs); color: var(--accent); background: var(--accentbg); border-radius: var(--r-pill); }
    .adm-pre { margin: 4px 0 0; padding: 8px 10px; background: var(--surf2); border-radius: var(--r-sm); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: var(--fs-xs); overflow-x: auto; max-height: 200px; white-space: pre-wrap; }
    .adm-table--nested { margin-top: 6px; border: 0; border-radius: 0; box-shadow: none; }
    .adm-table--nested td { padding: 6px 8px; }
    .adm-pager { display: flex; gap: 8px; justify-content: center; margin-top: 14px; }
    .adm-spark { display: block; margin: 3px 0 0 auto; overflow: visible; }
    .adm-spark polyline { stroke: var(--mute); stroke-width: 1.5; stroke-linejoin: round; stroke-linecap: round; }
    .adm-spark.up polyline { stroke: var(--buy); }
    .adm-spark.down polyline { stroke: var(--sell); }
    .adm-accent { color: var(--accent); font-weight: 700; }
    .adm-fold { cursor: pointer; user-select: none; }
    .adm-fold-caret { display: inline-block; width: 14px; color: var(--mute); }
    .adm-table--gap { margin-bottom: 18px; }
    .adm-cell-actions { white-space: nowrap; }
    .adm-cell-actions .adm-run + .adm-run { margin-left: 4px; }
    .adm-cell-sm { font-size: var(--fs-xs); }
    .adm-col-cb { width: 30px; padding-left: 6px; }
    .adm-table input[type="checkbox"] { cursor: pointer; }
    .adm-th-filter { padding-top: 0; padding-bottom: 6px; }
    .adm-filter--sm { min-height: 32px; padding: 0 8px; font-size: var(--fs-xs); max-width: 100%; }
    .adm-sort-idle { color: var(--mute); opacity: .4; }
    .adm-run--big { min-height: 44px; font-size: var(--fs-base); padding: 0 24px; }
    .adm-run--danger { background: var(--sellbg); border-color: var(--sell); color: var(--sell); }
    .adm-toolbar--bulk { padding: 8px 12px; background: var(--accentbg); border: 0; border-radius: var(--r-md); }
    .adm-bulk-n { font-size: var(--fs-xs); font-weight: 700; color: var(--text); }
    .adm-panel--busy { background: var(--accentbg); border-color: var(--accent); margin-top: 10px; }
    @media (max-width: 760px) { .adm-grid-4, .adm-grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .adm-actions .adm-link { margin-left: 0; } }
    .adm-tab  { min-height: 44px; padding: 11px 16px; background: transparent; border: 0; color: var(--mute); font-family: inherit; font-size: 14px; font-weight: 500; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color .12s, border-color .12s; }
    .adm-tab:hover { color: var(--text); }
    .adm-tab.on { color: var(--text); font-weight: 600; border-bottom-color: var(--accent); }
    .adm-tab-pane { display: none; }
    .adm-tab-pane.on { display: block; }
    /* Phone-capable admin (2026-06-12): tabs scroll, tables scroll, touch targets. */
    @media (max-width: 640px) {
      .adm-vitals { grid-template-columns: 1fr 1fr; }
      .adm-tabs { overflow-x: auto; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
      .adm-tabs::-webkit-scrollbar { display: none; }
      .adm-tab { padding: 11px 13px; white-space: nowrap; }
      .adm-table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
      .adm-run { min-height: 40px; }
    }
    .adm-filter { width: 100%; max-width: 320px; min-height: 40px; padding: 0 12px; background: var(--surf); border: 1px solid var(--field-border); border-radius: var(--r-md); color: var(--text); font-family: inherit; font-size: 14px; margin-bottom: 12px; }
    .adm-sortable { cursor: pointer; user-select: none; }
    .adm-sortable:hover { color: var(--accent); }
    .adm-sort-arrow { color: var(--accent); margin-left: 4px; font-size: 12px; }
    .adm-pill { display: inline-block; padding: 2px 10px; font-size: 12px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; white-space: nowrap; color: var(--dim); background: var(--surf2); border: 0; border-radius: var(--r-pill); }
    .adm-pill.dep, .adm-pill.sell { color: var(--sell); background: var(--sellbg); }
    .adm-pill.act, .adm-pill.buy  { color: var(--buy); background: var(--buybg); }
    .adm-expand-row td { background: var(--bg-soft); padding: 0; border-top: none; }
    .adm-expand-content { padding: 14px 18px; font-size: 12px; line-height: 1.45; color: var(--text); }
    .adm-expand-hdr { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; padding-bottom: 8px; border-bottom: 1px solid var(--border); font-size: 12px; }
    .adm-expand-hdr strong { color: var(--accent); font-size: 12px; }
    .adm-expand-progress { display: flex; gap: 16px; align-items: center; font-size: 12px; color: var(--mute); }
    .adm-expand-progress .bar { width: 120px; height: 4px; background: var(--border); border-radius: var(--r-pill); position: relative; overflow: hidden; }
    .adm-expand-progress .bar > span { display: block; height: 100%; background: var(--accent); transition: width .3s; }
    .adm-log { max-height: 280px; overflow-y: auto; padding: 8px 12px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--r-md); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
    .adm-log-line { white-space: pre-wrap; padding: 1px 0; word-break: break-all; }
    .adm-log-line.muted { color: var(--mute); }
    .adm-log-line.error { color: var(--sell); }
    .adm-log-line.divider { color: var(--accent); padding-top: 4px; }
    .adm-expand-toggle { background: none; border: none; color: var(--accent); cursor: pointer; font-size: 12px; font-weight: 600; padding: 0; font-family: inherit; text-decoration: underline; text-underline-offset: 3px; }
    .adm-expand-toggle:hover { color: var(--text); }
    .adm-fold:hover { background: var(--bg-soft); }
    .adm-details > summary:hover { text-decoration: underline; text-underline-offset: 3px; }

    /* ── Admin record-browser ───────────────────────────────────────── */
    .adm-rec-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; margin-bottom: 18px; flex-wrap: wrap; }
    .adm-rec-search { min-height: 40px; background: var(--surf); border: 1px solid var(--field-border); border-radius: var(--r-md); color: var(--text); padding: 0 12px; font-size: 14px; font-family: inherit; min-width: 240px; }
    .adm-rec-table-wrap { overflow-x: auto; background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); }
    .adm-rec-table { width: 100%; border-collapse: collapse; font-size: 13px; }
    .adm-rec-table th { text-align: left; padding: 10px 12px; background: var(--bg-soft); color: var(--mute); font-weight: 600; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; border-bottom: 1px solid var(--border); white-space: nowrap; position: sticky; top: 0; }
    .adm-rec-table td { padding: 8px 12px; border-bottom: 1px solid var(--border); font-variant-numeric: tabular-nums; color: var(--text); white-space: nowrap; max-width: 240px; overflow: hidden; text-overflow: ellipsis; }
    .adm-rec-table tr:hover td { background: var(--bg-soft); }
    .adm-rec-pager { display: flex; gap: 14px; align-items: center; justify-content: center; padding: 16px; font-size: 12px; color: var(--mute); }
    .adm-rec-pager button { min-height: 36px; background: none; border: 1px solid var(--border2); border-radius: var(--r-pill); color: var(--accent); padding: 0 16px; font-size: 13px; font-weight: 600; cursor: pointer; font-family: inherit; transition: background-color .15s, border-color .15s; }
    .adm-rec-pager button:hover:not(:disabled) { border-color: var(--accent); background: var(--accentbg); }
    /* (.sd-history, .sd-hist-*, .since-neutral and .since-cue — the trade-history
       table the politician page last used — went with the SPA politician page, P4c.) */

    /* ══════════════════ TICKER DETAIL — REMOVED 2026-09-24 (P4c) ══════════════════
       /ticker/<SYM> is server-rendered; the SPA stock page's rules went with it
       (the hero, quick stats, card grid, section labels, chart and toolbar,
       trade list, tooltip and the TradingView technical-analysis frame).
       Kept: .td-card and its head rules — the Strategy Lab and the strategy
       compare page draw cards with them — and, from the same block, the
       avatar rules (the chart range pills and TradingView's credit line,
       kept then for the strategy page, went with it — P4d). */
    .td-card { background: var(--surf); border: 1px solid var(--border); box-shadow: var(--shadow); border-radius: var(--r-lg); padding: 24px; margin-bottom: 16px; transition: box-shadow .18s ease, transform .18s ease, border-color .18s ease; }
    .td-card-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; gap: 16px; flex-wrap: wrap; }
    .td-card-titles { }
    .td-card-ey { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--mute); margin-bottom: 4px; }
    .td-card-title { font-size: var(--fs-lg); font-weight: 700; letter-spacing: -.018em; line-height: 1.3; }
    /* Inline politician avatar (polAvatar) — the People rows and the compare view */
    .pol-mini-av { vertical-align: middle; flex-shrink: 0; }
    /* Leaderboard rows with photo-avatars — make the existing .lb-avatar
       circle act as a transparent host for the polAvatar() <img> */
    .lb-avatar-photo { background: transparent !important; padding: 0; overflow: hidden; }
    .lb-avatar-photo .pol-mini-av { width: 100% !important; height: 100% !important; border: none; }

    /* ══════════════════ POLITICIAN DETAIL — REMOVED 2026-09-24 (P4c) ══════════════════
       /politician/<name> is server-rendered; the SPA politician page's rules went
       with it (the hero, badges, stat tiles, rows, FEC grid, sector donut,
       best / worst buys, trajectory, monthly chart and most-traded tiles).
       Kept: .pd-card and its eyebrow / title and .pd-tt-sym — the two-person
       compare view draws with them — and, from the same block, the source-link
       icon and the trade link's underline. */
    .pd-card { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); padding: 24px; }
    .pd-card-ey { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--mute); margin-bottom: 4px; }
    .pd-card-title { font-size: var(--fs-lg); font-weight: 700; letter-spacing: -.018em; line-height: 1.3; margin-bottom: 18px; }
    .pd-tt-sym { font-size: 14px; font-weight: 600; color: var(--accent); margin-bottom: 4px; }
    .src-link { display: inline-block; padding: 0 4px; color: var(--mute); text-decoration: none; font-size: 12px; line-height: 1; opacity: 0.55; transition: opacity .12s, color .12s; vertical-align: middle; }
    .src-link:hover { opacity: 1; color: var(--accent); }
    /* P2-C2 (2026-09-24): a link to one trade's page (SP.ui.tradeLink — the
       strategy page's fired-on dates, New today's "trade →"; the stock and
       politician pages' date cells until P4c). The shared .sp-ent style is
       undecorated, which leaves a date looking like plain text — a dotted
       underline says it is a link. */
    a.sp-ent-trade { text-decoration: underline dotted; text-underline-offset: 2px; }

    /* ══════════════════ LEADERBOARD ══════════════════ */
    /* 2026-09-30: All People | Best stock pickers are the page's section tabs — the
       .sp-subtabs look (text tabs, a 2px accent rule under the chosen one), not a
       full-width segmented pill. */
    .lb-tabs { display: flex; gap: 4px; overflow-x: auto; scrollbar-width: none; margin-bottom: 20px; border-bottom: 1px solid var(--border); }
    .lb-tabs::-webkit-scrollbar { display: none; }
    .lb-tab { flex: none; min-height: 44px; margin-bottom: -1px; padding: 11px 16px; background: none; border: 0; border-bottom: 2px solid transparent; cursor: pointer; font-family: inherit; font-size: var(--fs-base); font-weight: 500; color: var(--mute); white-space: nowrap; transition: color .12s, border-color .12s; }
    .lb-tab:hover { color: var(--text); }
    .lb-tab.on { color: var(--text); font-weight: 600; border-bottom-color: var(--accent); }
    /* Phones (2026-10-07): the three tabs overflow 358px, and the strip cut "How Congress
       tra" hard at the edge. Its right edge fades while more sits beyond (a 32px spacer
       ends the row, so the last tab is clear once scrolled to). */
    @media (max-width: 640px) {
      .lb-tab { padding: 10px 9px; }
      .lb-tabs { -webkit-mask-image: linear-gradient(to right, var(--text) calc(100% - 32px), transparent); mask-image: linear-gradient(to right, var(--text) calc(100% - 32px), transparent); }
      .lb-tabs::after { content: ""; flex: none; width: 32px; }
    }

    /* .lb-window (the trade-window pills) — retired with their tabs (P3-C5). */
    /* inline-flex on the base rule (2026-07-14): .lb-pill is used on <a>
       CTAs (New today's "View →" / "Why & receipts") as well as <button>s —
       as plain inline anchors, min-height/vertical padding never actually
       grew their hit area. Same treatment .scb-row .lb-pill already had. */
    .lb-pill { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 0 14px; background: var(--surf); border: 1px solid var(--border2); border-radius: var(--r-pill); cursor: pointer; font-family: inherit; font-size: 14px; font-weight: 500; color: var(--dim); white-space: nowrap; text-decoration: none; transition: background-color .12s, color .12s, border-color .12s; }
    .lb-pill:hover { background: var(--bg-soft); color: var(--text); text-decoration: none; }
    .lb-pill.on { background: var(--accentbg); color: var(--accent); border-color: var(--accent); font-weight: 600; }
    /* (.lb-pill.sp-bridge — P2-C3, the stock and politician pages' bridges to /trades — went with those pages, P4c.) */

    .lb-table { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); overflow: hidden; }
    .lb-empty { padding: 60px 20px; text-align: center; color: var(--dim); font-size: var(--fs-base); background: var(--bg-soft); border: 1px dashed var(--border2); border-radius: var(--r-lg); }

    .lb-row { display: grid; align-items: center; padding: 14px 20px; border-bottom: 1px solid var(--border); cursor: pointer; transition: background .1s; position: relative; }
    /* P1-B2: stretched link — the one real link in a row or card that used to
       be a click target as a whole covers it via ::after (the container is
       positioned); the box stays one click target, now a real anchor. */
    .sp-stretch::after { content: ''; position: absolute; inset: 0; }
    .lb-row:last-child { border-bottom: none; }
    .lb-row:hover { background: var(--bg-soft); }
    .lb-row.lb-head { background: var(--bg-soft); cursor: default; padding: 12px 20px; }
    .lb-row.lb-head:hover { background: var(--bg-soft); }
    .lb-row.lb-head > div { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .04em; color: var(--mute); font-weight: 600; }

    /* The Most active / Most-watched stocks / Trending now grids (.lb-pols,
       .lb-ticks, .lb-movers) and their cells (.lb-ticker, .lb-val, .lb-cnt,
       .lb-split*, .lb-last, .lb-spark, .lb-trend*) — REMOVED 2026-09-24 with
       those tabs (P3-C5). */

    .lb-rank { font-variant-numeric: tabular-nums; font-size: var(--fs-base); font-weight: 700; color: var(--mute); letter-spacing: -.02em; }
    /* 2026-09-26 (the visuals round): medals for the top three, the trend sparkline, the hit-rate ring. */
    .lb-rank--1 { color: var(--medal1); } .lb-rank--2 { color: var(--medal2); } .lb-rank--3 { color: var(--medal3); }
    .lb-trend { display: flex; align-items: center; }
    .lb-spark { display: block; width: 84px; height: 26px; overflow: visible; }
    .lb-spark polyline { fill: none; stroke: var(--buy); stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; }
    .lb-spark.down polyline { stroke: var(--sell); }
    .lb-spark-zero { stroke: var(--border2); stroke-width: 1; stroke-dasharray: 2 3; }
    .lb-spark--none { display: block; width: 84px; height: 1px; background: var(--border); }
    .lb-ring { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border-radius: 50%; background: conic-gradient(var(--rc, var(--accent)) calc(var(--v, 0) * 1%), var(--surf3) 0); }
    .lb-ring > * { position: relative; }
    .lb-ring::before { content: ""; position: absolute; inset: 3px; border-radius: 50%; background: var(--surf); }
    .stagger-in .lb-spark polyline, .lb-table .lb-spark polyline { stroke-dasharray: 1; stroke-dashoffset: 0; animation: lbDraw 1.1s cubic-bezier(.22,.8,.36,1) both; }
    @keyframes lbDraw { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }
    .lb-name { display: flex; align-items: center; gap: 10px; min-width: 0; }
    .lb-avatar { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; flex-shrink: 0; letter-spacing: -.02em; }
    .lb-name-info { min-width: 0; }
    .lb-name-text { font-size: var(--fs-base); font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .lb-name-sub { font-size: 13px; color: var(--mute); margin-top: 1px; }
    /* How Congress trades (2026-09-30): the People page's third tab — sections of a lead sentence, bar rows (a .meter fill through data-pct) and ranked member lists. */
    .lb-beh-sec { padding: 18px 0 8px; border-top: 1px solid var(--border); }
    .lb-beh-sec:first-child { border-top: 0; padding-top: 4px; }
    .lb-beh-sec--field { border-top: 0; padding: 4px 0 16px; }
    .lb-beh-h2 { margin: 0 0 6px; font-size: var(--fs-md); font-weight: 700; color: var(--text); letter-spacing: -.01em; }
    .lb-beh-h3 { margin: 14px 0 6px; font-size: var(--fs-base); font-weight: 600; color: var(--dim); }
    .lb-beh-lead { margin: 0 0 8px; font-size: var(--fs-base); line-height: 1.55; color: var(--dim); max-width: 720px; }
    .lb-beh-lead strong { color: var(--text); font-variant-numeric: tabular-nums; }
    .lb-beh-note { margin: 10px 0 0; font-size: var(--fs-xs); line-height: 1.55; color: var(--mute); max-width: 720px; }
    .lb-beh-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 8px 32px; }
    .lb-beh-hist { display: grid; gap: 6px; }
    .lb-beh-row { display: grid; grid-template-columns: minmax(96px, 30%) 1fr minmax(120px, 34%); align-items: center; gap: 10px; min-height: 28px; font-size: var(--fs-sm); }
    .lb-beh-row--who { grid-template-columns: minmax(150px, 36%) 1fr minmax(140px, 36%); min-height: 40px; position: relative; padding: 3px 0; border-bottom: 1px solid var(--border); }
    .lb-beh-list .lb-beh-row--who:last-child { border-bottom: 0; }
    .lb-beh-lbl { color: var(--dim); font-variant-numeric: tabular-nums; }
    .lb-beh-fig { color: var(--dim); font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .lb-beh-bar { height: 10px; min-width: 0; }
    .lb-beh-bar--half::after { content: ''; position: absolute; left: 50%; top: 0; bottom: 0; width: 2px; background: var(--text); opacity: .55; }
    .lb-beh-who { display: flex; flex-direction: column; min-width: 0; }
    .lb-beh-name { font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .lb-beh-sub { font-size: var(--fs-xs); color: var(--mute); }
    @media (max-width: 520px) { .lb-beh-row, .lb-beh-row--who { grid-template-columns: 1fr auto; } .lb-beh-row > .lb-beh-bar { grid-column: 1 / -1; order: 3; } .lb-beh-fig { text-align: right; } }

    /* ══════════════════ TOASTS ══════════════════ */
    #toasts { position: fixed; bottom: 24px; right: 24px; display: flex; flex-direction: column; gap: 8px; z-index: 9999; pointer-events: none; }
    .toast { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: var(--shadow-lg); padding: 12px 16px; font-size: 14px; color: var(--text); display: flex; align-items: center; gap: 10px; animation: toastIn .25s ease-out; pointer-events: auto; min-width: 200px; max-width: 360px; }
    .toast.out { animation: toastOut .2s ease-in forwards; }
    .toast-icon { font-size: 14px; flex-shrink: 0; }
    .toast.success .toast-icon { color: var(--buy); }
    .toast.error   .toast-icon { color: var(--sell); }
    .toast.info    .toast-icon { color: var(--accent); }
    @keyframes toastIn  { from { transform: translateX(20px); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
    @keyframes toastOut { from { transform: translateX(0); opacity: 1; } to { transform: translateX(20px); opacity: 0; } }

    /* ══════════════════ SCROLL TO TOP ══════════════════ */
    #scroll-top {
      /* --unlock-clear lifts the button above the fixed unlock bar for
         locked users (0px when the bar is hidden) — it was buried under
         the near-full-width z600 bar on phones (go-live audit 2026-07-31). */
      position: fixed; bottom: calc(24px + var(--unlock-clear, 0px) + var(--cb-clear, 0px)); left: 24px;   /* + the full-width cookie bar while it is up (P0-F36) */
      width: 44px; height: 44px; border-radius: 50%;
      background: var(--surf); border: 1px solid var(--border); box-shadow: var(--shadow);
      color: var(--dim); cursor: pointer; font-size: 16px;
      display: none; align-items: center; justify-content: center;
      transition: color .15s, border-color .15s, box-shadow .15s, transform .15s; z-index: 100; line-height: 1;
    }
    #scroll-top.visible { display: flex; }
    #scroll-top:hover { color: var(--accent); border-color: var(--accent); box-shadow: var(--shadow-lg); transform: translateY(-2px); }

    /* (The net-flow sparkline and card (.nf-*) and the home signals feed (.hs-*) are
       retired with their views, P4b / 2026-09-30.) */

    /* ══════════════════ WATCHLIST ══════════════════ */
    /* The watchlist dot on the You menu's item (#wl-dot) and on the You
       button (#wl-dot-more) — styled by the shell's stylesheet (P3-C2);
       updateWatchlistDot() sets .has. */

    .wl-clear-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 44px; padding: 0 20px; background: none; border: 1px solid var(--border2); color: var(--accent); cursor: pointer; font-family: inherit; font-size: var(--fs-base); font-weight: 600; line-height: 1.2; white-space: nowrap; border-radius: var(--r-pill); transition: background-color .15s, border-color .15s, color .15s; }
    .wl-clear-btn:hover { background: var(--accentbg); border-color: var(--accent); }
    #wl-clear-btn:hover { color: var(--sell); background: var(--sellbg); border-color: var(--sell); }   /* "Clear all" empties the list */

    .wl-sync-lock.sp-lock-card { margin: 0 0 16px; }
    /* 2026-09-30: the empty watchlist is the SSR .sp-empty — dashed --border2, --r-lg,
       --bg-soft, 32px 24px, centred 15px --dim — with its drawing (a mask over --mute,
       so it takes the theme; sp-pages.css's, copied: that sheet is not linked here). */
    .wl-empty { margin: 8px 0 24px; padding: 32px 24px; text-align: center; color: var(--dim); background: var(--bg-soft); border: 1px dashed var(--border2); border-radius: var(--r-lg); }
    .wl-empty::before, .data-empty::before { content: ""; display: block; width: 96px; height: 64px; margin: 0 auto 14px; background: var(--mute); opacity: .45; mask: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 96 64'%3E%3Crect x='8' y='34' width='12' height='22' rx='3'/%3E%3Crect x='26' y='22' width='12' height='34' rx='3'/%3E%3Crect x='44' y='40' width='12' height='16' rx='3'/%3E%3Cpath d='M4 60h56' stroke='black' stroke-width='3' stroke-linecap='round'/%3E%3Ccircle cx='68' cy='24' r='14' fill='none' stroke='black' stroke-width='5'/%3E%3Cpath d='M78 34l12 12' stroke='black' stroke-width='6' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat; }
    .wl-empty-title { font-size: 17px; font-weight: 700; color: var(--text); margin-bottom: 6px; letter-spacing: -.01em; }
    .wl-empty-sub { font-size: var(--fs-base); color: var(--dim); line-height: 1.6; max-width: 480px; margin: 0 auto; }
    .wl-empty-sub kbd { font: inherit; font-size: 13px; font-weight: 600; white-space: nowrap; padding: 2px 10px; color: var(--accent); background: var(--surf); border: 1px solid var(--border2); border-radius: var(--r-pill); }
    .wl-empty-cta { display: inline-flex; align-items: center; min-height: 44px; margin-top: 8px; font-weight: 600; text-decoration: none; }
    .wl-empty-cta:hover { text-decoration: underline; }

    .wl-section { margin-bottom: 28px; }
    .wl-section-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 12px; gap: 12px; }
    .wl-section-title { font-size: 17px; font-weight: 700; letter-spacing: -.01em; }
    .wl-section-count { font-size: 12px; color: var(--mute); letter-spacing: .06em; text-transform: uppercase; }

    .wl-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
    .wl-card { background: var(--surf); padding: 20px; cursor: pointer; position: relative; transition: box-shadow .15s, border-color .15s, transform .15s; min-height: 110px; display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); }
    .wl-card:hover { border-color: var(--border2); box-shadow: var(--shadow-lg); transform: translateY(-2px); }
    .wl-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
    .wl-card-name { font-size: 17px; font-weight: 700; color: var(--text); letter-spacing: .01em; line-height: 1.25; }
    .wl-card-name .sp-ent:hover { color: var(--accent); }
    .wl-card-sub { font-size: 13px; color: var(--mute); margin-top: 2px; }
    .wl-card-unstar { background: transparent; border: none; cursor: pointer; padding: 2px; color: var(--accent); font-size: 16px; line-height: 1; transition: color .15s, transform .15s; }
    /* P1-B2: the card's name is its real link, stretched over the whole card
       (the card stays one click target); the unstar button and the card's
       own links sit above it. */
    .wl-card-name .sp-ent::after { content: ''; position: absolute; inset: 0; }
    .wl-card-unstar, .wl-card a:not(.sp-ent) { position: relative; z-index: 1; }
    .wl-card-unstar:hover { color: var(--sell); transform: scale(1.15); }
    .wl-card-stats { display: flex; gap: 18px; margin-top: auto; align-items: baseline; }
    .wl-card-stat-num { font-variant-numeric: tabular-nums; font-size: 16px; font-weight: 600; color: var(--text); letter-spacing: -.02em; line-height: 1; }
    .wl-card-stat-lbl { font-size: 12px; color: var(--mute); letter-spacing: .06em; text-transform: uppercase; margin-top: 3px; }
    .wl-card-last { font-size: 13px; color: var(--dim); margin-top: 10px; }
    .wl-card-last.fresh { color: var(--buy); }

    /* (.star-btn — the detail pages' watch star, the strategy page's the last —
       went with the SPA strategy page, P4d.) */

    /* ─── Footer — MOVED 2026-09-24 ──────────────────────────────────
       P3-C2 (contract C-SHELL2): the footer is the one shell's (.sp-foot) —
       its rules, and the one-freshness-line rule (a view that states its own
       line hides the footer's), are in the shell's stylesheet. The SPA
       footer's brand block, link columns, source chips, method line and legal
       row (and their .ft-* rules) are retired. */

    /* (The XAnalysis tool's CSS went with the /create sandbox, 2026-08-19; the
       strategy-overlap modal's .overlap-* rules with its markup, Lane S P5.) */

    /* (The home top-picks grid (.htp-*), the picks page's allocation selector and
       tier board (.tp-*) and the paper-portfolio styles are gone with their views.) */

    /* ════════════════════════════════════════════════════════════════
       MOBILE OPTIMIZATION (added 2026-05-17)
       Three tiers: tablet (≤900), phone (≤600), narrow phone (≤420).
       Goals: 44px+ touch targets, no horizontal page overflow, legible
       at default mobile zoom, key cards collapse 4→2→1 column cleanly.
    ════════════════════════════════════════════════════════════════ */
    @media (max-width: 900px) {
      /* The Record's closed table: enable horizontal scroll (the strategy
         page's tiles, bars and backtest tables went with it, P4d) */
      .sd-perf-table { overflow-x: auto; -webkit-overflow-scrolling: touch; }
      .sd-perf-table { display: block; max-width: 100%; }
    }

    /* ── Phone header + bottom tab bar — MOVED 2026-09-24 ──
       P3-C2 (contract C-SHELL2): the two-row phone header (row 1 brand, bell,
       You ▾ and the account chip; row 2 the one search box), the You menu as
       a bottom sheet over the tab bar, the five-tab bar itself and its height
       token --sp-tabbar-h (0px off phones) are the shell's stylesheet's. This
       page keeps only what clears its own bottom-anchored surfaces of that
       bar: the page padding, the unlock bar, the scroll-top button and the
       toasts. --unlock-clear is measured from the viewport bottom, so it
       already includes the bar — hence max(), not a sum. */
    @media (max-width: 640px) {
      body { padding-bottom: max(calc(var(--sp-tabbar-h) + var(--cb-clear, 0px)), var(--unlock-clear, 0px)); }
      #sp-unlock-bar { bottom: calc(var(--sp-tabbar-h) + 12px); }
      /* 2026-10-07: no back-to-top button on a phone (its offset above the tab bar
         went with it) — at left: 24px it sat on the text column and hid words, links
         and a cookie name (ml_30_s2, ml_32_s2, ml_15_s3); the server-rendered pages
         have none, and the tab bar is in reach. */
      #scroll-top.visible { display: none; }
      #toasts { bottom: calc(24px + var(--sp-tabbar-h)); }   /* 601–640px; ≤600px moves them to the top */
    }

    @media (max-width: 600px) {
      /* ── Page chrome ─────────────────────────────────────────── */
      .page-head { gap: 12px; margin-bottom: 24px; align-items: flex-start; flex-direction: column; }

      /* #top-nav sizing + whole-bar overflow-x rules removed 2026-07-14:
         the ≤640px two-row header above owns mobile nav layout now (only
         the .nav-links rail scrolls; row 1 never does). */

      /* #search-wrap mobile override removed 2026-07-22 with the orphaned
         search-bar CSS above (no matching markup). */

      /* ── Cards: reduce padding ──────────────────────────────── */
      .sd-chart-card, .td-card, .pd-card, .bld-panel { padding: 20px 16px; }

      /* (The stock page's phone rules — hero, chart, toolbar — went with it, P4c.) */

      /* ── Touch targets: 44px minimum for primary pills/CTAs (was 32px,
         which under-delivered the 44px the mobile framework promises).
         Dense secondary controls (.scb-row chips) keep their tighter
         more-specific rules. ── */
      .lb-pill, .ap-btn, .ap-input { min-height: 44px; padding-top: 6px; padding-bottom: 6px; }

      /* ── Strategy Lab interactive set joins the floor (C7, 2026-08-16):
         mode buttons were ~33px, rows ~34px, entry CTA ~32px. The ✕ removers
         (~17-20px glyphs) get a padded hit area with negative-margin
         compensation so the chip/row layout doesn't grow — overlap into the
         neighboring gap is fine because the surrounding chip isn't itself
         clickable. ── */
      .bld-mode button, .bld-run, .bld-saved-row .bld-saved-load, .bld-clear, #bld-window { min-height: 44px; }
      .bld-row { min-height: 44px; padding-top: 10px; padding-bottom: 10px; }
      /* a row's stats and source wrap under its name, which keeps its whole width (the source reads in words now) */
      .bld-row { flex-wrap: wrap; row-gap: 2px; }
      .bld-row .bld-row-name { flex: 1 1 calc(100% - 60px); white-space: normal; }
      .bld-row .bld-row-alpha { flex-basis: 100%; padding-left: 26px; white-space: normal; }
      .bld-slot button, .bld-saved-row .bld-saved-del { font-size: 15px; padding: 14px 12px; margin: -11px -8px; }
      .bld-ing-table { min-width: 520px; }   /* forces the .mobile-hscroll wrap to actually scroll instead of crushing columns */
      .conv-layer { min-height: 34px; }      /* C12: chips became the receipt-sheet tap target — lift them off the ~23px floor (dense secondary, not full 44px) */

      /* ── iOS input zoom: Safari auto-zooms any focused field under 16px.
         One rule pins every text-entry control to 16px on phones.
         !important on purpose: most inputs set font-size via inline style=
         or an ID selector (#strats-search 13px, #cmd-input 14px, the
         per-table filter inputs), which nothing else can override. ── */
      input[type="text"], input[type="email"], input[type="date"], input[type="search"],
      input[type="number"], input[type="password"], select, textarea { font-size: 16px !important; }

      /* ── Tables: scroll horizontally so columns don't crush ──── */
      .sd-perf-table { min-width: 600px; }

      /* (.ichart svg min-height rule — REMOVED P5 2026-09-25 with the Top 10's growth-of-$1 chart, its last user; see renderEquityCurveMini's tombstone.) */

      /* ── Modal: full-bleed on phones ─────────────────────────── */
      .gloss-modal, #help-modal, #cmd-modal { max-width: 100%; max-height: 92vh; border-radius: var(--r-lg); }

      /* ── Toasts: top-of-viewport full-width on phones — the bottom slot
         is contested (cookie banner z9999 + unlock bar z600 + scroll-top),
         and bottom-right toasts hid behind both. ── */
      #toasts { top: 8px; bottom: auto; left: 8px; right: 8px; }
      .toast { max-width: none; width: 100%; }

      /* ── Alert inbox rows: two-line layout — the 5-column grid (ticker /
         date / strategy / source / dismiss) crushed the strategy name on
         phones. Line 1: ticker + date + source + dismiss; line 2: the
         full-width strategy link. :nth-child(4) covers both the source
         link and its empty <span> placeholder. ── */
      .al-row {
        grid-template-columns: auto 1fr auto auto;
        grid-template-areas:
          'tick date src dis'
          'strat strat strat strat';
        row-gap: 2px;
      }
      .al-row .al-ticker      { grid-area: tick; }
      .al-row .al-date        { grid-area: date; }
      .al-row .al-strat       { grid-area: strat; }
      .al-row > :nth-child(4) { grid-area: src; }
      .al-row .al-dismiss     { grid-area: dis; }

      /* ── Legal pages: the cookie/localStorage policy tables scroll
         sideways instead of crushing their 3-4 columns (display:block on
         a <table> keeps row layout while enabling overflow-x). ── */
      /* A11Y-13 (2026-09-29): the box that scrolls is a focusable, named region around the table (the table itself scrolled, out of the keyboard's reach). */
      .lgl-wrap .lgl-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
    }

    @media (max-width: 420px) {
      /* Very narrow phones (iPhone SE, Mini). Strictest layout. */
      /* 9px .nav-link squeeze removed 2026-07-14 — the ≤640px two-row
         header gives the tabs their own scrollable rail, so labels keep
         a legible 12px even on 360px phones. */
      /* (equity baseline annotation text-size rule — REMOVED P5 2026-09-25,
         same tombstone as above.) */
    }

    /* Mobile horizontal-scroll wrapper for wide fixed-grid tables —
       People directory, sector cross-source cards, profile cross-source
       tables. Each child row keeps its fixed-pixel grid; the wrapper
       scrolls horizontally on screens narrower than ~700px. Better than
       collapsing each row into a stacked layout (which would lose the
       columnar comparison that makes these tables useful). */
    .mobile-hscroll { width: 100%; }
    @media (max-width: 700px) {
      .mobile-hscroll {
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        /* Visual hint that there's more content offscreen — subtle right gradient */
        background-image: linear-gradient(to right, transparent calc(100% - 14px), var(--surf) 100%);
        background-attachment: local;
      }
      .mobile-hscroll-row { min-width: 580px; }
      .mobile-hscroll-row-wide { min-width: 680px; }
      /* People leaderboard tables (Alpha / Politicians / Tickers / Movers):
         min-width on the whole .lb-table (rows inherit its width) rather
         than a per-row class — one rule covers all four fixed-track grids. */
      .mobile-hscroll > .lb-table { min-width: 780px; }
    }

    /* Sector tile grid + sectors-index card — already responsive via
       grid-template-columns:repeat(auto-fill,minmax(290px,1fr)), keep as-is.
       Just ensure tile padding shrinks on tiny screens. */


    /* ── /#/data explorer ─────────────────────────────────────────────────
       Two-column shell at 1440px+ (sidebar 260px + main content), collapses
       to single-column on small screens with the sidebar above the table.
       Sidebar groups are collapsible; only the group containing the current
       selection auto-expands.
       ───────────────────────────────────────────────────────────────────── */
    .data-shell {
      display: grid;
      grid-template-columns: 260px 1fr;
      gap: 18px;
      min-height: 70vh;
    }
    @media (max-width: 900px) {
      .data-shell { grid-template-columns: 1fr; }
      /* (.data-sidebar's stacked mode moved below its base rule, 2026-10-07.) */
    }
    /* 2026-09-30: the page head is the SSR one — the h1 and its lede on a row of
       their own, the search box and the totals under them (the search sat beside
       a three-line lede and the totals wrapped under it, right-aligned). */
    .data-page-head {
      grid-column: 1 / -1;
      display: grid;
      grid-template-columns: minmax(0, 1fr) auto;
      grid-template-areas: "title title" "search totals";
      align-items: center;
      gap: 20px 24px;
      padding-bottom: 24px;
      border-bottom: 1px solid var(--border);
      margin-bottom: 8px;
    }
    .data-page-head > div:first-child { grid-area: title; }
    .data-page-head .data-global-search { grid-area: search; max-width: 560px; }
    .data-page-head .data-totals { grid-area: totals; }
    .data-page-head h1 {
      font-size: 40px;
      font-weight: 700;
      line-height: 1.12;
      margin: 0;
      letter-spacing: -.028em;
    }
    .data-page-head .data-sub {
      color: var(--dim);
      font-size: var(--fs-md);
      line-height: 1.55;
      margin: 10px 0 0;
      max-width: 62ch;
    }
    @media (max-width: 640px) {
      .data-page-head { grid-template-columns: minmax(0, 1fr); grid-template-areas: "title" "search" "totals"; gap: 16px; }
      .data-page-head .data-totals { text-align: left; }
      .data-page-head h1 { font-size: var(--fs-2xl); }
      .data-page-head .data-sub { font-size: var(--fs-base); }
    }
    .data-totals {
      font-size: 12px;
      color: var(--dim);
      text-align: right;
      white-space: nowrap;
    }
    .data-totals strong { color: var(--text); font-size: 13px; }

    /* Global search bar (top-of-page; spans middle of page-head) */
    .data-global-search {
      flex: 1 1 320px;
      max-width: 480px;
      display: flex;
      align-items: center;
      gap: 4px;
      min-height: 44px;
      background: var(--surf);
      border: 1px solid var(--field-border);
      border-radius: var(--r-pill);
      padding: 0 6px 0 4px;
    }
    .data-global-search input {
      flex: 1;
      min-width: 0;
      padding: 0 8px 0 14px;
      background: transparent;
      border: none;
      outline: none;
      color: var(--text);
      font-family: inherit;
      font-size: var(--fs-base);
    }
    .data-global-search input::placeholder { color: var(--mute); }
    .data-global-search input:focus { outline: none; }
    .data-global-search:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accentbg); }
    .data-global-search button {
      background: transparent;
      border: none;
      color: var(--mute);
      cursor: pointer;
      font-size: 18px;
      line-height: 1;
      padding: 2px 8px;
    }
    .data-global-search button:hover { color: var(--text); }

    /* Search-results panel (replaces main when searchQ is active) */
    .data-search-summary {
      padding: 10px 14px;
      background: var(--surf);
      border: 1px solid var(--border);
      border-radius: var(--r-lg);
      margin-bottom: 12px;
      font-size: 12px;
      color: var(--dim);
    }
    .data-search-summary strong { color: var(--text); font-variant-numeric: tabular-nums; }
    .data-search-state {
      padding: 40px 18px;
      text-align: center;
      color: var(--dim);
      font-size: var(--fs-base);
    }
    .data-search-hint { color: var(--mute); opacity: .65; }
    .data-search-group {
      background: var(--surf);
      border: 1px solid var(--border);
      border-radius: var(--r-lg);
      margin-bottom: 10px;
      overflow: hidden;
    }
    .data-search-group-head {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 12px;
      padding: 10px 14px;
      border-bottom: 1px solid var(--border);
      background: var(--surf2);
    }
    .data-search-group-head strong { color: var(--text); font-size: 13px; }
    .data-search-group-count {
      margin-left: 10px;
      font-size: 12px;
      color: var(--mute);
      font-variant-numeric: tabular-nums;
    }

    /* Sidebar — 2026-10-07: sticks under the shell's live header height (top: 60px
       sat under the 64px header) and fits the screen below it. */
    .data-sidebar {
      background: var(--surf);
      border: 1px solid var(--border);
      border-radius: var(--r-lg);
      padding: 6px 0;
      max-height: calc(100vh - var(--sp-header-h, 64px) - var(--cb-clear, 0px) - 32px);
      overflow-y: auto;
      overscroll-behavior: contain;
      position: sticky;
      top: calc(var(--sp-header-h, 64px) + 16px);
    }
    /* 2026-10-07: its bottom edge fades while more of the list sits below (the box cut a
       group head in half with no cue, F13); scrolled to the end, the fade is padding. */
    .data-sidebar::after { content: ""; position: sticky; bottom: 0; display: block; height: 24px; background: linear-gradient(transparent, var(--surf)); pointer-events: none; }
    /* Stacked mode (2026-06-12): not a sticky full-viewport column on phones —
       cap it and let the page scroll past it. 2026-10-07: declared above the
       base rule it never applied, and the list pinned over the records. Now a
       disclosure in the page flow ("Source: … ▾"), closed while a source is
       open, so /data/<source> opens on its records; no box of its own. */
    .data-catalog-toggle { display: none; }
    @media (max-width: 900px) {
      .data-sidebar { position: static; max-height: none; overflow: visible; }
      .data-sidebar::after { display: none; }
      .data-sidebar:not(.is-open) { padding: 0; }
      .data-sidebar:not(.is-open) .data-catalog { display: none; }
      .data-catalog-toggle { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; min-height: 44px; padding: 0 16px; color: var(--text); font: inherit; text-align: left; background: none; border: 0; cursor: pointer; }
      .data-catalog-caret { color: var(--mute); transition: transform .15s; }
      .data-sidebar.is-open .data-catalog-caret { transform: rotate(180deg); }
    }
    .data-sidebar-search {
      display: block;
      width: calc(100% - 16px);
      min-height: 44px;
      margin: 6px 8px 8px;
      padding: 0 12px;
      background: var(--surf);
      border: 1px solid var(--field-border);
      color: var(--text);
      font-family: inherit;
      font-size: 14px;
      border-radius: var(--r-md);
    }
    .data-sidebar-group {
      border-top: 1px solid var(--border);
    }
    .data-sidebar-group:first-of-type { border-top: none; }
    .data-sidebar-group-head {
      width: 100%;
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 4px;
      min-height: 44px;
      padding: 8px 12px;
      background: transparent;
      border: none;
      color: var(--dim);
      font-family: inherit;
      font-size: 12px;
      letter-spacing: .06em;
      text-transform: uppercase;
      font-weight: 600;
      cursor: pointer;
      text-align: left;
    }
    .data-sidebar-group-head:hover { color: var(--text); background: var(--surf2); }
    .data-sidebar-group-caret { font-size: 12px; opacity: .55; transition: transform .15s; }
    .data-sidebar-group.open .data-sidebar-group-caret { transform: rotate(90deg); }
    .data-sidebar-group-list { display: none; padding: 0 0 6px; }
    .data-sidebar-group.open .data-sidebar-group-list { display: block; }
    .data-sidebar-item {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 6px;
      min-height: 44px;   /* 2026-10-07: rows and group heads are 44px targets (were 36 / 34) */
      padding: 6px 12px 6px 24px;
      font-size: 14px;
      color: var(--dim);
      cursor: pointer;
      text-decoration: none;
      border-left: 2px solid transparent;
      transition: background .1s, border-color .1s, color .1s;
    }
    .data-sidebar-item:hover { background: var(--surf2); color: var(--text); }
    .data-sidebar-item.on {
      color: var(--text);
      background: var(--surf2);
      border-left-color: var(--accent);
      font-weight: 600;
    }
    .data-sidebar-item-badge {
      font-size: 12px;
      color: var(--mute);
      font-variant-numeric: tabular-nums;
      font-weight: 400;
    }
    .data-sidebar-item-health {
      display: inline-block;
      width: 6px;
      height: 6px;
      border-radius: 50%;
      margin-right: 7px;
      vertical-align: middle;
      flex-shrink: 0;
      background: var(--mute);
    }
    .data-sidebar-item-health.green { background: var(--buy); }
    .data-sidebar-item-health.amber { background: var(--warn); }
    .data-sidebar-item-health.red   { background: var(--sell); }
    .data-sidebar-item-health.gray  { background: var(--mute); opacity: .35; }
    /* 2026-08-26 P1-3: the §13107 free pair is browsable by EVERYONE. 2026-10-07: a
       locked list's paid items no longer dim and refuse the click (they read as broken,
       F13): each carries a lock and opens the lock card that names its feed. */
    .data-sidebar-lock { color: var(--mute); }
    .data-free-badge { color: var(--buy); font-weight: 700; letter-spacing: .06em; }

    /* Main content area */
    .data-main {
      display: flex;
      flex-direction: column;
      gap: 14px;
      min-width: 0;
    }
    .data-empty {
      background: var(--bg-soft);
      border: 1px dashed var(--border2);
      border-radius: var(--r-lg);
      padding: 32px 24px;
      text-align: center;
      color: var(--dim);
      font-size: var(--fs-base);
    }
    .data-empty strong { color: var(--text); display: block; font-size: 17px; margin-bottom: 6px; }

    /* Provenance card */
    .data-provenance {
      background: var(--surf);
      border: 1px solid var(--border);
      border-radius: var(--r-lg);
      padding: 20px 24px;
    }
    .data-prov-head {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      gap: 12px;
      flex-wrap: wrap;
      margin-bottom: 8px;
    }
    .data-prov-title {
      font-size: 22px;
      font-weight: 700;
      letter-spacing: -.018em;
      margin: 0;
    }
    .data-prov-desc { color: var(--dim); font-size: 14px; line-height: 1.55; margin: 0 0 10px; }
    .data-prov-meta {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
      gap: 10px 18px;
      font-size: 12px;
    }
    .data-prov-meta dt { color: var(--mute); font-size: 12px; text-transform: uppercase; letter-spacing: .06em; font-weight: 600; margin-bottom: 2px; }
    .data-prov-meta dd { color: var(--text); font-variant-numeric: tabular-nums; margin: 0; }
    .data-prov-meta dd a { color: var(--accent); text-decoration: none; }
    .data-prov-meta dd a:hover { text-decoration: underline; }
    .data-prov-gaps {
      margin-top: 12px;
      padding: 10px 14px;
      background: var(--warnbg);
      font-size: 13px;
      color: var(--text);
      border-radius: var(--r-md);
    }
    .data-prov-gaps strong { color: var(--text); }
    /* Dark (2026-10-07): the amber-900 --warnbg under white text made the note an alarm
       block (dd_26_s1); a quiet amber tint on the card, the label in --warn. */
    [data-theme="dark"] .data-prov-gaps { background: color-mix(in srgb, var(--warn) 12%, var(--surf)); }
    [data-theme="dark"] .data-prov-gaps strong { color: var(--warn); }

    /* "Used in N strategies" chip row */
    .data-prov-strats {
      margin-top: 12px;
      padding-top: 10px;
      border-top: 1px solid var(--border);
    }
    .data-prov-strats-head {
      font-size: 12px;
      text-transform: uppercase;
      letter-spacing: 0.06em;
      color: var(--mute);
      margin-bottom: 6px;
    }
    .data-prov-strats-list {
      display: flex;
      flex-wrap: wrap;
      gap: 4px;
    }
    .data-strat-chip {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      padding: 3px 8px;
      font-size: 12px;
      line-height: 1.4;
      color: var(--text);
      background: var(--surf2);
      border: 1px solid var(--border);
      border-radius: var(--r-pill);
      text-decoration: none;
      transition: background 80ms ease, border-color 80ms ease;
    }
    .data-strat-chip:hover { background: var(--surf3, var(--surf2)); border-color: var(--text); }
    .data-strat-chip.is-dep { color: var(--mute); border-style: dashed; }
    .data-strat-chip.is-deprecated { color: var(--mute); text-decoration: line-through; }   /* 2026-10-07: no .55 opacity — under it --mute fell below readable contrast, in dark most (dd_26_s2) */
    .data-strat-chip-dir { font-size: 12px; opacity: 0.6; }
    .data-prov-retired > summary { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; color: var(--mute); font-size: var(--fs-sm); list-style: none; cursor: pointer; }
    .data-prov-retired > summary::-webkit-details-marker { display: none; }
    .data-prov-retired > summary::after { content: "▾"; color: var(--accent); }
    .data-prov-retired[open] > summary::after { content: "▴"; }
    .data-prov-retired > summary:hover { color: var(--text); }

    /* Controls block */
    .data-controls {
      display: flex;
      align-items: center;
      gap: 10px;
      flex-wrap: wrap;
      padding: 12px 16px;
      background: var(--surf);
      border: 1px solid var(--border);
      border-radius: var(--r-lg);
    }
    .data-controls label {
      display: flex;
      align-items: center;
      gap: 6px;
      font-size: 12px;
      color: var(--mute);
      text-transform: uppercase;
      letter-spacing: .06em;
      font-weight: 600;
    }
    .data-controls input[type="text"],
    .data-controls input[type="date"] {
      min-height: 40px;
      background: var(--surf);
      border: 1px solid var(--field-border);
      color: var(--text);
      font-family: inherit;
      font-size: 14px;
      padding: 0 10px;
      border-radius: var(--r-md);
    }
    .data-controls input[type="text"] { width: 120px; }
    .data-controls-cta {
      margin-left: auto;
      display: flex;
      gap: 6px;
    }
    .data-btn {
      background: var(--surf2);
      border: 1px solid transparent;
      color: var(--text);
      font-family: inherit;
      font-size: 14px;
      font-weight: 600;
      min-height: 40px;
      padding: 0 16px;
      cursor: pointer;
      border-radius: var(--r-pill);
      transition: background-color .15s, box-shadow .15s;
      text-decoration: none;
      white-space: nowrap;
      display: inline-flex;
      align-items: center;
      gap: 6px;
    }
    .data-btn:hover { background: var(--surf3); color: var(--text); text-decoration: none; }
    .data-btn.primary {
      background: var(--accent-fill);
      color: #fff;
      border-color: var(--accent-fill);
    }
    .data-btn.primary:hover { background: var(--accent-fill); color: #fff; box-shadow: var(--shadow-lg); }

    /* Records table — 2026-10-07: the page scrolls, not a 70vh box inside it (the
       table ended mid-list, dl_26_s3); the box still scrolls sideways when wide, so
       the header row no longer sticks inside it. */
    .data-table-wrap {
      background: var(--surf);
      border: 1px solid var(--border);
      border-radius: var(--r-lg);
      overflow-x: auto;
    }
    .data-table {
      width: 100%;
      border-collapse: collapse;
      font-size: 14px;
      font-variant-numeric: tabular-nums;
    }
    .data-th-sortable { cursor: pointer; user-select: none; }
    .data-th-sortable:hover { color: var(--text); }
    .data-th-sortable.is-sorted { color: var(--text); }
    .data-table thead th {
      background: var(--bg-soft);
      color: var(--mute);
      font-weight: 600;
      font-size: 12px;
      text-transform: uppercase;
      letter-spacing: .04em;
      padding: 10px 12px;
      text-align: left;
      border-bottom: 1px solid var(--border);
      white-space: nowrap;
    }
    .data-table tbody td {
      padding: 10px 12px;
      border-bottom: 1px solid var(--border);
      color: var(--text);
      vertical-align: top;
      max-width: 280px;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .data-table tbody tr:hover td { background: var(--surf2); }
    .data-table .data-cell-details { max-width: 200px; }   /* 2026-10-07: Details pushed the range and the link off the edge */
    .data-table .data-link {
      color: var(--accent);
      text-decoration: none;
    }
    .data-table .data-link:hover { text-decoration: underline; }
    .data-table .data-cell-empty { color: var(--mute); font-style: italic; }
    .data-table .data-cell-obj {
      font-size: 12px;
      color: var(--dim);
    }
    .data-pager {
      display: flex;
      align-items: center;
      gap: 10px;
      padding: 6px 0;
      font-size: 13px;
      color: var(--dim);
    }
    .data-pager .data-pager-meta { margin-right: auto; }

    /* P1-B4 (2026-09-24): the Data explorer's paywall is the shared lock card
       (SP.ui.lockCard, variant card) — the bespoke splash box, its heading,
       price line and CTA row rules are retired with the markup. The Congress
       carve-out note under the card keeps its footnote style. */
    .data-paywall-foot {
      font-size: 13px;
      color: var(--mute);
      line-height: 1.55;
      max-width: 460px;
      margin: 14px auto 0;
      padding-top: 14px;
      border-top: 1px solid var(--border);
    }
  
  
  
  
  
    /* ── Utilities (R13, 2026-09-29) ──────────────────────────────────────
       The declarations the markup below used to carry in style attributes,
       one class each: a strict style-src (CSP_STRICT_STYLE, app.js) refuses
       style attributes. u-<property>-<value>: u-c-mute is color: var(--mute),
       u-mt-14 margin-top: 14px, u-p-60-40 padding: 60px 40px, u-b-line a
       1px solid var(--border) border, u-ls-0_05em letter-spacing: .05em.
       A value a template computes (a bar's width, a ring's arc) is set through
       the CSSOM once the markup is in the page (applyDataStyles), which CSP
       never checks.
       An inline style outranked every selector, so each rule carries the
       weight of two ids with :not(#_#_) — an id no element has — which
       outranks every rule these sheets aim at an element that carries one
       (the few two-id selectors style the nav and the unlock bar, which carry
       none); a style set from script still outranks it, as it did the
       attribute, and an !important rule still wins over both.
       Shorthands come before their longhands (fewer hyphens first), so an
       element that carries both keeps the longhand, as the attribute did.
       Add a rule here, never a style attribute. */
    .u-bg-accent-fill:not(#_#_) { background: var(--accent-fill); }
    .u-bg-border:not(#_#_) { background: var(--border); }
    .u-bg-dembg:not(#_#_) { background: var(--dembg); }
    .u-bg-accent:not(#_#_) { background: var(--accent); }
    .u-bg-repbg:not(#_#_) { background: var(--repbg); }
    .u-bg-accentbg:not(#_#_) { background: var(--accentbg); }
    .u-bg-stripes-accent:not(#_#_) { background: repeating-linear-gradient(90deg,var(--accent),var(--accent) 10px,var(--border) 10px,var(--border) 20px); }
    .u-bg-surf:not(#_#_) { background: var(--surf); }
    .u-bg-surf2:not(#_#_) { background: var(--surf2); }
    .u-bg-transparent:not(#_#_) { background: transparent; }
    .u-b-1-solid-sell:not(#_#_) { border: 1px solid var(--sell); }
    .u-b-line:not(#_#_) { border: 1px solid var(--border); }
    .u-b-none:not(#_#_) { border: none; }
    .u-c-accent:not(#_#_) { color: var(--accent); }
    .u-c-buy:not(#_#_) { color: var(--buy); }
    .u-c-dem:not(#_#_) { color: var(--dem); }
    .u-c-dim:not(#_#_) { color: var(--dim); }
    .u-c-warn:not(#_#_) { color: var(--warn); }
    .u-c-mute:not(#_#_) { color: var(--mute); }
    .u-c-rep:not(#_#_) { color: var(--rep); }
    .u-c-sell:not(#_#_) { color: var(--sell); }
    .u-c-text:not(#_#_) { color: var(--text); }
    .u-cur-default:not(#_#_) { cursor: default; }
    .u-cur-pointer:not(#_#_) { cursor: pointer; }
    .u-d-block:not(#_#_) { display: block; }
    .u-d-flex:not(#_#_) { display: flex; }
    .u-d-grid:not(#_#_) { display: grid; }
    .u-d-iblock:not(#_#_) { display: inline-block; }
    .u-d-iflex:not(#_#_) { display: inline-flex; }
    .u-d-none:not(#_#_) { display: none; }
    .u-fx-1:not(#_#_) { flex: 1; }
    .u-fx-1-1-160:not(#_#_) { flex: 1 1 160px; }
    .u-gap-10:not(#_#_) { gap: 10px; }
    .u-gap-12:not(#_#_) { gap: 12px; }
    .u-gap-14:not(#_#_) { gap: 14px; }
    .u-gap-16:not(#_#_) { gap: 16px; }
    .u-gap-18:not(#_#_) { gap: 18px; }
    .u-gap-22:not(#_#_) { gap: 22px; }
    .u-gap-24:not(#_#_) { gap: 24px; }
    .u-gap-4:not(#_#_) { gap: 4px; }
    .u-gap-6:not(#_#_) { gap: 6px; }
    .u-gap-8:not(#_#_) { gap: 8px; }
    .u-gap-9:not(#_#_) { gap: 9px; }
    .u-h-1:not(#_#_) { height: 1px; }
    .u-h-10:not(#_#_) { height: 10px; }
    .u-h-100p:not(#_#_) { height: 100%; }
    .u-h-14:not(#_#_) { height: 14px; }
    .u-h-140:not(#_#_) { height: 140px; }
    .u-h-15:not(#_#_) { height: 15px; }
    .u-h-16:not(#_#_) { height: 16px; }
    .u-h-22:not(#_#_) { height: 22px; }
    .u-h-3:not(#_#_) { height: 3px; }
    .u-h-34:not(#_#_) { height: 34px; }
    .u-h-36:not(#_#_) { height: 36px; }
    .u-h-40:not(#_#_) { height: 40px; }
    .u-h-42:not(#_#_) { height: 42px; }
    .u-h-64:not(#_#_) { height: 64px; }
    .u-h-8:not(#_#_) { height: 8px; }
    .u-m-0:not(#_#_) { margin: 0; }
    .u-m-0-0-10:not(#_#_) { margin: 0 0 10px; }
    .u-m-0-0-12:not(#_#_) { margin: 0 0 12px; }
    .u-m-0-0-12-4:not(#_#_) { margin: 0 0 12px 4px; }
    .u-m-0-0-14:not(#_#_) { margin: 0 0 14px; }
    .u-m-0-0-16:not(#_#_) { margin: 0 0 16px; }
    .u-m-0-0-22-0:not(#_#_) { margin: 0 0 22px 0; }
    .u-m-0-0-24:not(#_#_) { margin: 0 0 24px; }
    .u-m-0-0-6:not(#_#_) { margin: 0 0 6px; }
    .u-m-0-0-6-0:not(#_#_) { margin: 0 0 6px 0; }
    .u-m-0-0-8:not(#_#_) { margin: 0 0 8px; }
    .u-m-0-auto:not(#_#_) { margin: 0 auto; }
    .u-m-10-0-16:not(#_#_) { margin: 10px 0 16px; }
    .u-m-12-0-10:not(#_#_) { margin: 12px 0 10px; }
    .u-m-14-0:not(#_#_) { margin: 14px 0; }
    .u-m-14-0-10:not(#_#_) { margin: 14px 0 10px; }
    .u-m-14-0-4:not(#_#_) { margin: 14px 0 4px; }
    .u-m-14-0-6:not(#_#_) { margin: 14px 0 6px; }
    .u-m-18-0-4:not(#_#_) { margin: 18px 0 4px; }
    .u-m-18-0-6:not(#_#_) { margin: 18px 0 6px; }
    .u-m-20-0-0:not(#_#_) { margin: 20px 0 0; }
    .u-m-30-auto:not(#_#_) { margin: 30px auto; }
    .u-m-4-0-12:not(#_#_) { margin: 4px 0 12px; }
    .u-m-4-0-8:not(#_#_) { margin: 4px 0 8px; }
    .u-m-6-0:not(#_#_) { margin: 6px 0; }
    .u-m-6-0-18:not(#_#_) { margin: 6px 0 18px; }
    .u-m-6-0-4:not(#_#_) { margin: 6px 0 4px; }
    .u-op-0_3:not(#_#_) { opacity: 0.3; }
    .u-op-0_7:not(#_#_) { opacity: .7; }
    .u-ov-auto:not(#_#_) { overflow: auto; }
    .u-ov-hidden:not(#_#_) { overflow: hidden; }
    .u-ov-visible:not(#_#_) { overflow: visible; }
    .u-p-0:not(#_#_) { padding: 0; }
    .u-p-0-12-12-12:not(#_#_) { padding: 0 12px 12px 12px; }
    .u-p-0-4:not(#_#_) { padding: 0 4px; }
    .u-p-10:not(#_#_) { padding: 10px; }
    .u-p-10-0:not(#_#_) { padding: 10px 0; }
    .u-p-10-12:not(#_#_) { padding: 10px 12px; }
    .u-p-10-14:not(#_#_) { padding: 10px 14px; }
    .u-p-10-16:not(#_#_) { padding: 10px 16px; }
    .u-p-12-16:not(#_#_) { padding: 12px 16px; }
    .u-p-14:not(#_#_) { padding: 14px; }
    .u-p-14-16:not(#_#_) { padding: 14px 16px; }
    .u-p-14-8:not(#_#_) { padding: 14px 8px; }
    .u-p-15-20:not(#_#_) { padding: 15px 20px; }
    .u-p-16:not(#_#_) { padding: 16px; }
    .u-p-18-20-22:not(#_#_) { padding: 18px 20px 22px; }
    .u-p-2-0-5-70:not(#_#_) { padding: 2px 0 5px 70px; }
    .u-p-2-8:not(#_#_) { padding: 2px 8px; }
    .u-p-20:not(#_#_) { padding: 20px; }
    .u-p-24:not(#_#_) { padding: 24px; }
    .u-p-24-0:not(#_#_) { padding: 24px 0; }
    .u-p-24-16:not(#_#_) { padding: 24px 16px; }
    .u-p-3-0:not(#_#_) { padding: 3px 0; }
    .u-p-3-8:not(#_#_) { padding: 3px 8px; }
    .u-p-30:not(#_#_) { padding: 30px; }
    .u-p-32:not(#_#_) { padding: 32px; }
    .u-p-4-0:not(#_#_) { padding: 4px 0; }
    .u-p-4-10:not(#_#_) { padding: 4px 10px; }
    .u-p-4-8:not(#_#_) { padding: 4px 8px; }
    .u-p-40:not(#_#_) { padding: 40px; }
    .u-p-40-24:not(#_#_) { padding: 40px 24px; }
    .u-p-48-32:not(#_#_) { padding: 48px 32px; }
    .u-p-5-8:not(#_#_) { padding: 5px 8px; }
    .u-p-6-0:not(#_#_) { padding: 6px 0; }
    .u-p-6-8:not(#_#_) { padding: 6px 8px; }
    .u-p-6-9:not(#_#_) { padding: 6px 9px; }
    .u-p-60:not(#_#_) { padding: 60px; }
    .u-p-60-20:not(#_#_) { padding: 60px 20px; }
    .u-p-60-40:not(#_#_) { padding: 60px 40px; }
    .u-p-7-0:not(#_#_) { padding: 7px 0; }
    .u-p-7-9:not(#_#_) { padding: 7px 9px; }
    .u-p-8:not(#_#_) { padding: 8px; }
    .u-p-8-0:not(#_#_) { padding: 8px 0; }
    .u-p-8-0-12:not(#_#_) { padding: 8px 0 12px; }
    .u-p-8-10-4:not(#_#_) { padding: 8px 10px 4px; }
    .u-p-8-12:not(#_#_) { padding: 8px 12px; }
    .u-p-8-14:not(#_#_) { padding: 8px 14px; }
    .u-p-80-40:not(#_#_) { padding: 80px 40px; }
    .u-p-9-0:not(#_#_) { padding: 9px 0; }
    .u-tr-width-0_4s:not(#_#_) { transition: width .4s; }
    .u-w-1:not(#_#_) { width: 1px; }
    .u-w-100p:not(#_#_) { width: 100%; }
    .u-w-110:not(#_#_) { width: 110px; }
    .u-w-130:not(#_#_) { width: 130px; }
    .u-w-15:not(#_#_) { width: 15px; }
    .u-w-160:not(#_#_) { width: 160px; }
    .u-w-22:not(#_#_) { width: 22px; }
    .u-w-26:not(#_#_) { width: 26px; }
    .u-w-36:not(#_#_) { width: 36px; }
    .u-w-38:not(#_#_) { width: 38px; }
    .u-w-42:not(#_#_) { width: 42px; }
    .u-w-45p:not(#_#_) { width: 45%; }
    .u-w-52:not(#_#_) { width: 52px; }
    .u-w-54:not(#_#_) { width: 54px; }
    .u-w-64:not(#_#_) { width: 64px; }
    .u-w-7:not(#_#_) { width: 7px; }
    .u-w-90:not(#_#_) { width: 90px; }
    .u-w-92p:not(#_#_) { width: 92%; }
    .u-ai-base:not(#_#_) { align-items: baseline; }
    .u-ai-c:not(#_#_) { align-items: center; }
    .u-ai-end:not(#_#_) { align-items: flex-end; }
    .u-ai-start:not(#_#_) { align-items: flex-start; }
    .u-ai-stretch:not(#_#_) { align-items: stretch; }
    .u-as-stretch:not(#_#_) { align-self: stretch; }
    .u-ad-0ms:not(#_#_) { animation-delay: 0ms; }
    .u-ad-135ms:not(#_#_) { animation-delay: 135ms; }
    .u-ad-180ms:not(#_#_) { animation-delay: 180ms; }
    .u-ad-225ms:not(#_#_) { animation-delay: 225ms; }
    .u-ad-270ms:not(#_#_) { animation-delay: 270ms; }
    .u-ad-315ms:not(#_#_) { animation-delay: 315ms; }
    .u-ad-360ms:not(#_#_) { animation-delay: 360ms; }
    .u-ad-45ms:not(#_#_) { animation-delay: 45ms; }
    .u-ad-90ms:not(#_#_) { animation-delay: 90ms; }
    .u-bb-line:not(#_#_) { border-bottom: 1px solid var(--border); }
    .u-bb-none:not(#_#_) { border-bottom: none; }
    .u-bcol-collapse:not(#_#_) { border-collapse: collapse; }
    .u-bl-3-solid-border:not(#_#_) { border-left: 3px solid var(--border); }
    .u-bl-3-solid-accent:not(#_#_) { border-left: 3px solid var(--accent); }
    .u-r-50p:not(#_#_) { border-radius: 50%; }
    .u-r-lg:not(#_#_) { border-radius: var(--r-lg); }
    .u-r-md:not(#_#_) { border-radius: var(--r-md); }
    .u-r-pill:not(#_#_) { border-radius: var(--r-pill); }
    .u-bt-line:not(#_#_) { border-top: 1px solid var(--border); }
    .u-bt-none:not(#_#_) { border-top: none; }
    .u-fxd-column:not(#_#_) { flex-direction: column; }
    .u-fxs-0:not(#_#_) { flex-shrink: 0; }
    .u-fxw-wrap:not(#_#_) { flex-wrap: wrap; }
    .u-ff-monospace:not(#_#_) { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
    .u-fs-11:not(#_#_) { font-size: 11px; }
    .u-fs-12:not(#_#_) { font-size: 12px; }
    .u-fs-13:not(#_#_) { font-size: 13px; }
    .u-fs-14:not(#_#_) { font-size: 14px; }
    .u-fs-15:not(#_#_) { font-size: 15px; }
    .u-fs-16:not(#_#_) { font-size: 16px; }
    .u-fs-18:not(#_#_) { font-size: 18px; }
    .u-fs-20:not(#_#_) { font-size: 20px; }
    .u-fs-22:not(#_#_) { font-size: 22px; }
    .u-fs-24:not(#_#_) { font-size: 24px; }
    .u-fs-26:not(#_#_) { font-size: 26px; }
    .u-fs-28:not(#_#_) { font-size: 28px; }
    .u-fs-30:not(#_#_) { font-size: 30px; }
    .u-fs-42:not(#_#_) { font-size: 42px; }
    .u-fst-italic:not(#_#_) { font-style: italic; }
    .u-fw-400:not(#_#_) { font-weight: 400; }
    .u-fw-500:not(#_#_) { font-weight: 500; }
    .u-fw-600:not(#_#_) { font-weight: 600; }
    .u-fw-700:not(#_#_) { font-weight: 700; }
    .u-gcol-1-n1:not(#_#_) { grid-column: 1/-1; }
    .u-jc-between:not(#_#_) { justify-content: space-between; }
    .u-jc-c:not(#_#_) { justify-content: center; }
    .u-ls-0:not(#_#_) { letter-spacing: 0; }
    .u-ls-0_02em:not(#_#_) { letter-spacing: .02em; }
    .u-ls-0_04em:not(#_#_) { letter-spacing: .04em; }
    .u-ls-0_05em:not(#_#_) { letter-spacing: .05em; }
    .u-ls-0_06em:not(#_#_) { letter-spacing: .06em; }
    .u-ls-n0_01em:not(#_#_) { letter-spacing: -.01em; }
    .u-lh-1_35:not(#_#_) { line-height: 1.35; }
    .u-lh-1_45:not(#_#_) { line-height: 1.45; }
    .u-lh-1_5:not(#_#_) { line-height: 1.5; }
    .u-lh-1_55:not(#_#_) { line-height: 1.55; }
    .u-lh-1_6:not(#_#_) { line-height: 1.6; }
    .u-lh-1_65:not(#_#_) { line-height: 1.65; }
    .u-lh-1_7:not(#_#_) { line-height: 1.7; }
    .u-lh-22:not(#_#_) { line-height: 22px; }
    .u-lh-36:not(#_#_) { line-height: 36px; }
    .u-mb-10:not(#_#_) { margin-bottom: 10px; }
    .u-mb-12:not(#_#_) { margin-bottom: 12px; }
    .u-mb-14:not(#_#_) { margin-bottom: 14px; }
    .u-mb-16:not(#_#_) { margin-bottom: 16px; }
    .u-mb-18:not(#_#_) { margin-bottom: 18px; }
    .u-mb-4:not(#_#_) { margin-bottom: 4px; }
    .u-mb-5:not(#_#_) { margin-bottom: 5px; }
    .u-mb-6:not(#_#_) { margin-bottom: 6px; }
    .u-mb-8:not(#_#_) { margin-bottom: 8px; }
    .u-ml-10:not(#_#_) { margin-left: 10px; }
    .u-ml-4:not(#_#_) { margin-left: 4px; }
    .u-ml-6:not(#_#_) { margin-left: 6px; }
    .u-ml-8:not(#_#_) { margin-left: 8px; }
    .u-ml-auto:not(#_#_) { margin-left: auto; }
    .u-mr-4:not(#_#_) { margin-right: 4px; }
    .u-mr-5:not(#_#_) { margin-right: 5px; }
    .u-mr-6:not(#_#_) { margin-right: 6px; }
    .u-mr-8:not(#_#_) { margin-right: 8px; }
    .u-mt-1:not(#_#_) { margin-top: 1px; }
    .u-mt-10:not(#_#_) { margin-top: 10px; }
    .u-mt-14:not(#_#_) { margin-top: 14px; }
    .u-mt-16:not(#_#_) { margin-top: 16px; }
    .u-mt-18:not(#_#_) { margin-top: 18px; }
    .u-mt-2:not(#_#_) { margin-top: 2px; }
    .u-mt-20:not(#_#_) { margin-top: 20px; }
    .u-mt-26:not(#_#_) { margin-top: 26px; }
    .u-mt-3:not(#_#_) { margin-top: 3px; }
    .u-mt-4:not(#_#_) { margin-top: 4px; }
    .u-mt-40:not(#_#_) { margin-top: 40px; }
    .u-mt-5:not(#_#_) { margin-top: 5px; }
    .u-mt-50:not(#_#_) { margin-top: 50px; }
    .u-mt-6:not(#_#_) { margin-top: 6px; }
    .u-mt-8:not(#_#_) { margin-top: 8px; }
    .u-mt-9:not(#_#_) { margin-top: 9px; }
    .u-maxh-228:not(#_#_) { max-height: 228px; }
    .u-maxh-240:not(#_#_) { max-height: 240px; }
    .u-maxh-320:not(#_#_) { max-height: 320px; }
    .u-maxh-88vh:not(#_#_) { max-height: 88vh; }
    .u-maxw-220:not(#_#_) { max-width: 220px; }
    .u-maxw-260:not(#_#_) { max-width: 260px; }
    .u-maxw-280:not(#_#_) { max-width: 280px; }
    .u-maxw-320:not(#_#_) { max-width: 320px; }
    .u-maxw-330:not(#_#_) { max-width: 330px; }
    .u-maxw-400:not(#_#_) { max-width: 400px; }
    .u-maxw-460:not(#_#_) { max-width: 460px; }
    .u-maxw-560:not(#_#_) { max-width: 560px; }
    .u-maxw-640:not(#_#_) { max-width: 640px; }
    .u-maxw-680:not(#_#_) { max-width: 680px; }
    .u-minh-0:not(#_#_) { min-height: 0; }
    .u-minh-14:not(#_#_) { min-height: 14px; }
    .u-minh-18:not(#_#_) { min-height: 18px; }
    .u-minw-0:not(#_#_) { min-width: 0; }
    .u-minw-130:not(#_#_) { min-width: 130px; }
    .u-minw-200:not(#_#_) { min-width: 200px; }
    .u-minw-230:not(#_#_) { min-width: 230px; }
    .u-minw-248:not(#_#_) { min-width: 248px; }
    .u-minw-260:not(#_#_) { min-width: 260px; }
    .u-minw-300:not(#_#_) { min-width: 300px; }
    .u-minw-48:not(#_#_) { min-width: 48px; }
    .u-minw-62:not(#_#_) { min-width: 62px; }
    .u-of-cover:not(#_#_) { object-fit: cover; }
    .u-ovx-auto:not(#_#_) { overflow-x: auto; }
    .u-ovy-auto:not(#_#_) { overflow-y: auto; }
    .u-pl-18:not(#_#_) { padding-left: 18px; }
    .u-pt-6:not(#_#_) { padding-top: 6px; }
    .u-pt-8:not(#_#_) { padding-top: 8px; }
    .u-ta-c:not(#_#_) { text-align: center; }
    .u-ta-l:not(#_#_) { text-align: left; }
    .u-ta-r:not(#_#_) { text-align: right; }
    .u-td-none:not(#_#_) { text-decoration: none; }
    .u-to-ellipsis:not(#_#_) { text-overflow: ellipsis; }
    .u-tt-none:not(#_#_) { text-transform: none; }
    .u-tt-upper:not(#_#_) { text-transform: uppercase; }
    .u-us-none:not(#_#_) { user-select: none; }
    .u-va-middle:not(#_#_) { vertical-align: middle; }
    .u-va-n0_18em:not(#_#_) { vertical-align: -0.18em; }
    .u-ws-nowrap:not(#_#_) { white-space: nowrap; }
    .u-ws-pre:not(#_#_) { white-space: pre; }
    .u-ws-pre-wrap:not(#_#_) { white-space: pre-wrap; }
    .u-wb-break-word:not(#_#_) { word-break: break-word; }
    .u-rc-dem:not(#_#_) { --rc: var(--dem); }
    .u-rc-mute:not(#_#_) { --rc: var(--mute); }
    .u-rc-rep:not(#_#_) { --rc: var(--rep); }
    .u-fvn-tnum:not(#_#_) { font-variant-numeric: tabular-nums; }
    .u-gtc-1fr-1fr:not(#_#_) { grid-template-columns: 1fr 1fr; }
    .u-gtc-1fr-80-100-100:not(#_#_) { grid-template-columns: 1fr 80px 100px 100px; }
    .u-gtc-40-1fr-96-80-100-100-80-100:not(#_#_) { grid-template-columns: 40px 1fr 96px 80px 100px 100px 80px 100px; }
    .u-gtc-50-1fr-70-110-90-110-90:not(#_#_) { grid-template-columns: 50px 1fr 70px 110px 90px 110px 90px; }
    .u-gtc-80-1fr-1fr:not(#_#_) { grid-template-columns: 80px 1fr 1fr; }
    /* ── end utilities ── */
  /*SP_ICON_CSS*/
    #sp-icon-sprite { position:absolute; width:0; height:0; overflow:hidden; }
    .ic { display:inline-block; width:1em; height:1em; vertical-align:-0.14em; flex:none; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
    .legacy-emoji { font-style:normal; }
/*/SP_ICON_CSS*/

    /* Readable secondary views and compact mobile controls. */
    .dir-filters > summary, .mth-contents > summary, .mth-section > summary { min-height:44px; padding:12px 0; cursor:pointer; font-size:15px; font-weight:600; }
    .dir-filters > summary:hover, .mth-contents > summary:hover, .mth-section > summary:hover { color:var(--accent); }
    .dir-filters > summary span { margin-left:8px; color:var(--mute); font-size:13px; font-weight:400; }
    .dir-filter-fields { display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:8px 0; }
    #pd-search, #pd-state { min-height:44px; }
    .dir-row { position:relative; }
    /* People's pager (2026-10-07): the count, then ← Prev · Page n of N · Next →; neither
       phrase breaks ("Page 1 of / 5" wrapped a lone number on a phone, mdeep_4_s9), and on
       a phone the buttons take a row of their own under the count. */
    .dir-pager { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:10px 16px; padding:14px 12px; }
    .dir-pager span { white-space:nowrap; }
    .dir-pager-nav { display:flex; align-items:center; gap:6px; }
    @media (max-width:640px) { .dir-pager { padding:14px 0; } .dir-pager-nav { flex:1 0 100%; justify-content:space-between; } }
    @media (min-width: 641px) {
      .dir-directory { background: var(--surf); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow); }
      .dir-directory .dir-columns { background: var(--bg-soft); border-radius: var(--r-lg) var(--r-lg) 0 0; }
      .dir-directory .dir-row:last-child { border-bottom: 0; }
    }
    .dir-vh { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
    .mth-contents { padding:0 16px; margin:20px 0; border:1px solid var(--border); border-radius:var(--r-lg); background:var(--surf); }
    .mth-contents nav { display:grid; gap:8px; padding-bottom:16px; }
    .mth-contents a { display:block; padding:6px 0; }
    .mth-section { border-top:1px solid var(--border); }
    .mth-section > summary h2 { display:inline; margin:0; font-size:var(--fs-lg); }
    #methodology-content h2[id] { scroll-margin-top:90px; }
    .data-totals { max-width:360px; white-space:normal; font-size:13px; }
    .tb-layer-src, .tb-layer-stats, .tb-agree { font-size:12px; }
    @media (max-width:640px) {
      #view-activity .strats-mini-dash { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); grid-auto-flow:row; grid-auto-columns:auto; overflow:visible; background:none; }
      #view-activity .smd-card { min-width:0; }
      .dir-filters { margin-top:10px; padding:0 12px; border:1px solid var(--border); border-radius:var(--r-lg); background:var(--surf); }
      .dir-directory { overflow:visible; background-image:none; }   /* 2026-10-07: no "scroll for more" edge on a list that no longer scrolls — in dark it was a light stripe (md_8_*) */
      /* A11Y-04: the column headers and the Party / Chamber cells are hidden from
         view, not from screen readers — display:none dropped them from the table,
         so a phone's cells no longer lined up with their headers. */
      .dir-directory .dir-columns, .dir-row > :nth-child(3), .dir-row > :nth-child(4) { position:absolute !important; width:1px; height:1px; min-width:0 !important; padding:0 !important; border:0 !important; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
      .dir-directory .dir-row { min-width:0 !important; grid-template-columns:44px repeat(3,minmax(0,1fr)) !important; gap:10px 8px !important; padding:16px 0 !important; }
      .dir-row > :nth-child(2) { grid-column:2/-1; }
      .dir-row > [data-label] { text-align:left !important; }
      .dir-row > :nth-child(5) { grid-column:2; }
      .dir-row > [data-label]::before { content:attr(data-label); content:attr(data-label) / ""; display:block; margin-bottom:4px; font-size:12px; color:var(--mute); }
      #view-activity .rc-table, #view-activity .rc-table tbody { display:block; min-width:0; width:100%; }
      .rc-table thead { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }
      .rc-table tr { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; padding:16px 0; border-bottom:1px solid var(--border); }
      .rc-scroll { overflow:visible; background:none; }
      .rc-table td { display:block; min-width:0; padding:0; border:0; text-align:left; white-space:normal; overflow-wrap:anywhere; }
      .rc-table .rc-num { text-align:left; }
      .rc-table td a { display:block; white-space:normal; }
      .rc-table td::before { content:attr(data-label); display:block; margin-bottom:4px; color:var(--mute); font-size:12px; }
      .rc-table .rc-strategy { grid-column:1/-1; }
      .rc-table .rc-caption { display:block; }
    }
  