@font-face{font-family:"Saira SC";src:url(/fonts/saira.woff2);font-weight:600 700;font-display:swap}
@font-face{font-family:"Public Sans";src:url(/fonts/public.woff2);font-weight:400 600;font-display:swap}
@font-face{font-family:"Plex Mono";src:url(/fonts/plex.woff2);font-weight:400 600;font-display:swap}
/* 4663 Intelligence — "THE DESK".
   Near-black + one lime accent is brand DNA off the agent's own mark and is
   deliberately kept. What changed is the accent's ROLE: lime never draws
   structure any more — if it is lime, something is live or something is true.

   HARD CAPS, measured on the rendered DOM (see design/redesign-2026-08/):
     · six type sizes, and no others          · one uppercase label treatment
     · nothing under 12px carries meaning     · no sentence set in monospace
   Mono is for quantity: numbers, tickers, addresses, hashes, caps stamps.

   Variable NAMES are unchanged from the previous system on purpose, so the
   layout engineering below (matched panel heights, flex-basis:0 scroll bodies,
   sparkline bands) keeps working untouched. Only the values moved. */

/* self-hosted so the dashboard never depends on a third party to be legible,
   and so it survives any future CSP tightening */

:root{
  --bg:#0A0B0C;
  --surface:#101314;
  --surface-2:#0D1011;
  --sunk:#080909;
  --line:#1F2528;
  --line-soft:#171B1D;
  --text:#F0F3F0;
  --text-2:#B9C2C0;
  /* ☢️ --muted and --muted-2 are now the SAME value. The audit found 26.5% of
     all characters sitting in the palest grey; collapsing the two tokens lifts
     that whole share to the floor in one move. Secondary is carried by WEIGHT
     from here, never by fading toward the background. */
  --muted:#8A9491;
  --muted-2:#8A9491;
  --lime:#16ead7;
  --lime-dim:#08bbaa;
  --lime-soft:rgba(22,234,215,.10);
  --lime-glow:rgba(22,234,215,.30);
  --amber:#E9A93A;
  --red:#F2604C;
  --radius:10px;
  --shadow:0 14px 40px rgba(0,0,0,.30);
  --mono:"Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
  --sans:"Public Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  --display:"Saira SC","Helvetica Neue",Arial,sans-serif;
  /* THE SCALE. Anything not on this list is a defect. */
  --t-display:46px;
  --t-figure:28px;
  --t-title:19px;
  --t-body:15px;
  --t-meta:13px;
  --t-stamp:12px;
}
:root[data-theme="light"]{
  --bg:#F4F6F3;
  --surface:#FFFFFF;
  --surface-2:#FAFBF9;
  --sunk:#EEF1EC;
  --line:#D5DCD4;
  --line-soft:#E4E9E2;
  --text:#121613;
  --text-2:#3A423C;
  --muted:#5E665F;
  --muted-2:#5E665F;
  --lime:#3F6B00;
  --lime-dim:#4E8207;
  --lime-soft:rgba(63,107,0,.08);
  --lime-glow:rgba(63,107,0,.24);
  --amber:#8A5A05;
  --red:#B3301F;
  --shadow:0 10px 30px rgba(30,40,20,.07);
}

*{box-sizing:border-box;margin:0}
html{background:var(--bg)}
body{
  background:radial-gradient(900px 500px at 78% -10%,var(--lime-soft),transparent 65%),var(--bg);
  color:var(--text);
  font-family:var(--mono);
  font-size:15px;
  letter-spacing:.01em;
  -webkit-font-smoothing:antialiased;
  font-variant-numeric:tabular-nums;
}
button{font:inherit}
.app{display:flex;min-height:100vh}

/* ---------- sidebar ---------- */
.sidebar{
  width:76px;
  position:fixed;inset:0 auto 0 0;
  background:var(--surface);
  border-right:1px solid var(--line);
  display:flex;flex-direction:column;align-items:center;
  z-index:40;
}
.logo-link{display:block;margin:16px 0 20px;line-height:0}
.logo{
  width:40px;height:40px;
  border:1px solid var(--lime-glow);border-radius:50%;
  object-fit:cover;background:#fdfdfd;
  box-shadow:0 0 22px var(--lime-soft);
  transition:box-shadow .25s ease,border-color .25s ease;
}
.logo-link:hover .logo{border-color:var(--lime);box-shadow:0 0 26px var(--lime-glow)}
.nav{width:100%;overflow-y:auto;scrollbar-width:none}
.nav::-webkit-scrollbar{display:none}
.nav a{
  height:54px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  color:var(--muted-2);text-decoration:none;
  border-left:2px solid transparent;
  transition:.18s ease;
}
.nav a:hover{color:var(--text-2)}
.nav a.active{
  color:var(--lime);
  background:linear-gradient(90deg,var(--lime-soft),transparent);
  border-left-color:var(--lime);
}
.nav-icon{font-size:15px;line-height:1}
.nav-label{font:600 12px var(--mono);letter-spacing:.12em}
.sidebar-bottom{margin-top:auto;margin-bottom:14px;width:100%;padding:0 8px;text-align:center}
.vital{margin-bottom:8px}
.vital span{display:block;font:600 12px var(--mono);letter-spacing:.1em;color:var(--muted-2)}
.vital b{display:block;font:600 12px var(--mono);color:var(--text-2);margin-top:2px;white-space:nowrap}
#theme-btn{
  margin-top:6px;width:26px;height:26px;border-radius:50%;
  border:1px solid var(--line);background:none;color:var(--muted);cursor:pointer;
}
#theme-btn:hover{color:var(--lime);border-color:var(--lime-glow)}

/* ---------- main / topbar ---------- */
.main{margin-left:76px;width:calc(100% - 76px);padding:0 24px 28px;max-width:1800px}
.topbar{height:70px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:13px}
.brand{font:700 var(--t-title)/1 var(--display);color:var(--lime);letter-spacing:.02em}
/* The agent's icon lives in the sidebar, and the sidebar is hidden on mobile —
   which left the lime wordmark alone in the top-left corner. On a phone the
   icon IS the brand, so it moves into the topbar there and the wordmark stands
   down. Desktop is untouched: the sidebar logo is still the only one shown. */
.brand-logo{display:none}
.subtitle{color:var(--muted);font:600 12px var(--mono);letter-spacing:.16em}
/* the Solana network mark — drifts beside the wordmark */
.solana-mark{
  width:20px;height:20px;color:var(--lime);line-height:0;
  filter:drop-shadow(0 0 5px var(--lime-glow));
  animation:solana-drift 3.8s ease-in-out infinite;
  transform-origin:50% 80%;
}
.solana-mark svg{width:100%;height:100%}
@keyframes solana-drift{
  0%,100%{transform:translateY(0) rotate(-6deg)}
  50%{transform:translateY(-3px) rotate(7deg)}
}
@media (prefers-reduced-motion: reduce){.solana-mark{animation:none}}
.tagline{color:var(--muted-2);font-family:var(--sans);font-size:13px}
.prices{margin:0 auto;display:flex;gap:12px;align-items:center}
.price-chip{display:flex;align-items:baseline;gap:7px;border:1px solid var(--line);border-radius:5px;padding:6px 12px;background:var(--surface-2)}
.price-chip small{font:700 13px var(--mono);letter-spacing:.1em;color:var(--muted)}
.price-chip b{font:800 19px var(--mono);color:var(--lime)}
button.price-chip{cursor:pointer;color:inherit;font:inherit}
button.price-chip:hover,button.price-chip.on{border-color:var(--lime-glow);background:var(--lime-soft)}
.chain{margin-left:22px;color:var(--muted);font:600 12px var(--mono);letter-spacing:.13em;display:flex;align-items:center}
.live-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--lime);box-shadow:0 0 10px var(--lime-glow);margin:0 7px}
.live-dot.off{background:var(--muted-2);box-shadow:none}
.live-dot.err{background:var(--red);box-shadow:0 0 10px rgba(239,93,75,.5)}
/* the two LIVE controls, lifted out of the SETTINGS panel at the foot of the
   page — the rest of that panel is read-only collector parameters. Below 760px
   the sidebar (and its theme dot) is gone, so this is the only place they exist. */
.topset{margin-left:18px;display:flex;gap:8px;align-items:center}
.set-chip{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:5px;
  padding:6px 10px;background:none;color:var(--muted);cursor:pointer;white-space:nowrap;
  font:700 12px var(--mono);letter-spacing:.11em;
  transition:background .12s ease,border-color .12s ease,color .12s ease}
.set-chip .sc-v{color:var(--text-2);font-weight:800}
.set-chip:hover{border-color:var(--lime-glow);color:var(--lime)}
.set-chip.on{border-color:var(--lime-glow);background:var(--lime-soft);color:var(--lime)}
.set-chip.on .sc-v{color:var(--lime)}

/* ---------- panels ---------- */
.panel{
  background:linear-gradient(180deg,var(--surface),var(--surface-2));
  border:1px solid var(--line);
  border-radius:var(--radius);
  box-shadow:var(--shadow);
  position:relative;
  transition:border-color .45s ease,box-shadow .45s ease;
}
/* the module selected in the sidebar carries a soft lime glow */
.panel.nav-glow{
  border-color:var(--lime-glow);
  box-shadow:0 0 0 1px var(--lime-soft),0 0 26px 2px var(--lime-soft),var(--shadow);
}
.section-title{color:var(--text-2);font:700 12px var(--mono);letter-spacing:.19em}
.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;gap:10px}
.panel-head.sub{margin-top:18px}
.view{color:var(--muted);font:600 12px var(--mono);letter-spacing:.08em}
.small{font:600 12px var(--mono);color:var(--muted)}
.small.lime{color:var(--lime)}
.chip{
  font-size:12px;letter-spacing:1px;color:var(--muted);
  border:1px solid var(--line);border-radius:3px;padding:1px 6px;margin-left:8px;font-weight:400;
}
.chip.exp{color:var(--amber);border-color:rgba(217,166,58,.35)}
.empty{color:var(--muted);font-family:var(--sans);font-size:13px;line-height:1.7;padding:8px 0}
.hole{color:var(--muted-2)}
.pos{color:var(--lime)}
.neg{color:var(--red)}

/* ---------- market regime (the single-glance answer) ---------- */
.regime-wrap{margin-top:16px;padding:18px 20px}
.regime-row{display:flex;align-items:center;gap:24px}
.regime-main{flex:1}
.regime-label{font:700 12px var(--mono);letter-spacing:.19em;color:var(--muted)}
.regime-name{font:700 var(--t-display)/1.02 var(--display);color:var(--text);letter-spacing:-.005em;margin-top:8px;text-wrap:balance}
.regime-text{font-family:var(--sans);font-size:15px;color:var(--text-2);margin-top:7px;max-width:80ch;line-height:1.55}
.regime-score{font:700 var(--t-display)/1 var(--display);font-variant-numeric:tabular-nums;color:var(--lime);text-align:right}
.regime-score small{display:block;font:600 12px var(--mono);letter-spacing:.14em;color:var(--muted-2)}

/* ---------- pulse ---------- */
.pulse{margin-top:16px;padding:16px}
.pulse-head{display:flex;align-items:center;gap:9px;margin-bottom:12px}
.pulse-head:before{content:"";width:3px;height:11px;background:var(--lime);border-radius:3px;box-shadow:0 0 10px var(--lime-glow)}
.metrics{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
.metric{
  min-height:118px;border:1px solid var(--line);background:var(--surface-2);
  border-radius:6px;padding:12px 12px 40px;position:relative;overflow:hidden;
  transition:border-color .2s,transform .2s;
}
.metric:hover{border-color:var(--muted-2);transform:translateY(-1px)}
.metric-label{color:var(--muted);font:600 12px var(--mono);letter-spacing:.13em}
.metric-value{font:600 var(--t-figure)/1.15 var(--mono);margin-top:11px}
.metric-value.risk-HIGH{color:var(--red)}
.metric-value.risk-ELEVATED{color:var(--amber)}
.metric-sub{font:600 12px var(--mono);color:var(--muted);margin-top:6px}
.metric-sub.up{color:var(--lime-dim)}
.metric-sub.down{color:var(--red)}
/* full-width sparkline band across the card's lower edge (CMC-style) */
.spark{position:absolute;left:1px;right:1px;bottom:0;width:auto;height:34px;opacity:.8}
.spark svg{width:100%;height:100%;display:block}
.spark path{fill:none;stroke:var(--lime);stroke-width:1.4;vector-effect:non-scaling-stroke}
.spark path.fillp{fill:var(--lime-soft);stroke:none}
/* pre-curve state: dotted track + pulsing head + sample count — recording, not faking */
.spark.warming{opacity:.8}
.w-track{position:absolute;left:0;right:14px;bottom:6px;height:0;border-bottom:1px dotted var(--muted-2)}
.w-dot{position:absolute;right:8px;bottom:4px;width:5px;height:5px;border-radius:50%;background:var(--lime);animation:w-pulse 1.6s ease-in-out infinite}
.w-n{position:absolute;right:0;top:0;font:600 12px var(--mono);letter-spacing:.08em;color:var(--muted-2)}
@keyframes w-pulse{0%,100%{opacity:.35;box-shadow:none}50%{opacity:1;box-shadow:0 0 8px var(--lime-glow)}}
/* risk shield — mirrors the mock's glowing badge, colored by level */
.shield{
  position:absolute;right:12px;bottom:10px;width:34px;height:34px;border-radius:50%;
  display:grid;place-items:center;border:1px solid var(--line);
}
.shield svg{width:20px;height:20px}
.shield.lvl-NORMAL{color:var(--lime);border-color:var(--lime-glow);box-shadow:0 0 16px var(--lime-soft)}
.shield.lvl-ELEVATED{color:var(--amber);border-color:rgba(217,166,58,.45);box-shadow:0 0 16px rgba(217,166,58,.15)}
.shield.lvl-HIGH{color:var(--red);border-color:rgba(239,93,75,.5);box-shadow:0 0 16px rgba(239,93,75,.18)}

/* ---------- mind ---------- */
.mind-wrap{margin-top:12px;padding:16px}
.thesis{padding:10px 0;border-bottom:1px solid var(--line-soft)}
.thesis:last-child{border-bottom:none}
.t-head{display:flex;align-items:baseline;gap:12px}
.t-n{color:var(--muted-2);font-size:13px}
.t-title{letter-spacing:1.5px;font:600 var(--t-title)/1.2 var(--display);color:var(--text);flex:1;font-weight:700}
.t-strength{color:var(--lime);font-size:var(--t-title);font-weight:700}
.bar{height:4px;background:var(--line-soft);border-radius:4px;overflow:hidden}
.bar i{display:block;height:100%;background:var(--lime);box-shadow:0 0 10px var(--lime-glow)}
.bar.wide{margin:6px 0}
.t-text{font-family:var(--sans);font-size:15px;color:var(--muted);max-width:75ch;line-height:1.55}

/* ---------- grid-top: signals / agent / narratives ---------- */
.grid-top{display:grid;grid-template-columns:1.55fr 1fr;gap:12px;margin-top:12px}
.signals,.agent{min-height:220px;padding:16px}
/* the signals list scrolls internally so every active signal is reachable
   without the panel growing unbounded next to the AGENT box */
#signals{max-height:min(600px,66vh);overflow-y:auto;overflow-x:hidden;padding-right:4px;scrollbar-width:thin;scrollbar-color:var(--line) transparent}
#signals::-webkit-scrollbar{width:8px}
#signals::-webkit-scrollbar-track{background:transparent}
#signals::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}
#signals::-webkit-scrollbar-thumb:hover{background:var(--muted-2)}
.tokens{margin-top:12px}
.signal-empty{min-height:150px;display:flex;align-items:center;position:relative}
.radar{
  position:relative;flex:0 0 132px;height:132px;border-radius:50%;opacity:.62;margin-right:16px;
  background:
    repeating-radial-gradient(circle,transparent 0 15px,var(--lime-soft) 16px 17px),
    linear-gradient(90deg,transparent 49.6%,var(--lime-soft) 50%,transparent 50.4%),
    linear-gradient(transparent 49.6%,var(--lime-soft) 50%,transparent 50.4%);
}
.radar:after{
  content:"";position:absolute;width:7px;height:7px;border-radius:50%;
  background:var(--lime);left:calc(50% - 3px);top:calc(50% - 3px);
  box-shadow:0 0 22px 6px var(--lime-glow);
}
.empty-copy{max-width:280px;font-family:var(--sans);font-size:13px;line-height:1.7;color:var(--muted)}
.empty-copy strong{color:var(--text-2);font-weight:600}
.progress-row{display:flex;justify-content:space-between;color:var(--muted);font:600 12px var(--mono);letter-spacing:.08em}
.progress-row strong{color:var(--lime)}
.progress .bar{margin-top:7px}

.signal{
  border:1px solid var(--line);background:var(--surface-2);border-radius:6px;
  padding:12px 14px;margin-bottom:10px;cursor:pointer;
}
.signal .head{display:flex;align-items:baseline;gap:12px}
.signal .sym{font:600 var(--t-title)/1.2 var(--display);font-weight:700;color:var(--text)}
.signal .kind{font-size:12px;letter-spacing:1.5px;color:var(--lime);border:1px solid var(--lime-glow);padding:1px 6px;border-radius:3px}
.signal .conv{margin-left:auto;font:600 var(--t-figure)/1 var(--mono);color:var(--lime)}
.signal .conv small{color:var(--muted-2);font-size:13px}
.signal .thesis-line{font-family:var(--sans);color:var(--muted);font-size:15px;margin-top:8px;line-height:1.55}
.signal .age{font-family:var(--sans);font-size:var(--t-meta);color:var(--muted-2);margin-top:6px}
.signal .detail{display:none;margin-top:10px;border-top:1px solid var(--line-soft);padding-top:10px}
.signal.open .detail{display:block}
.d-h{font:700 12px var(--mono);letter-spacing:.15em;color:var(--muted);margin:10px 0 5px}
.comp-row,.ev-row{display:flex;justify-content:space-between;font-size:13px;color:var(--muted);padding:2px 0;gap:12px}
.comp-row b{color:var(--text-2);font-weight:400}
.ev-row.inval span{color:var(--amber)}
.comp-row.comp-sum{border-top:1px solid var(--line);margin-top:6px;padding-top:6px}
.comp-row.comp-sum b{color:var(--lime);font-weight:700}
.tier{font-size:12px;letter-spacing:1.2px;color:var(--muted-2);border:1px solid var(--line);padding:1px 6px;border-radius:3px}
.tier.compound{color:var(--amber);border-color:rgba(217,166,58,.4)}
.t-scope{font:400 var(--t-meta) var(--sans);letter-spacing:.05em;color:var(--muted-2);margin-top:5px}
.track-record{display:flex;gap:22px;margin-bottom:12px;font:500 13px var(--mono);color:var(--muted)}
.track-record b{color:var(--lime);font-weight:700}
.dims{display:flex;flex-wrap:wrap;gap:4px 12px;margin-top:7px}
.dim{display:flex;gap:6px;align-items:baseline}
.dk{font:600 12px var(--mono);letter-spacing:.08em;color:var(--muted-2);text-transform:uppercase}
.dv{font:700 12px var(--mono);letter-spacing:.06em}
.dv.neg{color:var(--red)}.dv.warn{color:var(--amber)}.dv.pos{color:var(--lime-dim)}.dv.hole{color:var(--muted-2)}

/* ---------- agent ---------- */
.agent-top{display:flex;gap:11px;align-items:center}
.agent-top img{width:42px;height:42px;border-radius:50%;border:1px solid var(--line);background:#fdfdfd}
.status{color:var(--lime);font:700 12px var(--mono);letter-spacing:.08em}
.status-sub{font:500 12px var(--mono);color:var(--muted);margin-top:3px}
.mode-label{font:600 12px var(--mono);letter-spacing:.15em;color:var(--muted-2);margin-top:4px}
.stages{margin-top:12px;border-top:1px solid var(--line-soft);padding-top:8px}
.stage{display:flex;justify-content:space-between;align-items:baseline;padding:2px 0;font:600 12px var(--mono);letter-spacing:.12em;color:var(--muted-2)}
.stage.on{color:var(--lime)}
.stage small{font:500 12px var(--sans);letter-spacing:.02em;color:var(--muted-2)}
.baseline-row{display:flex;align-items:center;gap:8px;margin-top:10px;font:600 12px var(--mono);letter-spacing:.1em;color:var(--muted)}
.baseline-row .bar{flex:1}
.baseline-row b{color:var(--text-2);font-weight:400;font-size:13px}
.obs{margin-top:12px;display:grid;grid-template-columns:1fr auto;gap:6px;color:var(--muted);font:500 12px var(--mono)}
.obs b{color:var(--text-2);font-weight:500;text-align:right}
.track-btn{
  width:100%;margin-top:14px;
  border:1px solid var(--lime-glow);color:var(--lime);
  padding:8px;text-align:center;background:var(--lime-soft);
  border-radius:4px;cursor:pointer;transition:.18s;
  font:700 12px var(--mono);letter-spacing:.1em;
}
.track-btn:hover{border-color:var(--lime)}
.track-btn:not(.on){background:none;border-color:var(--line);color:var(--muted)}
.track-btn:not(.on):hover{color:var(--lime);border-color:var(--lime-glow)}

/* ---------- narratives ---------- */
.narrative{border-bottom:1px solid var(--line-soft);padding:9px 0;display:grid;grid-template-columns:26px 1fr auto;gap:10px;align-items:center}
.narrative:last-child{border-bottom:0}
.n-ava{
  width:26px;height:26px;border-radius:50%;
  border:1px solid var(--line);display:grid;place-items:center;
  color:var(--lime);font:700 13px var(--mono);background:var(--surface-2);
}
.narrative-name{font:700 13px var(--mono);text-transform:lowercase}
.narrative-meta{font:500 12px var(--mono);color:var(--muted-2);margin-top:3px}
.nscore{font:600 var(--t-figure)/1 var(--mono);color:var(--lime);text-align:right}
.nscore small{display:block;font:600 12px var(--mono);color:var(--muted-2)}

/* ---------- live activity ---------- */
.live{margin-top:12px;padding:14px 16px}
.streaming{color:var(--muted-2);font:600 12px var(--mono);margin-left:8px;letter-spacing:.08em}
.activity{display:grid;grid-template-columns:repeat(6,1fr);border:1px solid var(--line);border-radius:5px;overflow:hidden}
.event{padding:11px;min-height:76px;border-right:1px solid var(--line);background:var(--surface-2);transition:background .18s}
.event:hover{background:var(--surface)}
.event:nth-child(6n){border-right:0}
.event-time{color:var(--muted-2);font:500 12px var(--mono)}
.event-title{font:700 12px var(--mono);margin-top:7px;letter-spacing:.05em}
.event-title.pool{color:var(--lime)}
.event-title.whale{color:var(--text)}
.event-title.spike{color:var(--lime-dim)}
.event-title.lp{color:var(--amber)}
.event-value{color:var(--muted);font:600 12px var(--mono);margin-top:5px;line-height:1.55;overflow:hidden;text-overflow:ellipsis}
.event.fresh{animation:flash 1.2s ease-out}
@keyframes flash{from{background:var(--lime-soft)}to{background:var(--surface-2)}}

/* ---------- lower: wallets / tokens ---------- */
/* three modules: the roster (widest — a 7-column table), where they converge,
   then the raw order feed */
.lower{display:grid;grid-template-columns:1fr 1.38fr;gap:12px;margin-top:12px;align-items:stretch}
/* NEW TOKENS keeps the wide column (7-col table); NARRATIVES rides the narrow one */
.tokens-row{display:grid;grid-template-columns:1.9fr 1fr;gap:12px;margin-top:12px}
.card{padding:16px;min-height:285px}

/* SMART MONEY BUYS — the live buy feed of the wallets on the left. The panel is
   a flex column so the feed fills the module height (grid matches the SMART
   MONEY column) instead of being capped short; it scrolls only when it overflows. */
/* both lower cards share a fixed height so they stay flush; each body flexes to
   fill it and scrolls, leaving empty space (not a shrunk card) when sparse. */
#wallets-sec,#confluence-sec,#smartbuys-sec,#bubbles-sec{height:520px}
#wallets-sec,#confluence-sec,#smartbuys-sec,#bubbles-sec{display:flex;flex-direction:column;min-height:0}
#whales{flex:1 1 0;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:var(--line) transparent}
#whales::-webkit-scrollbar{width:7px}
#whales::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}
/* flex-basis:0 so the feed's own length never inflates the card — it fills the
   height the grid gives it (matched to SMART MONEY on the left) and scrolls;
   sparse data just leaves empty space below, keeping the two cards flush. */
#smart-buys{flex:1 1 0;min-height:0;overflow-y:auto;overflow-x:hidden;margin-top:4px;scrollbar-width:thin;scrollbar-color:var(--line) transparent}

/* ── SMART MONEY: cluster tag + win-rate denominator ─────────────────────── */
.amber{color:var(--amber)}
.cl-badge{display:inline-block;margin-left:6px;padding:0 4px;border:1px solid var(--amber);border-radius:3px;
  color:var(--amber);font:600 12px var(--mono);vertical-align:middle;cursor:help;letter-spacing:.02em}
.win-n{color:var(--muted-2);font:600 12px var(--mono)}

/* ── WHERE SMART MONEY IS — its own module now, so the rows go two-line: the
   token and its contract on top, the read underneath (size, how fast, and
   whether there is anything to sell back into). ──────────────────────────── */
#confluence{flex:1 1 0;min-height:0;overflow-y:auto;overflow-x:hidden;margin-top:4px;
  scrollbar-width:thin;scrollbar-color:var(--line) transparent}
#confluence::-webkit-scrollbar{width:7px}
#confluence::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}
.conf-row{display:flex;align-items:flex-start;gap:9px;padding:8px 3px;
  border-bottom:1px solid var(--line-soft);font:600 13px var(--mono)}
.conf-row:last-child{border-bottom:0}
.conf-n{flex:0 0 auto;min-width:23px;text-align:center;padding:1px 4px;border-radius:3px;
  background:var(--lime);color:var(--bg);font:700 13px var(--mono);cursor:help}
.conf-body{flex:1 1 auto;min-width:0}
.conf-l1{display:flex;align-items:center;gap:7px;min-width:0}
.conf-tok{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.conf-l2{display:flex;align-items:center;gap:7px;margin-top:4px;
  color:var(--muted-2);font:600 12px var(--mono)}
.conf-eth{color:var(--lime)}
.conf-liq{color:var(--muted)}
.conf-sep{color:var(--line)}

/* ── WHAT SMART MONEY IS TRADING — packed bubbles ────────────────────────────
   Area carries magnitude, a three-step diverging scale carries direction, and
   the neutral middle is deliberately grey: a token the roster is trading both
   ways is not a third category, it is the zero point. Text keeps text colours —
   the mark beside it carries the direction, never the label. */
#bubbles{flex:1 1 0;min-height:0;overflow:hidden;margin-top:2px}
.bubble-svg{width:100%;height:100%;display:block;overflow:visible}
.bub circle{stroke-width:1.5px;transition:stroke-width .12s ease,filter .12s ease}
.bub text{text-anchor:middle;dominant-baseline:middle;pointer-events:none;font-family:var(--mono);font-weight:700}
.b-sym{fill:var(--text)}
.b-val{fill:var(--muted-2);font-weight:600}
.b-buy circle{fill:rgba(22,234,215,.15);stroke:var(--lime)}
.b-flat circle{fill:rgba(129,141,147,.13);stroke:var(--muted)}
.b-sell circle{fill:rgba(239,93,75,.15);stroke:var(--red)}
a.bub{cursor:pointer}
a.bub:hover circle{stroke-width:2.5px;filter:brightness(1.35)}
.bubble-legend{flex:0 0 auto;display:flex;align-items:center;gap:14px;padding-top:9px;margin-top:2px;
  border-top:1px solid var(--line-soft);color:var(--muted-2);font:600 12px var(--mono);letter-spacing:.05em}
.bubble-legend span{display:flex;align-items:center;gap:5px}
.lg-dot{width:8px;height:8px;border-radius:50%;border:1.5px solid;display:inline-block}
.lg-buy{border-color:var(--lime);background:rgba(22,234,215,.15)}
.lg-flat{border-color:var(--muted);background:rgba(129,141,147,.13)}
.lg-sell{border-color:var(--red);background:rgba(239,93,75,.15)}
.lg-note{margin-left:auto;color:var(--muted-2);opacity:.75;text-transform:none;letter-spacing:.02em}
#smart-buys::-webkit-scrollbar{width:7px}
#smart-buys::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}
.score-pill{display:inline-block;min-width:34px;padding:1px 6px;border-radius:3px;font:600 13px var(--mono);color:var(--bg);background:linear-gradient(90deg,var(--lime) var(--s,0%),var(--line) var(--s,0%));text-shadow:0 0 2px rgba(0,0,0,.35)}
.buy-row{display:flex;align-items:center;gap:11px;padding:7px 3px;border-bottom:1px solid var(--line-soft);font:600 13px var(--mono)}
.buy-row:last-child{border-bottom:0}
.buy-time{color:var(--muted-2);font-size:12px;flex:none}
.buy-wallet{flex:none}
.buy-wallet a{color:var(--text-2);border:none}
.buy-tok{flex:none;max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.buy-tok a,.buy-tok{color:var(--lime);font-weight:700;border:none}
.ca-copy{cursor:pointer;white-space:nowrap;color:var(--muted);display:inline-block;
  font:600 12px var(--mono);letter-spacing:.02em;border:1px solid var(--line);
  border-radius:3px;padding:1px 6px}
.ca-copy:hover{color:var(--lime);border-color:var(--lime-glow)}
td.sym .ca-copy{margin-left:6px}  /* space it off the name in the NEW TOKENS table */
.buy-right{flex:none;margin-left:auto;display:flex;align-items:center;gap:9px}
.buy-n{color:var(--muted-2);font:600 12px var(--mono);white-space:nowrap}
.buy-eth{color:var(--lime);text-align:right;min-width:74px}
.chart{
  height:110px;margin-top:12px;position:relative;overflow:hidden;
  border-top:1px solid var(--line-soft);
  background:
    linear-gradient(rgba(127,127,127,.05) 1px,transparent 1px),
    linear-gradient(90deg,rgba(127,127,127,.04) 1px,transparent 1px);
  background-size:100% 36px,72px 100%;
}
.chart svg{width:100%;height:100%}
.chart path.line{fill:none;stroke:var(--lime);stroke-width:1.7}
.chart path.fillp{fill:var(--lime-soft);stroke:none}
.chart-label{position:absolute;top:4px;left:6px;font:600 12px var(--mono);letter-spacing:.1em;color:var(--muted-2)}

table{width:100%;border-collapse:collapse}
th{text-align:left;color:var(--muted-2);font:600 12px var(--mono);letter-spacing:.1em;padding:7px 4px;border-bottom:1px solid var(--line)}
th.num{text-align:right}
td{padding:6px 4px;border-bottom:1px solid var(--line-soft);color:var(--text-2);font:500 13px var(--mono)}
td.num{text-align:right}
td.sym{color:var(--text);font-weight:650}
td.idx{color:var(--muted-2)}
tr.tok{cursor:pointer}
tr:hover td{background:rgba(127,127,127,.03)}
tr.score-detail td{background:var(--surface-2);font-size:13px;color:var(--muted)}
.score{
  display:inline-block;border:1px solid rgba(22,234,215,.35);color:var(--lime);
  padding:2px 6px;min-width:29px;text-align:center;border-radius:3px;font-weight:700;
}
.score.low{color:var(--amber);border-color:rgba(217,166,58,.4)}
.score.bad{color:var(--red);border-color:rgba(239,93,75,.4)}
.tfoot{text-align:right;margin-top:12px;color:var(--muted);font:600 12px var(--mono);letter-spacing:.08em}

/* ---------- pools ---------- */
.pools-wrap{margin-top:12px;padding:16px}

/* ---------- risk ---------- */
.risk{margin-top:12px;padding:16px}
.risk-body{display:grid;grid-template-columns:220px 1fr;gap:16px;align-items:start}
.radar-vis{
  position:relative;width:200px;height:200px;border-radius:50%;opacity:.8;margin:6px auto;
  background:
    repeating-radial-gradient(circle,transparent 0 22px,var(--lime-soft) 23px 24px),
    linear-gradient(90deg,transparent 49.7%,var(--lime-soft) 50%,transparent 50.3%),
    linear-gradient(transparent 49.7%,var(--lime-soft) 50%,transparent 50.3%);
}
.radar-vis:after{
  content:"";position:absolute;width:8px;height:8px;border-radius:50%;
  background:var(--lime);left:calc(50% - 4px);top:calc(50% - 4px);
  box-shadow:0 0 22px 6px var(--lime-glow);
}
.r-dot{position:absolute;width:6px;height:6px;border-radius:50%}
.r-dot.high{background:var(--red);box-shadow:0 0 10px rgba(239,93,75,.6)}
.r-dot.elevated{background:var(--amber);box-shadow:0 0 10px rgba(217,166,58,.5)}
.risk-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:7px}
.risk-item{border:1px solid var(--line);padding:10px;background:var(--surface-2);border-radius:5px;border-left:3px solid var(--amber)}
.risk-item.high{border-left-color:var(--red)}
.rname{font:650 12px var(--mono);color:var(--text)}
.rlvl{font:700 12px var(--mono);letter-spacing:.1em;margin-left:8px}
.risk-item.high .rlvl{color:var(--red)}
.risk-item:not(.high) .rlvl{color:var(--amber)}
.reason{font-family:var(--sans);font-size:13px;color:var(--muted);margin-top:5px;line-height:1.5}
.legend{margin-top:12px;display:flex;gap:16px;font:600 12px var(--mono);letter-spacing:.1em}
.legend .high{color:var(--red)}.legend .elevated{color:var(--amber)}.legend .normal{color:var(--lime)}

/* ---------- reports / settings ---------- */
.reports,.settings,.earn{margin-top:12px;padding:16px}
.set-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--line-soft);font:500 13px var(--mono);color:var(--muted)}
.set-row b{color:var(--text-2);font-weight:500}

/* ---------- external links ---------- */
a.xl{color:inherit;text-decoration:none;border-bottom:1px dotted var(--muted-2);cursor:pointer}
a.xl:hover{color:var(--lime);border-bottom-color:var(--lime)}
a.event{display:block;color:inherit;text-decoration:none;cursor:pointer}

/* ---------- footer ---------- */
.footer{margin-top:11px;padding:8px 1px;color:var(--muted-2);font:500 12px var(--mono);letter-spacing:.04em;display:flex;justify-content:space-between;gap:20px}

/* ---------- presence ---------- */
#presence{
  position:absolute;top:0;left:0;z-index:60;pointer-events:none;
  /* row-reverse: the note bubble grows INWARD (leftward) from the icon, so an
     icon parked on a panel's right edge can't push the text off-screen */
  display:flex;flex-direction:row-reverse;align-items:center;gap:8px;
  transition:transform 1.1s cubic-bezier(.25,.9,.3,1),opacity .5s ease;
  opacity:1;
}
#presence img{
  width:44px;height:44px;border-radius:50%;
  border:2px solid var(--lime);
  box-shadow:0 0 14px var(--lime-glow),0 2px 10px rgba(0,0,0,.5);
  background:#fdfdfd;
}
#presence .p-note{
  font-size:13px;color:var(--lime);background:var(--surface);
  border:1px solid var(--lime-glow);border-radius:3px;padding:3px 8px;
  max-width:260px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
#presence.idle{opacity:0}
#presence.dissolving{opacity:0;filter:blur(4px);transition:opacity 1.4s ease,filter 1.4s ease,transform 1.1s cubic-bezier(.25,.9,.3,1)}
section.focused{border-color:var(--lime-glow)}

/* ---------- ways to earn ---------- */
/* Verdict colour follows the risk legend already in use: lime = open, amber =
   gated or paid, red = not real. The verdict itself is computed in earn.mjs —
   nothing here decides anything, it only shows what was decided. */
.earn-tally{display:flex;flex-wrap:wrap;gap:7px;align-items:center;padding-bottom:12px;border-bottom:1px solid var(--line);margin-bottom:4px}
.earn-checked{margin-left:auto;font:600 12px var(--mono);letter-spacing:.11em;color:var(--muted-2)}
.ev{display:inline-block;font:700 12px var(--mono);letter-spacing:.11em;padding:3px 8px;border-radius:3px;border:1px solid;white-space:nowrap}
.ev-live{color:var(--lime);border-color:var(--lime-glow);background:var(--lime-soft)}
.ev-cond{color:var(--amber);border-color:rgba(217,166,58,.34);background:rgba(217,166,58,.08)}
.ev-paid{color:var(--amber);border-color:rgba(217,166,58,.22)}
.ev-unc{color:var(--muted);border-color:var(--line)}
.ev-spec{color:var(--red);border-color:rgba(239,93,75,.34);background:rgba(239,93,75,.07)}
.ev-end{color:var(--muted-2);border-color:var(--line-soft);text-decoration:line-through}
.ev-flag{color:var(--red);border-color:var(--red);background:rgba(239,93,75,.14)}

.earn-row{padding:14px 0;border-bottom:1px solid var(--line-soft);display:flex;flex-direction:column;gap:7px}
.earn-row:last-child{border-bottom:0}
.earn-top{display:flex;align-items:center;gap:11px;flex-wrap:wrap}
.earn-name{font:700 15px var(--mono);color:var(--text)}
.earn-kind{font:600 12px var(--mono);letter-spacing:.12em;color:var(--muted-2)}
.earn-top .ev{margin-left:auto}
.earn-what{font-family:var(--sans);font-size:15px;line-height:1.6;color:var(--text-2);max-width:88ch}
.earn-why{font-family:var(--sans);font-size:13px;line-height:1.6;color:var(--muted)}

/* ☢️ An eligibility gate is the difference between a real opportunity and a
   wasted afternoon — it renders as a flag, never as a footnote. */
.earn-excl{display:flex;gap:9px;align-items:baseline;flex-wrap:wrap;font:600 12px var(--mono);letter-spacing:.08em;color:var(--red)}
.earn-excl b{color:var(--red);font-weight:700}
.earn-gate{font:600 12px var(--mono);letter-spacing:.08em;color:var(--amber)}
.earn-foot{display:flex;flex-wrap:wrap;gap:5px 16px;font:500 12px var(--mono);letter-spacing:.07em;color:var(--muted-2);align-items:baseline}
.earn-foot b{color:var(--text-2);font-weight:600}

.earn-rail{margin-top:16px;padding:9px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line-soft);
  font:700 12px var(--mono);letter-spacing:.15em;color:var(--muted)}
.earn-rail.warn{color:var(--red)}
.earn-note{font-family:var(--sans);font-size:15px;line-height:1.6;color:var(--muted);padding:10px 0;border-bottom:1px solid var(--line-soft)}
/* the "where do I mint?" answer — sits under the rail, above the rows */
.earn-hint{font-family:var(--sans);font-size:13px;line-height:1.6;color:var(--muted);padding:10px 0 2px;max-width:88ch}

@media(max-width:760px){
  .earn-top .ev{margin-left:0}
}

/* ---------- responsive ---------- */
@media(max-width:1150px){
  .grid-top{grid-template-columns:1fr 1fr}
  .lower{grid-template-columns:1fr}
  .tokens-row{grid-template-columns:1fr}
  .activity{grid-template-columns:repeat(3,1fr)}
  .event:nth-child(6n){border-right:1px solid var(--line)}
  .event:nth-child(3n){border-right:0}
  .risk-body{grid-template-columns:1fr}
}
@media(max-width:760px){
  .sidebar{display:none}
  .brand{display:none}
  .brand-logo{display:block;flex:none;line-height:0}
  .brand-logo img{
    width:34px;height:34px;
    border:1px solid var(--lime-glow);border-radius:50%;
    object-fit:cover;background:#fdfdfd;
    box-shadow:0 0 18px var(--lime-soft);
  }
  .topset{margin-left:10px;gap:6px}
  .set-chip{padding:5px 8px;gap:5px;font-size:12px}
  .topbar{height:auto;min-height:70px;flex-wrap:wrap;row-gap:8px;padding:8px 0}
  .prices{margin:0;order:5}
  .main{margin-left:0;width:100%;padding:0 10px 20px}
  .tagline{display:none}
  .metrics{grid-template-columns:1fr 1fr}
  .grid-top{grid-template-columns:1fr}
  .activity{grid-template-columns:1fr 1fr}
  .event:nth-child(3n){border-right:1px solid var(--line)}
  .event:nth-child(2n){border-right:0}
  .risk-grid{grid-template-columns:1fr}
  .footer{flex-direction:column}
}

/* ---------- snapshot share buttons ---------- */
.snap-btn{
  font:700 12px var(--mono);letter-spacing:.1em;color:var(--muted);
  border:1px solid var(--line);border-radius:3px;padding:2px 7px;
  text-decoration:none;margin-right:10px;
}
.snap-btn:hover{color:var(--lime);border-color:var(--lime-glow)}
.regime-snap{position:absolute;right:16px;bottom:12px}

/* ---------- staleness tripwire ---------- */
body.is-stale .topbar{box-shadow:inset 0 -2px 0 var(--red)}
body.is-stale #live-label{color:var(--red);font-weight:700}

/* ---------- NEW POOL water line: liquidity rising ---------- */
.pool-event{position:relative;overflow:hidden}
.waterfill{
  position:absolute;left:0;right:0;bottom:0;height:0;z-index:0;pointer-events:none;
  background:linear-gradient(to top,var(--lime-glow),var(--lime-soft));
  border-top:1.5px solid var(--lime-dim);
  transition:height 1.4s cubic-bezier(.22,.61,.36,1);
}
/* baseline reference: a typical new-pool level — water above it = gaining more
   than usual (bottom:42% must match FILL_BASELINE_POS in collector.mjs) */
.baseline{position:absolute;left:0;right:0;bottom:42%;height:0;z-index:1;pointer-events:none;
  border-top:1px dashed var(--muted-2);opacity:.5}
/* keep the card text above the water and baseline */
.pool-event>.event-time,.pool-event>.event-title,.pool-event>.event-value{position:relative;z-index:2}

/* ══════════════════════════════════════════════════════════════════════════
   THE DESK — additions. Everything above this line is the previous system's
   LAYOUT, which is kept on purpose; everything below is the new voice.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── ONE label treatment. The audit found 248 uppercase label nodes rendered
      at 47 different settings; this collapses them. Colour is left alone so
      the .pool/.whale/.lp/.exp variants keep their meaning. ─────────────── */
.section-title,.view,.small,.regime-label,.metric-label,.d-h,.dk,.dv,
.stage,.mode-label,.streaming,.event-time,.event-title,.status,.status-sub,
.narrative-meta,.win-n,.tier,.chip,.t-n,.progress-row,.baseline-row,
.metric-sub,.conf-l2,.earn-kind,.snap-btn,.set-chip,.sc-k,.sc-v,.vital span,
.vital b,.subtitle,.chain,.nav-label,.price-chip small{
  font-family:var(--mono);
  font-size:var(--t-stamp);
  font-weight:600;
  letter-spacing:.1em;
}
/* the two that are numbers, not labels — same size, no tracking */
.vital b,.price-chip small{letter-spacing:.04em}
.t-n{letter-spacing:.04em}

/* ── keyboard operability. The audit found ZERO focus rules in 347. ────── */
:where(a,button,summary,[tabindex],.signal):focus-visible{
  outline:2px solid var(--lime);
  outline-offset:3px;
  border-radius:4px;
}

/* ── prose is never monospace ─────────────────────────────────────────── */
.reason,.earn-what,.earn-why,.earn-note,.earn-hint,.empty,.empty-copy,
.regime-text,.t-text,.thesis-line,.tagline,.conf-l2,.method-cols p{
  font-family:var(--sans);
}
.conf-l2{letter-spacing:0;font-weight:400}

/* ══ THE TRIPWIRE — the signature ═══════════════════════════════════════
   Every call carries a named invalidation; this renders how much margin is
   left before the call is wrong. ONE rail geometry, THREE fill behaviours,
   identical height in every card so a grid of signals never grows holes:
     .tw--live   numeric, margin plotted
     .tw--dark   threshold known, current reading unavailable  (half the feed)
     .tw--armed  boolean condition, armed / tripped
   ☢️ Proximity is LENGTH, never a new hue — it survives colour blindness and
   keeps the palette at one accent plus one warning. The dead zone is drawn
   FROM the threshold, so "where wrong begins" is always where the marker is. */
.tw{display:grid;gap:6px;background:var(--sunk);border:1px solid var(--line-soft);
    border-radius:8px;padding:12px;margin-top:10px}
.tw-head{display:flex;align-items:baseline;gap:8px;justify-content:space-between}
.tw-rail{position:relative;height:26px;border-radius:5px;overflow:hidden;
         background:var(--surface-2);border:1px solid var(--line)}
.tw-dead{position:absolute;top:0;bottom:0;left:0;
         background:linear-gradient(90deg,rgba(242,96,76,.34),rgba(242,96,76,.16))}
.tw-fill{position:absolute;top:0;bottom:0;
         background:linear-gradient(90deg,rgba(22,234,215,.14),rgba(22,234,215,.42));
         border-left:2px solid var(--lime);
         box-shadow:inset 0 0 0 1px rgba(22,234,215,.12)}
.tw--warn .tw-fill{background:linear-gradient(90deg,rgba(233,169,58,.16),rgba(233,169,58,.46));
                   border-left-color:var(--amber)}
.tw-kill{position:absolute;top:0;bottom:0;width:2px;background:var(--red)}
.tw-now{position:absolute;top:50%;transform:translate(-50%,-50%);
        font:600 var(--t-stamp) var(--mono);color:var(--text);white-space:nowrap;
        background:var(--sunk);border:1px solid var(--line);padding:2px 6px;border-radius:4px}
.tw-mid{position:absolute;inset:0;display:grid;place-items:center;
        font:600 var(--t-stamp) var(--mono);letter-spacing:.08em;text-transform:uppercase;
        color:var(--muted)}
.tw--armed .tw-mid{color:var(--lime);place-items:center start;padding-left:12px}
.tw--dark .tw-rail{background:repeating-linear-gradient(135deg,rgba(255,255,255,.028) 0 6px,transparent 6px 12px)}
.tw-foot{display:flex;justify-content:space-between;gap:12px}
.tw-foot span{font:600 var(--t-stamp) var(--mono);letter-spacing:.08em;
              text-transform:uppercase;color:var(--muted)}
.tw-foot .ok{color:var(--lime)}
.tw-foot .near{color:var(--amber)}

/* ── the call card: headline is the CLAIM, ticker is a stamp ────────────
   Four live signals carry the symbol "X"; a ticker-led headline printed it
   four times. And every signal shares one `kind`, so the kind cannot lead
   either — the magnitude is the only thing that reliably differs. */
.sig-tickers{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tickchip{font:600 var(--t-stamp) var(--mono);letter-spacing:.06em;color:var(--text-2);
          background:var(--sunk);border:1px solid var(--line);padding:3px 7px;border-radius:5px}
.sig-kind{font:600 var(--t-stamp) var(--mono);letter-spacing:.1em;
          text-transform:uppercase;color:var(--muted);display:block;margin-top:3px}
/* the machine's own corrections land ON the card — a visible correction is
   the evidence its numbers are real */
.revision{display:flex;gap:8px;align-items:baseline;border-left:2px solid var(--amber);
          padding-left:12px;margin-top:10px;font-family:var(--sans);
          font-size:var(--t-meta);color:var(--text-2)}

/* ── workspace heads for the consolidated lower page ───────────────────── */
.ws-head{display:flex;align-items:baseline;gap:12px;padding-bottom:12px;
         border-bottom:1px solid var(--line);margin:32px 0 16px}
.ws-head h2{font:700 var(--t-figure)/1.1 var(--display);letter-spacing:.01em;color:var(--text)}
.ws-head .spacer{margin-left:auto}

/* ── coverage rows (risk workspace) ────────────────────────────────────── */
.cov-row{display:flex;align-items:baseline;gap:12px;padding:7px 0;
         border-bottom:1px solid var(--line-soft);font-size:var(--t-meta);
         font-family:var(--sans);color:var(--text-2)}
.cov-row:last-child{border-bottom:0}
.cov-row .n{margin-left:auto;font-family:var(--mono);color:var(--muted);
            font-variant-numeric:tabular-nums}

/* ── honest empty states: direction, not apology ───────────────────────── */
.ledger-empty{display:flex;flex-direction:column;gap:8px;align-items:center;
              text-align:center;border:1px dashed var(--line);border-radius:var(--radius);
              padding:24px}
.ledger-empty p{font-family:var(--sans);font-size:var(--t-body);color:var(--text-2);
                max-width:52ch;margin:0}

/* numerals line up everywhere they are compared */
.metric-value,.regime-score,.signal .conv,.nscore,.conf-eth,.conf-n,
.t-strength,td,.obs b{font-variant-numeric:tabular-nums}
.risk-claim{font:600 var(--t-title)/1.2 var(--display);color:var(--text);margin-top:4px}

/* ── the last mile: four things the rendered-DOM audit caught that the
      stylesheet alone could not show. ─────────────────────────────────── */

/* 1. <small> inherits the browser's 0.83em, which put 15.83px on the page and
      broke the six-size cap from outside the stylesheet. */
small{font-size:var(--t-stamp)}

/* 2. one label treatment means one TRACKING too. These rules each carried
      their own value (.04em … .14em), which is how 47 treatments happened. */
.section-title,.view,.small,.regime-label,.metric-label,.d-h,.dk,.dv,.stage,
.mode-label,.streaming,.event-time,.event-title,.status,.status-sub,.tier,
.narrative-meta,.win-n,.chip,.progress-row,.baseline-row,.metric-sub,.sc-k,
.sc-v,.subtitle,.chain,.nav-label,.regime-score small,.conv small,.nscore small,
.t-strength,.lg-note,.liq-legend,.cl-badge,th,.earn-kind,.rlvl{
  letter-spacing:.1em;
  font-weight:600;
}
/* numbers are not labels: tracking hurts a figure */
.regime-score,.metric-value,.conv,.nscore,.num,td.num,.conf-eth{letter-spacing:0}

/* 3. prose is never monospace — two survivors the first pass missed */
.status-sub,.lg-note,.empty,.reason,.risk-claim + .reason{
  font-family:var(--sans);
  letter-spacing:0;
  font-weight:400;
}
.status-sub{font-size:var(--t-meta)}

/* 4. ☢️ 57.9% of characters were sitting in the single grey while the primary
      ink carried 14%. The greys are one token now, so the fix is to stop
      spending it on things that are not tertiary: a panel's own title, a table
      header and a metric label are STRUCTURE, and structure reads at --text-2. */
.section-title,.metric-label,.regime-label,.d-h,th,.ws-head .small,
.pulse-head .section-title,.panel-head .section-title{color:var(--text-2)}
.metric-value,.conv,.regime-score,.nscore,.t-strength,td.num,.sym{color:var(--text)}

/* ── label census, final pass. Each of these was a straggler carrying its own
      tracking or weight; the rendered DOM named them, so they are fixed by
      name rather than by another blanket rule. ─────────────────────────── */
.tickchip,.tw-foot span,.tw-foot .ok,.tw-foot .near,.bubble-legend span,
.liq-legend span,.regime-score small,.conv small,.nscore small,.t-strength small,
.sc-v,.sc-k,.track-btn,.cl-badge,.rlvl,.tier{
  letter-spacing:.1em;
  font-weight:600;
  font-size:var(--t-stamp);
}

/* figures are never tracked: the eye reads a number as a shape */
.vital b,.price-chip small,.price-chip b,.metric-value,.regime-score,
.conv,.nscore,.num,td.num,.conf-eth,.t-strength{letter-spacing:0}

/* the mind headings are set in the display face, where heavy tracking is a
   1990s reflex — tightening them also takes them out of the label census,
   which is correct: they are headings, not field labels. */
.t-title{letter-spacing:.015em;font-weight:600}

/* ══ responsive, for the components this redesign added ══════════════════ */
@media(max-width:1150px){
  :root{--t-display:36px;--t-figure:26px}
  .regime-row{gap:16px}
}
@media(max-width:760px){
  /* 46px of Saira across a 390px screen puts FRESH-LAUNCH ACCUMULATION off
     the edge; the scale steps down rather than the headline wrapping badly. */
  :root{--t-display:30px;--t-figure:23px;--t-title:17px}
  .regime-row{flex-direction:column;align-items:flex-start;gap:14px}
  .regime-score{text-align:left}
  .regime-wrap{padding:16px 14px}
  .regime-snap{position:static;display:inline-block;margin-top:10px}

  .ws-head{margin:24px 0 12px;flex-wrap:wrap;gap:6px}
  .ws-head .small{flex-basis:100%}

  /* the tripwire keeps its geometry — it is the one thing on the card that
     has to stay readable — but the two footer stamps stack instead of
     colliding, and the plotted value cannot run off the rail. */
  .tw{padding:10px}
  .tw-foot{flex-direction:column;gap:3px}
  .tw-now{font-size:var(--t-stamp);padding:1px 4px}
  .tw-head{flex-wrap:wrap;gap:2px}

  .sig-tickers{gap:6px}
  .signal .head{flex-wrap:wrap;gap:8px}
  .conv{margin-left:0}
  #signals{max-height:none}
  .cov-row{flex-wrap:wrap}
  .ledger-empty{padding:16px}
}

/* $4663 token card — opened from the header chip */
.token-overlay{
  position:fixed;inset:0;z-index:80;
  background:rgba(6,8,8,.62);
  display:none;align-items:center;justify-content:center;
  padding:24px;
}
.token-overlay.open{display:flex}
.token-card{
  position:relative;
  width:min(560px,100%);
  max-height:min(92vh,820px);
  overflow:auto;
  background:linear-gradient(180deg,var(--surface),var(--surface-2));
  border:1px solid var(--line);
  border-radius:var(--radius);
  box-shadow:var(--shadow),0 0 40px var(--lime-soft);
  padding:22px 22px 18px;
}
.token-close{
  position:absolute;top:12px;right:12px;
  width:28px;height:28px;border:1px solid var(--line);border-radius:4px;
  background:none;color:var(--muted);cursor:pointer;line-height:1;
  font-family:var(--mono);font-size:var(--t-title);
}
.token-close:hover{color:var(--lime);border-color:var(--lime-glow)}
.token-kicker{
  font-family:var(--mono);font-size:var(--t-stamp);font-weight:700;
  letter-spacing:.16em;color:var(--muted);
}
.token-stale{color:var(--amber);margin-left:10px;letter-spacing:.12em}
.token-card h2{
  font:700 var(--t-title)/1.1 var(--display);color:var(--lime);
  letter-spacing:.02em;margin-top:8px;
}
.token-name{font-family:var(--sans);font-size:var(--t-body);color:var(--text-2);margin-top:4px}
.token-ca{margin-top:10px}
.token-grid{
  display:grid;grid-template-columns:1fr 1fr;gap:10px 16px;
  margin-top:14px;padding-top:12px;border-top:1px solid var(--line-soft);
}
.token-grid-3{grid-template-columns:1fr 1fr 1fr;margin-top:10px;padding-top:0;border:0}
.token-cell span{
  display:block;font-family:var(--mono);font-size:var(--t-stamp);font-weight:600;
  letter-spacing:.12em;color:var(--muted);
}
.token-cell b{
  display:block;margin-top:4px;
  font-family:var(--mono);font-size:var(--t-meta);font-weight:700;color:var(--text);
}
.token-cell b.pos{color:var(--lime)}
.token-cell b.neg{color:var(--red)}
.token-cell b.hole{color:var(--muted-2);font-weight:500}
.token-block{margin-top:18px;padding-top:14px;border-top:1px solid var(--line-soft)}
.token-note{font-family:var(--sans);font-size:var(--t-meta);color:var(--muted);margin-top:8px;line-height:1.55}
.token-links{display:flex;flex-wrap:wrap;gap:14px;margin-top:18px;font-family:var(--mono);font-size:var(--t-stamp);font-weight:600;letter-spacing:.08em}
.token-holes{margin-top:12px;font-family:var(--mono);font-size:var(--t-stamp);letter-spacing:.08em;color:var(--amber)}
.token-foot{margin-top:14px;font-family:var(--mono);font-size:var(--t-stamp);letter-spacing:.08em;color:var(--muted-2)}
.token-empty{font-family:var(--sans);font-size:var(--t-body);color:var(--muted);margin-top:12px}
@media(max-width:760px){
  .token-grid,.token-grid-3{grid-template-columns:1fr 1fr}
  .token-card{padding:18px 14px 14px}
}
