
  /* ---------- shared Research-Reports chrome ---------- */
  * { box-sizing:border-box; }
  body { background:var(--bg); color:var(--text); font:14px/1.6 -apple-system,"Segoe UI",Roboto,Helvetica,sans-serif; margin:0; padding:18px 18px 60px; }
  @media(min-width:1100px){ body{ padding-left:max(18px,calc((100vw - 1096px)/2)); padding-right:max(18px,calc((100vw - 1096px)/2)); } }
  a { color:var(--ink-link, var(--link)); text-decoration:none; }
  .wrap { max-width:1060px; margin:0 auto; }
  /* unambiguous move colours (NOT tied to the zh red=up swap) */
  .r-neg { color:#d23f3f; font-weight:600; }
  .r-pos { color:#1f9a55; font-weight:600; }
  html[data-theme="dark"] .r-neg { color:#ef6a6a; }
  html[data-theme="dark"] .r-pos { color:#3fc07e; }
  .mut { color:var(--muted); }
  /* tags / chips */
  .chip { display:inline-flex; align-items:center; gap:5px; font-size:11.5px; line-height:1; padding:5px 10px; border-radius:999px;
          background:var(--panel2); border:1px solid var(--line); color:var(--muted); white-space:nowrap; }
  .chip.tag-macro   { color:#5b8def; border-color:#5b8def55; }
  .chip.tag-fed     { color:#c77dff; border-color:#c77dff55; }
  .chip.tag-rates   { color:#3fb6c0; border-color:#3fb6c055; }
  .chip.tag-equities{ color:#46b87a; border-color:#46b87a55; }
  .chip.tag-crypto  { color:#e0973a; border-color:#e0973a55; }
  .chip.tag-energy  { color:#cf7b3a; border-color:#cf7b3a55; }
  .chip.tag-event   { color:#e0607a; border-color:#e0607a55; }
  .chip.tag-ai      { color:#b48ead; border-color:#b48ead55; }
  .chip.tag-china   { color:#d0554f; border-color:#d0554f55; }
  .chip.tag-credit  { color:#d08770; border-color:#d0877055; }
  footer.rfoot { color:var(--muted); font-size:11.5px; margin:46px auto 0; max-width:1060px; border-top:1px solid var(--line); padding-top:14px; }
  /* XG-W7 follow line — its own row, never appended to the disclaimer sentence:
     a legal notice and a marketing CTA must not read as one thought. */
  footer.rfoot .rf-x { display:inline-flex; align-items:center; gap:6px; margin-top:11px; padding:4px 10px;
    border-radius:100px; border:1px solid var(--line); color:var(--muted); font-size:11px; font-weight:600;
    transition:color .16s, border-color .16s; }
  footer.rfoot .rf-x:hover { color:var(--text); border-color:color-mix(in srgb,var(--text) 26%,transparent); }
  
/* ===================== MARKETS NEWS — the front page =====================
   A news page, not a dashboard about news. The previous idiom put a fixed
   animated aurora behind the whole page and floated glass cards on it, which is
   what made light mode read as a lavender haze; the lead card also breathed an
   inset glow in the STORY'S OWN sentiment colour, so a negative headline pulsed
   pink every four seconds. Both are gone. The ground is paper (ink in dark
   mode), the cards are ruled rows, and colour has stopped being atmosphere —
   it now only ever means something.

   Identity is carried by TYPE: headlines are set in a display serif and
   everything else stays in the house sans. The serif is a SYSTEM stack, so it
   costs no webfont, no render budget and nothing in the Caddyfile immutable
   list — Iowan/Palatino ship on macOS, Georgia everywhere else. zh gets a CJK
   serif, which is the same editorial register in Chinese news.

   The tokens below are also consumed by the Intelligence Desk, the Live Wire,
   the rail and the diagnostics drawer, so redefining them here carries those
   sections into the same language.                                          */
.nxx{ --num:var(--font-mono,ui-monospace,"SF Mono",SFMono-Regular,"Cascadia Mono","JetBrains Mono",Menlo,Consolas,monospace);
  --nx-serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,"Times New Roman",serif;
  /* paper / ink — a hair off the app chrome so the reading column reads as a sheet */
  --nx-paper:color-mix(in srgb, var(--panel) 92%, var(--bg));
  /* Still real surfaces — the release cards, the rail, the Desk and the Wire all
     read these — but mixed toward the paper instead of being translucent glass,
     so they sit ON the sheet rather than floating over an aurora. */
  --nx-card:color-mix(in srgb, var(--panel2) 50%, var(--nx-paper));
  --nx-card-solid:var(--nx-paper);
  --nx-card2:color-mix(in srgb, var(--panel2) 72%, var(--nx-paper));
  --nx-brd:color-mix(in srgb, var(--text) 20%, transparent);
  --nx-hair:color-mix(in srgb, var(--text) 13%, transparent);
  --nx-rule:color-mix(in srgb, var(--text) 26%, transparent);
  --nx-blur:none;
  --nx-radius:6px;
  --nx-shadow:none;
  position:relative; z-index:1; max-width:1180px; margin:0 auto;
  padding-bottom:8px; }
.nxx .num{ font-family:var(--num); font-variant-numeric:tabular-nums; letter-spacing:-.01em; }
.nxx a{ color:inherit; text-decoration:none; }
html[data-lang="zh"] .nxx{ --nx-serif:"Songti SC","SimSun","Noto Serif CJK SC","Source Han Serif SC",serif; }

/* The reading column is a SHEET on the app's ground, rather than a full-viewport
   fixed layer: same look, one less always-composited element, and the sheet edge
   is the metaphor — this is a page you read, sitting on the app around it.
   Derived from --panel so it flips with the theme and hardcodes no surface. */
.nxx{ background:var(--nx-paper); padding-left:clamp(16px,3vw,44px); padding-right:clamp(16px,3vw,44px);
  padding-top:6px; border-inline:1px solid var(--nx-hair); min-height:60vh; }

/* the front-page structural device: a rule with a small-caps kicker */
.nx-kick{ display:flex; align-items:center; gap:10px; margin:0 0 14px;
  font-size:11px; font-weight:700; letter-spacing:.18em; text-transform:uppercase; color:var(--muted); }
.nx-kick::after{ content:""; flex:1; height:1px; background:var(--nx-hair); }
.nx-kick .live{ width:6px; height:6px; border-radius:50%; background:var(--up); flex:0 0 auto;
  box-shadow:0 0 0 3px color-mix(in srgb,var(--up) 22%,transparent); }

/* ---- masthead ---- */
.nx-head{ padding:10px 0 16px; border-bottom:2px solid var(--nx-rule); margin-bottom:22px; }
.nx-eyebrow{ font-size:11px; font-weight:700; letter-spacing:.2em; text-transform:uppercase; color:var(--muted);
  display:flex; align-items:center; gap:8px; }
.nx-eyebrow .live{ width:7px; height:7px; border-radius:50%; background:var(--up);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--up) 26%,transparent); }
.nx-title{ font-family:var(--nx-serif); font-size:clamp(32px,5vw,46px); font-weight:600; letter-spacing:-.015em;
  margin:8px 0 6px; line-height:1.02; color:var(--text); }
.nx-sub{ color:var(--muted); font-size:13.5px; max-width:62ch; line-height:1.5; }
.nx-updated{ font-size:11.5px; color:var(--muted); margin-top:10px;
  display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.nx-updated .num{ color:var(--text); font-weight:600; }
.nx-updated .sep{ color:var(--nx-rule); }

/* ---- LEAD + also-big: the front page ---- */
.nx-hero{ display:grid; grid-template-columns:minmax(0,1.62fr) minmax(0,1fr); gap:34px; margin:0 0 30px;
  padding-bottom:26px; border-bottom:1px solid var(--nx-hair); }
.nx-lead{ position:relative; min-width:0; }
.nx-lead-eyebrow{ font-size:10.5px; font-weight:800; letter-spacing:.18em; text-transform:uppercase;
  color:var(--text); margin-bottom:12px; display:flex; align-items:center; gap:9px; }
.nx-lead-kick{ font-weight:700; color:var(--muted); letter-spacing:.14em; }
.nx-lead-eyebrow::after{ content:""; flex:1; height:2px; background:var(--nx-rule); }
.nx-lead-title{ display:block; font-family:var(--nx-serif); font-size:clamp(26px,3.4vw,38px); font-weight:600;
  line-height:1.14; letter-spacing:-.015em; color:var(--text); margin:0 0 12px; text-wrap:balance; }
.nx-lead-title:hover{ text-decoration:underline; text-decoration-thickness:1px; text-underline-offset:3px; }
.nx-lead-why{ font-size:15px; line-height:1.55; color:color-mix(in srgb,var(--text) 74%,var(--bg));
  margin:0 0 14px; max-width:56ch; }
.nx-lead-meta{ font-size:12px; color:var(--muted); display:flex; flex-wrap:wrap; gap:9px; align-items:center; }
.nx-lead-meta .src{ color:var(--text); font-weight:700; }
.nx-lead-meta .sep{ color:var(--nx-rule); }

/* also-big — ruled subheads, no boxes: a column of stories, the way a paper sets one */
.nx-movers{ display:flex; flex-direction:column; min-width:0; }
.nx-movers-hd{ font-size:10.5px; font-weight:800; letter-spacing:.18em; text-transform:uppercase; color:var(--text);
  padding-bottom:9px; border-bottom:2px solid var(--nx-rule); margin-bottom:4px; }
.nx-mover{ display:block; padding:13px 0; border-bottom:1px solid var(--nx-hair); }
.nx-mover:last-child{ border-bottom:0; }
.nx-mover-title{ font-family:var(--nx-serif); font-size:16px; font-weight:600; line-height:1.28;
  color:var(--text); display:block; }
.nx-mover:hover .nx-mover-title{ text-decoration:underline; text-decoration-thickness:1px; text-underline-offset:2px; }
.nx-mover-meta{ font-size:11px; color:var(--muted); margin-top:6px; display:flex; gap:7px; flex-wrap:wrap; align-items:center; }
.nx-mover-meta .sep{ color:var(--nx-rule); }

/* ---- what the desk is watching (was: "theme pulse" counts) ---- */
.nx-pulse{ display:flex; flex-wrap:wrap; gap:7px 10px; align-items:baseline; margin:0 0 26px;
  padding-bottom:16px; border-bottom:1px solid var(--nx-hair); font-size:12.5px; }
.nx-pulse-lbl{ font-size:10.5px; font-weight:800; letter-spacing:.16em; text-transform:uppercase;
  color:var(--muted); margin-right:4px; }
.nx-heat{ display:inline-flex; align-items:baseline; gap:5px; color:var(--text); font-weight:600; }
.nx-heat + .nx-heat::before{ content:"·"; color:var(--nx-rule); margin-right:6px; font-weight:400; }
.nx-heat b{ font-family:var(--num); font-weight:700; color:var(--muted); font-size:11.5px; }
.nx-pulse-sent{ margin-left:auto; font-size:11.5px; color:var(--muted); display:inline-flex; align-items:center; gap:6px; }
.nx-pulse-sent .dot{ width:7px; height:7px; border-radius:50%; }

/* ---- CONTROLS ---- */
.nx-controls{ display:flex; gap:12px; align-items:center; margin-bottom:6px; flex-wrap:wrap;
  padding-bottom:12px; border-bottom:2px solid var(--nx-rule); }
.seg{ display:inline-flex; gap:2px; }
.seg-btn{ appearance:none; border:0; background:transparent; color:var(--muted); font-family:inherit;
  font-size:12px; font-weight:700; letter-spacing:.04em; padding:6px 11px; border-radius:4px; cursor:pointer;
  transition:color .16s, background .16s; white-space:nowrap; }
.seg-btn:hover{ color:var(--text); background:color-mix(in srgb,var(--text) 6%,transparent); }
.seg-btn.on{ background:var(--text); color:var(--nx-paper); }
.nx-search{ flex:1; min-width:170px; max-width:300px; position:relative; margin-left:auto; }
.nx-search input{ width:100%; font-family:inherit; font-size:12.5px; color:var(--text); padding:7px 10px 7px 29px;
  border-radius:4px; background:transparent; border:1px solid var(--nx-hair); outline:none; transition:border-color .16s; }
.nx-search input:focus{ border-color:var(--nx-rule); }
.nx-search svg{ position:absolute; left:9px; top:50%; transform:translateY(-50%); opacity:.5; }
.nx-count{ font-size:11px; color:var(--muted); font-family:var(--num); flex:0 0 auto; }

/* ---- FEED — a story list, not a stack of cards ---- */
.nx-feed{ display:flex; flex-direction:column; }
.nx-story{ display:block; padding:16px 0; border-bottom:1px solid var(--nx-hair); }
.nx-story:hover .nx-story-title{ text-decoration:underline; text-decoration-thickness:1px; text-underline-offset:2px; }
.nx-story.hide{ display:none; }
.nx-story-main{ min-width:0; }
.nx-story-title{ font-family:var(--nx-serif); font-size:18px; font-weight:600; line-height:1.28;
  display:block; color:var(--text); }
.nx-meta{ margin-top:7px; font-size:11.5px; color:var(--muted); display:flex; flex-wrap:wrap; gap:7px; align-items:center; }
.nx-meta .src{ color:var(--text); font-weight:700; }
.nx-meta .sep{ color:var(--nx-rule); }
.nx-tk{ font-family:var(--num); font-size:10.5px; font-weight:700; color:var(--muted);
  border:1px solid var(--nx-hair); padding:0 5px; border-radius:3px; }
a.nx-tk:hover{ color:var(--ink-link, var(--link)); border-color:currentColor; }
.nx-more{ margin:20px auto 4px; display:block; }
.nx-empty{ text-align:center; color:var(--muted); font-size:13px; padding:34px; }

/* ---- the one label a story carries ----
   A theme label, set as text with a leading tick in the theme's hue. The old
   idiom gave every story a tinted pill for theme AND event AND direction AND an
   "✦ AI" badge AND five ticker pills — five to nine coloured objects per
   headline, which is the chip soup that made the list unreadable. */
.nx-chip{ display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700;
  letter-spacing:.04em; text-transform:uppercase; white-space:nowrap;
  color:color-mix(in srgb,var(--c,var(--muted)) 62%,var(--text)); }
.nx-chip::before{ content:""; width:5px; height:5px; border-radius:1px; flex:0 0 auto;
  background:var(--c,var(--muted)); }
.nx-chip.evt,.nx-chip.ai,.nx-chip.tier{ display:none; }   /* demoted — the theme label carries the row */
.nx-chips{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.dir-up{ --c:var(--up); } .dir-down{ --c:var(--down); } .dir-mixed{ --c:var(--warn); }
/* theme / lane hues */
.th-monetary,.th-fed{ --c:#8b5cf6; } .th-credit{ --c:#0e9aa7; }
.th-inflation{ --c:#c2760f; } .th-labor{ --c:#3b6fd4; } .th-growth{ --c:#1f9a55; }
.th-fiscal{ --c:#b5604f; } .th-macro,.th-markets{ --c:#3b6fd4; }
.th-earnings,.th-guidance,.th-stocks,.th-companies{ --c:#1f9a55; }
.th-analyst{ --c:#8d6e9b; } .th-deals,.th-capital_return{ --c:#c2760f; }

/* ---- two-column: releases + rail ---- */
.nx-cols{ display:grid; grid-template-columns:minmax(0,1fr) 320px; gap:16px; margin-top:26px; align-items:start; }
.nx-sec-hd{ display:flex; align-items:center; gap:8px; margin:0 0 12px; font-size:15px; font-weight:800; letter-spacing:-.01em; }
.nx-sec-hd::before{ content:""; width:3px; height:16px; border-radius:2px; background:var(--link); }
.nx-sec-hd .n{ font-size:11px; font-weight:700; color:var(--muted); font-family:var(--num); }
.nx-rel-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:10px; }
.nx-rel{ padding:13px 14px; border-radius:12px; background:var(--nx-card); border:1px solid var(--nx-hair); }
.nx-rel-top{ display:flex; justify-content:space-between; align-items:baseline; gap:8px; margin-bottom:8px; }
/* F05-1 consequence panel — full-width single column (not the releases nx-cols
   grid). Dark: 1px top highlight + inset ring. Light: white plane + ambient
   elevation. Tokens only; no new colour family. */
#nxConsequence{ margin-top:26px; }
#nxConsequence .nx-rel-grid{ grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:14px; }
#nxConsequence .nx-rel{ box-shadow: var(--card-shadow), inset 0 0 0 1px color-mix(in srgb, var(--line) 55%, transparent); }
html[data-theme="light"] #nxConsequence .nx-rel{ background: var(--panel); box-shadow: var(--card-shadow), 0 8px 24px color-mix(in srgb, var(--text) 6%, transparent); }
html[data-theme="light"] #nxConsequence .nx-rel:hover{ box-shadow: var(--popover-shadow); }
/* Typed empty state — the shipping product on the current corpus. Dark:
   command-center plane + inset ring, no glow. Light: research-workspace
   white plane, hairline, one ambient shadow. Tokens only. */
#nxConsequence .nx-empty{ text-align:left; padding:14px 16px; border-radius:var(--r-card,12px); background:transparent; box-shadow: var(--card-shadow), inset 0 0 0 1px color-mix(in srgb, var(--line) 55%, transparent); }
#nxConsequence .nx-empty::before{ content:""; display:block; width:28px; height:2px; background:var(--line); margin:0 0 10px; }
#nxConsequence .nx-empty-lead{ margin:0; font-size:13px; color:var(--muted); line-height:1.45; }
#nxConsequence .nx-empty-next{ margin:6px 0 0; font-size:12px; color:var(--muted); line-height:1.45; }
html[data-theme="light"] #nxConsequence .nx-empty{ background:var(--panel); border:1px solid var(--line); box-shadow: var(--card-shadow), 0 8px 24px color-mix(in srgb, var(--text) 6%, transparent); }
.nx-rel-name{ font-size:13px; font-weight:700; }
.nx-rel-read{ font-size:11px; font-weight:700; }
.nx-rel-read.up{ color:var(--ink-up, var(--up)); } .nx-rel-read.down{ color:var(--ink-down, var(--down)); }
.nx-rel-cells{ display:flex; gap:14px; flex-wrap:wrap; }
.nx-rel-cell .k{ font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); }
.nx-rel-cell .v{ font-size:15px; font-weight:800; font-family:var(--num); }
.nx-rel-sum{ margin-top:8px; font-size:11.5px; color:var(--muted); font-style:italic; }
.nx-badge{ font-size:9.5px; font-weight:700; letter-spacing:.05em; padding:2px 7px; border-radius:100px; }
.nx-badge.big{ background:color-mix(in srgb,var(--act) 16%,transparent); color:var(--ink-act, var(--act)); }
.nx-badge.notable{ background:color-mix(in srgb,var(--warn) 16%,transparent); color:var(--ink-warn, var(--warn)); }

/* ---- rail ---- */
.nx-rail{ display:flex; flex-direction:column; gap:14px; position:sticky; top:14px; }
.nx-rail-card{ padding:14px; border-radius:14px; background:var(--nx-card); border:1px solid var(--nx-hair); }
.nx-rail-hd{ font-size:11px; font-weight:700; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); margin-bottom:10px; }
.nx-line{ display:flex; gap:8px; align-items:baseline; padding:6px 0; border-top:1px solid var(--nx-hair); font-size:12px; }
.nx-line:first-of-type{ border-top:0; }
.nx-line .d{ font-family:var(--num); font-size:11px; color:var(--muted); flex:0 0 auto; min-width:44px; }
.nx-line .lbl{ flex:1; }
.nx-odds{ display:flex; justify-content:space-between; font-size:11.5px; padding:3px 0; }
.nx-odds .p{ font-family:var(--num); font-weight:700; }
.nx-rail-note{ font-size:10.5px; color:var(--muted); margin-top:8px; }

/* ---- diagnostics drawer ---- */
.nx-diag{ margin-top:26px; border-radius:12px; background:var(--nx-card2); border:1px solid var(--nx-hair); overflow:hidden; }
.nx-diag>summary{ cursor:pointer; padding:12px 14px; font-size:12px; font-weight:600; color:var(--muted); list-style:none; display:flex; gap:8px; align-items:center; }
.nx-diag>summary::-webkit-details-marker{ display:none; }
.nx-diag>summary::before{ content:"▸"; transition:transform .2s; }
.nx-diag[open]>summary::before{ transform:rotate(90deg); }
.nx-diag-body{ padding:0 14px 14px; font-size:11.5px; color:var(--muted); }
.nx-diag h4{ font-size:11px; text-transform:uppercase; letter-spacing:.08em; margin:12px 0 6px; color:var(--muted); }
.nx-diag table{ width:100%; border-collapse:collapse; font-size:11px; }
.nx-diag td{ padding:3px 6px; border-top:1px solid var(--nx-hair); vertical-align:top; }
.nx-diag .rej-reason{ color:var(--ink-warn, var(--warn)); font-weight:600; }
.nx-disc{ margin:22px 0 0; font-size:11px; color:var(--muted); font-style:italic; }

/* ======================= INTELLIGENCE DESK =======================
   The durable story layer above the arrival wire: clustered developments,
   evidence receipts, market context, and review-only X drafts. */
.nxi{ --nxi-accent:var(--info);
  /* the fold's hairline spine. --nx-hair is mixed off --line and all but
     vanishes on the dark panel, so the timeline rule is --text-derived (the
     same fix the wire's spine needed) and holds its weight in both themes. */
  --nxi-spine:color-mix(in srgb,var(--text) 15%,transparent);
  margin:0 0 18px; border-radius:20px; overflow:hidden;
  background:linear-gradient(145deg,color-mix(in srgb,var(--panel) 93%,transparent),
    color-mix(in srgb,var(--panel2) 82%,transparent));
  border:1px solid color-mix(in srgb,var(--nxi-accent) 24%,var(--nx-brd));
  box-shadow:0 18px 48px -30px color-mix(in srgb,var(--nxi-accent) 46%,transparent),
    var(--nx-shadow); -webkit-backdrop-filter:var(--nx-blur); backdrop-filter:var(--nx-blur); }
.nxi[hidden]{ display:none; }
.nxi-head{ display:grid; grid-template-columns:minmax(0,1fr) auto; gap:18px; padding:20px;
  border-bottom:1px solid var(--nx-hair); }
.nxi-kicker{ display:flex; align-items:center; gap:8px; color:var(--nxi-accent); font-size:10.5px;
  font-weight:800; letter-spacing:.16em; text-transform:uppercase; }
.nxi-pulse{ width:8px; height:8px; border-radius:50%; background:var(--nxi-accent);
  box-shadow:0 0 0 4px color-mix(in srgb,var(--nxi-accent) 15%,transparent); }
.nxi[data-state="quiet"] .nxi-pulse{ background:transparent; border:1.5px solid var(--muted); box-shadow:none; }
.nxi-title{ margin:6px 0 4px; font-size:21px; line-height:1.16; font-weight:850; letter-spacing:-.02em; }
.nxi-sub{ margin:0; max-width:72ch; color:var(--muted); font-size:12.5px; line-height:1.5; }
.nxi-health{ align-self:center; min-width:152px; padding:10px 12px; border-radius:12px;
  background:color-mix(in srgb,var(--nxi-accent) 7%,transparent);
  border:1px solid color-mix(in srgb,var(--nxi-accent) 18%,transparent); }
.nxi-health strong{ display:block; font-size:12px; }
.nxi-health span{ display:block; margin-top:3px; color:var(--muted); font-size:10.5px; }
.nxi-metrics{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); border-bottom:1px solid var(--nx-hair); }
.nxi-metric{ padding:12px 16px; border-right:1px solid var(--nx-hair); }
.nxi-metric:last-child{ border-right:0; }
.nxi-metric b{ display:block; font-family:var(--num); font-size:19px; letter-spacing:-.02em; }
.nxi-metric span{ display:block; margin-top:2px; color:var(--muted); font-size:10px; letter-spacing:.08em; text-transform:uppercase; }
.nxi-toolbar{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; padding:12px 16px 4px; }
.nxi-filter{ appearance:none; border:1px solid var(--nx-hair); background:transparent; color:var(--muted);
  border-radius:100px; padding:5px 10px; font:600 11px/1.2 inherit; cursor:pointer; }
.nxi-filter:hover{ color:var(--text); border-color:var(--nx-brd); }
.nxi-filter.on{ color:var(--text); background:color-mix(in srgb,var(--nxi-accent) 12%,transparent);
  border-color:color-mix(in srgb,var(--nxi-accent) 36%,transparent); }
.nxi-toolbar-note{ margin-left:auto; color:var(--muted); font-size:10.5px; }
.nxi-list{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; padding:10px 16px 16px; }
.nxi-story{ min-width:0; border:1px solid var(--nx-hair); border-radius:14px; overflow:hidden;
  background:color-mix(in srgb,var(--panel) 78%,transparent); }
.nxi-story[data-stage="high_impact"]{ border-color:color-mix(in srgb,var(--act) 42%,var(--nx-hair)); }
.nxi-story[data-hidden="true"]{ display:none; }
.nxi-main{ padding:14px; }
.nxi-topline{ display:flex; gap:7px; align-items:center; flex-wrap:wrap; margin-bottom:8px; }
.nxi-stage,.nxi-lane,.nxi-sourcecount{ display:inline-flex; align-items:center; gap:4px; border-radius:100px;
  padding:2px 7px; font-size:9.5px; font-weight:750; letter-spacing:.05em; }
.nxi-stage{ color:var(--text); background:color-mix(in srgb,var(--muted) 13%,transparent);
  border:1px solid color-mix(in srgb,var(--muted) 24%,transparent); }
.nxi-stage.high_impact{ background:color-mix(in srgb,var(--act) 13%,transparent);
  border-color:color-mix(in srgb,var(--act) 32%,transparent); color:var(--ink-act, var(--act)); }
.nxi-stage.confirmed{ background:color-mix(in srgb,var(--info) 11%,transparent);
  border-color:color-mix(in srgb,var(--info) 28%,transparent); color:var(--ink-info, var(--info)); }
.nxi-lane,.nxi-sourcecount{ color:var(--muted); border:1px solid var(--nx-hair); }
.nxi-time{ margin-left:auto; color:var(--muted); font:10px/1.2 var(--num); }
.nxi-headline{ margin:0; font-size:15px; line-height:1.32; letter-spacing:-.008em; text-wrap:balance; }
.nxi-brief{ margin:7px 0 0; color:color-mix(in srgb,var(--text) 82%,var(--muted));
  font-size:12px; line-height:1.5; }
.nxi-why{ margin:9px 0 0; padding-left:9px; border-left:2px solid color-mix(in srgb,var(--nxi-accent) 38%,transparent);
  color:var(--muted); font-size:11.5px; line-height:1.45; }
.nxi-chips{ display:flex; flex-wrap:wrap; gap:5px; margin-top:10px; }
.nxi-chip{ border-radius:6px; padding:2px 6px; color:var(--muted); background:var(--nx-card2);
  border:1px solid var(--nx-hair); font-size:9.5px; }
.nxi-chip.market{ color:var(--text); font-family:var(--num); }
.nxi-chip.ticker{ color:var(--ink-link, var(--link)); font-family:var(--num); font-weight:750; }
/* A story losing attention should READ quieter than one gaining it — but not in
   colour: red/green inverts under the zh convention, and the market chip beside
   it is deliberately neutral. The dashed edge is the same "less" grammar the
   wire uses on a single-report node, and the chip's own words already say it. */
.nxi-chip.pace-cooling{ border-style:dashed; }
/* zh only: this card is still showing the English original because no cached
   twin has been attached yet. ONE marker per card (Law 4 — a constant belongs
   once), set in the topline with the card's other provenance, italic like the
   wire's original-source marker. */
.nxi-orig{ color:var(--muted); font-size:9.5px; font-style:italic; }
.nxi-more{ border-top:1px solid var(--nx-hair); }
.nxi-more>summary{ list-style:none; cursor:pointer; padding:9px 14px; display:flex; gap:8px;
  align-items:center; color:var(--muted); font-size:11px; font-weight:650; }
.nxi-more>summary::-webkit-details-marker{ display:none; }
.nxi-more>summary::after{ content:"+"; margin-left:auto; font-family:var(--num); }
.nxi-more[open]>summary::after{ content:"−"; }
.nxi-detail{ display:grid; gap:12px; padding:0 14px 14px; }
.nxi-detail h4{ margin:0 0 6px; color:var(--muted); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; }
.nxi-evidence{ display:flex; flex-direction:column; gap:5px; }
.nxi-source{ display:flex; gap:8px; align-items:flex-start; padding:7px 8px; border-radius:8px;
  background:var(--nx-card2); font-size:10.5px; }
.nxi-source a{ color:var(--ink-link, var(--link)); font-weight:650; }
.nxi-source span{ color:var(--muted); }

/* ---- the fold's two quiet receipt groups ----
   Source receipts above are filled pills (someone else published something).
   These two are drawn instead — a hairline spine and a left rule — so the three
   groups are told apart peripherally, and both stay visibly subordinate to the
   headline and the links. No hue, no motion: the wire below owns this page's
   one moving part, and every colour here would be a second one. */
.nxi-track{ display:grid; }
.nxi-tick{ position:relative; display:grid; grid-template-columns:32px 13px minmax(0,1fr);
  align-items:start; padding:3px 0; font-size:10.5px; line-height:1.5; }
.nxi-tick::before{ content:""; position:absolute; left:35px; top:0; bottom:0; width:1px;
  background:var(--nxi-spine); }
.nxi-tick:first-child::before{ top:10px; }
.nxi-tick:last-child::before{ bottom:auto; height:11px; }
/* A spine that STOPS at the last node claims that node is where the story
   began. When rows are clipped it is not, so the rule runs on and fades out —
   the wire's own way of saying the cut is depth, not the end of the thread. */
.nxi-track.is-clipped .nxi-tick:last-child::before{ bottom:-7px; height:auto;
  -webkit-mask-image:linear-gradient(to bottom,#000 38%,transparent 100%);
  mask-image:linear-gradient(to bottom,#000 38%,transparent 100%); }
.nxi-tick-age{ text-align:right; padding-right:9px; color:var(--muted);
  font:10px/1.6 var(--num); font-variant-numeric:tabular-nums;
  white-space:nowrap; overflow:hidden; }
.nxi-tick-node{ position:relative; }
/* FORM carries the kind, the label carries the meaning: a ROUND node is an
   arrival (the first report, a masthead joining), a SQUARE node is a change of
   state. Nothing here is load-bearing — every row says it in words too. */
.nxi-tick-node::after{ content:""; position:absolute; left:0; top:7px; width:7px; height:7px;
  box-sizing:border-box; border-radius:50%; z-index:1; background:var(--nx-card-solid);
  border:1.5px solid color-mix(in srgb,var(--text) 34%,transparent); }
.nxi-tick[data-kind="first_report"] .nxi-tick-node::after{
  background:color-mix(in srgb,var(--text) 52%,transparent);
  border-color:color-mix(in srgb,var(--text) 52%,transparent); }
.nxi-tick[data-kind="stage"] .nxi-tick-node::after{ border-radius:1px; }
.nxi-tick-label{ min-width:0; color:color-mix(in srgb,var(--text) 74%,transparent);
  overflow-wrap:anywhere; }
.nxi-tick-src{ color:var(--muted); }
.nxi-track-rest{ margin:3px 0 0 45px; color:var(--muted); font-size:10px; }
/* zh time units are two glyphs where English uses one letter ("28分钟" measures
   41px against "28m"), so the gutter is sized per language rather than clipped.
   Higher specificity than the 560px rule below on purpose: the string does not
   get shorter on a narrow screen.
   The track carries the age cell's own 9px padding-right (box-sizing is border-
   box repo-wide), so the 41px string needs 41+9 before any slack: at 46 the
   content box was 37px and the row silently clipped its LEADING glyph — an age
   that reads "8分钟" when the story is 28 minutes old, which is a wrong figure
   rather than a visibly cut one. 55/58/68 restores the intended 5px slack and
   keeps the spine and rest offsets on the same arithmetic (track + 3.5, +13). */
html[data-lang="zh"] .nxi-tick{ grid-template-columns:55px 13px minmax(0,1fr); }
html[data-lang="zh"] .nxi-tick::before{ left:58px; }
html[data-lang="zh"] .nxi-track-rest{ margin-left:68px; }
.nxi-facts{ display:flex; flex-direction:column; gap:6px; }
.nxi-fact{ padding-left:9px; border-left:2px solid color-mix(in srgb,var(--muted) 34%,transparent);
  font-size:10.5px; line-height:1.55; color:color-mix(in srgb,var(--text) 76%,transparent); }
/* house law: the mono face carries FIGURES, never words — "as of" stays in the
   text face and only the date crosses over. */
.nxi-asof{ color:var(--muted); font-size:9.5px; white-space:nowrap; }
.nxi-stampnum{ font-family:var(--num); font-variant-numeric:tabular-nums; }

.nxi-draft{ padding:10px; border-radius:10px; background:color-mix(in srgb,var(--nxi-accent) 6%,var(--nx-card2));
  border:1px solid color-mix(in srgb,var(--nxi-accent) 18%,var(--nx-hair)); }
.nxi-draft p{ margin:0; white-space:pre-wrap; font-size:11.5px; line-height:1.48; }
/* Which post this draft IS, in the same micro-caps voice as the group labels —
   read before the text, because a 280-character wire and a long post ask for
   very different review. */
.nxi-shape{ display:block; margin:0 0 5px; color:var(--muted); font-size:9px;
  font-weight:800; letter-spacing:.13em; text-transform:uppercase; }
.nxi-draftbar{ display:flex; gap:7px; align-items:center; margin-top:8px; color:var(--muted); font-size:9.5px; }
.nxi-copy{ appearance:none; margin-left:auto; cursor:pointer; border:1px solid color-mix(in srgb,var(--nxi-accent) 32%,transparent);
  background:transparent; color:var(--nxi-accent); border-radius:100px; padding:4px 9px; font:700 10px/1 inherit; }
.nxi-empty{ padding:24px 18px; color:var(--muted); font-size:12px; text-align:center; }
.nxi-state{ padding:20px; }
.nxi-state strong{ display:block; font-size:13px; }
.nxi-state p{ max-width:62ch; margin:5px 0 0; color:var(--muted); font-size:12px; line-height:1.5; }
.nxi-footer{ display:flex; justify-content:space-between; gap:12px; align-items:center; padding:10px 16px;
  border-top:1px solid var(--nx-hair); color:var(--muted); font-size:10.5px; }
.nxi-showmore{ appearance:none; border:0; background:transparent; color:var(--nxi-accent);
  font:700 11px/1 inherit; cursor:pointer; }
@media(max-width:760px){
  .nxi-head{ grid-template-columns:1fr; } .nxi-health{ min-width:0; }
  .nxi-list{ grid-template-columns:1fr; }
}
@media(max-width:560px){
  .nxi-head{ padding:16px; } .nxi-title{ font-size:19px; }
  .nxi-metrics{ grid-template-columns:repeat(2,1fr); }
  .nxi-metric:nth-child(2){ border-right:0; }
  .nxi-metric:nth-child(-n+2){ border-bottom:1px solid var(--nx-hair); }
  .nxi-toolbar-note{ width:100%; margin-left:0; }
  /* narrow the timeline's age gutter so the label column keeps its measure */
  .nxi-tick{ grid-template-columns:27px 13px minmax(0,1fr); }
  .nxi-tick::before{ left:30px; }
  .nxi-track-rest{ margin-left:40px; }
}

/* ======================= LIVE WIRE (B4b) =======================
   The page's ONE achromatic instrument. Everything above it is edited and
   colour-coded (ranked cards, tinted theme chips); the wire is the raw feed,
   so it is deliberately drained of hue. Colour appears in exactly two places —
   the state lamp and the newest item's node — and the panel is carried instead
   by its structure: a time gutter, an arrival spine, and a node whose FORM
   encodes how well the item is sourced (doctrine §7: non-verbal encodings that
   need no vocabulary). Hidden until the client has something honest to show. */
.nxw{ margin:0 0 18px; border-radius:var(--nx-radius); overflow:hidden;
  /* The page's --nx-hair is mixed off --line, which all but vanishes on the dark
     panel. The spine IS this panel, so it gets a --text-derived rule that holds
     its weight in both themes. */
  --nxw-spine:color-mix(in srgb, var(--text) 17%, transparent);
  --nxw-rule:color-mix(in srgb, var(--text) 11%, transparent);
  background:var(--nx-card); border:1px solid var(--nx-brd); box-shadow:var(--nx-shadow);
  -webkit-backdrop-filter:var(--nx-blur); backdrop-filter:var(--nx-blur); }
.nxw[hidden]{ display:none; }

/* header */
.nxw-hd{ padding:14px 16px 12px; border-bottom:1px solid var(--nxw-rule); }
.nxw-hd-main{ min-width:0; }
.nxw-eyebrow{ display:flex; align-items:center; gap:7px; font-size:10.5px; font-weight:700;
  letter-spacing:.16em; text-transform:uppercase; color:var(--muted); }
.nxw-lamp{ flex:0 0 auto; width:7px; height:7px; border-radius:50%;
  background:color-mix(in srgb,var(--text) 26%,transparent); }
.nxw[data-state="live"] .nxw-lamp{ background:var(--info);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--info) 20%,transparent); }
/* stale = the WIRE has gone quiet (newest item older than the stale window), not
   the daemon. The lamp hollows out, the newest-node accent is withdrawn, and the
   header says so in words — nothing here may keep signalling "live". */
.nxw[data-state="stale"] .nxw-lamp{ background:transparent;
  border:1.5px solid color-mix(in srgb,var(--text) 34%,transparent); }
.nxw-stale{ font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  color:color-mix(in srgb,var(--text) 52%,transparent); }
.nxw-title{ font-size:15px; font-weight:800; letter-spacing:-.012em; margin:6px 0 3px; }
.nxw-sub{ font-size:12px; color:var(--muted); max-width:64ch; }
.nxw-meta{ margin-top:6px; font-size:10.5px; color:var(--muted); }
.nxw-meta .num{ color:color-mix(in srgb,var(--text) 74%,transparent); font-weight:600; }

/* The wire has NO filter row of its own: the page's All/Markets/Macro/Fed/
   Companies segment sits directly above and drives both lists. A second,
   near-duplicate pill row six inches from the first is two controls for one job. */
/* an empty LANE is the reader's filter, not a dead wire — it reads as a sentence,
   not as a blank box, and names the way back */
.nxw-lanenone{ margin:0; padding:18px 16px 16px 74px; font-size:12.5px; color:var(--muted); }
@media(max-width:560px){ .nxw-lanenone{ padding-left:20px; } }

/* list + arrival spine */
/* The window is capped so the wire never pushes the ranked board off the page.
   The fade tells you the clip is depth, not a broken row. */
.nxw-list{ max-height:394px; overflow-y:auto; overscroll-behavior:contain; padding:4px 16px 8px 0;
  -webkit-mask-image:linear-gradient(to bottom, #000 calc(100% - 34px), transparent 100%);
  mask-image:linear-gradient(to bottom, #000 calc(100% - 34px), transparent 100%); }
.nxw-list::-webkit-scrollbar{ width:8px; }
.nxw-list::-webkit-scrollbar-thumb{ background:var(--nxw-spine); border-radius:100px; }
.nxw-item{ position:relative; display:flex; align-items:flex-start; padding:9px 0; }
.nxw-item::before{ content:""; position:absolute; left:62px; top:0; bottom:0; width:1px;
  background:var(--nxw-spine); }
.nxw-item:first-child::before{ top:11px; }
.nxw-item:last-child::before{ bottom:auto; height:11px; }
.nxw-age{ flex:0 0 52px; text-align:right; padding-right:11px; font-family:var(--num); font-size:10.5px;
  font-variant-numeric:tabular-nums; letter-spacing:-.02em; color:var(--muted); line-height:1.95;
  white-space:nowrap; overflow:hidden; }
.nxw-node{ flex:0 0 21px; align-self:stretch; position:relative; }
.nxw-node::after{ content:""; position:absolute; left:0; top:6px; width:9px; height:9px; box-sizing:border-box;
  border-radius:50%; border:1.5px solid color-mix(in srgb,var(--text) 40%,transparent);
  background:var(--nx-card-solid); z-index:1; }
/* node FORM = how well sourced: filled = matched to the original;
   ringed dot = two or more independent sources; dashed = a single report */
.nxw-node[data-corr="verified"]::after{ background:color-mix(in srgb,var(--text) 60%,transparent);
  border-color:color-mix(in srgb,var(--text) 60%,transparent); }
.nxw-node[data-corr="sources"]::before{ content:""; position:absolute; left:3px; top:9px;
  width:3px; height:3px; border-radius:50%; z-index:2;
  background:color-mix(in srgb,var(--text) 58%,transparent); }
.nxw-node[data-corr="reports"]::after{ border-style:dashed;
  border-color:color-mix(in srgb,var(--text) 32%,transparent); }
/* wording the client does not recognise: plain ring, neither filled nor dashed */
.nxw-node[data-corr="neutral"]::after{ border-style:solid; }
/* the single accent + the single motion: the newest arrival */
.nxw[data-state="live"] .nxw-item.is-newest .nxw-node::after{ border-color:var(--info);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--info) 15%,transparent); animation:nxwLamp 2.8s ease-in-out infinite; }
@keyframes nxwLamp{ 0%,100%{ opacity:1; } 50%{ opacity:.5; } }

.nxw-body{ flex:1; min-width:0; padding-left:12px; }
.nxw-text{ margin:0; font-size:13.5px; line-height:1.5; font-weight:500; color:var(--text);
  letter-spacing:-.003em; text-wrap:pretty; }
.nxw-line{ margin-top:5px; display:flex; flex-wrap:wrap; gap:8px; align-items:center;
  font-size:10.5px; color:var(--muted); }
.nxw-cls{ font-weight:700; letter-spacing:.09em; text-transform:uppercase;
  color:color-mix(in srgb,var(--text) 58%,transparent); }
.nxw-corr{ font-weight:600; }
.nxw-tapewrap{ display:inline-flex; align-items:baseline; gap:4px; }
.nxw-tape{ font-family:var(--num); font-variant-numeric:tabular-nums; font-weight:600;
  color:color-mix(in srgb,var(--text) 66%,transparent); }
.nxw-tapesfx{ opacity:.75; }
.nxw-orig{ font-style:italic; opacity:.8; }
.nxw-item.is-new{ animation:nxwIn .34s cubic-bezier(.22,.9,.3,1) both; }
@keyframes nxwIn{ from{ opacity:0; transform:translateY(-4px); } to{ opacity:1; transform:none; } }

/* honest non-list states: loading skeleton, quiet desk, signed-out, unreachable */
.nxw-state{ padding:20px 18px 22px 20px; }
.nxw-state .h{ font-size:13.5px; font-weight:700; color:var(--text); margin:0 0 4px; }
.nxw-state .s{ font-size:12px; color:var(--muted); margin:0; max-width:58ch; }
.nxw-state .cta{ appearance:none; font-family:inherit; margin-top:12px; cursor:pointer;
  display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--ink-info, var(--info));
  background:transparent; border:1px solid color-mix(in srgb,var(--info) 40%,transparent);
  padding:7px 14px; border-radius:100px; transition:background .16s, border-color .16s; }
.nxw-state .cta:hover{ background:color-mix(in srgb,var(--info) 10%,transparent);
  border-color:color-mix(in srgb,var(--info) 65%,transparent); }
/* footer: one footnote + the quiet X handles */
.nxw-ft{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; padding:11px 16px;
  border-top:1px solid var(--nxw-rule); background:color-mix(in srgb,var(--panel2) 40%,transparent); }
.nxw-note{ flex:1 1 260px; font-size:11px; color:var(--muted); }
.nxw-social{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.nxw-social>span{ font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted); margin-right:1px; }
.nxw-x{ display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700;
  font-family:var(--num); color:color-mix(in srgb,var(--text) 80%,transparent); white-space:nowrap;
  padding:5px 11px; border-radius:100px; border:1px solid var(--nxw-rule);
  transition:color .16s, border-color .16s, background .16s; }
.nxw-x:hover{ color:var(--text); border-color:var(--nx-brd);
  background:color-mix(in srgb,var(--text) 6%,transparent); }
.nxw-x:focus-visible{ outline:2px solid var(--info); outline-offset:2px; }
.nxw-x svg{ width:10px; height:10px; flex:0 0 auto; }

@media(max-width:560px){
  .nxw-item::before{ left:52px; }
  .nxw-age{ flex-basis:44px; }
  .nxw-text{ font-size:13px; }
}
@media(prefers-reduced-motion:reduce){
  .nxw-item.is-new{ animation:none; }
  .nxw .nxw-item.is-newest .nxw-node::after{ animation:none; }
}
@media(pointer:coarse){ .nxw .nxw-item.is-newest .nxw-node::after{ animation:none; } }

/* ---- responsive ---- */
@media(max-width:900px){
  .nx-hero{ grid-template-columns:1fr; gap:26px; }
  .nx-movers-hd{ padding-top:2px; }
  .nx-cols{ grid-template-columns:1fr; }
  .nx-rail{ position:static; }
}
@media(max-width:560px){
  .nx-head{ padding-top:4px; margin-bottom:18px; }
  .nx-lead-title{ overflow-wrap:anywhere; }
  .nx-story-title{ font-size:17px; }
  .nx-controls{ gap:8px; }
  .nx-search{ order:3; max-width:none; flex-basis:100%; margin-left:0; }
  .nx-pulse-sent{ margin-left:0; flex-basis:100%; }
}
/* Motion: there is none left to gate on this page. The aurora's 12s opacity loop
   and the lead card's 4s sentiment "breathe" were the only animations here, and
   both are gone — the strongest form of reduced-motion compliance is having
   nothing to disable. Any animation added back needs its own kill block. */

