/* ═══ JagSim News desk — ONE implementation, two mounts ═══════════════════════
   Extracted 2026-08-18 from the inline <style> block in news-desk.html so the
   News desk can live INSIDE the Research page (owner: "one pro area … users have
   to flip back and forth for research and news") without the markup or the styles
   being copied. Both surfaces now load THIS file:

     • /research  — News is a mode of the Research desk ([data-ria-pane="news"])
     • /news-desk — the standalone desk, unchanged for anyone with the old link

   EVERY rule is scoped under `.jag-newsdesk`, because the Research page ships its
   own `.lookup`, `.chip`, `.wrap` and friends and the two vocabularies overlap.
   The scope wrapper is on <main> in news-desk.html and on the News pane in
   research.html. Rules that keyed off `body.news-free` keep that hook and gain the
   scope in the middle (`body.news-free .jag-newsdesk .story…`) so the free-tier
   frost still works on both pages.

   The desk's colour vars used to come from news-desk.html's :root. Research.html's
   :root defines DIFFERENT values for some of the same names (--green-dark there is
   the light #0f9d68), so the vars are re-declared on the scope root below and the
   desk paints identically on both pages. Do not delete that block.

   Page chrome (body, .wrap, h1, .lede, .jag-foot) deliberately stayed inline in
   news-desk.html — the Research page has its own shell for all of it.
   ══════════════════════════════════════════════════════════════════════════ */
.jag-newsdesk {
  --bg: #f5f7f9; --surface: #fff; --line: #e4e8ee; --text: #0f172a; --muted: #5b6675;
  --green: var(--jag-green); --green-dark: #00563d; --green-soft: #e8f7ef; --ink: #fff;
  /* Burnt-orange Pro accent: every upgrade / "Unlock with Pro" CTA uses this, never the
     primary green, so it never blends into a green Trade/Buy action next to it. */
  --pro: #BB5C2D; --pro-dark: #a04f26;
  color: var(--text);
}

.jag-newsdesk .desk-grid { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: 20px; align-items: start; margin-top: 12px; }
.jag-newsdesk .news-atf { margin-bottom: 8px; }
.jag-newsdesk .news-atf .chips { margin-bottom: 10px; }
.jag-newsdesk .news-atf .lookup { margin-bottom: 10px; }
.jag-newsdesk .news-atf .news-filters { margin-bottom: 4px; }
.jag-newsdesk .pulse-card {
 background: linear-gradient(135deg, #eefaf3 0%, #e3f4ee 100%);
 color: var(--text); border: 1px solid #cdeadd; border-left: 4px solid var(--green);
 border-radius: 16px; padding: 18px 20px; margin: 0 0 22px;
 box-shadow: 0 10px 26px rgba(0, 110, 78, .08); text-align: left;
 }
.jag-newsdesk .pulse-card .k { font-size: 11px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--green-dark); }
.jag-newsdesk .pulse-card .v { margin-top: 10px; font-size: 18px; font-weight: 800; line-height: 1.35; color: var(--text); }
.jag-newsdesk .pulse-card .s { margin-top: 8px; font-size: 12px; color: var(--muted); }
.jag-newsdesk .chips,
.jag-newsdesk .recent-row,
.jag-newsdesk .trend-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; align-items: center; }
.jag-newsdesk .recent-label,
.jag-newsdesk .trend-label {
 font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); margin-right: 4px;
 }
.jag-newsdesk .chip {
 border: 1px solid var(--line); background: #fff; border-radius: 999px; padding: 8px 14px;
 font-size: 13px; font-weight: 700; color: var(--muted); cursor: pointer; font-family: inherit;
 }
.jag-newsdesk .chip:hover { border-color: #bfe6d2; color: var(--green-dark); }
.jag-newsdesk .chip.on { background: var(--green-soft); border-color: #bfe6d2; color: var(--green-dark); }
.jag-newsdesk .chip.recent,
.jag-newsdesk .chip.trend { padding: 6px 12px; font-size: 12px; }
.jag-newsdesk .lookup { display: flex; gap: 10px; margin: 0 0 14px; }
.jag-newsdesk .lookup input {
 flex: 1; height: 46px; border: 1px solid var(--line); border-radius: 11px; padding: 0 14px;
 font-size: 15px; text-transform: uppercase; letter-spacing: .02em; background: #fff;
 }
.jag-newsdesk .lookup input:focus { outline: none; border-color: var(--green); box-shadow: 0 0 0 3px rgba(0, 110, 78, .15); }
.jag-newsdesk .lookup button {
 height: 46px; padding: 0 18px; border: 0; border-radius: 11px; background: var(--green);
 color: var(--ink); font-weight: 800; cursor: pointer; font-family: inherit;
 }
.jag-newsdesk .story-list { display: flex; flex-direction: column; gap: 10px; }
.jag-newsdesk .story {
 display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 14px; align-items: start;
 background: var(--surface); border: 1px solid var(--line); border-radius: 14px;
 padding: 16px 18px;
 }
/* Thumbnail (left column). Branded tile when the feed has no image or it fails to load. */
.jag-newsdesk .story .thumb { position: relative; width: 92px; height: 92px; border-radius: 10px; overflow: hidden; display: block; flex: 0 0 auto; text-decoration: none; background: linear-gradient(135deg, #eef4f1 0%, #e2ede8 100%); }
.jag-newsdesk .story .thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.jag-newsdesk .story .thumb .thumb-ph { position: absolute; inset: 0; display: none; align-items: center; justify-content: center; font-size: 15px; font-weight: 900; letter-spacing: .02em; color: var(--green-dark); }
.jag-newsdesk .story .thumb.noimg { background: linear-gradient(135deg, #e8f7ef 0%, #dcefe6 100%); border: 1px solid #cdeadd; }
.jag-newsdesk .story .thumb.noimg .thumb-ph { display: flex; }
.jag-newsdesk .story .story-body { min-width: 0; }
.jag-newsdesk .story .meta .ago { color: var(--muted); text-transform: none; letter-spacing: 0; font-weight: 700; }
/* Sentiment chip: the feed's own read, color-coded. A status indicator, never a CTA. */
.jag-newsdesk .story .sent-chip { display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px; font-size: 10px; font-weight: 900; letter-spacing: .04em; text-transform: uppercase; }
.jag-newsdesk .story .sent-chip.pos { color: #0b6b4f; background: #e3f6ee; border: 1px solid #bfe6d2; }
.jag-newsdesk .story .sent-chip.neg { color: #b3241d; background: #fbe8e6; border: 1px solid #f2c9c5; }
.jag-newsdesk .story .sent-chip.neu { color: #51607a; background: #eef1f4; border: 1px solid #e0e6ee; }
.jag-newsdesk .story .meta { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
.jag-newsdesk .story .meta .src { color: var(--muted); }
/* Compliance-safe event-type tags, light + on-brand, never a direction. */
.jag-newsdesk .story .event-tag {
 display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px;
 font-size: 10px; font-weight: 900; letter-spacing: .05em; text-transform: uppercase;
 background: var(--green-soft); color: var(--green-dark); border: 1px solid #bfe6d2;
 }
.jag-newsdesk .story .event-tag.et-manda { background: #eef0ff; color: #34379c; border-color: #d3d7fb; }
.jag-newsdesk .story .event-tag.et-legal { background: #fbeee6; color: #8a4620; border-color: #f0d6c4; }
.jag-newsdesk .story .event-tag.et-dividend { background: #e3f4f1; color: #0b6b57; border-color: #bfe6dd; }
/* [hidden] MUST WIN. renderNewsCards emits this pill hidden and hydrateClosePills()
   only fills + reveals it when the server says the market is closed. `display:inline-flex`
   here outranks the [hidden] attribute's UA `display:none`, so on every open-market day
   an EMPTY grey pill rendered on every card that had a stock primary. Found 2026-08-22
   in the browser, not the markup — the attribute was correct the whole time. */
.jag-newsdesk .story .close-pill[hidden] { display: none; }
.jag-newsdesk .story .close-pill {
 display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px;
 font-size: 10px; font-weight: 800; letter-spacing: .02em; text-transform: none;
 background: #eef1f4; color: #51607a; border: 1px solid #e0e6ee;
 }
.jag-newsdesk .story .title { margin-top: 8px; font-size: 17px; font-weight: 800; line-height: 1.3; color: var(--text); text-decoration: none; display: block; overflow-wrap: break-word; min-width: 0; }
.jag-newsdesk .story .title:hover { color: var(--green-dark); }
.jag-newsdesk .story .teaser { margin-top: 8px; font-size: 13.5px; line-height: 1.45; color: var(--muted); max-width: 62ch; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.jag-newsdesk .story .tickers { margin-top: 10px; display: flex; flex-wrap: wrap; gap: 6px; }
.jag-newsdesk .story .tickers a {
 font-size: 11px; font-weight: 800; text-decoration: none; color: var(--green-dark);
 background: var(--green-soft); padding: 3px 8px; border-radius: 6px;
 }
/* Filter bar: My tickers toggle + event-type chips. */
.jag-newsdesk .news-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 14px; }
.jag-newsdesk .filters-label { font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); margin-right: 2px; }
.jag-newsdesk .event-sep { width: 1px; height: 22px; background: var(--line); margin: 0 2px; }
.jag-newsdesk .story .actions { display: flex; flex-direction: column; gap: 8px; align-items: stretch; min-width: 118px; }
.jag-newsdesk .story .actions a {
 text-align: center; font-size: 12px; font-weight: 800; text-decoration: none; border-radius: 8px; padding: 9px 10px;
 }
.jag-newsdesk .story .actions .trade { background: var(--green); color: var(--ink); }
.jag-newsdesk .story .actions .read { background: #fff; border: 1px solid var(--line); color: var(--text); }
.jag-newsdesk .practice-rail {
 position: sticky; top: 88px;
 background: #fff; color: var(--text);
 border: 1px solid var(--line); border-top: 4px solid var(--green);
 border-radius: 16px; padding: 20px 18px;
 box-shadow: 0 12px 30px rgba(15, 23, 42, .06);
 }
.jag-newsdesk .practice-rail .k { font-size: 11px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--green-dark); }
.jag-newsdesk .practice-rail .sym { margin-top: 10px; font-size: 22px; font-weight: 900; letter-spacing: -.02em; color: var(--green-dark); }
.jag-newsdesk .practice-rail .hint { margin-top: 8px; font-size: 13px; line-height: 1.45; color: var(--muted); }
.jag-newsdesk .practice-rail a.cta {
 display: block; margin-top: 16px; text-align: center; text-decoration: none;
 background: var(--green); color: var(--ink); font-weight: 900; font-size: 14px;
 padding: 12px 14px; border-radius: 10px;
 }
.jag-newsdesk .practice-rail .steps { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line); }
.jag-newsdesk .practice-rail .steps li { list-style: none; font-size: 12px; color: var(--text); line-height: 1.45; margin-bottom: 8px; padding-left: 14px; position: relative; }
.jag-newsdesk .practice-rail .steps li::before { content: ''; position: absolute; left: 0; top: 6px; width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
.jag-newsdesk .desk-rail { display: flex; flex-direction: column; gap: 16px; }
/* Today's brief */
.jag-newsdesk .news-brief { background: linear-gradient(135deg, #f4fbf8 0%, #fff7f0 100%); border: 1px solid #dbe9e2; border-radius: 16px; padding: 16px 18px; margin-bottom: 14px; }
.jag-newsdesk .news-brief .nb-top { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; }
.jag-newsdesk .news-brief .nb-k { font-size: 11px; font-weight: 900; letter-spacing: .08em; text-transform: uppercase; color: var(--green-dark); }
.jag-newsdesk .news-brief .nb-date { font-size: 12.5px; font-weight: 700; color: var(--muted); }
.jag-newsdesk .news-brief .nb-session { font-size: 10px; font-weight: 900; letter-spacing: .05em; text-transform: uppercase; padding: 2px 8px; border-radius: 999px; border: 1px solid transparent; }
.jag-newsdesk .news-brief .nb-session.open { color: #0b6b57; background: #e3f4f1; border-color: #bfe6dd; }
.jag-newsdesk .news-brief .nb-session.closed { color: #8a4620; background: #fbeee6; border-color: #f0d6c4; }
.jag-newsdesk .news-brief .nb-head { margin-top: 10px; font-size: 18px; font-weight: 800; line-height: 1.34; color: var(--text); }
.jag-newsdesk .news-brief .nb-mine { margin-top: 12px; font-size: 13px; color: var(--text); display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.jag-newsdesk .news-brief .nb-mine-count strong { color: var(--green-dark); }
.jag-newsdesk .news-brief .nb-mine-btn { border: 1px solid var(--green); background: #fff; color: var(--green-dark); font-weight: 800; font-size: 12px; padding: 5px 11px; border-radius: 8px; cursor: pointer; }
.jag-newsdesk .news-brief .nb-mine-btn:hover { background: #e7f4ef; }
/* Pro daily-digest teaser */
.jag-newsdesk .news-digest-teaser { background: linear-gradient(135deg, #fff7f0 0%, #f4fbf8 100%); border: 1px solid #ecd9c8; border-radius: 16px; padding: 18px 16px; }
.jag-newsdesk .news-digest-teaser .ndt-badge { display: inline-block; font-size: 10px; font-weight: 900; letter-spacing: .06em; color: #fff; background: var(--pro); padding: 3px 8px; border-radius: 999px; }
.jag-newsdesk .news-digest-teaser .ndt-h { margin-top: 10px; font-size: 15px; font-weight: 800; color: var(--text); }
.jag-newsdesk .news-digest-teaser .ndt-p { margin-top: 6px; font-size: 12.5px; line-height: 1.5; color: var(--muted); }
.jag-newsdesk .news-digest-teaser .ndt-cta { display: block; margin-top: 14px; text-align: center; text-decoration: none; background: var(--pro); color: var(--ink); font-weight: 900; font-size: 13.5px; padding: 11px 14px; border-radius: 10px; }
.jag-newsdesk .news-digest-teaser .ndt-cta:hover { background: var(--pro-dark); }
.jag-newsdesk .empty,
.jag-newsdesk .loading { padding: 28px; text-align: center; color: var(--muted); font-size: 14px; }
.jag-newsdesk .asof { margin-top: 16px; font-size: 12px; color: #8a97a6; text-align: center; }
/* View tabs: Top news vs My tickers (news on holdings + watchlist). */
.jag-newsdesk .news-tabs { display: inline-flex; gap: 6px; background: #eef2f4; border: 1px solid var(--line); border-radius: 11px; padding: 4px; margin: 0 0 6px; }
.jag-newsdesk .news-tabs-hint,
.jag-newsdesk .lookup-hint { margin: 0 0 10px; font-size: 12px; font-weight: 600; color: var(--muted); line-height: 1.4; }
.jag-newsdesk .news-ticker-doss { display:flex; flex-wrap:wrap; align-items:center; gap:8px 12px; margin:0 0 12px; padding:10px 12px; background:#fff; border:1px solid var(--line); border-radius:12px; }
.jag-newsdesk .news-ticker-doss[hidden] { display:none !important; }
.jag-newsdesk .ntd-id { display:flex; flex-direction:column; gap:2px; min-width:0; }
.jag-newsdesk .ntd-k { font-size:10px; font-weight:800; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); }
.jag-newsdesk .ntd-sym { font-size:18px; font-weight:900; letter-spacing:-.02em; color:var(--text); }
.jag-newsdesk .ntd-acts { display:flex; flex-wrap:wrap; gap:8px; margin-left:auto; }
.jag-newsdesk .ntd-cta { display:inline-flex; align-items:center; text-decoration:none; font-weight:800; font-size:13px; padding:8px 12px; border-radius:9px; background:var(--jag-green); color:#fff; }
.jag-newsdesk .ntd-cta.ntd-ghost { background:#fff; color:#0f1720; border:1px solid var(--line); }
.jag-newsdesk .ntd-note { flex:1 1 100%; margin:0; font-size:11px; font-weight:700; color:var(--muted); }
.jag-newsdesk .news-tab { font-family: inherit; border: 0; background: transparent; border-radius: 8px; padding: 8px 16px; font-size: 13px; font-weight: 800; color: var(--muted); cursor: pointer; }
.jag-newsdesk .news-tab:hover:not(:disabled) { color: var(--green-dark); }
.jag-newsdesk .news-tab[data-view="top"].on { background: var(--jag-green); color: #fff; box-shadow: 0 1px 3px rgba(0,110,78,.28); }
.jag-newsdesk .news-tab[data-view="mine"].on { background: #E86B1F; color: #fff; box-shadow: 0 1px 3px rgba(232,107,31,.28); }
.jag-newsdesk .news-tab:disabled { opacity: .5; cursor: not-allowed; }
.jag-newsdesk .news-scope {
   display: inline-flex; align-items: center; gap: 8px; margin: 0 0 12px; padding: 7px 12px;
   border-radius: 999px; font-size: 12px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
 }
.jag-newsdesk .news-scope[data-view="top"] { background: #e8f7ef; color: var(--jag-green); border: 1px solid #bfe6d2; }
.jag-newsdesk .news-scope[data-view="mine"] { background: #fff1e8; color: #E86B1F; border: 1px solid #f0c4a0; }
.jag-newsdesk #newsFeed[data-view="top"] { border-left: 3px solid var(--jag-green); padding-left: 14px; }
.jag-newsdesk #newsFeed[data-view="mine"] { border-left: 3px solid #E86B1F; padding-left: 14px; }
/* Sector filter. */
.jag-newsdesk .sector-wrap { display: inline-flex; align-items: center; gap: 7px; }
.jag-newsdesk .sector-select { font-family: inherit; font-size: 12.5px; font-weight: 700; color: var(--text); border: 1px solid var(--line); background: #fff; border-radius: 999px; padding: 7px 12px; cursor: pointer; }
.jag-newsdesk .sector-select:focus { outline: none; border-color: var(--green); box-shadow: 0 0 0 3px rgba(0, 110, 78, .15); }
/* Trending chip mention-count. */
.jag-newsdesk .chip.trend .trend-count { margin-left: 6px; font-size: 10px; font-weight: 900; color: #8a97a6; background: #eef2f4; border-radius: 999px; padding: 1px 6px; }
/* News mood gauge: share of the feed's own sentiment tags for the current scope. */
.jag-newsdesk .news-mood { background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: 14px 16px; margin: 0 0 14px; }
.jag-newsdesk .news-mood .nm-top { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; }
.jag-newsdesk .news-mood .nm-k { font-size: 11px; font-weight: 900; letter-spacing: .08em; text-transform: uppercase; color: var(--green-dark); }
.jag-newsdesk .news-mood .nm-scope { font-size: 12px; font-weight: 700; color: var(--muted); }
.jag-newsdesk .news-mood .nm-headline { margin-top: 8px; font-size: 15px; font-weight: 700; color: var(--text); }
.jag-newsdesk .news-mood .nm-headline strong { font-size: 20px; font-weight: 900; color: var(--green-dark); }
.jag-newsdesk .news-mood .nm-sub { color: var(--muted); font-weight: 600; font-size: 12.5px; }
.jag-newsdesk .news-mood .nm-bar { display: flex; height: 8px; border-radius: 999px; overflow: hidden; margin-top: 10px; background: #eef1f4; }
.jag-newsdesk .news-mood .nm-bar .seg { min-width: 0; }
.jag-newsdesk .news-mood .nm-bar .seg.pos { background: #1e9e6f; }
.jag-newsdesk .news-mood .nm-bar .seg.neu { background: #c4ccd6; }
.jag-newsdesk .news-mood .nm-bar .seg.neg { background: #d1362f; }
.jag-newsdesk .news-mood .nm-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; margin-top: 9px; font-size: 11px; font-weight: 800; }
.jag-newsdesk .news-mood .nm-legend .k { display: inline-flex; align-items: center; gap: 5px; color: var(--muted); }
.jag-newsdesk .news-mood .nm-legend .k::before { content: ''; width: 8px; height: 8px; border-radius: 50%; }
.jag-newsdesk .news-mood .nm-legend .pos::before { background: #1e9e6f; }
.jag-newsdesk .news-mood .nm-legend .neu::before { background: #c4ccd6; }
.jag-newsdesk .news-mood .nm-legend .neg::before { background: #d1362f; }
.jag-newsdesk .news-mood .nm-note { margin-top: 9px; font-size: 11px; color: #8a97a6; }
@media (max-width: 900px) {
  .jag-newsdesk .desk-grid { grid-template-columns: 1fr; }
  .jag-newsdesk .desk-rail { order: 0; }
  .jag-newsdesk .practice-rail { display: none !important; }
  .jag-newsdesk .story { grid-template-columns: auto 1fr; }
  .jag-newsdesk .story .thumb { width: 68px; height: 68px; }
  .jag-newsdesk .story .actions { grid-column: 1 / -1; flex-direction: row; }
}
/* Owner 2026-08-11: remove the "Trade on Chart / any ticker" promo card so
    Today's Brief is the first thing on the desk (mobile + desktop). */
.jag-newsdesk .practice-rail { display: none !important; }
/* FOMO gate: two bait headlines stay readable so the desk still feels alive.
    The rest of the feed frosts. Trade on Chart stays. Opening the article is Pro. */
.jag-newsdesk .news-lock { display: none; }
body.news-free .jag-newsdesk .story:not(.news-bait) .title,
body.news-free .jag-newsdesk .story:not(.news-bait) .teaser,
body.news-free .jag-newsdesk .story:not(.news-bait) .thumb {
   filter: blur(8px); opacity: .72; pointer-events: none; user-select: none;
 }
body.news-free .jag-newsdesk .story:not(.news-bait) .news-lock { display: flex; align-items: center; flex-wrap: wrap; gap: 9px; margin-top: 9px; }
.jag-newsdesk .news-lock .nl-badge { font-size: 10px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--pro); background: #fbeee7; border: 1px solid #f0dbc9; border-radius: 999px; padding: 3px 9px; }
.jag-newsdesk .news-lock .nl-text { font-size: 12.5px; font-weight: 600; color: var(--muted); }
.jag-newsdesk .news-lock .nl-btn { font-size: 12px; font-weight: 800; text-decoration: none; color: #fff; background: var(--pro); border-radius: 8px; padding: 6px 13px; }
.jag-newsdesk .news-lock .nl-btn:hover { background: var(--pro-dark); }
/* Side rails: calendar + ratings. Two bait rows clear, rest frosted. */
.jag-newsdesk .news-side-card {
   background: #fff; border: 1px solid var(--line); border-radius: 16px; padding: 16px 16px 12px;
 }
.jag-newsdesk .news-side-card .ns-k { font-size: 11px; font-weight: 900; letter-spacing: .08em; text-transform: uppercase; color: var(--green-dark); margin-bottom: 10px; }
.jag-newsdesk .news-side-card .ns-list { display: flex; flex-direction: column; gap: 2px; }
.jag-newsdesk .news-side-row {
   display: grid; grid-template-columns: 56px minmax(0,1fr); gap: 8px; align-items: baseline;
   text-decoration: none; color: var(--text); padding: 7px 6px; border-radius: 8px; font-size: 12.5px;
 }
.jag-newsdesk .news-side-row:hover { background: #f4f8f6; }
.jag-newsdesk .news-side-row .ns-sym { font-weight: 900; color: var(--green-dark); }
.jag-newsdesk .news-side-row .ns-main { color: #334155; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.jag-newsdesk .news-side-card .ns-note { margin: 10px 0 0; font-size: 11px; color: #8a97a6; line-height: 1.4; }
body.news-free .jag-newsdesk .news-side-row:not(.news-side-bait) { filter: blur(6px); pointer-events: none; user-select: none; opacity: .7; }
body.news-free .jag-newsdesk #newsDigestTeaser .ndt-p { filter: blur(5px); user-select: none; }
/* Bookmark / save (Pro feature). Small outline bookmark pinned to the top-right of
    each card as the first child of the actions column, so it never overlaps Trade/Read.
    Saved state uses a neutral slate fill (green stays free-only, orange stays for CTAs). */
.jag-newsdesk .story .actions .news-save {
 align-self: flex-end; order: -1; flex: 0 0 auto;
 display: inline-flex; align-items: center; justify-content: center;
 width: 30px; height: 30px; padding: 0; margin: 0 0 2px;
 border: 1px solid var(--line); border-radius: 8px; background: #fff;
 color: #94a3b3; cursor: pointer; font-family: inherit;
 }
.jag-newsdesk .story .actions .news-save:hover { border-color: #cdd6df; color: #51607a; }
.jag-newsdesk .story .actions .news-save svg { width: 15px; height: 15px; display: block; fill: none; stroke: currentColor; stroke-width: 2; stroke-linejoin: round; }
.jag-newsdesk .story .actions .news-save.is-saved { color: #334155; border-color: #cdd6df; background: #eef2f6; }
.jag-newsdesk .story .actions .news-save.is-saved svg { fill: currentColor; stroke: currentColor; }
/* Read locked for free users: the external article is Pro-only, so the Read button
    becomes a burnt-orange locked control that routes to the Unlock-with-Pro path. */
.jag-newsdesk .story .actions .read.read-locked { display: inline-flex; align-items: center; justify-content: center; gap: 5px; background: #fff; border-color: #f0dbc9; color: var(--pro); }
.jag-newsdesk .story .actions .read.read-locked svg { width: 12px; height: 12px; fill: currentColor; flex: 0 0 auto; }
/* Slim Unlock strip AFTER the feed — Today's Brief stays the hero at the top. */
.jag-newsdesk .news-unlock-hero {
 background: linear-gradient(135deg, #fff3ea 0%, #fbe8db 100%);
 border: 1px solid #ecd0bb; border-left: 4px solid var(--pro);
 border-radius: 16px; padding: 14px 16px; margin: 16px 0 8px;
 box-shadow: 0 6px 16px rgba(187, 92, 45, .08);
 display: flex; align-items: center; flex-wrap: wrap; gap: 12px 18px;
 }
.jag-newsdesk .news-unlock-hero .uh-main { flex: 1 1 260px; }
.jag-newsdesk .news-unlock-hero .uh-badge { display: inline-block; font-size: 10px; font-weight: 900; letter-spacing: .06em; color: #fff; background: var(--pro); padding: 3px 8px; border-radius: 999px; }
.jag-newsdesk .news-unlock-hero .uh-h { margin-top: 8px; font-size: 17px; font-weight: 900; letter-spacing: -.01em; color: var(--text); }
.jag-newsdesk .news-unlock-hero .uh-p { margin-top: 4px; font-size: 13px; line-height: 1.5; color: var(--muted); max-width: 62ch; }
.jag-newsdesk .news-unlock-hero .uh-cta { display: inline-flex; align-items: center; text-decoration: none; background: var(--pro); color: #fff; font-weight: 900; font-size: 14px; padding: 12px 18px; border-radius: 10px; white-space: nowrap; }
.jag-newsdesk .news-unlock-hero .uh-cta:hover { background: var(--pro-dark); }
body.intel-news-searchlock #newsQ,
body.intel-news-searchlock #newsLookup button { cursor: not-allowed; }
body.intel-news-searchlock #newsLookup { opacity: .88; }
/* Slim unlock strip sits WITH the brief — never replaces today's headlines. */
body.news-free .jag-newsdesk #newsUnlockHero { margin-bottom: 14px; }
@media (max-width: 900px) {
  .jag-newsdesk .story .actions .news-save { align-self: center; }
}


/* ═══ THE FILTER DISCLOSURE ════════════════════════════════════════════════════
   Only the NEW controls live here. js/news-desk.js injects a <style> block at
   runtime that already owns .news-more-filters, .nmf-grp, .nmf-k, .news-textsearch,
   .nmf-save, .nmf-toggle and .news-saved -- including dark rules for BOTH theme
   roots, because this desk renders on /news (:root[data-theme]) and inside Deep Dive
   (html[data-intel-theme]).

   I first added a second, token-based copy of those rules here. That was wrong: two
   sources styling one element is worse than either alone, and the tokens would not
   have covered the second theme root the way the injected block deliberately does.
   Removed. This file adds the disclosure button, its count badge and the panel, and
   follows the same both-selectors pattern rather than inventing a third. */
.jag-newsdesk .nmf-disclose {
  height: 36px; box-sizing: border-box; display: inline-flex; align-items: center; gap: 7px;
  font: inherit; font-size: 13px; font-weight: 800; white-space: nowrap; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 10px; background: #fff; color: #0f172a;
  padding: 0 12px;
}
.jag-newsdesk .nmf-disclose:hover { border-color: var(--green); color: var(--green); }
.jag-newsdesk .nmf-disclose:focus-visible { outline: 2px solid var(--green); outline-offset: 1px; }
/* The chevron turns, so the control says whether it is open without reading the label. */
.jag-newsdesk .nmf-disclose::after {
  content: ""; width: 7px; height: 7px; margin-left: 1px;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px); transition: transform .15s ease;
}
.jag-newsdesk .nmf-disclose[aria-expanded="true"]::after {
  transform: rotate(-135deg) translate(-2px, -2px);
}
/* A COUNT, NOT A DOT. "Filters" with three of them silently on is the state this page
   must never reach: the feed is narrowed and the reason is behind a button. */
.jag-newsdesk .nmf-count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  background: var(--green); color: #fff; font-size: 11px; font-weight: 800;
  font-variant-numeric: tabular-nums;
}
.jag-newsdesk .news-filter-panel {
  display: flex; flex-direction: column; gap: 8px;
  margin: 8px 0 0; padding: 12px; border: 1px solid #e4e8ee;
  border-radius: 12px; background: #fbfcfd;
}
.jag-newsdesk .news-filter-panel[hidden] { display: none; }
/* A DISPLAY VALUE BEATS THE UA'S [hidden] RULE. Setting display:inline-flex above meant
   `badge.hidden = true` no longer hid anything, so the button read "Filters 0" with no
   filters on -- a count of nothing, which is worse than no badge. Any element given an
   explicit display needs its own [hidden] escape. */
.jag-newsdesk .nmf-count[hidden] { display: none !important; }
.jag-newsdesk .news-filter-panel .news-more-filters,
.jag-newsdesk .news-filter-panel .news-saved { margin: 0; }
/* BOTH theme roots, for the reason the injected block documents: naming only the first
   leaves these light-on-light inside the dark Deep Dive desk. */
:root[data-theme="dark"] .jag-newsdesk .nmf-disclose,
html[data-intel-theme="dark"] .jag-newsdesk .nmf-disclose {
  background: #0f1720; border-color: #24303c; color: #e8eef4;
}
:root[data-theme="dark"] .jag-newsdesk .news-filter-panel,
html[data-intel-theme="dark"] .jag-newsdesk .news-filter-panel {
  background: #0f1720; border-color: #24303c;
}
:root[data-theme="dark"] .jag-newsdesk .nmf-count,
html[data-intel-theme="dark"] .jag-newsdesk .nmf-count { background: #3dce8a; color: #06231a; }
@media (prefers-reduced-motion: reduce) {
  .jag-newsdesk .nmf-disclose::after { transition: none; }
}

/* ═══ THE PANEL, TIGHTENED ═════════════════════════════════════════════════════
   Owner: "you need to make this filter look better." Opened, it was a pale box with
   a stray vertical rule after the sector select, a dead gap where the event chips
   should have sat beside it, and rows spaced like paragraphs. Four fixes, all layout:
   the sector select and the event chips share one line; the leftover .event-sep
   divider is dropped (it separated two things that are now adjacent and reads as a
   stray cursor); row spacing comes down to a filter-bar rhythm; and the chip rows
   moved inside get the same treatment as the rest. */
.jag-newsdesk .news-filter-panel { gap: 10px; padding: 12px 14px; }
.jag-newsdesk .news-filter-panel .event-sep { display: none; }
/* Sector + event chips on one row instead of a select, a gap, then chips. */
.jag-newsdesk .news-filter-panel > .sector-wrap,
.jag-newsdesk .news-filter-panel > #newsEventChips { display: inline-flex; }
.jag-newsdesk .news-filter-panel > .sector-wrap {
  align-items: center; gap: 8px; margin-right: 4px;
}
.jag-newsdesk .news-filter-panel #newsEventChips { flex-wrap: wrap; gap: 6px; margin: 0; }
/* The chip rows that moved in keep the label-then-chips shape but stop being their own
   blocks with block margins. */
.jag-newsdesk .news-filter-panel .recent-row,
.jag-newsdesk .news-filter-panel .trend-row,
.jag-newsdesk .news-filter-panel .news-saved {
  margin: 0; gap: 6px 8px; align-items: center;
}
/* Everything on the panel's own line-height, so a select, a chip and a checkbox do not
   each set their own rhythm. */
.jag-newsdesk .news-filter-panel .chip { padding: 6px 11px; font-size: 12.5px; }
