/* Parallax Research — brand colorway (the para//ax wordmark).
   Day: white/near-white surfaces, charcoal-navy ink, burnt-orange accent.
   Night: charcoal-black surfaces, warm white ink, the same orange lifted.
   Status colors validated (dataviz six-checks) for both modes:
     day    #15803d / #a16207 / #b91c1c  on #ffffff
     night  #37a970 / #b3831f / #e0654f  on #16171c                       */
:root {
  --bg: #f6f4f0; --bg-2: #edeae4; --panel: #ffffff; --panel-2: #f9f7f4;
  --ink: #1c1f28; --ink-2: #464b58; --muted: #6e7280; --faint: #9da0a9;
  --line: #e7e5df; --line-2: #f0eee9;
  --accent: #c05a28; --accent-ink: #ffffff; --accent-soft: #faeee5;
  --brand-orange: #d97d4a;
  --green: #15803d; --green-soft: #e6f4eb; --green-ink: #136b34;
  --red: #b91c1c; --red-soft: #fbeaea; --red-ink: #a51a1a;
  --amber: #a16207; --amber-soft: #f8f0dd; --amber-ink: #8a5406;
  /* Near-square. Soft 12px corners are consumer-app language; research
     terminals and the printed notes they descend from are ruled, not
     rounded. This one token moves the register more than any other. */
  --radius: 3px; --radius-sm: 2px;
  --shadow: 0 1px 2px rgba(28,31,40,.06), 0 6px 22px rgba(28,31,40,.06);
  --shadow-sm: 0 1px 2px rgba(28,31,40,.07);
  --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Roboto, sans-serif;
  --mono: ui-monospace, "SF Mono", Menlo, monospace;
  --wrap: 1460px;
  --wrap-read: 1000px;
  color-scheme: light;
  /* The active scheme, readable from JS. Third-party embeds (the
     TradingView iframe) need to be told light/dark explicitly, and
     the stylesheet is the only thing that actually knows — it wins
     whether the scheme came from the OS query or a data-theme pin. */
  --ui-scheme: "light";
}
@media (prefers-color-scheme: dark) {
  :root {
    color-scheme: dark;
    --ui-scheme: "dark";
    --bg: #0e0f12; --bg-2: #14151a; --panel: #16171c; --panel-2: #1e2026;
    --ink: #f2f0ec; --ink-2: #c7c5c0; --muted: #8f8e8a; --faint: #605f5c;
    --line: #272931; --line-2: #202229;
    --accent: #c05a28; --accent-ink: #ffffff; --accent-soft: rgba(192,90,40,.16);
    --brand-orange: #d97d4a;
    --green: #37a970; --green-soft: rgba(55,169,112,.13); --green-ink: #6cc898;
    --red: #e0654f; --red-soft: rgba(224,101,79,.13); --red-ink: #ec8a78;
    --amber: #b3831f; --amber-soft: rgba(179,131,31,.15); --amber-ink: #d3a94e;
    --shadow: 0 1px 2px rgba(0,0,0,.5), 0 10px 32px rgba(0,0,0,.4);
    --shadow-sm: 0 1px 2px rgba(0,0,0,.45);
  }
}
:root[data-theme="dark"] {
  color-scheme: dark;
  --ui-scheme: "dark";
  --bg: #0e0f12; --bg-2: #14151a; --panel: #16171c; --panel-2: #1e2026;
  --ink: #f2f0ec; --ink-2: #c7c5c0; --muted: #8f8e8a; --faint: #605f5c;
  --line: #272931; --line-2: #202229;
  --accent: #c05a28; --accent-ink: #ffffff; --accent-soft: rgba(192,90,40,.16);
  --brand-orange: #d97d4a;
  --green: #37a970; --green-soft: rgba(55,169,112,.13); --green-ink: #6cc898;
  --red: #e0654f; --red-soft: rgba(224,101,79,.13); --red-ink: #ec8a78;
  --amber: #b3831f; --amber-soft: rgba(179,131,31,.15); --amber-ink: #d3a94e;
  --shadow: 0 1px 2px rgba(0,0,0,.5), 0 10px 32px rgba(0,0,0,.4);
  --shadow-sm: 0 1px 2px rgba(0,0,0,.45);
}
:root[data-theme="light"] {
  color-scheme: light;
  --ui-scheme: "light";
  --bg: #f6f4f0; --bg-2: #edeae4; --panel: #ffffff; --panel-2: #f9f7f4;
  --ink: #1c1f28; --ink-2: #464b58; --muted: #6e7280; --faint: #9da0a9;
  --line: #e7e5df; --line-2: #f0eee9;
  --accent: #c05a28; --accent-ink: #ffffff; --accent-soft: #faeee5;
  --brand-orange: #d97d4a;
  --green: #15803d; --green-soft: #e6f4eb; --green-ink: #136b34;
  --red: #b91c1c; --red-soft: #fbeaea; --red-ink: #a51a1a;
  --amber: #a16207; --amber-soft: #f8f0dd; --amber-ink: #8a5406;
  --shadow: 0 1px 2px rgba(28,31,40,.06), 0 6px 22px rgba(28,31,40,.06);
  --shadow-sm: 0 1px 2px rgba(28,31,40,.07);
}

* { box-sizing: border-box; }
/* The `hidden` attribute lives in the UA stylesheet, and ANY author rule that
   sets display beats it on cascade origin — so `.push-nudge { display:flex }`
   silently made el.hidden = true a no-op, leaving the push prompt permanently
   on the dashboard with a dismiss button that appeared dead. Anything the
   markup or a script marks hidden is hidden, full stop. */
[hidden] { display: none !important; }
/* NOTHING ON THIS SITE SCROLLS SIDEWAYS. There was a guard for it, but only
   inside the phone media query, so any desktop page with one over-wide child
   dragged the whole layout - nav and all - off to the left.

   `clip`, not `hidden`. `overflow: hidden` on html/body makes the element a
   scroll container, which silently kills `position: sticky` - and the nav,
   the desk sub-nav, the gate bar, the report TOC chips and the whitepaper
   contents are all sticky. `clip` cuts the overflow without creating that
   container, so they keep working.

   This is a backstop, not a licence: anything genuinely wide (tables, code,
   charts) still needs its own `overflow-x: auto` wrapper so it can be
   scrolled on its own rather than silently truncated. */
html { -webkit-text-size-adjust: 100%; overflow-x: clip; max-width: 100%; }
body { overflow-x: clip; max-width: 100%; }
body { margin: 0; background: var(--bg); color: var(--ink); font-family: var(--sans);
       font-size: 15px; line-height: 1.62; -webkit-font-smoothing: antialiased; }
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; text-underline-offset: 2px; }
h1, h2 { font-family: var(--sans); font-weight: 700; letter-spacing: -.022em; text-wrap: balance; }
h3, h4 { letter-spacing: -.01em; }

/* ── nav ─────────────────────────────────────────────────────── */
.nav { position: sticky; top: 0; z-index: 50; display: flex; align-items: center; gap: 8px;
       padding: 0 24px; height: 60px; border-bottom: 1px solid var(--line);
       background: color-mix(in srgb, var(--bg) 86%, transparent);
       backdrop-filter: saturate(1.3) blur(12px); }
/* The para//ax lockup (real logo assets in /static/brand/). The light/dark
   image swap follows the same three-block precedence as the theme tokens:
   OS preference is the default, an explicit data-theme wins either way. */
.nav-brand { display: flex; align-items: center; flex-shrink: 0; }
.nav-brand img { height: 21px; width: auto; display: block; }
.nav-brand .logo-dark { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .nav-brand .logo-light { display: none; }
  :root:not([data-theme="light"]) .nav-brand .logo-dark { display: block; }
}
:root[data-theme="dark"] .nav-brand .logo-light { display: none; }
:root[data-theme="dark"] .nav-brand .logo-dark { display: block; }
.nav-tabs { display: flex; gap: 2px; margin-left: 22px; min-width: 0; overflow-x: auto;
            scrollbar-width: none; }
.nav-tabs::-webkit-scrollbar { display: none; }
.nav-tabs a { white-space: nowrap; }
.nav-right { flex-shrink: 0; }
.nav-tabs a { color: var(--ink-2); font-size: 14px; font-weight: 550; padding: 7px 13px; border-radius: var(--radius); }
.nav-tabs a:hover { background: var(--bg-2); text-decoration: none; color: var(--ink); }
.nav-tabs a.active { color: var(--accent); background: var(--accent-soft); }
.nav-right { margin-left: auto; display: flex; align-items: center; gap: 14px; }
.nav-right a:not(.btn), .nav-right .linklike { color: var(--muted); font-size: 13.5px; }
.icon-btn { background: none; border: 1px solid var(--line); border-radius: var(--radius); width: 34px; height: 34px;
            cursor: pointer; color: var(--ink-2); font-size: 15px; display: grid; place-items: center; }
.icon-btn:hover { border-color: var(--accent); color: var(--accent); }
.inline-form { display: inline; }
/* floating back-to-top (injected by ui.js on long pages) */
.to-top { position: fixed; right: 18px; bottom: 18px; z-index: 45; width: 40px; height: 40px;
  border-radius: 50%; border: 1px solid var(--line); background: var(--panel); color: var(--ink-2);
  box-shadow: var(--shadow); cursor: pointer; font-size: 17px; display: grid; place-items: center;
  opacity: 0; transform: translateY(8px); pointer-events: none; transition: opacity .2s, transform .2s; }
.to-top.show { opacity: 1; transform: none; pointer-events: auto; }
.to-top:hover { color: var(--accent); border-color: var(--accent); }
.linklike { background: none; border: none; font: inherit; cursor: pointer; padding: 0; }
.linklike:hover { color: var(--ink); }

/* ── layout ──────────────────────────────────────────────────── */
.wrap { max-width: var(--wrap); margin: 0 auto; padding: 30px 32px 64px; }
.wrap.wrap-read { max-width: var(--wrap-read); }
.wrap.narrow { max-width: 470px; }
/* landing hero fills the viewport below the nav and self-centers; the wrap's
   top padding would push it down and make the top gap exceed the bottom. */
.wrap.wrap-flush { padding-top: 0; }
.foot { max-width: var(--wrap); margin: 26px auto; padding: 20px 24px 0; color: var(--faint);
        font-size: 11.5px; border-top: 1px solid var(--line); line-height: 1.55; }
.page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px;
             flex-wrap: wrap; margin: 4px 0 22px; }
.page-head h1 { font-size: 30px; margin: 0; }
.page-head p { margin: 5px 0 0; color: var(--muted); font-size: 14px; }
.eyebrow { color: var(--accent); font-weight: 700; font-size: 11.5px; text-transform: uppercase;
           letter-spacing: .13em; font-family: var(--sans); }

.card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
        box-shadow: var(--shadow-sm); padding: 24px 28px; margin-bottom: 18px; }
.card > h2 { margin: 0 0 4px; font-size: 19px; }
.sub { color: var(--muted); font-size: 13.5px; }
/* wide frame, readable measure: descriptive prose never stretches past ~72ch */
.page-head p, .card > p.sub, .card > .sub { max-width: 72ch; }
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
/* let the columns shrink: grid items default to min-width:auto, which lets a
   nowrap table (e.g. dark-pool blocks) blow its track past 1fr and overflow the
   card instead of scrolling inside its own .tbl-wrap. */
.grid-2 > * { min-width: 0; }
.muted { color: var(--muted); } .small { font-size: 12.5px; } .center { text-align: center; }
.mono { font-family: var(--mono); font-size: 12.5px; }
.tick { font-family: var(--mono); font-weight: 700; letter-spacing: .01em; }

/* ── buttons + forms ─────────────────────────────────────────── */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px;
       border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
       color: var(--ink); padding: 9px 16px; font-size: 14px; font-weight: 600;
       cursor: pointer; font-family: var(--sans); transition: border-color .12s, background .12s; }
.btn:hover { text-decoration: none; border-color: var(--accent); }
.btn-primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
.btn-primary:hover { filter: brightness(1.07); }
.btn-lg { padding: 12px 26px; font-size: 15.5px; border-radius: var(--radius); }
.btn-sm { padding: 5px 12px; font-size: 13px; }
.btn-danger { color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, var(--line)); }
.btn-danger:hover { background: var(--red-soft); border-color: var(--red); }
.btn:disabled { opacity: .5; cursor: not-allowed; }
label.field { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; }
input, select { border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
       color: var(--ink); padding: 10px 13px; font-size: 15px; font-family: var(--sans); width: 100%; }
input:focus, select:focus { outline: 2px solid var(--accent); outline-offset: 1px; border-color: transparent; }
.stack { display: flex; flex-direction: column; gap: 14px; margin-top: 14px; }
.divider { display: flex; align-items: center; gap: 12px; color: var(--faint); font-size: 12px; margin: 16px 0; }
.divider::before, .divider::after { content: ""; flex: 1; height: 1px; background: var(--line); }
.analyze-bar { display: flex; gap: 10px; }
.analyze-bar .ticker-input { flex: 1; max-width: 230px; text-transform: uppercase;
       font-family: var(--mono); font-weight: 700; font-size: 17px; letter-spacing: .06em; }
/* terminal lookup accepts a name too — natural text, fills the row */
.analyze-bar .term-q { flex: 1; min-width: 0; font-size: 15px; }
/* Both dashboard inputs share ONE placeholder look — plain sans, 15px, same grey —
   even though the ticker input still renders TYPED text as bold uppercase mono. */
.analyze-bar .ticker-input::placeholder,
.analyze-bar .term-q::placeholder {
  font-family: var(--sans); font-weight: 400; text-transform: none;
  letter-spacing: normal; font-size: 15px; }

/* ── notes ───────────────────────────────────────────────────── */
.note { border-radius: var(--radius); padding: 11px 15px; font-size: 13.5px; margin: 0 0 14px;
        border: 1px solid transparent; }
.note.ok  { background: var(--green-soft); color: var(--green-ink); border-color: color-mix(in srgb, var(--green) 25%, transparent); }
.note.err { background: var(--red-soft); color: var(--red-ink); border-color: color-mix(in srgb, var(--red) 25%, transparent); word-break: break-word; }
.note.info{ background: var(--accent-soft); color: var(--accent); border-color: color-mix(in srgb, var(--accent) 24%, transparent); }

/* ── stat tiles ──────────────────────────────────────────────── */
.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(118px, 1fr)); gap: 10px; }
.stat { background: var(--panel-2); border: 1px solid var(--line-2); border-radius: var(--radius-sm);
        padding: 13px 16px 11px; }
.stat .n { font-family: var(--sans); font-size: 26px; font-weight: 650; line-height: 1.05; }
.stat .l { color: var(--muted); font-size: 11.5px; margin-top: 4px; letter-spacing: .02em; }
.stat .n.buy { color: var(--green-ink); } .stat .n.sell { color: var(--red-ink); } .stat .n.hold { color: var(--amber-ink); }

/* ── tables ──────────────────────────────────────────────────── */
.tbl-wrap { overflow-x: auto; }
table.tbl { width: 100%; border-collapse: collapse; font-size: 13.5px; }
table.tbl th { text-align: left; color: var(--muted); font-size: 10.5px; text-transform: uppercase;
       letter-spacing: .08em; font-weight: 700; padding: 9px 12px; border-bottom: 1px solid var(--line); white-space: nowrap; }
table.tbl td { padding: 10px 12px; border-bottom: 1px solid var(--line-2); white-space: nowrap; }
table.tbl tr:last-child td { border-bottom: none; }
table.tbl tbody tr:hover { background: var(--panel-2); }
.num { text-align: right; font-family: var(--mono); font-size: 12.5px; font-variant-numeric: tabular-nums; }
/* header cells need the .num alignment too — `table.tbl th` (specificity 0,1,2)
   outranks bare `.num` (0,1,0), so without this the headers stay left while the
   numeric data goes right and the columns visibly drift apart. */
table.tbl th.num { text-align: right; }
/* flow/dark-pool tables live two-up inside a grid-2, so each gets ~half the
   card — tighten the cell padding + size so all four columns fit that narrow
   column instead of forcing a horizontal scrollbar. */
#options table.tbl td, #options table.tbl th { padding: 7px 8px; font-size: 12.5px; }
#options table.tbl td.small, #options table.tbl td .small { font-size: 11.5px; }
/* the flow + dark-pool tables carry wide content (contract strings, timestamps)
   and the company card is a narrow reading column — side-by-side left each at
   ~half and clipped/scrolling. Stack them so each spans the full card width. */
#options .grid-2 { grid-template-columns: 1fr; gap: 20px; }
.pos { color: var(--green-ink); } .neg { color: var(--red-ink); }
.row-link { cursor: pointer; }

/* ── pills / badges / chips ──────────────────────────────────── */
.pill { display: inline-block; border-radius: var(--radius-sm); padding: 2px 11px; font-size: 11.5px;
        font-weight: 750; letter-spacing: .03em; }
.pill-buy  { background: var(--green-soft); color: var(--green-ink); }
.pill-sell { background: var(--red-soft); color: var(--red-ink); }
.pill-hold { background: var(--amber-soft); color: var(--amber-ink); }
.pill-na   { background: var(--bg-2); color: var(--muted); }
.badge { display: inline-block; background: var(--bg-2); color: var(--ink-2); border-radius: var(--radius);
         padding: 2px 8px; font-size: 11.5px; font-weight: 600; }
.badge.mom { background: var(--accent-soft); color: var(--accent); }
.badge.can { background: var(--amber-soft); color: var(--amber-ink); }
.badge.pass { background: var(--green-soft); color: var(--green-ink); }
.chips { display: flex; flex-wrap: wrap; gap: 7px; }
.chip { font-family: var(--mono); font-weight: 700; font-size: 12.5px; background: var(--panel-2);
        border: 1px solid var(--line); border-radius: var(--radius); padding: 5px 10px; color: var(--ink); cursor: pointer; }
.chip:hover { border-color: var(--accent); color: var(--accent); text-decoration: none; }
.chip.on { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }

/* ── landing ─────────────────────────────────────────────────── */
.hero { text-align: center; padding: 64px 0 36px; }
.hero h1 { font-size: 52px; line-height: 1.06; margin: 14px 0 20px; font-weight: 600; }
.hero .lede { max-width: 640px; margin: 0 auto 12px; color: var(--ink-2); font-size: 17px; }
.hero .cta { margin-top: 26px; }
.cta { display: flex; gap: 12px; justify-content: center; align-items: center; flex-wrap: wrap; }
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 14px; margin-top: 36px; }
.feature { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 22px 24px; }
.feature .ic { font-size: 20px; }
.feature h3 { margin: 10px 0 5px; font-size: 15.5px; font-family: var(--sans); font-size: 17px; }
.feature p { margin: 0; color: var(--muted); font-size: 13.5px; }

/* ── live job page ───────────────────────────────────────────── */
.progress-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.progress-head h1 { font-size: 26px; margin: 0; }
.progress-track { height: 7px; background: var(--bg-2); border-radius: var(--radius); overflow: hidden; margin: 16px 0 7px; }
.progress-fill { height: 100%; background: var(--accent); border-radius: var(--radius); width: 0; transition: width .6s ease; }
.progress-meta { display: flex; justify-content: space-between; color: var(--muted); font-size: 12.5px; }
.agent-steps { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0 2px; }
.step-chip { display: flex; align-items: center; gap: 6px; font-size: 12.5px; padding: 5px 11px;
             border-radius: var(--radius-sm); border: 1px solid var(--line); color: var(--muted); background: var(--panel); }
.step-chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--faint); }
.step-chip.done { color: var(--green-ink); border-color: color-mix(in srgb, var(--green) 32%, transparent); background: var(--green-soft); }
.step-chip.done .dot { background: var(--green); }
.step-chip.active { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.step-chip.active .dot { background: var(--accent); animation: pulse 1.1s infinite; }
@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: .3; } }
.spin { width: 14px; height: 14px; border: 2px solid var(--line); border-top-color: var(--accent);
        border-radius: 50%; animation: spin 1s linear infinite; display: inline-block; vertical-align: -2px; }
@keyframes spin { to { transform: rotate(360deg); } }
.live-sections { margin-top: 6px; }
.sec { border: 1px solid var(--line); border-radius: var(--radius-sm); margin-bottom: 12px;
       overflow: hidden; background: var(--panel); animation: slidein .4s ease; }
@keyframes slidein { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.sec > summary { cursor: pointer; list-style: none; padding: 13px 18px; font-weight: 650; font-size: 14.5px;
        display: flex; align-items: center; gap: 8px; background: var(--panel-2); }
.sec > summary::-webkit-details-marker { display: none; }
.sec > summary::after { content: "▸"; margin-left: auto; color: var(--muted); transition: transform .15s; }
.sec[open] > summary::after { transform: rotate(90deg); }
.sec .body { padding: 6px 20px 16px; }

/* ── price chart ─────────────────────────────────────────────── */
.chart-card { position: relative; }
.chart-wrap { position: relative; margin-top: 10px; }
.chart-wrap svg { display: block; width: 100%; height: auto; }
.chart-tip { position: absolute; pointer-events: none; background: var(--panel); border: 1px solid var(--line);
             border-radius: var(--radius); box-shadow: var(--shadow); padding: 6px 10px; font-size: 12px;
             font-family: var(--mono); display: none; white-space: nowrap; z-index: 5; }
.chart-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.chart-head .px { font-family: var(--sans); font-size: 24px; font-weight: 650; }
.chart-head .chg { font-family: var(--mono); font-size: 13px; font-weight: 700; }

/* ── report ──────────────────────────────────────────────────── */
.report-hero { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px;
       flex-wrap: wrap; background: var(--panel); border: 1px solid var(--line);
       border-left: 5px solid var(--muted); border-radius: var(--radius); padding: 26px 30px;
       margin-bottom: 18px; box-shadow: var(--shadow-sm); }
.report-hero h1 { margin: 0 0 4px; font-size: 34px; }
.report-hero .arrow { color: var(--faint); font-weight: 400; }
.decision-buy  { border-left-color: var(--green); } .decision-buy h1 .d { color: var(--green-ink); }
.decision-sell { border-left-color: var(--red); }   .decision-sell h1 .d { color: var(--red-ink); }
.decision-hold { border-left-color: var(--amber); } .decision-hold h1 .d { color: var(--amber-ink); }
/* price + key levels, inline in the hero (the chart card is gone) */
.hero-levels { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 14px; }
.hlv { display: inline-flex; align-items: baseline; gap: 7px; padding: 6px 11px;
       background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius); }
.hlv span { font-size: 10.5px; text-transform: uppercase; letter-spacing: .06em;
       color: var(--muted); font-weight: 700; }
.hlv b { font-family: var(--mono); font-size: 13.5px; font-variant-numeric: tabular-nums; }
.hlv b.pos { color: var(--green-ink); } .hlv b.neg { color: var(--red-ink); }

/* ── report: retail verdict card (why it works / what could go wrong + levels) ── */
.vcard { border-left: 5px solid var(--muted); }
.vcard-grid { display: grid; grid-template-columns: 1fr 250px; gap: 22px; align-items: start; }
@media (max-width: 720px) { .vcard-grid { grid-template-columns: 1fr; } }
.vcard-cases { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
@media (max-width: 520px) { .vcard-cases { grid-template-columns: 1fr; } }
.vc-case b { display: block; font-size: 13px; margin-bottom: 6px; }
.vc-case.vc-bull b { color: var(--green-ink); }
.vc-case.vc-bear b { color: var(--red-ink); }
.vc-case ul { margin: 0; padding-left: 17px; }
.vc-case li { font-size: 13.5px; line-height: 1.5; margin-bottom: 5px; }
.vcard-levels { background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 14px; }
.vc-lv-head { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); font-weight: 700; margin-bottom: 8px; }
.vc-lv { display: flex; justify-content: space-between; align-items: baseline; padding: 5px 0; border-top: 1px solid var(--line-2); font-size: 13.5px; }
.vc-lv:first-of-type { border-top: none; }
.vc-lv span { color: var(--muted); }
.vc-lv b { font-variant-numeric: tabular-nums; }
.vc-lv b.pos { color: var(--green-ink); } .vc-lv b.neg { color: var(--red-ink); }

/* report: shareable "win" banner when a tracked call has paid off */
.win-banner { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  border-left: 5px solid var(--green); background: color-mix(in srgb, var(--green) 9%, var(--panel)); }
.win-msg { display: flex; align-items: center; gap: 12px; }
.win-emoji { font-size: 26px; flex: none; }
.win-act { flex: none; }
.win-act .share-url { width: 260px; max-width: 60vw; }

/* report: Simple ⇄ Detailed rationale toggle (CSS radios, CSP-safe) */
.rc-card .rc-radio { position: absolute; opacity: 0; width: 1px; height: 1px; }
.rc-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.rc-tabs { display: inline-flex; gap: 3px; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius); padding: 3px; }
.rc-tab { padding: 5px 14px; border-radius: var(--radius); cursor: pointer; font-size: 13px; font-weight: 650; color: var(--muted); user-select: none; }
.rc-tab:hover { color: var(--ink); }
.rc-pane { display: none; }
#rc-simple:checked ~ .rc-simple,
#rc-full:checked   ~ .rc-full { display: block; }
#rc-simple:checked ~ .rc-head .rc-tab[for="rc-simple"],
#rc-full:checked   ~ .rc-head .rc-tab[for="rc-full"] { background: var(--panel); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,.12); }
.rc-eli5 { font-size: 15px; line-height: 1.62; color: var(--ink); margin: 0; }

.md { font-size: 14.5px; line-height: 1.72; overflow-wrap: break-word; }
.md h3 { margin: 22px 0 8px; font-size: 16.5px; font-weight: 700; letter-spacing: -.01em; }
.md h4 { margin: 20px 0 6px; font-size: 14.5px; font-weight: 700; color: var(--ink);
         padding-bottom: 5px; border-bottom: 1px solid var(--line-2); }
.md h5, .md h6 { margin: 16px 0 4px; font-size: 12px; font-weight: 700; text-transform: uppercase;
                 letter-spacing: .07em; color: var(--muted); }
.md h3:first-child, .md h4:first-child { margin-top: 2px; }
.md p { margin: 9px 0; color: var(--ink-2); }
.md ul, .md ol { margin: 8px 0 12px; padding-left: 22px; color: var(--ink-2); }
.md li { margin: 4px 0; padding-left: 2px; }
.md li::marker { color: var(--accent); font-weight: 600; }
.md strong { color: var(--ink); font-weight: 650; }
.md em { color: var(--muted); }
.md .md-hr { border: 0; border-top: 1px solid var(--line-2); margin: 18px 0; }
.md code { background: var(--bg-2); padding: 1px 6px; border-radius: var(--radius); font-size: 12.5px; font-family: var(--mono); }
.md table.md-tbl { width: 100%; border-collapse: collapse; margin: 12px 0; font-size: 13px; }
.md .md-tbl th, .md .md-tbl td { border: 1px solid var(--line); padding: 7px 10px; text-align: left; }
.md .md-tbl th { background: var(--panel-2); font-weight: 650; }
.share-box { min-width: 200px; text-align: right; }
.share-url { font-family: var(--mono); font-size: 11.5px; margin-bottom: 8px; }
details.section { border: 1px solid var(--line); border-radius: var(--radius-sm); margin-bottom: 12px;
       background: var(--panel); overflow: hidden; box-shadow: var(--shadow-sm); }
details.section > summary { cursor: pointer; list-style: none; padding: 15px 22px; font-weight: 650;
       display: flex; align-items: center; background: var(--panel-2); font-size: 14.5px; }
details.section > summary::-webkit-details-marker { display: none; }
details.section > summary::after { content: "▸"; margin-left: auto; color: var(--muted); transition: transform .15s; }
details.section[open] > summary::after { transform: rotate(90deg); }
details.section .body { padding: 4px 24px 18px; }
.headlines li { margin: 7px 0; font-size: 13.5px; }
.headlines .src { color: var(--faint); font-size: 12px; }

/* ── macro briefing ──────────────────────────────────────────── */
.regime-card { border-left: 5px solid var(--amber); }
.regime-text { font-family: var(--sans); font-size: 17px; margin: 6px 0 0; line-height: 1.55; }
.risk-list { margin: 10px 0 0; padding-left: 22px; }
.risk-list li { margin: 7px 0; font-size: 14px; }
.sig-card { border-left: 4px solid var(--line); }
.sig-sub { font-size: 12px; text-transform: uppercase; letter-spacing: .07em; color: var(--muted);
           margin: 18px 0 6px; font-weight: 700; }
.meter-row { display: flex; align-items: center; gap: 10px; }
.meter-lbl { min-width: 110px; font-size: 13px; color: var(--ink-2); }
.meter { flex: 1; height: 7px; background: var(--bg-2); border-radius: var(--radius); overflow: hidden; }
.meter-fill { height: 100%; background: var(--accent); border-radius: var(--radius); }
.meter-fill.fill-neg { background: var(--red); }
.meter-fill.fill-amber { background: var(--amber); }
.meter-val { width: 44px; text-align: right; font-family: var(--mono); font-size: 12px;
             font-variant-numeric: tabular-nums; }
.scenario-row { margin-top: 8px; }
.scenario-row .meter-lbl { min-width: 160px; }
.scenario-detail { margin: 2px 0 0 170px; }
.evidence { margin-top: 14px; }
.evidence summary { cursor: pointer; }
@media (max-width: 720px) { .scenario-detail { margin-left: 0; } }

/* ── misc ────────────────────────────────────────────────────── */
.kv { display: grid; grid-template-columns: 140px 1fr; gap: 9px 14px; margin: 14px 0; }
.kv dt { color: var(--muted); font-size: 13.5px; } .kv dd { margin: 0; }
.empty { color: var(--muted); text-align: center; padding: 28px; font-size: 14px; }
.tr-row { display: flex; gap: 22px; flex-wrap: wrap; align-items: baseline; }
.tr-item .v { font-family: var(--sans); font-size: 22px; font-weight: 650; }
.tr-item .k { color: var(--muted); font-size: 11.5px; }

@media (max-width: 720px) {
  .grid-2 { grid-template-columns: 1fr; }
  .hero h1 { font-size: 34px; }
  /* Phones: hamburger panel replaces the old scroll-strip nav. */
  .nav { flex-wrap: nowrap; padding: 0 14px; position: relative; }
  /* .nav prefix: the base display:none was appended LATER in this file and
     ties on specificity — without the prefix the cascade re-hides the burger */
  .nav .nav-burger { display: inline-flex; }
  .nav-tabs { display: none; position: absolute; top: 100%; left: 0; right: 0; z-index: 60;
    flex-direction: column; align-items: stretch; gap: 2px; margin: 0; padding: 10px 12px 14px;
    background: var(--panel); border-bottom: 1px solid var(--line);
    box-shadow: 0 12px 24px rgba(0,0,0,.12); overflow: visible; }
  .nav.open .nav-tabs { display: flex; }
  .nav-tabs a { padding: 11px 12px; font-size: 15px; }
  /* Desks flatten into the panel: no dropdown to fight with on touch. */
  .nav-dd { display: block; }
  .nav-dd-toggle { display: none; }
  .nav-dd-menu { position: static !important; display: block; min-width: 0; box-shadow: none;
    border: 0; border-left: 2px solid var(--line); border-radius: 0; margin: 2px 0 2px 12px; padding: 0 0 0 4px; }
  .nav-dd-menu a { font-size: 14.5px; padding: 10px 12px; }
  .nav-search-wrap { display: none; }
  /* Trim nav-right so it never forces a page-wide horizontal scroll on a phone.
     The ⌘K chip is desktop-only (no keyboard shortcut on touch anyway); the
     account link collapses to just its icon; sign-out lives on the Account
     page. What remains: burger · brand · bell · account icon — always fits. */
  .nav-right .inline-form { display: none; }
  .nav-user-name { display: none; }
  .nav-right { gap: 12px; }
  /* Now handled globally at the top with `clip`. `hidden` here made html a
     scroll container on phones, which quietly disabled every sticky element -
     the nav included - on exactly the screens that need it most. */
  .report-hero { flex-direction: column; } .share-box { text-align: left; }
  .analyze-bar { flex-wrap: wrap; } .analyze-bar .ticker-input { max-width: none; }
  .page-head h1 { font-size: 24px; }
}

/* ── pricing ──────────────────────────────────────────────────── */
.plans-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
              gap: 14px; margin-top: 18px; }
.plan { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
        padding: 22px 20px 18px; display: flex; flex-direction: column; gap: 7px;
        position: relative; box-shadow: var(--shadow-sm); }
.plan.featured { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent), var(--shadow); }
.plan .flag { position: absolute; top: -10px; left: 16px; background: var(--accent);
              color: var(--accent-ink); font-size: 10.5px; font-weight: 700; padding: 2px 9px;
              border-radius: var(--radius-sm); letter-spacing: .07em; text-transform: uppercase; }
.plan h3 { margin: 0; font-size: 16px; }
.plan .price { font-size: 32px; font-weight: 750; letter-spacing: -.025em; line-height: 1.1; }
.plan .price .per { font-size: 13px; color: var(--muted); font-weight: 500; letter-spacing: 0; }
.plan ul { margin: 8px 0 14px; padding-left: 18px; font-size: 13.5px; color: var(--ink-2); }
.plan ul li { margin: 4px 0; }
.plan .cta-row { margin-top: auto; }
.plan .cta-row .btn { width: 100%; }

/* ── usage meter ──────────────────────────────────────────────── */
.usage { margin: 12px 0 4px; }
.usage .bar { height: 8px; border-radius: var(--radius-sm); background: var(--panel-2);
              border: 1px solid var(--line); overflow: hidden; }
.usage .fill { height: 100%; background: var(--accent); border-radius: var(--radius-sm); }
.usage.maxed .fill { background: var(--red); }
.usage .cap { display: flex; justify-content: space-between; font-size: 12.5px;
              color: var(--muted); margin-top: 5px; }

/* ── depth selector ───────────────────────────────────────────── */
.depth-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; }
@media (max-width: 560px) { .depth-grid { grid-template-columns: 1fr; } }
.depth-opt { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 14px;
             cursor: pointer; display: block; background: var(--panel); font-size: 13.5px;
             transition: border-color .12s; }
.depth-opt b { display: block; font-size: 14px; margin-bottom: 2px; }
.depth-opt .sub { margin: 0; }
.depth-opt:has(input:checked) { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
.depth-opt.disabled { opacity: .55; cursor: not-allowed; }
.depth-opt input { position: absolute; opacity: 0; pointer-events: none; width: 1px; height: 1px; margin: 0; }
.depth-opt { position: relative; }
.depth-opt:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ── conversion banner on shared reports ─────────────────────── */
.cta-banner { background: var(--accent-soft); border: 1px solid
              color-mix(in srgb, var(--accent) 25%, transparent); border-radius: var(--radius);
              padding: 18px 20px; margin-top: 20px; display: flex; align-items: center;
              justify-content: space-between; gap: 14px; flex-wrap: wrap; }
.cta-banner p { margin: 0; }
.foot-links { margin: 0 0 8px; }
.foot-links a { color: var(--muted); }
select { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-sm);
         color: var(--ink); padding: 6px 8px; font-size: 13px; font-family: var(--sans); }
@media (max-width: 700px) {
  .nav-brand img { height: 16px; }
  .nav-tabs { margin-left: 10px; }
}

/* ── signals: expandable decision rows ───────────────────────── */
tr.sig-row { cursor: pointer; }
tr.sig-row:hover td { background: var(--panel-2); }
tr.sig-row .caret { color: var(--faint); font-size: 11px; display: inline-block;
                    transition: transform .15s; margin-left: 2px; }
tr.sig-row.open .caret { transform: rotate(90deg); color: var(--accent); }
tr.sig-detail td { background: var(--panel-2); padding: 4px 14px 14px;
                   border-bottom: 1px solid var(--line); }
.sig-body { max-height: 620px; overflow-y: auto; padding-right: 4px; }
.sig-body details.section { margin-top: 8px; }

/* ── scanners page ───────────────────────────────────────────── */
.scan-search { background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius-sm);
               color: var(--ink); padding: 9px 13px; font-size: 14px; font-family: var(--sans);
               min-width: 190px; }
.scan-search:focus { outline: none; border-color: var(--accent); }
.dh-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(185px, 1fr));
           gap: 12px; margin-top: 14px; }
.dh-card { background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius);
           padding: 14px 16px; }
.scan-double .dh-card { background: var(--accent-soft);
                        border-color: color-mix(in srgb, var(--accent) 30%, transparent); }
.dh-top { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.dh-top .tick { font-size: 16px; }
.dh-meta { margin-top: 7px; font-size: 12.5px; color: var(--muted); }
.dh-meta b.pos { color: var(--green-ink); } .dh-meta b.neg { color: var(--red-ink); }
.scan-tbl th.sortable { cursor: pointer; user-select: none; white-space: nowrap; }
.scan-tbl th.sortable:hover { color: var(--ink); }
.scan-tbl th.sortable::after { content: "↕"; margin-left: 5px; color: var(--faint); font-size: 10px; }
.scan-tbl th[data-dir="asc"]::after { content: "↑"; color: var(--accent); }
.scan-tbl th[data-dir="desc"]::after { content: "↓"; color: var(--accent); }


/* ── hover explainers (criteria popovers) ────────────────────── */
.has-tip { position: relative; cursor: help; }
.has-tip .l { text-decoration: underline dotted var(--faint); text-underline-offset: 3px; }
.tip-pop { position: absolute; top: calc(100% + 10px); left: 0; z-index: 40; display: none;
           width: 300px; max-width: 86vw; background: var(--panel); border: 1px solid var(--line);
           border-radius: var(--radius); box-shadow: var(--shadow); padding: 14px 16px; text-align: left;
           font-size: 12.5px; line-height: 1.55; color: var(--ink-2); }
.tip-pop b { color: var(--ink); }
.tip-pop .tp-title { font-weight: 700; color: var(--ink); font-size: 13px; margin: 0 0 6px; }
.tip-pop ul { margin: 0; padding-left: 16px; }
.tip-pop li { margin: 3px 0; }
.tip-pop li b.lt { color: var(--accent); font-family: var(--mono); margin-right: 2px; }
.has-tip:hover .tip-pop, .has-tip:focus .tip-pop, .has-tip:focus-within .tip-pop { display: block; }

/* ── consumer spend page ─────────────────────────────────────── */
.brief-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
              gap: 16px; }
.brief-card { display: flex; flex-direction: column; margin: 0; }
.brief-head { display: flex; align-items: center; justify-content: space-between; gap: 8px;
              margin-bottom: 10px; }
.brief-card h3 { margin: 0 0 6px; font-size: 15px; line-height: 1.4; letter-spacing: -.01em; }
.brief-summary { margin: 0 0 12px; font-size: 13.5px; line-height: 1.6; color: var(--ink-2); }
.metric-chips { display: flex; flex-wrap: wrap; gap: 7px; margin: 0 0 12px; }
.mchip { display: inline-flex; align-items: center; gap: 5px; font-size: 12px;
         padding: 4px 10px; border-radius: var(--radius-sm); border: 1px solid var(--line);
         background: var(--panel-2); color: var(--ink-2); }
.mchip b { font-weight: 700; }
.mchip.up { background: var(--green-soft); color: var(--green-ink);
            border-color: color-mix(in srgb, var(--green) 25%, transparent); }
.mchip.down { background: var(--red-soft); color: var(--red-ink);
              border-color: color-mix(in srgb, var(--red) 25%, transparent); }
.brief-takeaways { margin: 0 0 12px; padding-left: 18px; font-size: 12.5px;
                   line-height: 1.55; color: var(--muted); }
.brief-takeaways li { margin: 3px 0; }
.brief-takeaways li::marker { color: var(--accent); }
.brief-foot { margin-top: auto; display: flex; align-items: center;
              justify-content: space-between; gap: 10px; padding-top: 6px; }

/* ── search-interest (trends) section ─────────────────────────── */
tr.trend-row { cursor: pointer; }
tr.trend-row:hover td { background: var(--panel-2); }
tr.trend-row .caret { color: var(--faint); font-size: 11px; display: inline-block;
                      transition: transform .15s; margin-left: 2px; }
tr.trend-row.open .caret { transform: rotate(90deg); color: var(--accent); }
svg.spark { display: block; }
svg.spark polyline { fill: none; stroke: var(--accent); stroke-width: 1.6;
                     stroke-linejoin: round; stroke-linecap: round; }
tr.trend-detail td { background: var(--panel-2); padding: 12px 16px 16px;
                     border-bottom: 1px solid var(--line); }
.trend-detail-body { max-width: 620px; }
svg.trend-chart { display: block; width: 100%; height: 110px; }
svg.trend-chart polyline { fill: none; stroke: var(--accent); stroke-width: 2;
                           stroke-linejoin: round; }
svg.trend-chart .area { fill: var(--accent); opacity: .12; stroke: none; }

/* ── maritime desk ───────────────────────────────────────────── */
#marimap { height: 460px; border-radius: var(--radius); border: 1px solid var(--line);
           margin-top: 12px; z-index: 1; }
@media (max-width: 700px) { #marimap { height: 340px; } }
.mm-pop { font-family: var(--sans); font-size: 12.5px; line-height: 1.5; }
.mm-kind { color: #6e7280; font-size: 11px; text-transform: uppercase; letter-spacing: .05em; }
.sigbar { position: relative; height: 10px; background: var(--panel-2);
          border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; min-width: 140px; }
.sigbar-zero { position: absolute; left: 50%; top: 0; bottom: 0; width: 1px; background: var(--faint); }
.sigbar-fill { position: absolute; top: 0; bottom: 0; background: var(--green); border-radius: var(--radius-sm); }
.sigbar-fill.neg { background: var(--red); }
/* leaflet chrome in theme colors (light map tiles in both modes — readable) */
.leaflet-container { font-family: var(--sans); background: var(--panel-2); }
.leaflet-popup-content-wrapper { border-radius: var(--radius); }
tr.row-cut { display: none; }
.trend-expand { width: 100%; margin-top: 10px; justify-content: center; display: flex;
                color: var(--muted); font-size: 13px; }
.trend-expand:hover { color: var(--accent); }
/* landing pricing: force one row on desktop, compact cards */
.plans-row { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 10px; }
.plans-row .plan { padding: 16px 14px 14px; }
.plans-row .plan .price { font-size: 24px; }
.plans-row .plan ul { font-size: 12px; padding-left: 15px; }
.plans-row .plan h3 { font-size: 14px; }
.plans-row .plan .flag { font-size: 9.5px; padding: 2px 7px; }
.plans-row .plan .cta-row .btn { font-size: 12.5px; padding: 8px 8px; }
@media (max-width: 900px) { .plans-row { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); } }

/* ── report data furniture (statlines + definition rows) ─────── */
.md .statline { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0; }
.md .stat-chip { background: var(--panel-2); border: 1px solid var(--line);
                 border-radius: var(--radius); padding: 7px 13px; min-width: 78px; }
.md .stat-chip .k { display: block; color: var(--muted); font-size: 10.5px;
                    text-transform: uppercase; letter-spacing: .06em; margin-bottom: 1px; }
.md .stat-chip b { font-size: 13.5px; color: var(--ink); font-weight: 650; }
.md ul.kvs { list-style: none; padding-left: 0; margin: 10px 0 14px;
             border: 1px solid var(--line-2); border-radius: var(--radius); overflow: hidden; }
.md li.kv { display: grid; grid-template-columns: minmax(150px, 32%) 1fr; gap: 12px;
            padding: 8px 14px; margin: 0; border-bottom: 1px solid var(--line-2);
            background: var(--panel); }
.md li.kv:nth-child(even) { background: var(--panel-2); }
.md li.kv:last-child { border-bottom: 0; }
.md li.kv .k { color: var(--muted); font-size: 13px; font-weight: 600; }
.md li.kv .v { color: var(--ink-2); }
.md li.kv .v strong { color: var(--ink); }
@media (max-width: 560px) { .md li.kv { grid-template-columns: 1fr; gap: 2px; } }

/* ── leaflet popup + map chrome themed to the site ───────────── */
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
  background: var(--panel); color: var(--ink); box-shadow: var(--shadow); }
.leaflet-popup-content { margin: 12px 14px; font-family: var(--sans); font-size: 13px; }
.leaflet-container { font-family: var(--sans); background: var(--bg-2); }
.leaflet-control-attribution { background: color-mix(in srgb, var(--panel) 80%, transparent) !important;
  color: var(--muted) !important; }
.leaflet-control-attribution a { color: var(--muted) !important; }
.leaflet-bar a { background: var(--panel); color: var(--ink); border-color: var(--line); }
.mm-pop .mm-title { font-weight: 700; font-size: 14px; margin-bottom: 1px; }
.mm-pop .mm-kind { font-size: 10px; text-transform: uppercase; letter-spacing: .05em;
  padding: 1px 7px; border-radius: var(--radius-sm); margin-left: 4px; vertical-align: 1px;
  background: var(--accent-soft); color: var(--accent); }
.mm-pop .mm-kind.tanker { background: var(--amber-soft); color: var(--amber-ink); }
.mm-pop .mm-sub { color: var(--muted); font-size: 11.5px; margin-bottom: 8px; }
.mm-pop .mm-row { display: grid; grid-template-columns: 108px 1fr; gap: 8px;
  padding: 4px 0; border-top: 1px solid var(--line-2); }
.mm-pop .mm-k { color: var(--muted); font-size: 11.5px; }
.mm-pop .mm-v { font-size: 12.5px; }
.mm-pop .mm-dim { color: var(--muted); }
.mm-pop .mm-foot { margin-top: 8px; color: var(--faint); font-size: 10.5px; line-height: 1.4; }

/* ── catalyst calendar ───────────────────────────────────────── */
.cat-month { padding-top: 14px; }
.cat-month-title { font-size: 14px; color: var(--muted); text-transform: uppercase;
                   letter-spacing: .07em; margin: 0 0 8px; }
.cat-list { display: flex; flex-direction: column; }
.cat-row { display: grid; grid-template-columns: 68px 1fr auto; gap: 14px; align-items: center;
           padding: 11px 0; border-top: 1px solid var(--line-2); }
.cat-row:first-child { border-top: 0; }
.cat-date { font-weight: 700; font-size: 13px; color: var(--accent); }
.cat-line { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-bottom: 3px; }
.cat-title { font-size: 13.5px; line-height: 1.45; color: var(--ink-2); }
.cat-title a { color: var(--ink-2); }
@media (max-width: 560px) { .cat-row { grid-template-columns: 54px 1fr; }
  .cat-row form { grid-column: 2; justify-self: start; } }

/* ── nav "Desks" dropdown (hover desktop, tap mobile; JS-positioned fixed) ── */
.nav-dd { position: relative; display: inline-flex; }
.nav-dd-toggle { background: none; border: 0; cursor: pointer; font-family: var(--sans);
  font-size: 14px; font-weight: 550; color: var(--ink-2); padding: 7px 13px; border-radius: var(--radius);
  display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.nav-dd-toggle:hover { color: var(--ink); background: var(--panel-2); }
.nav-dd-toggle.active { color: var(--accent); }
.nav-dd-toggle .caret { font-size: 9px; opacity: .7; transition: transform .15s; }
.nav-dd-toggle[aria-expanded="true"] .caret { transform: rotate(180deg); }
.nav-dd-menu { position: fixed; display: none; z-index: 200; min-width: 190px;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 5px;
  /* never taller than the viewport (minus the nav) — scroll instead of clipping */
  max-height: calc(100vh - 64px); overflow-y: auto; overscroll-behavior: contain; }
.nav-dd-menu.show { display: block; }
.nav-dd-menu a { display: block; padding: 5px 12px; border-radius: var(--radius); font-size: 13px;
  line-height: 1.3; color: var(--ink-2); white-space: nowrap; }
.nav-dd-menu a:hover { background: var(--panel-2); color: var(--ink); text-decoration: none; }
.nav-dd-menu a.active { color: var(--accent); background: var(--accent-soft); }

/* ── dashboard watchlist ─────────────────────────────────────── */
.wl-list { display: flex; flex-direction: column; margin-top: 14px; }
.wl-row { display: grid; grid-template-columns: 1fr auto; gap: 8px 14px; align-items: center;
          padding: 12px 0; border-top: 1px solid var(--line-2); }
.wl-row:first-child { border-top: 0; }
.wl-head { display: flex; align-items: center; gap: 8px; grid-row: 1; }
.wl-head .tick { font-size: 15px; }
.wl-signals { grid-column: 1; grid-row: 2; display: flex; flex-wrap: wrap; gap: 6px; }
.wl-act { grid-column: 2; grid-row: 1 / span 2; display: flex; align-items: center; gap: 8px; }
.wl-chip { display: inline-flex; align-items: center; gap: 3px; font-size: 11.5px;
           padding: 3px 9px; border-radius: var(--radius-sm); background: var(--panel-2);
           border: 1px solid var(--line); color: var(--ink-2); white-space: nowrap; }
.wl-chip.mom { background: var(--accent-soft); color: var(--accent); border-color: transparent; }
.wl-chip.pass { background: var(--green-soft); color: var(--green-ink); border-color: transparent; }
.wl-chip.buy { background: var(--green-soft); color: var(--green-ink); border-color: transparent; }
.wl-chip.sell { background: var(--red-soft); color: var(--red-ink); border-color: transparent; }
.wl-chip.cat { background: var(--amber-soft); color: var(--amber-ink); border-color: transparent; }
.wl-chip.gov { background: var(--accent-soft); color: var(--accent); border-color: transparent; }
/* Confluence: hover any desk chip/pill to see which desk lit it, and why.
   Tooltip drops BELOW the chip so a top row is never clipped. */
.wl-row [data-tip] { position: relative; cursor: help; }
.wl-row [data-tip]:hover::after { content: attr(data-tip); position: absolute;
  top: calc(100% + 7px); left: 0; z-index: 70; width: max-content; max-width: 300px;
  white-space: normal; text-align: left; padding: 8px 11px; font-size: 11.5px;
  font-weight: 400; line-height: 1.45; letter-spacing: 0; text-transform: none;
  color: var(--ink); background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: 0 8px 24px rgba(0,0,0,.22); pointer-events: none; }
.wl-row [data-tip]:hover::before { content: ""; position: absolute; top: calc(100% + 1px);
  left: 16px; z-index: 71; border: 6px solid transparent; border-bottom-color: var(--line);
  pointer-events: none; }
.wl-act .linklike { color: var(--faint); padding: 6px 8px; }
.wl-act .linklike:hover { color: var(--red); }
@media (max-width: 560px) { .wl-row { grid-template-columns: 1fr; }
  .wl-act { grid-column: 1; grid-row: 3; justify-content: flex-start; } }

/* ── volatility squeeze (TTM) ─────────────────────────────────── */
/* coiled = amber (tension building); fired = accent (the release event) */
.wl-chip.sqz { background: var(--amber-soft); color: var(--amber-ink); border-color: transparent; }
.wl-chip.sqz.fired { background: var(--accent-soft); color: var(--accent); }
.wl-chip.vol { background: var(--accent-soft); color: var(--accent); border-color: transparent; }
.wl-chip.cmdty { background: var(--amber-soft); color: var(--amber-ink); border-color: transparent; }
.wl-chip.buzz { background: var(--amber-soft); color: var(--amber-ink); border-color: transparent; }
.chip-wrap { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 10px; }

.sqz-card .sqz-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; }
.sqz-tf { display: inline-flex; align-items: center; gap: 9px; background: var(--panel-2);
          border: 1px solid var(--line); border-radius: var(--radius); padding: 7px 12px; }
.sqz-tf-l { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
            color: var(--muted); }
.sqz-b { display: inline-flex; align-items: center; gap: 5px; font-size: 12.5px; font-weight: 600;
         padding: 3px 10px; border-radius: var(--radius-sm); white-space: nowrap; }
.sqz-b b { font-weight: 800; }
.sqz-b.on { background: var(--amber-soft); color: var(--amber-ink); }
.sqz-b.up { background: var(--green-soft); color: var(--green-ink); }
.sqz-b.down { background: var(--red-soft); color: var(--red-ink); }
.sqz-b.off { background: transparent; color: var(--faint); }

.sqz-inline { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; font-weight: 600;
              padding: 2px 10px; border-radius: var(--radius-sm); }
.sqz-inline.on { background: var(--amber-soft); color: var(--amber-ink); }
.sqz-inline.fired { background: var(--accent-soft); color: var(--accent); }
.sqz-inline.wk { background: var(--panel-2); color: var(--ink-2); border: 1px solid var(--line); }

.scan-sqz { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 600;
            padding: 2px 8px; border-radius: var(--radius-sm); white-space: nowrap; }
.scan-sqz.on { background: var(--amber-soft); color: var(--amber-ink); }
.scan-sqz.fired { background: var(--accent-soft); color: var(--accent); }
.scan-sqz.wk { background: var(--panel-2); color: var(--ink-2); border: 1px solid var(--line); }
.scan-sqz-cell { white-space: nowrap; }
.dh-sqz { margin-top: 7px; }

/* ── institutional holders / fund holdings ───────────────────── */
.hld-ava { display: inline-flex; align-items: center; justify-content: center;
           width: 20px; height: 20px; border-radius: var(--radius); background: var(--panel-2);
           border: 1px solid var(--line); font-size: 11px; font-weight: 700;
           color: var(--ink-2); margin-right: 9px; vertical-align: middle; }
.hld-tbl td:first-child { white-space: nowrap; }
.hld-mix { display: flex; height: 14px; border-radius: var(--radius); overflow: hidden;
           background: var(--panel-2); margin: 6px 0 10px; }
.hld-mix-seg { height: 100%; }
.hld-mix-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 12.5px; color: var(--ink-2); }
.hld-mix-legend span { display: inline-flex; align-items: center; gap: 6px; }
.hld-dot { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
.hld-mix-seg.s1, .hld-dot.s1 { background: var(--accent); }
.hld-mix-seg.s2, .hld-dot.s2 { background: var(--amber); }
.hld-mix-seg.s3, .hld-dot.s3 { background: var(--green); }
.hld-mix-seg.s4, .hld-dot.s4 { background: var(--muted); }
.hld-mix-seg.s5, .hld-dot.s5 { background: var(--red); }
.hld-mix-seg.s6, .hld-dot.s6 { background: var(--faint); }

/* ── commodities radar: supply-shock watch items ──────────────── */
.cmdty-watch-list { display: flex; flex-direction: column; gap: 12px; margin-top: 12px; }
.cmdty-watch { border: 1px solid var(--line); border-radius: var(--radius); padding: 14px 16px; background: var(--panel-2); }
.cw-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.cw-name { font-size: 15px; }
.cw-conf { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em;
  padding: 2px 8px; border-radius: var(--radius-sm); }
.cw-high { background: var(--green-soft); color: var(--green-ink); }
.cw-medium { background: var(--amber-soft); color: var(--amber-ink); }
.cw-low { background: var(--bg-2); color: var(--muted); }
.cw-sum { margin: 8px 0 0; font-size: 14px; line-height: 1.5; color: var(--ink); }
.cw-tickers { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 9px; }
.cw-counter { margin: 8px 0 0; }
.cw-src { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 9px; padding-top: 9px; border-top: 1px solid var(--line-2); }
.cw-srclink { font-size: 11.5px; color: var(--muted); font-family: var(--mono); }
.cw-srclink:hover { color: var(--accent); }

/* ── macro: cross-asset dashboard tiles ───────────────────────── */
.mkt-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 10px; margin-top: 12px; }
.mkt-tile { border: 1px solid var(--line); border-radius: var(--radius); padding: 11px 13px; background: var(--panel-2); }
.mkt-l { font-size: 11.5px; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }
.mkt-v { font-size: 20px; font-weight: 650; font-variant-numeric: tabular-nums; margin: 3px 0 1px; }
.mkt-c { font-size: 12.5px; font-weight: 700; font-family: var(--mono); }
.mkt-c.pos { color: var(--green-ink); } .mkt-c.neg { color: var(--red-ink); } .mkt-c.flat { color: var(--muted); }

/* ── maritime: shipping complex ───────────────────────────────── */
.ship-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 12px; margin-top: 14px; }
.ship-seg { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 14px; background: var(--panel-2); }
.ship-seg-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.ship-seg-head b { font-size: 13.5px; }
.ship-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.ship-chip { display: inline-flex; align-items: center; gap: 5px; font-family: var(--mono);
  font-size: 12px; font-weight: 700; padding: 4px 8px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--panel); color: var(--ink-2); }
.ship-chip:hover { border-color: var(--accent); text-decoration: none; }

/* ── filings desk: AI headline per 8-K ────────────────────────── */
.fil-headline { font-size: 12.5px; color: var(--ink-2); margin-top: 4px; max-width: 460px; }

/* ── politician pages ─────────────────────────────────────────── */
.pol-ava { display: inline-flex; align-items: center; justify-content: center;
           width: 24px; height: 24px; border-radius: 50%; background: var(--accent-soft);
           color: var(--accent); font-size: 10.5px; font-weight: 800;
           margin-right: 8px; vertical-align: middle; letter-spacing: .02em; }
.pol-ava-lg { width: 46px; height: 46px; font-size: 17px; margin-right: 0; }
.pol-link { white-space: nowrap; }

/* ── market calendar ──────────────────────────────────────────── */
.cal-toolbar { display: flex; align-items: center; justify-content: space-between;
               gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.cal-nav { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.cal-title { font-weight: 800; font-size: 17px; min-width: 130px; text-align: center; }
.cal-filters { display: flex; gap: 6px; flex-wrap: wrap; }
.fchip { display: inline-flex; align-items: center; gap: 6px; font-size: 12px;
         padding: 4px 10px; border-radius: var(--radius-sm); background: var(--panel-2);
         border: 1px solid var(--line); color: var(--ink-2); cursor: pointer; }
.fchip b { font-weight: 700; }
.fchip.off { opacity: .42; text-decoration: line-through; }
.fchip:hover { border-color: var(--accent); }

.cal-layout { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 18px; }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-top: 4px; }
.cal-dow { text-align: center; font-size: 10.5px; font-weight: 700; letter-spacing: .06em;
           text-transform: uppercase; color: var(--muted); padding: 2px 0; }
.cal-cell { position: relative; min-height: 72px; text-align: left; padding: 6px 7px;
            background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius);
            cursor: pointer; font: inherit; color: inherit; display: flex;
            flex-direction: column; justify-content: space-between; }
.cal-cell:hover { border-color: var(--accent); }
.cal-cell.out { opacity: .38; }
.cal-cell.today { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
.cal-cell.sel { background: var(--accent-soft); border-color: var(--accent); }
.cal-num { font-size: 12.5px; font-weight: 700; }
.cal-count { position: absolute; top: 5px; right: 7px; font-size: 10.5px; color: var(--muted); }
.cal-dots { display: flex; gap: 3px; flex-wrap: wrap; }
.cal-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; flex: none; }
.cal-dot.earn { background: var(--green); }
.cal-dot.macro { background: var(--amber); }
.cal-dot.bio { background: var(--accent); }
.cal-dot.fil { background: var(--muted); }
.cal-dot.pol { background: var(--red); }
.cal-dot.cat-off { opacity: .15; }

.cal-side { min-width: 0; }
.cal-day-panel h3 { font-size: 15.5px; }
.cal-ev { display: flex; align-items: baseline; gap: 7px; padding: 5px 0;
          border-bottom: 1px solid var(--line-2); font-size: 12.5px; flex-wrap: wrap; }
.cal-ev.cat-off { display: none; }
.cal-ev-label { color: var(--ink-2); min-width: 0; flex: 1; }
.cal-ev-date { color: var(--muted); font-size: 11.5px; white-space: nowrap; }
.cal-badge { flex: none; font-size: 9.5px; font-weight: 800; letter-spacing: .04em;
             padding: 2px 6px; border-radius: var(--radius); }
.cal-badge.earn { background: var(--green-soft); color: var(--green-ink); }
.cal-badge.macro { background: var(--amber-soft); color: var(--amber-ink); }
.cal-badge.bio { background: var(--accent-soft); color: var(--accent); }
.cal-badge.fil { background: var(--bg-2); color: var(--ink-2); border: 1px solid var(--line); }
.cal-badge.pol { background: var(--red-soft); color: var(--red-ink); }
.imp-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; flex: none; }
.imp-dot.h { background: var(--red); }
.imp-dot.m { background: var(--amber); }
.imp-dot.l { background: var(--muted); }
.cal-ext { font-size: 11px; white-space: nowrap; }
.cal-upcoming { max-height: 560px; overflow-y: auto; }
@media (max-width: 860px) {
  .cal-layout { grid-template-columns: 1fr; }
  .cal-cell { min-height: 52px; padding: 4px 5px; }
  .cal-upcoming { max-height: none; }
}

/* ── flow board ──────────────────────────────────────────────── */
.flow-dates { display: flex; gap: 6px; margin: 14px 0 4px; }
.flow-date { padding: 6px 14px; border-radius: var(--radius-sm); font-size: 13px; font-weight: 600;
             border: 1px solid var(--line); color: var(--muted); background: var(--panel); }
.flow-date.active { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
.flow-date:hover { text-decoration: none; color: var(--ink); }
.flow-date.active:hover { color: var(--accent-ink); }
.flow-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 12px 0; }
.flow-chip { border: 1px solid var(--line); background: var(--panel); color: var(--ink-2);
             border-radius: var(--radius-sm); padding: 6px 13px; font-size: 13px; font-family: var(--sans);
             cursor: pointer; display: inline-flex; gap: 6px; align-items: center; }
.flow-chip b { color: var(--muted); font-weight: 700; }
.flow-chip.active { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
.flow-chip.active b { color: var(--accent); }
.flow-chip:hover { border-color: var(--accent); }

.flow-board { padding-top: 6px; }
.flow-group { margin-top: 10px; }
.flow-grouphead { display: flex; align-items: baseline; gap: 12px; padding: 12px 0 6px;
                  border-bottom: 1px solid var(--line); }
.flow-glabel { font-weight: 700; font-size: 13px; }
.flow-semat { margin-left: auto; font-size: 11px; letter-spacing: .55em; color: var(--faint); padding-right: 2px; }
.flow-order { display: grid; align-items: center; gap: 10px;
              grid-template-columns: 86px 66px 90px 1fr auto auto 74px 34px;
              padding: 9px 0; border-bottom: 1px solid var(--line-2); font-size: 13.5px; }
.fo-time { color: var(--muted); font-size: 12.5px; white-space: nowrap; }
.fo-ico { color: var(--amber); }
.fo-ticker.bull { color: var(--green-ink); } .fo-ticker.bear { color: var(--red-ink); }
.fo-prem { font-weight: 700; white-space: nowrap; }
.fo-star { color: var(--amber); font-weight: 700; }
.fo-contract { color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fo-dte { font-size: 12.5px; white-space: nowrap; }
.fo-tape { display: flex; gap: 5px; justify-self: end; }
span.tape { font-size: 11px; padding: 2px 7px; border-radius: var(--radius); background: var(--panel-2);
        border: 1px solid var(--line); color: var(--muted); white-space: nowrap; }
span.tape.ok { color: var(--green-ink); border-color: color-mix(in srgb, var(--green) 30%, transparent); }
span.tape.bad { color: var(--red-ink); border-color: color-mix(in srgb, var(--red) 30%, transparent); }
span.tape.mid { color: var(--amber-ink); }
span.tape.sweep { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 30%, transparent); }
.fo-dots { display: inline-flex; gap: 5px; }
.fdot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
.fdot.pass { background: var(--green); } .fdot.fail { background: var(--red); }
.fdot.mixed { background: var(--amber); }
.fdot.missing { background: transparent; border: 1.5px solid var(--faint); }
.legend-list { list-style: none; padding: 0; margin: 0; font-size: 13px; line-height: 1.5; }
.legend-list li { display: flex; align-items: center; gap: 9px; margin: 6px 0; color: var(--ink-2); }
.legend-list li .fdot { margin-top: 0; }
@media (max-width: 720px) {
  /* Phones: two-row order card. Row 1: time | ticker | premium (right).
     Row 2: full contract | conviction dots (right). DTE lives in the
     bucket header; tape/go are desktop-only. */
  .flow-order { grid-template-columns: 78px 56px minmax(0, 1fr); row-gap: 4px; }
  .fo-prem { justify-self: end; }
  .fo-contract { grid-column: 1 / 3; grid-row: 2; min-width: 0; }
  .fo-dots { grid-column: 3; grid-row: 2; justify-self: end; align-self: center; }
  .fo-dte, .fo-tape, .fo-go { display: none; }
  .flow-semat { display: none; }
}

/* ── company terminal: trader-intel grid (async-loaded cards) ─── */
.intel-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 14px; align-items: start; }
.intel-card { margin: 0; }
.intel-card h2 { margin: 0 0 2px; }
.intel-load { color: var(--muted); font-size: 13px; padding: 8px 2px; }
.intel-load::before { content: ""; display: inline-block; width: 12px; height: 12px;
  margin-right: 8px; border: 2px solid var(--line); border-top-color: var(--accent);
  border-radius: 50%; vertical-align: -2px; animation: spin .8s linear infinite; }

/* valuation: reverse-DCF hero + peer table highlighting */
.val-hero { display: flex; gap: 16px; align-items: center; margin-top: 10px;
  padding: 14px 16px; background: var(--accent-soft); border-radius: var(--radius); }
.val-big { font-size: 40px; font-weight: 800; color: var(--accent); line-height: 1; white-space: nowrap; }
.val-big span { font-size: 15px; font-weight: 600; margin-left: 2px; }
.val-hero-txt { font-size: 13px; color: var(--ink-2); line-height: 1.5; }
tr.val-subj td { background: var(--accent-soft); font-weight: 650; }
tr.val-med td { color: var(--muted); border-top: 1px solid var(--line); font-style: italic; }
@media (max-width: 560px) { .val-hero { flex-direction: column; align-items: flex-start; gap: 8px; } }

/* ── company terminal ────────────────────────────────────────── */
/* The most data-dense view: a wider canvas + a masonry of cards so the
   whole terminal is a scan, not a long scroll. */
.wrap.wrap-wide { max-width: var(--wrap); }   /* legacy alias — the frame is wide now */
.co-strips { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
             gap: 18px; align-items: stretch; }
.co-strips > section.card { margin-bottom: 0; }
.co-cols { columns: 2; column-gap: 18px; }
.co-cols > section.card { break-inside: avoid; margin: 0 0 18px; display: inline-block;
                          width: 100%; box-sizing: border-box; }
@media (max-width: 1000px) { .co-cols { columns: 1; } }
.co-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px;
           flex-wrap: wrap; margin: 4px 0 18px; }
.co-name { font-size: 17px; color: var(--ink-2); font-weight: 500; margin-left: 8px; letter-spacing: -.01em; }
.co-actions { display: flex; gap: 8px; }
.co-jump { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 14px; padding: 8px 0;
  position: sticky; top: 60px; z-index: 20;
  background: color-mix(in srgb, var(--bg) 90%, transparent); backdrop-filter: saturate(1.2) blur(10px); }
@media (max-width: 720px) { .co-jump { overflow-x: auto; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; } }
.co-jump a { font-size: 12.5px; color: var(--muted); padding: 5px 11px; border-radius: var(--radius-sm);
             border: 1px solid var(--line); background: var(--panel); }
.co-jump a:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; }
.rating-bars { margin-top: 8px; }
.rating-row { display: grid; grid-template-columns: 82px 1fr 28px; gap: 10px; align-items: center; margin: 5px 0; }
.rating-label { font-size: 12.5px; color: var(--ink-2); }
.rating-track { height: 8px; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }
.rating-fill { height: 100%; border-radius: var(--radius-sm); }
.rating-fill.pos { background: var(--green); } .rating-fill.hold { background: var(--amber); } .rating-fill.neg { background: var(--red); }
.rating-n { font-size: 12.5px; color: var(--muted); text-align: right; }
.pt-mean { font-size: 30px; font-weight: 750; letter-spacing: -.02em; line-height: 1.1; margin: 4px 0; }
.pt-upside { font-size: 15px; font-weight: 650; margin-left: 8px; }
.fin-tbl td:first-child, .fin-tbl th:first-child { text-align: left; }
.co-news { list-style: none; padding: 0; margin: 6px 0 0; }
.co-news li { padding: 8px 0; border-top: 1px solid var(--line-2); font-size: 13.5px; line-height: 1.5; }
.co-news li:first-child { border-top: 0; }

/* compact flow legend (moved to top) */
.flow-legend-compact { padding: 12px 16px; }
.flow-legend-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 24px; }
.fl-title { font-size: 10.5px; text-transform: uppercase; letter-spacing: .07em; color: var(--muted);
            margin: 0 0 6px; }
.fl-item { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--ink-2);
           margin: 0 12px 4px 0; white-space: nowrap; }
.fl-item .fdot { width: 8px; height: 8px; }
.fl-item b { color: var(--ink); }
@media (max-width: 560px) { .flow-legend-grid { grid-template-columns: 1fr; } }

/* landing "desks" showcase grid */
.desk-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
             gap: 14px; margin-top: 20px; }
.desk { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
        padding: 18px 18px 16px; box-shadow: var(--shadow-sm); }
.desk .ic { font-size: 22px; }
.desk h3 { margin: 8px 0 5px; font-size: 15px; }
.desk p { margin: 0; font-size: 13px; color: var(--muted); line-height: 1.5; }

/* Ticker links → company terminal: stay ink-colored, accent on hover */
a.tick { color: inherit; }
a.tick:hover { color: var(--accent); text-decoration: underline; }

/* Dashboard cross-desk digest */
.dg-list { display: flex; flex-direction: column; margin-top: 12px; }
.dg-row { display: flex; align-items: baseline; gap: 10px; padding: 9px 10px;
  border-radius: var(--radius); color: inherit; border-bottom: 1px solid var(--line); }
.dg-row:last-child { border-bottom: none; }
.dg-row:hover { background: var(--bg-2); }
.dg-ic { flex: none; width: 22px; display: flex; justify-content: center; }
.dg-desk { flex: none; width: 128px; font-weight: 650; font-size: 13.5px; color: var(--ink-2); }
.dg-text { flex: 1; min-width: 0; font-size: 13.5px; color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dg-text .tick { color: var(--ink); font-size: 13px; }
.dg-go { flex: none; color: var(--accent); opacity: 0; transition: opacity .12s; }
.dg-row:hover .dg-go { opacity: 1; }
@media (max-width: 640px) {
  .dg-row { flex-wrap: wrap; }
  .dg-desk { width: auto; }
  .dg-text { flex-basis: 100%; white-space: normal; }
  .dg-go { display: none; }
}


/* ── hamburger + nav search (desktop defaults) ─────────────────── */
.nav-burger { display: none; flex-direction: column; justify-content: center; gap: 4px;
  width: 38px; height: 38px; padding: 8px; background: none; border: 0; cursor: pointer; border-radius: var(--radius); }
.nav-burger span { display: block; height: 2px; width: 100%; background: var(--ink-2); border-radius: 2px; transition: transform .18s, opacity .18s; }
.nav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.nav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
.nav-burger:hover { background: var(--bg-2); }
.nav-search-wrap { position: relative; display: inline-flex; align-items: center; margin-left: 6px; }
.nav-search { display: inline-flex; align-items: center; }
.nav-search input { width: 168px; padding: 6px 10px; font-size: 13px; font-family: var(--mono);
  text-transform: uppercase; background: var(--panel-2); border: 1px solid var(--line);
  border-radius: var(--radius); color: var(--ink); transition: width .15s; }
.nav-search input:focus { width: 210px; outline: none; border-color: var(--accent); }
.nav-search input::placeholder { text-transform: none; font-family: var(--sans); }

/* Explainer that drops BELOW the search bar (never clipped at the top edge),
   right-aligned so it can't overflow the viewport's right edge. Pure CSS:
   revealed on hover of the wrap or focus of the input. */
.nav-search-tip { position: absolute; top: calc(100% + 8px); right: 0; z-index: 60;
  width: 320px; max-width: 80vw; padding: 12px 14px; background: var(--panel);
  border: 1px solid var(--line); border-radius: var(--radius); box-shadow: 0 10px 30px rgba(0,0,0,.22);
  opacity: 0; visibility: hidden; transform: translateY(-4px); transition: opacity .15s, transform .15s;
  pointer-events: none; }
.nav-search-tip .tip-h { display: block; font-size: 12.5px; margin-bottom: 5px; color: var(--ink); }
.nav-search-tip span { display: block; font-size: 12px; line-height: 1.45; color: var(--muted); }
.nav-search-tip span b { font-weight: 700; color: var(--ink); }   /* inline emphasis, flows with the text */
.nav-search-tip i { font-style: normal; font-family: var(--mono); color: var(--accent); }
.nav-search-tip::before { content: ""; position: absolute; bottom: 100%; right: 60px;
  border: 6px solid transparent; border-bottom-color: var(--line); }
.nav-search-wrap:hover .nav-search-tip,
.nav-search-wrap:focus-within .nav-search-tip { opacity: 1; visibility: visible; transform: translateY(0); }

/* Must trail ALL base .nav-dd-* rules (CSS order): in the phone panel the
   desk links flatten into a static, always-visible group and the toggle hides. */
@media (max-width: 720px) {
  .nav-dd { display: block; }
  .nav-dd-toggle { display: none; }
  .nav-dd-menu { position: static; display: block; min-width: 0; box-shadow: none;
    background: transparent; border: 0; border-left: 2px solid var(--line);
    border-radius: 0; margin: 2px 0 2px 12px; padding: 0 0 0 4px; }
  .nav-dd-menu a { font-size: 14.5px; padding: 10px 12px; }
}

/* TradingView chart on the company terminal */
.tv-chart { width: 100%; height: 430px; border: 0; border-radius: var(--radius); display: block; background: var(--panel-2); }
@media (max-width: 720px) { .tv-chart { height: 320px; } }

/* earnings chip */
.wl-chip.earn { border-color: var(--accent); color: var(--accent); }

/* Ask-the-desk chat */
.ask-thread { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
.ask-thread:empty { display: none; }
.ask-bubble { max-width: 85%; padding: 10px 14px; border-radius: var(--radius); font-size: 14px; line-height: 1.55; white-space: pre-wrap; }
.ask-bubble.me { align-self: flex-end; background: var(--accent-soft); color: var(--ink); border-bottom-right-radius: 4px; }
.ask-bubble.desk { align-self: flex-start; background: var(--panel-2); border: 1px solid var(--line); border-bottom-left-radius: 4px; }
.ask-bubble.err { color: var(--red-ink); }

/* Must trail the base .nav-burger{display:none} above (CSS order bug fix):
   on phones the burger is the nav. */
@media (max-width: 720px) {
  /* .nav prefix: the base display:none was appended LATER in this file and
     ties on specificity — without the prefix the cascade re-hides the burger */
  .nav .nav-burger { display: inline-flex; }
}

/* ── landing: orbit hero ─────────────────────────────────────────
   Default (no JS / mobile / reduced-motion): cards are a static grid.


/* live data peek + blurred tease on each desk card */

/* scanner strip under the orbit */
.scan-strip { display: flex; gap: 14px; align-items: center; max-width: 700px; margin: 26px auto 0; }

/* ── landing: track-record "receipts" strip ────────────────────── */
.track-strip { display: flex; gap: 22px; align-items: center; flex-wrap: wrap;
  max-width: 860px; margin: 22px auto 0; padding: 18px 22px;
  border-color: color-mix(in srgb, var(--accent) 32%, var(--line)); }
.track-strip .ts-lead { flex: 1 1 300px; min-width: 260px; }
.track-strip .ts-lead h3 { margin: 2px 0 4px; }
.track-strip .ts-stats { display: flex; gap: 26px; align-items: baseline; }
.track-strip .ts-stat { text-align: center; }
.track-strip .ts-stat .n { font-size: 26px; font-weight: 700; line-height: 1;
  font-variant-numeric: tabular-nums; color: var(--ink); }
.track-strip .ts-stat .n.pos { color: var(--green); }
.track-strip .ts-stat .n.neg { color: var(--red); }
.track-strip .ts-stat .l { font-size: 11px; color: var(--muted); margin-top: 5px;
  text-transform: uppercase; letter-spacing: .04em; }
.track-strip .ts-cta { flex: none; }
@media (max-width: 640px) {
  .track-strip { gap: 14px; }
  .track-strip .ts-stats { gap: 20px; width: 100%; justify-content: space-between; }
}

/* dashboard: compact clickable scoreboard bar */
.track-mini { display: flex; align-items: center; gap: 12px; padding: 12px 16px;
  margin: 14px 0 4px; text-decoration: none; color: inherit; transition: border-color .15s;
  border-color: color-mix(in srgb, var(--accent) 26%, var(--line)); }
.track-mini:hover { border-color: var(--accent); }
.track-mini .tm-ic { font-size: 20px; flex: none; }
.track-mini .tm-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.track-mini .tm-cta { margin-left: auto; flex: none; color: var(--accent);
  font-weight: 600; font-size: 13px; white-space: nowrap; }
@media (max-width: 560px) { .track-mini .tm-cta { display: none; } }

/* ── dashboard: Watchlist / Portfolio toggle (one card, two panels) ── */
.hv-card { position: relative; }
.hv-radio { position: absolute; width: 1px; height: 1px; opacity: 0; }   /* focusable, invisible */
.hv-head { margin-bottom: 14px; }
.hv-tabs { display: inline-flex; gap: 3px; background: var(--panel-2);
  border: 1px solid var(--line); border-radius: var(--radius); padding: 3px; }
.hv-tab { padding: 7px 16px; border-radius: var(--radius); cursor: pointer; font-weight: 700;
  font-size: 14.5px; color: var(--muted); user-select: none; transition: background .12s, color .12s; }
.hv-tab:hover { color: var(--ink); }
.hv-tab .hv-n { font-weight: 600; font-size: 12px; opacity: .7; }
.hv-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.hv-panel { display: none; }
#hv-watch:checked ~ .hv-watch,
#hv-port:checked  ~ .hv-port  { display: block; }
#hv-watch:checked ~ .hv-head .hv-tab[for="hv-watch"],
#hv-port:checked  ~ .hv-head .hv-tab[for="hv-port"] {
  background: var(--panel); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,.12); }
.hv-bar { display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.hv-bar .sub { margin: 0; }
/* Keep the watchlist add input + "+ Watch" on ONE line (button to the right of a
   narrower input) so the list itself sits higher instead of the button wrapping. */
.hv-bar .wl-ctl { flex-wrap: nowrap; flex: 0 1 auto; }
.hv-bar .wl-ctl .wl-add { flex: 1 1 240px; max-width: 300px; min-width: 150px; }
.hv-bar .wl-ctl .btn { flex: none; white-space: nowrap; }
.hv-more { display: block; text-align: center; margin-top: 12px; padding-top: 12px;
  border-top: 1px solid var(--line-2); color: var(--accent); font-weight: 600; font-size: 13.5px; }
.hv-more:hover { text-decoration: underline; }

/* dashboard: Deep-mode switch on the analyze box */
.deep-toggle { display: inline-flex; align-items: center; gap: 9px; margin-top: 12px;
  cursor: pointer; user-select: none; }
.deep-toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.deep-track { width: 38px; height: 22px; border-radius: var(--radius-sm); background: var(--panel-2);
  border: 1px solid var(--line); position: relative; flex: none; transition: background .15s, border-color .15s; }
.deep-thumb { position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%;
  background: var(--muted); transition: transform .15s, background .15s; }
.deep-toggle input:checked + .deep-track { background: var(--accent); border-color: var(--accent); }
.deep-toggle input:checked + .deep-track .deep-thumb { transform: translateX(16px); background: #fff; }
.deep-toggle input:focus-visible + .deep-track { outline: 2px solid var(--accent); outline-offset: 2px; }
.deep-label { font-size: 13.5px; font-weight: 600; }
.deep-toggle.is-off { cursor: default; }
.deep-toggle.is-off .deep-track { opacity: .5; }

/* ── reusable explainer: <span class="info-tip" data-tip="…">ⓘ</span> ──
   A small info dot that reveals a plain-language explanation on hover; drops
   BELOW the dot so it's never clipped at the top edge. CSP-safe (pure CSS). */
.info-tip { display: inline-flex; align-items: center; justify-content: center;
  width: 15px; height: 15px; border-radius: 50%; font-size: 10px; font-style: normal;
  font-weight: 700; line-height: 1; color: var(--muted); background: var(--panel-2);
  border: 1px solid var(--line); cursor: help; position: relative; vertical-align: middle; }
.info-tip:hover { color: var(--accent); border-color: var(--accent); }
/* open rightward from the dot (not centered) — these dots live in left-hand
   label cells, so centering pushed the left half off the card and clipped it. */
.info-tip:hover::after { content: attr(data-tip); position: absolute; top: calc(100% + 8px);
  left: -6px; transform: none; z-index: 80; width: max-content; max-width: min(280px, 78vw);
  white-space: normal; text-align: left; padding: 9px 11px; font-size: 11.5px; font-weight: 400;
  line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--ink);
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: 0 8px 24px rgba(0,0,0,.22); pointer-events: none; }
.info-tip:hover::before { content: ""; position: absolute; top: calc(100% + 2px); left: 50%;
  transform: translateX(-50%); z-index: 81; border: 6px solid transparent;
  border-bottom-color: var(--line); pointer-events: none; }

/* dashboard: opportunistic push-enable nudge */
.push-nudge { display: flex; align-items: center; gap: 12px; padding: 12px 16px; margin-bottom: 14px;
  border-left: 4px solid var(--accent); }
.push-nudge .pn-ic { font-size: 20px; flex: none; }
.push-nudge .pn-txt { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; }
.push-nudge .pn-x { background: none; border: 0; cursor: pointer; color: var(--faint); font-size: 14px; padding: 4px 6px; flex: none; }
.push-nudge .pn-x:hover { color: var(--ink); }
@media (max-width: 600px) {
  .push-nudge { flex-wrap: wrap; }
  .push-nudge .pn-txt { flex: 1 1 calc(100% - 70px); }
  .push-nudge .btn { margin-left: 32px; }
}

/* ── Today: hot-right-now discovery feed ───────────────────────── */
.today-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.today-grid > .today-sec:last-child:nth-child(odd) { grid-column: 1 / -1; }
@media (max-width: 760px) { .today-grid { grid-template-columns: 1fr; } }
.today-sec { padding: 16px 18px; }
.today-sec h2 { margin: 0 0 8px; font-size: 16px; }
.today-list { display: flex; flex-direction: column; }
.today-row { display: grid; grid-template-columns: auto auto 1fr auto; align-items: center; gap: 10px;
  padding: 9px 4px; border-top: 1px solid var(--line-2); }
.today-row:first-child { border-top: none; }
.today-row .td-ic { flex: none; width: 18px; display: flex; justify-content: center; }
.today-row .td-tick { font-family: var(--mono); font-weight: 700; font-size: 14px; color: var(--ink);
  min-width: 44px; }
.today-row .td-text { font-size: 13px; color: var(--ink-2); text-decoration: none; line-height: 1.35; }
.today-row .td-text:hover { color: var(--accent); }
.today-row .td-act { flex: none; }
.today-row .td-act .btn { opacity: 0; transition: opacity .12s; white-space: nowrap; }
.today-row:hover .td-act .btn { opacity: 1; }
@media (hover: none) { .today-row .td-act .btn { opacity: 1; } }   /* touch: always show */
@media (max-width: 520px) { .today-row { grid-template-columns: auto auto 1fr; }
  .today-row .td-act { grid-column: 2 / -1; justify-self: start; } }

/* quick-take card on the analysis-in-progress page */
.qt-card { border-left: 4px solid var(--accent); }
.qt-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.qt-head h2 { font-size: 16.5px; }
.qt-px { font-family: var(--mono); font-weight: 700; font-size: 16px; }

/* ── world ship map: full-bleed canvas view ────────────────────── */
.wm-shell { display: flex; flex-direction: column; height: calc(100vh - 58px); }
.wm-bar { display: flex; align-items: center; justify-content: space-between; gap: 14px;
  flex-wrap: wrap; padding: 12px 18px 10px; }
.wm-title { display: flex; align-items: baseline; gap: 12px; }
.wm-title h1 { margin: 0; font-size: 20px; }
.wm-controls { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.wm-chip { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px;
  border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--panel-2);
  font-size: 12.5px; font-weight: 600; cursor: pointer; user-select: none; }
.wm-chip input { position: absolute; opacity: 0; width: 0; height: 0; }
.wm-chip.off { opacity: .38; }
.wm-dot { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.wm-dot.b1 { background: #4fbf8b; } .wm-dot.b2 { background: #e0743a; }
.wm-dot.b0 { background: #8a93a6; }
.wm-jump { padding: 5px 10px; border-radius: var(--radius); border: 1px solid var(--line);
  background: var(--panel-2); color: var(--ink); font-size: 12.5px; }
.wm-map-wrap { position: relative; flex: 1; display: flex; min-height: 380px; }
/* isolation: Leaflet's internal panes/controls run z-index 400–1000, which
   would otherwise leak into the page and stack OVER the nav dropdown, ⌘K and
   tooltips. A contained stacking context keeps the whole map at z-auto. */
#worldmap { flex: 1; background: #0b0d12; isolation: isolate; }
.wm-canvas { pointer-events: none; }
/* vessel dossier panel — floats over the map's right edge */
.wm-panel { position: absolute; top: 14px; right: 14px; z-index: 600; width: 300px;
  max-width: calc(100% - 28px); max-height: calc(100% - 28px); overflow-y: auto;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: 0 12px 36px rgba(0,0,0,.4); padding: 14px 16px; }
.wm-panel-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
.wm-panel-head b { font-size: 15.5px; line-height: 1.3; }
.wm-panel-x { background: none; border: 0; cursor: pointer; color: var(--faint);
  font-size: 13px; padding: 2px 4px; flex: none; }
.wm-panel-x:hover { color: var(--ink); }
.wm-panel-sub { color: var(--muted); font-size: 12px; margin: 2px 0 10px; }
.wm-panel-body { font-size: 13px; }
.wm-row { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0;
  border-top: 1px solid var(--line-2); }
.wm-row:first-child { border-top: 0; }
.wm-row-l { color: var(--muted); flex: none; font-size: 12px; }
.wm-row-v { text-align: right; overflow-wrap: anywhere; }
.wm-panel-note { margin: 10px 0 0; color: var(--faint); font-size: 11.5px; line-height: 1.5; }
.wm-foot { padding: 8px 18px 12px; }
@media (max-width: 720px) { .wm-shell { height: calc(100vh - 52px); } }
/* maritime page: doorway card into the world map */
.wm-cta { display: flex; align-items: center; gap: 14px; text-decoration: none; color: inherit;
  border-left: 4px solid var(--accent); transition: border-color .15s; }
.wm-cta:hover { border-color: var(--accent); }
.wm-cta-ic { font-size: 26px; flex: none; }
.wm-cta-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.wm-cta-go { margin-left: auto; flex: none; color: var(--accent); font-weight: 700; }

/* ── compare: A vs B ──────────────────────────────────────────── */
.cmp-form { align-items: center; flex-wrap: wrap; }
.cmp-form .ticker-input { max-width: 190px; }
.cmp-vs { font-weight: 800; color: var(--faint); font-size: 13px; text-transform: uppercase; }
.cmp-tbl th { font-size: 16px; }
.cmp-tbl th:first-child, .cmp-tbl td:first-child { width: 22%; }
.cmp-tbl th, .cmp-tbl td { width: 39%; }
.cmp-tbl td:first-child { color: var(--muted); font-size: 13px; white-space: nowrap; }
/* the compare table is only 3 fixed-width columns, so it never needs the
   horizontal scroll box — and that box (overflow-x:auto also forces overflow-y
   to auto) was clipping the info-tip tooltips. Let its wrap show overflow so
   the tooltips can escape; the table still fits the card. */
.tbl-wrap:has(.cmp-tbl) { overflow: visible; }
.cmp-tbl td { vertical-align: top; }
/* values read down a column — left-align, don't hug the far edge */
.cmp-tbl td.num, .cmp-tbl th.num { text-align: left; }

/* ── themes: retail baskets ───────────────────────────────────── */
.theme-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 16px; }
.theme-card { padding: 16px 18px; }
.th-head { display: flex; gap: 12px; align-items: flex-start; margin-bottom: 12px; }
.th-emoji { font-size: 26px; flex: none; line-height: 1; }
.th-head h2 { margin: 0 0 2px; font-size: 16.5px; }
.th-names { display: flex; flex-wrap: wrap; gap: 7px; }
.th-name { display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: var(--radius);
  background: var(--panel-2); border: 1px solid var(--line); text-decoration: none; }
.th-name:hover { border-color: var(--accent); }
.th-name.hot { border-color: color-mix(in srgb, var(--accent) 55%, var(--line)); }
.th-name.hot .th-tick::after { content: "•"; color: var(--accent); margin-left: 3px; }
.th-tick { font-family: var(--mono); font-weight: 700; font-size: 13px; color: var(--ink); }
.th-chg { font-size: 11.5px; font-variant-numeric: tabular-nums; }
.th-chg.pos { color: var(--green-ink); } .th-chg.neg { color: var(--red-ink); }

/* ── valuation: most-mispriced screen ──────────────────────────── */
.val-screen { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 720px) { .val-screen { grid-template-columns: 1fr; } }
.val-col { padding: 16px 18px; }
.vc-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.vc-head h2 { margin: 0; font-size: 17px; }
.vc-dot { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.vc-dot.pos { background: var(--green); }
.vc-dot.neg { background: var(--red); }
.val-rows { display: flex; flex-direction: column; }
.val-row { display: grid; grid-template-columns: auto 62px 1fr; align-items: center; gap: 12px;
  padding: 10px 6px; border-top: 1px solid var(--line-2, var(--line)); text-decoration: none; color: inherit; }
.val-row:first-child { border-top: none; }
.val-row:hover { background: color-mix(in srgb, var(--accent) 7%, transparent); border-radius: var(--radius); }
.vr-tick { display: flex; flex-direction: column; gap: 1px; min-width: 52px; }
.vr-tick b { font-size: 15px; }
.vr-gap { font-size: 17px; font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; }
.vr-gap.pos { color: var(--green); }
.vr-gap.neg { color: var(--red); }
.vr-detail { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.vr-tags { display: flex; flex-wrap: wrap; gap: 5px; }
.vr-tag { font-size: 10.5px; color: var(--muted); background: color-mix(in srgb, var(--ink) 6%, transparent);
  border: 1px solid var(--line); border-radius: var(--radius); padding: 1px 6px; white-space: nowrap; }

/* ── landing: engine scroll section ────────────────────────────── */
.engine-scroll { margin-top: 44px; }
   /* was 260vh — less scroll to the next view */
.engine-sticky { padding: 40px 0; }
.engine-steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 14px; max-width: 1020px; margin: 30px auto 0; }
.estep { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 18px 18px 16px; position: relative; }
.estep .n { display: inline-flex; width: 24px; height: 24px; align-items: center; justify-content: center;
  background: var(--accent-soft); color: var(--accent); border-radius: 50%;
  font-size: 12.5px; font-weight: 700; margin-bottom: 8px; }
.estep b { display: block; font-size: 14.5px; margin-bottom: 5px; }
.estep p { font-size: 12.5px; line-height: 1.55; color: var(--muted); margin: 0; }

/* ── landing: desk deep-dives ──────────────────────────────────── */
.desk-deep { margin-top: 26px; }
.dd-item { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 20px 22px; max-width: 860px; margin: 16px 0 0; }
body.m-anim .dd-item { opacity: 0; transform: translateY(34px);
  transition: opacity .6s, transform .6s; }
body.m-anim .dd-item.in { opacity: 1; transform: none; }
.dd-head { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.dd-head .ic { width: 18px; height: 18px; opacity: .62; }
.dd-lines { margin-top: 12px; border-top: 1px solid var(--line-2); }
.dd-line { display: flex; gap: 12px; align-items: baseline; padding: 8px 2px;
  border-bottom: 1px solid var(--line-2); font-size: 13px; color: var(--ink-2); }
.dd-line .tick { flex: none; min-width: 52px; }
@media (max-width: 720px) { .dd-head a.btn { margin-left: 0 !important; } }

/* orbit cards are links — no underline soup on hover */

/* ── mobile / tablet landing motion ───────────────────────────────
   body.m-anim is set by landing.js when the desktop orbit is NOT running
   and the user hasn't asked for reduced motion. Hero rises on load; the
   desk cards + sections reveal on scroll; the cards drift gently to echo
   the specimen hero. All transform/opacity — cheap on phones. */
@keyframes m-rise { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: none; } }

body.m-anim .spec-note, body.m-anim .scan-strip, body.m-anim .estep,
body.m-anim .dd-item, body.m-anim .plan, body.m-anim .demo-term {
  opacity: 0; transform: translateY(22px);
  transition: opacity .55s ease, transform .6s cubic-bezier(.2,.7,.3,1);
}
body.m-anim .spec-note.in, body.m-anim .scan-strip.in, body.m-anim .estep.in,
body.m-anim .dd-item.in, body.m-anim .plan.in, body.m-anim .demo-term.in {
  opacity: 1; transform: none;
}
/* stagger each grid so the cards cascade in rather than snap together */
body.m-anim .estep:nth-child(2) { transition-delay: .07s; }
body.m-anim .estep:nth-child(3) { transition-delay: .14s; }
body.m-anim .estep:nth-child(4) { transition-delay: .21s; }
body.m-anim .plan:nth-child(2)  { transition-delay: .06s; }
body.m-anim .plan:nth-child(3)  { transition-delay: .12s; }
body.m-anim .plan:nth-child(4)  { transition-delay: .18s; }
body.m-anim .plan:nth-child(5)  { transition-delay: .24s; }
/* gentle continuous drift — varied timing so cards never move in lockstep */
@keyframes m-drift { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-4px); } }

/* "Watch an analysis" demo terminal */
.watch-demo { margin: 40px auto 8px; }
.demo-term { max-width: 560px; margin: 26px auto 0; background: var(--panel);
  border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
  font-family: var(--mono); font-size: 13.5px; }
.demo-bar { display: flex; align-items: center; gap: 6px; padding: 10px 14px;
  border-bottom: 1px solid var(--line); background: var(--panel-2); }
.demo-bar .dot { width: 10px; height: 10px; border-radius: 50%; background: var(--line); }
.demo-title { margin-left: 8px; font-family: var(--sans); font-size: 12px; color: var(--muted); }
.demo-input { padding: 14px 16px 6px; color: var(--ink); }
.demo-prompt { color: var(--muted); }
.demo-caret { display: inline-block; width: 8px; height: 15px; background: var(--accent);
  vertical-align: -2px; animation: blink 1s steps(1) infinite; }
@keyframes blink { 50% { opacity: 0; } }
.demo-rows { padding: 8px 16px 4px; }
.demo-row { padding: 6px 0; color: var(--faint); transition: color .3s; }
.demo-row .st { display: inline-block; width: 18px; color: var(--muted); }
.demo-row.run { color: var(--ink-2); }
.demo-row.run .st::before { content: "◌"; color: var(--accent); animation: blink 1s steps(1) infinite; }
.demo-row.done { color: var(--ink-2); }
.demo-row.done .st::before { content: "✓"; color: var(--green-ink); }
.demo-verdict { display: flex; gap: 10px; align-items: center; padding: 12px 16px 16px;
  opacity: 0; transition: opacity .5s; font-family: var(--sans); }
.demo-verdict.show { opacity: 1; }

/* preview teaser blur */
.blur-wrap { position: relative; margin-top: 4px; }
.blurred { filter: blur(6px); user-select: none; pointer-events: none; opacity: .75; }
.blur-cta { position: absolute; inset: 0; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 4px; text-align: center; }
.blur-cta p { margin: 0 0 6px; }

/* watchlist live price */
.wl-px { font-family: var(--mono); font-size: 13px; color: var(--ink-2); }
.wl-chg { font-family: var(--mono); font-size: 12.5px; font-weight: 600; }
.wl-chg.pos { color: var(--green-ink); } .wl-chg.neg { color: var(--red-ink); }

/* onboarding checklist */
.onboard { border: 1px solid var(--accent); }
.onboard-steps { display: flex; flex-direction: column; gap: 4px; margin-top: 12px; }
/* each step is a real link to where it points — clickable, with a hover state */
.ob-step { display: flex; gap: 12px; align-items: flex-start; text-decoration: none; color: inherit;
  padding: 9px 11px; border-radius: var(--radius); transition: background .12s; }
.ob-step:hover { background: color-mix(in srgb, var(--accent) 8%, transparent); }
.ob-step .ob-n { flex: none; width: 26px; height: 26px; border-radius: 50%; display: flex;
  align-items: center; justify-content: center; font-size: 13px; font-weight: 700;
  background: var(--panel-2); color: var(--ink-2); transition: background .12s, color .12s; }
.ob-step:hover .ob-n { background: var(--accent); color: var(--accent-ink); }
.ob-step.done .ob-n,
.ob-step.done:hover .ob-n { background: var(--green-soft); color: var(--green-ink); }
.ob-step:hover b { color: var(--accent); }
.ob-step b { font-size: 14.5px; } .ob-step p { margin: 2px 0 0; }

/* desks dropdown group labels */
.nav-dd-label { display: block; padding: 6px 12px 2px; font-size: 10px; font-weight: 800;
  letter-spacing: .07em; text-transform: uppercase; color: var(--accent); }
.nav-dd-label:first-child { padding-top: 3px; }

/* top loading bar: shows while the next page loads */
#loadbar { position: fixed; top: 0; left: 0; height: 2px; width: 0; z-index: 400;
  background: var(--accent); opacity: 0; transition: width .3s ease, opacity .3s; }
#loadbar.on { opacity: 1; animation: loadgrow 2.5s ease-out forwards; }
@keyframes loadgrow { 0% { width: 0; } 60% { width: 70%; } 100% { width: 92%; } }

/* ── sample-analysis replay (landing → /sample) ───────────────── */
.sample-log { margin-top: 14px; min-height: 84px; }
.sample-log p { margin: 3px 0; font-size: 12.5px; color: var(--muted);
                animation: samplein .35s ease; }
.sample-log p:last-child { color: var(--ink-2); }
@keyframes samplein { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .sample-log p { animation: none; } }

/* ── dashboard watchlist control (one box: name OR ticker) ────── */
.wl-ctl { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.wl-ctl .wl-add { flex: 1 1 260px; max-width: 460px; text-transform: none;
  font-family: inherit; font-weight: 500; font-size: 15px; letter-spacing: normal; }

/* ── mobile header layout (must trail all base nav rules — CSS order) ──
   Phones: burger sits FAR LEFT, wordmark right of it; the account link
   collapses from username text to a head-and-shoulders icon. */
.nav-user { display: inline-flex; align-items: center; }
.nav-user-icon { display: none; }
@media (max-width: 720px) {
  .nav-burger { order: -1; }              /* flex order: burger first, brand second */
  .nav-user-name { display: none; }
  .nav-user-icon { display: inline-block; }
  .nav-user { padding: 4px; }
  /* the base .nav-search-wrap{display:inline-flex} (line ~1063) trails the
     earlier mobile hide and re-showed the wide search box, pushing the account
     link off-screen — hide it HERE, after that base rule wins by order */
  .nav-search-wrap { display: none !important; }
}

/* Phones: the watchlist add box goes full-width so the placeholder isn't
   clipped mid-word. (Trails the base .wl-ctl rules.) */
@media (max-width: 560px) {
  .wl-ctl { width: 100%; }
  .wl-ctl .wl-add { max-width: none; }
}

/* ── Parallax Score board ─────────────────────────────────────── */
.sc-honesty { border-left: 4px solid var(--accent); }
.sc-val-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 10px 18px; margin-top: 10px; }
.sc-val-grid > div { display: flex; flex-direction: column; gap: 2px; }
.sc-val-l { font-size: 10.5px; text-transform: uppercase; letter-spacing: .07em;
  color: var(--muted); font-weight: 700; }
.sc-badge { display: inline-flex; align-items: center; justify-content: center;
  min-width: 30px; height: 24px; padding: 0 7px; border-radius: var(--radius);
  font-family: var(--mono); font-weight: 700; font-size: 13px; }
.sc-badge.s1, .sc-badge.s2, .sc-badge.s3 { background: var(--red-soft, rgba(220,80,80,.16)); color: var(--red-ink); }
.sc-badge.s4, .sc-badge.s5, .sc-badge.s6, .sc-badge.s7 { background: var(--panel-2); color: var(--muted); border: 1px solid var(--line); }
.sc-badge.s8, .sc-badge.s9, .sc-badge.s10 { background: var(--green-soft, rgba(80,190,130,.16)); color: var(--green-ink); }
/* must out-rank table.tbl td's white-space:nowrap (0,1,2) */
table.tbl td.sc-drivers { max-width: 420px; min-width: 220px; white-space: normal; }

/* ── usability pass: signal strip, funnel, nav diet, desk index, proof ── */
.mt-strip { padding: 12px 16px 6px; }
.mt-head { display: flex; align-items: baseline; justify-content: space-between; }
.mt-head h2 { margin: 0; font-size: 14.5px; }
.mt-row { display: flex; align-items: center; gap: 12px; padding: 9px 2px;
  border-top: 1px solid var(--line-2); text-decoration: none; color: inherit; }
.mt-row:first-of-type { border-top: none; }
.mt-row:hover { background: var(--panel-2); }
.mt-row .tick { font-weight: 700; min-width: 52px; }
.mt-why { flex: 1; color: var(--muted); font-size: 13px; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-px { display: flex; gap: 8px; align-items: baseline; }
.mt-px b { font-size: 12.5px; }
.mt-go { color: var(--faint); }

.ob-go { border-color: var(--accent); }

.dd-sub { display: block; font-size: 11px; color: var(--muted); font-weight: 400; margin-top: 1px; }
.dd-all { border-top: 1px solid var(--line-2); margin-top: 4px; padding-top: 8px; }

.dk-group { margin: 22px 0 10px; font-size: 15px; }
.dk-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
.dk-card { display: flex; flex-direction: column; gap: 3px; padding: 13px 15px;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  text-decoration: none; color: inherit; }
.dk-card:hover { border-color: var(--accent); }
.dk-card b { font-size: 14px; }
.dk-jargon { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.dk-card p { margin: 3px 0 0; font-size: 12.5px; color: var(--muted); line-height: 1.45; }

/* block, not flex — flex on a <p> turns its raw text nodes into anonymous
   side-by-side items and the sentence renders as two columns */
.land-proof { display: block; max-width: 560px; margin: 14px auto 0;
  font-size: 13px; line-height: 1.55; color: var(--muted); }
.land-proof b { color: var(--ink); }
.lp-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%;
  background: var(--green, #4fbf8b); margin-right: 7px; vertical-align: 1px; }

/* ── login: sign-in / create-account tabs + magic-link reveal (pure CSS) ── */
.lm-radio { position: absolute; opacity: 0; pointer-events: none; }
.lm-tabs { display: flex; gap: 6px; margin: 14px 0 12px; border-bottom: 1px solid var(--line); }
.lm-tab { padding: 7px 12px; font-size: 13.5px; font-weight: 600; color: var(--muted);
  cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.lm-tab:hover { color: var(--ink); }
#lm-in:checked ~ .lm-tabs label[for="lm-in"],
#lm-up:checked ~ .lm-tabs label[for="lm-up"] { color: var(--ink); border-bottom-color: var(--accent); }
.lm-pane { display: none; }
#lm-in:checked ~ .lm-pane.lm-in { display: flex; }
#lm-up:checked ~ .lm-pane.lm-up { display: flex; }
.lm-link { color: var(--accent); cursor: pointer; text-decoration: underline; }
.lm-magicbox { display: none; }
#lm-magic:checked ~ .lm-magicbox { display: block; }

/* ── free-tier gate: titles & explainers stay crisp, card content blurs ── */
.gate-bar { position: sticky; top: 0; z-index: 55; display: flex; align-items: center;
  justify-content: center; gap: 16px; flex-wrap: wrap; padding: 10px 18px;
  background: var(--accent-soft, rgba(224,116,58,.12)); border-bottom: 1px solid var(--accent);
  font-size: 13.5px; }
.gated main section.card > *:not(h2):not(.sub):not(.page-head):not(.note),
.gated main .wm-shell .wm-map-wrap,
.gated main details.section > .body {
  filter: blur(9px); pointer-events: none; user-select: none; }
.gated main section.card h2 .muted { filter: none; }
/* the page header (title + explainer) stays readable by exclusion above */

/* referral pipeline strip on the account page */
.ref-pipeline { display: flex; flex-wrap: wrap; gap: 10px; align-items: baseline;
  margin: 10px 0 2px; padding: 9px 13px; background: var(--panel-2);
  border: 1px solid var(--line); border-radius: var(--radius); font-size: 13px; }

/* ── pricing: monthly/annual toggle (annual default — 2 months free) ── */
.bill-radio { position: absolute; width: 1px; height: 1px; opacity: 0;
  overflow: hidden; clip: rect(0 0 0 0); pointer-events: none; }
.bill-toggle { display: inline-flex; gap: 4px; margin: 2px 0 18px; padding: 4px;
  background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius); }
.bt-opt { display: inline-flex; align-items: center; gap: 7px; padding: 7px 14px;
  border-radius: var(--radius); font-size: 13.5px; font-weight: 600; color: var(--muted); cursor: pointer; }
.bt-badge { font-size: 10.5px; font-weight: 700; padding: 2px 7px; border-radius: var(--radius);
  background: var(--green-soft, rgba(80,190,130,.16)); color: var(--green-ink); }
#bill-yr:checked ~ .bill-toggle .bt-yr,
#bill-mo:checked ~ .bill-toggle .bt-mo { background: var(--panel); color: var(--ink);
  box-shadow: 0 1px 4px rgba(0,0,0,.15); }
#bill-yr:checked ~ .plans-grid .bill-mo-only { display: none; }
#bill-mo:checked ~ .plans-grid .bill-yr-only { display: none; }
.bill-note { font-size: 12px; font-weight: 400; color: var(--muted); margin-top: 3px; }
.bill-note b { color: var(--green-ink); }

/* ── pricing: let Desk breathe — the flagship card wears the app's dark UI ── */
.plan.premium { background: #12151c; border: 1.5px solid #39404e;
  color: #dfe3ea; box-shadow: 0 10px 28px rgba(8,10,14,.28); }
.plan.premium h3, .plan.premium .price { color: #f4f6f9; }
.plan.premium .price .per, .plan.premium .muted, .plan.premium .bill-note { color: #8b93a3; }
.plan.premium ul { color: #c3c9d4; }
.plan.premium .bill-note b { color: #62c893; }
.plan.premium .flag-ink { background: #f4f6f9; color: #12151c; }
.plan.premium .btn { border-color: #4a5262; color: #e8ecf2; background: transparent; }
.plan.premium .btn:hover { border-color: #f4f6f9; }

/* direct traffic: every non-featured plan button goes quiet so the orange
   Founding CTA is the only thing that pops */
.plan .btn:not(.btn-primary) { background: transparent; border-color: var(--line);
  color: var(--muted); }
.plan .btn:not(.btn-primary):hover { border-color: var(--ink); color: var(--ink); }

/* ── alert bell + inbox ── */
.bell { position: relative; text-decoration: none; }
.bell-n { position: absolute; top: -4px; right: -6px; min-width: 16px; height: 16px;
  border-radius: var(--radius); background: var(--accent); color: #fff; font-size: 10px;
  font-weight: 700; display: flex; align-items: center; justify-content: center;
  padding: 0 4px; }
.al-row { display: flex; gap: 12px; align-items: baseline; padding: 10px 4px;
  border-top: 1px solid var(--line-2); text-decoration: none; color: inherit; }
.al-row:first-child { border-top: none; }
.al-row:hover { background: var(--panel-2); }
.al-lead { flex: none; min-width: 92px; display: flex; flex-direction: column; gap: 1px; }
.al-lead .tick { font-size: 14px; font-weight: 700; }
.al-kind { font-family: var(--mono); font-size: 10px; text-transform: uppercase;
  letter-spacing: .04em; color: var(--accent); }
.al-text { flex: 1; font-size: 13.5px; }
.al-ts { flex: none; }
@media (max-width: 640px) { .al-lead { min-width: 66px; } }

/* ── the debate room: threaded bull/bear exchange ── */
/* Transcript, not chat. The turns were bubbles capped at 78% (and 64% on wide
   screens — narrower the more room there was), alternating left and right, so
   the longest prose on the site got the least width. Every turn now runs the
   full measure and is identified by its label and a coloured left rule, the
   way a hearing transcript identifies a speaker. */
.db-thread { display: flex; flex-direction: column; gap: 10px; margin-top: 12px; }
.db-turn { max-width: none; align-self: stretch; position: relative;
  padding: 11px 15px 11px 16px; border-radius: var(--radius);
  border: 1px solid var(--line); border-left-width: 3px; background: var(--panel-2); }
.db-turn.db-bull { border-left-color: var(--green-ink); }
.db-turn.db-bear { border-left-color: var(--red-ink); }
.db-turn.db-aggr { border-left-color: var(--accent); }
.db-turn.db-cons { border-left-color: var(--muted); }
.db-turn.db-neut { border-left-color: var(--line); }
.db-turn.db-judge { border-color: var(--ink); border-left-color: var(--ink);
  background: var(--panel); }
.db-who { font-size: 11px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .06em; color: var(--muted); margin-bottom: 6px; }
.db-bull .db-who { color: var(--green-ink); }
.db-bear .db-who { color: var(--red-ink); }
.db-judge .db-who { color: var(--ink); }
.db-text { font-size: 13px; line-height: 1.62; white-space: pre-line; }

/* Clipped-by-default turns. The checkbox is the state, the label is the
   caret; both are inert for anyone who never touches them. */
.db-cb { position: absolute; opacity: 0; width: 1px; height: 1px; }   /* focusable */
.db-clip .db-text { display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 7; line-clamp: 7; overflow: hidden; }
.db-cb:checked ~ .db-text { display: block; -webkit-line-clamp: none; line-clamp: none;
  overflow: visible; }
/* The fade tells you there is more before you read the control. */
.db-clip:not(:has(.db-cb:checked))::after {
  content: ""; position: absolute; left: 3px; right: 1px; bottom: 30px; height: 42px;
  background: linear-gradient(to bottom, transparent, var(--panel-2)); pointer-events: none; }
.db-judge.db-clip:not(:has(.db-cb:checked))::after {
  background: linear-gradient(to bottom, transparent, var(--panel)); }

.db-more { display: inline-flex; align-items: center; gap: 6px; margin-top: 9px;
  font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em;
  color: var(--muted); cursor: pointer; user-select: none; }
.db-more:hover { color: var(--accent); }
.db-more::after { content: "Read the full argument"; }
.db-cb:checked ~ .db-more::after { content: "Collapse"; }
.db-caret { display: inline-block; font-size: 10px; line-height: 1;
  transition: transform .15s ease; }
.db-cb:checked ~ .db-more .db-caret { transform: rotate(180deg); }
.db-cb:focus-visible ~ .db-more { outline: 1px solid var(--accent); outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) { .db-caret { transition: none; } }
.db-committee { text-align: center; font-size: 11px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .1em; color: var(--faint);
  margin: 6px 0 2px; display: flex; align-items: center; gap: 12px; }
.db-committee::before, .db-committee::after { content: ""; flex: 1;
  border-top: 1px solid var(--line-2); }
/* the 94% phone cap and the 64% wide-frame cap below both predate the
   transcript layout — turns now run the full measure at every width */

/* reading-room CTA (friends + admin) */
.rr-cta { padding: 12px 16px; border-color: var(--accent); }
.rr-row { display: flex; align-items: center; gap: 12px; }
.rr-ic { font-size: 20px; }
.rr-txt { flex: 1; display: flex; flex-direction: column; gap: 2px; }

/* score page: subscore legend */
.sub-legend { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 14px; margin-top: 10px; }
.sl-item b { font-size: 13.5px; }
.sl-item p { margin: 5px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--muted); }
.sl-item p b { color: var(--ink); font-size: 12.5px; }

/* watchlist sort control */
.wl-sort { margin-left: 10px; font-size: 12px; padding: 3px 6px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--panel); color: var(--ink); }

/* ═══ Mobile QoL sweep (trails all base rules — order wins on ties) ═══ */
@media (max-width: 640px) {
  /* Cards ate 28px of side padding — ~15% of a 375px screen. Reclaim it
     everywhere so every page's content breathes. */
  .card { padding: 16px 15px; margin-bottom: 14px; }
  .page-head h1 { font-size: 23px; }

  /* Macro cross-asset tiles: the tight card left only room for 1 column;
     force a clean 2-up so 20 tiles aren't 20 full-width rows. */
  .mkt-grid { grid-template-columns: 1fr 1fr; gap: 8px; }
  .mkt-tile { padding: 10px 11px; }
  .mkt-v { font-size: 22px; }

  /* Calendar: the per-day event COUNT (top-right) crowded the day number,
     reading as one figure ("14"+"6" = "146"). The colored dots already show
     an event is there — drop the count on phones. */
  .cal-count { display: none; }

  /* Compare: make the whole thing actually fit. The table was 1133px wide
     (long labels + values forced it) so stock B sat off-screen. Fixed layout
     enforces the %% columns and lets content wrap — both stocks visible. */
  .cmp-tbl { table-layout: fixed; width: 100%; font-size: 12.5px; }
  .cmp-tbl th { font-size: 14px; }
  .cmp-tbl td, .cmp-tbl th, .cmp-tbl td:first-child {
    white-space: normal !important; overflow-wrap: anywhere; word-break: break-word; }
  .cmp-tbl th:first-child, .cmp-tbl td:first-child { width: 30%; }
  .cmp-tbl th, .cmp-tbl td { width: 35%; }
  /* the compare form: inputs were squeezed to ~3 chars ("NVI"). Give them
     room; the button drops to its own full-width row. */
  .cmp-form { flex-wrap: wrap; }
  .cmp-form .ticker-input { flex: 1 1 38%; max-width: none; min-width: 0; }
  .cmp-form .cmp-vs { flex: 0 0 auto; }
  .cmp-form .btn { flex: 1 1 100%; margin-top: 4px; }

  /* Touch targets: form fields and stacked form buttons were 27-31px tall
     (comfortable minimum is ~44). Give them room without disturbing dense
     table action buttons. */
  .field input, .field select, .field textarea,
  input[type="text"], input[type="email"], input[type="password"],
  input[type="number"], input[type="date"], input[type="search"], select, textarea {
    min-height: 42px; }
  .stack .btn, form.stack button.btn, .cta-row .btn { min-height: 42px; }
}

/* ═══ Desktop readability: cap prose measure ═══
   Content caps at 1060px, but at that width a paragraph is ~150 characters
   per line — far past the ~75ch comfortable-reading ceiling. Cap the reading
   measure of page intros everywhere, and body prose on the text-heavy pages.
   Data/tables/grids are never <p>/<li> prose, so they're untouched. */
.page-head p { max-width: 66ch; }
.page-methodology .card > p, .page-methodology .card ul,
.page-terms .card p, .page-terms .card ul, .page-terms .wrap > p,
.page-privacy .card p, .page-privacy .card ul,
.page-methodology .wrap > p { max-width: 68ch; }
/* the Score "honest box" verdict paragraph runs the full card width */
.page-score .card > p.muted { max-width: 72ch; }
/* descriptive card subtitles are prose, not table headers — keep them readable */
.card > .sub, .card > p.muted.small { max-width: 74ch; }
/* macro regime narrative is a full paragraph — cap its measure */
.regime-text { max-width: 74ch; }

/* ═══ Report readability: mini-TOC, conviction, delta, sources, sections ═══ */
.toc-chips { position: sticky; top: 0; z-index: 30; display: flex; gap: 6px;
  flex-wrap: wrap; padding: 8px 0; margin: 4px 0 10px;
  background: var(--bg); border-bottom: 1px solid var(--line-2); }
.toc-chips a { font-size: 12.5px; padding: 4px 11px; border: 1px solid var(--line);
  border-radius: var(--radius-sm); color: var(--muted); text-decoration: none; }
.toc-chips a:hover { color: var(--ink); border-color: var(--ink); }
.vc-conv { font-size: 13.5px; padding: 8px 12px; margin: 0 0 12px;
  border-left: 3px solid var(--line); background: var(--panel-2); border-radius: var(--radius); }
.vc-conv-high { border-left-color: var(--green-ink, #639922); }
.vc-conv-medium { border-left-color: var(--amber-ink, #ba7517); }
.vc-conv-low { border-left-color: var(--red-ink, #e24b4a); }
.delta-card { padding: 12px 16px; font-size: 14px; }
.sec-head { display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin: 22px 0 10px; }
.section summary .sec-teaser { display: block; font-weight: 400; font-size: 12.5px;
  color: var(--muted); margin-top: 3px; }
@media (max-width: 640px) {
  .toc-chips { overflow-x: auto; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; }
}

/* ── fair-value band (company valuation) ── */
.val-band-wrap { margin: 14px 0 6px; }
.val-band { position: relative; height: 14px; background: var(--panel-2);
  border: 1px solid var(--line); border-radius: var(--radius); }
.vb-range { position: absolute; top: 0; bottom: 0; background: var(--accent-soft);
  border-radius: var(--radius); }
.vb-tick { position: absolute; top: -4px; bottom: -4px; width: 3px;
  border-radius: 2px; transform: translateX(-50%); }
.vb-base { background: var(--accent); }
.vb-price { background: var(--ink); }
.vb-price.vb-out { background: var(--red-ink); }
.val-band-labels { position: relative; height: 30px; font-size: 11px;
  color: var(--muted); margin-top: 4px; }
.val-band-labels span { position: absolute; transform: translateX(-50%);
  white-space: nowrap; }
.val-band-labels .vb-price-label { top: 14px; font-weight: 700; color: var(--ink); }
.val-band-labels .vb-price-label.vb-out { color: var(--red-ink); }

/* ── macro desk: FRED dashboard tiles + sparklines ── */
.fred-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 10px; margin-top: 8px; }
.fred-tile { border: 1px solid var(--line); border-radius: var(--radius); padding: 10px 12px;
  background: var(--bg); }
.fred-row { display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin-top: 2px; }
.spk-wrap { margin: 6px 0 4px; }
.spk-wrap .fred-spark { width: 100%; }
.fred-spark { width: 110px; height: 32px; flex: 0 0 auto; color: var(--accent);
  opacity: .75; }
@media (max-width: 700px) { .fred-grid { grid-template-columns: 1fr 1fr; gap: 8px; }
  .fred-spark { width: 80px; } }

/* ── agent library (/agents) ── */
.ag-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; }
.ag-stat { text-align: center; padding: 10px 6px; }
.ag-stat b { display: block; font-size: 30px; letter-spacing: -0.5px; }
.ag-stat span { color: var(--muted); font-size: 13px; }
.ag-flow { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px; margin-top: 12px; }
.ag-flow-step { border: 1px solid var(--line); border-radius: var(--radius); padding: 14px;
  background: var(--bg); position: relative; }
.ag-flow-step b { display: block; margin: 4px 0 4px; }
.ag-flow-n { font-size: 12px; font-weight: 700; color: var(--accent); letter-spacing: 1px; }
.ag-flow-step.ag-here { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
.ag-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 12px; margin-top: 14px; }
.ag-card { display: flex; flex-direction: column; gap: 6px; align-items: flex-start;
  border: 1px solid var(--line); border-radius: var(--radius); padding: 16px;
  background: var(--bg); color: inherit; text-decoration: none;
  transition: border-color .15s, transform .15s; }
.ag-card:hover { border-color: var(--accent); transform: translateY(-2px); text-decoration: none; }
.ag-card b { font-size: 16px; }
.ag-card p { margin: 0; }
.ag-open { color: var(--accent); font-weight: 600; font-size: 13px; margin-top: auto; }
.ag-three { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px; }
.ag-three .card { margin-top: 14px; }
.ag-node { margin-top: 12px; }
.ag-node p { margin: 2px 0 0; }
.ag-links { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 14px; margin-top: 16px; }
.ag-links a.badge:hover { border-color: var(--accent); text-decoration: none; }
@media (max-width: 700px) { .ag-stat b { font-size: 24px; } }

/* ── landing: deliver checklist + agent band + use cases ── */
.deliver-sec, .uses-sec { margin-top: 54px; }
.deliver-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 14px; max-width: 980px; margin: 22px auto 0; }
.dlv { border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 18px; background: var(--bg); }
.dlv b { display: block; margin-bottom: 4px; }
.dlv b::before { content: "✓ "; color: var(--accent); font-weight: 800; }
.dlv p { margin: 0; color: var(--muted); font-size: 14px; }
.ag-band { max-width: 980px; margin: 30px auto 0; border: 1px solid var(--line);
  border-radius: var(--radius); padding: 22px; background: var(--bg); }
.ag-band-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 12px; text-align: center; }
.ag-band-stats b { display: block; font-size: 32px; letter-spacing: -0.5px; }
.ag-band-stats span { color: var(--muted); font-size: 13px; }
.uses-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 14px; max-width: 980px; margin: 22px auto 0; }
.use { border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 18px; background: var(--bg); }
.use-k { display: block; font-weight: 700; margin-bottom: 6px; color: var(--accent); }
.use p { margin: 0; color: var(--muted); font-size: 14px; }

/* ── /agents system map: the whole desk on one board ── */
.pipe { display: grid; grid-template-columns: 1fr auto 1fr auto 1fr auto 1fr;
  gap: 10px; align-items: stretch; margin-top: 16px; }
.pipe-col { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.pipe-col-h { font-size: 12px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--accent); margin-bottom: 2px; }
.pipe-node { display: block; border: 1px solid var(--line); border-radius: var(--radius);
  padding: 10px 12px; background: var(--bg); color: inherit; text-decoration: none;
  transition: border-color .15s; }
.pipe-node:hover { border-color: var(--accent); text-decoration: none; }
.pipe-node b { display: block; font-size: 14px; }
.pipe-tags { display: flex; flex-wrap: wrap; gap: 4px 8px; margin-top: 4px;
  justify-content: center; }
.pipe-tags i { font-style: normal; font-size: 12px; color: var(--muted); }
.pipe-tags i + i::before { content: "· "; color: var(--line); }
.pipe-bull { border-left: 3px solid var(--green); }
.pipe-bear { border-left: 3px solid var(--red); }
.pipe-judge, .pipe-call { border-color: var(--accent); }
.pipe-vs { text-align: center; font-size: 12px; color: var(--muted); }
.pipe-arrow { align-self: center; color: var(--accent); font-size: 22px;
  font-weight: 700; padding: 0 2px; }
/* Centred to match the nodes beside it - the seat badges were the last
   ragged-left run in a board whose every title is centred. */
.pipe-seats { border: 1px dashed var(--line); border-radius: var(--radius); padding: 10px 12px;
  display: flex; flex-wrap: wrap; gap: 6px; align-items: center; justify-content: center; }
.pipe-seats-h { width: 100%; font-size: 12px; font-weight: 700; color: var(--muted);
  text-align: center; }
.pipe-seats .badge:hover { border-color: var(--accent); text-decoration: none; }
.pipe-pills { display: flex; gap: 6px; margin-top: 6px; justify-content: center; }
@media (max-width: 900px) {
  .pipe { grid-template-columns: 1fr; }
  .pipe-arrow { transform: rotate(90deg); text-align: center; padding: 0; line-height: 1; }
}

/* predictions desk: keep question + odds on-screen at phone widths */
.pred-tbl td:first-child { max-width: 420px; }
@media (max-width: 640px) {
  .pred-tbl th:nth-child(4), .pred-tbl td:nth-child(4),
  .pred-tbl th:nth-child(5), .pred-tbl td:nth-child(5) { display: none; }
  .pred-tbl td:first-child { max-width: 56vw; min-width: 56vw; white-space: normal; }
  .pred-tbl .meter { display: none; }
  .pred-tbl .meter-row { justify-content: flex-start; }
}

/* portfolio brief: needs-attention strip on the portfolio pane */
.pfb-needs { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 14px; margin: 10px 0; }
.pfb-row { display: flex; align-items: center; gap: 10px; padding: 7px 0; flex-wrap: wrap;
  border-top: 1px solid var(--line); }
.pfb-row:first-of-type { border-top: 0; }

/* lens-aware compare: winner cell per discipline row */
.lens-win { font-weight: 700; color: var(--green-ink); }
.cmp-tbl td { white-space: normal; }
.cmp-tbl td .small, .cmp-tbl td.num { max-width: 420px; overflow-wrap: break-word; }

/* custom screener filter bar */
.scr-form { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: flex-end; }
.scr-f { display: flex; flex-direction: column; gap: 3px; }
.scr-f input[type=number] { width: 96px; }
.scr-check { flex-direction: row; align-items: center; gap: 6px; padding-bottom: 8px; }

/* macro sparkline context strip: date range + observed hi-lo */
.spk-meta { display: flex; justify-content: space-between; gap: 6px;
  font-size: 10px; color: var(--faint); margin-top: 3px; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.spk-meta .spk-hl { color: var(--muted); }

/* ── distilled desk views: conviction rows + the collapsed tape ── */
.conv-list { display: flex; flex-direction: column; margin-top: 10px; }
.conv-row { display: flex; align-items: center; gap: 10px; padding: 9px 2px;
  border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.conv-row:last-child { border-bottom: 0; }
.conv-row .tick { font-family: var(--mono); font-weight: 700; min-width: 52px; }
.conv-line { color: var(--ink-2); font-size: 14px; flex: 1; min-width: 240px; }
details.tape { margin-top: 18px; }
details.tape > summary { cursor: pointer; list-style: none; color: var(--muted);
  font-size: 13.5px; font-weight: 600; padding: 12px 16px; border: 1px dashed var(--line);
  border-radius: var(--radius); transition: color .15s, border-color .15s; }
details.tape > summary:hover { color: var(--ink); border-color: var(--accent); }
details.tape > summary::before { content: "▸ "; color: var(--accent); }
details.tape[open] > summary::before { content: "▾ "; }
details.tape[open] > summary { margin-bottom: 4px; }

/* company: what-matters-now strip */
.matters-list { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.matters-row { display: flex; gap: 12px; align-items: baseline; }
.matters-row b { flex: 0 0 92px; font-size: 12px; text-transform: uppercase;
  letter-spacing: .04em; color: var(--accent); }
.matters-row span { color: var(--ink-2); font-size: 14.5px; }

/* report: inline more-levels + collapsed coverage/sources */
.lv-more { display: inline-block; }
.lv-more > summary { cursor: pointer; list-style: none; color: var(--muted);
  font-size: 12.5px; text-decoration: underline dotted; }
.lv-more[open] > summary { color: var(--ink); }
.cov-details > summary, .src-details > summary { cursor: pointer; list-style: none;
  font-size: 14px; }
.cov-details > summary::before, .src-details > summary::before {
  content: "▸ "; color: var(--accent); }
.cov-details[open] > summary::before, .src-details[open] > summary::before { content: "▾ "; }

/* The sources panel: four analyst desks and what each reads, then the alt-data
   overlay. Two halves on purpose - the fixed input has to be visible next to
   the variable one, or a quiet desk day reads as a thin analysis. */
.src-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px;
  margin-top: 16px; }
.src-desk { min-width: 0; border-left: 2px solid var(--line); padding-left: 12px; }
.src-desk-h { display: block; font-size: 12.5px; font-weight: 700; letter-spacing: -.01em;
  margin-bottom: 6px; }
.src-list { list-style: none; margin: 0; padding: 0; }
.src-list li { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin-bottom: 3px; }
/* A TEXT label that explains itself on hover. .info-tip is a 15px circle built
   to hold the ⓘ glyph - wrapping a whole phrase in it squeezes the phrase into
   a badge. This is the same popover on a normal inline run of text. */
.tip-t { position: relative; cursor: help; border-bottom: 1px dotted var(--muted); }
.tip-t:hover { color: var(--ink); border-bottom-color: var(--accent); }
.tip-t:hover::after { content: attr(data-tip); position: absolute; top: calc(100% + 8px);
  left: -6px; z-index: 80; width: max-content; max-width: min(280px, 78vw);
  white-space: normal; text-align: left; padding: 9px 11px; font-size: 11.5px; font-weight: 400;
  line-height: 1.5; letter-spacing: 0; color: var(--ink);
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: 0 8px 24px rgba(0,0,0,.22); pointer-events: none; }
.src-desks-line { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line); }
.src-lab { display: block; font-size: 9.5px; letter-spacing: .11em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; margin-bottom: 6px; }
.src-names { font-size: 12.5px; color: var(--ink-2); line-height: 1.7; }
.src-names a { color: var(--ink-2); }
.src-names a:hover { color: var(--accent); }
.src-hits { margin-top: 16px; }
.src-none { font-size: 13px; color: var(--muted); margin: 0; }
@media (max-width: 900px) { .src-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .src-grid { grid-template-columns: 1fr; gap: 14px; } }

/* API docs code blocks */
.api-code { background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 12px 14px; font-family: var(--mono); font-size: 12.5px; line-height: 1.6;
  overflow-x: auto; margin: 10px 0 6px; }

/* ── toast (Astryx Toast spec, native): bottom stack, auto-hide, error persists ── */
.toast-viewport { position: fixed; bottom: 18px; left: 50%; transform: translateX(-50%);
  z-index: 200; display: flex; flex-direction: column; gap: 8px; align-items: center;
  pointer-events: none; }
.toast { display: flex; align-items: center; gap: 10px; background: var(--ink);
  color: var(--bg); padding: 10px 12px 10px 16px; border-radius: var(--radius); font-size: 14px;
  box-shadow: 0 8px 28px rgba(0,0,0,.30); pointer-events: auto; max-width: 90vw;
  animation: toast-in .22s cubic-bezier(.2,.7,.3,1); }
.toast-err { background: var(--red); color: #fff; }
.toast-x { background: none; border: 0; color: inherit; opacity: .7; cursor: pointer;
  font-size: 12px; padding: 2px 4px; }
.toast-x:hover { opacity: 1; }
.toast-out { opacity: 0; transform: translateY(6px); transition: all .28s; }
@keyframes toast-in { from { opacity: 0; transform: translateY(8px); } }
@media (prefers-reduced-motion: reduce) { .toast { animation: none; } }

/* ── confirm dialog (Astryx AlertDialog spec, native <dialog>) ── */
.confirm-dlg { border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
  color: var(--ink); padding: 22px; max-width: 400px; width: calc(100vw - 48px); }
.confirm-dlg::backdrop { background: rgba(0,0,0,.5); }
.confirm-dlg h3 { margin: 0 0 6px; font-size: 17px; }
.confirm-dlg p { margin: 0 0 16px; color: var(--muted); font-size: 14px; line-height: 1.5; }
.confirm-row { display: flex; gap: 10px; justify-content: flex-end; }
.btn-danger { background: var(--red); border-color: var(--red); color: #fff; }
.btn-danger:hover { filter: brightness(1.08); }

/* ── skeleton (Astryx Skeleton spec): shimmer placeholders, staggered ── */
.skel { position: relative; overflow: hidden; background: var(--line); border-radius: var(--radius);
  min-height: 12px; }
.skel::after { content: ""; position: absolute; inset: 0;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.08), transparent);
  animation: skel-wave 1.4s infinite; }
.intel-load .skel + .skel { margin-top: 8px; }
.intel-load .skel:nth-child(2)::after { animation-delay: .12s; }
.intel-load .skel:nth-child(3)::after { animation-delay: .24s; }
@keyframes skel-wave { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
@media (prefers-reduced-motion: reduce) { .skel::after { animation: none; } }

/* ── honeypot: off-screen, unfocusable, aria-hidden. Parked here rather than
   inline so nothing in the markup names it as a trap. Must not be
   display:none — that is the first thing a form-filler checks. ── */
.hp { position: absolute; left: -9999px; top: auto; width: 1px; height: 1px;
  overflow: hidden; }


/* ═══ UX pass 2026-07-25: earn the first screen, spend the width ═══ */

/* Signal rows (confluence board, dashboard watchlist) stacked the name over
   its chips, so a 1440px row used ~600px and burned two lines doing it.
   Wide screens get one line: name | chips filling the gap | actions. Roughly
   doubles the names visible per screen. Mobile keeps the stack. */
@media (min-width: 1100px) {
  .wl-row { grid-template-columns: minmax(190px, max-content) 1fr auto; align-items: center; }
  .wl-head { grid-column: 1; grid-row: 1; }
  .wl-signals { grid-column: 2; grid-row: 1; }
  .wl-act { grid-column: 3; grid-row: 1; }
}

/* Phone: the watchlist strip gave the "why" ~100px and ellipsised it away, so
   the one thing only we can tell you lost to a price you can get anywhere.
   Give it its own full-width line under the ticker. */
@media (max-width: 700px) {
  .mt-row { flex-wrap: wrap; gap: 2px 10px; padding: 11px 2px; }
  .mt-row .tick { min-width: 0; }
  .mt-px { margin-left: auto; }
  .mt-why { flex: 1 0 100%; order: 4; white-space: normal; overflow: visible;
            line-height: 1.45; }
}

/* A greeting is not information. Returning members get a tight, factual head. */
.page-head.ph-tight { margin: 0 0 14px; }
.page-head.ph-tight h1 { font-size: 21px; }
.ph-note { font-size: 13.5px; font-weight: 400; color: var(--muted); margin-left: 9px; }

/* The push prompt was 370px tall on a phone — half the first screen, above
   everything the member came for. One line, and the rationale is desktop-only. */
@media (max-width: 700px) {
  .push-nudge { padding: 10px 12px; gap: 9px; }
  .push-nudge .pn-sub { display: none; }
  .push-nudge .btn { margin-left: 0; }
  .push-nudge .pn-txt { flex: 1 1 auto; }
}

/* Report hero: the PDF/share column is `text-align:right` but the flex row
   wrapped it onto its own line, so two utility buttons landed left-aligned
   under the verdict and cost ~90px above the analysis. Grid pins it top-right
   where it was always meant to sit; below 720px the stack still applies. */
@media (min-width: 721px) {
  .report-hero { display: grid; grid-template-columns: minmax(0, 1fr) auto;
    align-items: start; column-gap: 26px; }
  .report-hero > .share-box { grid-column: 2; grid-row: 1; }
}


/* ═══════════════════════════════════════════════════════════════════════
   Craft pass 2026-07-25 — read as an instrument, not an app

   The layout was sound but the surface was not: 77 color emoji stood in for
   icons, so every desk label got interrupted by a cartoon glyph in Apple's
   palette rather than ours, and chips mixed filled and outlined treatments
   so a row of them read as confetti instead of a set. Fixed at the
   primitive level — nothing here is per-page.
   ═══════════════════════════════════════════════════════════════════════ */

/* The sprite itself must occupy nothing and never paint. */
.icon-sprite { position: absolute; width: 0; height: 0; overflow: hidden; }

/* Stroked 24px icons on currentColor: an icon is exactly the weight and hue
   of the text beside it. Optical centring beats baseline alignment here —
   these sit next to 11–13px labels, where a baseline sits too low. */
.ic { display: inline-block; vertical-align: -0.14em; flex: none;
      color: inherit; opacity: .78; }
a:hover > .ic, button:hover > .ic { opacity: 1; }

/* One chip silhouette. Every variant keeps a visible edge tinted from its
   own hue, so colour still carries meaning while the shapes stay a set.
   Previously the coloured variants went border-transparent and `.earn` was
   the lone outlined chip — that mix is what made a row look unbalanced. */
.wl-chip { gap: 5px; font-size: 11.5px; font-weight: 550; letter-spacing: .005em;
           padding: 3.5px 10px; font-variant-numeric: tabular-nums; }
.wl-chip .ic { width: 13px; height: 13px; opacity: .72; margin-left: -1px; }
.wl-chip.mom   { border-color: color-mix(in srgb, var(--accent) 26%, transparent); }
.wl-chip.gov   { border-color: color-mix(in srgb, var(--accent) 26%, transparent); }
.wl-chip.vol   { border-color: color-mix(in srgb, var(--accent) 26%, transparent); }
.wl-chip.pass,
.wl-chip.buy   { border-color: color-mix(in srgb, var(--green) 30%, transparent); }
.wl-chip.sell  { border-color: color-mix(in srgb, var(--red) 30%, transparent); }
.wl-chip.cat,
.wl-chip.sqz,
.wl-chip.cmdty,
.wl-chip.buzz  { border-color: color-mix(in srgb, var(--amber) 32%, transparent); }
/* Earnings is the one genuinely time-critical chip, so it keeps the loudest
   treatment — but as a tinted fill like everything else, not an outline. */
.wl-chip.earn  { background: var(--accent-soft); color: var(--accent);
                 border-color: color-mix(in srgb, var(--accent) 45%, transparent); }

/* Tickers are identifiers, not prose: even advance width, no optical kerning
   games, so a column of them lines up as a column. */
.tick, .wl-head .tick { font-variant-numeric: tabular-nums;
                        font-feature-settings: "ss01" off; letter-spacing: .01em; }

/* Uppercase micro-labels appear on nearly every card (eyebrows, table heads,
   stat captions). They were drifting across sizes and tracking; one rule
   keeps them a single voice. Tighter tracking than the old .13em — at 11px
   that much space reads as a logo, not a label. */
.eyebrow, .sqz-tf-l { font-size: 11px; font-weight: 700; letter-spacing: .1em;
                      text-transform: uppercase; }

/* The push prompt's bell was a 20px emoji; the icon carries the accent now. */
.push-nudge .pn-ic { display: inline-flex; color: var(--accent); font-size: 0; }
.push-nudge .pn-ic .ic { width: 19px; height: 19px; opacity: 1; }

/* Nav bell + theme toggle: centre the glyph in the 34px hit area. */
.icon-btn { font-size: 0; }
.icon-btn .ic { width: 17px; height: 17px; opacity: .9; }
.icon-btn:hover .ic { opacity: 1; }


/* ═══ wide-frame upgrades (>=1380px): use the width, don't stretch rows ═══ */
@media (min-width: 1380px) {
  .today-grid { grid-template-columns: 1fr 1fr 1fr; }
  .deliver-grid, .uses-grid { max-width: 1240px; }
  .vcard-grid { grid-template-columns: 1fr 290px; }
  .cal-layout { grid-template-columns: minmax(0, 1fr) 340px; }
}

/* wide frame: form controls keep intentional widths — never stretch to 1460 */
.card select, .card input[type=text]:not(.share-url), .card input[type=email] { max-width: 420px; }

@media (max-width: 700px) { .wrap { padding: 22px 16px 48px; } }


/* ═══════════════════════════════════════════════════════════════════════════
   INSTITUTIONAL REGISTER — 2026-07-25

   Brief: "institutional vibe, but FOR retail." The plain-English labels and
   explanations stay (that is the retail half, and it is the product's whole
   point). What changes is the visual register they arrive in.

   The surface had been speaking consumer-SaaS: 12px corners, drop shadows
   under floating panels, pastel fills behind every status, 15px/1.62 body on
   generous padding. That vocabulary belongs to onboarding flows and pricing
   pages. Research terminals — and the printed notes they descend from — are
   ruled, square, dense, and monochrome, and they spend colour only where it
   encodes something a reader must act on.

   Applied here at the primitive level so it reaches every page at once. The
   rules below deliberately restate earlier declarations; equal specificity,
   later wins, and keeping the shift in one legible block beats scattering it
   through two thousand lines.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── the page: denser, more document than app ─────────────────────────── */
body { font-size: 14px; line-height: 1.52; }
h1, h2 { font-weight: 600; letter-spacing: -.015em; }
.page-head { margin: 2px 0 18px; }
.page-head h1 { font-size: 23px; }
.page-head p { font-size: 13px; margin-top: 4px; }

/* ── panels: hairline-ruled, never floating ───────────────────────────── */
.card { border-radius: var(--radius); box-shadow: none;
        padding: 15px 18px 17px; margin-bottom: 12px; }

/* The panel header. A research note labels its blocks in small caps over a
   rule rather than titling them like article headings — it is the strongest
   single cue that this is an instrument and not a blog. */
.card > h2 {
  font-size: 11.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-2); margin: 0 0 11px; padding-bottom: 8px;
  border-bottom: 1px solid var(--line); }
.card > h2 + .sub, .card > h2 + p.sub { margin-top: -3px; }
/* Heads that carry a trailing action (…full board →) rule the whole row. */
.mt-head { padding-bottom: 8px; margin-bottom: 2px; border-bottom: 1px solid var(--line); }
.mt-head h2 { font-size: 11.5px; font-weight: 700; letter-spacing: .1em;
              text-transform: uppercase; color: var(--ink-2); border: 0; padding: 0; margin: 0; }

/* ── controls: square, quieter, less shouty weight ────────────────────── */
.btn { border-radius: var(--radius); font-weight: 550; font-size: 13px; padding: 8px 14px; }
.btn-lg { border-radius: var(--radius); font-size: 14.5px; padding: 11px 22px; }
.btn-sm { border-radius: var(--radius-sm); font-size: 12.5px; padding: 5px 11px; }
input, select { border-radius: var(--radius); font-size: 14px; padding: 8px 11px; }
input:focus, select:focus { outline-width: 1px; outline-offset: 0; border-color: var(--accent); }

/* ── status: a ruled edge, not a pastel panel ─────────────────────────── */
/* A filled tint block reads as a consumer toast. A hairline box with one
   weighted edge reads as a margin note on a document. */
.note { border-radius: var(--radius-sm); font-size: 13px; padding: 9px 13px;
        background: var(--panel); border: 1px solid var(--line); border-left-width: 3px;
        color: var(--ink); }
.note.ok   { border-left-color: var(--green); }
.note.err  { border-left-color: var(--red); }
.note.info { border-left-color: var(--accent); }

/* ── data cells: ruled, monospaced figures ────────────────────────────── */
.stat { background: none; border: 0; border-left: 1px solid var(--line);
        border-radius: 0; padding: 2px 0 2px 12px; }
.stat .n { font-family: var(--mono); font-size: 20px; font-weight: 600;
           font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
.stat .l { font-size: 10.5px; letter-spacing: .05em; text-transform: uppercase;
           color: var(--faint); margin-top: 3px; }
.stats { gap: 10px 18px; }

/* ── chips: monochrome by default; hue only where it means direction ──── */
/* Previously every desk tinted its own chip, so a row of eight signals
   arrived as eight competing colours and none of them meant anything. The
   default is now ink on the panel with a hairline; green and red survive
   because up and down are the two things a reader must not misread. */
.wl-chip { border-radius: var(--radius-sm); background: none;
           border: 1px solid var(--line); color: var(--ink-2); font-weight: 500; }
.wl-chip.mom, .wl-chip.gov, .wl-chip.vol, .wl-chip.cat,
.wl-chip.sqz, .wl-chip.cmdty, .wl-chip.buzz, .wl-chip.pass {
  background: none; color: var(--ink-2); border-color: var(--line); }
.wl-chip.buy  { background: none; color: var(--green-ink);
                border-color: color-mix(in srgb, var(--green) 34%, transparent); }
.wl-chip.sell { background: none; color: var(--red-ink);
                border-color: color-mix(in srgb, var(--red) 34%, transparent); }
/* Earnings is dated and imminent — the one non-directional signal that still
   earns the accent, and it carries it as an edge, not a fill. */
.wl-chip.earn { background: none; color: var(--accent);
                border-color: color-mix(in srgb, var(--accent) 42%, transparent); }
.wl-chip.sqz.fired { color: var(--accent);
                border-color: color-mix(in srgb, var(--accent) 42%, transparent); }
.badge { border-radius: var(--radius-sm); }

/* ── nav: a rule under the active tab, not a filled lozenge ───────────── */
.nav { height: 52px; }
.nav-tabs a, .nav-dd-toggle { border-radius: var(--radius-sm); font-size: 13px; font-weight: 500;
                              padding: 6px 11px; }
.nav-tabs a.active, .nav-dd-toggle.active {
  background: none; color: var(--ink); box-shadow: inset 0 -2px 0 var(--accent); }
.icon-btn { border-radius: var(--radius-sm); width: 30px; height: 30px; }

/* ── tables already read correctly; just tighten to match the new density ─ */
table.tbl { font-size: 13px; }
table.tbl th { font-size: 10px; letter-spacing: .09em; padding: 7px 10px; }
table.tbl td { padding: 8px 10px; }

/* Segmented control → ruled tab strip. A filled lozenge group is iOS
   vocabulary; a terminal underlines the live tab and leaves the rest flat. */
.hv-tabs { background: none; border: 0; border-bottom: 1px solid var(--line);
           border-radius: 0; padding: 0; gap: 0; display: flex; }
.hv-tab { border-radius: 0; padding: 7px 15px; font-size: 11.5px; font-weight: 700;
          letter-spacing: .09em; text-transform: uppercase; }
#hv-watch:checked ~ .hv-head .hv-tab[for="hv-watch"],
#hv-port:checked  ~ .hv-head .hv-tab[for="hv-port"] {
  background: none; color: var(--ink); box-shadow: inset 0 -2px 0 var(--accent); }

/* The push prompt sits above the desk, so it must not out-shout it: a hairline
   strip with one accent edge, not a filled banner. */
.push-nudge { padding: 9px 14px; margin-bottom: 12px; border-left-width: 3px; }
.push-nudge .pn-txt b { font-size: 13px; font-weight: 600; }

/* Meters read as machined bars, not lozenges. */
.usage .bar, .usage .fill, .sigbar, .sigbar-fill { border-radius: 0; }


/* ── landing: the last page still at the pre-register scale ─────────────── */
/* 52px on 64px of padding was set when the app ran at 15px/1.62. Everything
   behind the login is denser now; the one page prospects see first should
   not still be shouting in the old voice. Impact comes from the ruled
   masthead treatment, not from size. */
.hero { padding: 44px 0 30px; }
.hero h1 { font-size: 40px; line-height: 1.08; letter-spacing: -.025em;
           margin: 12px 0 16px; }
.hero .lede { font-size: 15.5px; line-height: 1.55; max-width: 600px; }
.hero .cta { margin-top: 22px; }
@media (max-width: 700px) { .hero h1 { font-size: 30px; } .hero { padding: 30px 0 24px; } }

/* ── keyboard focus: one visible ring everywhere ────────────────────────── */
/* There were four focus-visible rules in the whole sheet, so most controls
   fell back to the UA default — and the register pass tightened outlines. */
a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible,
textarea:focus-visible, summary:focus-visible, [tabindex]:focus-visible,
label.hv-tab:focus-visible, .db-more:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }

/* ── print: the page is not the deliverable, the note is ────────────────── */
/* Reports have a real PDF now, but people still hit Cmd+P. Give them a clean
   sheet instead of the dark app: drop the chrome, force paper colours, and
   open everything that is collapsed on screen so nothing silently vanishes
   from the printout. */
@media print {
  :root { --bg: #fff; --bg-2: #fff; --panel: #fff; --panel-2: #fff;
          --ink: #000; --ink-2: #222; --muted: #444; --faint: #666;
          --line: #bbb; --line-2: #ddd; --shadow: none; --shadow-sm: none; }
  html, body { background: #fff !important; color: #000 !important; }
  .nav, .foot .foot-links, .to-top, .push-nudge, .gate-bar, .nav-search-wrap,
  .toc-chips, .share-box, .db-more, #loadbar, .rr-cta, .icon-btn,
  form, button, .btn { display: none !important; }
  .wrap { max-width: none; padding: 0; }
  .card { border: 0; border-bottom: 1px solid #ccc; padding: 0 0 12px;
          margin: 0 0 14px; break-inside: avoid; }
  .card > h2 { border-bottom: 1px solid #999; }
  /* nothing collapsed may hide from paper */
  details { display: block !important; }
  details > summary { display: none !important; }
  details > *:not(summary) { display: revert !important; }
  .db-clip .db-text { display: block !important; -webkit-line-clamp: none !important;
                      line-clamp: none !important; overflow: visible !important; }
  .db-clip::after { display: none !important; }
  .db-turn { break-inside: avoid; background: none; }
  a { color: #000 !important; text-decoration: none !important; }
  h1, h2, h3 { break-after: avoid; }
}


/* ── Google sign-in, to Google's guidelines ─────────────────────────────── */
/* This button is the one element on the site that does NOT follow our design
   system: Google's identity guidelines specify the four-colour "G", a neutral
   surface, and their type colour, and a bank-grade product should look like it
   follows the rules. Both sanctioned variants ship; the theme picks one.
   Light surface (#fff / #747775 border / #1f1f1f text) is the default. */
.gbtn { display: flex; align-items: center; justify-content: center; gap: 10px;
  width: 100%; height: 40px; margin-top: 14px; padding: 0 12px;
  background: #ffffff; border: 1px solid #747775; border-radius: var(--radius);
  color: #1f1f1f; font-family: 'Roboto', var(--sans); font-size: 14px; font-weight: 500;
  letter-spacing: .0107em; text-decoration: none; cursor: pointer;
  transition: background-color .12s, box-shadow .12s; }
.gbtn:hover { background: #f7f8f8; text-decoration: none; box-shadow: 0 1px 2px rgba(0,0,0,.16); }
.gbtn:active { background: #eef0f1; }
.gbtn:focus-visible { outline: 2px solid #0b57d0; outline-offset: 2px; }
.gbtn-ic { display: inline-flex; flex: none; }
.gbtn-t { white-space: nowrap; }
/* Google's dark variant — #131314 surface, #8E918F border, #E3E3E3 text. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .gbtn { background: #131314; border-color: #8e918f; color: #e3e3e3; }
  :root:not([data-theme="light"]) .gbtn:hover { background: #1c1d1f; }
  :root:not([data-theme="light"]) .gbtn:active { background: #232427; }
}
:root[data-theme="dark"] .gbtn { background: #131314; border-color: #8e918f; color: #e3e3e3; }
:root[data-theme="dark"] .gbtn:hover { background: #1c1d1f; }
:root[data-theme="dark"] .gbtn:active { background: #232427; }
:root[data-theme="light"] .gbtn { background: #ffffff; border-color: #747775; color: #1f1f1f; }

/* forgot-password reveal — same disclosure pattern as the magic-link box */
.lm-forgotbox { display: none; }
#lm-forgot:checked ~ .lm-forgotbox { display: block; }

/* Analyze form: the advanced controls behind one disclosure. */
.an-opts { margin: 12px 0 0; }
.an-opts > summary { display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
  font-size: 11.5px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); list-style: none; padding: 4px 0; }
.an-opts > summary::-webkit-details-marker { display: none; }
.an-opts > summary::before { content: "▸"; font-size: 9px; transition: transform .15s ease; }
.an-opts[open] > summary::before { transform: rotate(90deg); }
.an-opts > summary:hover { color: var(--accent); }
.an-opts > summary .muted { text-transform: none; letter-spacing: 0; font-weight: 400; }
@media (prefers-reduced-motion: reduce) { .an-opts > summary::before { transition: none; } }

/* Third-party chart: our surface colour behind it, so a theme swap (which
   forces a full iframe reload) never flashes white on a dark page. */
.tv-chart { background: var(--panel); border: 0; }

/* ═══ SPECIMEN HERO ═══════════════════════════════════════════════════════
   Replaced the orbiting desk ring. Thesis left, a real note right — the same
   ruled, square language as the product, so the first impression and the app
   finally agree. No motion: the only thing that should move on this page is
   data arriving. */
/* STRETCH, NOT CENTRE. The note is as tall as its content, the copy is as tall
   as its content, and they are never equal - so `align-items: center` split the
   difference above AND below the note. With a short specimen (308px against a
   458px copy column) that put 75px of nothing under the card, then 34px of
   section padding, then the calls strip's own 26px: 135px of dead air holding
   the calls off the fold. Stretching the note to the row height puts the whole
   difference INSIDE the card, where its footer link already sits on a fade, so
   it reads as a card footer rather than as a hole in the page. */
/* 58px of top padding was there to hold the hero off the desk tape that used
   to sit above it. The tape is gone, so it became 69px of nothing between the
   nav rule and the first thing on the page. 26px puts the fold ~37px under the
   nav, which is tighter than the site's standard 30px wrap padding on purpose -
   the hero is the one page top where starting immediately reads as confident.
   NB: .wrap-flush zeroes the wrap's own padding-top, so this rule is the ONLY
   thing setting the landing's top spacing. */
.spec-hero { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 52px; align-items: stretch; padding: 26px 0 48px; }
.spec-copy { align-self: center; }
/* The left column lost three elements (the eight-noun lede, the second
   button, the pricing line), so what is left gets the room they were using
   rather than the column just ending higher. Bigger headline, and real air
   between each of the four remaining steps: label, claim, proof, action. */
.spec-copy h1 { font-size: 44px; line-height: 1.06; margin: 16px 0 26px; }
.spec-copy .lede { font-size: 16px; max-width: 52ch; margin: 0 0 10px; }
.spec-copy .cta { justify-content: flex-start; margin-top: 22px; align-items: baseline; }
.spec-second { font-size: 13.5px; color: var(--muted); }
.spec-second:hover { color: var(--accent); }

/* The note itself: a page of output, cropped at the fold so it invites the
   scroll instead of pretending to be the whole thing. */
/* max-height does double duty: it crops a long note (that is what the fade is
   for) AND it caps how far the card can stretch to match the copy column. 470
   was under the copy column's height at several desktop widths, which put the
   centring slack back. */
.spec-note { display: block; position: relative; overflow: hidden; max-height: 560px;
  background: var(--panel); border: 1px solid var(--line); border-top: 3px solid var(--accent);
  border-radius: var(--radius); padding: 18px 22px 0; color: inherit; text-decoration: none; }
.spec-note:hover { border-color: var(--rule, var(--line)); text-decoration: none; }
.spec-mast { display: flex; justify-content: space-between; align-items: baseline;
  padding-bottom: 9px; border-bottom: 1px solid var(--line); }
.spec-firm { font-weight: 700; font-size: 14px; letter-spacing: -.01em; }
.spec-firm .sl { color: var(--accent); }
.spec-firm .rs { color: var(--muted); font-weight: 400; margin-left: 6px; }
.spec-kind { font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); }
.spec-call { display: flex; align-items: baseline; gap: 12px; margin: 16px 0 2px; flex-wrap: wrap; }
.spec-tick { font-family: var(--mono); font-size: 30px; font-weight: 700; letter-spacing: -.01em; }
.spec-dec { font-size: 19px; font-weight: 700; }
.spec-dec.dec-buy { color: var(--green-ink); }
.spec-dec.dec-sell { color: var(--red-ink); }
.spec-dec.dec-hold { color: var(--amber-ink); }
.spec-conv { font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.spec-meta { font-size: 11.5px; color: var(--muted); margin-bottom: 14px; }
.spec-facts { display: flex; gap: 0; border: 1px solid var(--line); background: var(--panel-2);
  border-radius: var(--radius-sm); margin-bottom: 16px; }
.spec-facts > div { flex: 1; padding: 8px 12px; border-left: 1px solid var(--line); }
.spec-facts > div:first-child { border-left: 0; }
.spec-facts span { display: block; font-size: 9px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--muted); margin-bottom: 3px; }
.spec-facts b { font-family: var(--mono); font-size: 14px; font-variant-numeric: tabular-nums; }
.spec-cases { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.spec-side { font-size: 10.5px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  margin: 0 0 7px; }
.spec-side.bull { color: var(--green-ink); }
.spec-side.bear { color: var(--red-ink); }
.spec-li { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0 0 8px;
  padding-left: 10px; border-left: 1px solid var(--line); }
/* A FOOTER, not a veil. This was a 120px gradient absolutely positioned over
   the bottom of the card, which was right when the note was long enough to be
   cropped - it said "there is more below". With two bullets a side there is
   nothing below, so the gradient sat on top of readable text and washed both
   bottom bullets out to grey: the card looked broken, or worse, like the
   content was deliberately teased. The card is a flex column now; the cases
   area absorbs the max-height cap (min-height:0 + overflow:hidden, so a long
   note still crops) and the link is a real footer row that can never cover
   anything. */
.spec-note { display: flex; flex-direction: column; }
.spec-cases { flex: 1 1 auto; min-height: 0; overflow: hidden; }
.spec-fade { position: static; height: auto; display: flex;
  align-items: center; justify-content: center;
  margin-top: 14px; padding: 12px 0 16px; border-top: 1px solid var(--line);
  background: none; }
.spec-more { font-size: 12px; font-weight: 600; color: var(--accent); }

/* Evidence strip: real confluence lines, scrollable rather than wrapped. */
.spec-tape { display: flex; align-items: center; gap: 18px; overflow-x: auto;
  border-bottom: 1px solid var(--line);
  padding: 10px 2px; margin: 0 0 22px; scrollbar-width: none; }
.spec-tape::-webkit-scrollbar { display: none; }
.spec-tape-l { flex: none; font-size: 9.5px; letter-spacing: .11em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; }
.spec-tape-i { flex: none; font-size: 12px; color: var(--ink-2); white-space: nowrap; }
.spec-tape-i b { font-family: var(--mono); font-weight: 700; margin-right: 5px; }
.spec-tape-a { flex: none; font-size: 12px; margin-left: auto; white-space: nowrap; }

@media (max-width: 980px) {
  .spec-hero { grid-template-columns: 1fr; gap: 30px; padding: 20px 0 22px; }
  .spec-copy h1 { font-size: 30px; }
  .spec-note { max-height: 400px; }
  .spec-cases { grid-template-columns: 1fr; gap: 12px; }
}

/* ═══ LANDING RHYTHM ══════════════════════════════════════════════════════
   The hero reads as a research note, then every section below it centred its
   copy — the page changed voice at the fold, which is most of what read as
   "unbalanced". One left margin now runs the whole page, the way a document
   has one. */
/* NB: .sec-head already exists (report.html: a flex header row with a
   trailing action). Landing gets its own name — reusing that one silently
   turned every section heading into a shrink-wrapped flex item scattered
   across the column. */
.lp-head { max-width: 72ch; margin-bottom: 18px; }
.lp-head h2 { font-size: 22px; letter-spacing: -.015em; }
.lp-head .muted { font-size: 14px; }

/* Hero copy filled only 508px of its 662px track, so the column read as
   floating text rather than a column facing the note.
   SCOPED to desktop on purpose: unscoped, this sat after the 980px collapse
   above and out-cascaded it at every width, so phones kept a two-column hero.
   At 375px that gave each column ~165px - the headline broke five ways, the
   masthead ran into itself, and the CTA wrapped. Any override of a property
   a breakpoint owns has to be scoped, or it silently un-does the breakpoint. */
.spec-copy .lede { max-width: none; }
/* The stat line explains itself on hover. .tip-t's default popover is sized
   for a short gloss - this one is three sentences, so it gets its own width
   and a slightly smaller face. */
.lede-tip { border-bottom: none; }
.tip-i { display: inline-flex; align-items: center; justify-content: center;
  width: 17px; height: 17px; margin-left: 8px; vertical-align: 2px;
  border: 1.5px solid var(--muted); border-radius: 50%;
  font: italic 700 11px/1 Georgia, "Times New Roman", serif;
  color: var(--muted); cursor: help; }
.tip-t:hover .tip-i { border-color: var(--accent); color: var(--accent); }
.lede-tip:hover::after { max-width: min(430px, 86vw); font-size: 12.5px; }
/* No hover, no tooltip - so on touch the sentence stays on the page. */
.lede-touch { display: none; }
@media (hover: none) { .lede-touch { display: block; } }
@media (min-width: 981px) {
  .spec-hero { grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr); }
}

/* The tape hid 651px of itself behind a hard cut at the viewport edge, which
   reads as broken rather than scrollable. Fade the tail so the overflow is
   legible as more-to-the-right. */
/* No mask here. A mask applies to the ENTIRE element including position:
   sticky children, so the fade meant to hint "scroll right" was also washing
   out the "the board" link sitting on top of it - the link looked disabled and
   the last item looked truncated rather than scrollable. The sticky link with
   its own solid background and a soft left shadow does the same job without
   dimming itself. */
.spec-tape { position: relative; }
.spec-tape-a { position: sticky; right: 0; background: var(--bg);
  padding-left: 16px; box-shadow: -18px 0 14px -6px var(--bg); z-index: 1; }
@media (max-width: 700px) { .lp-head h2 { font-size: 19px; } }

/* The agent-count band was the last centred block on the page. Everywhere
   else a figure sits in a left-ruled cell (.stat); match it so the whole
   page reads off one margin. */
.ag-band-stats { text-align: left; }
.ag-band-stats > div { border-left: 1px solid var(--line); padding-left: 12px; }

/* These blocks centred themselves when the whole page was centred. With the
   headings now on the page margin they read as adrift, so they start where
   the copy starts and keep their own max-widths for measure. */
.deliver-sec .deliver-grid,
.deliver-sec .ag-band,
.uses-sec .uses-grid { margin-left: 0; margin-right: 0; }

/* Desk previews were a vertical stack: 1,401px, a third of the whole page, to
   say "here are our sources" — supporting evidence taking more room than the
   pitch, and the last thing between a reader and pricing. Two columns on
   desktop halves it and spends the width the register asks for. The section
   itself becomes the grid so the intro and the closing note simply span. */
@media (min-width: 1000px) {
  .desk-deep { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 18px;
    align-items: start; }
  /* Both the capture and the closing line SPAN the two-column grid.
     Without the span they were auto-placed into one cell each and sat
     side by side, so each was centred inside half the section - which
     is exactly what reads as 'not centred'. */
  .desk-deep > .lp-head, .desk-deep > .dd-close,
  .desk-deep > .lead-cap { grid-column: 1 / -1; }
  .dd-item { margin-top: 0; max-width: none; height: 100%; }
}
/* The section's last word, centred under both cards rather than ragged-left
   under one of them. */
.dd-close { margin: 22px auto 0; max-width: 76ch; text-align: center;
  font-size: 13px; line-height: 1.7; color: var(--muted); }

/* In two columns the desk blurb wrapped to four lines, making the card's
   HEAD (153px) taller than the evidence under it (150px) — the explanation
   outweighing the thing it explains. Two lines is enough to say what a desk
   is; the prints below are the argument. */
.dd-head p { display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; }
@media (min-width: 1000px) { .dd-head { align-items: flex-start; } }

/* The live-analysis demo is a self-contained object moment, not reading copy.
   Left-aligned with the rest of the page it parked a 560px terminal on the
   margin with ~800px of void beside it, which reads as a mistake rather than
   a choice. This one section centres as a unit - label, terminal and actions
   together - so the emptiness sits evenly on both sides. The terminal's own
   contents stay left, because it is pretending to be a console. */
.watch-demo { text-align: center; }
.watch-demo .lp-head { max-width: 72ch; margin-left: auto; margin-right: auto; }
.watch-demo .demo-term { max-width: 620px; margin-left: auto; margin-right: auto;
  text-align: left; }
.watch-demo .cta { justify-content: center; }

/* ═══ HERO ON A PHONE ═════════════════════════════════════════════════════
   Everything here is a consequence of the note being a real document rather
   than a graphic: at 343px its masthead, key-data row and two case columns
   all want more width than they have, and flex items refuse to shrink below
   their content, so they overflow and collide instead of reflowing. */
@media (max-width: 700px) {
  .spec-hero { gap: 26px; padding: 26px 0 20px; }
  .spec-copy h1 { font-size: 27px; line-height: 1.12; letter-spacing: -.02em; }
  .spec-copy .lede { font-size: 15px; line-height: 1.55; }
  .spec-copy .cta { display: block; margin-top: 20px; }
  /* A wrapped primary button reads as a mistake; give it the full column. */
  .spec-copy .cta .btn-primary { display: block; text-align: center; width: 100%; }
  .spec-copy .cta .spec-second { display: block; margin-top: 12px; }

  /* Masthead: firm and doc-kind are two flex items with no gap and no shrink,
     so at this width they ran into each other. Wrap is the guard - the kind
     label takes its own line rather than overprinting the firm. */
  .spec-mast { flex-wrap: wrap; gap: 4px 14px; }
  .spec-kind { text-align: right; }

  /* Key data is exactly three cells (price/support/resistance), so a two-up
     grid orphans the third across a half-empty row. Keep the three abreast and
     buy the width back from padding - $106.89 at 13px mono needs ~62 of the
     ~100px each cell gets. */
  .spec-facts > div { padding: 7px 8px; }
  .spec-facts b { font-size: 13px; }
  .spec-facts span { font-size: 8.5px; letter-spacing: .08em; }

  /* The crop has to clear the bull case. Cut above it and the specimen is a
     masthead and three numbers - it stops being evidence that the desks
     actually argue, which is the only reason it is on the page. */
  .spec-note { max-height: 372px; padding: 15px 16px 0; }
  .spec-call { margin-top: 13px; }
  .spec-meta { margin-bottom: 11px; }
  .spec-facts { margin-bottom: 13px; }
  .spec-tick { font-size: 26px; }
  .spec-fade { height: 96px; }

  /* The mask is gone everywhere now (it dimmed the sticky link along with the
     content). On a phone the sticky link also steals scarce width for a hint
     the swipe already gives, so it just sits inline at the end. */
  .spec-tape { margin-bottom: 18px; gap: 14px; }
  .spec-tape-l .tl-q { display: none; }
  .spec-tape-a { position: static; box-shadow: none; padding-left: 0; }
}

/* ═══ DESK CARDS ON A PHONE ════════════════════════════════════════════════
   Each card's HEAD was 153px against ~225px of actual evidence: icon+title on
   one row, the blurb on a second, and "Full preview" wrapping onto a third
   because it could not fit beside them. Four desks meant ~600px of the page
   was label. Grid puts the button back on the title's row and lets the blurb
   span underneath, so the head is two rows and the prints stay the argument.
   `display: contents` promotes the wrapper's h3 and p to grid items, which is
   what lets the markup stay as it is. */
@media (max-width: 720px) {
  .dd-head { display: grid; grid-template-columns: auto 1fr auto;
    gap: 3px 10px; align-items: baseline; }
  .dd-head > div { display: contents; }
  .dd-head .ic { grid-column: 1; grid-row: 1; font-size: 18px; }
  .dd-head h3 { grid-column: 2; grid-row: 1; font-size: 16px; }
  .dd-head a.btn { grid-column: 3; grid-row: 1; margin-left: 0 !important; }
  .dd-head p { grid-column: 1 / -1; grid-row: 2; }
}

/* ═══ BULK WATCHLIST ENTRY ═════════════════════════════════════════════════
   Collapsed by default: the single-ticker box stays the primary path, and
   this is the escape hatch for someone arriving with a list already in hand. */
.wl-bulk { margin: 8px 0 4px; }
.wl-bulk-form { display: flex; flex-direction: column; gap: 8px; margin: 8px 0 2px; }
.wl-bulk-ta { width: 100%; resize: vertical; padding: 9px 11px; font-family: var(--mono);
  font-size: 12.5px; line-height: 1.5; color: var(--ink); background: var(--panel-2);
  border: 1px solid var(--line); border-radius: var(--radius-sm); }
.wl-bulk-ta:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.wl-bulk-row { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; }
.wl-bulk-row input[type=file] { font-size: 11.5px; max-width: 190px; }
@media (max-width: 700px) {
  .wl-bulk-row { align-items: stretch; }
  .wl-bulk-row .btn { width: 100%; }
}

/* ═══ FEEDBACK ON THE CALL ═════════════════════════════════════════════════
   Was a card at the foot of the report: 0 votes across 85 reports, because a
   reader who has formed an opinion has already stopped scrolling. It now sits
   on the verdict itself. One click to vote; the note is a disclosure, since
   asking for prose up front is what makes people skip the whole control. */
.vc-fb { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line-2); }
.vc-fb form { margin: 0; display: flex; gap: 6px; }
.vc-fb-q { font-size: 12.5px; color: var(--muted); margin-right: 2px; }
.vc-fb-note { margin-left: auto; }
.vc-fb-note > summary { font-size: 12px; color: var(--muted); cursor: pointer; }
.vc-fb-note > summary:hover { color: var(--accent); }
.vc-fb-note form { margin-top: 8px; }
.vc-fb-note input[type=text] { min-width: 200px; font-size: 12.5px; }
@media (max-width: 700px) {
  .vc-fb-note { margin-left: 0; width: 100%; }
  .vc-fb-note input[type=text] { min-width: 0; flex: 1; }
}

/* ═══ OPS SUB-NAV ══════════════════════════════════════════════════════════
   The ops page was fourteen sections on one scroll. Tabs, not because tabs
   are nice, but because "is anything broken" and "how is the funnel" are
   different questions and neither should cost the other's queries. */
.ops-tabs { display: flex; gap: 2px; flex-wrap: wrap; margin: 0 0 18px;
  border-bottom: 1px solid var(--line); }
.ops-tabs a { padding: 8px 13px; font-size: 13px; color: var(--muted);
  text-decoration: none; border: 1px solid transparent; border-bottom: none;
  border-radius: var(--radius-sm) var(--radius-sm) 0 0; margin-bottom: -1px; }
.ops-tabs a:hover { color: var(--ink); background: var(--panel-2); }
.ops-tabs a[aria-current] { color: var(--ink); font-weight: 650;
  background: var(--panel); border-color: var(--line); border-bottom: 1px solid var(--panel); }
@media (max-width: 700px) {
  .ops-tabs { gap: 0; }
  .ops-tabs a { padding: 7px 10px; font-size: 12.5px; }
}

/* ═══ LANDING: THE TICKER BOX ══════════════════════════════════════════════
   The product's verb, on the page. Every hero CTA used to point at /login, so
   the reward for being convinced was a form asking for an email and a password
   before the visitor had done anything. They now name the stock first, and the
   account stands between them and a report they have already asked for. */
.start-bar { display: flex; gap: 8px; margin: 32px 0 0; max-width: 460px; }
.start-bar .ticker-input { flex: 1; min-width: 0; font-size: 15px; }
.start-bar .btn { flex: none; white-space: nowrap; }
.start-sub { margin: 12px 0 0; }
.start-err { margin: 10px 0 0; max-width: 460px; }
.start-alt { justify-content: flex-start; margin-top: 14px; }
@media (max-width: 700px) {
  /* A wrapped primary button reads as a bug; stack instead of squeezing. */
  .start-bar { flex-direction: column; max-width: none; }
  .start-bar .btn { width: 100%; }
  .start-alt .btn { width: 100%; text-align: center; }
}

/* ═══ ACCOUNT: A DESKTOP LAYOUT, NOT A STRETCHED PHONE ═════════════════════
   This page was wrap_class="narrow" - a hard 470px cap at EVERY viewport - so
   on a 2000px screen nine cards queued down a phone-width column with the rest
   of the display empty beside them. Nine screens of scrolling to change one
   setting.
   The two layouts are now genuinely different compositions rather than one
   column at two sizes: the phone keeps a single stack (correct there - a
   column IS the right shape at 375px), and the desktop gets the plan card as a
   full-width headline with the settings flowing in two columns beneath it. */
.wrap.acct { max-width: 1080px; }

.acct-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
/* min-width:0 is load-bearing. A grid item defaults to min-width:auto, so it
   refuses to shrink below its content's min-content width - and the API card
   carries an unbroken run of /api/v1/... endpoints. At 375px that made the
   card 381px and pushed the whole page 22px sideways. Same family as the flex
   masthead overflow on the landing: auto minimums are the default, and they
   are almost never what a responsive layout wants. */
.acct-grid > section { margin: 0; min-width: 0; }   /* the grid owns the gaps */
.acct-grid > section :where(code, .mono, .kv dd) { overflow-wrap: anywhere; }

@media (min-width: 900px) {
  .acct-grid { grid-template-columns: 1fr 1fr; align-items: start; }
  /* Preferences carries the most fields of any card, so it spans rather than
     being squeezed into half a column. Targeted by its own id - no :has(),
     which would also match any ancestor that happens to contain it. */
  .acct-grid > section#prefs { grid-column: 1 / -1; }
}
@media (max-width: 899px) {
  .wrap.acct { max-width: 560px; }           /* comfortable reading measure */
}

/* ═══ LONG-FORM DOCUMENTS ══════════════════════════════════════════════════
   /terms and /privacy were wrap_class="narrow" - a 470px FORM width - so 757
   and 595 words of prose ran at ~51 characters per line across 29% of a
   1600px screen. Comfortable measure is 65-75 characters; below ~55 the eye
   returns too often and the page grows tall for no reason.
   The frame is wider than the text on purpose: headings and rules get the
   full width while the prose itself is capped in `ch`, which tracks the font
   rather than guessing at a pixel equivalent. */
.wrap.wrap-doc { max-width: 820px; }
.wrap-doc p, .wrap-doc li, .wrap-doc dd { max-width: 70ch; }
@media (max-width: 700px) {
  .wrap-doc p, .wrap-doc li, .wrap-doc dd { max-width: none; }
}

/* ═══ DESK PREVIEW: DIRECTION, IN COLOUR ═══════════════════════════════════
   Every preview row was the same muted grey, which buried the one thing a
   reader scans for - which way the money went. A call is not a put and a
   congressional sell is not a buy.
   Colour is reserved for genuine DIRECTION and nothing else: it never marks a
   row as merely important, and a dark-pool block that printed at the mid took
   no side, so it gets no chip. That restraint is what keeps the green and red
   meaning something when they do appear. Both also carry a WORD, so the
   signal survives colour-blindness and a black-and-white print. */
.dd-tag { flex: none; font-size: 9.5px; font-weight: 700; letter-spacing: .07em;
  padding: 2px 6px; border-radius: var(--radius-sm); border: 1px solid transparent;
  font-family: var(--mono); white-space: nowrap; }
.dd-tag.tone-bull { color: var(--green-ink); background: var(--green-soft);
  border-color: color-mix(in srgb, var(--green-ink) 26%, transparent); }
.dd-tag.tone-bear { color: var(--red-ink);   background: var(--red-soft);
  border-color: color-mix(in srgb, var(--red-ink) 26%, transparent); }
/* The detail lifts off pure muted so the row reads as data, not as a caption. */
.dd-line .dd-txt { color: var(--ink-2); }
@media (max-width: 700px) { .dd-tag { font-size: 9px; padding: 2px 5px; } }

/* ═══ SELECTED CALLS STRIP ═════════════════════════════════════════════════
   Sits directly under the hero: a visitor who never scrolls should still meet
   real output. Horizontal on desktop, swipeable on a phone - a vertical list
   here would push the rest of the page down for a section that is supporting
   evidence, not the pitch.
   Colour follows the MOVE, not the verdict. Green and red mean price direction
   in every finance UI a reader has met, so painting -26.5% green because the
   SELL was right fought that convention hard enough to just look broken. The
   verdict pill carries correctness instead: SELL next to a red number reads as
   a win at a glance. */
/* The strip sat 14px under the hero, so a row of eight dense cards read as
   part of the fold rather than as its own thing - which is most of what made
   the top feel crowded. It is now a separated band low in the first screen:
   still visible on load without scrolling (~75% down a 900px viewport), but
   with a rule and real space between it and the hero. The rule does more work
   here than the pixels do - it tells the eye where one idea ends. */
.calls-strip { margin: 40px 0 4px; padding-top: 26px; border-top: 1px solid var(--line); }
.calls-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin-bottom: 12px; }
.calls-head h2 { font-size: 17px; letter-spacing: -.01em; margin: 0; }
.calls-note { font-size: 11.5px; color: var(--muted); }

.calls-row { display: flex; gap: 10px; overflow-x: auto; padding-bottom: 4px;
  scrollbar-width: none; }
.calls-row::-webkit-scrollbar { display: none; }

.call-card { flex: none; width: 152px; display: flex; flex-direction: column;
  gap: 7px; padding: 12px 13px; text-decoration: none; color: inherit;
  background: var(--panel); border: 1px solid var(--line);
  border-top: 2px solid var(--line); border-radius: var(--radius); }
.call-card:hover { border-color: var(--rule, var(--line)); text-decoration: none; }
.call-card.is-up   { border-top-color: var(--green-ink); }
.call-card.is-down { border-top-color: var(--red-ink); }

.call-top { display: flex; align-items: center; gap: 7px; }
.call-top .tick { font-family: var(--mono); font-size: 13px; font-weight: 700; }
.call-move { font-family: var(--mono); font-size: 20px; font-weight: 700;
  letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
.call-card.is-up   .call-move { color: var(--green-ink); }
.call-card.is-down .call-move { color: var(--red-ink); }
.call-foot { display: flex; align-items: center; justify-content: space-between;
  gap: 8px; font-size: 11px; color: var(--muted); }
.call-go { color: var(--accent); font-weight: 600; }

@media (max-width: 700px) {
  /* On a phone the hero already fills the screen, so the strip is never in the
     first viewport anyway - it just needs the same separation, not the desktop
     run-up to it. */
  .calls-strip { margin-top: 24px; padding-top: 20px; }
  .call-card { width: 138px; padding: 11px; }
  .call-move { font-size: 18px; }
}

/* ═══ WHITEPAPER (/whitepaper) ════════════════════════════════════════════
   A document, not a landing page: one measure, a sticky contents rail, and
   numbered sections because the sections genuinely are a sequence. Tables
   carry the load - every appendix is a real artifact rendered as one - so they
   get tabular numerals and their own horizontal scroll container rather than
   being allowed to widen the page. */
/* minmax(0,1fr) + min-width:0, not `1fr`. A grid child defaults to
   min-width:auto and refuses to shrink below its min-content, and the
   min-content here is an appendix table full of white-space:nowrap numerics.
   Left as `1fr` the whole document measured 447px inside a 375px phone and the
   .wp-table-wrap scrollers never engaged, because the grid had widened to fit
   them rather than letting them scroll. */
.wp { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0; }
.wp > * { min-width: 0; }
.wp-mast { padding: 30px 0 26px; border-bottom: 1px solid var(--line); }
.wp-mast h1 { font-size: 38px; line-height: 1.1; letter-spacing: -.02em; margin: 8px 0 12px;
  text-wrap: balance; }
.wp-byline { font-size: 12.5px; color: var(--muted); margin: 0 0 20px; }
.wp-abstract { border-left: 2px solid var(--accent); padding: 2px 0 2px 16px; }
.wp-abstract p { font-size: 14.5px; line-height: 1.75; margin: 0; max-width: 74ch; }

.wp-toc { border-bottom: 1px solid var(--line); padding: 18px 0; }
.wp-toc-h { display: block; font-size: 9.5px; letter-spacing: .11em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; margin-bottom: 8px; }
.wp-toc ol { margin: 0; padding-left: 18px; font-size: 13px; line-height: 1.85; }
.wp-toc ol.wp-toc-alpha { list-style: upper-alpha; }
.wp-toc a { color: var(--ink-2); }
.wp-toc a:hover { color: var(--accent); }

.wp-body { padding-top: 8px; }
.wp-body section { padding: 30px 0; border-bottom: 1px solid var(--line); }
.wp-body section:last-of-type { border-bottom: 0; }
.wp-body h2 { font-size: 23px; letter-spacing: -.02em; margin: 0 0 14px; text-wrap: balance; }
.wp-n { font-family: var(--mono); font-size: 13px; font-weight: 700; color: var(--accent);
  margin-right: 10px; vertical-align: 2px; }
.wp-body h3 { font-size: 15px; margin: 24px 0 8px; letter-spacing: -.01em; }
.wp-body p { font-size: 14.5px; line-height: 1.75; max-width: 74ch; margin: 0 0 12px; }
.wp-claim { border-left: 2px solid var(--accent); padding-left: 14px; }
.wp-ul { margin: 0 0 12px; padding-left: 18px; font-size: 14.5px; line-height: 1.75; }
.wp-ul li { max-width: 72ch; margin-bottom: 7px; }

.wp-dl { margin: 4px 0 12px; }
.wp-dl dt { font-size: 14px; font-weight: 700; margin-top: 14px; }
.wp-dl dd { font-size: 14px; line-height: 1.7; color: var(--ink-2); margin: 3px 0 0;
  max-width: 72ch; padding-left: 14px; border-left: 1px solid var(--line); }

/* The pipeline board is a four-across diagram built for a 1400px page. The
   whitepaper's reading column is ~750px, and the board does not know that: its
   only stacking rule keys off VIEWPORT width, so on a desktop it kept four
   columns and squeezed them to ~175px - titles wrapped mid-phrase, the verdict
   pills burst out of the card border, and a third of the figure was dead space.
   Inside a document it takes the stacked form instead, which is the same
   layout phones already get and reads correctly as a top-to-bottom pipeline. */
.wp-fig { margin: 20px 0 6px; }
.wp-fig .pipe { grid-template-columns: 1fr; gap: 8px; }
.wp-fig .pipe-arrow { transform: rotate(90deg); text-align: center; padding: 0;
  line-height: 1; }
.wp-fig .pipe-col { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 8px; align-items: start; }
.wp-fig .pipe-col-h { grid-column: 1 / -1; margin-bottom: 0; }
.wp-fig .pipe-vs, .wp-fig .pipe-seats { grid-column: 1 / -1; }
.wp-fig figcaption { font-size: 12.5px; color: var(--muted); line-height: 1.6; margin-top: 12px;
  max-width: 74ch; }

.wp-table-wrap { overflow-x: auto; margin: 14px 0 12px; }
.wp-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.wp-table th { text-align: left; font-size: 9.5px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; padding: 0 14px 7px 0; border-bottom: 1px solid var(--line);
  white-space: nowrap; }
.wp-table td { padding: 9px 14px 9px 0; border-bottom: 1px solid var(--line);
  vertical-align: top; line-height: 1.55; color: var(--ink-2); }
.wp-table td:first-child { color: var(--ink); }
.wp-num td { font-variant-numeric: tabular-nums; white-space: nowrap; }
.wp-num td:first-child, .wp-num td:last-child { white-space: normal; }
.wp-table td.ok { color: var(--green-ink); font-weight: 600; }
.wp-table td.no { color: var(--red-ink); }

.wp-appx h2 { font-size: 19px; }
.wp-meta { font-size: 12px; color: var(--muted); line-height: 1.7; max-width: 74ch; }
.wp-meta code, .wp-note code { font-family: var(--mono); font-size: 11.5px; }
.wp-note { font-size: 13px; color: var(--muted); line-height: 1.7; max-width: 74ch; }

.wp-foot { padding: 26px 0 10px; border-top: 1px solid var(--line); }
.wp-foot p { font-size: 13px; line-height: 1.7; max-width: 74ch; }
.wp-cta { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 18px; }

/* Desktop: the contents rail sits beside the document instead of above it. */
@media (min-width: 1000px) {
  .wp { grid-template-columns: 200px minmax(0, 1fr); column-gap: 46px; }
  .wp-toc { min-width: 200px; }
  .wp-mast { grid-column: 1 / -1; }
  .wp-toc { position: sticky; top: 78px; align-self: start; border-bottom: 0;
    padding: 30px 0 0; max-height: calc(100vh - 100px); overflow-y: auto; }
  .wp-body { padding-top: 0; }
}
@media (max-width: 700px) {
  .wp-mast h1 { font-size: 27px; }
  .wp-body h2 { font-size: 20px; }
  .wp-body section { padding: 24px 0; }
}

/* ═══ RECYCLED CALL on the public company view ════════════════════════════
   A real analysis the desks already ran, reused instead of re-run. Styled as
   a note rather than a marketing card: the date and the age sit in the header
   because an undated call is the dishonest version of this feature. */
.rec-call { border-top: 2px solid var(--accent); }
.rec-head { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; padding-bottom: 10px; border-bottom: 1px solid var(--line); }
.rec-verdict { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin-top: 14px; }
.rec-tick { font-family: var(--mono); font-size: 26px; font-weight: 700;
  letter-spacing: -.01em; }
.rec-move { font-family: var(--mono); font-size: 15px; font-weight: 700;
  font-variant-numeric: tabular-nums; margin-left: auto; }
.rec-move.is-up { color: var(--green-ink); }
.rec-move.is-down { color: var(--red-ink); }
.rec-move .muted { font-family: var(--sans); font-weight: 400; margin-left: 4px; }
@media (max-width: 640px) { .rec-move { margin-left: 0; } }

/* Landing: who it is for, and the not-ready capture. */
.hero-who { font-size: 14px; color: var(--muted); margin: 0 0 4px;
  padding-left: 12px; border-left: 2px solid var(--line); }
.lead-cap { margin: 30px auto 0; max-width: 560px; text-align: center;
  padding-top: 24px; border-top: 1px solid var(--line); }
.lead-cap-h { font-size: 15px; font-weight: 700; margin: 0 0 4px; }
.lead-cap .start-bar { text-align: left; justify-content: center; }

/* Sign-in: Google is the visible path, email is a disclosure under it. */
.lm-email { margin-top: 16px; }
.lm-email > summary { cursor: pointer; list-style: none; font-size: 13px;
  color: var(--muted); padding: 8px 0; text-align: center; }
.lm-email > summary::-webkit-details-marker { display: none; }
.lm-email > summary::before { content: "▸ "; color: var(--accent); }
.lm-email[open] > summary::before { content: "▾ "; }
.lm-email > summary:hover { color: var(--accent); }

/* On a phone the "what you get" grid is the pipeline board again, in prose.
   Side by side on desktop they read as two different things - the process,
   then the deliverable - but stacked in one column the reader meets the four
   desks, the debate, the risk seats and the call twice in a row, which is
   what "it seems redundant" is describing. The board wins: it is the shorter
   of the two and every seat is a link. /agents stays reachable from those
   seat links, so nothing is stranded by hiding the section's CTA with it. */
@media (max-width: 700px) { .deliver-sec { display: none; } }

/* ═══ QUANT RESEARCH (/research/<ticker>) ═════════════════════════════════
   Five-factor card, peer ranking, desk call. Tabs are radio inputs + sibling
   selectors: the CSP is script-src 'self' with no inline script, and the panes
   must work before ui.js parses. */
.qtab-r { position: absolute; opacity: 0; pointer-events: none; }
.qtabs { display: flex; gap: 8px; flex-wrap: wrap; margin: 4px 0 16px; }
.qtab { cursor: pointer; font-size: 13.5px; font-weight: 600; padding: 8px 16px;
  border: 1px solid var(--line); border-radius: 999px; color: var(--ink-2);
  background: var(--bg); user-select: none; }
.qtab:hover { border-color: var(--accent); color: var(--ink); }
.qtab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.qpane { display: none; }
#qt-f:checked ~ .qtabs label[for="qt-f"],
#qt-p:checked ~ .qtabs label[for="qt-p"],
#qt-a:checked ~ .qtabs label[for="qt-a"] { background: var(--ink); color: var(--bg);
  border-color: var(--ink); }
#qt-f:checked ~ .qp-f, #qt-p:checked ~ .qp-p, #qt-a:checked ~ .qp-a { display: block; }

.qs-total { text-align: right; flex: none; }
.qs-total-n { font-family: var(--mono); font-size: 40px; font-weight: 700;
  line-height: 1; letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
.qs-total-l { font-size: 10px; letter-spacing: .11em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; margin-top: 4px; }
.qs-total-l span { margin-left: 4px; }

.qs-rows { display: flex; flex-direction: column; gap: 2px; }
.qs-row { display: flex; align-items: center; gap: 14px; padding: 9px 0; }
.qs-row.is-subject { background: var(--panel-2); border-radius: var(--radius);
  padding-left: 10px; padding-right: 10px; margin: 0 -10px; }
.qs-name { flex: none; width: 150px; font-size: 13.5px; font-weight: 600;
  display: flex; align-items: baseline; gap: 7px; }
.qs-basis { font-size: 9px; letter-spacing: .07em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; }
.qs-rank { flex: none; width: 34px; font-family: var(--mono); font-size: 12px; color: var(--muted); }
.qs-peer { flex: none; width: 74px; font-family: var(--mono); font-size: 13.5px; font-weight: 700; }
.qs-bar { flex: 1; min-width: 0; height: 9px; border-radius: 999px;
  background: var(--panel-2); overflow: hidden; }
.qs-fill { display: block; height: 100%; border-radius: 999px; }
.qs-n { flex: none; width: 42px; text-align: right; font-family: var(--mono);
  font-size: 14px; font-weight: 700; font-variant-numeric: tabular-nums; }
.qs-why { margin: -2px 0 8px 164px; font-size: 12px; color: var(--muted); line-height: 1.5; }

/* Three bands, not five. A finer scale invites over-reading a one-point gap in
   a number the page explicitly says is descriptive. */
.band-good { color: var(--green-ink); } .qs-fill.band-good { background: var(--green-ink); }
.band-mid  { color: var(--amber-ink, #b7791f); } .qs-fill.band-mid { background: var(--amber-ink, #b7791f); }
.band-weak { color: var(--red-ink); } .qs-fill.band-weak { background: var(--red-ink); }
.qs-fill.band-na { background: var(--line); }

.qa-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }

@media (max-width: 700px) {
  .qs-name { width: 108px; font-size: 12.5px; }
  .qs-why { margin-left: 0; }
  .qs-row { gap: 10px; }
  .qs-total-n { font-size: 32px; }
}

/* ═══ PIPELINE BOARD: THE STAGE WALK ══════════════════════════════════════
   Emphasis, never concealment. The inactive stages dim rather than hide, and
   the dim is mild (.52) because this is a marketing page a reader may be
   mid-sentence in - a stage that vanished would make the board unreadable at
   exactly the moment someone started paying attention. Hover, keyboard focus
   and prefers-reduced-motion all restore full strength; ui.js owns the rules
   for when. The column header is a link now, so it gets the same underline
   treatment the rest of the site gives its links only on hover. */
.pipe-col-h { display: block; text-decoration: none; }
a.pipe-col-h:hover { color: var(--accent); text-decoration: underline; }

.pipe.is-anim .pipe-col,
.pipe.is-anim .pipe-arrow { transition: opacity .5s ease; }
.pipe.is-anim .pipe-col { opacity: .52; }
.pipe.is-anim .pipe-col.is-on { opacity: 1; }
/* A finished stage stays legible - the pipeline ran through it, it did not
   fail. Halfway between the dim and full. */
.pipe.is-anim .pipe-col.is-done { opacity: .78; }

.pipe.is-anim .pipe-node,
.pipe.is-anim .pipe-seats { transition: border-color .4s ease, transform .4s ease; }
/* One node at a time: only the node holding the floor gets the accent and the
   2px lift - a larger move reads as a bug on a page full of straight edges.
   The whole-board beat (and any pause) lights everything at once. */
.pipe.is-anim .pipe-node.is-hot,
.pipe.is-anim .pipe-seats.is-hot { border-color: var(--accent); transform: translateY(-2px); }
.pipe.is-anim.is-whole .pipe-node, .pipe.is-anim.is-paused .pipe-node,
.pipe.is-anim.is-whole .pipe-seats, .pipe.is-anim.is-paused .pipe-seats { border-color: var(--accent); }
.pipe.is-anim .pipe-vs { transition: color .3s ease, opacity .3s ease; }
.pipe.is-anim .pipe-vs.is-on { color: var(--accent); }

.pipe.is-anim .pipe-arrow { opacity: .3; }
.pipe.is-anim .pipe-arrow.is-on { opacity: 1; }
.pipe.is-anim .pipe-arrow span { display: inline-block; transition: transform .45s ease; }
.pipe.is-anim .pipe-arrow.is-on span { transform: translateX(4px); }

/* The beat where the whole board is lit: the pipeline completed, everything on
   screen at once. Also the state every pause lands in. */
.pipe.is-anim.is-whole .pipe-col,
.pipe.is-anim.is-paused .pipe-col,
.pipe.is-anim.is-paused .pipe-arrow { opacity: 1; }
.pipe.is-anim.is-paused .pipe-node { transform: none; }

@media (prefers-reduced-motion: reduce) {
  /* Belt and braces: ui.js already refuses to start, but if the class is on
     the element from a cached render, nothing should move or dim. */
  .pipe.is-anim .pipe-col, .pipe.is-anim .pipe-arrow { opacity: 1 !important; }
  .pipe.is-anim .pipe-node { transform: none !important; transition: none !important; }
}

/* ═══ PORTFOLIO INTELLIGENCE ══════════════════════════════════════════════ */
#pt-u:checked ~ .qtabs label[for="pt-u"],
#pt-a:checked ~ .qtabs label[for="pt-a"],
#pt-i:checked ~ .qtabs label[for="pt-i"] { background: var(--ink); color: var(--bg);
  border-color: var(--ink); }
#pt-u:checked ~ .pp-u, #pt-a:checked ~ .pp-a, #pt-i:checked ~ .pp-i { display: block; }

.ins-list { display: flex; flex-direction: column; gap: 10px; }
.ins { border: 1px solid var(--line); border-left-width: 3px; border-radius: var(--radius);
  padding: 12px 14px; background: var(--bg); }
.ins-high { border-left-color: var(--red-ink); }
.ins-medium { border-left-color: var(--amber-ink); }
.ins-low { border-left-color: var(--green-ink); }
.ins-head { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; }
.ins-head b { font-size: 14px; }
.ins-tags { display: flex; gap: 6px; flex-wrap: wrap; }
.ins p { margin: 6px 0 0; font-size: 13px; color: var(--ink-2); line-height: 1.6; max-width: 70ch; }
.badge.sev-high { color: var(--red-ink); border-color: var(--red-ink); }
.badge.sev-medium { color: var(--amber-ink); border-color: var(--amber-ink); }

/* ═══ ANALYZER LAYOUT (portfolio intel + builder) ═════════════════════════
   Matched to the reference: underline tabs spanning the width, a 2x2 stat
   block, a divided factor strip, coloured allocation bars, a stacked holdings
   bar with a dot legend, and an SVG performance chart. */
.an-tabs { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
  border-bottom: 1px solid var(--line); margin: 6px 0 20px; }
.an-tab { cursor: pointer; text-align: center; padding: 12px 8px; font-size: 14px;
  font-weight: 600; color: var(--muted); border-bottom: 2px solid transparent;
  margin-bottom: -1px; user-select: none; }
.an-tab:hover { color: var(--ink); }
.an-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.an-pane { display: none; }
#pt-u:checked ~ .an-tabs label[for="pt-u"],
#pt-a:checked ~ .an-tabs label[for="pt-a"],
#pt-i:checked ~ .an-tabs label[for="pt-i"],
#bt-p:checked ~ .an-tabs label[for="bt-p"],
#bt-b:checked ~ .an-tabs label[for="bt-b"],
#bt-o:checked ~ .an-tabs label[for="bt-o"] { color: var(--ink); border-bottom-color: var(--ink); }
#pt-u:checked ~ .pp-u, #pt-a:checked ~ .pp-a, #pt-i:checked ~ .pp-i,
#bt-p:checked ~ .bb-p, #bt-b:checked ~ .bb-b, #bt-o:checked ~ .bb-o { display: block; }

.an-file { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--line); }
.an-file-n { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 14px; }
.an-tbl { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.an-tbl th { text-align: left; font-size: 9.5px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; padding: 12px 0 8px; }
.an-tbl th.num, .an-tbl td.num { text-align: right; }
.an-tbl td { padding: 11px 0; border-top: 1px solid var(--line-2); }
.an-sym { font-family: var(--mono); font-weight: 700; }
.an-w { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.an-w span, .an-row-v span { font-size: 10px; color: var(--muted); margin-left: 1px; }

.an-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.an-card { border: 1px solid var(--line); border-radius: var(--radius);
  padding: 14px 16px; background: var(--panel); }
.an-card-l { font-size: 12px; color: var(--muted); }
.an-card-v { font-size: 26px; font-weight: 700; letter-spacing: -.02em; margin-top: 4px;
  font-variant-numeric: tabular-nums; }
.an-card-v.up { color: var(--green-ink); } .an-card-v.down { color: var(--red-ink); }

.an-strip { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
  border: 1px solid var(--line); border-radius: var(--radius); margin-top: 16px;
  background: var(--panel); overflow: hidden; }
.an-cell { padding: 12px 10px; text-align: center; border-left: 1px solid var(--line); }
.an-cell:first-child { border-left: 0; }
.an-cell-l { font-size: 9.5px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); font-weight: 700; }
.an-cell-v { font-size: 24px; font-weight: 700; margin-top: 4px;
  font-variant-numeric: tabular-nums; }

.an-note { font-size: 12px; color: var(--muted); line-height: 1.65; margin: 10px 0 0;
  max-width: 76ch; }
.an-box { border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 18px;
  background: var(--panel); margin-top: 16px; }
.an-box-h { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 700;
  margin-bottom: 12px; }
.an-row { display: flex; align-items: center; gap: 14px; padding: 6px 0; }
.an-row-l { flex: none; width: 120px; font-size: 13px; }
.an-track { flex: 1; min-width: 0; height: 8px; border-radius: 999px; background: var(--panel-2); }
.an-track span { display: block; height: 100%; border-radius: 999px; }
.an-row-v { flex: none; width: 54px; text-align: right; font-family: var(--mono);
  font-size: 12.5px; font-variant-numeric: tabular-nums; }

.an-stack { display: flex; height: 10px; border-radius: 999px; overflow: hidden;
  background: var(--panel-2); }
.an-stack span { display: block; height: 100%; }
.an-legend { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 14px; }
.an-leg { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--ink-2); }
.an-leg i { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.an-leg b { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.an-key-p { background: var(--ink); }
.an-key-b { background: var(--muted); }

.an-chart { width: 100%; height: 140px; display: block; }
.an-line { fill: none; vector-effect: non-scaling-stroke; }
.an-port { stroke: var(--ink); stroke-width: 2; }
.an-bench { stroke: var(--muted); stroke-width: 1.5; stroke-dasharray: 4 3; }

.an-ins-head { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.an-found { font-size: 12.5px; color: var(--green-ink); font-weight: 600; }
.an-ins { border: 1px solid var(--line); border-radius: var(--radius); padding: 14px 16px;
  background: var(--panel); margin-bottom: 10px; }
.an-ins-top { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; }
.an-ins-top b { font-size: 14px; }
.an-ins p { margin: 6px 0 0; font-size: 13px; color: var(--muted); line-height: 1.6; max-width: 72ch; }
.an-pills { display: flex; gap: 6px; flex-wrap: wrap; }
.an-pill { font-size: 10.5px; font-weight: 700; padding: 3px 9px; border-radius: 999px;
  background: var(--panel-2); color: var(--muted); }
.an-pill.sev-high { background: rgba(190,60,50,.14); color: var(--red-ink); }
.an-pill.sev-medium { background: rgba(180,130,30,.16); color: var(--amber-ink); }
.an-pill.sev-low { background: rgba(50,150,90,.14); color: var(--green-ink); }

@media (max-width: 760px) {
  .an-cards { grid-template-columns: 1fr; }
  .an-strip { grid-auto-flow: row; grid-auto-columns: auto; }
  .an-cell { border-left: 0; border-top: 1px solid var(--line); display: flex;
    align-items: baseline; justify-content: space-between; text-align: left; }
  .an-cell:first-child { border-top: 0; }
  .an-cell-v { margin-top: 0; font-size: 20px; }
  .an-row-l { width: 92px; font-size: 12px; }
  .an-tab { font-size: 13px; padding: 11px 4px; }
}

/* Builder: prompt box + the working. */
.bp-prompt { width: 100%; font-size: 15px; line-height: 1.6; padding: 14px 16px;
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
  color: var(--ink); font-family: var(--sans); resize: vertical; }
.bp-prompt:focus { outline: 2px solid var(--accent); outline-offset: -1px; }
.bp-steps { display: flex; flex-direction: column; gap: 12px; }
.bp-step { display: flex; gap: 12px; align-items: flex-start; }
.bp-tick { flex: none; width: 20px; height: 20px; border-radius: 50%; background: var(--panel-2);
  color: var(--green-ink); font-size: 11px; font-weight: 700; display: flex;
  align-items: center; justify-content: center; margin-top: 1px; }
.bp-step b { display: block; font-size: 13.5px; }
.bp-step span { display: block; font-size: 12.5px; color: var(--muted); margin-top: 2px; }

/* ── Research insights (/insights) ─────────────────────────────────────
   Index cards, then the article. Kind colours are assigned by INDEX, not
   cycled per card, so a note keeps its colour as the list grows. */
.ins-filter { display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 18px; }
.ins-chip { cursor: pointer; font-size: 12.5px; font-weight: 600; padding: 6px 13px;
  border: 1px solid var(--line); border-radius: 999px; color: var(--muted);
  background: var(--panel); }
.ins-chip:hover { color: var(--ink); border-color: var(--accent); }
.ins-chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
#ik-all:checked ~ .ins-filter label[for="ik-all"],
#ik-1:checked ~ .ins-filter label[for="ik-1"],
#ik-2:checked ~ .ins-filter label[for="ik-2"],
#ik-3:checked ~ .ins-filter label[for="ik-3"],
#ik-4:checked ~ .ins-filter label[for="ik-4"] {
  background: var(--ink); color: var(--bg); border-color: var(--ink); }
#ik-1:checked ~ .ins-grid .ins-card:not(.kind-1),
#ik-2:checked ~ .ins-grid .ins-card:not(.kind-2),
#ik-3:checked ~ .ins-grid .ins-card:not(.kind-3),
#ik-4:checked ~ .ins-grid .ins-card:not(.kind-4) { display: none; }

.ins-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); }
.ins-card { border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
  overflow: hidden; transition: border-color .14s ease, transform .14s ease; }
.ins-card:hover { border-color: var(--accent); transform: translateY(-2px); }
.ins-card-a { display: block; padding: 18px; color: inherit; text-decoration: none; }
.ins-card h2 { font-size: 17px; line-height: 1.32; margin: 10px 0 0; text-wrap: balance; }
.ins-card p { font-size: 13px; color: var(--muted); line-height: 1.6; margin: 8px 0 0;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.ins-meta { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; font-size: 11.5px; }
.ins-kind { font-size: 10px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  padding: 4px 9px; border-radius: 4px; background: var(--panel-2); color: var(--muted); }
.ins-kind.kk-1 { background: rgba(76,141,217,.15); color: #4c8dd9; }
.ins-kind.kk-2 { background: rgba(209,88,79,.15); color: var(--red-ink); }
.ins-kind.kk-3 { background: rgba(63,169,107,.15); color: var(--green-ink); }
.ins-kind.kk-4 { background: rgba(143,111,214,.16); color: #8f6fd6; }
.ins-tags { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 13px; }
.ins-tick, .ins-tag { font-size: 10.5px; font-weight: 700; padding: 3px 8px; border-radius: 4px;
  background: var(--panel-2); color: var(--ink); text-decoration: none;
  font-family: var(--mono, ui-monospace, monospace); }
.ins-tag { font-family: inherit; font-weight: 600; color: var(--muted); }
a.ins-tick:hover { color: var(--accent); }

/* ── The article ───────────────────────────────────────────────────── */
.ia-head { border-bottom: 1px solid var(--line); padding-bottom: 20px; margin-bottom: 22px; }
.ia-head h1 { font-size: clamp(26px, 3.4vw, 36px); line-height: 1.18; margin: 12px 0 0;
  text-wrap: balance; }
.ia-dek { font-size: 16.5px; line-height: 1.62; color: var(--muted); margin: 12px 0 0;
  max-width: 62ch; }
.ia-metrics { display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden; margin-bottom: 24px;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.ia-metric { background: var(--panel); padding: 14px 16px; min-width: 0; }
.ia-metric-l { font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); }
.ia-metric-v { font-size: 19px; font-weight: 700; margin-top: 5px; font-variant-numeric: tabular-nums;
  line-height: 1.25; overflow-wrap: anywhere; }
.ia-metric-v.dir-up { color: var(--green-ink); }
.ia-metric-v.dir-down { color: var(--red-ink); }

.ia-toc { border-left: 2px solid var(--accent); padding: 2px 0 2px 16px; margin: 0 0 26px; }
.ia-toc-h { font-size: 10.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--muted); margin-bottom: 8px; }
.ia-toc ol { margin: 0; padding-left: 18px; }
.ia-toc li { font-size: 13.5px; line-height: 1.85; }
.ia-toc a { color: var(--ink); text-decoration: none; }
.ia-toc a:hover { color: var(--accent); }

.ia-sec { margin-bottom: 30px; scroll-margin-top: 76px; }
.ia-sec h2 { font-size: 21px; line-height: 1.3; margin: 0 0 12px; display: flex; gap: 12px;
  align-items: baseline; text-wrap: balance; }
.ia-num { flex: none; font-size: 12.5px; font-weight: 700; color: var(--accent);
  font-variant-numeric: tabular-nums; }
.ia-sec h3 { font-size: 15px; margin: 22px 0 8px; color: var(--ink); }
.ia-sec p { font-size: 15.5px; line-height: 1.72; margin: 0 0 14px; max-width: 68ch; }
.ia-sec ul { margin: 0; padding-left: 20px; }
.ia-sec li { font-size: 15px; line-height: 1.68; margin-bottom: 9px; max-width: 66ch; }
.ia-unknown { border: 1px solid var(--line); border-left: 3px solid var(--amber-ink);
  border-radius: var(--radius); padding: 18px 20px; background: var(--panel); }
.ia-unknown h2 { font-size: 17px; }
.ia-ev { margin: 0; padding-left: 20px; }
.ia-ev li { font-size: 13px; line-height: 1.6; color: var(--muted); margin-bottom: 7px; }
.ia-fig { margin: 0 0 30px; }
.ia-fig figcaption { font-size: 12px; color: var(--muted); margin-top: 10px; line-height: 1.6; }
.ia-more { border-top: 1px solid var(--line); padding-top: 18px; margin-top: 6px; }
.ia-more-r { display: flex; justify-content: space-between; gap: 14px; padding: 11px 0;
  border-top: 1px solid var(--line-2); color: inherit; text-decoration: none; font-size: 14px;
  align-items: baseline; }
.ia-more-r:first-of-type { border-top: 0; }
.ia-more-r:hover b { color: var(--accent); }
.ia-more-r span { flex: none; font-size: 11.5px; }
@media (max-width: 640px) {
  .ia-sec p { font-size: 15px; }
  .ia-more-r { flex-direction: column; gap: 3px; }
}

/* ── Macro tabs ─────────────────────────────────────────────────────────── */
#mt-b:checked ~ .mp-b, #mt-n:checked ~ .mp-n, #mt-w:checked ~ .mp-w { display: block; }
#mt-b:checked ~ .an-tabs label[for="mt-b"],
#mt-n:checked ~ .an-tabs label[for="mt-n"],
#mt-w:checked ~ .an-tabs label[for="mt-w"] {
  color: var(--ink); border-bottom-color: var(--accent); }

/* ── World risk ─────────────────────────────────────────────────────────── */
.wr-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px;
  flex-wrap: wrap; margin-bottom: 12px; }
.wr-stats { display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden; margin-bottom: 16px;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.wr-stat { background: var(--panel); padding: 13px 15px; min-width: 0; }
.wr-stat-l { font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); }
.wr-stat-v { font-size: 22px; font-weight: 700; margin-top: 4px; font-variant-numeric: tabular-nums; }
.wr-stat-v.up { color: var(--green-ink); }

.wr-map-wrap { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
  margin-bottom: 18px; background: #0e1116; }
.wr-map { height: 430px; width: 100%; }
.wr-legend { display: flex; gap: 16px; flex-wrap: wrap; padding: 10px 14px;
  border-top: 1px solid var(--line); background: var(--panel); }
.wr-leg { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--muted); }
.wr-leg i { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.wr-leg i.sev-high { background: #d1584f; }
.wr-leg i.sev-medium { background: #d9a13f; }
.wr-leg i.sev-low { background: #4c8dd9; }
.wr-leg i.wr-site { background: #5b6472; }
.wr-leg i.wr-lane { background: transparent; border: 1.5px dashed #8a949e; }

.wr-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex: none; }
.wr-dot.sev-high { background: #d1584f; }
.wr-dot.sev-medium { background: #d9a13f; }
.wr-dot.sev-low { background: #4c8dd9; }
.wr-dot.sev-off { background: var(--line); }

.wr-mine { border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: var(--radius); background: var(--panel); padding: 14px 16px; margin-bottom: 16px; }
.wr-mine-r { display: flex; align-items: center; gap: 9px; padding: 7px 0; font-size: 13.5px;
  color: inherit; text-decoration: none; border-top: 1px solid var(--line-2); flex-wrap: wrap; }
.wr-mine-r:first-of-type { border-top: 0; }
.wr-mine-r:hover b { color: var(--accent); }
.wr-mine-r .muted { font-size: 12.5px; }

.wr-lane-r { display: flex; align-items: center; gap: 9px; padding: 9px 0; font-size: 13.5px;
  border-top: 1px solid var(--line-2); flex-wrap: wrap; }
.wr-lane-r:first-of-type { border-top: 0; }
.wr-src { list-style: none; margin: 0; padding: 0; }
.wr-src li { display: flex; align-items: center; gap: 9px; padding: 7px 0; font-size: 13px;
  border-top: 1px solid var(--line-2); flex-wrap: wrap; }
.wr-src li:first-child { border-top: 0; }

/* Leaflet popup, in our tokens rather than its defaults. */
.wr-pop { font-size: 12.5px; line-height: 1.6; }
.wr-pop b { font-family: var(--mono); font-size: 13px; }
.wr-pop-s { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; }
.wr-pop-k { color: #6b7280; font-size: 11.5px; }
.wr-pop a { display: inline-block; margin-top: 6px; font-weight: 600; }
@media (max-width: 640px) { .wr-map { height: 320px; } }

/* ── Armed conflict ─────────────────────────────────────────────────────── */
.wr-war { margin-bottom: 8px; }
.wr-war-h { display: flex; justify-content: space-between; align-items: baseline; gap: 14px;
  flex-wrap: wrap; margin-bottom: 6px; }
.wr-yours { border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: var(--radius); background: var(--panel); padding: 12px 14px; margin-bottom: 14px;
  font-size: 13.5px; display: flex; gap: 10px; flex-wrap: wrap; align-items: baseline; }
.wr-yours-r { font-family: var(--mono); font-weight: 700; font-size: 12.5px; }
.wr-yours-r .muted { font-family: inherit; font-weight: 400; }

.wr-theatres { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }
.wr-th { border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel);
  padding: 14px 16px; min-width: 0; }
/* Quiet theatres stay on the board but recede - a standing risk that vanishes
   on a slow news week is exactly the wrong behaviour, and one that shouts on
   a slow week is just as wrong. */
.wr-th.lvl-quiet { opacity: .55; }
.wr-th.lvl-high { border-left: 3px solid var(--red-ink); }
.wr-th.lvl-medium { border-left: 3px solid var(--amber-ink); }
.wr-th-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.wr-th-top b { font-size: 14px; }
.wr-th-lvl { margin-left: auto; font-size: 9.5px; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted); }
.wr-th-p { font-size: 12.5px; line-height: 1.62; color: var(--muted); margin: 8px 0 0; }
.wr-th-t { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 11px; }
.wr-th-t a { font-family: var(--mono); font-size: 10.5px; font-weight: 700; padding: 3px 7px;
  border-radius: 4px; background: var(--panel-2); color: var(--ink); text-decoration: none; }
.wr-th-t a:hover { color: var(--accent); }
.wr-th-ev { margin-top: 11px; padding-top: 10px; border-top: 1px solid var(--line-2);
  font-size: 11.5px; line-height: 1.7; color: var(--ink-2); }

/* Factor appendix: a third verdict class. "Real but uneconomic" is neither a
   pass nor a rejection - the signal is there and the cost eats it - and
   collapsing it into either colour loses the whole point of the cost gate. */
.wp-table td.warn { color: var(--amber-ink); font-weight: 600; }
.wp-h3 { font-size: 15px; margin: 26px 0 8px; }

/* ── World-risk globe ───────────────────────────────────────────────────
   Replaces the flat map. Sits on a dark plate in both themes: a lit sphere
   on a pale page looks like a sticker, and the data points need a dark
   ground to read against. */
.wr-globe { width: 100%; min-height: 360px; display: flex; align-items: center;
  justify-content: center; background: radial-gradient(ellipse at 50% 40%,
    #171b23 0%, #0d1015 70%); cursor: grab; }
.wr-globe:active { cursor: grabbing; }
.wr-globe canvas { display: block; }
.wr-globe.is-loading::after { content: "Loading the globe…"; color: var(--muted);
  font-size: 12.5px; padding: 160px 0; }
.wr-globe.is-dead::after { content: "The globe could not load - the tables below carry the same data.";
  color: var(--muted); font-size: 12.5px; padding: 160px 20px; text-align: center; }
.wr-leg-btn { margin-left: auto; background: none; border: 1px solid var(--line);
  border-radius: var(--radius); color: var(--muted); font-size: 11px; font-weight: 600;
  padding: 4px 10px; cursor: pointer; font-family: inherit; }
.wr-leg-btn:hover { color: var(--ink); border-color: var(--accent); }
.wr-leg-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* globe.gl injects the label as raw HTML into its own floating div. */
.wg-tip { font-size: 12px; line-height: 1.55; background: var(--panel);
  border: 1px solid var(--line); border-radius: var(--radius); padding: 8px 11px;
  color: var(--ink); max-width: 260px; box-shadow: 0 4px 18px rgba(0,0,0,.28); }
.wg-tip b { font-family: var(--mono); font-size: 12.5px; }
.wg-tip i { font-style: normal; font-size: 10.5px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .04em; }
.wg-tip-k { color: var(--muted); font-size: 11px; margin-top: 2px; }

/* ── Supply-chain bottlenecks ───────────────────────────────────────────── */
.bn-layer { border-top: 1px solid var(--line-2); padding: 13px 0; }
.bn-layer:first-of-type { border-top: 0; }
.bn-layer.is-priced { opacity: .72; }
.bn-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.bn-n { font-family: var(--mono); font-size: 10.5px; font-weight: 700; color: var(--accent);
  border: 1px solid var(--line); border-radius: var(--radius); padding: 2px 6px; flex: none; }
.bn-thin { flex: 1; min-width: 70px; max-width: 160px; height: 4px; background: var(--panel-2);
  border-radius: 999px; overflow: hidden; }
.bn-thin i { display: block; height: 100%; background: var(--accent); }
.bn-why { font-size: 13px; color: var(--muted); line-height: 1.6; margin: 7px 0 0; max-width: 72ch; }
.bn-foot { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 9px; align-items: center; }
.bn-risk { display: flex; align-items: center; gap: 8px; margin-top: 8px; font-size: 12.5px;
  border-left: 2px solid var(--red-ink); padding-left: 10px; flex-wrap: wrap; }

/* ── Thesis drift on re-runs ────────────────────────────────────────────── */
.dr-box { margin-top: 12px; border: 1px solid var(--line); border-left: 3px solid var(--line);
  border-radius: var(--radius); padding: 11px 14px; background: var(--panel-2); }
.dr-box.dr-drift { border-left-color: var(--amber-ink); }
.dr-box.dr-price-only { border-left-color: var(--accent); }
.dr-box.dr-restated, .dr-box.dr-recited, .dr-box.dr-reargued { border-left-color: var(--green-ink); }
.dr-head { display: flex; gap: 9px; align-items: baseline; flex-wrap: wrap; font-size: 13.5px; }
.dr-tag { font-size: 10px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--muted); border: 1px solid var(--line); border-radius: 4px; padding: 2px 7px;
  flex: none; }
.dr-facts { margin: 9px 0 0; padding-left: 18px; }
.dr-facts li { font-size: 13px; line-height: 1.6; margin-bottom: 4px; }
.dr-note { font-size: 11.5px; color: var(--muted); line-height: 1.6; margin: 8px 0 0; }

/* ── Fallback candle chart (lightweight-charts) ─────────────────────────── */
.lw-wrap[hidden] { display: none; }
.lw-chart { width: 100%; min-height: 380px; }
.lw-chart.is-loading::after { content: "Loading the chart…"; display: block; padding: 170px 0;
  text-align: center; color: var(--muted); font-size: 12.5px; }
.lw-chart.is-dead::after { content: "We don't hold bars for this name - the full chart is above.";
  display: block; padding: 170px 20px; text-align: center; color: var(--muted); font-size: 12.5px; }
.lw-foot { font-size: 11.5px; color: var(--muted); line-height: 1.6; margin: 8px 0 0; }
.lw-toggle { display: block; margin: 8px 0 0; background: none; border: 0; padding: 0;
  color: var(--muted); font-size: 11.5px; font-family: inherit; cursor: pointer;
  text-decoration: underline; text-underline-offset: 2px; }
.lw-toggle:hover { color: var(--accent); }
.lw-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ── Globe detail panel ─────────────────────────────────────────────────
   Side-by-side on desktop; the panel drops under the globe on narrow
   screens rather than squeezing the sphere into a stripe. */
.wr-stage { display: grid; grid-template-columns: 1fr; }
.wr-stage:has(.wg-detail:not([hidden])) { grid-template-columns: minmax(0, 1fr) 330px; }
.wg-detail { position: relative; border-left: 1px solid var(--line); background: var(--panel);
  padding: 16px 18px 18px; max-height: 520px; overflow-y: auto; font-size: 13px; }
.wg-detail[hidden] { display: none; }
.wg-detail h3 { font-size: 15.5px; line-height: 1.3; margin: 4px 0 0; padding-right: 22px;
  text-wrap: balance; }
.wg-detail p { font-size: 12.5px; line-height: 1.62; color: var(--muted); margin: 6px 0 0; }
.wg-d-kind { font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--accent); }
.wg-d-h { font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); margin: 15px 0 6px; border-top: 1px solid var(--line-2); padding-top: 11px; }
.wg-d-x { position: absolute; top: 10px; right: 10px; background: none; border: 0; cursor: pointer;
  color: var(--muted); font-size: 19px; line-height: 1; padding: 2px 6px; font-family: inherit; }
.wg-d-x:hover { color: var(--ink); }
.wg-d-x:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.wg-pills { margin-top: 8px; }
.wg-row { display: flex; justify-content: space-between; gap: 12px; padding: 5px 0;
  border-top: 1px solid var(--line-2); font-size: 12.5px; }
.wg-row:first-of-type { border-top: 0; margin-top: 8px; }
.wg-row span { color: var(--muted); }
.wg-row b { font-variant-numeric: tabular-nums; }
.wg-story { font-size: 12.5px; line-height: 1.55; padding: 5px 0; border-top: 1px solid var(--line-2); }
.wg-story:first-of-type { border-top: 0; }
.wg-tk { display: flex; gap: 5px; flex-wrap: wrap; }
.wg-d-note { font-size: 11.5px; color: var(--muted); line-height: 1.6; margin-top: 12px;
  border-top: 1px solid var(--line-2); padding-top: 9px; }
.wg-d-cta { display: flex; gap: 7px; flex-wrap: wrap; margin-top: 14px; }
.wg-d-cta .btn { font-size: 12px; padding: 6px 12px; }
@media (max-width: 860px) {
  .wr-stage:has(.wg-detail:not([hidden])) { grid-template-columns: 1fr; }
  .wg-detail { border-left: 0; border-top: 1px solid var(--line); max-height: 380px; }
}

/* ── Macro brief strip on Today ─────────────────────────────────────────
   Deliberately quieter than the name rows below it: context, not a signal. */
.tb-card { border-left: 3px solid var(--accent); margin-bottom: 18px; }
.tb-head { display: flex; justify-content: space-between; align-items: baseline; gap: 14px;
  flex-wrap: wrap; }
.tb-stale { color: var(--amber-ink); font-weight: 700; }
.tb-regime { font-size: 15px; line-height: 1.6; margin: 9px 0 0; max-width: 78ch; }
.tb-risks { margin-top: 14px; border-top: 1px solid var(--line-2); padding-top: 4px; }
.tb-risk { display: flex; gap: 10px; padding: 8px 0; border-top: 1px solid var(--line-2);
  font-size: 13px; line-height: 1.55; }
.tb-risk:first-child { border-top: 0; }
.tb-risk span:last-child { color: var(--muted); }
.tb-n { flex: none; width: 18px; height: 18px; border-radius: 50%; background: var(--panel-2);
  color: var(--muted); font-size: 10.5px; font-weight: 700; display: flex; align-items: center;
  justify-content: center; margin-top: 1px; font-variant-numeric: tabular-nums; }
.tb-foot { margin: 13px 0 0; font-size: 12.5px; }
.tb-tag { display: inline-block; font-size: 9.5px; font-weight: 700; letter-spacing: .07em;
  text-transform: uppercase; color: var(--amber-ink); border: 1px solid var(--line);
  border-radius: 4px; padding: 1px 6px; vertical-align: 2px; white-space: nowrap; }

/* Tools sit above desks on the index and read slightly warmer - you act on
   them, rather than watching them. */
.dk-note { font-size: 11.5px; font-weight: 400; color: var(--muted);
  letter-spacing: 0; text-transform: none; }
.dk-sub { font-size: 11px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); margin: 14px 0 8px; }
.dk-card.dk-tool { border-left: 2px solid var(--accent); }

/* ── Actionable insights block on reports ───────────────────────────────
   Horizon pill left, observation + implication right. Sits between the
   metric strip and the TOC - the skimmer's layer. */
.ia-act { border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: var(--radius); background: var(--panel); padding: 16px 18px;
  margin: 0 0 26px; }
.ia-act-note { font-size: 11.5px; color: var(--muted); margin: 4px 0 6px; line-height: 1.5; }
.ia-act-r { display: flex; gap: 12px; padding: 10px 0; border-top: 1px solid var(--line-2);
  align-items: flex-start; }
.ia-act-r:first-of-type { border-top: 0; }
.ia-act-h { flex: none; font-size: 10px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--accent); border: 1px solid var(--line);
  border-radius: 999px; padding: 3px 10px; margin-top: 2px; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.ia-act-b { font-size: 13.5px; line-height: 1.6; min-width: 0; }
.ia-act-i { display: block; color: var(--muted); font-size: 12.5px; margin-top: 2px; }
@media (max-width: 560px) { .ia-act-r { flex-direction: column; gap: 5px; } }

/* ── newsletter partner pages (/partners/<slug>) ────────────────────────── */
.pw-hero { padding: 26px 0 18px; }
.pw-hero h1 { margin: 6px 0 10px; font-size: 32px; letter-spacing: -0.5px; }
.pw-sub { max-width: 680px; margin: 0; color: var(--muted); font-size: 15px; }
.pw-note { max-width: 680px; margin: 12px 0 0; padding: 10px 14px; font-size: 13px;
           color: var(--muted); border: 1px dashed var(--line); border-radius: 8px; }
.pw-snippet { margin: 12px 0 16px; padding: 12px 14px; overflow-x: auto;
              background: var(--bg-2, var(--bg)); border: 1px solid var(--line);
              border-radius: 8px; font-size: 12.5px; line-height: 1.55; }
.pw-embed-frame { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
.pw-embed-frame iframe { display: block; }

/* verified source headline under conflict rows (macro tab + globe panel) */
.wg-hl { color: var(--muted); font-size: 12px; font-style: italic; margin-top: 2px; }

/* annual anchor: the crossed-out monthly price beside the annual per-month */
.price-was { color: var(--muted); font-size: 20px; font-weight: 400; margin-right: 4px; }

/* ── engine throughput strip (landing) - counted, never claimed ─────────── */
.eng-strip { display: flex; flex-wrap: wrap; gap: 10px 34px; align-items: baseline;
             padding: 20px 24px; margin: 26px 0; border-top: 1px solid var(--line);
             border-bottom: 1px solid var(--line); }
.eng-stat { display: flex; flex-direction: column; }
.eng-n { font-family: var(--mono); font-size: 26px; font-weight: 700; color: var(--ink);
         font-variant-numeric: tabular-nums; letter-spacing: -0.5px; }
.eng-l { font-size: 12px; color: var(--muted); margin-top: 2px; max-width: 150px; }
.eng-cap { flex-basis: 100%; font-size: 11.5px; color: var(--faint); margin-top: 6px; }
@media (max-width: 700px) { .eng-strip { gap: 12px 22px; } .eng-n { font-size: 21px; } }

/* ── dashboard: the terminal grid ────────────────────────────────────────
   Command bar on top (the page's one action, quota where a margin readout
   would sit), then work surface left / intelligence rail right. Scoped to
   .page-dashboard so no other page moves. */
.page-dashboard .dz { display: grid; grid-template-columns: minmax(0, 1fr) 344px;
  gap: 14px; align-items: start; }
.page-dashboard .dz-rail { display: flex; flex-direction: column; gap: 14px;
  position: sticky; top: 70px; }
@media (max-width: 1100px) {
  .page-dashboard .dz { grid-template-columns: 1fr; }
  .page-dashboard .dz-rail { position: static; }
}

.dz-cmd { padding: 13px 18px; margin-bottom: 14px; }
.dz-cmd-row { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }
.dz-title { font-size: 19px; margin: 0; white-space: nowrap;
  display: inline-flex; align-items: center; gap: 10px; }
.dz-lit { font-size: 11px; font-weight: 700; letter-spacing: .4px;
  font-family: var(--mono); color: var(--accent); background: var(--accent-soft);
  border: 1px solid var(--accent); border-radius: var(--radius);
  padding: 2px 7px; line-height: 1.4; }
.dz-analyze { flex: 0 1 430px; margin: 0; }
.dz-analyze .ticker-input { flex: 1 1 auto; min-width: 0; }
.dz-note { flex: 1 1 300px; margin: 0; }
.dz-quota { margin-left: auto; font-family: var(--mono); font-size: 19px;
  font-weight: 700; color: var(--ink); white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.dz-quota-of { font-size: 13px; font-weight: 400; color: var(--muted); }
.dz-quota-l { font-family: var(--sans); font-size: 12px; font-weight: 400;
  color: var(--muted); margin-left: 5px; }
.dz-alt { margin: 10px 0 0; }

.dz-rcard { padding: 12px 14px; }
.dz-rhead { display: flex; align-items: baseline; justify-content: space-between;
  gap: 8px; font-size: 11px; font-weight: 700; letter-spacing: 1px;
  text-transform: uppercase; color: var(--muted);
  padding-bottom: 8px; margin-bottom: 4px; border-bottom: 1px solid var(--line); }
.dz-rhead a { font-size: 12px; font-weight: 400; letter-spacing: 0;
  text-transform: none; }
.dz-rcard .mt-row, .dz-rcard .dg-row { padding-left: 0; padding-right: 0; }
.dz-recents { display: flex; flex-direction: column; }
.dz-rec { display: flex; align-items: center; gap: 8px; padding: 7px 0;
  border-top: 1px solid var(--line-2); text-decoration: none; color: inherit; }
.dz-rec:first-child { border-top: 0; }
.dz-rec-t { margin-left: auto; white-space: nowrap; }
.dz-rec:hover .tick { color: var(--accent); }

/* rail variants: doorway rows may wrap - an ellipsis in a 340px rail hides
   the one line the row exists to deliver */
.dz-rcard .dg-text, .dz-rcard .mt-why { white-space: normal; overflow: visible;
  text-overflow: clip; line-height: 1.45; }
.dz-rcard .dg-row, .dz-rcard .mt-row { align-items: flex-start; }
.dz-rcard .dg-row { padding-top: 8px; padding-bottom: 8px; }

/* ── dashboard extras ────────────────────────────────────────────────────── */
/* the tape */
.dz-tape { display: inline-flex; align-items: baseline; gap: 8px 16px;
  flex: 1 1 auto; min-width: 0; flex-wrap: wrap; justify-content: flex-end;
  font-family: var(--mono); font-size: 12.5px;
  font-variant-numeric: tabular-nums; color: var(--ink-2); }
.dz-tk b { font-weight: 700; color: var(--muted); margin-right: 4px;
  font-family: var(--sans); font-size: 11px; letter-spacing: .4px;
  text-transform: uppercase; }
.dz-tk i { font-style: normal; margin-left: 4px; }
.dz-tape .pos { color: var(--green-ink); }
.dz-tape .neg { color: var(--red-ink); }
.dz-sess { font-family: var(--sans); font-size: 11.5px; color: var(--muted); }
.dz-sess.is-open { color: var(--green-ink); font-weight: 700; }
.dz-reg { font-family: var(--sans); font-size: 11.5px; color: var(--accent);
  text-decoration: none; border-bottom: 1px dotted var(--accent); }

/* earnings ribbon */
.dz-earn { display: flex; align-items: baseline; gap: 8px 16px; flex-wrap: wrap;
  padding: 9px 14px; margin-bottom: 14px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--panel); font-size: 13px; }
.dz-earn > b { font-size: 11px; letter-spacing: .6px; text-transform: uppercase;
  color: var(--muted); }
.dz-earn-i { white-space: nowrap; }
.dz-earn-all { margin-left: auto; }

/* watchlist row: spark + since-call */
.wl-spark { flex: 0 0 auto; align-self: center; opacity: .9; }
.wl-since { font-size: 12.5px; text-decoration: none; border: 1px solid var(--line);
  border-radius: var(--radius); padding: 1px 7px; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.wl-since.pos { color: var(--green-ink); border-color: var(--green); }
.wl-since.neg { color: var(--red-ink); border-color: var(--red); }
.wl-since:hover { border-color: var(--accent); color: var(--accent); }

/* alerts rail rows */
.dz-al-t { flex: 1; min-width: 0; color: var(--ink-2); line-height: 1.4; }

/* density toggle */
.hv-head { display: flex; align-items: center; }
.dz-dense-btn { margin-left: auto; font-size: 11px; letter-spacing: .5px;
  text-transform: uppercase; color: var(--muted); background: none;
  border: 1px solid var(--line); border-radius: var(--radius);
  padding: 3px 9px; cursor: pointer; }
.dz-dense-btn:hover { color: var(--accent); border-color: var(--accent); }
body.dz-dense .wl-row { padding-top: 6px; padding-bottom: 6px; }
body.dz-dense .wl-signals { margin-top: 2px; }
body.dz-dense .wl-chip { padding: 0 6px; font-size: 11px; }
body.dz-dense .dz-rec { padding: 4px 0; }
body.dz-dense .tbl td { padding-top: 5px; padding-bottom: 5px; }

/* theme-check page: the two verdict cards, driven by the same query the
   whole site keys off - and the toggle pins must win in both directions */
.tc-dark { display: none; }
@media (prefers-color-scheme: dark) {
  .tc-dark { display: block; }
  .tc-light { display: none; }
}
:root[data-theme="dark"] .tc-dark { display: block; }
:root[data-theme="dark"] .tc-light { display: none; }
:root[data-theme="light"] .tc-dark { display: none; }
:root[data-theme="light"] .tc-light { display: block; }

/* digest + recents: two-up under the work surface */
.dz-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 14px;
  margin-top: 14px; align-items: start; }
@media (max-width: 900px) { .dz-duo { grid-template-columns: 1fr; } }
.dz-analyze .btn { white-space: nowrap; }
.dz-analyze { min-width: 260px; }

/* Options: a dropdown in the command row, beside the button it configures -
   it used to sit two lines below, under the tape. */
.dz-opts { position: relative; flex: 0 0 auto; margin: 0; }
.dz-opts > summary { padding: 0; white-space: nowrap; }
.dz-opts > summary .muted { display: none; }
@media (min-width: 1500px) { .dz-opts > summary .muted { display: inline; } }
.dz-opts-pop { position: absolute; top: calc(100% + 10px); left: 0; z-index: 60;
  width: min(360px, calc(100vw - 40px)); padding: 12px 14px 14px;
  background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow); }
.dz-opts-pop > label:first-child { margin-top: 0 !important; }

/* ═══════════════════════════════════════════════════════════════════════
   TYPE SYSTEM · IBM Plex Sans + Plex Mono, self-hosted
   Two faces from one superfamily, drawn to sit together: the sans reads
   engineered rather than startup-generic, and the mono is a genuine
   figure face for prices, tickers and deltas. Self-hosted under /static
   so the strict CSP (default-src 'self') allows them with no build step
   and no third-party request on any page load. SIL Open Font License.
   ═══════════════════════════════════════════════════════════════════ */
@font-face { font-family: "Plex Sans"; font-style: normal; font-weight: 400;
  font-display: swap; src: url("/static/fonts/ibm-plex-sans-latin-400-normal.woff2") format("woff2"); }
@font-face { font-family: "Plex Sans"; font-style: normal; font-weight: 600;
  font-display: swap; src: url("/static/fonts/ibm-plex-sans-latin-600-normal.woff2") format("woff2"); }
@font-face { font-family: "Plex Sans"; font-style: normal; font-weight: 700;
  font-display: swap; src: url("/static/fonts/ibm-plex-sans-latin-700-normal.woff2") format("woff2"); }
@font-face { font-family: "Plex Mono"; font-style: normal; font-weight: 400;
  font-display: swap; src: url("/static/fonts/ibm-plex-mono-latin-400-normal.woff2") format("woff2"); }
@font-face { font-family: "Plex Mono"; font-style: normal; font-weight: 600;
  font-display: swap; src: url("/static/fonts/ibm-plex-mono-latin-600-normal.woff2") format("woff2"); }

:root {
  --sans: "Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --mono: "Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;
  /* One spacing scale, 4px-based. Every ad-hoc 6/10/14/18/22/26px margin in
     the templates now snaps to the nearest step - individually a ≤2px move,
     collectively the difference between a rhythm and a pile of decisions. */
  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px;
  --sp-5: 20px; --sp-6: 24px; --sp-7: 28px; --sp-8: 32px;
}

/* Plex runs slightly wider than the system stack: display sizes need a
   touch more negative tracking, body text none at all. */
h1, h2, h3 { letter-spacing: -.018em; }
.page-head h1 { letter-spacing: -.025em; }

/* NUMBERS ARE A TYPEFACE DECISION. Anything that lines up in a column, or
   that a reader compares against another number, gets tabular figures in
   the mono - proportional digits in a price column is the single most
   common tell of a UI built by someone who does not read prices. */
.num, .tick, .mono, td.num, th.num, .stat .n, .wl-px, .wl-chg,
.dz-quota, .eng-n, .mt-px, input[type="number"] {
  font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; }
.tick { font-family: var(--mono); font-weight: 600; letter-spacing: -.01em; }

/* SECTION LABELS, two tiers and no more. Page-level eyebrows carry the
   accent; panel-level heads are muted. Everything that used to invent its
   own uppercase label now resolves to one of these two. */
.eyebrow { font-family: var(--sans); font-size: 11px; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: var(--accent); }
.dz-rhead, .ia-toc-h, .pipe-col-h, .wr-th-h {
  font-family: var(--sans); font-size: 11px; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: var(--muted); }
.an-box-h { font-size: 14.5px; font-weight: 600; letter-spacing: -.01em; }

/* FOCUS. One visible ring, everywhere, in the accent - and never the
   browser default outline sitting a pixel off the shape it belongs to. */
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px;
  border-radius: var(--radius-sm); }
.skip-link { position: absolute; left: -9999px; top: 8px; z-index: 200;
  background: var(--panel); border: 1px solid var(--accent); color: var(--ink);
  padding: 8px 14px; border-radius: var(--radius); }
.skip-link:focus { left: 12px; }

/* ── spacing utilities (replacing inline style= attributes) ───────────── */
.m0 { margin: 0; }
.mt1 { margin-top: var(--sp-1); } .mt2 { margin-top: var(--sp-2); }
.mt3 { margin-top: var(--sp-3); } .mt4 { margin-top: var(--sp-4); }
.mt5 { margin-top: var(--sp-5); } .mt6 { margin-top: var(--sp-6); }
.mt7 { margin-top: var(--sp-7); } .mt8 { margin-top: var(--sp-8); }
.mb1 { margin-bottom: var(--sp-1); } .mb2 { margin-bottom: var(--sp-2); }
.mb3 { margin-bottom: var(--sp-3); } .mb4 { margin-bottom: var(--sp-4); }
/* top-only: sets the top margin and zeroes the rest, which is what every
   `margin: 10px 0 0` in the templates was doing by hand */
.st1 { margin: var(--sp-1) 0 0; } .st2 { margin: var(--sp-2) 0 0; }
.st3 { margin: var(--sp-3) 0 0; } .st4 { margin: var(--sp-4) 0 0; }
.st5 { margin: var(--sp-5) 0 0; } .st6 { margin: var(--sp-6) 0 0; }
.st7 { margin: var(--sp-7) 0 0; } .st8 { margin: var(--sp-8) 0 0; }
.nowrap { white-space: nowrap; }
.inl0 { display: inline; margin: 0; }
.mw-rd { max-width: 640px; }

/* ── data provenance stamp: same shape, same place, every desk ────────── */
.stamp { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap;
  font-size: 11.5px; color: var(--faint); font-family: var(--mono); }
.stamp b { font-weight: 400; color: var(--muted); }
.stamp .stamp-dot { width: 5px; height: 5px; border-radius: 50%;
  background: var(--green); flex: none; }
.stamp.is-stale .stamp-dot { background: var(--amber); }

/* ═══ PRINT. A research note is a document; it should leave the browser
   looking like one. Chrome, navigation and calls-to-action are screen
   furniture - the page prints as the note plus its provenance. ═══ */
@media print {
  :root { --bg: #fff; --panel: #fff; --panel-2: #fff; --ink: #111;
          --ink-2: #333; --muted: #555; --faint: #777; --line: #ccc;
          --line-2: #e5e5e5; --shadow: none; --shadow-sm: none; }
  html, body { background: #fff !important; color: #111 !important; }
  .nav, .gate-bar, .push-nudge, .toast, .cta, .rr-cta, .dz-rail, .an-opts,
  .skip-link, .nav-search-wrap, .wl-act, .db-more, footer, .site-foot,
  .ia-more, .dz-cmd, .analyze-bar, .btn { display: none !important; }
  main.wrap { max-width: none !important; padding: 0 !important; }
  .card { border: 1px solid #ccc !important; box-shadow: none !important;
          break-inside: avoid; page-break-inside: avoid; }
  details { display: block !important; }
  details > summary { display: none !important; }
  .db-clip .db-text { max-height: none !important; -webkit-line-clamp: none !important; }
  h1, h2, h3 { break-after: avoid; page-break-after: avoid; }
  table { break-inside: auto; } tr { break-inside: avoid; }
  a { color: #111 !important; text-decoration: none !important; }
  .ia-sec, .db-turn { break-inside: avoid; }
  @page { margin: 16mm 14mm; }
}
.dz-rhead .sh-note { font-family: var(--sans); font-size: 12px; font-weight: 400;
  letter-spacing: 0; text-transform: none; color: var(--faint); margin-left: 8px; }

/* ── utilities, second pass: the shapes that kept recurring in the
      remaining inline styles (card CTAs, bottom margins, flex rows) ─────── */
.sb1 { margin: 0 0 var(--sp-1); } .sb2 { margin: 0 0 var(--sp-2); }
.sb3 { margin: 0 0 var(--sp-3); } .sb4 { margin: 0 0 var(--sp-4); }
.my1 { margin: var(--sp-1) 0; } .my2 { margin: var(--sp-2) 0; }
.my3 { margin: var(--sp-3) 0; }
.tc { text-align: center; }
.f1 { flex: 1; }
.ml-auto { margin-left: auto; }
.ovis { overflow: visible; }
.wsn { white-space: normal; }
/* the centred call-to-action block that closes most cards */
.cta-mid { justify-content: center; margin-top: var(--sp-4); }
.card-cta { text-align: center; margin-top: var(--sp-6); }
.lede { max-width: 560px; margin: var(--sp-2) auto 0; }
/* the "heading left, link right" row inside a card */
.row-sb { display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--sp-3); flex-wrap: wrap; }
.row-ac { display: flex; align-items: center; gap: var(--sp-3); font-size: 14px; }
.fs20 { font-size: 20px; } .fs22 { font-size: 22px; } .fs14 { font-size: 14px; }
.bullets { margin: var(--sp-2) 0 0; padding-left: 18px; font-size: 14px; line-height: 1.7; }
