:root {
  --bg: #0b1020;
  --panel: #141b33;
  --panel-2: #1c2547;
  --text: #e6ebff;
  --muted: #8a96c4;
  --accent: #2dd4bf;
  --kalshi: #60a5fa;
  --sxbet: #ec4899;
  --limitless: #f97316;
  --whale: #f472b6;
  --mint: #6ee7b7;         /* Build .282: mint green for the "...to KNOW" tagline clause */
  --jackpot: #fbbf24;
  --danger: #ef4444;
  --success: #4ade80;
  --border: #2a3566;
  /* Phase C: board palette — et-gold is new; others alias existing vars */
  --et-gold: #D4AF37;
  --source-tint: rgba(0,0,0,0.22);   /* Build .284: subtle dark backing behind Marketplace Activity source cells; theme-agnostic black-alpha (reads on dark + peach). Build .286: deepened 0.10 -> 0.22 for stronger venue-name contrast. */
  --live-bg: rgba(239, 68, 68, 0.18);  /* Build .287: theme-agnostic red-alpha backing for the 🔴 LIVE in-play badge (sx.bet); composites over dark + peach. */
  --chip-halo: rgba(0,0,0,0.9);  /* Build .288: dark text-halo so colorful Marketplace venue names pop against their same-hue colorful chip background. Theme-agnostic (a dark outline reads on dark + peach). */
}
* { box-sizing: border-box; }

/* ────────────────────────────────────────────────────────────────────
   Build v.03 .31 build 159 (2026-05-23): GLOBAL HARD RULE — NO
   HORIZONTAL SCROLL BAR EVER, on any viewport, any page, any layout.
   This is non-negotiable.  When ANY content tries to exceed the
   viewport width, it must wrap, shrink, or be clipped — never push
   the body wider than 100vw.

   Belt + suspenders:
     - overflow-x: clip on <html> AND <body> (clip is stricter than
       hidden — it disables scrolling entirely, no programmatic
       scrollLeft either)
     - max-width: 100vw to prevent any child's intrinsic size from
       widening the body
     - Fallback to overflow-x: hidden on older browsers that don't
       support `clip` (still ~99%+ now, but defensive)

   If you're adding a new component and a horizontal scrollbar
   appears, the BUG is in the component, not in this rule.  Common
   culprits: <pre> with long lines, <table> with non-wrappable cells,
   inline-block rows that can't shrink, fixed-width grids.  Apply
   `min-width: 0` to flex/grid children and `overflow-wrap: anywhere`
   to text containers as needed.
   ──────────────────────────────────────────────────────────────── */
html, body {
  overflow-x: clip;
  max-width: 100vw;
}
@supports not (overflow-x: clip) {
  html, body { overflow-x: hidden; }
}

body {
  margin: 0;
  font-family: -apple-system, "Segoe UI", Roboto, sans-serif;
  background: var(--bg);
  color: var(--text);
  font-size: 14px;
}
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
h1 { margin: 0; font-size: 20px; letter-spacing: 0.02em; }
.brand-accent { color: var(--accent); font-weight: 700; }
.brand {
  display: flex; align-items: center; gap: 14px;
  flex-shrink: 0; text-decoration: none; color: inherit;
}
.brand:hover { text-decoration: none; }
.brand-logo { display: block; height: 44px; width: auto; }

/* Build .69 (item #1): 0.8×0.8cm decorative box mirroring the three
   primary ticker labels. Uses the exact same backgrounds as
   .tl-events / .tl-whales / .tl-jackpot, so the visual identity
   stays in sync if those CSS vars ever change. Sits on its own
   --bg parent so the alpha-blend renders the same dark-teal /
   pink / dark-brown the user sees on the ticker row.

   Stripe widths: 87% / 100% / 74% — middle is 15% wider than top,
   bottom is 15% narrower than top, per the spec. */
.brand-decoration {
  display: inline-flex;
  flex-direction: column;
  justify-content: space-between;
  width: 0.8cm;
  height: 0.8cm;
  padding: 1px 0;
  background: var(--bg);
  border-radius: 3px;
  gap: 1px;
  flex-shrink: 0;
}
.brand-stripe {
  display: block;
  height: calc(33.33% - 1px);
  border-radius: 2px;
}
.brand-stripe-events {
  width: 87%;
  background: linear-gradient(180deg, rgba(45,212,191,0.55), rgba(96,165,250,0.45));
}
.brand-stripe-whales {
  width: 100%;
  background: var(--whale);
}
.brand-stripe-jackpot {
  width: 74%;
  background: linear-gradient(180deg, rgba(251,191,36,0.55), rgba(251,191,36,0.30));
}

.brand-product { display: flex; flex-direction: column; gap: 2px; line-height: 1.15; }
.brand-product-name {
  font-size: 16px; font-weight: 700; color: var(--text);
  letter-spacing: 0.01em;
}
.brand-et-name { color: var(--whale); }
.beta-tag {
  display: inline-block; font-size: 10px; font-weight: 700; color: var(--accent);
  background: rgba(45,212,191,0.15); padding: 1px 6px; border-radius: 3px;
  letter-spacing: 0.08em; vertical-align: middle; margin-left: 4px;
}
.tagline { font-size: 11px; color: var(--whale); font-style: italic; letter-spacing: 0.02em; }
h2 { font-size: 16px; color: var(--muted); margin: 24px 20px 12px; text-transform: uppercase; letter-spacing: 0.1em; }
h3 { font-size: 18px; color: #ffffff; margin: 0 0 12px; font-weight: 800; letter-spacing: 0.02em; }
h3 .plat-name { font-size: 18px; font-weight: 900; letter-spacing: 0.04em; text-transform: uppercase; }
h3 .plat-sub { font-size: 14px; color: #ffffff; font-weight: 700; }
/* h3 platform tinting */
.dv-chart h3 .plat-name { color: var(--accent); }
.visitor-card h3 .plat-name { color: #f59e0b; }
h4.section-title { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; margin: 18px 0 8px; }
.evt-chart-wrap { position: relative; height: 180px; background: var(--panel); border: 1px solid var(--border); border-radius: 6px; padding: 8px; }
.evt-chart-empty { font-size: 11px; color: var(--muted); padding: 8px 0; font-style: italic; }

/* Legacy top-strip styles kept only because some older selectors may still
   reference them; the actual element no longer renders post-Phase-1 reorder. */
.top-strip { display: none; }
.ticker-strip { display: none; }
.ticker-row { display: none; }
/* Jackpot top-10 card sitting in the right half of the top strip */
.jackpot-top10-card {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
  padding: 10px 14px; max-height: none; overflow-y: visible;
  border-top: 3px solid var(--jackpot);
}
.jackpot-top10-card .platform { margin-bottom: 8px; padding-bottom: 6px; }
.jackpot-list { list-style: none; margin: 0; padding: 0; counter-reset: jp; }
.jackpot-list .jp-row { counter-increment: jp; border-bottom: 1px solid var(--border); }
.jackpot-list .jp-row:last-child { border-bottom: none; }
.jackpot-list .jp-row-link {
  display: grid; grid-template-columns: 22px 36px 1fr auto; gap: 8px; align-items: baseline;
  padding: 5px 4px; color: var(--text); font-size: 12px;
}
.jackpot-list .jp-row-link::before {
  content: counter(jp);
  font-family: monospace; font-size: 10px; color: var(--muted); text-align: right;
}
.jackpot-list .jp-row-link .sig-plat { font-size: 9px; padding: 2px 4px; align-self: center; }
.jackpot-list .jp-row-link:hover { background: var(--panel-2); text-decoration: none; }
.jackpot-list .jp-row-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.jackpot-list .jp-row-amount { font-family: monospace; font-size: 11px; color: var(--jackpot); font-weight: 700; }
.plat-name.jackpot-name { color: var(--jackpot); }
.ticker-label {
  font-size: 10px; letter-spacing: 0.12em; font-weight: 700; flex-shrink: 0;
  padding: 2px 6px; border-radius: 3px;
}
.ticker-poly .ticker-label { background: rgba(45,212,191,0.15); color: var(--accent); }
.ticker-kalshi .ticker-label { background: rgba(96,165,250,0.15); color: var(--kalshi); }
.ticker-manifold .ticker-label { background: rgba(167,139,250,0.15); color: #a78bfa; }
.ticker-sxbet .ticker-label { background: rgba(236,72,153,0.15); color: var(--sxbet); }
.ticker-limitless .ticker-label { background: rgba(249,115,22,0.15); color: var(--limitless); }
/* Legacy .ticker-item rule removed (was: flex:1; min-width:0; overflow:hidden).
   That style was for the original per-platform top-strip ticker rows where
   each row had a single .ticker-item child meant to fill remaining space.
   Phase 1's reorder removed top-strip, but this rule was still inherited
   by the marquee .ticker-item items inside .ticker-track. Combined with
   flex layout on .ticker-track, it forced every marquee item to shrink to
   1/N of the track width and clipped longer fields like titles. */
.ticker-link {
  display: flex; justify-content: space-between; align-items: center; gap: 8px;
  color: var(--text); text-decoration: none; min-width: 0;
}
.ticker-link:hover .ticker-title { color: var(--accent); }
.ticker-title {
  font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0;
}
.ticker-vol { font-size: 11px; color: var(--muted); font-variant-numeric: tabular-nums; flex-shrink: 0; }
.ticker-placeholder { font-size: 11px; color: var(--muted); font-style: italic; }

@media (max-width: 800px) {
  .ticker-strip { grid-template-columns: 1fr; }
}

/* Viewer pill — sticks to the bottom-right corner of the WEB PAGE (not the
   viewport). Body is the offset parent, so absolute positioning anchors it
   to the page bottom-right and it scrolls away with the page. */
body { position: relative; }
.viewer-pill {
  position: absolute; right: 16px; bottom: 16px; z-index: 5;
  background: rgba(13,19,40,0.92);
  border: 1px solid var(--border); border-radius: 999px;
  padding: 6px 12px; font-size: 11px; color: var(--text);
  display: flex; align-items: center; gap: 6px;
  box-shadow: 0 6px 24px rgba(0,0,0,0.35); cursor: pointer;
}
.viewer-pill:hover { border-color: var(--accent); }
.vw-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px rgba(45,212,191,0.7); animation: vwPulse 1.8s infinite; }
@keyframes vwPulse { 0%,100% { opacity: 1; } 50% { opacity: 0.35; } }
.vw-total { font-weight: 700; font-size: 13px; color: var(--accent); }
.vw-all-unique { font-weight: 700; font-size: 13px; color: var(--text); font-variant-numeric: tabular-nums; }
.vw-sep { color: var(--muted); opacity: 0.5; }
.vw-label { color: var(--muted); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; }
.vw-flag { font-size: 11px; } /* .313: reduced for compact widget */
.vw-cc { color: var(--muted); width: 20px; font-variant-numeric: tabular-nums; font-size: 10px; }
.vw-n { margin-left: auto; font-variant-numeric: tabular-nums; font-size: 10px; }
.vw-list { list-style: none; margin: 0; padding: 0; }
.vw-list li { display: flex; align-items: center; gap: 6px; padding: 2px 0; border-top: 1px solid rgba(255,255,255,0.04); font-size: 12px; }

/* Visitor globe card (bottom of page — replaces jackpot) */
.visitor-card {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
  padding: 14px 16px;
}
/* ─── Visitor card (bottom of page) ───
   Layout: globe on left, stats panel on right.
   Stats panel = 3-stat row (online / all-time unique / all-time visits)
   on top, country list spanning full width on row 2. */
.visitor-body {
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: 18px; align-items: stretch;
}
.vw-globe-bottom {
  width: 200px; height: 200px; margin: 0 auto;
  border-radius: 50%; overflow: hidden;
  background: radial-gradient(circle at 50% 50%, #0c1a3a 0%, #0b1020 100%);
  display: flex; align-items: center; justify-content: center;
}
.vw-globe-bottom canvas { display: block; margin: auto; }

.vw-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: auto auto;
  gap: 12px;
  min-width: 0;        /* let the country list shrink instead of overflowing right */
}
.vw-stat {
  background: var(--panel-2); border-radius: 6px; padding: 12px 10px;
  text-align: center; min-width: 0;
}
.vw-stat-num {
  font-family: monospace; font-size: 22px; font-weight: 800;
  color: var(--accent); line-height: 1.1;
}
.vw-stat-lbl {
  font-size: 10px; color: var(--muted); text-transform: uppercase;
  letter-spacing: 0.08em; margin-top: 4px;
}
/* Build .300: sub-line under a stat label (e.g. "Since June 2026" under
   returning visitors) — smaller + dimmer + sentence-case so it reads as a
   footnote, not a second label. */
.vw-stat-sub {
  font-size: 8px; color: var(--muted); opacity: 0.8;
  letter-spacing: 0.03em; margin-top: 2px;
}
.vw-list.vw-list-bottom {
  grid-column: 1 / -1;        /* span all 3 stat columns on row 2 */
  list-style: none; margin: 0; padding: 8px 0 0;
  border-top: 1px solid var(--border);
  max-height: 140px; overflow-y: auto;
  font-size: 11px;
  /* Reset older standalone styling that used to draw a left border */
  border-left: none; padding-left: 0;
}
.vw-list.vw-list-bottom li {
  display: flex; justify-content: space-between; align-items: center;
  padding: 3px 4px;
}
@media (max-width: 800px) {
  .visitor-body { grid-template-columns: 1fr; }
  .vw-stats { grid-template-columns: repeat(3, 1fr); }
}
.vw-modal { max-width: 720px; width: 90vw; }
.vw-globe-big { width: 100%; height: 400px; border-radius: 8px; overflow: hidden; background: radial-gradient(circle at 50% 50%, #0c1a3a 0%, #0b1020 100%); margin: 12px 0; }
.vw-list-big { max-height: 180px; }

/* ─── Header ─── */
header {
  display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 16px;
  padding: 14px 20px; border-bottom: 1px solid var(--border);
  background: linear-gradient(180deg, #101735, #0b1020);
}
.meta { color: var(--muted); font-size: 12px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.alive-toggle {
  display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px;
  background: var(--panel-2); border: 1px solid var(--border); border-radius: 20px;
  cursor: pointer; font-size: 11px; color: var(--text); user-select: none;
}
.alive-toggle:hover { border-color: var(--accent); }

/* ── Right-side header cluster + Trackster mascot ───────────────────────────
   .header-right groups the Telegram CTA + the three controls so they sit close
   together (no space-between gap), and lets the mascot anchor the far corner. */
.header-right {
  display: flex; align-items: center; justify-content: flex-end;
  gap: 14px; flex-wrap: wrap; margin-left: auto;
}
/* Trackster waves in the top-right corner, above the right end of the tickers.
   The arm-wave is a Lottie animation (damped-sine swing about the shoulder),
   rendered by lottie-web into each .header-mascot container. */
.header-mascot {
  flex: 0 0 auto; width: 112px; height: auto; align-self: flex-end;
  aspect-ratio: 640 / 916;       /* divs have no intrinsic size — size like the old <img> */
  margin: -4px -2px -16px 4px;   /* lift a touch + let the feet sit on the ticker */
  position: relative; z-index: 6; pointer-events: none; user-select: none;
}
.header-mascot svg { display: block; width: 100%; height: 100%; }
/* Trackster wears shades on DARK (default) and goes bare-faced on peachy/day. */
.header-mascot--day { display: none; }
:root[data-theme="peach"] .header-mascot--dark { display: none; }
:root[data-theme="peach"] .header-mascot--day { display: block; }
.alive-toggle input { accent-color: var(--accent); }
.alive-toggle:has(input:checked) { background: rgba(45,212,191,0.15); border-color: var(--accent); color: var(--accent); }

/* Build v0.35 20260523.173 (2026-05-23): donation widget — replaces
   the "Last updated:" timestamp in the top-right meta strip.  The
   button uses a warm gold-pink gradient so it pops against the cool
   header background without screaming for attention. */
.donate-btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 16px;
  font-size: 12px; font-weight: 700; color: #0b1020;
  background: linear-gradient(135deg, #fbbf24 0%, #f472b6 100%);
  border: 1px solid rgba(251,191,36,0.5);
  cursor: pointer; box-shadow: 0 1px 3px rgba(0,0,0,0.25);
  transition: transform 120ms ease, box-shadow 120ms ease;
  text-decoration: none;
}
.donate-btn:hover {
  transform: translateY(-1px);
  box-shadow: 0 3px 8px rgba(251,191,36,0.35);
}
.donate-btn .donate-icon {
  width: 16px; height: 16px; display: block; border-radius: 3px;
}
.donate-btn-disabled {
  background: var(--panel-2);
  color: var(--muted);
  border-color: var(--border);
  cursor: not-allowed; opacity: 0.55;
}
.donate-btn-disabled:hover { transform: none; box-shadow: none; }

/* Donation modal */
.donate-modal {
  max-width: 540px;
}
.donate-title-icon {
  width: 22px; height: 22px; vertical-align: -4px;
  margin-right: 6px; border-radius: 4px;
}
.donate-intro {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.5;
  margin: 4px 0 16px 0;
}
.donate-wallet-block {
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 12px 14px;
  margin-bottom: 16px;
}
.donate-wallet-lbl {
  font-size: 12px;
  color: var(--muted);
  margin-bottom: 6px;
}
.donate-wallet-row {
  display: flex; align-items: center; gap: 8px;
}
.donate-wallet-addr {
  flex: 1;
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-size: 12px;
  background: rgba(45,212,191,0.08);
  border: 1px solid rgba(45,212,191,0.30);
  color: var(--text);
  padding: 6px 8px;
  border-radius: 4px;
  word-break: break-all;
  user-select: all;
}
.donate-copy-btn {
  padding: 6px 12px;
  font-size: 12px;
  font-weight: 600;
  color: var(--accent);
  background: rgba(45,212,191,0.10);
  border: 1px solid rgba(45,212,191,0.40);
  border-radius: 4px;
  cursor: pointer;
  white-space: nowrap;
}
.donate-copy-btn:hover {
  background: rgba(45,212,191,0.20);
}
.donate-wallet-hint {
  font-size: 11px;
  color: var(--muted);
  margin-top: 6px;
  font-style: italic;
}
.donate-form {
  display: flex; flex-direction: column; gap: 12px;
}
.donate-row {
  display: flex; flex-direction: column; gap: 4px;
}
.donate-row-2col {
  display: grid;
  grid-template-columns: 1fr 1.6fr;
  gap: 12px;
}
.donate-col {
  display: flex; flex-direction: column; gap: 4px;
}
.donate-label {
  font-size: 12px;
  color: var(--muted);
  font-weight: 600;
}
.donate-opt {
  font-weight: 400; opacity: 0.7;
}
.donate-input {
  font-size: 13px;
  padding: 7px 10px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 4px;
  color: var(--text);
  font-family: inherit;
}
.donate-input:focus {
  outline: none;
  border-color: var(--accent);
  background: rgba(45,212,191,0.05);
}
.donate-input-mono {
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-size: 12px;
}
.donate-textarea {
  resize: vertical;
  min-height: 60px;
  font-family: inherit;
}
.donate-actions {
  display: flex; align-items: center; gap: 12px;
  margin-top: 4px;
}
.donate-submit {
  padding: 8px 18px;
  font-size: 13px;
  font-weight: 700;
  color: #0b1020;
  background: linear-gradient(135deg, #fbbf24 0%, #f472b6 100%);
  border: 1px solid rgba(251,191,36,0.5);
  border-radius: 6px;
  cursor: pointer;
}
.donate-submit:hover { filter: brightness(1.08); }
.donate-status {
  font-size: 12px;
  color: var(--muted);
}
.donate-status-pending { color: var(--muted); }
.donate-status-ok      { color: var(--success); }
.donate-status-err     { color: var(--danger); }
.donate-fineprint {
  font-size: 11px;
  color: var(--muted);
  font-style: italic;
  line-height: 1.5;
  margin-top: 4px;
  padding-top: 8px;
  border-top: 1px dashed var(--border);
}
@media (max-width: 540px) {
  .donate-row-2col { grid-template-columns: 1fr; }
}

/* Build .94: Telegram subscribe CTA in the header.  Vibrant Telegram-
   blue → emerald-green gradient (cheerful palette, distinct from the
   site's teal/blue accent so it visibly stands out).  Paper-plane
   icon with a subtle "fly" animation on hover.  Sits between the
   search box and the meta block. */
.tg-subscribe-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 16px;
  background: linear-gradient(135deg, #229ED9 0%, #34D399 100%);
  color: #ffffff;
  text-decoration: none;
  border-radius: 20px;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  box-shadow:
    0 2px 12px rgba(34, 158, 217, 0.40),
    0 0 0 0 rgba(52, 211, 153, 0);
  transition: transform 0.18s ease, box-shadow 0.25s ease;
  border: none;
  cursor: pointer;
  white-space: nowrap;
  /* Subtle idle pulse so the button has life even without hover. */
  animation: tg-btn-pulse 3.2s ease-in-out infinite;
}
.tg-subscribe-btn:hover {
  transform: translateY(-1px) scale(1.04);
  box-shadow:
    0 4px 20px rgba(34, 158, 217, 0.60),
    0 0 0 4px rgba(52, 211, 153, 0.22);
  animation: none;   /* Halt the pulse so hover takes over cleanly. */
}
.tg-subscribe-btn:active {
  transform: translateY(0) scale(0.98);
}
.tg-subscribe-btn .tg-icon {
  font-size: 15px;
  display: inline-block;
  transform: rotate(-20deg);
  transition: transform 0.3s ease;
}
.tg-subscribe-btn:hover .tg-icon {
  animation: tg-fly 0.55s ease-in-out;
}
@keyframes tg-fly {
  0%   { transform: rotate(-20deg) translate(0, 0); }
  40%  { transform: rotate(-35deg) translate(3px, -3px); }
  100% { transform: rotate(-20deg) translate(0, 0); }
}
@keyframes tg-btn-pulse {
  0%, 100% {
    box-shadow:
      0 2px 12px rgba(34, 158, 217, 0.40),
      0 0 0 0 rgba(52, 211, 153, 0);
  }
  50% {
    box-shadow:
      0 3px 16px rgba(34, 158, 217, 0.55),
      0 0 0 6px rgba(52, 211, 153, 0.12);
  }
}
/* Mobile: shrink padding + text size so it still fits in the header
   when stacked.  On narrowest breakpoint it sits inline with the
   search box (flex-wraps). */
@media (max-width: 900px) {
  .tg-subscribe-btn {
    padding: 7px 12px;
    font-size: 11px;
  }
  .tg-subscribe-btn .tg-icon { font-size: 13px; }
}
@media (max-width: 700px) {
  .tg-subscribe-btn {
    order: 13;        /* sit at the very end after search + meta on mobile */
    margin-left: auto;
  }
}
.hidden-note { color: var(--muted); font-size: 10px; font-weight: normal; text-transform: none; letter-spacing: 0; }
.ts { color: var(--text); font-family: monospace; }
.collect-btn {
  background: var(--accent); color: #0b1020; border: none; padding: 6px 14px;
  border-radius: 4px; font-weight: 600; font-size: 12px; cursor: pointer;
  letter-spacing: 0.05em; text-transform: uppercase;
}
.collect-btn:hover:not(:disabled) { background: #5eead4; }
.collect-btn:disabled { opacity: 0.6; cursor: wait; }
.collect-status { font-family: monospace; font-size: 11px; }
.collect-status.ok { color: var(--accent); }
.collect-status.err { color: var(--danger); }

/* Build .54: hero subtitle now lives INSIDE the header flex row,
   spanning the middle column between the brand block (left) and the
   search/meta block (right). Gradient text fill preserved. The old
   .hero-subtitle / .hero-subtitle-text full-width band classes are
   gone — replaced by a single .hero-subtitle-inline. */
.hero-subtitle-inline {
  margin: 0;
  max-width: 100%;
  text-align: center;
  /* Build .281: ONE line — scales down on narrow viewports so it never
     wraps (until the <=600px rule lets it wrap to avoid clipping). */
  font-size: clamp(11px, 1.1vw, 14px);
  font-weight: 800;
  letter-spacing: 0.01em;
  line-height: 1.25;
  /* Build .228: solid var(--whale) pink to match the EventTracker brand name. */
  color: var(--whale);
  /* Build .246: thin gold outline to frame the tagline */
  border: 1px solid rgba(251, 191, 36, 0.45);
  border-radius: 6px;
  padding: 4px 12px;
  white-space: nowrap;   /* Build .281: single line */
  word-break: keep-all;
}
/* Build .282: second tagline clause ("come to EventTracker to KNOW") in mint green. */
.hero-know { color: var(--mint); }
/* Build .256: legal disclaimer — small all-caps line inside the gold border */
.hero-disclaimer {
  display: block;
  width: 100%;
  font-size: 8px;
  font-weight: 500;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--muted);
  margin: 0;
  line-height: 1.3;
  text-align: center;
  opacity: 0.75;
}
@media (max-width: 900px) {
  .hero-subtitle-inline { font-size: 16px; }
}
@media (max-width: 600px) {
  /* On small phones let the one-line tagline wrap rather than clip, and
     give the stack full width so the search box isn't cramped. */
  .hero-subtitle-inline { font-size: 14px; margin: 0; white-space: normal; }
  .hero-inner { width: 100%; }
}

/* Build .281: hero tagline + search + disclaimer stacked as their own
   centered, full-width row in the (wrapping) header.  .hero-stack claims a
   100%-basis row below the brand/controls row (order:5); .hero-inner is
   sized to the one-line tagline (width:fit-content) so the search box
   stretches to exactly the tagline's width, with the disclaimer beneath. */
.hero-stack {
  /* Build .282: inline in the header row -- sits between the brand
     (...BETA) and the Telegram CTA.  Drops to its own full-width row at
     <=1000px (media rule below) where there isn't room inline. */
  display: flex;
  flex: 0 1 auto;
  justify-content: center;
  min-width: 0;
}
.hero-inner {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  width: fit-content;       /* = the one-line tagline's width */
  max-width: 100%;
  gap: 6px;
  margin: 0;
}
.hero-inner .hero-subtitle-inline { align-self: center; }
.hero-inner .search-box {
  position: relative;
  flex: 0 0 auto;           /* auto height in the column (override 0 1 260px) */
  order: 0;                 /* override the <=1000/<=768 search-box reorders */
  width: 100%;              /* stretch to the inner width = tagline width */
  max-width: 100%;
  margin: 0;                /* override margin-left:auto */
}
/* Build .282: at <=1000px the hero drops to its own full-width row below
   the brand/controls row -- there, push the Telegram CTA + meta right
   (brand stays left).  On desktop the hero is inline, so space-between
   distributes brand | hero | CTA | meta with the hero between them. */
@media (max-width: 1000px) {
  .hero-stack { flex-basis: 100%; order: 5; }
  /* .header-right already has margin-left:auto (base) — keeps the CTA cluster
     + mascot pinned right when the hero drops to its own full-width row. */
}

/* Build .309: wide-desktop banner — three zones with EQUAL side blocks.
   LEFT (.brand) and RIGHT (.header-right: Telegram + Peachy + Donate +
   Trackster) are forced to the SAME column width (--hdr-side) via grid, so
   "their total width equals" by construction.  The brand's logo + EventTracker
   text are enlarged to fill the left column; the CENTER (.hero-stack: slogan +
   search + disclaimer) takes the whole middle and its contents scale up to fit.
   Only applies where there's room (>=1500px); below that the base flexbox header
   + the <=1000px stack handle the responsive fallback unchanged. */
@media (min-width: 1500px) {
  header {
    --hdr-side: 540px;             /* == the right cluster's natural width */
    display: grid;
    grid-template-columns: var(--hdr-side) minmax(0, 1fr) var(--hdr-side);
    align-items: center;
    gap: 24px;
  }
  /* LEFT — enlarge the PodComet logo + EventTracker text (~1.35x) to fill it */
  .brand { gap: 16px; }
  .brand-logo { height: 62px; }
  .brand-decoration { width: 1.0cm; height: 1.0cm; }
  .brand-product-name { font-size: 22px; }

  /* RIGHT — pin the cluster to the right edge of its equal column */
  .header-right { justify-content: flex-end; margin-left: 0; }

  /* CENTER — slogan + search + disclaimer, as large as fits the middle zone */
  .hero-stack { justify-content: center; }
  .hero-inner { width: 100%; max-width: 100%; gap: 8px; }
  .hero-inner .hero-subtitle-inline {
    font-size: clamp(15px, 1.25vw, 21px);
    white-space: normal;           /* wrap rather than clip if the zone narrows */
    padding: 6px 16px;
    width: 100%;
  }
  .hero-inner .search-box input { font-size: 14px; padding: 8px 12px; }
  .hero-disclaimer { font-size: 11px; }
}

/* ─── Search ─── */
.search-box { position: relative; flex: 0 1 260px; margin-left: auto; }
.search-box input {
  width: 100%; padding: 5px 10px; background: var(--panel-2); border: 1px solid var(--border);
  border-radius: 6px; color: var(--text); font-size: 12px; outline: none;
  text-align: center;   /* Build .282: center-align the placeholder + typed query */
}
.search-box input:focus { border-color: var(--accent); }
.search-results {
  position: absolute; top: 100%; left: 0; right: 0; margin-top: 4px;
  background: var(--panel); border: 1px solid var(--border); border-radius: 6px;
  display: none; max-height: 60vh; overflow-y: auto; z-index: 50;  /* Build .288: taller (was 320px) now the 5-item cap is lifted; stays scrollable + viewport-bounded */
  box-shadow: 0 10px 30px rgba(0,0,0,0.5);
}
.search-results.open { display: block; }
.sr-item {
  display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: center;
  padding: 8px 12px; border-bottom: 1px solid var(--border); cursor: pointer; color: var(--text);
}
.sr-item:last-child { border-bottom: none; }
.sr-item:hover { background: var(--panel-2); text-decoration: none; }
.sr-plat {
  font-size: 9px; font-weight: 700; padding: 2px 6px; border-radius: 3px;
  letter-spacing: 0.1em; font-family: monospace;
}
.sr-poly { background: rgba(45,212,191,0.2); color: var(--accent); }
.sr-kalshi { background: rgba(96,165,250,0.2); color: var(--kalshi); }
.sr-title { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sr-vol { font-family: monospace; font-size: 11px; color: var(--muted); }
.sr-empty { padding: 16px; text-align: center; color: var(--muted); font-size: 12px; }

/* ─── Signals row: Anomaly + Top Wallets + Smart-Money (under top strip) ─── */
.signals-row {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
  padding: 8px 20px;
}
@media (max-width: 1200px) {
  .signals-row { grid-template-columns: 1fr 1fr; }
  .wallets-card,
  .marketplace-card { grid-column: 1 / -1; }
}
@media (max-width: 900px) {
  .signals-row { grid-template-columns: 1fr; }
  .wallets-card,
  .marketplace-card { grid-column: auto; }
}

/* Build .66: 3×2 grid layout for the signals row.
   Layout map (desktop):
     ┌──────────────┬─────────────────┬──────────────┐
     │ Anomaly      │ Marketplace     │ Top-10       │
     │ Watch        │ Activity        │ Movers       │
     │ (.row 1)     │ (.row 1 + 2)    │ (.row 1)     │
     ├──────────────┤                 ├──────────────┤
     │ Smart-Money  │                 │ Reserved     │
     │ Feed         │                 │              │
     │ (.row 2)     │                 │ (.row 2)     │
     └──────────────┴─────────────────┴──────────────┘ */
.signals-row-3x2 {
  /* Build .316 PROTOTYPE — dynamic "masonry" signals row: each card sizes to
     its OWN data and flows into balanced columns, instead of the fixed 3×2
     stretch grid that padded short cards up to their row-mate's height (the
     `align-items: stretch` from build .67).  The explicit grid-column/grid-row
     placement rules below go inert under column layout — left in place so this
     reverts by restoring this one rule.  NOTE: card ORDER now flows by content
     balance (DOM order), not the old fixed placement; lock placement later with
     per-column wrappers if the masonry feel is approved. */
  display: block;
  column-count: 3;
  column-gap: 12px;
}
.signals-row-3x2 > .signals-card { break-inside: avoid; margin: 0 0 12px; }
@media (max-width: 1200px) { .signals-row-3x2 { column-count: 2; } }
@media (max-width: 838px)  { .signals-row-3x2 { column-count: 1; } }
/* Build .316 PROTOTYPE — masonry collapse fix: these inner lists were built to
   FILL a fixed cell (`flex: 1 1 0` / `1 1 50%`) and clip/scroll.  In an
   auto-height masonry card that fill-flex collapses the list to 0 height,
   clipping every row.  Size them to their CONTENT so each card grows to its
   data (the whole point of dynamic cards). */
.signals-row-3x2 .board-card-list,
.signals-row-3x2 .liq-list,
.signals-row-3x2 .la-news-list,
.signals-row-3x2 .movers-top-half,
.signals-row-3x2 .movers-bottom-half {
  flex: 0 0 auto;
  overflow: visible;
  min-height: 0;
}
/* Make sure the inner placeholder body grows to fill the card so the
   "Wiring up in .67" / "Reserved" text sits centered vertically. */
.signals-row-3x2 .signals-card { display: flex; flex-direction: column; }
.signals-row-3x2 .placeholder-body { flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; }
/* Build v0.35 20260523.190 (2026-05-23): swapped Smart-Money ↔ Anomaly
   positions per user request.  Dimensions + cell sizes unchanged —
   only the two cards' grid-placement values are flipped.  HTML source
   order is preserved (Anomaly section still comes first in the DOM)
   so the visual swap is purely CSS.  Mobile breakpoint gets explicit
   `order:` to flip stack order too (where grid-column: auto would
   otherwise fall back to DOM order). */
/* Build v0.35 20260525.222: anomaly-card replaced by board-card (col 1, row 2) */
.signals-row-3x2 .board-card         { grid-column: 1; grid-row: 2; }
.signals-row-3x2 .smartmoney-card    { grid-column: 1; grid-row: 1; }
/* Build v0.35 20260523.193 (2026-05-23): marketplace card no longer
   spans both grid rows in column 2 — row 2 is now claimed by the new
   Latest Analysis card (.latest-analysis-card).  This means column 2
   now mirrors column 3 (movers + topics): one card per row. */
.signals-row-3x2 .marketplace-card     { grid-column: 2; grid-row: 1; }
.signals-row-3x2 .latest-analysis-card { grid-column: 2; grid-row: 2; }
/* Build .82: Movers back to one row; bottom-right cell (col 3 row 2) is
   symmetrical to Movers above it.  PHQ remains on its own page-wide
   section below the Top-20 grid (build .80).
   Build v0.35 20260525.208: Trending Topics tile retired here (promoted
   to a 4th top-of-page ticker); slot now holds the Liquidity widget. */
.signals-row-3x2 .movers-card        { grid-column: 3; grid-row: 1; }
.signals-row-3x2 .liq-card           { grid-column: 3; grid-row: 2; }

/* Two-column fallback (build .82: Movers + Topics now side-by-side on the
   bottom row, mirroring Anomaly + Smart-Money above).
   Build v0.35 20260523.190: Smart-Money ↔ Anomaly swap also applies
   here — Smart-Money on left (col 1), Anomaly on right (col 2). */
@media (max-width: 1200px) {
  .signals-row-3x2 {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto auto auto auto;
  }
  /* Build v0.35 20260525.222: board-card replaces anomaly-card */
  .signals-row-3x2 .board-card       { grid-column: 1; grid-row: 1; }
  .signals-row-3x2 .smartmoney-card  { grid-column: 2; grid-row: 1; }
  .signals-row-3x2 .marketplace-card { grid-column: 1 / -1; grid-row: 2; }
  .signals-row-3x2 .latest-analysis-card { grid-column: 1 / -1; grid-row: 3; }
  .signals-row-3x2 .movers-card      { grid-column: 1; grid-row: 4; }
  .signals-row-3x2 .liq-card         { grid-column: 2; grid-row: 4; }
}
/* Mobile single-column: everything stacks.
   Build v0.35 20260523.190: explicit `order` on the swapped cards so
   the mobile stack also shows Smart-Money above Anomaly (without
   touching the HTML source order). */
@media (max-width: 900px) {
  .signals-row-3x2 { grid-template-columns: 1fr; grid-template-rows: none; }
  /* Build v0.35 20260525.222: board-card in place of anomaly-card */
  .signals-row-3x2 .board-card,
  .signals-row-3x2 .smartmoney-card,
  .signals-row-3x2 .marketplace-card,
  .signals-row-3x2 .latest-analysis-card,
  .signals-row-3x2 .movers-card,
  .signals-row-3x2 .liq-card { grid-column: auto; grid-row: auto; }
  /* board-card first in source order so it appears at top of mobile stack */
  .signals-row-3x2 .smartmoney-card  { order: -1; }
}

/* Build v0.35 20260525.222: movers-card top/bottom split.
   Top half = 🚀 Top-10 Movers.  Bottom half = ⚠ Anomalies. */
.movers-card { border-top: 3px solid var(--accent); display: flex; flex-direction: column; overflow: hidden; }
.movers-top-half {
  flex: 1 1 50%;
  overflow-y: auto;
  overflow-x: hidden;
  padding-bottom: 6px;
  min-height: 0;
}
.movers-bottom-half {
  flex: 1 1 50%;
  border-top: 2px solid var(--danger);
  padding-top: 6px;
  overflow-y: auto;
  min-height: 0;
}
.movers-bottom-half h3 { margin: 0 0 4px; padding: 0 10px; font-size: 12px; }

/* Build v0.35 20260525.222: board-card — Federated Board in the
   ex-anomaly slot (col 1, row 2 of the 3×2 signals grid). */
.board-card { border-top: 3px solid var(--accent); display: flex; flex-direction: column; overflow: hidden; }
.board-card-name { color: var(--accent); }
/* Build .263: tighten h3 + sub on board card to claw back vertical
   space for the 20 visible rows. */
.board-card h3 { margin: 0 0 2px; font-size: 12px; }
.board-card h3 .plat-sub { font-size: 10px; }

/* Build .263: tighten tabs / filter / rows so all 20 segment rows fit
   inside the card with NO scrollbar.  Total budget for the card is
   roughly the same as .liq-card (~320-360px in the row-2 signals grid).
   Header overhead: h3 ~20px + tabs ~22px + filter ~32-50px = ~75-92px.
   Remaining ~228-285px for 20 rows → must keep rows ≤ 14px each. */

/* Segment tab bar (1–20 / 21–40 / 41–60) */
.board-tab-bar {
  display: flex; gap: 3px; flex-shrink: 0;
  padding: 1px 0 3px;        /* was 2px 0 6px */
}
.btb-btn {
  flex: 1; padding: 2px 0;   /* was 4px 0 */
  border: 1px solid var(--border);
  border-radius: 4px; background: var(--panel); color: var(--muted);
  font-size: 10px;           /* was 11px */
  font-weight: 800; font-family: monospace; cursor: pointer;
  transition: background 0.1s, color 0.1s, border-color 0.1s;
  line-height: 1.3;
}
.btb-btn:hover { background: var(--panel-2); color: var(--text); }
.btb-btn.btb-active {
  background: rgba(45,212,191,0.12);
  border-color: var(--accent); color: var(--accent);
}

/* Platform filter bar */
.board-filter-bar {
  flex-shrink: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 3px;                  /* was 4px */
  padding: 2px 0 4px;        /* was 4px 0 6px */
}
.bfb-btn {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 1px 6px;          /* was 2px 7px */
  border-radius: 10px;
  border: 1px solid var(--border);
  background: var(--panel);
  color: var(--muted);
  font-size: 9px;            /* was 10px */
  font-weight: 600;
  cursor: pointer;
  line-height: 1.3;
  transition: background 0.1s, color 0.1s, border-color 0.1s;
}
.bfb-btn:hover { background: var(--panel-2); color: var(--text); }
.bfb-btn.bfb-active {
  background: rgba(45, 212, 191, 0.15);
  border-color: var(--accent);
  color: var(--accent);
}
.bfb-btn img { width: 10px !important; height: 10px !important; }

/* Build .263: list now CLIPS — no scrollbar.  Tightening below keeps
   20 visible segment rows inside the available height. */
.board-card-list {
  list-style: none;
  margin: 0;
  padding: 0;
  overflow: hidden;          /* was overflow-y: auto */
  flex: 1 1 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 0;
}

/* Section dividers — JS hides these (display:none) so styling is moot,
   but keep the rules minimal in case the JS is ever rolled back. */
.board-card-divider {
  list-style: none;
  padding: 2px 6px 1px;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--muted);
}

/* Compact event rows — target ~13-14px per row */
.board-card-row {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 0 6px;            /* was 3px 6px — saves 6px per row × 20 = 120px */
  border-radius: 3px;
  cursor: pointer;
  min-width: 0;
  line-height: 1.3;
}
.board-card-row:hover { background: var(--panel-2); }
.board-card-row-urgent { border-left: 2px solid var(--danger); padding-left: 4px; }
.bc-rank {
  flex-shrink: 0;
  width: 16px;               /* was 18px */
  text-align: right;
  font-size: 9px;            /* was 10px */
  color: var(--muted);
  font-variant-numeric: tabular-nums;
}
.bc-logo {
  flex-shrink: 0;
  width: 14px;               /* was 16px */
  display: flex;
  align-items: center;
  justify-content: center;
}
.bc-logo img { width: 12px !important; height: 12px !important; }
.bc-icons {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 1px;
  font-size: 10px;           /* was 11px */
  min-width: 12px;           /* was 14px */
}
.bc-icon { line-height: 1; }
.bc-icon-news { text-decoration: none; }
.bc-title {
  flex: 1 1 0;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 11px;           /* was 12px */
  color: var(--text);
}
.bc-chips {
  flex-shrink: 0;
  display: flex;
  gap: 2px;
  align-items: center;
}
.bc-chip {
  font-size: 9px;            /* was 10px */
  padding: 0 3px;            /* was 1px 4px */
  border-radius: 2px;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  line-height: 1.4;
}
.bc-chip-vol    { color: var(--success); }
.bc-chip-ttr-red    { color: var(--danger); font-weight: 700; }
.bc-chip-ttr-yellow { color: var(--jackpot); }
.bc-chip-ttr-gray   { color: var(--muted); }
/* Recurring-market cadence chips (2026-06): fast -> slow color gradient. */
.bc-chip-recur            { font-weight: 700; }
.bc-chip-recur-intraday   { color: #ec4899; }          /* pink  - fastest */
.bc-chip-recur-hourly     { color: var(--success); }   /* green */
.bc-chip-recur-daily      { color: #3b82f6; }          /* blue */
.bc-chip-recur-weekly     { color: #a855f7; }          /* purple */
.bc-chip-recur-monthly    { color: var(--jackpot); }   /* amber */
.bc-chip-recur-quarterly  { color: #14b8a6; }          /* teal */
.bc-chip-recur-annual     { color: var(--muted); }     /* gray  - slowest */

/* board-panels-section: slim section below the signals-row (reclaim panels) */
.board-panels-section {
  max-width: var(--content-max, 1600px);
  margin: 0 auto;
  padding: 0 16px 16px;
  width: 100%;
  box-sizing: border-box;
}

/* Coming-soon placeholder cards (Top-10 Movers / Reserved). */
.reserved-card { border-top: 3px solid var(--muted); opacity: 0.85; }
/* Build .74: PredictHQ feed in the bottom-right slot. Overrides the
   muted .reserved-card look since this is real data now, not a "coming
   soon" placeholder. Top border swapped to a globe-blue. */
.reserved-card.predicthq-card { opacity: 1; border-top: 3px solid #38bdf8; }
.predicthq-name { font-weight: 800; color: #38bdf8; }

.phq-list { list-style: none; padding: 0; margin: 0; }
.phq-row { padding: 6px 0; border-bottom: 1px solid var(--border); }
.phq-row:last-child { border-bottom: none; }
.phq-link {
  display: flex;
  flex-direction: column;
  gap: 3px;
  text-decoration: none;
}
.phq-title {
  font-size: 12px;
  line-height: 1.3;
  font-weight: 600;
  color: var(--text);
  word-break: break-word;
}
.phq-cat {
  display: inline-block;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding: 1px 6px;
  border-radius: 3px;
  background: rgba(56, 189, 248, 0.15);
  color: #38bdf8;
  align-self: flex-start;
}
.phq-cat-concerts        { background: rgba(244, 114, 182, 0.18); color: #f472b6; }
.phq-cat-sports          { background: rgba(74, 222, 128, 0.18); color: var(--success); }
.phq-cat-conferences     { background: rgba(167, 139, 250, 0.18); color: #a78bfa; }
.phq-cat-expos           { background: rgba(167, 139, 250, 0.18); color: #a78bfa; }
.phq-cat-festivals       { background: rgba(251, 191, 36, 0.18); color: #fbbf24; }
.phq-cat-performing_arts { background: rgba(244, 114, 182, 0.18); color: #f472b6; }
.phq-cat-politics        { background: rgba(239, 68, 68, 0.18); color: var(--danger); }
.phq-cat-community       { background: rgba(96, 165, 250, 0.18); color: #60a5fa; }
.phq-cat-academic        { background: rgba(167, 139, 250, 0.18); color: #a78bfa; }

/* Build v0.35 20260524.199: boost emoji nested INSIDE the .phq-cat chip.
   Was previously a separate flex-item / grid cell which broke the
   wide-grid 4-column layout (added a 5th cell with no rule).  Now sits
   as a tight prefix inside the green sports / red politics pill,
   consuming zero extra horizontal cells.  Emoji needs a slight
   nudge — kept proportional to chip text (9-11px), vertically aligned,
   tight right-margin separator. */
.phq-cat .phq-boost {
  display: inline-block;
  font-size: 11px;          /* slightly larger than 9px chip text for emoji legibility */
  line-height: 1;
  vertical-align: -1px;     /* nudge baseline down so emoji aligns with chip caps */
  margin-right: 3px;
  /* Don't inherit uppercase from .phq-cat — meaningless for emoji */
  text-transform: none;
  /* Don't inherit letter-spacing — emoji has its own metric */
  letter-spacing: 0;
}
.phq-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  font-size: 10px;
  color: var(--muted);
}
.phq-when { font-family: monospace; }
.phq-country {
  font-family: monospace;
  background: rgba(138, 150, 196, 0.12);
  padding: 0 4px;
  border-radius: 2px;
  display: inline-flex;
  align-items: center;
  gap: 3px;
}
/* Build .77.2: real flag images from flagcdn.com (Unicode regional
   indicators rendered as plain ASCII on Windows, looking like a duplicate
   country code). Base `.flag-img` is the small (16px wide) variant used in
   meta lines, tooltips, and the viewer list. */
.flag-img {
  width: 16px;
  height: auto;
  vertical-align: middle;
  border-radius: 2px;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
  display: inline-block;
}
.flag-na {
  font-size: 12px;
  line-height: 1;
}
/* Flag riding to the left of the PHQ event title — a touch bigger than the
   inline-meta variant so it visually anchors the row. */
.phq-title-flag {
  display: inline-block;
  margin-right: 6px;
  vertical-align: middle;
}
.phq-title-flag .flag-img {
  width: 18px;
}
/* Larger flag used in the PHQ modal's Country row. */
.phq-flag-lg {
  display: inline-block;
  margin-right: 5px;
  vertical-align: middle;
}
.phq-flag-lg .flag-img {
  width: 22px;
}
/* Legacy class names kept for the visitor mini-list + globe tooltip — they
   used to wrap a Unicode glyph; with .flag-img now an <img>, this wrapper
   just needs to align the image. */
.phq-flag,
.vw-flag {
  display: inline-block;
  vertical-align: middle;
}
.phq-rank {
  font-family: monospace;
  font-weight: 600;
  padding: 0 5px;
  border-radius: 2px;
}
.phq-rank-hi  { color: var(--success); background: rgba(74, 222, 128, 0.10); }
.phq-rank-mid { color: var(--text); background: rgba(167, 139, 250, 0.10); }
.phq-rank-lo  { color: var(--muted); background: rgba(138, 150, 196, 0.10); }
/* Build .96.1: dual-rank display in the card row.  Global chip sits
   immediately before local; small gap; subtle border on global to
   distinguish from local (which carries the primary signal). */
.phq-rank-global + .phq-rank-local { margin-left: 4px; }
.phq-rank-global {
  border: 1px dashed rgba(148, 163, 184, 0.40);
  opacity: 0.85;
}
.phq-rank-local {
  border: 1px solid transparent;
  font-weight: 700;   /* primary signal — bolder than global */
}
.phq-attendance, .phq-spend {
  font-family: monospace;
  cursor: help;
}
.phq-footnote {
  margin-top: 8px;
  padding-top: 6px;
  border-top: 1px solid var(--border);
  font-size: 10px;
  color: var(--muted);
  text-align: center;
  cursor: help;
}
/* Build .75: PHQ filter tabs + sort controls + clickable rows + modal. */
.phq-controls {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 8px;
}
.phq-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
.phq-tab {
  font-family: inherit;
  font-size: 10px;
  font-weight: 600;
  padding: 3px 8px;
  border-radius: 3px;
  border: 1px solid var(--border);
  background: rgba(255,255,255,0.03);
  color: var(--muted);
  cursor: pointer;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.phq-tab:hover {
  color: var(--text);
  background: rgba(255,255,255,0.06);
}
.phq-tab-active {
  background: rgba(56, 189, 248, 0.18);
  border-color: #38bdf8;
  color: #38bdf8;
}
.phq-sort-row {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 10px;
  color: var(--muted);
}
.phq-sort-lbl { font-family: monospace; }
.phq-sort-select {
  font-family: inherit;
  font-size: 10px;
  padding: 2px 6px;
  background: rgba(255,255,255,0.03);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 3px;
  cursor: pointer;
}
.phq-sort-select:focus { outline: 1px solid #38bdf8; }
.phq-row-clickable { cursor: pointer; transition: background 0.12s; }
.phq-row-clickable:hover {
  background: rgba(56, 189, 248, 0.06);
}
.phq-empty-row {
  padding: 18px 6px;
  text-align: center;
  color: var(--muted);
  font-style: italic;
}

/* ─── Build v0.35 20260525.208: Most Liquid USD Markets widget ─────────
   Replaces the Trending Topics tile in the 3×2 signals row's col 3 /
   row 2 slot.  Topics promoted to a 4th top-of-page ticker in the same
   build (see .tt-* styles further down).
   Layout grammar is a strict extension of .signals-list / .sig-row, so
   the only widget-specific styles are: card accent color, rank chip,
   leader-price chip, and a wider title column to accommodate the rank
   prefix without crowding the chips. */
.liq-card {
  border-top: 3px solid #38bdf8;   /* sky blue — "liquidity" accent */
  /* Build .243: flex-column so the list scrolls inside the fixed card height */
  display: flex; flex-direction: column; overflow: hidden;
  padding-bottom: 0;
}
.liq-name { color: #38bdf8; font-weight: 800; }
.liq-sub { color: var(--muted); font-size: 10px; font-weight: 500; }
/* Build .252: no scrollbar (overflow hidden) + flex rows so logo + chip
   + title + chips all stay on one line.  Item count capped at 15 on the
   server side so nothing is silently clipped. */
.liq-list {
  list-style: none; margin: 0; padding: 0;
  overflow: hidden;          /* no scrollbar — ever */
  flex: 1 1 0; min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;                  /* Build .259: match .la-news-list gap */
}
/* Build .259: structure + fonts mirror Latest News (.la-news-*).
   ALL liq-* rules use 2-class specificity (.liq-list X) so the .sig-row
   / .sig-link rules defined ~770 lines later in this file can't win the
   cascade tie. */
.liq-list .liq-row {
  cursor: pointer;
  border-bottom: none;       /* defeat .sig-row { border-bottom: 1px } */
  list-style: none;
  margin: 0; padding: 0;
}
.liq-list .liq-link {
  display: flex;             /* defeat .sig-link { display: grid } */
  flex-direction: row;
  align-items: baseline;     /* mirror .la-news-link */
  gap: 6px;                  /* mirror .la-news-link */
  grid-template-columns: none;
  padding: 4px 8px;          /* mirror .la-news-link */
  text-decoration: none;
  color: var(--text);
  border-left: 2px solid transparent;
  border-radius: 4px;
  transition: background-color 0.12s ease, border-color 0.12s ease;
  font-size: 12px;
  min-height: 0;
}
.liq-list .liq-link:hover {
  background: rgba(56, 189, 248, 0.07);
  border-left-color: #38bdf8;
  text-decoration: none;
}
/* Meta block on the LEFT — logo + plat chip + rank + amount + leader */
.liq-list .liq-meta {
  flex-shrink: 0;
  display: flex;
  gap: 5px;
  align-items: center;
  font-size: 10.5px;         /* mirror .la-news-meta */
  color: var(--muted);
  justify-self: auto;        /* defeat .sig-meta { justify-self: end } */
  flex-wrap: nowrap;
  max-width: none;
}
.liq-list .liq-meta .plat-chip-logo {
  width: 12px; height: 12px; flex-shrink: 0;
}
.liq-list .liq-meta .sig-plat {
  padding: 1px 6px;
  font-size: 10px;           /* mirror .la-news-prov */
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1.4;
  flex-shrink: 0;
}
.liq-list .liq-rank {
  flex-shrink: 0;
  color: #38bdf8;
  font-family: monospace; font-weight: 700;
  font-size: 10px;
  min-width: 18px;
  text-align: right;
}
.liq-list .liq-meta .sig-tag {
  padding: 1px 5px;
  font-size: 10px;
  line-height: 1.4;
  border-radius: 3px;
}
.liq-list .liq-meta .sig-tag.sig-amt {
  background: rgba(74, 222, 128, 0.14);
  color: var(--success);
  font-weight: 700;
}
.liq-list .sig-tag.liq-leader {
  background: rgba(56, 189, 248, 0.14);
  color: #7dd3fc;
  max-width: 100px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  display: inline-block;
  vertical-align: middle;
}
/* Title flex-fills to the right — mirror .la-news-title */
.liq-list .liq-title {
  flex: 1 1 0;
  min-width: 0;
  font-size: 12px;
  line-height: 1.3;
  font-weight: 500;          /* mirror .la-news-title (was 600) */
  text-align: left;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Topic modal — full-list view of every event under a topic */
.topic-modal {
  max-width: 760px;
  width: min(760px, 96vw);
}
.topic-modal-head {
  border-bottom: 1px solid var(--border);
  margin-bottom: 12px;
  padding-bottom: 10px;
}
.topic-modal-title {
  font-size: 22px; font-weight: 800; color: #f59e0b;
  letter-spacing: 0.01em;
}
.topic-modal-sub {
  font-size: 12px; color: var(--muted); margin-top: 3px;
  font-family: monospace;
}
.topic-modal-body {
  display: flex; flex-direction: column; gap: 14px;
  max-height: calc(85vh - 100px);
  overflow-y: auto;
  padding-right: 4px;
}
.topic-plat-block {
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 8px 10px;
}
.topic-plat-head {
  display: flex; align-items: center; gap: 8px;
  border-bottom: 1px dashed var(--border);
  padding-bottom: 5px; margin-bottom: 5px;
}
.topic-plat-name {
  font-weight: 700; font-size: 13px; color: var(--text);
}
.topic-plat-count {
  font-family: monospace; font-size: 10px; color: var(--muted);
  margin-left: auto;
}
.topic-evt-list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column;
}
.topic-evt { border-bottom: 1px dashed rgba(255,255,255,0.04); }
.topic-evt:last-child { border-bottom: none; }
.topic-evt-link {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px; align-items: center;
  padding: 5px 0;
  color: var(--text); text-decoration: none;
  font-size: 12px;
}
.topic-evt-link:hover { color: #f59e0b; }
.topic-evt-title {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.topic-evt-vol {
  font-family: monospace; font-weight: 600;
  color: var(--muted); white-space: nowrap;
}
@media (max-width: 700px) {
  .topic-modal { width: 96vw; }
  .topic-modal-title { font-size: 18px; }
  .topic-modal-body { max-height: calc(100vh - 140px); }
}

/* ─── Build .80: page-wide PHQ section ──────────────────────────────────
   The "Top Real-World Events" card lives in its own row between the
   platform Top-20 grid and the Visitors row.  Wider canvas → two-column
   row layout (title block | meta block) so the list reads more like a
   compact table than a stacked column. */
.phq-section { padding: 0 20px 12px; }
.predicthq-card-wide {
  border-top: 3px solid #38bdf8;
}
.predicthq-card-wide .phq-controls {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.predicthq-card-wide .phq-tabs { flex: 1 1 auto; }
.predicthq-card-wide .phq-sort-row { flex: 0 0 auto; }

/* Wide list — two-column grid on desktop, falls back to stacked on narrow
   viewports. JS still emits the same DOM (li.phq-row > a.phq-link with
   .phq-title + .phq-meta) so we just restyle here. */
.phq-list-wide {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 2px 24px;
}
@media (max-width: 1100px) {
  .phq-list-wide { grid-template-columns: 1fr; }
}
/* Build .82: row padding tightened 8px → 4px and title font 13 → 12 so
   doubling the visible event count (10 → 20) keeps the total card height
   close to the prior dimensions.  Each row drops from ~34px → ~22px tall. */
.phq-list-wide > .phq-row {
  padding: 4px 0;
  border-bottom: 1px solid var(--border);
}
/* Build .80.2: row grid is [flag] [cat] [title 1fr] [meta auto].  The
   flag sits as the LEFTMOST cell so it lines up flush against each
   column's left edge across both data columns. */
.phq-list-wide .phq-link {
  display: grid;
  grid-template-columns: auto auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 2px 8px;
}
.phq-list-wide .phq-row-flag { grid-column: 1; }
.phq-list-wide .phq-cat   { grid-column: 2; }
.phq-list-wide .phq-title { grid-column: 3; }
.phq-list-wide .phq-meta  { grid-column: 4; }
.phq-list-wide .phq-title {
  font-size: 12px;
  line-height: 1.25;
  /* Single-line clipping — preserves the row-count vs height tradeoff:
     long titles ellipsize instead of forcing the row to expand. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.phq-list-wide .phq-cat {
  font-size: 9px;
  padding: 0 5px;
}
.phq-list-wide .phq-meta {
  justify-content: flex-end;
  font-size: 10px;
  white-space: nowrap;
  flex-wrap: nowrap;
  gap: 4px;
}
.phq-list-wide .phq-meta .phq-rank {
  font-size: 10px;
  padding: 0 4px;
}
.phq-list-wide .phq-meta .phq-poly-btn {
  font-size: 9px;
  padding: 1px 5px;
}
.phq-list-wide .phq-row-flag {
  display: inline-flex;
  align-items: center;
  justify-content: flex-start;
  min-width: 22px;
}
.phq-list-wide .phq-row-flag .flag-img {
  width: 18px;
}

/* PredictHQ detail modal */
.phq-modal {
  max-width: 720px;
  width: min(720px, 96vw);
}
.phq-modal-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 12px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--border);
}
.phq-modal-cat {
  font-size: 11px;
}
.phq-modal-title {
  font-size: 20px;
  font-weight: 700;
  color: var(--text);
  margin: 0;
  flex: 1 1 auto;
  line-height: 1.25;
}
.phq-state-badge {
  font-family: monospace;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  padding: 2px 6px;
  border-radius: 3px;
  background: rgba(255,255,255,0.06);
  color: var(--muted);
  letter-spacing: 0.05em;
}
.phq-state-active     { background: rgba(74, 222, 128, 0.18); color: var(--success); }
.phq-state-cancelled,
.phq-state-deleted    { background: rgba(239, 68, 68, 0.18); color: var(--danger); }
.phq-state-rescheduled,
.phq-state-postponed  { background: rgba(251, 191, 36, 0.18); color: #fbbf24; }
.phq-modal-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 10px;
  margin-bottom: 14px;
}
.phq-modal-stat {
  background: rgba(255,255,255,0.03);
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 10px 12px;
}
.phq-modal-stat-lbl {
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--muted);
  font-weight: 600;
  margin-bottom: 4px;
}
.phq-modal-stat-num {
  font-family: monospace;
  font-size: 22px;
  font-weight: 700;
  color: var(--text);
  line-height: 1;
}
.phq-modal-stat-of {
  font-size: 12px;
  color: var(--muted);
  font-weight: 500;
}
.phq-modal-stat-sub {
  font-size: 10px;
  color: var(--muted);
  margin-top: 4px;
}
.phq-modal-details {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
  margin-bottom: 12px;
}
.phq-modal-details th {
  text-align: left;
  vertical-align: top;
  padding: 6px 12px 6px 0;
  color: var(--muted);
  font-weight: 600;
  width: 130px;
  white-space: nowrap;
}
.phq-modal-details td {
  padding: 6px 0;
  color: var(--text);
  border-bottom: 1px solid var(--border);
}
.phq-modal-details tr:last-child td { border-bottom: none; }
.phq-modal-details td a { color: #38bdf8; text-decoration: none; }
.phq-modal-details td a:hover { text-decoration: underline; }
.phq-tz {
  font-family: monospace;
  font-size: 10px;
  color: var(--muted);
  margin-left: 8px;
  padding: 0 4px;
  background: rgba(255,255,255,0.04);
  border-radius: 2px;
}
.phq-modal-labels { line-height: 1.8; }
.phq-lbl {
  display: inline-block;
  font-family: monospace;
  font-size: 10px;
  padding: 2px 6px;
  margin-right: 3px;
  background: rgba(167, 139, 250, 0.10);
  color: #a78bfa;
  border-radius: 2px;
  cursor: help;
}
.phq-modal-foot {
  font-size: 10px;
  color: var(--muted);
  text-align: center;
  padding-top: 8px;
  border-top: 1px solid var(--border);
  font-style: italic;
}
.phq-modal-srclbl { cursor: help; }
/* Build .78: prominent "Search on Polymarket" CTA in the PHQ modal.
   Polymarket-branded gradient (their teal-green) so the off-platform
   destination reads visually. Sits between the related-markets list
   and the data-source footer. */
.phq-modal-cta {
  margin: 14px 0 4px;
  text-align: center;
}
.phq-modal-poly-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  background: linear-gradient(135deg, #14b8a6, #0ea5e9);
  color: #061325;
  font-weight: 700;
  font-size: 13px;
  text-decoration: none;
  border-radius: 6px;
  box-shadow: 0 2px 8px rgba(20, 184, 166, 0.25);
  transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.phq-modal-poly-btn:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(20, 184, 166, 0.4);
}
.phq-modal-poly-icon { font-size: 14px; }
.phq-modal-poly-sub {
  font-size: 10px;
  font-weight: 500;
  color: rgba(6, 19, 37, 0.65);
  margin-left: 4px;
}
/* Compact row-level Polymarket button on the PHQ event list. */
.phq-poly-btn {
  display: inline-flex;
  align-items: center;
  padding: 1px 6px;
  font-size: 10px;
  font-weight: 600;
  color: #14b8a6;
  background: rgba(20, 184, 166, 0.08);
  border: 1px solid rgba(20, 184, 166, 0.25);
  border-radius: 3px;
  text-decoration: none;
  margin-left: auto;
}
.phq-poly-btn:hover {
  background: rgba(20, 184, 166, 0.18);
  color: var(--accent);
}
/* Build v.03 .31 build 161 (2026-05-23): Kalshi-themed sibling to
   the Polymarket search button — same shape, blue/sapphire accent
   that matches Kalshi's brand colour (was --kalshi: #60a5fa). */
.phq-poly-btn.phq-kalshi-btn {
  color: #60a5fa;
  background: rgba(96, 165, 250, 0.08);
  border-color: rgba(96, 165, 250, 0.25);
  margin-left: 4px;  /* override the auto margin from the first button */
}
.phq-poly-btn.phq-kalshi-btn:hover {
  background: rgba(96, 165, 250, 0.18);
  color: #93c5fd;
}
.phq-modal-poly-btn.phq-modal-kalshi-btn {
  background: linear-gradient(135deg, #3b82f6, #60a5fa);
  box-shadow: 0 2px 8px rgba(96, 165, 250, 0.25);
  margin-left: 10px;
}

/* Build v0.35 20260524.200: Manifold deep-search button — third
   venue after Polymarket + Kalshi.  Manifold's brand color is amber
   (#f59e0b ≈ their orange-yellow). Uses same chip pattern as
   .phq-kalshi-btn for the row chip, same gradient pattern as
   .phq-modal-kalshi-btn for the modal CTA. */
.phq-poly-btn.phq-manifold-btn {
  color: #f59e0b;
  background: rgba(245, 158, 11, 0.08);
  border-color: rgba(245, 158, 11, 0.25);
  margin-left: 4px;
}
.phq-poly-btn.phq-manifold-btn:hover {
  background: rgba(245, 158, 11, 0.18);
  color: #fbbf24;
}
.phq-modal-poly-btn.phq-modal-manifold-btn {
  background: linear-gradient(135deg, #d97706, #f59e0b);
  box-shadow: 0 2px 8px rgba(245, 158, 11, 0.25);
  margin-left: 10px;
}
.phq-modal-poly-btn.phq-modal-kalshi-btn:hover {
  box-shadow: 0 4px 12px rgba(96, 165, 250, 0.4);
}
/* Build .78: MetaForecast probability-history sparkline. Uses the same
   evt-chart-wrap base height; adds spacing above to separate from the
   volume chart. */
.mf-hist-wrap {
  margin-top: 8px;
}
.mf-hist-sub {
  font-size: 11px;
  font-weight: 400;
  color: var(--muted);
  margin-left: 6px;
}
@media (max-width: 600px) {
  .phq-modal-title { font-size: 16px; }
  .phq-modal-stat-num { font-size: 18px; }
  .phq-modal-details th { width: 90px; font-size: 11px; }
}

/* Build .76: PHQ economic-impact banner (top of PHQ card) */
.phq-impact-banner {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: 8px;
  padding: 8px 10px;
  margin-bottom: 8px;
  background: linear-gradient(135deg, rgba(56, 189, 248, 0.06), rgba(34, 211, 238, 0.04));
  border: 1px solid rgba(56, 189, 248, 0.18);
  border-radius: 6px;
  font-family: monospace;
}
.phq-impact-stat { display: flex; flex-direction: column; }
.phq-impact-num {
  font-size: 16px;
  font-weight: 700;
  color: #38bdf8;
  line-height: 1.1;
}
.phq-impact-major { color: var(--success); }
.phq-impact-of { font-size: 11px; color: var(--muted); font-weight: 500; margin-left: 2px; }
.phq-impact-lbl {
  font-size: 9px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-top: 2px;
}
.phq-impact-top {
  grid-column: 1 / -1;
  padding-top: 6px;
  border-top: 1px dashed rgba(56, 189, 248, 0.18);
  font-family: inherit;
  cursor: help;
}
.phq-impact-toplink {
  display: block;
  font-size: 11px;
  font-weight: 600;
  color: var(--text);
  text-decoration: none;
  margin: 2px 0;
}
.phq-impact-toplink:hover { color: #38bdf8; text-decoration: underline; }
.phq-impact-topspend {
  font-family: monospace;
  font-size: 10px;
  color: #38bdf8;
}

/* Build .76: PHQ modal — related prediction markets section */
.phq-modal-matches {
  margin: 8px 0 12px;
  padding: 10px 12px;
  background: rgba(255,255,255,0.03);
  border: 1px solid var(--border);
  border-radius: 6px;
}
.phq-matches-loading {
  font-size: 11px;
  color: var(--muted);
  font-style: italic;
  text-align: center;
}
.phq-matches-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 6px;
  border-bottom: 1px solid var(--border);
  padding-bottom: 4px;
}
.phq-matches-title {
  font-size: 12px;
  font-weight: 700;
  color: var(--text);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.phq-matches-sub { font-size: 10px; color: var(--muted); font-family: monospace; }
.phq-matches-list { list-style: none; padding: 0; margin: 0; }
.phq-match-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
  font-size: 12px;
}
.phq-match-row:last-child { border-bottom: none; }
.phq-match-plat {
  font-family: monospace;
  font-size: 9px;
  font-weight: 700;
  padding: 2px 6px;
  border-radius: 2px;
  flex-shrink: 0;
}
.phq-match-title { flex: 1 1 auto; color: var(--text); }
.phq-match-title a { color: var(--text); text-decoration: none; }
.phq-match-title a:hover { color: #38bdf8; text-decoration: underline; }
.phq-match-conf {
  font-family: monospace;
  font-size: 10px;
  color: var(--muted);
  background: rgba(255,255,255,0.04);
  padding: 1px 5px;
  border-radius: 2px;
  cursor: help;
  flex-shrink: 0;
}

/* Build .76: globe legend overlay */
.vw-globe-wrap { position: relative; }
.vw-globe-legend {
  position: absolute;
  bottom: 6px;
  left: 6px;
  display: flex;
  gap: 12px;
  font-size: 9px;
  color: var(--muted);
  background: rgba(15, 23, 42, 0.6);
  padding: 4px 8px;
  border-radius: 3px;
  pointer-events: none;
  font-family: monospace;
}
.vw-leg-item { display: inline-flex; align-items: center; gap: 4px; }
.vw-leg-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
}
.vw-leg-dot-visitor { background: #f59e0b; }
.vw-leg-dot-phq { background: #22d3ee; }
.vw-leg-hint { color: rgba(148, 163, 184, 0.7); font-style: italic; }

/* Build .76: in-event-modal "Real-world event" badge (PHQ cross-match) */
.modal-phq-match {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin-top: 8px;
  padding: 6px 10px;
  background: rgba(34, 211, 238, 0.06);
  border: 1px solid rgba(34, 211, 238, 0.2);
  border-radius: 4px;
  font-size: 11px;
}
.modal-phq-icon { font-size: 13px; line-height: 1; }
.modal-phq-lbl {
  font-family: monospace;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  color: #22d3ee;
  letter-spacing: 0.05em;
}
.modal-phq-link {
  color: var(--text);
  text-decoration: none;
  font-weight: 600;
}
.modal-phq-link:hover { color: #22d3ee; text-decoration: underline; }
.modal-phq-meta {
  font-family: monospace;
  font-size: 10px;
  color: var(--muted);
}
.modal-phq-more {
  color: #22d3ee;
  font-weight: 600;
}
.movers-card .movers-name,
.reserved-card .reserved-name { font-weight: 800; }
.placeholder-body {
  padding: 18px 6px 10px;
  text-align: center;
  color: var(--muted);
}
.placeholder-icon {
  font-size: 28px;
  margin-bottom: 8px;
  opacity: 0.85;
}
.placeholder-title {
  font-weight: 700;
  color: var(--text);
  font-size: 13px;
  margin-bottom: 6px;
  letter-spacing: 0.02em;
}
.placeholder-sub {
  font-size: 11px;
  line-height: 1.5;
  max-width: 340px;
  margin: 0 auto;
  color: var(--muted);
}
.placeholder-sub em { color: var(--text); font-style: italic; }
.movers-placeholder .placeholder-icon { color: var(--accent); }

/* Build .67: Top-10 Movers populated rows. Reuses the signals-list /
   sig-row chrome from Smart-Money so platform pills + click-into-event
   modal behavior is consistent across the four list cards. */
/* Build .251: switch movers rows from grid (3-col) to flex so the logo
   added in build .230 doesn't overflow the grid and push the meta chips
   to a second row.  Logo → chip → title (flex:1) → meta (nowrap, right). */
.movers-list .mv-row .sig-link {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 5px;
}
.movers-list .mv-title {
  flex: 1 1 0;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 12px;
  line-height: 1.35;
}
.movers-list .mv-bet-chip {
  color: var(--muted);
  font-weight: 500;
  font-size: 11px;
}
.movers-list .mv-meta {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: nowrap;
}
.movers-list .mv-pct-pair {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-family: monospace;
  font-size: 11px;
  color: var(--muted);
}
.movers-list .mv-pct-pair .mv-prior { opacity: 0.7; }
.movers-list .mv-pct-pair .mv-current { color: var(--text); font-weight: 600; }
.movers-list .mv-arrow { font-size: 10px; }
.movers-list .mv-delta {
  font-family: monospace;
  font-weight: 700;
  font-size: 11px;
  padding: 1px 4px;
  border-radius: 3px;
  white-space: nowrap;
}
.movers-list .mv-up   { color: var(--success); }
.movers-list .mv-down { color: #f87171; }
.movers-list .mv-delta.mv-up   { background: rgba(74, 222, 128, 0.10); }
.movers-list .mv-delta.mv-down { background: rgba(248, 113, 113, 0.10); }
/* Build .77: 1h delta chip — smaller than the 24h chip so it reads as
   "supplementary context" rather than competing with the headline number.
   Inline label ("24h" / "1h") on each chip so the two are unambiguous. */
.movers-list .mv-delta-lbl {
  display: inline-block;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--muted);
  margin-right: 4px;
  opacity: 0.85;
}
.movers-list .mv-delta-1h {
  font-size: 10px;
  padding: 1px 5px;
}
.movers-list .mv-delta.mv-flat {
  color: var(--muted);
  background: rgba(138, 150, 196, 0.08);
}
.mv-footnote {
  margin-top: 6px;
  padding-top: 6px;
  border-top: 1px solid var(--border);
  color: var(--muted);
  font-size: 10px;
  text-align: center;
  cursor: help;
}
.signals-card {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
  padding: 10px 14px;
  /* Natural height — show all rows without an internal scrollbar.
     The page itself scrolls if the panel grows tall. */
}
/* .anomaly-card standalone removed in build .222 — content moved into
   .movers-bottom-half; .anomaly-card-split/.anomaly-top-half classes also
   removed from HTML; retaining .anomaly-bottom-half for sx.bet traders. */
.smartmoney-card { border-top: 3px solid var(--jackpot); }
.signals-card h3 { margin-bottom: 6px; }
.anomaly-bottom-half {
  flex: 0 0 auto;
  padding-top: 8px;
  border-top: 1px dashed var(--border);
  margin-top: 6px;
}
.anomaly-bottom-half .sxlb-heading {
  margin: 0 0 6px 0;
  font-size: 12px;
}
.anomaly-bottom-half .sxlb-heading .sxlb-name { color: #c084fc; font-weight: 800; }
.anomaly-bottom-half .sxlb-heading .plat-sub  { font-size: 10px; color: var(--muted); }
.sxlb-grid-compact {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.sxlb-grid-compact .sxlb-row {
  display: grid;
  grid-template-columns: 28px 110px 1fr 1fr;
  align-items: center;
  gap: 8px;
  padding: 3px 8px;
  background: var(--panel-2);
  border-radius: 4px;
  text-decoration: none;
  color: var(--text);
  cursor: pointer;
  transition: background 0.12s ease, transform 0.12s ease;
}
.sxlb-grid-compact .sxlb-row:hover { background: rgba(192,132,252,0.10); transform: translateX(2px); }
.sxlb-grid-compact .sxlb-rank { font-family: monospace; font-size: 11px; font-weight: 800; color: #c084fc; text-align: center; }
.sxlb-grid-compact .sxlb-wallet { font-family: monospace; font-size: 11px; color: var(--text); }
.sxlb-grid-compact .sxlb-stat { display: flex; flex-direction: column; align-items: flex-end; font-family: monospace; font-size: 11px; font-weight: 700; }
.sxlb-grid-compact .sxlb-stat-lbl { font-size: 8px; font-weight: 400; color: var(--muted); text-transform: uppercase; letter-spacing: 0.05em; margin-top: 0; }
.plat-name.anomaly-name { color: var(--danger); }
.plat-name.smartmoney-name { color: var(--jackpot); }
.signals-list { list-style: none; margin: 0; padding: 0; }
.sig-row { border-bottom: 1px solid var(--border); }
.sig-row:last-child { border-bottom: none; }
.sig-link {
  display: grid; grid-template-columns: 38px 1fr auto; gap: 8px; align-items: center;
  padding: 5px 4px; color: var(--text); font-size: 12px;
}
.sig-link:hover { background: var(--panel-2); text-decoration: none; }
.sig-plat {
  font-size: 9px; font-weight: 800; padding: 2px 5px; border-radius: 3px;
  letter-spacing: 0.08em; font-family: monospace; text-align: center;
}
.sig-poly .sig-plat { background: rgba(45,212,191,0.18); color: var(--accent); }
.sig-kalshi .sig-plat { background: rgba(96,165,250,0.18); color: var(--kalshi); }
.sig-manifold .sig-plat { background: rgba(167,139,250,0.18); color: #a78bfa; }
.sig-sxbet .sig-plat { background: rgba(236,72,153,0.18); color: var(--sxbet); }
.sig-limitless .sig-plat { background: rgba(249,115,22,0.18); color: var(--limitless); }
/* Build .32 / .34: Probable + Myriad — both PMXT-sourced, both deserve
   their own platform color so cross-venue groups + tickers stay readable. */
.sig-probable .sig-plat,
.sig-plat.sig-probable { background: rgba(34,197,94,0.18); color: var(--success); }   /* emerald */
.sig-myriad   .sig-plat,
.sig-plat.sig-myriad   { background: rgba(244,114,182,0.18); color: #f9a8d4; } /* rose */
.sig-title {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-weight: 600;
}
.sig-meta { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; justify-self: end; }
.sig-tag {
  background: var(--panel-2); color: var(--muted);
  padding: 1px 6px; border-radius: 3px; font-family: monospace; font-size: 10px;
  font-weight: 600; white-space: nowrap;
}
.sig-tag.sig-amt { background: rgba(251,191,36,0.18); color: var(--jackpot); }
.sig-tag.sig-topbet { background: rgba(244,114,182,0.15); color: var(--whale); }
.sig-fresh { color: var(--success); font-weight: 800; }
.sig-score {
  background: rgba(239,68,68,0.18); color: var(--danger);
  padding: 1px 6px; border-radius: 3px; font-family: monospace; font-size: 10px; font-weight: 700;
}

/* Bettor stance chips (FOR / AGAINST) — clarifies what the whale is
   actually wagering when the side+outcome combo (BUY YES vs SELL NO) is
   ambiguous to non-trader readers. */
.whale-stance {
  display: inline-block; margin-left: 6px;
  font-size: 10px; font-weight: 800; letter-spacing: 0.08em;
  padding: 2px 7px; border-radius: 3px; text-transform: uppercase;
  vertical-align: middle;
}
.whale-stance-for     { background: rgba(74,222,128,0.20); color: var(--success); }
.whale-stance-against { background: rgba(239,68,68,0.20);  color: var(--danger); }

/* ─── Cross-Platform Arbitrage panel (PolyRouter) ─── */
/* Build v0.31 build 101 (compaction): saves ~25-30px per arb-card by
   tightening padding/gaps/fonts. Visual hierarchy preserved (big bps
   number still dominates; secondary chips smaller). */
.arb-section {
  padding: 4px 20px 8px;
}
.arb-heading {
  margin: 0 0 5px;
  font-size: 12px;
  font-weight: 600;
}
.plat-name.arb-name {
  color: #f97316;
  font-size: 13px;
  font-weight: 800;
  letter-spacing: 0.02em;
}
.arb-grid {
  display: grid;
  /* Build v.03 .31 build 160 (2026-05-23): re-styled to mirror the
     Hot Underdog card visual identity (per user request "Arb boxes
     should look like hot underdog boxes").  Same 260px minmax + 8px
     gap as .hud-grid; identical layout grammar inside each card. */
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 6px;
  /* Build .249: stretch so all cards in a row grow to the tallest card's
     height — prevents the "jagged bottom edge" when title lengths differ */
  align-items: stretch;
}
.arb-card {
  background: var(--panel);
  border: 1px solid var(--border);
  border-left: 3px solid #f97316;
  border-radius: 5px;
  /* Build .239: redesigned layout — flex-column (title + body row).
     Old grid (auto / 1fr) replaced by flex children with their own padding. */
  padding: 0;
  cursor: pointer;
  transition: transform 0.12s ease, border-color 0.12s ease;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
/* Full-width title header — always reserves exactly 2 lines of space
   so every card has an identical-height title band regardless of whether
   the title wraps. Build .249: min-height = 2 × line-height + padding. */
.arb-title {
  padding: 5px 8px 4px;
  font-size: 11px;
  font-weight: 700;
  color: var(--text);
  border-bottom: 1px solid rgba(249, 115, 22, 0.18);
  background: rgba(249, 115, 22, 0.05);
  line-height: 1.3;
  /* Reserve 2 full lines: 2 × (11px × 1.3) + 5px top + 4px bottom ≈ 38px */
  min-height: calc(2 * 1.3em + 9px);
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  min-width: 0;
}
.arb-stale-inline { color: var(--danger); font-size: 10px; }
/* Two-column body — flex:1 fills whatever height remains after the
   title band, so cards that are stretched by align-items:stretch fill
   evenly rather than leaving a gap at the bottom. */
.arb-body {
  /* Build .292: single-column stack (was a row split into a flexible left
     column + a fixed 105px right column).  In a 260px grid card the left
     column was only ~150px, so .arb-plat-info (the platform name chip) got
     squeezed to nothing by the price/stance/countdown — the platforms "didn't
     present".  Stacking gives every row the full card width, so platforms
     show, and all fields read as ONE compact card. */
  display: flex;
  flex-direction: column;
  flex: 1 1 0;
  min-width: 0;
}
.arb-left {
  flex: 1 1 auto;
  min-width: 0;
  overflow: visible;         /* Build .292: full-width single column — no clipping */
  padding: 5px 8px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.arb-right {
  /* Build .292: was a fixed 105px right column; now a full-width horizontal
     meta strip BELOW the platforms (fees / net / vig / persists + liquidity),
     wrapping as needed. */
  flex: 0 0 auto;
  min-width: 0;
  overflow: visible;
  border-left: none;
  border-top: 1px solid rgba(249, 115, 22, 0.15);
  padding: 4px 8px 5px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}
/* Spread + net numbers block in left column */
.arb-spread-nums {
  display: flex;
  align-items: baseline;
  gap: 5px;
  flex-wrap: wrap;
}
/* Liquidity box in right column */
.arb-liq {
  /* Build .292: inline in the bottom meta strip (was a centered box pinned to
     the bottom of the old fixed right column via margin-top:auto). */
  margin-top: 0;
  padding: 2px 7px;
  background: rgba(45, 212, 191, 0.08);
  border: 1px solid rgba(45, 212, 191, 0.20);
  border-radius: 3px;
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 5px;
}
.arb-liq-icon { font-size: 12px; line-height: 1; }
.arb-liq-amt  { font-family: monospace; font-size: 13px; font-weight: 800; color: var(--accent); line-height: 1.1; }
.arb-liq-label { font-size: 7px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }
.arb-card:hover {
  transform: translateY(-1px);
  border-color: #f97316;
}
/* Build v.03 .31 build 160: arb-spread is the LEFT BADGE — directly
   mirrors .hud-mult.  Display only the spread % (no bps, no label —
   .hud-mult shows just "×3.5" + "vol multiplier"; we show "13%" +
   "spread"). */
.arb-spread {
  grid-row: 1 / -1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  background: rgba(249, 115, 22, 0.12);
  border-radius: 4px;
  padding: 3px 5px;
  min-width: 56px;
}
.arb-spread-bps {
  /* Hidden — replaced visually by .arb-spread-pct below.  Keeping the
     class in the template for any tooling that scrapes bps values. */
  display: none;
}
.arb-spread-pct {
  font-family: monospace;
  font-size: 13px;
  font-weight: 800;
  color: #f97316;
  line-height: 1;
}
.arb-spread-label {
  font-size: 8px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-top: 1px;
  text-align: center;
}
/* Build .232/.238: net spread % + countdown timers.
   Timers moved to right column (grid-column:2) in build .238 so the
   left badge stays compact — just the two big numbers + label. */
.arb-spread { min-width: 60px; }
.arb-spread-net {
  font-family: monospace;
  font-size: 13px; font-weight: 800; letter-spacing: 0.01em;
  color: #f97316;
  margin-top: 0;
  text-align: center; white-space: nowrap; line-height: 1;
}
.arb-spread-net-strong { color: var(--success); }
.arb-spread-net-zero   { color: var(--danger); }
.arb-countdowns {
  grid-column: 2;
  display: flex; flex-direction: row; flex-wrap: wrap; gap: 6px;
  align-items: center; margin: 0;
}
/* Build .242: arb-plat-info wraps all left content so arb-cd-row
   never gets squeezed off screen. arb-cd-plat removed (redundant). */
.arb-plat-info {
  flex: 1 1 0; min-width: 0; overflow: hidden;
  display: flex; align-items: center; gap: 4px;
}
.arb-cd-row {
  display: flex; flex-direction: row; align-items: center; gap: 3px;
  flex-shrink: 0; flex: 0 0 auto;
}
.arb-cd-timer {
  font-family: 'Courier New', Courier, monospace;
  font-size: 12px; font-weight: 700;
  color: var(--accent);
  background: rgba(45, 212, 191, 0.08);
  border: 1px solid rgba(45, 212, 191, 0.18);
  border-radius: 3px;
  padding: 1px 4px;
  letter-spacing: 0.06em;
  white-space: nowrap;
}
/* Build .250: flash red when ≤ 30 min remain on an arb. */
@keyframes arb-urgent-flash {
  0%, 100% { color: var(--danger); background: rgba(239, 68, 68, 0.20); border-color: rgba(239, 68, 68, 0.55); }
  50%       { color: #ff8080; background: rgba(239, 68, 68, 0.04); border-color: rgba(239, 68, 68, 0.18); }
}
.arb-cd-timer-urgent {
  animation: arb-urgent-flash 1s ease-in-out infinite;
}
/* Colorful buy/sell arrows on platform rows */
.arb-stance-buy  { color: var(--success) !important; font-weight: 800; }
.arb-stance-sell { color: var(--danger) !important; font-weight: 800; }
.arb-event-title {
  /* Build v.03 .31 build 160: mirror .hud-event-title exactly. */
  grid-column: 2;
  font-size: 11px;
  font-weight: 700;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  line-height: 1.25;
  margin: 1px 0;
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}
/* Build v.03 .31 build 172: clickable event-title link inside arb-card.
   Removed in build v0.35 20260523.173 — title is now plain text, the
   whole card click opens the disambiguation modal instead.  Style
   kept for any stragglers but the template no longer emits it. */
.arb-event-title-link {
  color: inherit;
  text-decoration: none;
  cursor: pointer;
}

/* Build v0.35 20260523.173: arb-card platform CHIP link — explicit
   external arrow + visual cue that this is the only thing in the row
   that escapes the arb-card's outer disambiguation handler. */
.arb-plat-chip-link {
  text-decoration: none;
  cursor: pointer;
  position: relative;
  transition: filter 120ms ease;
}
.arb-plat-chip-link:hover {
  filter: brightness(1.18);
  text-decoration: none;
}

/* Disambiguation modal: platform name in the cross-platform table
   is now a clickable per-venue event-card link. */
.arb-modal-plat-link {
  text-decoration: none;
  cursor: pointer;
  transition: filter 120ms ease, box-shadow 120ms ease;
}
.arb-modal-plat-link:hover {
  filter: brightness(1.20);
  box-shadow: 0 0 0 1px rgba(45,212,191,0.40);
}
/* VWAP "True Global Odds" chip on each arb-card. Sits in column 2 of
   the arb-card grid (the arb-spread block in col 1 already spans every
   row), between the event title and the per-platform price rows. */
.arb-vwap {
  grid-column: 2;
  display: flex; align-items: center; gap: 5px;
  margin: 1px 0;
  padding: 2px 6px;
  background: rgba(96,165,250,0.06);
  border: 1px solid rgba(96,165,250,0.20);
  border-radius: 3px;
  font-size: 10px;
  min-width: 0;
}
.arb-vwap-icon {
  font-size: 11px; line-height: 1; flex: 0 0 auto;
  width: 14px; text-align: center;
}
.arb-vwap-converged { color: var(--success); }
.arb-vwap-divergent { color: var(--jackpot); }
.arb-vwap-label {
  text-transform: uppercase; letter-spacing: 0.05em;
  font-size: 9px; color: var(--muted);
}
.arb-vwap-pct {
  font-family: monospace; font-weight: 700;
  color: var(--text); font-size: 11px;
}
.arb-vwap-meta {
  font-size: 9px; color: var(--muted);
  margin-left: auto;
  font-family: monospace;
}

/* VWAP block in the cross-venue group modal */
.eg-vwap {
  display: flex; align-items: flex-start; gap: 12px;
  margin: 12px 0; padding: 12px 14px;
  border-radius: 6px;
  background: rgba(96,165,250,0.06);
  border: 1px solid rgba(96,165,250,0.30);
}
.eg-vwap-converged { border-left: 4px solid var(--success); }
.eg-vwap-divergent { border-left: 4px solid var(--jackpot); }
.eg-vwap-icon {
  font-size: 22px; line-height: 1; flex: 0 0 auto;
}
.eg-vwap-converged .eg-vwap-icon { color: var(--success); }
.eg-vwap-divergent .eg-vwap-icon { color: var(--jackpot); }
.eg-vwap-body { flex: 1; min-width: 0; }
.eg-vwap-headline {
  font-size: 14px; color: var(--text);
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.eg-vwap-headline strong { font-family: monospace; font-size: 18px; color: #60a5fa; }
.eg-vwap-confidence {
  font-size: 10px; padding: 1px 6px; border-radius: 3px;
  text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600;
}
.eg-vwap-conf-high   { background: rgba(45,212,191,0.15); color: var(--success); }
.eg-vwap-conf-medium { background: rgba(96,165,250,0.15); color: #60a5fa; }
.eg-vwap-conf-low    { background: rgba(148,163,184,0.15); color: var(--muted); }
.eg-vwap-sub {
  font-size: 11px; color: var(--muted); margin-top: 4px;
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
}
.eg-vwap-tag {
  font-size: 10px; padding: 1px 6px; border-radius: 3px;
  text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600;
}
.eg-vwap-tag-good { background: rgba(45,212,191,0.18); color: var(--success); }
.eg-vwap-tag-warn { background: rgba(251,191,36,0.18); color: var(--jackpot); }

/* Build v.03 .31 build 160: arb-platforms now mirrors .hud-options —
   a flex-column of single-line rows, one per venue.  Cheapest YES
   (BUY side) gets a green-tinted row; most expensive (SELL side)
   gets a red tint; middle venues stay neutral.  Same compact
   flex-row pattern as .hud-option. */
.arb-platforms {
  grid-column: unset;
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 0;
}
.arb-plat-row {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 2px 4px;
  border-radius: 3px;
  font-size: 10px;
  min-width: 0;
  overflow: hidden;
  text-decoration: none;
  color: var(--text);
  background: rgba(148, 163, 184, 0.05);
  border: 1px solid rgba(148, 163, 184, 0.15);
}
.arb-plat-row:hover {
  text-decoration: none;
  background: rgba(148, 163, 184, 0.10);
}
/* Cheapest YES → BUY side; tint green. */
.arb-plat-row.arb-buy-side {
  background: rgba(34, 197, 94, 0.08);
  border-color: rgba(34, 197, 94, 0.30);
}
.arb-plat-row.arb-buy-side:hover {
  background: rgba(34, 197, 94, 0.14);
}
/* Most-expensive YES → SELL side; tint red. */
.arb-plat-row.arb-sell-side {
  background: rgba(239, 68, 68, 0.07);
  border-color: rgba(239, 68, 68, 0.28);
}
.arb-plat-row.arb-sell-side:hover {
  background: rgba(239, 68, 68, 0.12);
}
.arb-plat-row .sig-plat {
  flex: 0 0 auto;
  font-size: 9px;
}
.arb-plat-price {
  flex: 0 0 auto;            /* Build .265: never shrink — always visible */
  font-family: monospace;
  font-weight: 700;
  font-size: 11px;
  color: var(--text);
  flex: 0 0 auto;
}
.arb-plat-vol {
  flex: 1 1 0;
  min-width: 0;
  color: var(--muted);
  font-family: monospace;
  font-size: 9px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  text-align: right;
}
.arb-plat-spread {
  flex: 0 0 auto;
  font-family: monospace;
  color: var(--muted);
  font-size: 9px;
}
.arb-plat-stance {
  flex: 0 0 auto;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.arb-plat-row.arb-buy-side  .arb-plat-stance { color: var(--success, #4ade80); }
.arb-plat-row.arb-sell-side .arb-plat-stance { color: var(--danger,  #ef4444); }
.arb-plat-row:hover {
  text-decoration: none;
  color: #f97316;
}
.arb-plat-price {
  font-weight: 700;
  color: var(--accent);
}
/* .arb-plat-vol moved to a single definition above (build 159) —
   left-aligned now so volume reads next to price instead of being
   shoved to the right edge. */

/* Modal additions for the arb side-by-side view */
.arb-table .arb-yes-price {
  font-family: monospace;
  font-size: 14px;
  font-weight: 800;
  color: var(--accent);
}
.arb-stance {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 4px;
  font-family: monospace;
  font-size: 10px;
  font-weight: 800;
  letter-spacing: 0.04em;
}
.arb-stance.arb-buy  { background: rgba(34, 197, 94, 0.20); color: var(--success); }
.arb-stance.arb-sell { background: rgba(239, 68, 68, 0.20); color: var(--danger); }
.arb-table .arb-vol { font-family: monospace; color: var(--muted); }
.arb-table .arb-link a { color: var(--accent); text-decoration: none; }
.arb-disclaimer {
  margin-top: 14px;
  padding: 10px 14px;
  background: rgba(251, 191, 36, 0.10);
  border-left: 3px solid var(--jackpot);
  border-radius: 4px;
  font-size: 11px;
  color: var(--muted);
  line-height: 1.5;
}

/* Tier 1 arb enrichments (build .45): arb-size chip, stale flags,
   closed/paused platform chips, per-platform spread chip, modal
   columns for depth / spread / delta_1h. */
.arb-size {
  grid-column: unset;
  display: flex;
  align-items: baseline;
  gap: 5px;
  margin: 0;
  min-width: 0;
  flex-wrap: wrap;
  /* Build .246: brighter band-tinted halo around the max-size row */
  padding: 3px 6px;
  border-radius: 4px;
  background: rgba(74, 222, 128, 0.12);
  border: 1px solid rgba(74, 222, 128, 0.30);
}
.arb-size[data-band="green"]  { background: rgba(74,  222, 128, 0.15); border-color: rgba(74,  222, 128, 0.40); }
.arb-size[data-band="amber"]  { background: rgba(251, 191,  36, 0.15); border-color: rgba(251, 191,  36, 0.40); }
.arb-size[data-band="red"]    { background: rgba(239,  68,  68, 0.15); border-color: rgba(239,  68,  68, 0.40); }
.arb-size[data-band="unknown"] { background: rgba(148, 163, 184, 0.08); border-color: rgba(148, 163, 184, 0.22); }
.arb-size-icon {
  font-family: monospace;
  font-size: 11px;
  font-weight: 800;   /* Build .284: bolder tilde (was 400/normal — looked thin next to the 800-weight max-size amount) */
  color: var(--muted);
}
.arb-size-amt {
  font-family: monospace;
  font-size: 18px;
  font-weight: 800;
  color: var(--success);
}
.arb-size-label {
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 9px;
  color: var(--muted);
}
.arb-size-val { font-weight: 700; }

/* Build v0.35 20260525.223: color-grade the arb-size chip based on the
   `size_band` projection from self_arb_opportunities (green ≥ $1k,
   amber $100-1k, red < $100, unknown when depth is 0/missing). Gives
   the operator an at-a-glance "is this arb actually fillable?" answer
   per BI research 2026-05-25.  Color overrides the default green so
   amber/red unambiguously signal "small" / "paper" arbs. */
.arb-size[data-band="green"]  .arb-size-amt { color: var(--success); }
.arb-size[data-band="amber"]  .arb-size-amt { color: #fbbf24; }
.arb-size[data-band="red"]    .arb-size-amt { color: var(--danger); }
.arb-size[data-band="unknown"] .arb-size-amt { color: var(--muted, #94a3b8); }

/* Per-side breakdown subtext: compact "Buy $4.5k · Sell $200" line
   under the headline max-size chip.  Color-cues mirror the existing
   .arb-buy-side / .arb-sell-side scheme on platform rows so the user
   reads them as the same buy/sell visual language. */
.arb-size-breakdown {
  display: inline-flex;
  align-items: baseline;
  max-width: 100%;           /* Build .256: never overflow arb-left column */
  overflow: hidden;
  text-overflow: ellipsis;
  gap: 4px;
  font-family: monospace;
  font-size: 10px;
  margin-left: 6px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.arb-size-leg-sep { color: var(--muted, #94a3b8); }
.arb-size-buy  { color: var(--success, #4ade80); }
.arb-size-sell { color: var(--danger,  #ef4444); }
/* On amber / red headline, soften the per-side coloration so the
   warning state dominates the visual hierarchy. */
.arb-size[data-band="red"]   .arb-size-buy,
.arb-size[data-band="red"]   .arb-size-sell,
.arb-size[data-band="amber"] .arb-size-buy,
.arb-size[data-band="amber"] .arb-size-sell { opacity: 0.75; }

.arb-card-stale {
  background: rgba(148, 163, 184, 0.04);
  border-left-color: #94a3b8;
  opacity: 0.82;
}
.arb-card-stale:hover { border-color: #94a3b8; }

.arb-stale-flag {
  grid-column: 2;
  margin: 2px 0 0 0;
  padding: 2px 8px;
  background: rgba(251, 191, 36, 0.12);
  border-left: 2px solid var(--jackpot);
  border-radius: 2px;
  font-size: 10px;
  color: var(--jackpot);
  font-weight: 600;
  width: fit-content;
  letter-spacing: 0.03em;
}

/* ──────────────────────────────────────────────────────────────
   Hot Underdogs section (build v.03 .99.4; recolored .99.13)
   Mirrors the arb-card grid layout but in Kelly green (#16a34a) to
   distinguish from the orange arb cards. Green signals "opportunity /
   smart-money inflow" rather than the original crimson "alert/heat".
   Same 60s refresh cadence; different signal class (per-platform
   smart-money vs cross-platform arbs).
   ────────────────────────────────────────────────────────────── */
/* Build v0.31 build 101 (compaction): mirrors the arb-card compaction
   pass — saves ~25-30px per hud-card. Same hierarchy preserved (large
   green multiplier dominates; secondary chips smaller). */
.hud-section {
  padding: 4px 20px 8px;
}
.hud-heading {
  margin: 0 0 5px;
  font-size: 12px;
  font-weight: 600;
}
.plat-name.hud-name {
  color: #16a34a;
  font-size: 13px;
  font-weight: 800;
  letter-spacing: 0.02em;
}
.hud-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 8px;
}
.hud-card {
  background: var(--panel);
  border: 1px solid var(--border);
  border-left: 3px solid #16a34a;
  border-radius: 5px;
  padding: 0;
  cursor: pointer;
  transition: transform 0.12s ease, border-color 0.12s ease;
  /* Build .239: flex-column — header + body + options + meta + progress */
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.hud-card:hover {
  transform: translateY(-1px);
  border-color: #16a34a;
}
/* Header row: mult (left) + new money (right) */
.hud-header {
  display: flex;
  align-items: flex-end;
  gap: 8px;
  padding: 5px 8px 4px;
  border-bottom: 1px solid rgba(22, 163, 74, 0.15);
  background: rgba(22, 163, 74, 0.05);
}
.hud-mult {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  background: none;
  border-radius: 0;
  padding: 0;
  min-width: unset;
  grid-row: unset;
}
.hud-mult-x {
  font-family: monospace;
  font-size: 18px;
  font-weight: 800;
  color: #16a34a;
  line-height: 1;
}
.hud-mult-label {
  font-size: 8px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-top: 1px;
  text-align: left;
}
.hud-inc {
  grid-column: unset;
  flex: 1;
  display: flex;
  align-items: baseline;
  justify-content: flex-end;
  gap: 4px;
  margin: 0;
  min-width: 0;
}
.hud-inc-amt {
  font-family: monospace;
  font-size: 13px;
  font-weight: 800;
  color: #16a34a;
}
.hud-inc-label {
  font-size: 9px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
/* Build .239: body row = content (left) + liq box (right) */
.hud-body {
  display: flex;
  flex-direction: row;
  align-items: flex-start;
  gap: 0;
  padding: 5px 8px 4px;
  min-width: 0;
}
.hud-content {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.hud-liq {
  flex: 0 0 80px;
  border-left: 1px solid rgba(22, 163, 74, 0.15);
  margin-left: 8px;
  padding: 4px 6px;
  background: rgba(45, 212, 191, 0.08);
  border: 1px solid rgba(45, 212, 191, 0.20);
  border-radius: 3px;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 1px;
}
.hud-liq-icon  { font-size: 12px; line-height: 1; }
.hud-liq-amt   { font-family: monospace; font-size: 13px; font-weight: 800; color: var(--accent); line-height: 1.1; }
.hud-liq-label { font-size: 7px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }
.hud-platform-chip {
  grid-column: unset;
  margin: 0;
  min-width: 0;
  overflow: hidden;
  font-size: 10px;
}
.hud-event-title {
  grid-column: unset;
  font-size: 11px;
  font-weight: 700;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  line-height: 1.25;
  margin: 1px 0;
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}
/* Build v.03 .31 build 172: clickable event-title link inside hud-card.
   Symmetric with .arb-event-title-link — see comment there. */
.hud-event-title-link {
  color: inherit;
  text-decoration: none;
  cursor: pointer;
  position: relative;
  border-bottom: 1px dotted rgba(96,165,250,0.0);
  transition: border-bottom-color 120ms ease, color 120ms ease;
}
.hud-event-title-link:hover,
.hud-event-title-link:focus {
  color: #60a5fa;
  border-bottom-color: rgba(96,165,250,0.6);
  outline: none;
}
.hud-options {
  grid-column: unset;
  padding: 0 8px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 2px 0 1px 0;
}
.hud-option {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 2px 6px;
  border-radius: 3px;
  font-size: 10px;
  min-width: 0;
  overflow: hidden;
}
.hud-underdog {
  background: rgba(22, 163, 74, 0.08);
  border: 1px solid rgba(22, 163, 74, 0.30);
}
.hud-leader {
  background: rgba(148, 163, 184, 0.05);
  border: 1px solid rgba(148, 163, 184, 0.15);
}
.hud-option-marker {
  font-size: 11px;
  line-height: 1;
  flex: 0 0 auto;
  width: 12px;
  text-align: center;
}
.hud-underdog .hud-option-marker { color: #16a34a; }
.hud-leader   .hud-option-marker { color: var(--muted); }
.hud-option-label {
  /* flex-basis 0 (not auto) + min-width 0 so this child can shrink below
     its content width and the ellipsis clip kicks in. flex:1 1 auto was
     the cause of the overflow — auto basis = "don't shrink below content". */
  flex: 1 1 0;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text);
  /* Build v0.35 20260523.193: bolder betting-option title per user
     request — the underdog/leader candidate name is the focal point
     of the Hot Underdog card, so weight it heavier than the meta
     chips and price stamp. */
  font-weight: 700;
}
.hud-option-pct {
  font-family: monospace;
  font-weight: 700;
  font-size: 11px;
  color: var(--text);
  margin-left: auto;
}
.hud-meta {
  grid-column: unset;
  padding: 3px 8px 0;
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
  margin-top: 2px;
  min-width: 0;
}
.hud-meta-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;                  /* Build .266: +1px to balance the larger text */
  padding: 2px 6px;          /* Build .266: was 1px 5px */
  border-radius: 3px;
  /* Build .267: brighter "Before" chip — opacity 0.06 → 0.18 (3×) on bg,
     0.18 → 0.50 on border so the value reads as a proper highlighted chip
     rather than a barely-tinted span. */
  background: rgba(148, 163, 184, 0.18);
  border: 1px solid rgba(148, 163, 184, 0.50);
  font-size: 11px;
}
.hud-meta-chip.hud-meta-now {
  /* Build .267: brighter "Now" chip — opacity 0.06 → 0.20 on bg, 0.20 →
     0.55 on border.  Stronger kelly-green so the "Now" value reads as
     fresh/positive without needing the user to squint. */
  background: rgba(22, 163, 74, 0.20);
  border-color: rgba(22, 163, 74, 0.55);
}
/* Build .267: brighter inner text colors on both chips so the value
   pops against the brighter background. */
.hud-meta-chip .hud-meta-label { color: var(--text); }         /* slate-300, was --muted */
.hud-meta-chip .hud-meta-val   { color: #f1f5f9; }         /* slate-100, was --text */
.hud-meta-chip.hud-meta-now .hud-meta-label { color: #86efac; }   /* green-300 */
.hud-meta-chip.hud-meta-now .hud-meta-val   { color: #bbf7d0; }   /* green-200 */

/* Build v.03 .99.6: flag emojis next to country ISO codes.
   Slightly larger than the iso2 text and vertically nudged to align
   with the all-caps letters. Used inside .country-chip and inside
   .hud-meta-chip wherever a country is rendered. */
.flag-glyph {
  font-size: 1.1em;
  line-height: 1;
  vertical-align: -0.05em;
  /* Don't apply text-decoration / color filters from parent link. */
  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji",
               "Twemoji Mozilla", system-ui, sans-serif;
}
.hud-meta-label {
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 10px;           /* Build .266: was 8px (+25% to keep label/val ratio readable) */
  color: var(--muted);
}
.hud-meta-val {
  font-family: monospace;
  font-weight: 700;
  font-size: 11px;           /* Build .266: was 9px (+22%) */
  color: var(--text);
}
/* Build .239: progress bar — underdog% | bar | leader% */
.hud-progress {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 4px 8px 6px;
}
.hud-prog-ud, .hud-prog-lead {
  font-family: monospace;
  font-size: 11px;
  font-weight: 700;
  flex: 0 0 auto;
}
.hud-prog-ud   { color: #16a34a; }
.hud-prog-lead { color: var(--muted); }
.hud-prog-bar  {
  flex: 1;
  height: 4px;
  background: rgba(148, 163, 184, 0.20);
  border-radius: 2px;
  overflow: hidden;
}
.hud-prog-fill {
  height: 100%;
  background: #16a34a;
  border-radius: 2px;
  max-width: 100%;
}

.arb-plat-closed {
  opacity: 0.55;
  text-decoration: line-through;
}
.arb-plat-status {
  display: inline-block;
  padding: 0 5px;
  font-size: 9px;
  font-weight: 700;
  border-radius: 2px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  vertical-align: middle;
  margin-left: 4px;
}
.arb-plat-closed-chip {
  background: rgba(239, 68, 68, 0.18);
  color: var(--danger);
}
.arb-plat-paused-chip {
  background: rgba(251, 191, 36, 0.18);
  color: var(--jackpot);
}

.arb-plat-spread {
  font-size: 9px;
  color: var(--muted);
  font-family: monospace;
  margin-left: 4px;
}

/* Modal table extra columns */
.arb-depth, .arb-spread-cell, .arb-delta {
  font-family: monospace;
  font-size: 12px;
  color: var(--text);
}
.arb-depth { text-align: right; }
.arb-depth-est {
  color: var(--muted);
  font-size: 10px;
  margin-left: 2px;
  font-weight: 400;
}
.arb-spread-cell { text-align: right; color: var(--muted); }
.arb-delta { text-align: right; }
.arb-delta-up   { color: var(--success); }
.arb-delta-down { color: var(--danger);  }
.arb-delta-flat { color: var(--muted); }

.arb-row-stale {
  opacity: 0.6;
  text-decoration: line-through;
}
.arb-row-stale .arb-stance { opacity: 0.75; }

/* Tier 2 meta-strip (build .46): fees / net spread / implied vig /
   persistence_hours. Lives at the bottom of the arb-card and at the
   top of the arb modal (between the headline and the table). */
.arb-meta {
  grid-column: unset;
  display: flex;
  flex-direction: row;       /* Build .292: horizontal chip strip (was a vertical column) */
  flex-wrap: wrap;
  align-items: center;
  gap: 4px;
  margin-top: 0;
  min-width: 0;
}
/* In the right column, each chip is a row: label left, val right */
.arb-right .arb-meta-chip {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.arb-meta-modal {
  margin: 8px 0 4px;
}
.arb-meta-chip {
  display: inline-flex;
  align-items: baseline;
  gap: 3px;
  padding: 1px 5px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 3px;
  font-family: monospace;
  font-size: 9px;
  color: var(--text);
  cursor: help;
}
.arb-meta-label {
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 8px;
  color: var(--muted);
}
.arb-meta-val { font-weight: 700; }

.arb-meta-fee     { border-color: rgba(148,163,184,0.30); }
.arb-meta-net     { border-color: rgba(96,165,250,0.30); }
.arb-meta-net-zero {
  opacity: 0.65;
  background: rgba(148,163,184,0.10);
}
.arb-meta-net-zero .arb-meta-val { color: var(--muted); }
.arb-meta-net-strong {
  background: rgba(45,212,191,0.10);
  border-color: rgba(45,212,191,0.40);
}
.arb-meta-net-strong .arb-meta-val { color: var(--success); }

.arb-meta-vig     { border-color: rgba(251,191,36,0.30); }
.arb-meta-vig .arb-meta-val { color: var(--jackpot); }
.arb-meta-vig-arb {
  background: rgba(45,212,191,0.12);
  border-color: rgba(45,212,191,0.50);
}
.arb-meta-vig-arb .arb-meta-val { color: var(--success); }

.arb-meta-persist { border-color: rgba(96,165,250,0.30); }
.arb-meta-persist .arb-meta-val { color: #60a5fa; }

.arb-meta-size { border-color: rgba(45,212,191,0.30); }
.arb-meta-size .arb-meta-val { color: var(--success); }

/* Modal table extra columns (build .46) */
.arb-fee-cell {
  font-family: monospace;
  font-size: 12px;
  text-align: right;
  color: var(--muted);
}
.arb-fee-cell .arb-fee-none { color: var(--success); font-weight: 700; }

@media (max-width: 600px) {
  .arb-grid { grid-template-columns: 1fr; }
}

/* Public wallet page (/wallet/<addr>) — long-form leaderboard profile */
.wallet-page-main { padding: 16px 20px 80px; max-width: 1200px; margin: 0 auto; }
.wallet-not-found { text-align: center; padding: 60px 20px; color: var(--muted); }
.wallet-not-found h1 { color: var(--text); margin-bottom: 8px; }
.wallet-hero {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
  padding: 22px 24px; margin-bottom: 20px;
}
.wallet-hero-name { font-size: 28px; font-weight: 800; margin: 0 0 4px; }
.wallet-hero-addr { font-family: monospace; font-size: 12px; color: var(--muted); margin-bottom: 16px; }
.wallet-hero-addr code { font-size: 11px; word-break: break-all; }
.wallet-hero-empty { font-size: 13px; color: var(--muted); padding: 12px 0; }
.wallet-hero-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.wallet-badge {
  display: inline-block; padding: 4px 10px; border-radius: 14px;
  background: var(--panel-2); color: var(--text);
  font-size: 12px; font-weight: 700; letter-spacing: 0.02em;
}
.wallet-badge-roi.roi-strong { background: rgba(34,197,94,0.20); color: var(--success); border: 1px solid rgba(34,197,94,0.4); }
.wallet-badge-roi.roi-good   { background: rgba(74,222,128,0.15); color: var(--success); }
.wallet-badge-roi.roi-mid    { color: var(--muted); }
.wallet-badge-roi.roi-bad    { background: rgba(239,68,68,0.18); color: var(--danger); }
.wallet-badge-elite {
  background: linear-gradient(90deg, rgba(34,197,94,0.30), rgba(45,212,191,0.30));
  color: #0b1020; border: 2px solid var(--success);
  font-size: 13px; font-weight: 800;
}
.wallet-hero-stats {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;
}
.wh-stat { background: var(--panel-2); border-radius: 6px; padding: 14px; text-align: center; }
.wh-stat-num { font-family: monospace; font-size: 22px; font-weight: 800; color: var(--accent); }
/* Build v0.35 20260525.217 (item 1): green/red tint for the Net P&L
   tile in the wallet hero — pulls the PnL sign into the big-bold box
   so visitors don't need to read the small "+" sign to read the trend. */
.wh-stat-num.wh-stat-pos { color: #10b981; }
.wh-stat-num.wh-stat-neg { color: var(--danger); }
.wh-stat-lbl { font-size: 10px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; margin-top: 4px; }
@media (max-width: 700px) { .wallet-hero-stats { grid-template-columns: repeat(2, 1fr); } }
/* Build v0.4 20260530.283: activity-first hero — 5 columns (was 4) for
   Total bets / Total events / Avg per bet / Avg per event / sparkline.
   The sparkline tile sets `color: var(--accent)` so the inline SVG's
   stroke="currentColor" inherits the accent without a hardcoded hex. */
.wallet-hero-activity { grid-template-columns: repeat(5, 1fr); }
.wh-stat-spark { color: var(--accent); display: flex; flex-direction: column; justify-content: center; }
.wh-spark-wrap { width: 100%; height: 30px; display: flex; align-items: center; justify-content: center; }
.wh-spark-svg { width: 100%; height: 100%; overflow: visible; }
.wh-spark-empty { font-family: monospace; font-size: 18px; font-weight: 800; color: var(--muted); }
@media (max-width: 700px) { .wallet-hero-activity { grid-template-columns: repeat(2, 1fr); } }
/* Build .283: prominent open-positions row under the hero boxes (full page) */
.wallet-openpos-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px;
  background: var(--panel-2); border: 1px solid var(--border);
  border-left: 3px solid var(--accent); border-radius: 6px;
  padding: 12px 14px; margin: 14px 0 0 0; font-size: 13px;
}

.wallet-platforms { margin-bottom: 18px; }
.wp-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; padding: 0 20px; }
.wp-card { background: var(--panel-2); border-radius: 6px; padding: 12px; }
.wp-plat { display: inline-block; margin-bottom: 6px; }
.wp-trades { font-size: 12px; color: var(--muted); }
.wp-vol { font-family: monospace; font-size: 14px; color: var(--accent); margin-top: 2px; }

/* PMXT positions block on /wallet/<addr> pages (added May 13). Live
   open-position data fetched per wallet from pmxt.Polymarket().fetch_positions().*/
.wallet-pmxt { padding: 0 20px; margin-bottom: 24px; }
.wallet-pmxt .section-sub { font-size: 12px; color: var(--muted); font-weight: 400; margin-left: 8px; }
.pmxt-summary {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
  margin-bottom: 14px;
}
.pmxt-stat {
  background: var(--panel-2); border-radius: 6px; padding: 10px 14px;
  border-top: 2px solid #a78bfa;
}
.pmxt-stat-label {
  font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--muted); margin-bottom: 4px;
}
.pmxt-stat-val { font-family: monospace; font-size: 18px; font-weight: 600; }
.pmxt-pnl-pos { color: var(--success); }
.pmxt-pnl-neg { color: var(--danger); }
.pmxt-plat-header {
  font-size: 13px; margin: 12px 0 6px 0;
  display: flex; align-items: center; gap: 10px;
}
.pmxt-plat-count { color: var(--muted); font-size: 11px; font-weight: 400; }
.pmxt-pos-table {
  width: 100%; border-collapse: collapse; font-size: 12px;
  background: var(--panel-2); border-radius: 6px; overflow: hidden;
}
.pmxt-pos-table th {
  text-align: left; padding: 6px 10px; color: var(--muted);
  font-size: 10px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em;
  border-bottom: 1px solid var(--border);
}
.pmxt-pos-table td { padding: 7px 10px; border-bottom: 1px solid rgba(167,139,250,0.08); }
.pmxt-pos-table tr:last-child td { border-bottom: none; }
.pmxt-num { font-family: monospace; text-align: right; }
.pmxt-more { font-size: 11px; color: var(--muted); margin-top: 6px; padding-left: 10px; }
/* Build .68: Market + Bet columns added to the PMXT open-positions table. */
.pmxt-mkt {
  font-size: 13px;
  max-width: 360px;
  cursor: help;
}
.pmxt-mkt a { color: var(--text); text-decoration: none; }
.pmxt-mkt a:hover { color: var(--accent); text-decoration: underline; }
.pmxt-bet {
  font-size: 12px;
  font-weight: 600;
  color: var(--accent);
  white-space: nowrap;
}
@media (max-width: 700px) {
  .pmxt-summary { grid-template-columns: 1fr; }
  .pmxt-mkt { max-width: 180px; font-size: 11px; }
}

/* Build v0.4 20260526.229: sx.bet L3 surfacing.

   Two pieces:
     1. The "↔ Also on sx.bet" cross-match chip in the wallet hero
        badges row.  Fires when this Polymarket EOA is also active
        as an sx.bet maker (per the L3 archive's wallet_index).
        Cyan-purple tint differentiates it from green ROI badges.
     2. The "🎯 sx.bet Open Orders" panel just above the recent-trades
        section.  Reuses .pmxt-pos-table for layout consistency
        with the PMXT open-positions block — purpose is similar
        (forward-looking exposure), and one shared visual vocab
        keeps the page legible. */
.wallet-badge-cross-match {
  background: linear-gradient(90deg, rgba(34,211,238,0.20), rgba(167,139,250,0.22));
  color: var(--text);
  border: 1px solid rgba(34,211,238,0.35);
}

/* Build v0.4 20260526.230: per-source logo emblems sitting beside the
   text platform-chips throughout tickers, cards, and event rows.  The
   existing .sig-plat coloured badge stays (color affordance + fallback
   when a venue has no PNG yet) — the logo just makes the brand
   immediately scannable.  Sized to align with the smaller ticker
   chips; on rows that use larger 14-16 px logos elsewhere (top-20
   list, board panels) the existing .mkt-logo / .board-panel-logo
   rules keep those bigger. */
.plat-chip-logo {
  width: 14px;
  height: 14px;
  vertical-align: middle;
  margin-right: 4px;
  border-radius: 2px;
  flex-shrink: 0;
}
/* Build .252: Manifold logo is dark indigo — almost invisible on our dark
   background.  Boost brightness universally wherever it appears. */
img[src*="manifold"] { filter: brightness(3) saturate(0.9); }

.wallet-sxbet-orders { padding: 0 20px; margin-bottom: 24px; }
.wallet-sxbet-orders .section-sub {
  font-size: 12px; color: var(--muted); font-weight: 400; margin-left: 8px;
}
.sxbet-orders-wrap { overflow-x: auto; }
.sxbet-orders-table th:first-child,
.sxbet-orders-table td:first-child { padding-left: 12px; }
/* Subtle cyan top-stripe so the section reads as sx.bet at a glance,
   echoing the cross-match chip palette. */
.sxbet-orders-table {
  border-top: 2px solid rgba(34,211,238,0.45);
}
.sxbet-exp {
  font-size: 11px; color: var(--muted);
  white-space: nowrap;
}

.wallet-trades-wrap { padding: 0 20px; overflow-x: auto; }
.wallet-page .back-link {
  font-size: 12px; color: var(--muted); text-decoration: none;
}
.wallet-page .back-link:hover { color: var(--accent); }

/* Elite-wallet styling on the leaderboard panel */
.sig-row-elite { background: linear-gradient(90deg, rgba(34,197,94,0.06), transparent); }
.elite-star { margin-left: 4px; font-size: 12px; }

/* Admin link + footer Collect Now (Phase 4 + admin gating) */
.admin-link {
  font-size: 11px; color: var(--muted); text-decoration: none;
  margin-left: 8px; opacity: 0.5; cursor: pointer;
}
.admin-link:hover { opacity: 1; color: var(--accent); }
.collect-btn-footer {
  font-size: 11px; padding: 3px 10px; margin-left: 4px;
  vertical-align: middle;
}

/* Build .260: .rp-section-title + .rp-table cell rules removed —
   Risers + Coldest now use the .movers-merged-card / .mvm-* namespace. */

/* Rank-change arrows on Top-20 rows. Sit at the row's far left; the
   row's existing left padding/numbering stays in place. */
.t20-arrow {
  display: inline-block; width: 14px; text-align: center;
  margin-right: 4px; font-family: monospace;
  font-size: 11px; line-height: 1;
  vertical-align: middle;
}
.t20-arrow-up   { color: var(--success); }
.t20-arrow-down { color: var(--danger);  }
.t20-arrow-same { color: #fbbf24; opacity: 0.8; }
.t20-arrow-new  { color: #a78bfa; }

/* Section headings (subtle hr above each major below-the-fold section) */
.section-heading {
  font-size: 13px; font-weight: 700; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--muted);
  margin: 18px 20px 8px; padding-bottom: 6px;
  border-bottom: 1px solid var(--border);
}

/* Wallet track-record badges (in smart-money rows + top-wallets card) */
.track-badge {
  font-family: monospace; font-size: 10px; font-weight: 700;
  padding: 1px 5px; border-radius: 3px;
}
.track-badge.tr-good { background: rgba(74,222,128,0.18); color: var(--success); }
.track-badge.tr-bad  { background: rgba(239,68,68,0.18); color: var(--danger); }
.track-badge.tr-mid  { background: var(--panel-2); color: var(--muted); }

/* Marketplace activity table (replaces Whale Leaderboard in signals row) */
.marketplace-card { border-top: 3px solid #60a5fa; }
.plat-name.marketplace-name { color: #60a5fa; }

/* Build v0.35 20260523.193 (2026-05-23): Latest Analysis card.
   Purple top-stripe (#a78bfa) distinguishes editorial/insight content
   from the data-pull cards (Anomaly amber, Smart-Money pink,
   Marketplace blue, Movers/Topics accent).  Placeholder body is
   centered with a muted icon + heading so the reserved slot reads
   intentionally-empty rather than broken. */
.latest-analysis-card { border-top: 3px solid #a78bfa; }
.plat-name.latest-analysis-name { color: #a78bfa; }
.latest-analysis-placeholder {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 28px 16px;
  gap: 6px;
  color: var(--muted);
  min-height: 120px;
}
.la-placeholder-icon { font-size: 28px; line-height: 1; opacity: 0.7; }
.la-placeholder-title {
  font-size: 13px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: 0.02em;
}
.la-placeholder-text {
  font-size: 11px;
  line-height: 1.45;
  max-width: 36ch;
  color: var(--muted);
}

/* Build v0.35 20260524 (2026-05-24): Latest News list inside the
   .latest-analysis-card.  Each item is a single link wrapping the
   headline + provider badge + source + relative age.  Provider
   badge colors mirror the modal "Related news" badges so the visual
   language stays consistent across page surfaces (Guardian blue,
   NewsData amber, Currents emerald, HN orange, GDELT slate). */
/* Build v0.35 20260525.222: compact inline layout — provider badge + age
   on the same line as the headline (was two-block column layout). */
.la-news-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;   /* was 4px */
}
.la-news-item { margin: 0; padding: 0; }
.la-news-link {
  display: flex;
  flex-direction: row;       /* was column */
  align-items: baseline;
  gap: 6px;
  padding: 4px 8px;          /* was 7px 8px */
  border-radius: 4px;
  text-decoration: none;
  color: var(--text);
  border-left: 2px solid transparent;
  transition: background-color 0.12s ease, border-color 0.12s ease;
}
.la-news-link:hover {
  background: rgba(167, 139, 250, 0.06);
  border-left-color: #a78bfa;
}
.la-news-title {
  flex: 1 1 0;
  min-width: 0;
  font-size: 12px;
  line-height: 1.3;
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;       /* single-line clamp in row layout */
}
.la-news-meta {
  flex-shrink: 0;
  display: flex;
  gap: 4px;
  align-items: center;
  font-size: 10.5px;
  color: var(--muted);
}
.la-news-prov {
  display: inline-block;
  padding: 1px 6px;
  border-radius: 3px;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1.4;
  background: var(--panel-2);
  color: var(--muted);
}
.la-news-prov-badge-guardian   { background: rgba(93, 168, 255, 0.18); color: #5da8ff; }
.la-news-prov-badge-newsdata   { background: rgba(245, 158, 11, 0.18); color: #f59e0b; }
.la-news-prov-badge-currents   { background: rgba(16, 185, 129, 0.18); color: #10b981; }
.la-news-prov-badge-hackernews { background: rgba(255, 102, 0, 0.20);  color: #ff6600; }
.la-news-prov-badge-gdelt      { background: rgba(148, 163, 184, 0.18); color: #94a3b8; }
.la-news-source {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  max-width: 18ch;
}
.la-news-age {
  margin-left: 0;   /* was auto (only needed in column layout) */
  font-variant-numeric: tabular-nums;
  opacity: 0.85;
}
/* Build v.03 .31 build 169 (2026-05-23): explicit top-anchor for the
   Marketplace Activity card.  It spans 2 grid rows in the 3×2 signals
   grid, so the card height is tall; without an explicit justify-content
   the flex children (h3 + 7-day chart + table) could end up visually
   floating relative to neighbouring cards.  Force top alignment so the
   list sits at the top of its box regardless of total card height. */
.signals-row-3x2 .marketplace-card {
  justify-content: flex-start;
  align-content:   flex-start;
}
.marketplace-card .mkt-table {
  /* Ensures any margin-collapse doesn't push the table downward.
     Build v.03 .31 build 172: dropped `margin-bottom: auto` — the chart
     now lives BELOW the table (build 169 layout had chart above, table
     below).  With table-first, the chart fills any remaining flex
     space naturally and pushing the table to the top is unnecessary. */
  margin-top: 4px;
  margin-bottom: 8px;
}
/* Build v.03 .31 build 172: kill any leading whitespace above the h3.
   `signals-card` already pads internally; we want the title flush. */
.marketplace-card > h3 {
  margin-top: 0;
}

/* Build v.03 .31 build 171 (2026-05-23): platform-logo PNGs next to
   venue names.  Three sizes — 16px in the Marketplace Activity table,
   20px in the top-10 hero tile headers, 14px in the top-20 tab nav.
   Use vertical-align: middle so they line up with the text baseline
   nicely.  `object-fit: contain` defends against logos that aren't
   perfectly square. */
.mkt-logo {
  display: inline-block;
  vertical-align: -3px;
  margin-right: 6px;
  width: 16px;
  height: 16px;
  object-fit: contain;
  border-radius: 2px;
  /* Subtle ring so light logos don't disappear against the dark panel */
  background: rgba(255,255,255,0.04);
}
.plat-logo {
  display: inline-block;
  vertical-align: -4px;
  margin-right: 6px;
  width: 20px;
  height: 20px;
  object-fit: contain;
  border-radius: 3px;
  background: rgba(255,255,255,0.04);
}
.t20-tab-logo {
  display: inline-block;
  vertical-align: -2px;
  margin-right: 4px;
  width: 14px;
  height: 14px;
  object-fit: contain;
  border-radius: 2px;
  background: rgba(255,255,255,0.04);
}
/* Slightly compact spacing on the top-20 tab buttons so the logo +
   text don't visually overflow on narrow viewports. */
.top-events-tabs button { gap: 0; }
/* Build .57 — visible "as of HH:MM UTC" freshness chip in the card header. */
.mkt-asof {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 7px;
  font-family: monospace;
  font-size: 10px;
  color: var(--muted);
  background: var(--panel-2);
  border-radius: 10px;
  cursor: help;
  vertical-align: 1px;
  letter-spacing: 0.02em;
}
.mkt-table {
  width: 100%; border-collapse: collapse;
  font-size: 12px; line-height: 1.4;
}
.mkt-table th {
  text-align: left; padding: 6px 8px;
  border-bottom: 1px solid var(--border);
  color: var(--muted); font-weight: 500;
  text-transform: uppercase; letter-spacing: 0.05em; font-size: 10px;
}
.mkt-table td {
  padding: 7px 8px; border-bottom: 1px solid rgba(96,165,250,0.08);
  vertical-align: middle;
}
.mkt-table tr:last-child td { border-bottom: none; }
.mkt-table .mkt-rank   { text-align: center; color: var(--muted); font-family: monospace; width: 28px; }
.mkt-table .mkt-vol    { font-family: monospace; font-weight: 600; text-align: right; }
.mkt-table .mkt-vol-sub { color: var(--muted); font-weight: 400; font-size: 10px; display: block; }
.mkt-table .mkt-delta  { font-family: monospace; text-align: right; font-size: 11px; width: 70px; }
.mkt-table .mkt-events { font-family: monospace; text-align: right; color: var(--muted); width: 60px; }
.mkt-table .mkt-source { font-size: 10px; color: var(--muted); width: 90px; }
.mkt-table .mkt-source-pmxt { color: #a78bfa; }   /* PMXT rows in purple */
.mkt-table .mkt-na     { color: var(--muted); opacity: 0.5; }
.mkt-table .mkt-row-pmxt td.mkt-name .sig-plat { opacity: 0.85; }
/* Build .272 (2026-05-29): venue name + logo in the Marketplace Activity
   table link to the platform's homepage.  Inherit color + drop the default
   underline so the row renders identically to before; hover underlines the
   name badge as a click affordance.  display:inline keeps the existing logo
   vertical-align + margin layout untouched. */
.mkt-name-link { color: inherit; text-decoration: none; cursor: pointer; }
.mkt-name-link:hover .sig-plat { text-decoration: underline; }
.mkt-name-link:focus-visible { outline: 1px solid var(--accent); outline-offset: 2px; border-radius: 3px; }
/* Build .284: subtle dark hue behind each Marketplace Activity source cell so the
   per-platform colored name + logo read with more contrast (esp. on the peachy-cream
   default).  var(--source-tint) is a theme-agnostic black-alpha overlay. */
.mkt-table td.mkt-name { background: var(--source-tint); }
/* Build .286: stronger contrast for the Marketplace Activity venue-name chips
   (operator request).  A 1px outline in the chip's OWN colour (currentColor =
   the per-venue brand var) turns each name into a crisp, defined pill, and a
   small font bump aids legibility.  currentColor keeps it tenet-compliant (no
   hard-coded hue) and theme-adaptive; scoped to .mkt-table so the compact
   ticker / arb-card / liquidity .sig-plat chips elsewhere are untouched. */
.mkt-table td.mkt-name .sig-plat {
  font-size: 10px;
  border: 1px solid currentColor;
  /* Build .288: dark halo around the brand-coloured name so it contrasts hard
     against its same-hue brand-tint background (operator request — the prior
     border + tint weren't enough on their own). */
  text-shadow: 0 1px 2px var(--chip-halo), 0 0 2px var(--chip-halo);
}
/* Build .285: click-to-sort column headers on generic .sortable tables. */
table.sortable th.th-sortable { cursor: pointer; user-select: none; white-space: nowrap; }
table.sortable th.th-sortable:hover { color: var(--accent); }
table.sortable th.sorted-asc::after  { content: " \25B2"; font-size: 0.72em; color: var(--accent); }
table.sortable th.sorted-desc::after { content: " \25BC"; font-size: 0.72em; color: var(--accent); }
.mkt-table .delta-up   { color: var(--success); }
.mkt-table .delta-down { color: var(--danger); }
.mkt-table .delta-flat { color: var(--muted); }
/* Build .274 (2026-05-29): forecaster venues (Foretold / FantasySCOTUS) have no
   real trading volume, so their delta columns show consensus drift (mean absolute
   move of the leading option's probability, in percentage points) instead of a
   volume Δ%, and their volume cell shows a forecast-count confidence chip rather
   than a misleading "$" figure.  Consensus drift is always a non-negative
   magnitude (signed moves cancel under averaging) so it gets the neutral accent
   color, not the up/down green/red of volume momentum. */
.mkt-table .mkt-consensus { color: var(--accent); font-variant-numeric: tabular-nums; }
.mkt-table .mkt-consensus .mkt-pp { font-size: 0.82em; opacity: 0.7; margin-left: 1px; }
.mkt-table .mkt-conf-chip {
  display: inline-flex; align-items: center; gap: 3px;
  /* Build .284: was color:#cbd5e1 (hardcoded slate-300) — invisible on the
     peachy-cream default.  var(--text) makes it readable in both themes;
     weight bumped 600->800 per "barely visible / bolder". */
  font-size: 11px; font-weight: 800; color: var(--text); white-space: nowrap;
}
.mkt-table .mkt-conf-chip .mkt-conf-unit {
  font-size: 9px; font-weight: 700; opacity: 0.85; text-transform: uppercase;
}
.mkt-footnote {
  margin-top: 8px; padding: 6px 0 0 0;
  font-size: 10px; color: var(--muted); line-height: 1.5;
  border-top: 1px dashed var(--border);
}

/* 7-day stacked-bar chart at the top of the marketplace card */
.mkt-7d-wrap {
  margin: 4px 0 10px 0;
  padding: 6px 0 0 0;
  border-bottom: 1px dashed var(--border);
  padding-bottom: 10px;
}
.mkt-7d-title {
  font-size: 11px; color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.05em;
  margin-bottom: 6px;
}
.mkt-7d-chart-box {
  position: relative;
  height: 180px;     /* fixed so Chart.js can compute layout */
  width: 100%;
}

/* Top-wallets card (kept for legacy / future re-enable; not in homepage today) */
.wallets-card { border-top: 3px solid var(--success); }
.plat-name.wallets-name { color: var(--success); }
.wallets-list .wallet-link {
  grid-template-columns: 24px 1fr auto;
}
.wallet-rank { font-family: monospace; font-size: 11px; color: var(--muted); text-align: right; }
.wallet-name { font-family: monospace; font-size: 11px; color: var(--text); font-weight: 700; }

/* ─── Hero: Globe + Top-10 trio in a 2x2 squareish grid ─── */
.chart-box {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 14px;
  min-height: 280px; display: flex; flex-direction: column;
}
.chart-box canvas { flex: 1; min-height: 280px; max-height: 380px; }
.whale-chart-box { margin-top: 16px; min-height: 260px; }

.globe-box {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 14px;
  display: flex; flex-direction: column; position: relative;
}
#globe { flex: 1; min-height: 0; background: radial-gradient(circle at 50% 50%, #0c1a3a 0%, #0b1020 100%); border-radius: 6px; }

/* 2x2 grid: each cell roughly square. grid-auto-rows: 1fr keeps both rows equal,
   and aspect-ratio on cells nudges them toward squareness while still scaling. */
.hero-2x2 {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-template-rows: repeat(2, minmax(280px, 32vh));
  gap: 12px; padding: 12px 20px;
}
.hero-2x2 > * { min-height: 0; min-width: 0; overflow: hidden; box-sizing: border-box; }
@media (max-width: 900px) {
  .hero-2x2 { grid-template-columns: 1fr; grid-template-rows: auto; }
}

/* ─── 2x2 Top-10 corners + globe in the center ───
   4 top-10 cards in a strict 2x2 grid; the globe is rendered as a
   centered floating overlay, with explicit grid placement so Firefox
   doesn't reserve a grid cell for it. */
.hero-2x2-center {
  position: relative;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-template-rows: repeat(2, minmax(300px, 36vh));
  gap: 14px; padding: 14px 20px;
}
.hero-2x2-center > .t10-card {
  min-height: 0; min-width: 0; overflow-y: auto; box-sizing: border-box;
}

/* Globe overlay: lay it across the entire 2x2 grid via grid-area then
   center-self in both dimensions. This guarantees the globe's center
   sits at the geometric center of the 4-cell grid regardless of section
   padding, scrollbar widths, or asymmetric card content heights. */
.globe-hero-center {
  grid-column: 1 / -1;
  grid-row:    1 / -1;
  align-self:   center;     /* vertical centering inside the 2x2 grid */
  justify-self: center;     /* horizontal centering — the cross-corner */
  width:  clamp(260px, 24vw, 340px);   /* a bit larger so the disc clearly
                                          spans across all 4 inner corners */
  height: clamp(260px, 24vw, 340px);
  z-index: 5;
  pointer-events: auto;
  /* Solid disc with a dark border ring so the overlap with each card's
     inner corner is unmistakable. The radial-gradient still gives a soft
     halo at the very edge for visual blending. */
  background:
    radial-gradient(circle at 50% 50%,
      rgba(20,27,51,1.0) 0%,
      rgba(20,27,51,1.0) 78%,
      rgba(20,27,51,0.6) 92%,
      rgba(11,16,32,0)   100%);
  border: 2px solid rgba(96,165,250,0.55);
  border-radius: 50%;
  padding: 14px;
  display: flex; flex-direction: column;
  box-shadow: 0 0 60px rgba(96,165,250,0.30),
              inset 0 0 24px rgba(45,212,191,0.10);
  position: relative;       /* not absolute — we want flex-center positioning */
}
.globe-hero-center #globe {
  flex: 1; min-height: 0; border-radius: 50%;
  background: radial-gradient(circle at 50% 50%, #0c1a3a 0%, #0b1020 100%);
}
.globe-hero-center .globe-pause-btn {
  position: absolute; top: 8px; right: 50%; transform: translateX(50%);
  background: rgba(13,19,40,0.9); border: 1px solid var(--border);
  color: var(--muted); font-size: 11px; padding: 2px 6px; line-height: 14px;
  border-radius: 3px; z-index: 6; cursor: pointer;
}
.globe-hero-center .globe-pause-btn:hover { color: var(--accent); border-color: var(--accent); }

/* Smooth, symmetric inner-corner reserve for all 4 cards so the floating
   globe (anchored exactly at the 2x2 cross-corner intersection) doesn't
   cover row content. Each card keeps its inner corner clear with a
   diagonally-oriented padding pad and right-justifies text on right cards. */
@media (min-width: 901px) {
  /* Reserve a quadrant-of-globe of empty space at each card's inner corner.
     We use a single CSS custom property to keep all four sides synchronized. */
  .hero-2x2-center { --globe-reserve: clamp(95px, 11vw, 140px); }

  /* Top row cards: reserve space at the bottom-inside corner so the
     floating globe doesn't cover row content. Left-cards (Polymarket TL,
     Manifold BL) reserve space on the RIGHT; right-cards (Kalshi TR,
     Limitless BR) reserve space on the LEFT but content stays
     LEFT-ALIGNED — i.e. the rows now begin at the center of the right-
     cards instead of being flush against the right edge.
     This replaces an earlier attempt that right-justified the right-cards
     and reversed the grid; the user found that hard to read. */
  .hero-2x2-center > .t10-card:nth-child(1) { padding-right: var(--globe-reserve); padding-bottom: 18px; }
  .hero-2x2-center > .t10-card:nth-child(2) { padding-left:  var(--globe-reserve); padding-bottom: 18px; }
  .hero-2x2-center > .t10-card:nth-child(3) { padding-right: var(--globe-reserve); padding-top:    18px; }
  .hero-2x2-center > .t10-card:nth-child(4) { padding-left:  var(--globe-reserve); padding-top:    18px; }

  /* Anchor the globe EXACTLY at the cross-point of the 2x2 grid.
     Math: cross-point in the grid = (50%, 50%) of the .hero-2x2-center
     content box (taking the gap into account, since the grid uses gap not
     padding). Globe diameter = 2 × var(--globe-reserve) so each cell's
     reserved corner is exactly tangent to the globe. */
  .globe-hero-center {
    width:  calc(var(--globe-reserve) * 2);
    height: calc(var(--globe-reserve) * 2);
  }
}

/* Medium viewports — slightly smaller globe + reserve. */
@media (max-width: 1200px) and (min-width: 901px) {
  .hero-2x2-center { --globe-reserve: 88px; }
}

/* ─── Hero 4×3 (Option B, build .89.1) ─────────────────────────────────
   Unified 12-cell grid with 9-11 platforms + 1-3 vacant slots.  Order
   left→right, top→bottom:
     Row 1: poly · kalshi · manifold · limitless
     Row 2: metaforecast · myriad · betfair · predictit
     Row 3: opinion · sxbet (dev) · globe · (vacant)
   Vacant slot doubles as the floating-globe pane so we don't lose
   the world-map context. Tile content is identical to the old 3×2.
   .hero-3x2 retained as an alias so older templates still render. */
.hero-3x2,
.hero-4x3 {
  position: relative;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  /* Three rows now; min-height trimmed slightly (340→300px) to keep the
     hero from dominating above-the-fold on a single-row aspect ratio. */
  grid-template-rows: repeat(3, minmax(300px, 36vh));
  gap: 14px;
  /* Build v.03 .31 build 104: padding-bottom trimmed 14→2 so the
     Featured Whale Bets section sits flush against the top-10 grid
     (removes the dead vertical space the user flagged). */
  padding: 14px 20px 2px;
}
.hero-3x2 > .t10-card,
.hero-4x3 > .t10-card,
.hero-3x2 > .hero-vacant-slot,
.hero-4x3 > .hero-vacant-slot {
  /* Build .54: dropped `overflow-y: auto` from t10-card so movers
     rows are visible at a glance — no internal scroll bars in the
     top-10 boxes. Vacant-slot keeps overflow:auto for the globe. */
  min-height: 0; min-width: 0; box-sizing: border-box;
}
.hero-3x2 > .hero-vacant-slot,
.hero-4x3 > .hero-vacant-slot {
  overflow-y: auto;
}
.hero-vacant-slot {
  display: flex; align-items: stretch; justify-content: center;
  background: rgba(13,19,40,0.30);
  border: 1px dashed rgba(96,165,250,0.25);
  border-radius: 8px;
  padding: 10px;
}
.hero-vacant-slot .globe-hero-vacant {
  flex: 1; min-width: 0;
  background: radial-gradient(circle at 50% 50%, #0c1a3a 0%, #0b1020 100%);
  border: 1px solid rgba(96,165,250,0.40);
  border-radius: 8px;
  padding: 10px;
  position: relative;
  display: flex; flex-direction: column;
}
.hero-vacant-slot .globe-hero-vacant #globe {
  flex: 1; min-height: 0; border-radius: 6px;
}
.hero-vacant-slot .globe-pause-btn {
  position: absolute; top: 6px; right: 6px;
  background: rgba(13,19,40,0.9); border: 1px solid var(--border);
  color: var(--muted); font-size: 11px; padding: 2px 6px; line-height: 14px;
  border-radius: 3px; cursor: pointer;
}
.hero-vacant-slot .globe-pause-btn:hover { color: var(--accent); border-color: var(--accent); }
.hero-vacant-placeholder {
  flex: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  color: var(--muted); text-align: center; font-size: 13px;
}
.hero-vacant-placeholder .hv-icon {
  font-size: 36px; opacity: 0.5; line-height: 1; margin-bottom: 8px;
}
.hero-vacant-placeholder .hv-text { max-width: 220px; line-height: 1.5; }

@media (max-width: 1400px) {
  .hero-3x2,
  .hero-4x3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 1100px) {
  .hero-3x2,
  .hero-4x3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 700px) {
  .hero-3x2,
  .hero-4x3 {
    grid-template-columns: 1fr;
    grid-template-rows: auto;
  }
  .hero-vacant-slot { min-height: 240px; }
}

/* ─── Build .85.1: independent Betfair box under the leftmost column ─────
   3-column grid with the same column widths + horizontal padding as
   .hero-3x2 above, but only the first cell holds a tile.  Visually
   anchors Betfair under the Polymarket / Limitless column of the hero
   grid while keeping it as its own row (per user request: "independent
   box", not a 7-tile grid expansion). */
.hero-betfair-row {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  /* Same row sizing rule as the hero-3x2 so the Betfair tile matches
     the hero tile heights exactly when sitting directly below them. */
  grid-template-rows: minmax(340px, 44vh);
  gap: 14px;
  padding: 0 20px 14px;   /* no top-padding — sits flush under hero-3x2 */
}
.hero-betfair-row > .t10-card {
  grid-column: 1;
  grid-row: 1;
  min-height: 0;
  min-width: 0;
  overflow: hidden;
  box-sizing: border-box;
}
@media (max-width: 1100px) {
  .hero-betfair-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 700px) {
  .hero-betfair-row {
    grid-template-columns: 1fr;
    grid-template-rows: auto;
    padding: 0 12px 12px;
  }
}

/* MetaForecast platform colour & badges */
.t10-metaforecast { border-top: 3px solid #a78bfa; }
.t20-metaforecast { border-top: 3px solid #a78bfa; }
.sig-metaforecast .sig-plat,
.sig-plat.sig-metaforecast { background: rgba(167,139,250,0.18); color: #a78bfa; }
.plat-aggr-pill {
  display: inline-block; margin-left: 6px; padding: 1px 6px;
  font-size: 10px; font-weight: 600; color: #a78bfa;
  background: rgba(167,139,250,0.12);
  border: 1px solid rgba(167,139,250,0.30); border-radius: 3px;
  letter-spacing: 0.04em;
}

/* Top-20 row 3×2 (5 platforms + 1 vacant slot).
   Specificity bump via .top-events.top-events-3x2 — otherwise the legacy
   .top-events base rule below (defined LATER in this file with the same
   single-class specificity) wins by source order and we render 4 columns
   instead of 3 on wide screens. The doubled class is intentional. */
.top-events.top-events-3x2 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
@media (max-width: 1100px) {
  .top-events.top-events-3x2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 700px) {
  .top-events.top-events-3x2 { grid-template-columns: 1fr; }
}
.t20-vacant {
  border: 1px dashed rgba(96,165,250,0.30) !important;
  background: rgba(13,19,40,0.20);
  display: flex; flex-direction: column;
}
.t20-vacant-body {
  padding: 24px 16px; text-align: center;
  color: var(--muted); line-height: 1.6;
}
.t20-vacant-body .t20-vacant-sub { font-size: 12px; opacity: 0.7; }

/* When HIDE_UPPER_GLOBE=1: drop all the inner-corner padding so the
   four top-10 cards use the full grid cells without any reserved space. */
.hero-no-globe > .t10-card:nth-child(n) {
  padding-left: 12px !important;
  padding-right: 12px !important;
  padding-top: 12px !important;
  padding-bottom: 12px !important;
}

@media (max-width: 900px) {
  .hero-2x2-center { grid-template-columns: 1fr; grid-template-rows: auto; }
  .globe-hero-center {
    /* Mobile: globe drops out of overlay mode and becomes a normal
       block in flow under the 4 stacked cards. */
    grid-column: auto;
    grid-row: auto;
    align-self: stretch;
    justify-self: stretch;
    width: 100%; height: 280px; border-radius: 8px;
    margin: 0; padding: 12px;
  }
  .globe-hero-center .globe-pause-btn { position: absolute; top: 12px; right: 16px; transform: none; }
}
.globe-hero { padding: 12px; }
.globe-hero h3 { margin-bottom: 6px; display: flex; align-items: center; gap: 8px; }
.globe-pause-btn {
  background: transparent; color: var(--muted); border: 1px solid var(--border);
  border-radius: 4px; padding: 0 6px; font-size: 11px; line-height: 18px; cursor: pointer;
}
.globe-pause-btn:hover { color: var(--accent); border-color: var(--accent); }
.fade-in { animation: fwFade 0.35s ease-in; }
@keyframes fwFade { from { opacity: 0.3; } to { opacity: 1; } }

/* Build .54: dropped max-height + overflow-y so the t10-card never
   shows internal scroll bars — the parent hero-3x2 grid row gives it
   enough headroom for 10 rows. */
.t10-card { padding: 10px 12px; }
.t10-card .platform { margin-bottom: 6px; padding-bottom: 4px; }
.t10-bet { color: var(--muted); font-weight: 500; font-size: 11px; }
.closed-x {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px;
  background: var(--danger); color: #fff;
  border-radius: 3px; font-weight: 800;
  font-family: monospace; font-size: 11px; margin-right: 6px;
  vertical-align: middle; line-height: 1;
}
/* Resolved/closed event rows get a STRONG tinted background + diagonal-stripe
   pattern so they're obviously distinct from live events when "Open Events
   Only" is OFF. Also reduce opacity slightly to push them visually back. */
.t10-row-closed,
.t20-row-closed {
  background:
    repeating-linear-gradient(135deg,
      rgba(239,68,68,0.18) 0,
      rgba(239,68,68,0.18) 4px,
      rgba(239,68,68,0.06) 4px,
      rgba(239,68,68,0.06) 10px);
  border-left: 4px solid var(--danger);
  position: relative;
}
.t10-row-closed::after,
.t20-row-closed::after {
  content: 'CLOSED';
  position: absolute; top: 4px; right: 8px;
  font-size: 9px; font-weight: 800; letter-spacing: 0.1em;
  color: var(--danger); background: rgba(239,68,68,0.18);
  padding: 1px 5px; border-radius: 2px;
  pointer-events: none;
}
.t10-row-closed a,
.t20-row-closed .t20-title { color: #fca5a5; }
.t10-row-closed:hover { background: rgba(239,68,68,0.20); }
.t20-bet-amt { color: var(--accent); font-weight: 600; font-size: 10px; margin-left: 3px; }
.t10-poly { border-top: 3px solid var(--accent); }
.t10-kalshi { border-top: 3px solid var(--kalshi); }
.t10-manifold { border-top: 3px solid #a78bfa; }
.t10-sxbet { border-top: 3px solid var(--sxbet); }
.t10-limitless { border-top: 3px solid var(--limitless); }
.top10-list { list-style: none; margin: 0; padding: 0; counter-reset: t10; }
.t10-row {
  counter-increment: t10;
  border-bottom: 1px solid var(--border);
}
.t10-row:last-child { border-bottom: none; }
.t10-row a {
  display: grid; grid-template-columns: 20px 1fr auto; gap: 6px; align-items: baseline;
  padding: 3px 4px; color: var(--text); font-size: 12px; line-height: 1.25;
}
.t10-row a:hover { background: var(--panel-2); text-decoration: none; }
.t10-row a::before {
  content: counter(t10);
  font-family: monospace; font-size: 10px; color: var(--muted); text-align: right;
}
.t10-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t10-vol { font-family: monospace; font-size: 11px; color: var(--accent); font-weight: 600; }
.t10-manifold .t10-vol { color: #c4b5fd; }
.t10-kalshi .t10-vol { color: #93c5fd; }
.globe-legend {
  display: flex; flex-wrap: wrap; gap: 10px; margin-top: 8px;
  font-size: 10px; color: var(--muted); justify-content: center;
}
.globe-legend .leg { display: flex; align-items: center; gap: 4px; }
.globe-legend .dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }

/* ─── Ticker ─── */
.ticker-section {
  display: flex; align-items: center; background: var(--panel); border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border); overflow: hidden;
}
.ticker-label {
  background: var(--whale); color: #0b1020; font-weight: 800; padding: 10px 16px;
  font-size: 13px; letter-spacing: 0.16em; white-space: nowrap; align-self: stretch;
  display: flex; align-items: center;
}
.ticker-wrap { flex: 1; overflow: hidden; position: relative; padding: 8px 0; }
.ticker-track {
  display: flex; gap: 32px; white-space: nowrap;
  animation: scroll-left 64s linear infinite;
  padding-left: 20px;
}
.ticker-track:hover { animation-play-state: paused; }
@keyframes scroll-left {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}
.ticker-item {
  display: inline-flex; align-items: center; gap: 8px; color: var(--text);
  font-size: 13px; padding: 4px 12px; border-left: 2px solid var(--whale);
  flex-shrink: 0;     /* don't let the flex parent (.ticker-track) shrink items */
  min-width: 0;       /* but DO allow truncation INSIDE via child overflow rules */
  overflow: visible;  /* the parent .ticker-wrap clips; items stay full-content-sized */
}
.ticker-item:hover { text-decoration: none; color: var(--whale); }
.tk-amount { font-weight: 700; color: var(--whale); font-family: monospace; }
.tk-side { padding: 2px 6px; border-radius: 3px; font-size: 10px; font-weight: 600; }
.tk-q { color: var(--muted); max-width: 280px; overflow: hidden; text-overflow: ellipsis; }
.tk-evt { color: var(--text); font-style: italic; max-width: 240px; overflow: hidden; text-overflow: ellipsis; font-size: 12px; }
.tk-odds { color: var(--jackpot); font-family: monospace; font-size: 11px; }
.tk-by   { color: var(--muted); font-size: 11px; opacity: 0.85; white-space: nowrap; }
.tk-user { color: var(--text); font-family: monospace; font-size: 11px; max-width: 120px; display: inline-block; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; }
/* Build .48: when tk-user is wrapped in an <a class="wallet-link">,
   make it visually obvious that the wallet name itself is clickable
   (separate target from the parent event-link). */
a.tk-user.wallet-link {
  color: var(--accent);
  text-decoration: none;
  cursor: pointer;
  transition: color 0.12s ease;
}
a.tk-user.wallet-link:hover {
  color: var(--success);
  text-decoration: underline;
}
.ticker-empty { padding: 8px 20px; color: var(--muted); font-style: italic; }

/* ─── Top 20 Events ─── */
/* Build .87.4: second pass — push compression further.  Per-row height
   ~30px → ~22px (font sizes shrunk another step, padding tightened,
   margin-bottoms zeroed where safe, mini-bar slimmed to 3px). */
.top-events {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; padding: 6px 20px;
}
.top-events > .card { min-width: 0; }
@media (max-width: 1400px) { .top-events { grid-template-columns: repeat(2, 1fr); } }
.card {
  background: var(--panel); border: 1px solid var(--border); border-radius: 5px; padding: 6px 8px;
  /* Build .79: removed 900px cap — cards grow naturally with content.
     No internal scrollbar; the page scrolls instead. */
  max-height: none; overflow-y: visible;
}
.card.poly { border-top: 3px solid var(--accent); }
.card.kalshi { border-top: 3px solid var(--kalshi); }
.card.manifold { border-top: 3px solid #a78bfa; }
.card.sxbet { border-top: 3px solid var(--sxbet); }
.card.limitless { border-top: 3px solid var(--limitless); }
/* Build .85: Betfair brand color is yellow/black; we use Betfair yellow
   (#ffb80c — pulled from their brand pages) for the accent. */
.t10-betfair, .card.betfair { border-top: 3px solid #ffb80c; }
.t10-betfair .plat-name, .card.betfair .plat-name { color: #ffb80c; }
.sig-betfair, .sig-plat.sig-betfair { background: rgba(255, 184, 12, 0.18); color: #ffb80c; }
/* Build .89.1: PredictIt (red — patriotic palette, US political venue)
   and Opinion (violet — distinct from Manifold's lighter violet) accents. */
.t10-predictit, .card.predictit { border-top: 3px solid #dc2626; }
.t10-predictit .plat-name, .card.predictit .plat-name { color: #dc2626; }
.sig-predictit, .sig-plat.sig-predictit { background: rgba(220, 38, 38, 0.18); color: #f87171; }
.t10-opinion, .card.opinion { border-top: 3px solid #7c3aed; }
.t10-opinion .plat-name, .card.opinion .plat-name { color: #7c3aed; }
.sig-opinion, .sig-plat.sig-opinion { background: rgba(124, 58, 237, 0.18); color: #a78bfa; }
/* Build .89.2: ProphetX (cyan — distinct from Polymarket's teal) and
   Novig (orange — distinct from Limitless's orange-red).  Both surface
   the PolyRouter origin via the .plat-ph-pill class. */
.t10-prophetx, .card.prophetx { border-top: 3px solid #06b6d4; }
.t10-prophetx .plat-name, .card.prophetx .plat-name { color: #06b6d4; }
.sig-prophetx, .sig-plat.sig-prophetx { background: rgba(6, 182, 212, 0.18); color: #22d3ee; }
.t10-novig, .card.novig { border-top: 3px solid #ea580c; }
.t10-novig .plat-name, .card.novig .plat-name { color: #ea580c; }
.sig-novig, .sig-plat.sig-novig { background: rgba(234, 88, 12, 0.18); color: #fb923c; }
/* Build v.03 .31 build 163 (2026-05-23): predict.fun palette —
   lime-green (#84cc16) matches their site's accent.  BNB-chain
   prediction market + Polymarket conditionId-paired arb opportunities. */
.t10-predict_fun, .card.predict_fun { border-top: 3px solid #84cc16; }
.t10-predict_fun .plat-name, .card.predict_fun .plat-name { color: #84cc16; }
.sig-predict_fun, .sig-plat.sig-predict_fun { background: rgba(132, 204, 22, 0.18); color: #a3e635; }
/* Build .91 (Option B): FantasySCOTUS (deep court-robe red — `#7c2d12`)
   and Foretold (calm forecaster teal — `#0d9488`).  Both partitioned
   out of MetaForecast (was `#a78bfa` violet), so we get two clearly
   distinct tile identities replacing the misleading-aggregator one. */
.t10-fantasyscotus, .card.fantasyscotus { border-top: 3px solid #7c2d12; }
.t10-fantasyscotus .plat-name, .card.fantasyscotus .plat-name { color: #c2410c; }
.sig-fantasyscotus, .sig-plat.sig-fantasyscotus { background: rgba(124, 45, 18, 0.22); color: #fb923c; }
.t10-foretold, .card.foretold { border-top: 3px solid #0d9488; }
.t10-foretold .plat-name, .card.foretold .plat-name { color: #14b8a6; }
.sig-foretold, .sig-plat.sig-foretold { background: rgba(13, 148, 136, 0.18); color: var(--accent); }
/* "via Prediction Hunt" / "via PolyRouter" provenance pill — surfaces
   on tiles whose data originates from a federated aggregator API. */
.plat-ph-pill {
  display: inline-block; margin-left: 6px; padding: 1px 6px;
  font-size: 10px; font-weight: 600; color: #94a3b8;
  background: rgba(148, 163, 184, 0.10);
  border: 1px solid rgba(148, 163, 184, 0.30); border-radius: 3px;
  letter-spacing: 0.04em;
}
.platform {
  font-size: 12px; color: #ffffff;
  letter-spacing: 0.02em; margin-bottom: 3px; padding-bottom: 3px; border-bottom: 1px solid var(--border);
  font-weight: 800;
}
.plat-name {
  font-weight: 900; font-size: 13px; text-transform: uppercase; letter-spacing: 0.04em;
}
.plat-sub {
  font-size: 10px; color: #ffffff; text-transform: none; letter-spacing: 0; font-weight: 600;
}
/* Build .311 (operator 2026-06-01): strip descriptive subtitles from cards/boxes.
   Keep ONLY attribution notes ("powered by …" / "via …"), which are tagged
   .plat-credit.  Hides the descriptive .plat-sub lines + the four board-panel
   subs + the Smart-Wallets formula subheading.  Visual-only — the markup is
   retained so a subtitle can be restored by dropping the rule / adding .plat-credit. */
.plat-sub:not(.plat-credit),
.board-panel-sub,
.sw-subheading { display: none; }
/* Platform-tinted names */
.t10-poly .plat-name, .card.poly .plat-name { color: var(--accent); }
.t10-kalshi .plat-name, .card.kalshi .plat-name { color: var(--kalshi); }
.t10-manifold .plat-name, .card.manifold .plat-name { color: #a78bfa; }
.t10-sxbet .plat-name, .card.sxbet .plat-name { color: var(--sxbet); }
.t10-limitless .plat-name, .card.limitless .plat-name { color: var(--limitless); }
.top20-list { list-style: none; margin: 0; padding: 0; counter-reset: t20; }
/* Build .96.6: single-line Top-20 rows.  Counter + arrows + icons +
   title + meta + delta chips all on ONE textual row per event.
   Title truncates with ellipsis when too long; meta stays right-
   aligned and never shrinks.  Mini-bar removed entirely (option
   breakdown still available in the modal).  Per-row height
   ~22px → ~15-16px = ~30% additional vertical compression on top
   of the .87.4 reduction. */
.t20-row {
  counter-increment: t20;
  display: flex;
  align-items: baseline;
  gap: 4px;
  padding: 2px 6px 2px 18px;
  border-bottom: 1px solid var(--border);
  position: relative;
  min-width: 0;
  overflow: hidden;
}
.t20-row:last-child { border-bottom: none; }
.t20-row::before {
  content: counter(t20); position: absolute; left: 0; top: 2px;
  font-family: monospace; color: var(--muted); font-size: 9px; width: 16px; text-align: right;
}
.t20-title {
  /* Build .96.10: switched anchor from `inline-block` to `inline-flex`
     so its children (news/flame/closed icons, title-text span, bet-amt,
     chips) lay out as flex items.  The title-text span is the ONLY
     flexible child (`flex: 1 1 0`); icons + chips stay at content
     width and never get clipped by the ellipsis. */
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  /* Build .96.7: font 11→13px (~2pt larger per user request) — title
     is the primary content of each row, deserves a readable size. */
  font-size: 13px; font-weight: 600; color: var(--text);
  line-height: 1.4;
  /* Build .96.9 → v.03: title floor raised 100px → 180px to claim the
     real estate freed up by the retired mini-bar + the tightened meta
     max-width (40% → 25%).  Most card widths are 380-600px so 180px
     guarantees a long substring of every title shows even on the
     narrowest cards. */
  flex: 1 1 180px;
  min-width: 180px;
  overflow: hidden;
  white-space: nowrap;
}
/* Build .96.10: dedicated wrapper for the title TEXT — gets the
   text-overflow ellipsis treatment so it shrinks gracefully while
   the surrounding icons + chips stay at full size. */
.t20-title-text {
  flex: 1 1 0;
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
/* Bet-amt / new-badge / country-chip — fixed-size, never shrink.
   On very tight rows the row's `overflow: hidden` clips them. */
.t20-bet-amt, .new-badge, .country-chip { flex-shrink: 0; }
.t20-title:hover { color: var(--accent); text-decoration: none; }
.t20-meta {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  font-size: 11px; color: var(--muted); font-family: monospace;
  line-height: 1.4;
  /* Build v.03: meta capped at 25% of row width (was 40%) — title
     reclaims that space.  Mini-bar is also gone in this build.  Meta
     gets ellipsis so it stays graceful even when squeezed.  */
  flex-shrink: 1;
  margin-left: auto;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 25%;
}
/* Build .96.6: mini-bar removed for max compression.  Per-option
   breakdown still rendered in the event modal — Top-20 rows are now
   pure list-of-titles with right-aligned volume metadata. */
.mini-bar { display: none; }
/* Group pill — let it shrink alongside the title when row is tight.
   Build .96.7: capped at 35% of row width too so pill + meta together
   can never eat more than ~80% of the row → title always has space.
   Build .96.9: tightened 35% → 28% so title is guaranteed ≥32% on
   non-Manifold rows where pill is present. */
.t20-group-pill {
  flex-shrink: 1; min-width: 0; overflow: hidden;
  text-overflow: ellipsis; max-width: 28%;
}
.new-badge {
  display: inline-block; font-size: 9px; font-weight: 800;
  background: #22c55e; color: #0b1020;
  padding: 1px 5px; border-radius: 3px; margin: 0 6px 0 0;
  letter-spacing: 0.12em; vertical-align: middle;
  animation: newPulse 2.4s ease-in-out infinite;
  box-shadow: 0 0 0 0 rgba(34,197,94,0.7);
}
@keyframes newPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(34,197,94,0.65); }
  50%      { box-shadow: 0 0 0 4px rgba(34,197,94,0); }
}
.country-chip {
  display: inline-block; font-size: 9px; font-weight: 700; background: var(--panel-2);
  color: var(--muted); padding: 1px 5px; border-radius: 3px; margin-left: 4px;
  font-family: monospace; vertical-align: middle;
}

/* Build v.03 (May 21): mini-bar permanently retired from Top-20 rows
   per user request — title text takes that horizontal space instead.
   Per-option breakdown still rendered in the event modal when the user
   clicks a row.  The earlier `display: none` rule at line ~2725 was
   being overridden by this block; consolidating to a single hide
   rule below removes that bug. */
.mini-bar, .mini-seg { display: none !important; }

/* ─── Whale + Jackpot ─── */
/* Build .87: dramatic compression of the Featured Whale Bets section.
   Per-row height drops ~50% (font sizes -20-30%, padding -40-50%, label
   strip slimmed, gap between cards tightened) so the 2×2 grid takes
   roughly half the vertical real estate it used to. */
.whale-section { padding: 0 20px; }
.whale-cards { display: grid; grid-template-columns: 2fr 1fr; gap: 8px; margin-top: 4px; }
.whale-cards-2x2 {
  display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 4px;
}
/* Build v.03 .31 build 104: tighten the "Featured Whale Bets" heading
   so it sits closer to both the top-10 grid above and the 2x2 cards
   below.  Only overrides .section-heading WITHIN .whale-section — other
   sections (Top 20 etc.) keep their default 18/8 margins. */
.whale-section .section-heading {
  margin: 4px 20px 4px;
  padding-bottom: 4px;
}
.whale-section .whale-cards-2x2 { margin-top: 2px; }
.wc-latest .fw-label { background: var(--accent); color: #0b1020; }
.manifold-whale.wc-biggest .fw-label { background: #a78bfa; color: #0b1020; }
.manifold-whale.wc-latest .fw-label { background: #c4b5fd; color: #0b1020; }
.manifold-whale .fw-amount { color: #a78bfa; }

.featured-whale {
  background: linear-gradient(90deg, #1a0b2e 0%, #141b33 100%);
  border: 1px solid var(--border); border-radius: 6px;
  display: flex; align-items: center; gap: 8px; padding: 0;
}
.fw-label {
  background: var(--whale); color: #0b1020; font-weight: 700; padding: 6px 6px;
  font-size: 9px; letter-spacing: 0.10em; white-space: nowrap; align-self: stretch;
  display: flex; align-items: center; border-radius: 6px 0 0 6px;
  writing-mode: vertical-rl; transform: rotate(180deg);  /* vertical label strip — saves horizontal width */
  text-align: center;
}
.fw-body { flex: 1; padding: 4px 8px; display: grid; grid-template-columns: auto 1fr; gap: 1px 10px; align-items: center; }
.fw-amount { grid-row: span 4; font-family: monospace; font-size: 20px; font-weight: 700; color: var(--whale); line-height: 1.1; }
.fw-bet { font-size: 11px; line-height: 1.3; }
.fw-event { font-size: 10px; color: var(--muted); line-height: 1.2; }
.fw-event a { color: var(--text); }
.fw-meta { font-size: 9px; color: var(--muted); font-family: monospace; line-height: 1.2; }
.fw-empty { padding: 8px; color: var(--muted); font-style: italic; font-size: 11px; }

/* Multi-item LATEST whale card */
.fw-multi-card { align-items: stretch; }
.fw-multi-card .fw-label { border-radius: 6px 0 0 6px; }
.fw-multi-list {
  flex: 1; list-style: none; margin: 0; padding: 3px 6px;
  display: flex; flex-direction: column; gap: 1px;
  max-height: none; overflow-y: visible;
}
.wc-biggest-list .fw-multi-list { max-height: none; }
.fw-multi-empty { color: var(--muted); font-style: italic; padding: 6px; font-size: 10px; }
.fw-mi { border-bottom: 1px dashed rgba(255,255,255,0.05); }
.fw-mi:last-child { border-bottom: none; }
.fw-mi-link {
  display: grid; gap: 1px 6px; padding: 2px 3px;
  grid-template-columns: auto auto 1fr auto;
  grid-template-areas: "amt side q odds" "evt evt evt evt" "meta meta meta meta";
  color: var(--text); font-size: 10px; line-height: 1.2;
}
.fw-mi-link:hover { background: var(--panel-2); text-decoration: none; }
.fw-mi-amt { grid-area: amt; font-family: monospace; font-weight: 700; color: var(--whale); white-space: nowrap; font-size: 11px; }
.manifold-whale .fw-mi-amt { color: #a78bfa; }
.fw-mi-side { grid-area: side; padding: 0 4px; border-radius: 2px; font-size: 8px; font-weight: 700; align-self: center; line-height: 1.4; }
.fw-mi-q { grid-area: q; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; font-size: 10px; }
.fw-mi-evt { grid-area: evt; color: var(--muted); font-size: 9px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fw-mi-meta { grid-area: meta; color: var(--muted); font-family: monospace; font-size: 8px; }
.fw-mi-link .odds-chip { grid-area: odds; align-self: center; margin-left: 0; font-size: 9px; padding: 0 4px; }
.whale-side { margin-right: 6px; padding: 2px 6px; border-radius: 3px; font-size: 11px; font-weight: 600; }
.side-buy { background: #064e3b; color: #6ee7b7; }
.side-sell { background: #7f1d1d; color: #fca5a5; }
.whale-user { color: var(--accent); }
/* Build .74.2: "AKA <pseudonym>" — small subscript next to primary name.
   Used when Polymarket trade payload has both `name` (user-chosen) and
   `pseudonym` (auto-generated). Subtle so it doesn't compete with the
   real handle but legible enough to convey identity ambiguity. */
.fw-aka {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 5px;
  font-size: 9px;
  font-weight: 500;
  color: var(--muted);
  background: rgba(255,255,255,0.04);
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: 3px;
  letter-spacing: 0.02em;
  vertical-align: middle;
}
.wm-aka {
  display: inline-block;
  margin-left: 10px;
  padding: 2px 7px;
  font-size: 11px;
  font-weight: 500;
  color: var(--muted);
  background: rgba(255,255,255,0.05);
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: 4px;
  letter-spacing: 0.02em;
  vertical-align: middle;
  text-transform: none;
}

.jackpot-card {
  background: linear-gradient(90deg, #3a2a0a 0%, #141b33 100%);
  border: 1px solid var(--border); border-radius: 8px;
  display: flex; align-items: center; gap: 12px; padding: 0;
}
.jp-label {
  background: var(--jackpot); color: #0b1020; font-weight: 800; padding: 18px 12px;
  font-size: 12px; letter-spacing: 0.14em; white-space: nowrap; align-self: stretch;
  display: flex; align-items: center; writing-mode: vertical-rl; text-orientation: mixed;
  border-radius: 8px 0 0 8px;
}
.jp-body { flex: 1; padding: 12px 14px; }
.jp-amount { font-family: monospace; font-size: 24px; font-weight: 700; color: var(--jackpot); }
.jp-bet { font-size: 13px; margin-top: 4px; }
.jp-event { font-size: 12px; color: var(--muted); margin-top: 4px; }
.jp-event a { color: var(--text); }
.jp-meta { font-size: 10px; color: var(--muted); font-family: monospace; margin-top: 6px; line-height: 1.4; }
.jp-empty { padding: 14px; color: var(--muted); font-style: italic; font-size: 12px; }

.odds-chip {
  display: inline-block; background: var(--panel-2); color: var(--jackpot);
  padding: 1px 6px; border-radius: 3px; font-family: monospace; font-size: 11px;
  font-weight: 600; margin-left: 4px;
}

/* Outcome chip — names the side that the displayed YES price refers to
   in event-modal market rows. Shown only when the outcome name is
   informative (e.g. 'TheMongolz', 'Max Verstappen'), hidden when it's
   just 'Yes' to avoid redundancy with the column header. */
.outcome-chip {
  display: inline-block;
  background: rgba(45,212,191,0.12); color: var(--accent);
  border: 1px solid rgba(45,212,191,0.30);
  padding: 1px 6px; border-radius: 3px;
  font-size: 11px; font-weight: 500;
  margin-left: 4px; vertical-align: baseline;
}

/* ─── Build .260: Risers + Coldest merged into ONE horizontal box ──────
   Single card with 2-column inner grid (mirrors PHQ pattern).
   Old .rp-* / .risers-plungers / .rp-grid / .rp-col / .rp-head / .rp-table
   rules removed below — replaced by .movers-merged-* + .mvm-* namespace
   to avoid the .sig-row / .sig-link specificity collisions we hit in
   .258 with the liq-card.  .pct-up / .pct-down semantic colors kept. */
.movers-merged-section { padding: 16px 20px 0; }
.movers-merged-card {
  border-top: 3px solid var(--success);   /* green = "movers" accent */
  padding: 12px 16px 14px;
}
.movers-merged-card h3 { margin: 0 0 10px; }
.movers-merged-name { color: var(--success); font-weight: 800; }

.movers-merged-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px 28px;
}
.movers-col-head {
  font-size: 11px; font-weight: 700;
  letter-spacing: 0.08em; text-transform: uppercase;
  margin: 0 0 6px; padding-bottom: 4px;
  border-bottom: 1px solid var(--border);
}
.movers-col-head-risers  { color: var(--success); }
.movers-col-head-coldest { color: #93c5fd; }

.movers-flat-list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 1px;
}
.mvm-row {
  cursor: pointer;
  list-style: none;
}
.mvm-row:hover { background: rgba(74, 222, 128, 0.05); }
.mvm-link {
  display: flex; flex-direction: row; align-items: baseline;
  gap: 6px; padding: 4px 8px;
  text-decoration: none; color: var(--text);
  border-left: 2px solid transparent; border-radius: 4px;
  transition: background-color 0.12s ease, border-color 0.12s ease;
  font-size: 12px;
}
.mvm-link:hover {
  text-decoration: none;
  border-left-color: var(--success);
  background: rgba(74, 222, 128, 0.06);
}
.mvm-meta {
  flex-shrink: 0; display: flex; align-items: center; gap: 4px;
  font-size: 10px; color: var(--muted);
}
.mvm-meta .plat-chip-logo { width: 12px; height: 12px; flex-shrink: 0; }
.mvm-meta .sig-plat {
  padding: 1px 5px; font-size: 9px; font-weight: 600;
  letter-spacing: 0.04em; flex-shrink: 0;
}
.mvm-title {
  flex: 1 1 0; min-width: 0;
  font-size: 12px; line-height: 1.3; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mvm-delta {
  flex-shrink: 0;
  font-family: monospace; font-weight: 700; font-size: 11px;
  font-variant-numeric: tabular-nums;
}
.mvm-empty {
  list-style: none; padding: 8px 6px;
  color: var(--muted); font-size: 11px; font-style: italic;
}

/* ─── Jackpot + Daily Volume row ─── */
.jackpot-volume-row { padding: 16px 20px; }
.jv-grid { display: grid; grid-template-columns: 1fr 2fr; gap: 16px; align-items: stretch; }
.jp-card-block { min-height: 180px; }
.dv-chart { min-height: 180px; }

/* ─── Manifold Top 20 row tweaks ─── */
/* Build .96.6: override the prior grid layout — Manifold rows now use
   the same single-line flex layout as every other Top-20 platform.
   Profile image inline as a small (14px) flex child, counter
   absolutely-positioned (same as default rows), title + meta inline. */
.t20-row-manifold {
  display: flex;
  align-items: baseline;
  gap: 4px;
  padding: 2px 6px 2px 18px;
  position: relative;
  grid-template-columns: none;
}
.t20-row-manifold::before {
  position: absolute; left: 0; top: 2px;
  display: inline;
  grid-column: auto; grid-row: auto;
  font-family: monospace; color: var(--muted); font-size: 9px;
  width: 16px; text-align: right;
}
.t20-row-manifold .t20-icon {
  grid-column: auto; grid-row: auto;
}
.t20-row-manifold .t20-title,
.t20-row-manifold .t20-meta {
  grid-column: auto; grid-row: auto;
  padding-left: 0;
}
.t20-icon {
  /* Build .96.6: image shrunk 20→14 to match inline-flex baseline
     height with the other icons.  Was 20×20 spanning 2 grid rows. */
  width: 14px; height: 14px; object-fit: cover; border-radius: 2px;
  flex-shrink: 0;
  grid-row: auto;
}
.t20-bet-inline { color: var(--text); font-family: -apple-system, "Segoe UI", Roboto, sans-serif; }
/* Build .260: .rp-col / .rp-head / .rp-table / .plungers-table rules
   removed (replaced by .movers-merged-* + .mvm-* above).  Semantic
   delta-percent colors kept — referenced by .mvm-delta. */
.pct-up { color: var(--success); }
.pct-down { color: var(--danger); }

/* ─── Daily volume ─── */
.daily-volume { padding: 0 20px 20px; }
.daily-volume .chart-box { min-height: 280px; }

/* ─── Coldest events ─── */
.coldest-events { padding: 0 20px 20px; }
.coldest-events h2 { color: var(--danger); }
.coldest-events .rank { color: var(--muted); font-family: monospace; width: 24px; }

/* ─── Status badges / bet indicators ─── */
.status-badge {
  display: inline-block; font-size: 9px; font-weight: 700; padding: 1px 5px; border-radius: 3px;
  letter-spacing: 0.08em; margin-left: 6px; font-family: monospace;
}
.status-payable { background: rgba(74,222,128,0.2); color: var(--success); }
.status-eliminated { background: rgba(239,68,68,0.2); color: var(--danger); }

/* ─── CLOB-derived chips (live mid, spread, price delta) ─── */
.delta-chip {
  display: inline-block; font-size: 10px; font-weight: 700; padding: 1px 5px; border-radius: 3px;
  font-family: monospace; margin-left: 4px; vertical-align: middle;
}
.delta-up { background: rgba(74,222,128,0.18); color: var(--success); }
.delta-down { background: rgba(239,68,68,0.18); color: var(--danger); }

/* ─── Foretold aggregate + resolution chips (Build v.03 .31 build 103) ─── */
/* Forecaster venue has no $ volume; we display Foretold's
   `previousAggregate` (community consensus) + `outcome` (resolution)
   in the t20-meta slot instead. */
.ft-agg {
  display: inline-block;
  font-size: 10px; font-weight: 600; color: var(--text);
  font-family: monospace; padding: 1px 5px; border-radius: 3px;
  background: rgba(148,163,184,0.12);
}
.ft-out {
  display: inline-block;
  font-size: 10px; font-weight: 700;
  font-family: monospace; padding: 1px 5px; border-radius: 3px;
  color: #94a3b8; background: rgba(148,163,184,0.14);
}
.ft-out.ft-out-yes {
  color: var(--success); background: rgba(74,222,128,0.16);
}
.ft-out.ft-out-no {
  color: var(--danger); background: rgba(239,68,68,0.16);
}

/* ─── Wallet comprehensive stats panel (Build v.03 .31 build 126) ─── */
.wallet-stats-panel {
  padding: 0 20px; margin: 18px 0 24px;
}
.ws-row { display: grid; gap: 12px; margin-bottom: 12px; }
.ws-row-2col { grid-template-columns: 1fr 1fr; }
.ws-row-3col { grid-template-columns: 1fr 1fr 1fr; }
.ws-row-1col { grid-template-columns: 1fr; }
.ws-block {
  background: var(--card, #11151c);
  border: 1px solid var(--border, #1f2530);
  border-radius: 8px;
  padding: 12px 14px;
}
.ws-block.ws-settled { border-left: 3px solid #60a5fa; }
.ws-block.ws-open    { border-left: 3px solid var(--accent); }
.ws-block.ws-streaks { border-left: 3px solid #fbbf24; }
.ws-block.ws-activity { border-left: 3px solid #a78bfa; }
.ws-block.ws-recent   { border-left: 3px solid #f472b6; }
.ws-block.ws-sizing   { border-left: 3px solid #94a3b8; }
.ws-hdr {
  font-size: 13px; font-weight: 700; color: #e6e8ee;
  margin-bottom: 10px;
}
.ws-hdr-sub {
  font-size: 11px; font-weight: 500;
  color: var(--muted, #8b94a8); font-style: italic;
  margin-left: 6px;
}
.ws-figures {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 8px;
}
.ws-fig { text-align: center; padding: 4px; }
.ws-fig-num {
  font-size: 20px; font-weight: 800; font-family: monospace;
  color: #e6e8ee; line-height: 1.2;
}
.ws-fig-num.ws-fig-date { font-size: 14px; }
.ws-fig-lbl {
  font-size: 10px; color: var(--muted, #8b94a8);
  text-transform: uppercase; letter-spacing: 0.04em;
  margin-top: 2px;
}
.ws-pos { color: var(--success, #4ade80); }
.ws-neg { color: var(--danger, #f87171); }
.ws-sub {
  margin-top: 8px;
  display: flex; flex-wrap: wrap; gap: 6px;
}
.ws-chip {
  display: inline-block; padding: 2px 8px;
  background: rgba(148,163,184,0.10);
  border-radius: 12px; font-size: 11px;
  color: var(--text); font-family: monospace;
}
.ws-chip.ws-chip-pos {
  background: rgba(74,222,128,0.14); color: var(--success, #4ade80);
}
.ws-chip.ws-chip-neg {
  background: rgba(239,68,68,0.14); color: var(--danger, #f87171);
}
.ws-empty {
  font-size: 12px; color: var(--muted, #8b94a8);
  font-style: italic; padding: 8px 0;
}
@media (max-width: 1000px) {
  .ws-row-3col { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 700px) {
  .ws-row-2col, .ws-row-3col { grid-template-columns: 1fr; }
}

/* ─── Wallet Smart Score (Build v.03 .31 build 108) ─── */
/* Composite 0-10 quality metric: ROI × win-rate × log(trades) × log(|PnL|)
   × recency. Section + per-row card for the "Smartest Wallets" leaderboard,
   plus inline chips for the Smart-Money Feed. */
.smartest-wallets-section { padding: 0 20px; margin-bottom: 18px; }
.smartest-wallets-section .section-heading {
  margin: 4px 0 6px; padding-bottom: 4px;
}
.smartest-wallets-card {
  background: var(--card, #11151c);
  border: 1px solid var(--border, #1f2530);
  border-radius: 8px;
  padding: 10px 14px;
}
.sw-subheading {
  font-size: 11px; color: var(--muted, #8b94a8);
  margin-bottom: 6px; font-style: italic;
  cursor: help;
}
.sw-list {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column; gap: 2px;
}
.sw-row {
  display: grid;
  grid-template-columns: 28px 60px minmax(140px, 1fr) auto auto auto auto;
  gap: 8px;
  align-items: center;
  padding: 4px 6px;
  border-radius: 4px;
  font-size: 12px;
  font-family: monospace;
}
.sw-row:hover { background: rgba(96,165,250,0.06); }
.sw-row.sw-elite { border-left: 3px solid #fbbf24; }
.sw-row.sw-strong { border-left: 3px solid var(--success); }
.sw-row.sw-mid { border-left: 3px solid #60a5fa; }
.sw-row.sw-weak { border-left: 3px solid #64748b; }
.sw-rank {
  color: var(--muted, #8b94a8); font-weight: 700; text-align: right;
}
.sw-score-chip {
  display: inline-block; font-weight: 800; padding: 2px 7px;
  border-radius: 4px; font-family: monospace;
  text-align: center;
}
.sw-score-chip.sw-score-sw-elite {
  background: rgba(251,191,36,0.18); color: #fbbf24;
  box-shadow: 0 0 6px rgba(251,191,36,0.25);
}
.sw-score-chip.sw-score-sw-strong { background: rgba(74,222,128,0.16); color: var(--success); }
.sw-score-chip.sw-score-sw-mid { background: rgba(96,165,250,0.16); color: #60a5fa; }
.sw-score-chip.sw-score-sw-weak { background: rgba(100,116,139,0.18); color: #94a3b8; }
.sw-wallet {
  color: #e6e8ee; text-decoration: none; font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sw-wallet:hover { color: #60a5fa; text-decoration: underline; }
.sw-stat {
  display: inline-flex; gap: 3px; align-items: baseline;
  padding: 1px 6px; border-radius: 3px;
  background: rgba(148,163,184,0.08);
  white-space: nowrap;
}
.sw-stat-lbl { color: var(--muted, #8b94a8); font-size: 10px; font-weight: 500; }
.sw-pos { color: var(--success, #4ade80); }
.sw-neg { color: var(--danger, #f87171); }

/* Inline Smart-Score chip used in Smart-Money Feed rows */
.smart-score-chip {
  display: inline-flex; align-items: center;
  font-weight: 800; padding: 1px 6px; border-radius: 3px;
  font-family: monospace; font-size: 10px;
  margin-right: 3px;
}
.smart-score-chip.ss-elite {
  background: rgba(251,191,36,0.18); color: #fbbf24;
}
.smart-score-chip.ss-strong { background: rgba(74,222,128,0.16); color: var(--success); }
.smart-score-chip.ss-mid { background: rgba(96,165,250,0.16); color: #60a5fa; }
.smart-score-chip.ss-weak { background: rgba(100,116,139,0.18); color: #94a3b8; }

@media (max-width: 900px) {
  .sw-row {
    grid-template-columns: 24px 56px 1fr auto;
    grid-template-rows: auto auto;
    gap: 4px 6px;
  }
  .sw-row > .sw-roi { grid-column: 1 / -1; grid-row: 2; justify-self: start; }
  .sw-row > .sw-win,
  .sw-row > .sw-trades,
  .sw-row > .sw-pnl { grid-row: 2; }
}

/* ─── Foretold rich data panel (Build v.03 .31 build 110) ─── */
/* Per-event modal rendering of Foretold's full "Aggregate and resolution"
   view — markdown question description, channel + creator badges,
   expected/actual resolution timestamps, CDF percentiles. */
.ft-rich-block {
  margin: 12px 0 16px;
  padding: 10px 14px;
  background: rgba(96,165,250,0.04);
  border-left: 3px solid #60a5fa;
  border-radius: 6px;
}
.ft-rich-sub {
  font-size: 11px; font-weight: 500; color: var(--muted, #8b94a8);
  margin-left: 8px; font-style: italic;
}
.ft-meta-strip {
  display: flex; flex-wrap: wrap; gap: 6px;
  margin-bottom: 12px; font-size: 11px;
}
.ft-chip {
  display: inline-block; padding: 2px 8px;
  background: rgba(148,163,184,0.12); color: var(--text);
  border-radius: 12px; font-family: monospace;
  white-space: nowrap;
}
.ft-state-badge {
  display: inline-block; padding: 2px 8px;
  font-weight: 700; border-radius: 12px;
  font-family: monospace; font-size: 11px;
}
.ft-state-badge.ft-state-judged {
  background: rgba(74,222,128,0.18); color: var(--success, #4ade80);
}
.ft-state-badge.ft-state-open {
  background: rgba(96,165,250,0.18); color: #60a5fa;
}
.ft-state-badge.ft-state-closed {
  background: rgba(251,191,36,0.16); color: #fbbf24;
}
.ft-ar-grid {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.ft-ar-col {
  padding: 10px 12px; border-radius: 5px;
  background: rgba(11,16,32,0.6);
}
.ft-ar-col.ft-ar-empty { opacity: 0.6; }
.ft-ar-col.ft-ar-out-resolved {
  background: rgba(74,222,128,0.06);
  border: 1px solid rgba(74,222,128,0.18);
}
.ft-ar-hdr {
  font-size: 11px; font-weight: 700; color: var(--muted, #8b94a8);
  text-transform: uppercase; letter-spacing: 0.05em;
  margin-bottom: 6px;
}
.ft-ar-sub {
  font-size: 10px; font-weight: 500; text-transform: none;
  letter-spacing: 0; color: var(--muted, #8b94a8);
  font-style: italic;
}
.ft-ar-value {
  font-size: 22px; font-weight: 800; font-family: monospace;
  color: #e6e8ee; margin-bottom: 6px;
}
.ft-ar-col.ft-ar-out-resolved .ft-ar-value { color: var(--success, #4ade80); }
.ft-ar-meta {
  font-size: 11px; color: var(--muted, #8b94a8);
  font-family: monospace; margin-top: 2px;
}
.ft-ar-meta .ft-k {
  color: #64748b; font-size: 10px;
  text-transform: uppercase; letter-spacing: 0.04em;
  margin-right: 4px;
}
.ft-pctl {
  font-size: 11px; color: var(--text); font-family: monospace;
  margin-bottom: 4px;
}
.ft-ar-desc {
  font-size: 11px; color: var(--text); line-height: 1.4;
  margin-top: 8px; padding-top: 6px;
  border-top: 1px solid rgba(148,163,184,0.15);
}
.ft-desc-details {
  margin-top: 10px; padding: 8px 10px;
  background: rgba(11,16,32,0.5);
  border-radius: 5px;
}
.ft-desc-details summary {
  cursor: pointer; font-size: 12px; font-weight: 600;
  color: var(--muted, #8b94a8);
}
.ft-desc-details[open] summary { margin-bottom: 8px; }
.ft-desc-sub { font-weight: 500; font-style: italic; }
.ft-desc-body {
  font-size: 12px; color: var(--text);
  white-space: pre-wrap; line-height: 1.5;
  font-family: inherit;
}
@media (max-width: 700px) {
  .ft-ar-grid { grid-template-columns: 1fr; }
}

/* ─── FantasySCOTUS Yes/No odds chips (Build v.03 .31 build 106) ─── */
/* SCOTUS-affirm questions are always binary; show both side odds since
   leader-only hides how close the vote split is. */
.fs-yes {
  display: inline-block;
  font-size: 10px; font-weight: 700; color: var(--success);
  font-family: monospace; padding: 1px 5px; border-radius: 3px;
  background: rgba(74,222,128,0.16);
}
.fs-no {
  display: inline-block;
  font-size: 10px; font-weight: 700; color: var(--danger);
  font-family: monospace; padding: 1px 5px; border-radius: 3px;
  background: rgba(239,68,68,0.16);
}

/* ─── Top-20 rank-change indicators (prominent, leftmost on each row) ─── */
.t20-row { position: relative; }
.t20-row::after {
  content: ''; display: inline-block;
  position: absolute; left: 4px; top: 11px;
  width: 14px; height: 14px;
  font-size: 14px; line-height: 1; font-weight: 800;
  text-align: center;
}
.t20-row.t20-rc-up::after   { content: '▲'; color: var(--success);
  text-shadow: 0 0 4px rgba(74,222,128,0.6); }
.t20-row.t20-rc-down::after { content: '▼'; color: var(--danger);
  text-shadow: 0 0 4px rgba(239,68,68,0.6); }
.t20-row.t20-rc-same::after { content: '●'; color: #fbbf24;
  font-size: 10px; top: 14px; }
.t20-row.t20-rc-new::after  { content: '★'; color: #22c55e;
  font-size: 13px; top: 12px;
  text-shadow: 0 0 6px rgba(34,197,94,0.7); }
/* Slightly indent every t20-row to make space for the arrow icon */
.t20-row { padding-left: 24px; }

/* ─── 🔥 Flame badge (big bets / 2x volume movers) ─── */
.flame-badge {
  display: inline-block;
  font-size: 18px; line-height: 1;     /* was 13px — bumped per UX request */
  margin-right: 5px;
  filter: drop-shadow(0 0 4px rgba(251,113,133,0.85));
  animation: flameFlicker 1.6s ease-in-out infinite;
  vertical-align: middle;
}
@keyframes flameFlicker {
  0%, 100% { filter: drop-shadow(0 0 4px rgba(251,113,133,0.85)); }
  50%      { filter: drop-shadow(0 0 9px rgba(251,191,36,1.0)); }
}

/* Row background brightening when an event has a 🔥 flame (big leader
   bet or 24h-volume doubling). Applied via .t10-row-flame / .t20-row-flame
   classes set server-side in the template — keeps lookups simple and
   works in every browser (no :has() dependency). */
.t10-row.t10-row-flame,
.t20-row.t20-row-flame {
  background: linear-gradient(
    90deg,
    rgba(251, 191, 36, 0.13) 0%,
    rgba(251, 113, 133, 0.09) 50%,
    rgba(251, 191, 36, 0.05) 100%
  );
  border-left: 2px solid rgba(251, 113, 133, 0.55);
  box-shadow: inset 0 0 18px rgba(251, 113, 133, 0.05);
}
.t10-row.t10-row-flame:hover,
.t20-row.t20-row-flame:hover {
  background: linear-gradient(
    90deg,
    rgba(251, 191, 36, 0.20) 0%,
    rgba(251, 113, 133, 0.14) 50%,
    rgba(251, 191, 36, 0.09) 100%
  );
}
.delta-flat { background: var(--panel-2); color: var(--muted); }
.delta-na { color: var(--muted); font-family: monospace; font-size: 11px; }
.spread-chip {
  display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 3px;
  font-family: monospace; margin-left: 4px; vertical-align: middle;
  background: var(--panel-2); color: var(--muted);
}
.opt-spread, .opt-delta { font-family: monospace; font-size: 11px; white-space: nowrap; }

/* ─── Tables (legacy) ─── */
table { width: 100%; border-collapse: collapse; background: var(--panel); border-radius: 8px; overflow: hidden; }
.empty { padding: 20px; color: var(--muted); font-style: italic; text-align: center; }
code { background: var(--panel-2); padding: 2px 6px; border-radius: 3px; font-family: monospace; }

/* ─── Footer ─── */
footer {
  display: flex; justify-content: space-between; align-items: center;
  color: var(--muted); font-size: 11px; padding: 14px 20px;
  border-top: 1px solid var(--border);
}
.data-credit { color: var(--muted); letter-spacing: 0.03em; line-height: 1.55; text-align: left; }
.data-credit strong { color: var(--text); font-weight: 700; margin-right: 4px; }
.data-credit-link { color: inherit; text-decoration: underline; text-decoration-style: dotted; text-decoration-color: var(--border); }
.data-credit-link:hover { color: var(--accent); text-decoration-color: var(--accent); }
.data-credit-sep { display: inline-block; margin: 0 8px; color: rgba(148, 163, 184, 0.45); }
/* Build .94.1: each footer credit category renders as its own
   left-aligned block-level line (instead of the prior inline single-
   paragraph with `·` separators). Four lines total:
     1. Prediction markets: ...
     2. News sources:       ...
     3. Aggregators & APIs: ...
     4. <version> · <contact>
   Small vertical gap between lines for breathing room. */
.data-credit-line {
  display: block;
  text-align: left;
  margin-bottom: 4px;
}
.data-credit-line:last-child { margin-bottom: 0; }
/* Build v0.4 20260526.230: header line ("Powered by:") sits as a small
   section anchor above the three credit lines.  Slightly larger + a
   bit of bottom margin so the eye reads it as a heading rather than
   another data line. */
.data-credit-header {
  font-size: 14px;
  margin-bottom: 6px;
  color: var(--text);
  letter-spacing: 0.02em;
}
.data-credit-header strong { font-weight: 800; }
/* The fourth line (version + contact) sits visually a touch lower-key
   than the source-credit lines — same muted family but a bit smaller. */
.data-credit-meta {
  margin-top: 6px;
  font-size: 11px;
}
.data-credit-meta .version-tag,
.data-credit-meta .footer-contact {
  display: inline;
  margin-top: 0;
}
.version-tag {
  display: inline-block; margin-top: 4px;
  font-size: 10px; color: var(--muted); opacity: 0.6;
  font-family: monospace; letter-spacing: 0.05em;
}
.footer-meta { font-family: monospace; }

/* Build .315: consolidated footer stripe under the PredictHQ box.  It's a
   <footer>, so it inherits the base footer flex/padding/border-top; we override
   to a top-aligned two-zone band: Powered-by credits (left) across from the
   visitor globe + stats + flag tabs (bottom-right).  Wraps on narrow screens. */
.footer-stripe { align-items: flex-start; gap: 28px; flex-wrap: wrap; }
.fs-credits { flex: 1 1 320px; min-width: 0; }
.fs-credits .data-credit-header { font-size: 13px; margin-bottom: 4px; }
.fs-credits .data-credit-line { margin-bottom: 3px; }
.fs-credits .data-credit-meta { margin-top: 5px; }
.fs-visitors { flex: 1 1 430px; min-width: 0; }
/* Re-flow the visitor cluster: globe + stats on top, tabs, then the full
   20-flag grid spanning the width (all 20 visible per tab — no scroll). */
.fs-visitors .visitor-body-flat {
  display: grid;
  grid-template-columns: 76px auto;
  grid-template-areas:
    "globe stats"
    "tabs  tabs"
    "flags flags";
  gap: 5px 12px;
  align-items: center;
}
.fs-visitors .vw-globe-wrap { grid-area: globe; }
.fs-visitors .vw-globe-flat { width: 76px; height: 76px; }
.fs-visitors .vw-stats-flat { grid-area: stats; }
.fs-visitors .vw-flag-tabs { grid-area: tabs; border-left: none; padding: 2px 0 0; }
.fs-visitors .vw-list-flat {
  grid-area: flags; border-left: none; padding: 3px 0 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
  gap: 0 12px; max-height: none; overflow: visible; font-size: 10px;
}
@media (max-width: 760px) {
  .fs-visitors .visitor-body-flat { grid-template-columns: 64px auto; }
}
.footer-contact {
  color: var(--muted);
  font-size: 11px;
  letter-spacing: 0.02em;
}
.footer-contact a {
  color: var(--accent);
  text-decoration: none;
  border-bottom: 1px dotted var(--border);
}
.footer-contact a:hover {
  border-bottom-color: var(--accent);
}
@media (max-width: 700px) {
  /* Build .94.1: keep `.data-credit-line` left-aligned on mobile even
     when the parent footer stacks vertically.  User explicitly asked
     for left-aligned attribution lines. */
  footer { flex-direction: column; gap: 6px; text-align: left; align-items: flex-start; }
  .data-credit { width: 100%; }
}

/* Flat visitor card at the bottom of the page (Phase 4 UX:
   single horizontal rectangle with globe on the left, stats grid in the
   middle, country list on the right — no nested 2-col layout). */
/* Build .313 (2026-06-02): compact visitor widget — minimal real-estate. */
.visitor-row { padding: 4px 20px; }
.visitor-card-flat {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
  padding: 6px 10px; min-height: 0;
}
.visitor-card-flat h3 { margin: 0 0 4px; font-size: 11px; }
.visitor-body-flat {
  display: grid;
  grid-template-columns: 72px minmax(140px, 260px) 1fr;
  gap: 10px; align-items: center; min-height: 0;
}
.vw-globe-flat {
  width: 72px; height: 72px;
  margin: 0; flex-shrink: 0;
}
.visitor-card .vw-stats-flat {
  /* .282: 2x2 grid; .313: tighter gap */
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 4px;
  align-items: stretch;
}
.visitor-card .vw-stat { padding: 2px 4px; }
.visitor-card .vw-stat-num { font-size: 13px; }
.visitor-card .vw-stat-lbl { font-size: 9px; }
.visitor-card .vw-stat-sub { font-size: 8px; }
.vw-list-flat {
  list-style: none; margin: 0; padding: 3px 8px;
  border-left: 1px solid var(--border);
  max-height: 90px; overflow-y: auto;
  font-size: 10px;
}
.vw-list-flat li {
  display: flex; justify-content: space-between; align-items: center;
  padding: 1px 0;
}
/* Build .313: tab bar — compact. */
.vw-flag-tabs {
  display: flex; flex-wrap: wrap; gap: 3px;
  padding: 2px 8px 0;
  border-left: 1px solid var(--border);
}
.vw-flag-tab {
  background: transparent; color: var(--muted);
  border: 1px solid var(--border); border-radius: 3px;
  font-size: 9px; font-variant-numeric: tabular-nums;
  padding: 0 4px; cursor: pointer; line-height: 1.5;
}
.vw-flag-tab:hover { color: var(--fg); border-color: var(--muted); }
.vw-flag-tab.active {
  color: var(--fg); border-color: var(--accent, #22d3ee);
  background: rgba(34,211,238,0.08);
}
@media (max-width: 900px) {
  .visitor-body-flat {
    grid-template-columns: 1fr;
    gap: 10px;
  }
  .vw-globe-flat { margin: 0 auto; }
  .vw-list-flat { border-left: none; border-top: 1px solid var(--border); padding-top: 6px; }
}

/* sx.bet geo-block pill + empty state */
.plat-blocked-pill {
  display: inline-block; vertical-align: middle;
  margin-left: 8px; padding: 2px 7px; border-radius: 10px;
  font-size: 9px; font-weight: 700; letter-spacing: 0.06em;
  background: rgba(251,113,133,0.18); color: #fda4af;
  border: 1px solid rgba(251,113,133,0.35);
}
.empty-blocked {
  background: rgba(251,113,133,0.08);
  border: 1px dashed rgba(251,113,133,0.4);
  border-radius: 6px;
  padding: 14px 16px; line-height: 1.55;
  color: var(--muted); font-size: 12px;
  margin: 8px 0;
}
.empty-blocked strong { color: var(--text); display: block; margin-bottom: 4px; }

/* ─── News-link icon (Phase 6) ────────────────────────────────────────────
   Pure visual indicator that a high-confidence news article exists for this
   event — NOT a clickable link. The article URL itself opens via the event
   card (.evt-news-card below) so the row click flow stays consistent: title
   → event modal → read the article from there. Earlier versions wrapped the
   icon in an <a>, but nested anchors inside the .t10-title link broke the
   title click. */
.news-icon, .news-icon-flag {
  display: inline-block; vertical-align: middle;
  margin-right: 5px; padding: 0 2px;
  font-size: 12px; line-height: 1;
  opacity: 0.7;
  pointer-events: none;   /* truly non-interactive — clicks pass through to .t10-title */
}

/* ─── Event modal: news block ─────────────────────────────────────────────
   Sits between the modal head and the meta-card; readers scan past the
   event title and immediately see "Related news" with the actual article
   link they can open. */
.evt-news-card {
  display: flex; gap: 12px; align-items: flex-start;
  margin: 12px 0; padding: 12px 14px;
  background: rgba(96,165,250,0.08);
  border: 1px solid rgba(96,165,250,0.25);
  border-radius: 6px;
}
.evt-news-card .evt-news-icon {
  font-size: 22px; line-height: 1.1; flex: 0 0 auto;
}
.evt-news-card .evt-news-body { flex: 1; min-width: 0; }
.evt-news-card .evt-news-label {
  font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--muted); margin-bottom: 4px;
}
.evt-news-card .evt-news-link {
  color: var(--accent); font-weight: 600;
  text-decoration: none; word-break: break-word;
}
.evt-news-card .evt-news-link:hover { text-decoration: underline; }
.evt-news-card .evt-news-meta {
  font-size: 11px; color: var(--muted); margin-top: 4px;
  font-family: monospace;
}

/* Source-provider chip on the primary 'Related news' line — labels
   whether the article came from Guardian (primary) or GDELT (fallback). */
.evt-news-provider {
  display: inline-block; margin-left: 6px;
  padding: 1px 6px; border-radius: 3px;
  font-size: 10px; font-weight: 600;
  letter-spacing: 0.04em;
}
.evt-news-provider-guardian {
  background: rgba(0, 87, 156, 0.20); color: #5da8ff;
  border: 1px solid rgba(0, 87, 156, 0.40);
}
.evt-news-provider-gdelt {
  background: rgba(148, 163, 184, 0.15); color: var(--muted);
  border: 1px solid rgba(148, 163, 184, 0.30);
}
/* Build .87.1: NewsData.io fallback badge — amber to match the
   integration's brand without colliding with Guardian's blue. */
.evt-news-provider-newsdata {
  background: rgba(245, 158, 11, 0.18); color: #f59e0b;
  border: 1px solid rgba(245, 158, 11, 0.40);
}
/* Build .90: Currents API third-source badge — emerald green to keep
   the three primary providers visually distinct (Guardian blue,
   NewsData amber, Currents green). */
.evt-news-provider-currents {
  background: rgba(16, 185, 129, 0.18); color: #10b981;
  border: 1px solid rgba(16, 185, 129, 0.40);
}
/* Build .90.1: HackerNews fourth-source badge — HN signature orange
   (#ff6600) so the brand association is immediate.  Caps it at the
   same border-weight as the other three sources so all four primary
   badges read visually similar. */
.evt-news-provider-hackernews {
  background: rgba(255, 102, 0, 0.18); color: #ff6600;
  border: 1px solid rgba(255, 102, 0, 0.40);
}

/* GDELT-augmented 'More coverage' list inside the event modal. Only
   rendered when the primary news icon is present. Sits below the
   primary article link, never on the main UI. */
.evt-news-extras {
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px dashed rgba(96, 165, 250, 0.20);
}
.evt-news-extras-label {
  font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--muted); margin-bottom: 4px;
}
/* Build .58 (item #3): loading-skeleton styling so the "Loading…" text
   has a visible container instead of looking like a dangling sentence
   above the dashed divider. */
.evt-news-extras-loading .evt-news-extras-skel {
  font-size: 11px;
  color: var(--muted);
  font-style: italic;
  padding: 3px 0;
  opacity: 0.7;
  animation: extrasPulse 1.6s ease-in-out infinite;
}
@keyframes extrasPulse {
  0%, 100% { opacity: 0.4; }
  50%      { opacity: 0.85; }
}
.evt-news-extras-list {
  list-style: none; margin: 0; padding: 0;
}
.evt-news-extras-list li {
  font-size: 12px; line-height: 1.4; padding: 3px 0;
  display: flex; gap: 10px; align-items: baseline;
}
.evt-news-extras-list a {
  color: var(--text); text-decoration: none;
  flex: 1; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.evt-news-extras-list a:hover { color: var(--accent); text-decoration: underline; }
.evt-news-extras-src {
  font-size: 10px; color: var(--muted); font-family: monospace;
  flex: 0 0 auto;
}
/* Build .77: per-row source badge so users can distinguish GDELT (live)
   from NewsData.io (cached, 4h-budget) articles. */
.nx-src-badge {
  display: inline-block;
  font-family: monospace;
  font-size: 8px;
  font-weight: 700;
  padding: 1px 5px;
  border-radius: 2px;
  letter-spacing: 0.04em;
  flex: 0 0 auto;
  cursor: help;
}
.nx-src-gd { background: rgba(167, 139, 250, 0.15); color: #a78bfa; }
.nx-src-nd { background: rgba(34, 211, 238, 0.15);  color: #22d3ee; }

/* ─── Wallet link styling ─── */
.wallet-link {
  color: var(--accent); text-decoration: none; cursor: pointer;
  border-bottom: 1px dotted rgba(45,212,191,0.4);
}
.wallet-link:hover { color: var(--text); border-bottom-color: var(--text); text-decoration: none; }

/* Jackpot row winner line */
.jp-row-winner {
  display: flex; gap: 6px; align-items: baseline; padding: 2px 4px 6px 30px;
  font-size: 11px; color: var(--muted); flex-wrap: wrap;
}
.jp-row-winner .wallet-link { font-weight: 700; }
.jp-winner-amt { color: var(--success); font-family: monospace; font-weight: 700; }
.jp-winner-sub { color: var(--muted); font-family: monospace; }

/* ─── Wallet modal ─── */
.wallet-modal { max-width: 880px; }
.wm-head { margin-bottom: 14px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
.wm-name { font-size: 22px; font-weight: 800; color: var(--text); }
.wm-addr { font-size: 11px; color: var(--muted); margin-top: 2px; }
.wm-addr code { font-size: 11px; }

/* Build .65 (item #4): permalink to full /wallet/<addr> page in modal
   header, and PMXT open-positions summary band below the header. */
.wm-full-link {
  color: var(--accent);
  text-decoration: none;
  font-weight: 600;
}
.wm-full-link:hover { text-decoration: underline; }

.wm-pmxt-summary {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px;
  margin-bottom: 14px;
  padding: 8px 12px;
  background: rgba(45, 212, 191, 0.06);
  border: 1px solid rgba(45, 212, 191, 0.18);
  border-radius: 6px;
  font-size: 12px;
  color: var(--text);
  cursor: help;
}
.wm-pmxt-summary .wm-pmxt-label {
  font-weight: 700;
  color: var(--accent);
  letter-spacing: 0.03em;
}
.wm-pmxt-summary .wm-pmxt-stat {
  color: var(--muted);
  font-size: 12px;
}
.wm-pmxt-summary .wm-pmxt-stat strong {
  color: var(--text);
  font-weight: 700;
  margin-right: 4px;
}
.wm-pmxt-summary .wm-pmxt-more {
  margin-left: auto;
  color: var(--accent);
  text-decoration: none;
  font-size: 11px;
}
.wm-pmxt-summary .wm-pmxt-more:hover { text-decoration: underline; }
@media (max-width: 768px) {
  .wm-pmxt-summary { font-size: 10px; gap: 8px; padding: 6px 10px; }
  .wm-pmxt-summary .wm-pmxt-more { margin-left: 0; }
}

/* Build .65.2: empty-state band when the wallet was clicked from a live
   trade but has no whale-size history in our records (sub-$2k bettors,
   newly-active wallets, etc.). Replaces the misleading "wallet not
   found" error from earlier builds. */
.wm-no-records {
  margin-bottom: 14px;
  padding: 12px 14px;
  background: rgba(96, 165, 250, 0.06);
  border: 1px solid rgba(96, 165, 250, 0.18);
  border-radius: 6px;
  color: var(--text);
  font-size: 13px;
  line-height: 1.45;
  cursor: help;
}
.wm-no-records .wm-no-rec-icon {
  font-size: 14px;
  margin-right: 6px;
}
.wm-no-records .wm-no-rec-sub {
  display: block;
  margin-top: 4px;
  color: var(--muted);
  font-size: 11px;
}

/* Build .48 / v0.2 — activity badges next to the wallet name.
   🌊 splash    → ≥ 1 single USD bet ≥ $3,000
   🎆 firework  → > 12 trades across all venues */
.wm-badges {
  display: inline-flex;
  gap: 6px;
  margin-left: 10px;
  vertical-align: 1px;
}
.wm-badge {
  display: inline-block;
  font-size: 18px;
  line-height: 1;
  cursor: help;
  filter: drop-shadow(0 0 4px rgba(96, 165, 250, 0.45));
}
.wm-badge-splash   { filter: drop-shadow(0 0 4px rgba(96, 165, 250, 0.55)); }
.wm-badge-firework { filter: drop-shadow(0 0 4px rgba(251, 191, 36, 0.55)); }

/* Build .48 — never-blank event cell in the All-bets table. */
.wm-evt-fallback {
  font-family: monospace;
  font-size: 11px;
  color: var(--muted);
  background: var(--panel-2);
  padding: 1px 5px;
  border-radius: 2px;
  cursor: help;
}
.wm-stats {
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-bottom: 14px;
}
.wm-stat {
  background: var(--panel-2); border-radius: 6px; padding: 10px; text-align: center;
}
.wm-stat-num { font-family: monospace; font-size: 18px; font-weight: 800; color: var(--accent); }
.wm-stat-num.tr-good { color: var(--success); }
.wm-stat-num.tr-bad { color: var(--danger); }
.wm-stat-lbl { font-size: 10px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; margin-top: 4px; }
/* Build v0.35 20260523.175 (2026-05-23): per-row status icons that
   used to live inside the .t20-title anchor (news, flame, closed-x)
   are now hoisted to be siblings of the row — placed BEFORE the
   evt-group-pill multi-marketplace indicator.  This class normalises
   their vertical alignment + slight right-margin so they don't
   collide with whatever follows. */
.t20-row-icon {
  display: inline-block;
  vertical-align: middle;
  margin-right: 2px;
  line-height: 1;
  flex-shrink: 0;
}

/* Build v0.35 20260523.173: live-stats placeholder visual while
   loadWalletHistory fetches.  The dashes pulse to signal it's loading
   (vs the build-126 dead-dashes that looked broken). */
.wm-stats-pending .wm-stat-num {
  color: var(--muted);
  animation: wm-pending-pulse 1.4s ease-in-out infinite;
}
@keyframes wm-pending-pulse {
  0%, 100% { opacity: 0.4; }
  50%      { opacity: 0.9; }
}
.wm-stat-plats {
  /* When the "platforms" stat shows a list like "POLY KALSHI MANIFOLD"
     we need a smaller font so it doesn't overflow the box. */
  font-size: 11px;
  letter-spacing: 0.03em;
  word-spacing: 4px;
  line-height: 1.25;
}
.wm-stats-source-note {
  font-size: 11px;
  color: var(--muted);
  font-style: italic;
  margin: -4px 0 14px 0;
  text-align: center;
}
.wm-plats { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 14px; font-size: 11px; }
.wm-plat { background: var(--panel-2); padding: 4px 8px; border-radius: 4px; }

/* ── Build v0.4 20260530.283: activity-first wallet card ──────────────
   Replaces the 5 resolved-P&L hero boxes (Win rate / ROI / Net P&L /
   Staked / Resolved bets — empty for most wallets) with always-populated
   activity metrics, a prominent open-positions row, and a resolved
   track-record row that shows only when the data exists.  All colors via
   CSS vars per the graphical tenet. */
/* Sparkline tile (avg bet/event over time). The tile sets `color` so the
   inline SVG stroke="currentColor" picks up the accent — no hardcoded hex. */
.wm-stat-spark { color: var(--accent); display: flex; flex-direction: column; justify-content: center; }
.wm-spark-wrap { width: 100%; height: 30px; display: flex; align-items: center; justify-content: center; }
.wm-spark-svg { width: 100%; height: 100%; overflow: visible; }
.wm-spark-empty { font-family: monospace; font-size: 18px; font-weight: 800; color: var(--muted); }

/* Prominent open-positions row — same visual weight as the boxes, directly
   under them.  Shared inner classes (.wm-openpos-*) styled here are reused
   by the full-page .wallet-openpos-row. */
.wm-openpos-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px;
  background: var(--panel-2); border: 1px solid var(--border);
  border-left: 3px solid var(--accent); border-radius: 6px;
  padding: 12px 14px; margin-bottom: 14px; font-size: 13px;
}
.wm-openpos-label { font-weight: 700; color: var(--text); }
.wm-openpos-stat { color: var(--muted); }
.wm-openpos-stat strong { color: var(--accent); font-family: monospace; font-size: 15px; }
.wm-openpos-stat .tr-good { color: var(--success); font-family: monospace; font-weight: 700; }
.wm-openpos-stat .tr-bad { color: var(--danger); font-family: monospace; font-weight: 700; }
.wm-openpos-more { margin-left: auto; color: var(--accent); text-decoration: none; font-size: 12px; }
.wm-openpos-more:hover { text-decoration: underline; }
.wm-openpos-plats { display: inline-flex; flex-wrap: wrap; gap: 8px; }
.wm-openpos-plats .wm-plat { font-size: 11px; }

/* Secondary resolved track-record row — only renders when the wallet has
   resolved P&L (most don't). Lighter weight than the open-positions row. */
.wm-track-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 14px; font-size: 12px; }
.wm-track-lbl { color: var(--muted); font-weight: 600; }
.wm-track-chip { background: var(--panel-2); border: 1px solid var(--border); border-radius: 4px; padding: 3px 8px; font-family: monospace; color: var(--text); }
.wm-track-chip.tr-good { color: var(--success); }
.wm-track-chip.tr-bad { color: var(--danger); }
.wm-trades { width: 100%; font-size: 11px; }
.wm-trades th, .wm-trades td {
  padding: 5px 8px; border-bottom: 1px solid var(--border);
  text-align: left; vertical-align: top;
}
.wm-trades th {
  background: var(--panel-2); color: var(--muted); font-size: 10px;
  text-transform: uppercase; letter-spacing: 0.05em;
}
.wm-trades .wm-ts, .wm-trades .wm-odds, .wm-trades .wm-amt { font-family: monospace; white-space: nowrap; }
.wm-trades .wm-amt { font-weight: 700; color: var(--whale); }
.wm-trades .wm-event a { color: var(--text); }
.wm-trades .wm-event a:hover { color: var(--accent); }
.wm-trades .wm-status { white-space: nowrap; font-family: monospace; font-size: 10px; }
.trade-won  { color: var(--success); font-weight: 700; }
.trade-lost { color: var(--danger);  font-weight: 700; }
.trade-open { color: var(--muted); font-style: italic; }
@media (max-width: 700px) {
  .wm-stats { grid-template-columns: repeat(2, 1fr); }
}

/* Build .43: wallet full-history block */
.wm-history-wrap { margin-top: 18px; }
.wm-history-sub {
  color: var(--muted); font-weight: normal; font-size: 11px;
  text-transform: none; letter-spacing: 0; margin-left: 6px;
}
.wm-history-slot { min-height: 40px; }
.wm-history-loading, .wm-history-err {
  padding: 12px; text-align: center; color: var(--muted);
  font-size: 12px; font-style: italic;
}
.wm-history-err { color: var(--danger); font-style: normal; }
.wm-history-meta {
  display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
  font-size: 10px; margin-bottom: 8px; color: var(--muted);
}
.wm-history-count {
  font-family: monospace; padding: 3px 8px; background: var(--panel-2);
  border-radius: 3px; font-weight: 700;
}
.wm-hp-chip {
  font-family: monospace; padding: 3px 6px; border-radius: 3px;
  font-size: 10px;
}
.wm-history-cached {
  padding: 2px 6px; border-radius: 3px; background: var(--panel-2);
  font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em;
}
.wm-load-full-wrap { margin-top: 10px; text-align: center; }
.wm-load-full {
  background: var(--accent); color: #0b1020; border: none;
  padding: 8px 16px; border-radius: 4px; font-weight: 700;
  cursor: pointer; font-size: 12px;
}
.wm-load-full:hover { filter: brightness(1.1); }
.wm-history-note { color: var(--muted); font-size: 10px; font-style: italic; }
.wm-history-table { margin-top: 0; }

/* ─── Cross-venue event group modal ─── */
.event-group-modal { max-width: 760px; }
.eg-head { margin-bottom: 14px; padding-bottom: 8px; border-bottom: 1px solid var(--border); }
.eg-tag {
  display: inline-block; font-size: 10px; font-weight: 800;
  padding: 2px 8px; border-radius: 3px; color: #0b1020;
  letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 6px;
}
.eg-similarity { font-size: 11px; color: var(--muted); font-family: monospace; }
.eg-table { width: 100%; font-size: 12px; }
.eg-table th, .eg-table td { padding: 6px 8px; border-bottom: 1px solid var(--border); text-align: left; }
.eg-table th { background: var(--panel-2); color: var(--muted); font-size: 10px; text-transform: uppercase; }
.eg-row .eg-title a { color: var(--text); font-weight: 600; }
.eg-row .eg-title a:hover { color: var(--accent); }
.eg-row .eg-vol { font-family: monospace; white-space: nowrap; }
.eg-empty { color: var(--muted); font-style: italic; font-size: 11px; }
.eg-top { font-size: 11px; }

/* ── Arb modal top-half UX refresh (build v0.4 20260526.240) ─────────────
   Operator UX request: the modal's top-half (Spread line, VWAP row, and
   the 5-chip metric strip) was reading as a stack of tightly-packed
   tiny bars sitting under a hard horizontal divider.  Rework: drop the
   divider, kill the per-chip borders/backgrounds, promote font sizes
   to confident "lead summary" prominence, and lay the metric chips out
   as an even auto-fit grid spanning the modal's top-half real estate.

   All rules scoped to `.event-group-modal` so the homepage arb-card
   styling (where the same chip classes appear at compact size) stays
   untouched. */

/* Drop the eg-head bottom border that was acting as a horizontal bar
   between the top-half metric display and the per-venue table. */
.event-group-modal .eg-head {
  border-bottom: none;
  padding-bottom: 16px;
  margin-bottom: 18px;
}

/* "Spread: 1971 bps (19.71%) — gross of fees..." was tiny 11px mono
   muted; promote to lead-paragraph size with bps still mono-weighted
   for scannability. */
.event-group-modal .eg-similarity {
  font-size: 15px;
  font-family: inherit;
  color: var(--text);
  line-height: 1.45;
  margin: 10px 0 4px;
}
.event-group-modal .eg-similarity strong {
  font-family: monospace;
  font-size: 18px;
  color: var(--accent);
}
.event-group-modal .eg-similarity em {
  font-style: italic;
  color: var(--muted);
  font-size: 13px;
}

/* VWAP row in the modal — strip the boxed background+border so it
   doesn't read as another bar; promote the 47.6% % to hero size. */
.event-group-modal .arb-vwap.arb-vwap-modal {
  background: transparent;
  border: none;
  padding: 12px 0;
  margin: 0;
  font-size: 16px;
  gap: 12px;
  flex-wrap: wrap;
}
.event-group-modal .arb-vwap-modal .arb-vwap-icon {
  font-size: 22px;
  width: 24px;
}
.event-group-modal .arb-vwap-modal .arb-vwap-label {
  font-size: 13px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.event-group-modal .arb-vwap-modal .arb-vwap-pct {
  font-size: 22px;
  font-weight: 800;
  color: var(--accent);
}
.event-group-modal .arb-vwap-modal .arb-vwap-meta {
  font-size: 13px;
  color: var(--muted);
  font-family: inherit;
}

/* Metric strip in the modal (Fees / Net spread / Vig / Persists / Max
   size).  Was a cramped row of bordered chips; convert to an evenly
   spaced auto-fit grid where each cell stacks LABEL (small caps) on
   top of VALUE (large bold mono), no individual chip border. */
.event-group-modal .arb-meta.arb-meta-modal {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: 18px 24px;
  margin: 18px 0 6px;
  padding: 14px 0 4px;
  border-top: none;
}
.event-group-modal .arb-meta-modal .arb-meta-chip {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  background: transparent;
  border: none;
  padding: 0;
  border-radius: 0;
  font-family: inherit;
  font-size: 18px;
  gap: 4px;
}
.event-group-modal .arb-meta-modal .arb-meta-label {
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 600;
}
.event-group-modal .arb-meta-modal .arb-meta-val {
  font-size: 20px;
  font-weight: 800;
  font-family: monospace;
  color: var(--text);
}
/* Restore color affordances on per-chip variants — without backgrounds
   we lean on the value color alone. */
.event-group-modal .arb-meta-modal .arb-meta-net-strong .arb-meta-val {
  color: var(--success);
}
.event-group-modal .arb-meta-modal .arb-meta-vig-arb .arb-meta-val {
  color: var(--success);
}
.event-group-modal .arb-meta-modal .arb-meta-net-zero .arb-meta-val {
  color: var(--muted);
}

/* Cross-venue group color palette (used as background tint on grouped event titles) */
:root {
  --evt-grp-0: #fbbf24;
  --evt-grp-1: #60a5fa;
  --evt-grp-2: #f472b6;
  --evt-grp-3: #a78bfa;
  --evt-grp-4: #4ade80;
  --evt-grp-5: #fb7185;
}
.evt-group-badge {
  display: inline-block; vertical-align: middle; margin-right: 6px;
  width: 8px; height: 8px; border-radius: 50%;
  cursor: pointer;
}
.evt-group-0 .evt-group-badge { background: var(--evt-grp-0); }
.evt-group-1 .evt-group-badge { background: var(--evt-grp-1); }
.evt-group-2 .evt-group-badge { background: var(--evt-grp-2); }
.evt-group-3 .evt-group-badge { background: var(--evt-grp-3); }
.evt-group-4 .evt-group-badge { background: var(--evt-grp-4); }
.evt-group-5 .evt-group-badge { background: var(--evt-grp-5); }

/* Cross-venue pill: explicit "↔ N" badge that's hard to miss. */
.evt-group-pill {
  display: inline-flex; align-items: center; vertical-align: middle;
  margin-right: 6px; padding: 1px 6px; border-radius: 10px;
  font-family: monospace; font-size: 10px; font-weight: 800;
  color: #0b1020; cursor: pointer; border: 1px solid transparent;
  white-space: nowrap; line-height: 1.4;
  box-shadow: 0 0 0 1px rgba(0,0,0,0.25);
}
.evt-group-pill:hover { transform: scale(1.05); }
.evt-group-pill.evt-group-0 { background: var(--evt-grp-0); }
.evt-group-pill.evt-group-1 { background: var(--evt-grp-1); }
.evt-group-pill.evt-group-2 { background: var(--evt-grp-2); }
.evt-group-pill.evt-group-3 { background: var(--evt-grp-3); }
.evt-group-pill.evt-group-4 { background: var(--evt-grp-4); }
.evt-group-pill.evt-group-5 { background: var(--evt-grp-5); }
.evt-group-link { cursor: pointer; }
.evt-group-link:hover { text-decoration: underline; }
/* Subtle background tint on grouped rows.
   Build v0.35 20260523.181 (2026-05-23): removed the top-10 colored
   inset-shadow "pipes" per user request — the .evt-group-pill chip
   already conveys group membership; the 3px row marker was visually
   redundant with the pill and read as clutter.  Top-20 still gets
   the bar because top-20 rows are denser + the pill is smaller, so
   the row-level marker remains useful at-a-glance for scanning. */
.t20-row.evt-group-0 .t20-title { box-shadow: inset 3px 0 0 var(--evt-grp-0); }
.t20-row.evt-group-1 .t20-title { box-shadow: inset 3px 0 0 var(--evt-grp-1); }
.t20-row.evt-group-2 .t20-title { box-shadow: inset 3px 0 0 var(--evt-grp-2); }
.t20-row.evt-group-3 .t20-title { box-shadow: inset 3px 0 0 var(--evt-grp-3); }
.t20-row.evt-group-4 .t20-title { box-shadow: inset 3px 0 0 var(--evt-grp-4); }
.t20-row.evt-group-5 .t20-title { box-shadow: inset 3px 0 0 var(--evt-grp-5); }

/* ─── Modal ─── */
.modal-overlay {
  position: fixed; inset: 0; background: rgba(5, 8, 20, 0.85);
  display: none; align-items: flex-start; justify-content: center;
  padding: 40px 20px 20px; z-index: 100; overflow-y: auto;
}
.modal-overlay.open { display: flex; }
/* Build .318: the tag/topic card opens FROM WITHIN an open event modal (both are
   .modal-overlay at z-index 100), so it must stack ABOVE the event modal — give
   it a higher z-index so the tag card always pops up in FRONT, not behind. */
#topic-overlay { z-index: 200; }
.modal {
  background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  width: 100%; max-width: 820px; padding: 24px 28px 20px; position: relative;
  box-shadow: 0 20px 60px rgba(0,0,0,0.5);
}
.modal-close {
  position: absolute; top: 10px; right: 14px; background: none; border: none;
  color: var(--muted); font-size: 26px; cursor: pointer; line-height: 1;
}
.modal-close:hover { color: var(--text); }
.modal-platform { color: var(--accent); font-size: 11px; text-transform: uppercase; letter-spacing: 0.15em; margin-bottom: 6px; }
.modal h3 { font-size: 18px; color: var(--text); margin: 0 0 8px; text-transform: none; letter-spacing: normal; }
.modal-meta { color: var(--muted); font-size: 12px; margin-bottom: 16px; }
.modal-meta strong { color: var(--text); font-family: monospace; }
/* Build .57 (item #10) — "—" placeholder when bettor count isn't exposed */
.modal-meta .bettors-na {
  color: var(--muted);
  font-family: monospace;
  cursor: help;
}
/* Build .60 — estimated per-outcome volume (event total × outcome
   price) for PMXT / MetaForecast events where per-outcome volume
   isn't exposed by the venue. ~ prefix + muted color signal estimate. */
.opt-vol-est {
  color: var(--muted);
  font-style: italic;
  cursor: help;
}
.opt-vol-na,
.opt-pct-na {
  color: var(--muted);
  cursor: help;
}

/* Build .58 (NEW item) — SETTLED banner for resolved events. Sits
   between modal-head and the news block, prominent so visitors don't
   miss that this event is no longer live. Gold/jackpot palette to
   match the existing jackpot ticker. */
.evt-settled {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 14px;
  margin: 0 0 14px 0;
  background: linear-gradient(90deg, rgba(251,191,36,0.18) 0%, rgba(251,191,36,0.06) 100%);
  border-left: 4px solid var(--jackpot);
  border-radius: 4px;
  font-size: 12px;
  color: var(--text);
}
.evt-settled-badge {
  display: inline-block;
  padding: 2px 8px;
  font-family: monospace;
  font-size: 11px;
  font-weight: 800;
  letter-spacing: 0.06em;
  background: var(--jackpot);
  color: #0b1020;
  border-radius: 3px;
  flex: 0 0 auto;
}
.evt-settled-body { flex: 1 1 auto; }
.evt-settled-body strong { color: var(--jackpot); font-weight: 700; }
.evt-settled-outcome {
  font-family: monospace;
  font-size: 10px;
  color: var(--muted);
  background: rgba(255,255,255,0.05);
  padding: 1px 5px;
  border-radius: 2px;
  margin-left: 2px;
}
.modal-loading, .modal-error { padding: 30px; text-align: center; color: var(--muted); }
.modal-error { color: var(--danger); }

/* Build .247: shimmer skeleton loader for the wallet modal so the card
   frame appears instantly while the two network fetches run in parallel. */
@keyframes wm-shimmer {
  0%   { background-position: -200% 0; }
  100% { background-position:  200% 0; }
}
.wm-skeleton {
  padding: 14px 16px;
  display: flex; flex-direction: column; gap: 14px;
}
.wm-skel-bar {
  border-radius: 4px;
  background: linear-gradient(
    90deg,
    var(--panel-2) 25%,
    rgba(255,255,255,0.055) 50%,
    var(--panel-2) 75%
  );
  background-size: 200% 100%;
  animation: wm-shimmer 1.5s ease-in-out infinite;
}
.wm-skel-head { display: flex; flex-direction: column; gap: 7px; }
.wm-skel-name { height: 20px; width: 38%; }
.wm-skel-addr { height: 12px; width: 68%; }
.wm-skel-stats-row {
  display: flex; gap: 8px;
}
.wm-skel-stat-box {
  flex: 1; height: 52px; border-radius: 6px;
  background: linear-gradient(
    90deg,
    var(--panel-2) 25%,
    rgba(255,255,255,0.055) 50%,
    var(--panel-2) 75%
  );
  background-size: 200% 100%;
  animation: wm-shimmer 1.5s ease-in-out infinite;
}
.wm-skel-hdr  { height: 13px; width: 55%; }
.wm-skel-rows { display: flex; flex-direction: column; gap: 7px; }
.wm-skel-row  { height: 26px; border-radius: 3px;
  background: linear-gradient(
    90deg,
    var(--panel-2) 25%,
    rgba(255,255,255,0.055) 50%,
    var(--panel-2) 75%
  );
  background-size: 200% 100%;
  animation: wm-shimmer 1.5s ease-in-out infinite;
}

.meta-card {
  background: var(--panel-2); border: 1px solid var(--border); border-radius: 6px;
  padding: 12px; margin-bottom: 14px; display: grid; grid-template-columns: auto 1fr; gap: 12px;
}
.meta-card:has(.meta-img) { grid-template-columns: 80px 1fr; }
.meta-img {
  width: 80px; height: 80px; max-width: 80px; max-height: 80px;
  object-fit: cover; border-radius: 4px; flex-shrink: 0;
}
.meta-fields { display: grid; grid-template-columns: repeat(2, 1fr); gap: 4px 16px; font-size: 11px; }
.meta-fields > div { display: flex; gap: 6px; align-items: baseline; }
.mf-k { color: var(--muted); text-transform: uppercase; letter-spacing: 0.05em; font-size: 10px; }
.mf-v { color: var(--text); font-family: monospace; }
.mf-tags { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.tag-chip {
  display: inline-block; background: var(--panel); color: var(--muted);
  padding: 2px 6px; border-radius: 3px; font-size: 10px; border: 1px solid var(--border);
}
/* Build .306: clickable tag chips in the event-modal head — each opens a
   topic-style card of sibling events sharing that tag (window.openTag). */
.ev-tags { display: flex; flex-wrap: wrap; gap: 5px; align-items: center; margin: 6px 0 2px; }
.tag-chip-link { cursor: pointer; transition: color 0.12s ease, border-color 0.12s ease, background 0.12s ease; }
.tag-chip-link:hover { color: var(--accent); border-color: var(--accent); background: var(--panel-2); }
.meta-desc { grid-column: 1 / -1; color: var(--muted); font-size: 12px; line-height: 1.5; max-height: 180px; overflow-y: auto; }

/* Build v0.4 20260530.285: canonical-buys toggle on the event-modal bets
   tables.  The button swaps each row's Side+Odds textContent between native
   ("BUY Landaluce 0.37") and the trade_unifier canonical fold ("AGAINST
   Cerundolo 0.63").  All colors via CSS vars per the graphical tenet. */
.bets-canon-toggle {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--panel-2); color: var(--accent);
  border: 1px solid var(--border); border-radius: 6px;
  padding: 4px 10px; font-size: 11px; cursor: pointer; margin: 2px 0 8px 0;
}
.bets-canon-toggle:hover { border-color: var(--accent); }
.bets-wrap.bets-canonical .bets-canon-toggle {
  background: var(--accent); color: var(--panel); border-color: var(--accent);
}
.opts-table, .trades-table, .winners-table { width: 100%; margin-bottom: 10px; }
.opts-table th, .trades-table th, .winners-table th {
  background: var(--panel-2); color: var(--muted); font-weight: 600; font-size: 11px;
  text-transform: uppercase; letter-spacing: 0.05em; padding: 8px 10px; text-align: left;
}
.opts-table td, .trades-table td, .winners-table td {
  padding: 8px 10px; border-bottom: 1px solid var(--border); font-size: 13px; vertical-align: top;
}
.opts-table .rank { width: 28px; color: var(--muted); font-family: monospace; }
.opts-table .opt-label { font-weight: 600; word-break: break-word; }
.opts-table .opt-vol, .opts-table .opt-odds { font-family: monospace; white-space: nowrap; }
.opts-table .opt-odds { color: var(--jackpot); font-weight: 600; }
.opts-table .opt-pct { width: 200px; }
.bar-wrap { display: flex; align-items: center; gap: 8px; }
.bar-wrap .bar { height: 10px; background: var(--accent); border-radius: 2px; min-width: 2px; max-width: 140px; }
.bar-wrap span { font-family: monospace; font-size: 12px; color: var(--text); }
.trades-table .trade-side { font-size: 11px; }
.trades-table .trade-user { font-family: monospace; font-size: 11px; color: var(--muted); }
.trades-table .trade-ts { font-family: monospace; font-size: 11px; color: var(--muted); }
/* Build .64 (item #3): Polymarket trades table now shows which sub-market
   each bet was on for multi-market events. The Bet-option column wraps at
   narrow widths but stays single-line on desktop. */
.trades-table .trade-mkt {
  font-size: 12px;
  font-weight: 500;
  max-width: 220px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Build .64 (item C): biggest-winners table for settled Polymarket
   events. Replaces the bets table on resolved jackpots. */
.winners-table .win-profit {
  font-family: monospace;
  font-weight: 700;
  color: var(--success);
  white-space: nowrap;
}
.winners-table .win-mkt {
  font-size: 12px;
  max-width: 220px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.winners-table .win-user {
  font-family: monospace;
  font-size: 11px;
  color: var(--text);
}
.winners-table .win-buy,
.winners-table .win-trades {
  font-family: monospace;
  font-size: 12px;
  color: var(--muted);
  white-space: nowrap;
}
.winners-note {
  display: inline-block;
  margin-left: 6px;
  color: var(--muted);
  cursor: help;
  font-size: 11px;
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
}

/* ─── Responsive ─── */
@media (max-width: 1200px) {
  .top10-trio { grid-template-columns: 1fr 1fr; }
  .jv-grid { grid-template-columns: 1fr; }
}
@media (max-width: 1000px) {
  .top-events { grid-template-columns: 1fr 1fr; }
  .top10-trio { grid-template-columns: 1fr; }
  .movers-merged-grid { grid-template-columns: 1fr; }   /* Build .260 */
  .whale-cards, .whale-cards-2x2 { grid-template-columns: 1fr; }
  header { flex-wrap: wrap; }
  .search-box { order: 10; flex-basis: 100%; max-width: none; margin-left: 0; }
  .globe-hero { min-height: 360px; }
  #globe { min-height: 320px; }
}

/* ─── Mobile platform tabs (Top-20 list selector) ─── */
.top-events-tabs { display: none; }                /* hidden by default; shown on mobile */
.top-events-tabs button {
  background: var(--panel-2); color: var(--text);
  border: 1px solid var(--border); border-radius: 6px;
  padding: 8px 14px; font-size: 12px; font-weight: 700;
  cursor: pointer; white-space: nowrap; flex-shrink: 0;
}
.top-events-tabs button.active { background: var(--accent); color: #0b1020; border-color: var(--accent); }
.top-events-tabs button[data-target="kalshi"].active   { background: var(--kalshi); border-color: var(--kalshi); }
.top-events-tabs button[data-target="manifold"].active { background: #a78bfa; border-color: #a78bfa; }
.top-events-tabs button[data-target="sxbet"].active    { background: var(--sxbet); border-color: var(--sxbet); }
.top-events-tabs button[data-target="limitless"].active { background: var(--limitless); border-color: var(--limitless); color: #0b1020; }

/* ─── Tablet (≤ 900px) ─── */
@media (max-width: 900px) {
  .top-events { grid-template-columns: 1fr; }
}

/* ─── Mobile (≤ 768px) ─────────────────────────────────────────────── */
@media (max-width: 768px) {
  /* Header compaction */
  header { padding: 10px 12px; gap: 8px; }
  h1 { font-size: 18px; letter-spacing: 0.01em; }
  .beta-tag { font-size: 9px; padding: 1px 4px; margin-left: 2px; }
  .tagline { font-size: 10px; }
  .meta { font-size: 11px; gap: 8px; flex-wrap: wrap; width: 100%; order: 12; padding-top: 4px; border-top: 1px solid var(--border); }
  /* mascot is decorative — drop it on phones; let the CTA cluster span full width */
  .header-right { width: 100%; margin-left: 0; justify-content: flex-start; gap: 8px; }
  .header-mascot { display: none; }
  .ts { font-size: 10px; }
  .alive-toggle { font-size: 11px; padding: 4px 8px; border-radius: 14px; }
  .collect-btn { font-size: 11px; padding: 6px 10px; }
  .collect-status { width: 100%; font-size: 10px; }
  .search-box { flex-basis: 100%; order: 11; max-width: none; margin: 0; }
  .search-box input { font-size: 14px; padding: 8px 10px; }

  /* Top strip — stack ticker + jackpot */
  .top-strip { grid-template-columns: 1fr; padding: 8px 12px; gap: 8px; }
  .ticker-strip { gap: 4px; }
  .ticker-row { padding: 5px 8px; gap: 6px; }
  .ticker-label { font-size: 9px; padding: 2px 5px; letter-spacing: 0.08em; }
  .ticker-title { font-size: 11px; }
  .ticker-vol { font-size: 10px; }
  .jackpot-top10-card { padding: 8px 12px; max-height: none; }
  .jackpot-list .jp-row-link { padding: 5px 4px; font-size: 11px; gap: 6px; }
  .jackpot-list .jp-row-amount { font-size: 11px; }
  .jp-row-winner { font-size: 10px; padding: 1px 4px 4px 26px; gap: 4px; }

  /* Signals row — stack vertically */
  .signals-row { grid-template-columns: 1fr; padding: 8px 12px; gap: 8px; }
  .signals-card { padding: 8px 12px; }
  .signals-card h3 { font-size: 14px; margin-bottom: 4px; }
  h3 .plat-name { font-size: 14px; }
  h3 .plat-sub { font-size: 11px; }
  .sig-link { grid-template-columns: 38px 1fr; gap: 6px; padding: 7px 4px; font-size: 11px; min-height: 40px; align-items: center; }
  .sig-meta { grid-column: 1 / -1; justify-self: start; margin-top: 2px; gap: 3px; }
  .sig-tag { font-size: 9px; padding: 1px 4px; }
  .wallets-list .wallet-link { grid-template-columns: 24px 1fr; }
  .wallets-list .sig-meta { grid-column: 2; }

  /* Hero — single column, smaller globe */
  .hero-2x2-center {
    padding: 8px 12px; gap: 8px;
    grid-template-columns: 1fr; grid-template-rows: auto;
  }
  .hero-2x2-center .t10-card { padding: 10px 12px; max-height: none; }
  .hero-2x2-center .t10-card:nth-child(n) { padding-left: 12px; padding-right: 12px; }
  .globe-hero-center {
    position: static; transform: none;
    width: 100%; height: 280px; border-radius: 8px;
    margin: 0; box-shadow: none;
  }
  .globe-hero-center h3 { position: static; transform: none; background: transparent; border: none; padding: 0 0 6px; font-size: 13px; }
  .globe-hero-center .globe-legend { position: static; transform: none; margin-top: 6px; }
  .globe-legend { font-size: 9px; gap: 6px; }
  .platform { font-size: 14px; padding-bottom: 6px; margin-bottom: 8px; }
  .plat-name { font-size: 15px; letter-spacing: 0.04em; }
  .plat-sub { font-size: 11px; }
  .t10-row a { padding: 6px 4px; font-size: 12px; min-height: 36px; }
  .t10-name { font-size: 12px; }
  .t10-vol { font-size: 11px; }

  /* LATEST WHALES marquee — stack label above the scrolling track on mobile so
     items don't get squeezed against the fixed-width LATEST WHALES label. */
  .ticker-section { flex-direction: column; align-items: stretch; }
  .ticker-section .ticker-label {
    padding: 6px 12px; font-size: 10px; letter-spacing: 0.12em;
    text-align: center; align-self: stretch; justify-content: center;
  }
  .ticker-wrap { padding: 4px 0; }
  .ticker-track { gap: 20px; padding-left: 12px; }
  .ticker-item { font-size: 11px; padding: 2px 6px; gap: 4px; }
  .tk-amount { font-size: 11px; }
  .tk-side { font-size: 9px; padding: 1px 4px; }
  .tk-q { max-width: 160px; font-size: 11px; }
  .tk-evt { display: none; }   /* event-title chip removed on mobile to save horizontal space */
  .tk-odds { font-size: 10px; }
  .tk-by   { display: none; }  /* wallet/user trimmed on mobile */

  /* Top-20 platform tabs become visible on mobile */
  .top-events-tabs {
    display: flex; gap: 6px; padding: 8px 12px 4px; overflow-x: auto;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
  }
  .top-events-tabs::-webkit-scrollbar { display: none; }
  .top-events { grid-template-columns: 1fr; padding: 4px 12px 12px; gap: 8px; }
  .top-events .card { display: none; max-height: none; }
  .top-events[data-active="poly"]     .card.poly     { display: block; }
  .top-events[data-active="kalshi"]   .card.kalshi   { display: block; }
  .top-events[data-active="metaforecast"] .card.metaforecast { display: block; }
  .top-events[data-active="myriad"]   .card.myriad   { display: block; }
  .top-events[data-active="betfair"]  .card.betfair  { display: block; }
  .top-events[data-active="manifold"] .card.manifold { display: block; }
  .top-events[data-active="sxbet"]    .card.sxbet    { display: block; }
  .top-events[data-active="limitless"] .card.limitless { display: block; }
  .t20-row { padding: 7px 0 7px 28px; }
  .t20-row::before { left: 0; top: 8px; font-size: 10px; }
  .t20-title { font-size: 12px; line-height: 1.3; }
  .t20-meta { font-size: 10px; line-height: 1.3; }

  /* Whale cards — stack with horizontal label on top */
  /* Build .87: mobile breakpoint scaled down to match the new
     dramatically-compressed desktop sizes. */
  .whale-cards-2x2 { gap: 4px; }
  .featured-whale { flex-direction: column; align-items: stretch; padding: 0; }
  .fw-label {
    writing-mode: horizontal-tb; transform: none;
    padding: 4px 10px;
    border-radius: 6px 6px 0 0; text-align: center; font-size: 9px;
    align-self: stretch; justify-content: center;
  }
  .fw-body { padding: 5px 8px; grid-template-columns: 1fr; gap: 3px; }
  .fw-amount { grid-row: auto; font-size: 18px; text-align: center; padding: 2px 0; line-height: 1.1; }
  .fw-bet { font-size: 11px; line-height: 1.3; }
  .fw-event, .fw-meta { font-size: 10px; }
  .fw-multi-card .fw-label { border-radius: 6px 6px 0 0; }
  .fw-multi-list { padding: 4px 6px; gap: 2px; }
  .fw-mi-link {
    grid-template-columns: auto auto 1fr;
    grid-template-areas:
      "amt side q"
      "evt evt evt"
      "meta meta meta";
    font-size: 10px; gap: 1px 5px; padding: 3px 3px; min-height: 0;
  }
  .fw-mi-link .odds-chip { display: none; }
  .fw-mi-amt { font-size: 11px; }

  /* Whale chart */
  .whale-chart-box { min-height: 220px; padding: 10px 12px; }
  .whale-chart-box canvas { min-height: 200px; max-height: 240px; }
  .whale-chart-box h3 { font-size: 14px; margin-bottom: 6px; }
  .whale-section { padding: 0 12px; }

  /* Build .260: Risers + Coldest merged box (mobile) */
  .movers-merged-section { padding: 8px 12px 0; }
  .movers-merged-card { padding: 10px 12px 12px; }
  .movers-col-head { font-size: 10px; margin-bottom: 4px; }
  .mvm-link { padding: 3px 6px; font-size: 11px; }
  .mvm-title { font-size: 11px; }
  .mvm-delta { font-size: 10px; }

  /* Visitor card + Daily volume */
  .jackpot-volume-row { padding: 8px 12px; }
  .jv-grid { grid-template-columns: 1fr; gap: 8px; }
  .visitor-card { padding: 12px; }
  .visitor-body { grid-template-columns: 1fr; gap: 8px; }
  .vw-globe-bottom { width: 180px; height: 180px; }
  .vw-stats { grid-template-columns: repeat(3, 1fr); gap: 6px; }
  .vw-stat-num { font-size: 16px; }
  .vw-stat-lbl { font-size: 9px; }
  .vw-list-bottom { grid-column: 1 / -1; border-left: none; padding-left: 0; border-top: 1px solid var(--border); padding-top: 8px; max-height: 160px; }
  .dv-chart { min-height: 200px; padding: 10px 12px; }
  .dv-chart canvas { min-height: 180px; max-height: 220px; }

  /* Modals — full width, scrollable */
  .modal-overlay { padding: 8px; padding-top: 24px; align-items: flex-start; }
  .modal { padding: 18px 14px 14px; max-width: 100%; max-height: calc(100vh - 40px); overflow-y: auto; border-radius: 8px; }
  .modal h3 { font-size: 16px; }
  .modal-close { font-size: 28px; top: 6px; right: 10px; padding: 0 4px; }
  .modal-platform { font-size: 10px; }
  .modal-meta { font-size: 11px; }
  .meta-card { grid-template-columns: 1fr; gap: 8px; padding: 10px; }
  .meta-card:has(.meta-img) { grid-template-columns: 60px 1fr; }
  .meta-img { width: 60px; height: 60px; max-width: 60px; max-height: 60px; }
  .meta-fields { font-size: 10px; gap: 3px 12px; }
  .meta-desc { font-size: 11px; max-height: 100px; }
  .opts-table, .trades-table, .wm-trades { font-size: 10px; }
  .opts-table th, .opts-table td,
  .trades-table th, .trades-table td,
  .wm-trades th, .wm-trades td { padding: 5px 6px; }
  .opts-table .opt-pct { width: 90px; }
  .bar-wrap .bar { max-width: 60px; }

  /* Wallet modal */
  .wm-stats { grid-template-columns: repeat(3, 1fr); gap: 6px; }
  .wm-stat { padding: 8px 4px; }
  .wm-stat-num { font-size: 14px; }
  .wm-stat-lbl { font-size: 9px; }
  .wm-trades th:nth-child(1), .wm-trades td:nth-child(1) { display: none; }  /* hide UTC col on phone */
  .wm-name { font-size: 16px; }

  /* Cross-venue group modal */
  .eg-table th, .eg-table td { padding: 6px 5px; font-size: 11px; }
  .eg-table th:nth-child(1), .eg-table td:nth-child(1) { width: 38px; }

  /* Footer */
  footer { padding: 10px 12px; font-size: 10px; flex-direction: column; gap: 6px; text-align: center; }
  .footer-meta { font-family: monospace; }

  /* Viewer pill */
  .viewer-pill { right: 8px; bottom: 8px; padding: 4px 8px; font-size: 10px; }
  .vw-total, .vw-all-unique { font-size: 11px; }
  .vw-label { font-size: 9px; }
}

/* ─── New Phase 1 tickers (Latest Events, Jackpot) ───────────────────── */

/* Both new tickers reuse .ticker-section / .ticker-track / .ticker-item but
   with their own label colors and item structure. The marquee animation is
   already defined; we just style the contents. */

/* Build v0.35 20260523.189 (2026-05-23): reverted to SOLID aqua per
   user request.
   Build v0.35 20260523.191 (2026-05-23): darker shade of aqua —
   switched from var(--accent) #2dd4bf (Tailwind teal-400) to
   #0d9488 (Tailwind teal-600).  Two steps darker.  Text flipped
   from #0b1020 (dark) to #f0fdfa (very light teal-tinted white)
   so contrast stays WCAG-AA clean (~7:1) on the darker background;
   dark text on #0d9488 would have been borderline. */
.ticker-label.tl-events {
  background: #0d9488;
  color: #f0fdfa;
  border-right: 1px solid rgba(13, 148, 136, 0.55);
}
.ticker-label.tl-jackpot {
  background: linear-gradient(180deg, rgba(251,191,36,0.22), rgba(251,191,36,0.10));
  color: var(--jackpot);
  border-right: 1px solid rgba(251,191,36,0.30);
}
.ticker-label.tl-whales {
  /* Inherits the existing default look; specific class kept for symmetry. */
}

/* Latest events items: platform badge + (NEW chip) + title + 24h volume. */
.le-item {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 4px 12px; color: var(--text);
  border-right: 1px solid var(--border);
  white-space: nowrap;
}
.le-item:hover { background: var(--panel-2); text-decoration: none; }
.le-plat { font-size: 9px; padding: 1px 5px; }
.le-new {
  font-size: 11px; padding: 0 4px; line-height: 1;
  background: rgba(74,222,128,0.18); color: var(--success);
  border-radius: 3px; font-weight: 700;
}
.le-title { font-size: 12px; font-weight: 500; max-width: 380px; overflow: hidden; text-overflow: ellipsis; }
.le-vol { font-family: monospace; font-size: 11px; color: var(--muted); font-weight: 600; }

/* Build v0.35 20260525.208: Trending Topics ticker (4th top-of-page
   ticker, promoted from a signals-row tile).  No .ticker-label per
   spec — visually distinguished by an amber border-top + tighter
   padding so the title-less section reads as "topics" without copy.
   Reuses .ticker-section / .ticker-track / scroll-left grammar above. */
.topics-ticker-section {
  border-top: 1px solid rgba(245, 158, 11, 0.30);
  border-bottom: 1px solid rgba(245, 158, 11, 0.20);
  background: linear-gradient(180deg,
              rgba(245, 158, 11, 0.05),
              rgba(245, 158, 11, 0.02));
}
.topics-ticker-section .ticker-wrap { padding: 4px 0; }
.topics-ticker-section .ticker-track { gap: 22px; }
.tt-item {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 3px 10px; color: var(--text);
  border-right: 1px solid var(--border);
  white-space: nowrap;
  cursor: pointer;
}
.tt-item:hover { background: rgba(245, 158, 11, 0.08); text-decoration: none; }
.tt-topic {
  font-weight: 800; color: #f59e0b; font-size: 12px;
  letter-spacing: 0.02em;
}
.tt-vol {
  font-family: monospace; font-size: 11px; font-weight: 700;
  color: var(--jackpot);
  background: rgba(251, 191, 36, 0.12);
  padding: 1px 6px; border-radius: 3px;
}
.tt-evt {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11px; color: var(--muted);
  max-width: 360px;
}
.tt-evt .sig-plat { font-size: 8px; padding: 1px 4px; flex: 0 0 auto; }
.tt-evt-title {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  min-width: 0;
}

/* Jackpot ticker items: platform + payout + title + winner inline. */
.jp-item {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 4px 14px; color: var(--text);
  border-right: 1px solid var(--border);
  white-space: nowrap;
}
.jp-item:hover { background: var(--panel-2); text-decoration: none; }
.jp-amount {
  font-family: monospace; font-size: 13px; font-weight: 800;
  color: var(--jackpot);
}
.jp-title-ticker { font-size: 12px; max-width: 380px; overflow: hidden; text-overflow: ellipsis; }
.jp-evt-sub { color: var(--muted); font-size: 11px; font-style: italic; }
.jp-winning-bet {
  display: inline-block; padding: 1px 7px; border-radius: 3px;
  font-family: monospace; font-size: 11px; font-weight: 800;
  letter-spacing: 0.04em;
}
.jp-winner-yes   { background: rgba(74,222,128,0.22); color: var(--success); }
.jp-winner-no    { background: rgba(239,68,68,0.20);  color: var(--danger); }
.jp-winner-other { background: rgba(96,165,250,0.20); color: var(--kalshi); }
.jp-winner-ticker {
  font-size: 11px; color: var(--muted);
  background: rgba(251,191,36,0.10); padding: 1px 8px; border-radius: 10px;
}
.jp-winner-ticker .wallet-link { color: var(--jackpot); border-bottom-color: rgba(251,191,36,0.4); }

/* Latest whales — add space after platform badge so it's clearly the source. */
.latest-whales-section .ticker-item .sig-plat {
  margin-right: 4px; font-size: 9px;
}

/* Build v.03 .31 build 172 (2026-05-23): Latest Whales is the section
   visitors track most actively (real-time signal of live activity), so
   it gets a slightly brighter background tint and tighter row geometry
   than the surrounding ticker sections (Latest Events, Jackpots).
   Scoped to .latest-whales-section only — no spillover to other
   tickers. */
.latest-whales-section {
  /* Tiny step up from var(--panel) — whale-blue tint so it reads as
     the "heartbeat" of the dashboard without losing the dark palette. */
  background: linear-gradient(180deg,
              rgba(45,212,191,0.07),
              rgba(96,165,250,0.05));
  border-top-color:    rgba(45,212,191,0.30);
  border-bottom-color: rgba(96,165,250,0.20);
}
.latest-whales-section .ticker-wrap {
  /* Was 8px top + bottom — knock back to 4px so the band is visibly
     more compact than its neighbours. */
  padding: 4px 0;
}
.latest-whales-section .ticker-track {
  /* Tighter gap between whale items (was 32px) so more fit on screen. */
  gap: 22px;
}
.latest-whales-section .ticker-item {
  /* Compact whale row: smaller base font, tighter padding + gap. */
  font-size: 12px;
  padding: 2px 8px;
  gap: 6px;
}
.latest-whales-section .ticker-item .tk-amount { font-size: 12px; }
.latest-whales-section .ticker-item .tk-side   { font-size: 9px;  padding: 1px 5px; }
.latest-whales-section .ticker-item .tk-q      { font-size: 11px; max-width: 220px; }
.latest-whales-section .ticker-item .tk-evt    { font-size: 11px; max-width: 200px; }
.latest-whales-section .ticker-item .tk-odds   { font-size: 10px; }
.latest-whales-section .ticker-item .tk-by     { font-size: 10px; }
.latest-whales-section .ticker-item .tk-user   { font-size: 10px; max-width: 100px; }
/* Build v0.35 20260523.189 (2026-05-23): reverted the build-172
   gradient back to the inherited solid PINK (var(--whale) =
   #f472b6) per user request.  The build-172 aqua-blue gradient was
   added to harmonize with the brightened section background but
   broke the original color identity ("LATEST WHALES = pink chip").
   Now the label uses the default .ticker-label background (solid
   pink) while the section itself keeps its subtle brighter tint.
   Padding + font-size kept slightly compacted from build-172 so
   the chip still reads as the more-recent compact treatment. */
.latest-whales-section .ticker-label.tl-whales {
  padding: 6px 14px;
  font-size: 12px;
}

/* Build .49 SX.BET SETTLEMENTS ticker CSS removed in build .54 —
   ticker section deprecated; big sx.bet settlements now fold into the
   Jackpot ticker via the collector recent_jackpots merge. */

/* Build .49 — SX.BET TRADER LEADERBOARD. Single-section card; one row
   per trader, click row to open wallet modal.
   Build .54 — compact variant (.sxbet-leaderboard-compact): smaller
   padding, 4-column grid (rank · wallet · PnL · ROI), tighter rows so
   the section earns its real estate. */
.sxbet-leaderboard-section {
  margin: 20px 16px;
  padding: 18px 20px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-left: 4px solid #c084fc;
  border-radius: 6px;
}
.sxbet-leaderboard-section.sxbet-leaderboard-compact {
  padding: 10px 14px;
  margin: 14px 16px;
}
.sxlb-heading {
  margin: 0 0 14px 0;
  font-size: 16px;
  color: var(--text);
}
.sxbet-leaderboard-compact .sxlb-heading {
  margin: 0 0 8px 0;
  font-size: 13px;
}
.sxlb-heading .sxlb-name { color: #c084fc; font-weight: 800; }
.sxlb-heading .plat-sub  { color: var(--muted); font-size: 12px; font-weight: 400; }
.sxbet-leaderboard-compact .sxlb-heading .plat-sub { font-size: 10px; }
.sxlb-grid {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.sxbet-leaderboard-compact .sxlb-grid { gap: 2px; }
.sxlb-row {
  display: grid;
  grid-template-columns: 36px 130px 1fr 1fr;
  align-items: center;
  gap: 12px;
  padding: 6px 10px;
  background: var(--panel-2);
  border-radius: 4px;
  text-decoration: none;
  color: var(--text);
  cursor: pointer;
  transition: background 0.12s ease, transform 0.12s ease;
}
.sxbet-leaderboard-compact .sxlb-row {
  padding: 3px 8px;
  grid-template-columns: 28px 110px 1fr 1fr;
  gap: 8px;
}
.sxlb-row:hover { background: rgba(192,132,252,0.10); transform: translateX(2px); }
.sxlb-rank {
  font-family: monospace; font-size: 13px; font-weight: 800;
  color: #c084fc; text-align: center;
}
.sxbet-leaderboard-compact .sxlb-rank { font-size: 11px; }
.sxlb-wallet {
  font-family: monospace; font-size: 12px; color: var(--text);
}
.sxbet-leaderboard-compact .sxlb-wallet { font-size: 11px; }
.sxlb-stat {
  display: flex; flex-direction: column; align-items: flex-end;
  font-family: monospace; font-size: 13px; font-weight: 700;
}
.sxbet-leaderboard-compact .sxlb-stat { font-size: 11px; }
.sxlb-stat-lbl {
  font-size: 9px; font-weight: 400; color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.05em; margin-top: 1px;
}
.sxbet-leaderboard-compact .sxlb-stat-lbl { font-size: 8px; margin-top: 0; }
.sxlb-pnl-pos { color: var(--success); }
.sxlb-pnl-neg { color: var(--danger); }
.sxlb-staked  { color: var(--muted); }
.sxlb-trades  { color: var(--text); }
.sxlb-roi { color: var(--muted); }

@media (max-width: 700px) {
  .sxlb-row { grid-template-columns: 30px 100px 1fr 1fr; }
}

/* ─── Top-20 cross-venue button — bolder/larger so it can't be missed ─── */
.t20-group-pill {
  /* Build .87.4: pill compressed to match the slimmer rows around it. */
  display: inline-flex; align-items: center; gap: 3px;
  font-size: 9px; font-weight: 700; padding: 1px 6px;
  border-radius: 9px; margin-bottom: 1px;
  text-decoration: none; cursor: pointer;
  white-space: nowrap;
}
.t20-group-pill:hover { filter: brightness(1.15); text-decoration: none; }
.t20-group-pill-bold {
  /* Beefier visual treatment so the indicator reads from across the page. */
  font-size: 10px; font-weight: 800; padding: 1px 7px;
  border-width: 2px !important;
  letter-spacing: 0.02em;
  box-shadow: 0 0 0 0 currentColor;
  animation: t20gpPulse 3s ease-in-out infinite;
}
.t20-gp-icon  { font-size: 11px; line-height: 1; }
.t20-gp-label { font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; opacity: 0.9; }
.t20-gp-plats { font-weight: 700; letter-spacing: 0.01em; opacity: 1; }
@keyframes t20gpPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,255,0.0); }
  50%      { box-shadow: 0 0 0 4px rgba(255,255,255,0.10); }
}
.t20-group-pill.evt-group-0 { background: rgba(251,191,36,0.20); color: var(--evt-grp-0); border: 1px solid rgba(251,191,36,0.4); }
.t20-group-pill.evt-group-1 { background: rgba(96,165,250,0.20); color: var(--evt-grp-1); border: 1px solid rgba(96,165,250,0.4); }
.t20-group-pill.evt-group-2 { background: rgba(244,114,182,0.20); color: var(--evt-grp-2); border: 1px solid rgba(244,114,182,0.4); }
.t20-group-pill.evt-group-3 { background: rgba(167,139,250,0.20); color: var(--evt-grp-3); border: 1px solid rgba(167,139,250,0.4); }
.t20-group-pill.evt-group-4 { background: rgba(74,222,128,0.20);  color: var(--evt-grp-4); border: 1px solid rgba(74,222,128,0.4); }
.t20-group-pill.evt-group-5 { background: rgba(251,113,133,0.20); color: var(--evt-grp-5); border: 1px solid rgba(251,113,133,0.4); }

/* ─── Mobile bottom nav (visible on ≤768px only) ──────────────────────── */
.mobile-bottom-nav {
  display: none; /* shown only on mobile */
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 100;
  background: rgba(13,19,40,0.96);
  border-top: 1px solid var(--border);
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
  padding: 6px 0 max(6px, env(safe-area-inset-bottom));
}
.mbn-list {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 0;
  list-style: none; margin: 0; padding: 0;
}
.mbn-item a {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 6px 4px; color: var(--muted); text-decoration: none;
  font-size: 10px; font-weight: 700; letter-spacing: 0.04em;
  text-transform: uppercase;
}
.mbn-item a:hover, .mbn-item a:focus { color: var(--text); text-decoration: none; }
.mbn-icon { font-size: 18px; line-height: 1; }
.mbn-label { display: block; }

@media (max-width: 768px) {
  .mobile-bottom-nav { display: block; }
  /* Reserve room at the bottom of the page so the fixed nav doesn't overlap
     the visitor pill or the footer's last line. */
  body { padding-bottom: 60px; }
  .viewer-pill { bottom: 64px; }                  /* sit above the bottom nav */
}

/* ─── Phone-narrow (≤ 480px) ──────────────────────────────────────────── */
@media (max-width: 480px) {
  h1 { font-size: 16px; }
  .platform { font-size: 13px; }
  .plat-name { font-size: 14px; }
  .plat-sub { font-size: 10px; }
  .t10-name { white-space: normal; }              /* allow wrapping on tiny screens */
  .t10-row a { grid-template-columns: 18px 1fr auto; gap: 5px; }
  .t10-bet { display: none; }                     /* hide top-bet inline label, save space */
  .vw-stats { grid-template-columns: 1fr; }
  .wm-stats { grid-template-columns: repeat(2, 1fr); }
  .visitor-card h3 .plat-sub { display: none; }
}

/* ────────────────────────────────────────────────────────────────
   Build .61 additions
   ──────────────────────────────────────────────────────────────── */

/* Item #6: refresh-frequency note above the 3x2 top-20 grid. Stretches
   across the full section width (grid-column: 1 / -1) so it sits as a
   header band rather than inside one of the platform cards. */
.top20-meta-note {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  margin-bottom: 4px;
  background: rgba(45, 212, 191, 0.06);
  border: 1px solid rgba(45, 212, 191, 0.18);
  border-radius: 6px;
  color: var(--muted);
  font-size: 11px;
  line-height: 1.45;
}
.top20-meta-note .t20-mn-icon {
  flex-shrink: 0;
  color: var(--accent);
  font-size: 13px;
  line-height: 1;
}
@media (max-width: 768px) {
  .top20-meta-note { font-size: 10px; padding: 6px 10px; gap: 6px; }
}

/* Item #9: bet-title prefix on the "Global probability YES" headline
   inside the cross-venue group modal. Subtle muted style so the % stays
   the visual anchor, but the user sees which question is being priced. */
.eg-vwap-evt-title {
  color: var(--muted);
  font-weight: 500;
  font-style: italic;
  margin-right: 2px;
}

/* Item #11: whale icon next to the LATEST WHALES ticker title.
   Inline SVG so we don't add another asset request.

   Build .61 follow-up: sized up from 14→18px and recolored to a light
   sky-blue (#7dd3fc) at full opacity for stronger contrast against the
   yellow/orange ticker background. The icon uses vertical-align: middle
   and stays within the label's natural padding (10px top/bottom +
   13px font), so the LATEST WHALES box dimensions don't change — all
   ticker title boxes stay visually the same size as before. */
.ticker-label.tl-whales .tl-whale-icon {
  display: inline-block;
  width: 18px;
  height: 18px;
  margin-right: 6px;
  vertical-align: middle;
  fill: #7dd3fc;
  opacity: 1;
}
@media (max-width: 768px) {
  .ticker-label.tl-whales .tl-whale-icon { width: 13px; height: 13px; margin-right: 4px; }
}

/* -----------------------------------------------------------------
   Build v.03 .31 build 147 (2026-05-22): "Keep an Eye On:" section
   inside the event modal. Highlights up to 3 sub-markets outside the
   top-10 by volume that have climbed ≥10% in the last 24h. Each row
   gets a 🥇/🥈/🥉 medal; the section title carries a 🪬 Hamsa icon.

   Visual goals:
   - Distinct from the dense .opts-table above (lighter, accent-tinted)
   - Compact — three rows, single line each, no second-table grammar
   - The medal icon is THE visual anchor; everything else is meta info
   - Hamsa icon (🪬) is slightly oversized to act as the section glyph
   - Gold/silver/bronze accents subtly tint the row background
     ---------------------------------------------------------------- */
.kao-section {
  margin: 18px 0 10px;
  padding: 10px 14px 12px;
  background: rgba(250, 204, 21, 0.04);    /* faint gold wash */
  border-left: 3px solid rgba(250, 204, 21, 0.6);
  border-radius: 6px;
}
.kao-title {
  /* Override section-title's muted color — this section is meant
     to draw the eye (literally — hence the Hamsa). */
  color: var(--text, #e2e8f0) !important;
  text-transform: none !important;
  letter-spacing: 0 !important;
  font-size: 13px !important;
  margin: 0 0 8px !important;
  display: flex;
  align-items: center;
  gap: 6px;
}
.kao-icon {
  font-size: 18px;
  line-height: 1;
  display: inline-block;
  vertical-align: middle;
}
.kao-sub {
  font-size: 11px;
  font-weight: 400;
  color: var(--muted, #8b94a8);
  font-style: italic;
  margin-left: 4px;
}
.kao-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.kao-row {
  display: grid;
  /* medal · label · vol · odds · delta */
  grid-template-columns: 28px 1fr auto auto auto;
  align-items: center;
  gap: 12px;
  padding: 6px 8px;
  border-radius: 4px;
  background: rgba(255,255,255,0.02);
  font-size: 13px;
  line-height: 1.3;
  transition: background 120ms ease;
}
.kao-row:hover {
  background: rgba(255,255,255,0.05);
}
/* Per-medal subtle row tinting — keeps the gold/silver/bronze hierarchy
   readable at a glance without overwhelming the modal's existing palette. */
.kao-medal-1 { border-left: 2px solid #facc15; padding-left: 6px; }
.kao-medal-2 { border-left: 2px solid #cbd5e1; padding-left: 6px; }
.kao-medal-3 { border-left: 2px solid #cd7f32; padding-left: 6px; }
.kao-medal {
  font-size: 18px;
  line-height: 1;
  text-align: center;
  /* The emoji renders best with a tiny baseline nudge */
  transform: translateY(-1px);
}
.kao-label {
  font-weight: 500;
  color: var(--text, #e2e8f0);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}
.kao-vol {
  color: var(--muted, #8b94a8);
  font-variant-numeric: tabular-nums;
  font-size: 12px;
}
.kao-odds {
  color: var(--text, #e2e8f0);
  font-variant-numeric: tabular-nums;
  font-size: 12px;
  min-width: 36px;
  text-align: right;
}
.kao-delta {
  font-variant-numeric: tabular-nums;
  font-size: 12px;
  min-width: 50px;
  text-align: right;
}
/* Mobile: drop the volume column to keep the row on a single line */
@media (max-width: 600px) {
  .kao-row {
    grid-template-columns: 24px 1fr auto auto;
    gap: 8px;
    padding: 5px 6px;
  }
  .kao-vol { display: none; }
  .kao-sub { display: none; }
  .kao-icon { font-size: 16px; }
  .kao-medal { font-size: 16px; }
}

/* -----------------------------------------------------------------
   Build v.03 .31 build 149 (2026-05-22): arb-card submarket name.
   Surfaced ONLY for multi-outcome arbs ("Presidential Election Winner
   2028 → Vance") where the per-sub-market matcher (build 149)
   identified the same candidate across venues.  Visually nests under
   the event title — an indented arrow + candidate name in the
   accent color.
   ---------------------------------------------------------------- */
/* Build v.03 .31 build 152: submarket label inlined into event title
   instead of its own row.  Keeps the candidate name visible without
   adding vertical bloat to multi-outcome cards. */
.arb-submarket-inline {
  color: var(--accent, #2dd4bf);
  font-weight: 700;
  white-space: nowrap;
}
.arb-submarket-name {
  color: var(--accent, #2dd4bf);
  /* Build v0.35 20260523.193: bolder betting-option title per user
     request — the candidate name ("Vance", "Spurs") is the *thing
     you'd bet on*, so it deserves more visual weight than the
     surrounding event title. */
  font-weight: 800;
}

/* -----------------------------------------------------------------
   Build v.03 .31 build 151 (2026-05-23): ET& subscriber-tier preview
   — live WS arb-stream indicator.  Sits in the arb-section heading;
   colors:
     - gray (off)       → WS_STREAM_ENABLED=0 on the Space
     - amber (warm)     → connecting / reconnecting
     - green (on)       → connected, ticks flowing
     - red (error)      → fatal client-side error (EventSource unsupported)
   ---------------------------------------------------------------- */
.arb-live-indicator {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-left: 8px;
  padding: 2px 8px;
  border-radius: 10px;
  font-size: 10px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  vertical-align: middle;
  cursor: help;
}
.arb-live-dot {
  display: inline-block;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: currentColor;
}
.arb-live-label { line-height: 1; }
.arb-live-ticks {
  font-weight: 500;
  font-size: 9px;
  opacity: 0.7;
  margin-left: 2px;
  font-variant-numeric: tabular-nums;
}
.arb-live-off {
  color: #64748b;
  background: rgba(100, 116, 139, 0.1);
}
.arb-live-warm {
  color: #f59e0b;
  background: rgba(245, 158, 11, 0.1);
}
.arb-live-on {
  color: #22c55e;
  background: rgba(34, 197, 94, 0.12);
}
.arb-live-error {
  color: var(--danger);
  background: rgba(239, 68, 68, 0.1);
}
.arb-live-pulse {
  animation: arb-live-pulse 0.4s ease-out;
}
@keyframes arb-live-pulse {
  0%   { transform: scale(1);   box-shadow: 0 0 0 0   rgba(34,197,94,0.7); }
  50%  { transform: scale(1.6); box-shadow: 0 0 0 6px rgba(34,197,94,0);   }
  100% { transform: scale(1);   box-shadow: 0 0 0 0   rgba(34,197,94,0);   }
}

/* Build v.03 .31 build 159: wallet hero — "AKA <pseudonym>" pill
   beside the primary name, and a muted treatment for the "Anonymous
   wallet" fallback when no name has been resolved. */
.wallet-aka {
  display: inline-block;
  margin-left: 8px;
  padding: 2px 8px;
  background: rgba(96, 165, 250, 0.12);
  color: #60a5fa;
  border: 1px solid rgba(96, 165, 250, 0.30);
  border-radius: 12px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.02em;
  vertical-align: middle;
}
.wallet-hero-name-anon {
  color: var(--muted, #8a96c4);
  font-style: italic;
  font-weight: 600;
}

/* ═══════════════════════════════════════════════════════════════════
   Federated Event Board — Phase C (build v0.35 20260525.216)
   Active when ENABLE_FEDERATED_BOARD=1.  Replaces hero-4x3 + section-
   top20.  Color ordering: teal (top) → pink (middle) → amber (bottom)
   for vertical hierarchy; gold for the catalyst panel.
   ═════════════════════════════════════════════════════════════════ */

/* ── Section shell ── */
/* .board-section renamed to .board-panels-section in build .222 (panels only now) */
.board-panels-section,
.board-section { margin: 0 0 28px; }

.board-header {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 10px;
  padding: 14px 0 10px;
  border-bottom: 2px solid var(--accent);   /* teal — topmost element */
}
.board-heading {
  font-size: 18px;
  font-weight: 700;
  color: var(--accent);
  margin: 0;
}
.board-heading-sub {
  font-size: 12px;
  color: var(--muted);
}
.board-meta-note {
  font-size: 11px;
  color: var(--muted);
  padding: 6px 0 10px;
}

/* ── Main board table ── */
.board-table {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.board-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 10px;
  background: var(--panel);
  border-radius: 5px;
  min-width: 0;
  transition: background 0.15s;
}
.board-row:hover { background: var(--panel-2); }
.board-row-urgent { border-left: 3px solid var(--danger); }

.board-rank {
  flex: 0 0 22px;
  font-size: 11px;
  color: var(--muted);
  text-align: right;
}
.board-plat-logo {
  flex: 0 0 18px;
  display: flex;
  align-items: center;
}
.board-title-cell {
  flex: 1 1 0;
  min-width: 0;
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.board-chips {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 4px;
}
.board-chip {
  font-size: 10px;
  font-weight: 700;
  padding: 2px 5px;
  border-radius: 3px;
  background: rgba(255,255,255,0.06);
  white-space: nowrap;
  text-decoration: none;
  color: var(--text);
}
/* BoardScore tier colours */
.bsc-chip { min-width: 26px; text-align: center; }
.bsc-high { background: rgba(45,212,191,0.18);  color: var(--accent); }
.bsc-mid  { background: rgba(251,191,36,0.18);  color: var(--jackpot); }
.bsc-low  { color: var(--muted); }
/* Per-chip colour semantics */
.board-chip-vol  { color: var(--success);  background: rgba(74,222,128,0.10); }
.board-chip-liq  { color: var(--accent);   background: rgba(45,212,191,0.10); }
.board-chip-vig  { color: var(--muted); }
.board-chip-ttr-red    { color: var(--danger);  background: rgba(239,68,68,0.15); }
.board-chip-ttr-yellow { color: var(--jackpot); background: rgba(251,191,36,0.12); }
.board-chip-ttr-gray   { color: var(--muted);   background: rgba(138,150,196,0.10); }
.board-chip-news:hover { opacity: 0.8; }
.board-chip-cross { color: var(--accent);  background: rgba(45,212,191,0.12); }
.board-chip-smart { color: var(--whale);   background: rgba(244,114,182,0.12); }
.board-row-empty  { color: var(--muted); font-style: italic; padding: 12px 0; }

/* ── Three reclaim panels ── */
.board-panels {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));  /* Build .287: auto-fit so the 4th (sx.bet Makers) panel lays out cleanly */
  gap: 16px;
  margin-top: 24px;
}
@media (max-width: 900px) {
  .board-panels { grid-template-columns: 1fr; }
}
.board-panel {
  background: var(--panel);
  border-radius: 8px;
  overflow: hidden;
  min-width: 0;
}

/* ════════════════════════════════════════════════════════════════════
   PEACHY-CREAM THEME — opt-in skin (build .276, 2026-05-29)
   --------------------------------------------------------------------
   Activates ONLY when <html data-theme="peach"> is present (set by the
   bootstrap <script> in index.html from ?theme=peach or a persisted
   localStorage choice).  With no attribute the default DARK theme renders
   byte-for-byte unchanged — every rule below is ADDITIVE and scoped to
   :root[data-theme="peach"], so it can never touch the default UI.

   Logo / source-brand colors are RETAINED: --kalshi --sxbet --limitless
   --whale --jackpot --et-gold and every per-venue logo image are NOT
   overridden.  Only neutral surfaces + the ET accent change; semantic
   red/green are darkened just enough to stay legible on cream.

   Pass 1 = the locked palette + the handful of hardcoded dark/white
   literals that would otherwise read wrong on cream (the 3D globes are
   deliberately left dark).  The long tail of decorative dark gradients
   is refined on the live walk-through.  Promoting peach to default later
   = flip one line in the bootstrap script.
   ════════════════════════════════════════════════════════════════════ */
:root[data-theme="peach"] {
  --bg:      #e0e4c8;   /* the locked "between" hue (cream x greenback) */
  --panel:   #fffaf2;   /* warm cream cards */
  --panel-2: #fbf0df;
  --text:    #3b2f25;   /* espresso */
  --muted:   #9c8a76;   /* taupe */
  --accent:  #0d9488;   /* teal-600 — legible as links/accents on cream */
  --border:  #ecdcc5;   /* soft sand */
  --success: #15803d;   /* darkened for cream legibility (meaning kept) */
  --danger:  #b91c1c;
  --mint:    #059669;   /* Build .282: darker mint green, legible on cream */
  /* RETAINED (logos/brand): --kalshi --sxbet --limitless --whale --jackpot --et-gold */
  color-scheme: light;
}

/* White-on-dark text that would vanish on cream → espresso */
:root[data-theme="peach"] h3,
:root[data-theme="peach"] h3 .plat-sub,
:root[data-theme="peach"] .platform,
:root[data-theme="peach"] .plat-sub { color: var(--text); }

/* Hardcoded dark chrome backgrounds → warm cream (globes left dark on purpose) */
:root[data-theme="peach"] header { background: linear-gradient(180deg, #fbf0df, #f1e6d0); }
:root[data-theme="peach"] .featured-whale { background: linear-gradient(90deg, #fdf3ea 0%, #fbf0df 100%); }
:root[data-theme="peach"] .jackpot-card  { background: linear-gradient(90deg, #fdf4e2 0%, #fbf0df 100%); }

/* Dark text on the (now darker) teal accent label → white for contrast */
:root[data-theme="peach"] .wc-latest .fw-label { color: #fff; }

/* Low-alpha WHITE separators/overlays disappear on cream → low-alpha BLACK */
:root[data-theme="peach"] .fw-mi { border-bottom-color: rgba(0,0,0,0.08); }
:root[data-theme="peach"] .fw-aka,
:root[data-theme="peach"] .wm-aka { background: rgba(0,0,0,0.04); border-color: rgba(0,0,0,0.10); }

/* Long-tail (.277): event-modal arb boxes hardcode a dark navy bg (#0b1020)
   that reads as a black slab on cream → warm panel.  Chart/globe tooltips
   (.dv-tooltip/.globe-tooltip/.evt-tooltip) are intentionally LEFT dark —
   like the 3D globes, a dark tooltip floating over cream reads as deliberate. */
:root[data-theme="peach"] .modal-arb-line,
:root[data-theme="peach"] .modal-arb-section-title { background: var(--panel-2); }

/* Build .290: Creamy (peach) fixes for the Marketplace Activity card.
   (1) The .288 dark --chip-halo shadow sat behind the (mostly dark espresso)
   name text and smudged it into an illegible blob — drop the shadow on peach.
   Also force ALL names to var(--text): the theme remapped most venues to
   espresso but missed a few (Betfair amber, Myriad pink) that stayed light
   brand colours at ~1.3:1 contrast on the cream cell; pinning every name to
   the dark text colour makes them uniformly legible (the logos still carry
   venue colour).  Dark mode is untouched — names stay colourful there.
   (2) Manifold's global brightness(3) logo filter brightens its dark-indigo
   logo for DARK backgrounds — on cream it washes to invisible.  Disable it on
   peach so the dark-indigo logo shows against the light cell. */
:root[data-theme="peach"] .mkt-table td.mkt-name .sig-plat { text-shadow: none; color: var(--text); }
:root[data-theme="peach"] img[src*="manifold"] { filter: none; }

/* ── Theme toggle button (lives in header .meta) ─────────────────────────
   Styled entirely with the theme vars, so it renders correctly in BOTH
   themes with no peach-specific rule.  JS: pcToggleTheme() in the <head>
   bootstrap of index.html / wallet.html. */
.theme-toggle {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 10px; border-radius: 20px;
  background: var(--panel-2); border: 1px solid var(--border);
  color: var(--text); font: inherit; font-size: 11px; line-height: 1;
  cursor: pointer; user-select: none; white-space: nowrap;
}
.theme-toggle:hover { border-color: var(--accent); color: var(--accent); }
.theme-toggle .tt-ico { font-size: 13px; line-height: 1; }
/* Palette: pink (middle) → amber (bottom) → gold (catalyst) */
.board-panel--resolving { border-top: 3px solid var(--whale); }
.board-panel--cross     { border-top: 3px solid var(--jackpot); }
.board-panel--catalyst  { border-top: 3px solid var(--et-gold); }

.board-panel-title {
  font-size: 13px;
  font-weight: 700;
  margin: 0;
  padding: 10px 12px 8px;
  display: flex;
  align-items: baseline;
  gap: 6px;
  flex-wrap: wrap;
}
.board-panel--resolving .board-panel-title { color: var(--whale); }
.board-panel--cross     .board-panel-title { color: var(--jackpot); }
.board-panel--catalyst  .board-panel-title { color: var(--et-gold); }

/* ── Build .287: sx.bet live-score + maker-leaderboard surfacing ─────────── */
/* Latest Events ticker 🔴 LIVE badge (sxbet in-play rows only). */
.le-live {
  flex: 0 0 auto;
  font-size: 9px; font-weight: 800; letter-spacing: 0.03em;
  padding: 1px 5px; border-radius: 3px;
  background: var(--live-bg); color: var(--danger);
  white-space: nowrap;
}
.le-live-ft { background: var(--source-tint); color: var(--muted); }
/* Build .320: Kalshi broker-distribution chip (📲 Brokers) — the retail-
   facing subset (available_on_brokers). Amber = "attention/info" per the
   dominant palette; vars only (theme-agnostic), no hard-coded color. */
.le-broker {
  flex: 0 0 auto;
  font-size: 9px; font-weight: 700; letter-spacing: 0.02em;
  padding: 1px 5px; border-radius: 3px;
  background: var(--source-tint); color: var(--jackpot);
  white-space: nowrap;
}
/* Event-modal in-play score banner. */
.ev-live-score {
  display: flex; align-items: center; gap: 10px;
  margin: 8px 0 4px; padding: 6px 12px;
  background: var(--live-bg); border: 1px solid var(--danger); border-radius: 8px;
}
.ev-live-score.ev-live-final { background: var(--source-tint); border-color: var(--border); }
.ev-live-badge { font-size: 12px; font-weight: 800; letter-spacing: 0.05em; color: var(--danger); white-space: nowrap; }
.ev-live-final .ev-live-badge { color: var(--muted); }
.ev-live-nums { font-size: 22px; font-weight: 800; font-family: monospace; color: var(--text); }
.ev-live-dash { margin: 0 4px; color: var(--muted); }
.ev-live-period { font-size: 12px; color: var(--muted); }
/* sx.bet Market-Makers reclaim panel — teal accent (top of the dominant palette). */
.board-panel--makers    { border-top: 3px solid var(--accent); }
.board-panel--makers    .board-panel-title { color: var(--accent); }
.board-panel-maker-addr { font-family: monospace; }

.board-panel-sub {
  font-size: 10px;
  font-weight: 400;
  color: var(--muted);
}
.board-panel-list {
  list-style: none;
  margin: 0;
  padding: 0 0 8px;
}
.board-panel-row {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 5px 12px;
  font-size: 12px;
  min-width: 0;
  transition: background 0.12s;
}
.board-panel-row:hover { background: var(--panel-2); }
.board-panel-logo { flex: 0 0 14px; }
.board-panel-title-cell {
  flex: 1 1 0;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.board-panel-ttr {
  flex: 0 0 auto;
  font-size: 10px;
  font-weight: 700;
  padding: 1px 4px;
  border-radius: 3px;
  white-space: nowrap;
}
.board-panel-ttr-red    { background: rgba(239,68,68,0.15);  color: var(--danger); }
.board-panel-ttr-yellow { background: rgba(251,191,36,0.12); color: var(--jackpot); }
.board-panel-ttr-gray   { background: rgba(138,150,196,0.12); color: var(--muted); }
.board-panel-odds   { flex: 0 0 auto; font-size: 11px; font-weight: 700; color: var(--text); }
.board-panel-badge  { flex: 0 0 auto; font-size: 10px; padding: 1px 4px; background: rgba(45,212,191,0.12);  color: var(--accent);   border-radius: 3px; white-space: nowrap; }
.board-panel-spread { flex: 0 0 auto; font-size: 10px; font-weight: 700; color: var(--jackpot); }
.board-panel-vol    { flex: 0 0 auto; font-size: 10px; color: var(--success); }
.board-panel-news-link { flex: 0 0 auto; text-decoration: none; font-size: 12px; color: var(--accent); }
.board-panel-empty  { color: var(--muted); font-style: italic; padding: 10px 12px; }

/* Build v0.35 20260525.216: arb explainer modal styles.
   Pairs with the "How do these work? →" button in the Cross-Platform
   Arbitrage section heading + the #arb-help-overlay modal. */
.arb-help-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-left: 12px;
  padding: 3px 11px;
  background: transparent;
  border: 1px solid var(--border);
  border-radius: 999px;
  color: var(--muted);
  font-size: 12px;
  font-family: inherit;
  font-weight: 500;
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.arb-help-btn:hover,
.arb-help-btn:focus-visible {
  color: var(--text);
  border-color: var(--accent);
  background: rgba(34, 197, 94, 0.08);
  outline: none;
}

.arb-help-modal {
  max-width: 640px;
}
.arb-help-modal-body { line-height: 1.6; color: var(--text); }
.arb-help-modal-body h3 {
  margin: 0 0 0.5rem 0;
  font-size: 18px;
  color: var(--text);
}
.arb-help-modal-body h4 {
  margin: 1.5rem 0 0.5rem;
  font-size: 14px;
  color: var(--accent);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.arb-help-modal-body .arb-help-lead {
  font-size: 14.5px;
  color: var(--text);
  margin: 0.25rem 0 0.5rem;
}
.arb-help-modal-body ol {
  margin: 0.25rem 0;
  padding-left: 1.5rem;
}
.arb-help-modal-body ol li {
  margin-bottom: 0.75rem;
  font-size: 13.5px;
  color: var(--text);
}
.arb-help-modal-body ol li strong {
  color: var(--text);
  font-weight: 700;
}
.arb-help-modal-body .arb-help-disclaimer {
  margin-top: 1.5rem;
  padding: 0.875rem 1rem;
  background: rgba(245, 158, 11, 0.07);
  border-left: 3px solid #f59e0b;
  border-radius: 4px;
  font-size: 12.5px;
  color: var(--muted);
  line-height: 1.55;
}
.arb-help-modal-body .arb-help-disclaimer strong { color: #fbbf24; }

@media (max-width: 540px) {
  .arb-help-btn { margin-left: 8px; padding: 3px 9px; font-size: 11px; }
  .arb-help-modal-body h3 { font-size: 16px; }
  .arb-help-modal-body .arb-help-lead { font-size: 13.5px; }
  .arb-help-modal-body ol li { font-size: 12.5px; }
}

/* ── Build .255 — Resolved Trade Receipt Card ──────────────────────────── */
.re-card {
  display: flex; flex-direction: column; gap: 18px;
  padding: 20px 24px; max-width: 560px; margin: 0 auto;
}

/* Header: platform row + title */
.re-header { display: flex; flex-direction: column; gap: 8px; }
.re-plat-row {
  display: flex; align-items: center; gap: 6px;
  font-size: 11px; font-weight: 700; letter-spacing: 0.04em;
}
.re-badge {
  font-size: 10px; padding: 2px 7px; border-radius: 10px;
  background: rgba(251,191,36,0.12); border: 1px solid rgba(251,191,36,0.32);
  color: #fbbf24; font-weight: 600; letter-spacing: 0.02em;
}
.re-title {
  font-size: 17px; font-weight: 700; line-height: 1.35;
  color: var(--text);
}
.re-sub { font-size: 12px; color: var(--muted); line-height: 1.4; }

/* Outcome banner */
.re-outcome {
  display: flex; align-items: center; gap: 10px;
  padding: 12px 16px; border-radius: 6px; font-weight: 700;
}
.re-outcome-won {
  background: rgba(74,222,128,0.11);
  border: 1px solid rgba(74,222,128,0.28);
}
.re-outcome-lost {
  background: rgba(239,68,68,0.09);
  border: 1px solid rgba(239,68,68,0.26);
}
.re-outcome-icon { font-size: 20px; line-height: 1; }
.re-outcome-won  .re-outcome-icon { color: var(--success); }
.re-outcome-lost .re-outcome-icon { color: var(--danger); }
.re-outcome-text { font-size: 17px; letter-spacing: 0.06em; }
.re-outcome-won  .re-outcome-text { color: var(--success); }
.re-outcome-lost .re-outcome-text { color: var(--danger); }
.re-outcome-pnl {
  margin-left: auto; font-size: 22px;
  font-weight: 800; font-variant-numeric: tabular-nums;
}
.re-outcome-won  .re-outcome-pnl { color: var(--success); }
.re-outcome-lost .re-outcome-pnl { color: var(--danger); }

/* Detail rows */
.re-details {
  display: flex; flex-direction: column; gap: 8px;
  border-top: 1px solid var(--border); padding-top: 14px;
}
.re-detail-row {
  display: flex; justify-content: space-between; align-items: baseline;
  font-size: 13px; gap: 12px;
}
.re-detail-label { color: var(--muted); flex-shrink: 0; }
.re-detail-value { font-weight: 600; color: var(--text); text-align: right; }
.re-pnl-pos { color: var(--success); }
.re-pnl-neg { color: var(--danger); }
.re-detail-ts { font-variant-numeric: tabular-nums; color: var(--muted); font-weight: 400; }

/* Footer: external link + archive note */
.re-footer {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  border-top: 1px solid var(--border); padding-top: 12px;
}
.re-ext-link {
  color: var(--accent); text-decoration: none; font-weight: 600;
  font-size: 12px; padding: 4px 10px;
  border: 1px solid rgba(45,212,191,0.32); border-radius: 4px;
  transition: background 0.12s;
}
.re-ext-link:hover { background: rgba(45,212,191,0.10); }
.re-footer-note {
  color: var(--muted); font-size: 10px; font-style: italic;
  margin-left: auto;
}

