/* ============================================================
   NEPSE DECODE — Editorial chrome (D2): header + footer
   Consumes css/nd-editorial-theme.css tokens. Single-row 60px
   sticky header, mega-dropdowns, search combobox, market-status
   pill, dark/light switch, EN/NE toggle, mobile drawer, and the
   six-column design-rich footer.

   Adoption: pages opt in with
     <link rel="stylesheet" href="/css/nd-editorial-theme.css">
     <link rel="stylesheet" href="/css/nd-chrome.css">
     <div id="nd-header"></div>  ...  <div id="nd-footer"></div>
     <script src="/js/nd-chrome.js" defer></script>

   Wave A (2026-10-23): tokens live in css/nd-tokens.css
   (imported by nd-editorial-theme.css). This file also carries
   the BASE RULES + unified COMPONENT SYSTEM at the end
   (.nd-btn, .nd-pill, .nd-card, .nd-hero-numeral, .nd-ticker,
   .nd-table, .nd-tabs) — the one component language for the
   suite. Depth tokens (--nd-e1/e2/e3, --nd-rim, --nd-press)
   are defined in nd-tokens.css; keep those names stable.
   ============================================================ */

/* Guard against off-canvas elements (e.g. the closed mobile drawer, which is
   translated 100% past the viewport edge) expanding the document scroll area.
   `clip` (not `hidden`) preserves position:sticky descendants. */
html, body{ overflow-x: clip; }

#nd-header{
  position: sticky; top: 0; z-index: 40;
  height: var(--nd-header-h);
  background: color-mix(in srgb, var(--nd-bg) 88%, transparent);
  backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--nd-border);
}
#nd-header .nd-bar{
  height: var(--nd-header-h);
  max-width: var(--nd-page-max);
  margin: 0 auto; padding: 0 var(--nd-gutter);
  display: flex; align-items: center; gap: var(--nd-s3);
  min-width: 0;
}
/* Brand */
#nd-header .nd-brand{ display: flex; align-items: center; gap: var(--nd-s3); text-decoration: none; flex: none; }
#nd-header .nd-brand svg{ width: 34px; height: 34px; border-radius: var(--nd-r-logo); display: block; }
#nd-header .nd-brand-name{
  font-family: var(--nd-font-display); font-weight: 600;
  font-size: 1.05rem; color: var(--nd-text); line-height: 1.1; white-space: nowrap;
}
/* Search */
#nd-header .nd-search{ position: relative; flex: 0 1 220px; max-width: 260px; min-width: 180px; }
#nd-header .nd-search input{
  width: 100%; height: 38px; padding: 0 44px 0 36px;
  background: var(--nd-panel); border: 1px solid var(--nd-border);
  border-radius: var(--nd-r-md); color: var(--nd-text);
  font: 500 0.8125rem var(--nd-font-sans);
  transition: border-color var(--nd-t-fast) var(--nd-ease), max-width var(--nd-t-med) var(--nd-ease);
}
#nd-header .nd-search input::placeholder{ color: var(--nd-dim); }
#nd-header .nd-search input:focus{ outline: none; border-color: var(--nd-lime); }
#nd-header .nd-search .nd-sicon{ position: absolute; left: 11px; top: 50%; transform: translateY(-50%); color: var(--nd-dim); pointer-events: none; }
#nd-header .nd-search .nd-skey{
  position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
  font: 500 0.6875rem var(--nd-font-mono); color: var(--nd-dim);
  border: 1px solid var(--nd-border); border-radius: 6px; padding: 2px 7px;
  background: var(--nd-inset); pointer-events: none;
}
#nd-header .nd-results{
  position: absolute; top: calc(100% + 6px); left: 0; min-width: 320px; max-width: 420px;
  background: var(--nd-panel-2); border: 1px solid var(--nd-border-strong);
  border-radius: var(--nd-r-md); box-shadow: var(--nd-shadow);
  max-height: 320px; overflow: auto; display: none; padding: 6px;
}
#nd-header .nd-results.open{ display: block; }
#nd-header .nd-results a{
  display: flex; align-items: baseline; gap: var(--nd-s2);
  padding: 8px 10px; border-radius: var(--nd-r-sm);
  text-decoration: none; color: var(--nd-text);
  font: 500 0.8125rem var(--nd-font-sans);
}
#nd-header .nd-results a .sym{ font-family: var(--nd-font-mono); font-weight: 600; color: var(--nd-lime); }
#nd-header .nd-results a .nm{ color: var(--nd-muted); font-size: 0.75rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#nd-header .nd-results a[aria-selected="true"], #nd-header .nd-results a:hover{ background: var(--nd-lime-faint); }
/* Nav menus */
#nd-header .nd-nav{ display: flex; flex-direction: row; align-items: center; gap: 6px; flex: none; margin-left: 16px; }
#nd-header .nd-navitem{ position: relative; }
#nd-header .nd-navbtn{
  display: flex; align-items: center; gap: 6px; height: 38px; padding: 0 8px;
  background: none; border: 0; border-radius: var(--nd-r-sm); cursor: pointer;
  font: 500 var(--nd-text-nav) var(--nd-font-sans); color: var(--nd-muted);
  transition: color var(--nd-t-fast) var(--nd-ease), background var(--nd-t-fast) var(--nd-ease);
  text-decoration: none; white-space: nowrap;
}
#nd-header .nd-navbtn:hover, #nd-header .nd-navitem.open .nd-navbtn{ color: var(--nd-text); background: var(--nd-lime-faint); }
#nd-header .nd-navbtn.active{ color: var(--nd-lime); }
#nd-header .nd-navbtn.active::after{
  content: ""; position: absolute; left: 10px; right: 10px; bottom: 4px;
  height: 2px; border-radius: 2px; background: var(--nd-lime);
}
#nd-header .nd-navbtn .car{ font-size: 0.6rem; color: var(--nd-dim); }
#nd-header .nd-livedot{ width: 7px; height: 7px; border-radius: 50%; background: var(--nd-lime); flex: none; }
#nd-header .nd-livedot.pulse{ animation: nd-chrome-pulse 1.6s var(--nd-ease) infinite; }
@keyframes nd-chrome-pulse { 0%,100% { box-shadow: 0 0 0 0 rgba(184,230,46,.5);} 50% { box-shadow: 0 0 0 5px rgba(184,230,46,0);} }
#nd-header .nd-drop{
  position: absolute; top: calc(100% + 8px); left: 0; min-width: 240px;
  background: var(--nd-panel-2); border: 1px solid var(--nd-border-strong);
  border-radius: var(--nd-r-md); box-shadow: var(--nd-shadow); padding: 8px;
  opacity: 0; visibility: hidden; transform: translateY(-6px);
  transition: opacity var(--nd-t-med) var(--nd-ease), transform var(--nd-t-med) var(--nd-ease), visibility var(--nd-t-med);
}
#nd-header .nd-navitem.open .nd-drop{ opacity: 1; visibility: visible; transform: none; }
#nd-header .nd-drop a{
  display: block; padding: 9px 12px; border-radius: var(--nd-r-sm);
  color: var(--nd-muted); text-decoration: none;
  font: 500 0.8125rem var(--nd-font-sans);
  border-left: 2px solid transparent;
  transition: color var(--nd-t-fast) var(--nd-ease), background var(--nd-t-fast) var(--nd-ease), border-left-color var(--nd-t-fast) var(--nd-ease), transform var(--nd-t-fast) var(--nd-ease);
}
#nd-header .nd-drop a:hover{ color: var(--nd-text); background: var(--nd-lime-faint); border-left-color: var(--nd-lime); }
#nd-header .nd-drop a.active{ color: var(--nd-lime); font-weight: 600; }
/* Right cluster */
#nd-header .nd-cluster{ display: flex; align-items: center; gap: var(--nd-s2); margin-left: auto; flex: none; }
#nd-header .nd-pill{
  display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 14px;
  border: 1px solid var(--nd-border-strong); border-radius: var(--nd-r-pill);
  background: var(--nd-panel); white-space: nowrap;
  font: 600 0.6875rem var(--nd-font-mono); letter-spacing: 0.08em; color: var(--nd-text);
}
#nd-header .nd-pill .dot{ width: 8px; height: 8px; border-radius: 50%; background: var(--nd-amber); flex: none; }
#nd-header .nd-pill.live .dot{ background: var(--nd-lime); animation: nd-chrome-pulse 1.6s var(--nd-ease) infinite; }
#nd-header .nd-iconbtn{
  width: 44px; height: 44px; display: inline-flex; align-items: center; justify-content: center;
  background: var(--nd-panel); border: 1px solid var(--nd-border-strong);
  border-radius: var(--nd-r-md); color: var(--nd-text); cursor: pointer;
  font: 600 0.8125rem var(--nd-font-sans);
  transition: border-color var(--nd-t-fast) var(--nd-ease), transform var(--nd-t-fast) var(--nd-ease);
}
#nd-header .nd-iconbtn:hover{ border-color: var(--nd-lime); }
#nd-header .nd-iconbtn:active{ transform: scale(0.95); }
#nd-header .nd-lang{ display: flex; border: 1px solid var(--nd-border-strong); border-radius: var(--nd-r-md); overflow: hidden; }
#nd-header .nd-lang button{
  height: 44px; padding: 0 12px; background: transparent; border: 0; cursor: pointer;
  font: 600 0.75rem var(--nd-font-sans); color: var(--nd-muted);
}
#nd-header .nd-lang button[aria-pressed="true"]{ background: var(--nd-lime); color: var(--nd-on-lime); }
#nd-header .nd-burger{ display: none; }
/* Drawer */
#nd-header .nd-drawer{ display: none; }
@media (max-width: 1272px) {
  #nd-header .nd-nav{ display: none; }
  #nd-header .nd-burger{ display: inline-flex; }
  #nd-header .nd-search{ max-width: 220px; }
}
/* HEADER FIT (2026-10-09): the widened search + spaced 3D nav pills total more
   than the bar at typical desktop widths, pushing .nd-cluster (theme/lang/
   burger) off-screen. The market pill's text is the costliest item (~200px);
   keep the status dot and drop the text below 1500px so the header fits. */
@media (max-width: 1500px){
  #nd-header .nd-pill .nd-pilltxt{ display: none; }
}

@media (max-width: 640px) {
  #nd-header .nd-search .nd-skey{ display: none; }
  #nd-header .nd-pill .nd-pilltxt{ display: none; }
  #nd-header .nd-brand-name{ display: none; }
  #nd-header .nd-bar{ gap: var(--nd-s2); padding: 0 var(--nd-s4); }
  #nd-header .nd-cluster{ gap: 6px; }
  #nd-header .nd-iconbtn{ width: 44px; height: 44px; }
  #nd-header .nd-lang button{ height: 44px; padding: 0 9px; }
  #nd-header .nd-pill{ height: 32px; padding: 0 10px; }
  /* MOBILE SEARCH FIT (2026-10-10): let the search box shrink instead of forcing
     min-width:180px (which caused 33px horizontal overflow). The results
     dropdown goes full-width under the header so options are unmissable and
     never cut off-screen. */
  #nd-header .nd-search{ flex: 1 1 auto; min-width: 0; max-width: none; }
  #nd-header .nd-search input{ height: 34px; padding: 0 12px 0 34px; }
  #nd-header .nd-results{
    position: fixed; top: calc(var(--nd-header-h, 60px) + 6px);
    left: 16px; right: 16px;
    min-width: 0; width: auto; max-width: none;
  }
}
#nd-scrim{
  position: fixed; inset: 0; background: rgba(0,0,0,.55); z-index: 39;
  opacity: 0; visibility: hidden; transition: opacity var(--nd-t-med) var(--nd-ease), visibility var(--nd-t-med);
}
#nd-scrim.open{ opacity: 1; visibility: visible; }
#nd-drawer{
  position: fixed; top: 0; right: 0; bottom: 0; width: min(340px, 88vw); z-index: 40;
  box-sizing: border-box;
  background: var(--nd-panel); border-left: 1px solid var(--nd-border);
  transform: translateX(100%); visibility: hidden;
  transition: transform var(--nd-t-enter) var(--nd-ease), visibility 0s linear var(--nd-t-enter);
  overflow-y: auto; padding: var(--nd-s5);
}
#nd-drawer.open{ transform: none; visibility: visible; transition: transform var(--nd-t-enter) var(--nd-ease), visibility 0s linear 0s; }
#nd-drawer .nd-acc{ border-bottom: 1px solid var(--nd-border); }
#nd-drawer .nd-acc > button{
  width: 100%; display: flex; justify-content: space-between; align-items: center;
  background: none; border: 0; padding: 14px 4px; cursor: pointer;
  font: 600 0.875rem var(--nd-font-sans); color: var(--nd-text); min-height: 44px;
}
#nd-drawer .nd-acc .nd-accbody{ display: none; padding: 0 4px 12px; }
#nd-drawer .nd-acc.open .nd-accbody{ display: block; }
#nd-drawer .nd-acc .nd-accbody a{
  display: block; padding: 10px 4px; color: var(--nd-muted); text-decoration: none;
  font: 500 0.8125rem var(--nd-font-sans); min-height: 44px;
}
#nd-drawer .nd-acc .nd-accbody a.active{ color: var(--nd-lime); font-weight: 600; }
/* Hover lime only on devices with a real hover pointer — on touch screens a
   tap leaves :hover stuck, falsely marking random items as current. */
@media (hover: hover){
  #nd-drawer .nd-acc .nd-accbody a:hover{ color: var(--nd-lime); }
}

/* ============ FOOTER ============ */
#nd-footer{
  border-top: 1px solid var(--nd-lime);
  background: var(--nd-bg);
  margin-top: var(--nd-s16);
}
/* Adopted pages: the legacy sidebar is removed, so a shell left with a
   single content child collapses to one column instead of a 240px gap. */
.nd-shell:not(:has(> aside)) { display: block; }
/* Footer mounted INSIDE the legacy .d2-shell flex row: force it onto its own
   full-width row below the content instead of squeezing beside it. */
.d2-shell:has(> #nd-footer) { flex-wrap: wrap; }
.d2-shell > #nd-footer { flex: 1 1 100%; min-width: 100%; }
/* Footer as a direct body child after .d2-shell (short pages): sticky-footer
   pattern so a 100vh shell doesn't strand the footer a viewport below. */
body:has(> .d2-shell):has(> #nd-footer) { display: flex; flex-direction: column; min-height: 100vh; }
body:has(> .d2-shell):has(> #nd-footer) > .d2-shell { flex: 1 0 auto; min-height: 0; }
/* The legacy fixed sidebar rail is gone from adopted pages: kill its 236px
   body offset (nepse-luxury.css @ >=1100px) which otherwise squeezes the
   header's flex row. Scoped to pages carrying the new header. */
@media(min-width:1100px){
  body:has(> #nd-header){ padding-left: 0; }
}
/* Adopted pages: the header owns the theme switch — hide the legacy floating
   .theme-toggle button injected by js/theme-toggle.js so it stops covering
   content. The header toggle drives the same data-theme + storage keys. */
body:has(> #nd-header) .theme-toggle.fixed{ display: none !important; }
#nd-footer .nd-footwrap{ max-width: var(--nd-page-max); margin: 0 auto; padding: var(--nd-s12) var(--nd-gutter) var(--nd-s6); }
#nd-footer .nd-footbrand{ display: flex; align-items: center; gap: var(--nd-s3); margin-bottom: var(--nd-s2); }
#nd-footer .nd-footbrand svg{ width: 38px; height: 38px; border-radius: var(--nd-r-logo); }
#nd-footer .nd-footbrand .t{ font-family: var(--nd-font-display); font-weight: 600; font-size: 1.2rem; color: var(--nd-text); }
#nd-footer .nd-footstate{
  font: 400 var(--nd-text-body) var(--nd-font-sans); color: var(--nd-muted);
  max-width: 520px; margin: var(--nd-s3) 0 var(--nd-s8); line-height: 1.6;
}
#nd-footer .nd-footchips{ display: flex; flex-wrap: wrap; gap: var(--nd-s2); margin-bottom: var(--nd-s8); }
#nd-footer .nd-footchip{
  font: 600 0.6875rem var(--nd-font-mono); letter-spacing: 0.06em;
  border: 1px solid var(--nd-border-strong); border-radius: var(--nd-r-pill);
  padding: 6px 12px; color: var(--nd-muted); background: var(--nd-panel);
}
#nd-footer .nd-footgrid{
  display: grid; grid-template-columns: repeat(8, 1fr);
  gap: var(--nd-s6); padding-bottom: var(--nd-s8);
  border-bottom: 1px solid var(--nd-border);
}
#nd-footer .nd-footcol h3{
  font: 600 var(--nd-text-footer-head) var(--nd-font-sans);
  letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--nd-lime); opacity: 0.8; margin: 0 0 var(--nd-s3);
}
#nd-footer .nd-footcol a{
  display: block; padding: 7px 0; color: var(--nd-muted); text-decoration: none;
  font: 400 var(--nd-text-footer-link) var(--nd-font-sans);
  transform: translateX(0);
  transition: color var(--nd-t-fast) var(--nd-ease), transform var(--nd-t-fast) var(--nd-ease);
}
#nd-footer .nd-footcol a:hover{ color: var(--nd-lime); transform: translateX(4px); }
#nd-footer .nd-footplain{
  display: block; padding: 7px 0; color: var(--nd-muted);
  font: 400 var(--nd-text-footer-link) var(--nd-font-sans);
}
#nd-footer .nd-fb{
  display: flex; align-items: center; gap: 8px; padding: 7px 0;
  color: var(--nd-muted); text-decoration: none;
  font: 400 var(--nd-text-footer-link) var(--nd-font-sans);
  transform: translateX(0);
  transition: color var(--nd-t-fast) var(--nd-ease), transform var(--nd-t-fast) var(--nd-ease);
}
#nd-footer .nd-fb svg{ width: 16px; height: 16px; fill: currentColor; flex: none; }
#nd-footer .nd-fb:hover{ color: var(--nd-lime); transform: translateX(4px); }
#nd-footer .nd-made{
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--nd-s2) var(--nd-s6); padding-top: var(--nd-s6);
  color: var(--nd-muted); font-size: 0.8125rem; line-height: 1.7;
}
#nd-footer .nd-made .np{ color: var(--nd-muted); }
#nd-footer .nd-legal{
  display: flex; flex-wrap: wrap; gap: var(--nd-s2) var(--nd-s6);
  padding: var(--nd-s5) 0; color: var(--nd-muted); font-size: 0.75rem;
  align-items: center; justify-content: space-between;
}
#nd-footer .nd-totop{
  display: inline-flex; align-items: center; gap: 8px;
  background: var(--nd-panel); border: 1px solid var(--nd-border-strong);
  color: var(--nd-text); border-radius: var(--nd-r-pill); padding: 9px 16px;
  cursor: pointer; font: 600 0.75rem var(--nd-font-sans);
  transition: border-color var(--nd-t-fast) var(--nd-ease), transform var(--nd-t-fast) var(--nd-ease);
}
#nd-footer .nd-totop:hover{ border-color: var(--nd-lime); transform: translateY(-2px); }
@media (max-width: 1100px) { #nd-footer .nd-footgrid{ grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 640px) { #nd-footer .nd-footgrid{ grid-template-columns: repeat(2, 1fr); } }

@media (prefers-reduced-motion: reduce) {
  #nd-header .nd-livedot.pulse, #nd-header .nd-pill.live .dot{ animation: none; }
  #nd-header .nd-drop, #nd-drawer, #nd-scrim{ transition-duration: 150ms; }
}

/* ============================================================
 * Premium 3D layer — site-wide chrome
 * Layered elevation + rim light + physical press states.
 * ============================================================ */

/* Header: subtle depth separation from content */
#nd-header{
  box-shadow: 0 1px 0 rgba(255,255,255,.05), 0 8px 24px rgba(0,0,0,.35);
}
[data-theme="light"] #nd-header{
  box-shadow: 0 1px 0 rgba(255,255,255,.9), 0 8px 24px rgba(40,55,25,.08);
}

/* Brand mark: slight lift */
#nd-header .nd-brand svg{
  box-shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 2px 8px rgba(0,0,0,.4);
  transition: transform .25s cubic-bezier(.22,1,.36,1);
}
#nd-header .nd-brand:hover svg{ transform: translateY(-1px) scale(1.04); }

/* Search: recessed input, floating results */
#nd-header .nd-search input{
  background: var(--nd-bg);
  box-shadow: inset 0 2px 6px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.03);
  transition: border-color .2s, box-shadow .2s;
}
#nd-header .nd-search input:focus{
  border-color: var(--nd-lime);
  box-shadow: inset 0 2px 6px rgba(0,0,0,.3), 0 0 0 3px rgba(184,230,46,.15);
}
#nd-header .nd-skey{
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 1px 2px rgba(0,0,0,.3);
}
#nd-header .nd-results{
  background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,0) 30%), var(--nd-panel-2);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 4px 12px rgba(0,0,0,.45), 0 20px 50px rgba(0,0,0,.4);
}
#nd-header .nd-results a{ transition: background .15s, transform .15s; }
#nd-header .nd-results a[aria-selected="true"], #nd-header .nd-results a:hover{
  transform: translateX(2px);
}

/* Nav buttons: tactile */
#nd-header .nd-navbtn{
  transition: color .2s, background .2s, transform .2s cubic-bezier(.22,1,.36,1), box-shadow .2s;
}
#nd-header .nd-navbtn:hover, #nd-header .nd-navitem.open .nd-navbtn{
  transform: translateY(-1px);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 2px 6px rgba(0,0,0,.3);
}
#nd-header .nd-navbtn:active{ transform: translateY(0) scale(.97); }

/* Dropdown menus: floating panels */
#nd-header .nd-drop{
  background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,0) 30%), var(--nd-panel-2);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 4px 12px rgba(0,0,0,.45), 0 20px 50px rgba(0,0,0,.4);
}
#nd-header .nd-navitem.open .nd-drop{ transform: none; }
#nd-header .nd-drop a:hover{
  transform: translateX(2px);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05);
}

/* Market-status pill: raised */
#nd-header .nd-pill{
  background: linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,0) 50%), var(--nd-panel);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.07), 0 1px 3px rgba(0,0,0,.4), 0 4px 12px rgba(0,0,0,.25);
}

/* Icon buttons: physical press */
#nd-header .nd-iconbtn{
  background: linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,0) 50%), var(--nd-panel);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.07), 0 1px 3px rgba(0,0,0,.4);
  transition: border-color .2s, transform .15s cubic-bezier(.22,1,.36,1), box-shadow .2s;
}
#nd-header .nd-iconbtn:hover{
  transform: translateY(-1px);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.09), 0 3px 8px rgba(0,0,0,.45);
}
#nd-header .nd-iconbtn:active{
  transform: translateY(1px) scale(.96);
  box-shadow: inset 0 2px 5px rgba(0,0,0,.35);
}

/* Language toggle: segmented 3D */
#nd-header .nd-lang{
  box-shadow: inset 0 2px 5px rgba(0,0,0,.25), 0 1px 0 rgba(255,255,255,.05);
}
#nd-header .nd-lang button[aria-pressed="true"]{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 84%, white), var(--nd-lime));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.35), inset 0 -1px 0 rgba(0,0,0,.12);
}

/* Mobile drawer: depth from the edge */
#nd-drawer{
  background: linear-gradient(180deg, rgba(255,255,255,.03), rgba(255,255,255,0) 20%), var(--nd-panel);
  box-shadow: -20px 0 60px rgba(0,0,0,.5);
}
#nd-drawer .nd-acc .nd-accbody a{
  border-radius: 8px;
  transition: background .15s, transform .15s, color .15s;
}
@media (hover: hover){
  #nd-drawer .nd-acc .nd-accbody a:hover{
    background: var(--nd-lime-faint);
    transform: translateX(3px);
  }
}

/* Footer: top edge light */
#nd-footer{
  box-shadow: inset 0 1px 0 rgba(184,230,46,.25);
}

@media (prefers-reduced-motion: reduce){
  #nd-header .nd-brand svg, #nd-header .nd-navbtn, #nd-header .nd-iconbtn,
  #nd-header .nd-results a, #nd-header .nd-drop a{ transition: none; }
  #nd-header .nd-brand:hover svg, #nd-header .nd-navbtn:hover,
  #nd-header .nd-iconbtn:hover{ transform: none; }
}

/* 3D nav enhancement — matches sig-pro pill design */
#nd-header{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-bg) 92%, white 4%), color-mix(in srgb, var(--nd-bg) 88%, transparent));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 2px 8px rgba(0,0,0,.35), 0 8px 24px rgba(0,0,0,.25);
}
#nd-header .nd-navbtn{
  border-radius: 999px;
  padding: 0 14px;
  background: linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,0) 50%), transparent;
  border: 1px solid transparent;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
  transition: color .15s ease, background .15s ease, border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
#nd-header .nd-navbtn:hover, #nd-header .nd-navitem.open .nd-navbtn{
  color: var(--nd-text);
  background: linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.02) 50%), var(--nd-panel);
  border-color: var(--nd-border);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), inset 0 -2px 4px rgba(0,0,0,.15), 0 2px 6px rgba(0,0,0,.3);
  transform: translateY(-1px);
}
#nd-header .nd-navbtn.active{
  color: var(--nd-on-lime, #0A0C10);
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 80%, white) 0%, var(--nd-lime, #B8E62E) 55%, color-mix(in srgb, var(--nd-lime) 86%, black) 100%);
  border-color: color-mix(in srgb, var(--nd-lime) 80%, white);
  box-shadow: inset 0 2px 0 rgba(255,255,255,.5), inset 0 -3px 6px rgba(0,0,0,.18), 0 2px 6px rgba(0,0,0,.4), 0 4px 14px rgba(184,230,46,.3);
}
#nd-header .nd-navbtn.active::after{ display: none; }
/* DESKTOP HEADER FIT (2026-10-26): at 1101–1360px the desktop nav row
   (brand + search + nav + cluster) is wider than the bar, pushing the
   language switcher off-screen (61px clipped at 1280px, worse narrower).
   Tighten only spacing in this range — no element is resized, hidden, or
   restyled, and wide screens keep the exact current spacing. NOTE: this
   block must stay AFTER the 3D navbtn rule above (same specificity, later
   wins) — the base 8px button padding is already overridden to 14px there,
   so this 10px value is a 4px/side tightening, not an 8px one. Reclaim is
   ~88px (bar padding 24→16, bar gap 12→8, nav gap 6→4, navbtn 14→10), so
   the row fits from ~1273px up. Phase 5 (2026-10-28) raised the nav-collapse
   breakpoint 1100px -> 1272px (verified: bar no longer clips at 1150px;
   burger shows <=1272, pills show >=1273), so this compaction block now
   only matters at 1273-1360px. */
@media (max-width: 1360px) and (min-width: 1101px) {
  #nd-header .nd-bar{ gap: var(--nd-s2); padding: 0 var(--nd-s4); }
  #nd-header .nd-nav{ gap: 4px; }
  #nd-header .nd-navbtn{ padding: 0 10px; }
}
#nd-header .nd-search input{
  background: linear-gradient(180deg, rgba(0,0,0,.2), rgba(0,0,0,0) 60%), var(--nd-panel);
  box-shadow: inset 0 2px 4px rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.05), 0 1px 0 rgba(255,255,255,.04);
}
#nd-header .nd-search input:focus{
  border-color: var(--nd-lime);
  box-shadow: inset 0 2px 4px rgba(0,0,0,.25), 0 0 0 2px rgba(184,230,46,.2), 0 0 12px rgba(184,230,46,.15);
}
[data-theme="light"] #nd-header{
  background: linear-gradient(180deg, var(--nd-panel), #F5F7FA);
  box-shadow: inset 0 1px 0 var(--nd-white), 0 1px 3px rgba(10,12,16,.12), 0 4px 16px rgba(10,12,16,.08);
}
[data-theme="light"] #nd-header .nd-navbtn:hover{
  background: linear-gradient(180deg, var(--nd-panel), #EDF1F5);
  border-color: #CBD4DE;
  box-shadow: inset 0 2px 0 var(--nd-white), 0 2px 6px rgba(10,12,16,.1);
}
[data-theme="light"] #nd-header .nd-navbtn.active{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 76%, white) 0%, var(--nd-lime) 60%, color-mix(in srgb, var(--nd-lime) 84%, black) 100%);
  border-color: #3E650C; color: var(--nd-on-lime);
  box-shadow: inset 0 2px 0 rgba(255,255,255,.4), 0 2px 6px rgba(77,124,15,.3);
}
#nd-header .nd-search input::-webkit-search-cancel-button,
#nd-header .nd-search input::-webkit-search-decoration{display:none;-webkit-appearance:none}
#nd-header .nd-search input::-ms-clear{display:none}

/* ============================================================
   BASE RULES (Wave A, 2026-10-23) — suite-wide defaults on
   pages that adopt the chrome. Element-level on purpose:
   page/component rules with any class specificity win.
   ============================================================ */
table{ font-variant-numeric: tabular-nums; }
h1, h2, h3{ text-wrap: balance; }
p{ text-wrap: pretty; }
:focus-visible{ outline: 2px solid var(--nd-lime); outline-offset: 2px; }
/* Dark-styled form controls: explicit colours so native
   widgets never render light-on-dark. `color-scheme` itself
   is set per theme in nd-tokens.css (:root dark / light). */
select, textarea,
input[type="text"], input[type="search"], input[type="number"],
input[type="date"], input[type="email"], input[type="tel"]{
  background: var(--nd-panel); color: var(--nd-text);
  border: 1px solid var(--nd-border-strong); border-radius: var(--nd-r-md);
  font: 500 var(--nd-text-body) var(--nd-font-sans);
}
select option{ background: var(--nd-panel); color: var(--nd-text); }

/* ============================================================
   COMPONENT SYSTEM (Wave A, 2026-10-23) — the one component
   language for the suite. Rules drawn from the skills.sh pack:
   Vercel web-design-guidelines (ARIA tabs pattern, focus
   states, ≥44px targets), ui-ux-pro-max (tabular data
   density, tokenised surfaces), impeccable (one accent,
   rest-at-rest colour discipline).

   DEPTH LANGUAGE (formalised here; Wave F builds the 3D data
   visualisation on these exact tokens — names are STABLE):
     --nd-e1  resting card elevation      --nd-rim   luminous
     --nd-e2  hover/lift elevation        top hairline (inset)
     --nd-e3  overlay/floating elevation --nd-press active inset
   Surfaces layer --nd-bg < --nd-panel < --nd-panel-2 <
   overlay. Motion is transform/opacity only, --nd-t-*
   durations, and ambient loops pause when offscreen (page JS
   toggles .nd-paused via IntersectionObserver) and stop
   under prefers-reduced-motion.
   ============================================================ */

/* ---- Buttons ---- */
.nd-btn{
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 44px; padding: 0 20px;
  font: 600 0.875rem var(--nd-font-sans);
  border-radius: var(--nd-r-md); border: 1px solid transparent;
  cursor: pointer; text-decoration: none; white-space: nowrap;
  transition: background var(--nd-t-fast) var(--nd-ease), color var(--nd-t-fast) var(--nd-ease),
    border-color var(--nd-t-fast) var(--nd-ease), transform var(--nd-t-fast) var(--nd-ease),
    box-shadow var(--nd-t-fast) var(--nd-ease);
}
.nd-btn--primary{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 88%, white), var(--nd-lime));
  color: var(--nd-on-lime); box-shadow: var(--nd-rim), var(--nd-e1);
}
.nd-btn--primary:hover{ background: var(--nd-lime); transform: translateY(-1px); box-shadow: var(--nd-rim), var(--nd-e2); }
.nd-btn--primary:active{ transform: translateY(0); box-shadow: var(--nd-press); }
.nd-btn--ghost{
  background: var(--nd-panel); color: var(--nd-text); border-color: var(--nd-border-strong);
  box-shadow: var(--nd-rim), var(--nd-e1);
}
.nd-btn--ghost:hover{ border-color: var(--nd-lime); color: var(--nd-lime); }
.nd-btn--ghost:active{ box-shadow: var(--nd-press); }
.nd-btn--danger{
  background: transparent; color: var(--nd-down);
  border-color: color-mix(in srgb, var(--nd-down) 55%, transparent);
}
.nd-btn--danger:hover{ background: var(--nd-down-soft); border-color: var(--nd-down); }
.nd-btn--danger:active{ box-shadow: var(--nd-press); }
.nd-btn:focus-visible{ outline: none; box-shadow: var(--nd-focus-ring); }
.nd-btn:disabled, .nd-btn[aria-disabled="true"]{
  opacity: .45; cursor: not-allowed; transform: none; pointer-events: none;
}
/* Dense mouse-first toolbars only; touch surfaces keep 44px. */
.nd-btn--sm{ min-height: 36px; padding: 0 14px; font-size: 0.8125rem; }

/* ---- Pill (standalone status/label pill; the header's
   market-status pill is #nd-header .nd-pill above) ---- */
.nd-pill{
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 32px; padding: 4px 14px;
  border: 1px solid var(--nd-border-strong); border-radius: var(--nd-r-pill);
  background: var(--nd-panel); color: var(--nd-text);
  font: 600 0.6875rem var(--nd-font-mono); letter-spacing: 0.08em; text-transform: uppercase;
}
.nd-pill .dot{ width: 8px; height: 8px; border-radius: 50%; background: var(--nd-amber); flex: none; }
.nd-pill--live .dot{ background: var(--nd-lime); }
.nd-pill--lime{
  color: var(--nd-lime); background: var(--nd-lime-faint);
  border-color: color-mix(in srgb, var(--nd-lime) 55%, transparent);
}

/* ---- Card ---- */
.nd-card{
  background: linear-gradient(180deg, rgba(255,255,255,.035), rgba(255,255,255,0) 42%), var(--nd-panel);
  border: 1px solid var(--nd-border); border-radius: var(--nd-r-card);
  box-shadow: var(--nd-rim), var(--nd-e1);
  padding: var(--nd-s6);
}
.nd-card--lift{
  transition: transform var(--nd-t-med) var(--nd-ease), box-shadow var(--nd-t-med) var(--nd-ease);
}
.nd-card--lift:hover{ transform: translateY(-3px); box-shadow: var(--nd-rim), var(--nd-e2); }

/* ---- Hero band + hero numeral ---- */
.nd-hero{
  display: grid; grid-template-columns: 1.15fr .85fr; gap: var(--nd-s8);
  align-items: center; padding: var(--nd-s12) 0 var(--nd-s8);
}
@media (max-width: 900px){
  .nd-hero{ grid-template-columns: 1fr; padding-top: var(--nd-s8); }
}
.nd-hero h1{
  font-family: var(--nd-font-display); font-weight: 600;
  font-size: var(--step-4); line-height: 1.08; letter-spacing: -0.01em;
  color: var(--nd-text); margin: var(--nd-s3) 0 var(--nd-s4);
}
.nd-hero .nd-standfirst{
  font: 400 var(--step-2)/1.6 var(--nd-font-sans);
  color: var(--nd-muted); max-width: 36ch; margin: 0 0 var(--nd-s4);
}
.nd-hero .nd-standfirst-ne{
  font: 400 var(--nd-text-body)/1.7 var(--nd-font-sans);
  color: var(--nd-dim); margin: 0;
}
.nd-hero-numeral{
  font: 600 var(--step-5)/1 var(--nd-font-sans);
  font-variant-numeric: tabular-nums; letter-spacing: -0.03em;
  color: var(--nd-text);
}

/* ---- Ticker ----
   Track content is duplicated once by the page; the -50%
   loop is seamless. Symbols are ink/white at rest (owner
   law) — colour lives only in the change values. */
.nd-ticker{
  overflow: hidden; border-block: 1px solid var(--nd-border); background: var(--nd-inset);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent);
}
.nd-ticker-track{
  display: flex; gap: var(--nd-s8); width: max-content; padding: var(--nd-s2) 0;
  animation: nd-tickmove 60s linear infinite;
}
.nd-ticker:hover .nd-ticker-track,
.nd-ticker-track.nd-paused,
[data-nd-paused="true"] .nd-ticker-track{ animation-play-state: paused; }
@keyframes nd-tickmove{ from{ transform: translateX(0); } to{ transform: translateX(-50%); } }
.nd-ticker .sym{ font: 600 0.8125rem var(--nd-font-mono); color: var(--nd-text); }
.nd-ticker .px{ font: 500 0.8125rem var(--nd-font-mono); color: var(--nd-muted); }
.nd-ticker .up{ color: var(--nd-up); }
.nd-ticker .dn{ color: var(--nd-down); }

/* ============================================================
   TABLE SYSTEM (Wave A) — Bloomberg-tight data tables.
   Contract:
     <div class="nd-tablewrap">            (scroll + sticky)
       <table class="nd-table">            (+ .nd-table--dense)
         <thead><tr><th>… <th class="num">… (numeric = .num,
         right-aligned + tabular)          sortable headers
         carry aria-sort on the <th> and class="nd-sortable"
         when sortable-but-unsorted.
         <tbody> rows; symbol cell class="sym".
     First column + header row stay pinned inside the wrap.
     Zebra is a surface shift only — never a coloured stripe.
     Row "lift" is a surface glow (transforms on <tr> are
     unreliable across engines).
     .nd-table--cards opts into the <640px card fallback:
     every <td> carries data-th="Column label".
   ============================================================ */
.nd-tablewrap{
  overflow: auto; background: var(--nd-panel);
  border: 1px solid var(--nd-border); border-radius: var(--nd-r-card);
  box-shadow: var(--nd-rim), var(--nd-e1);
}
.nd-table{
  width: 100%; border-collapse: separate; border-spacing: 0;
  font: 400 var(--nd-text-body) var(--nd-font-sans); color: var(--nd-text);
}
.nd-table caption{
  text-align: left; padding: var(--nd-s4) var(--nd-s5);
  font: 600 var(--step-2) var(--nd-font-display); color: var(--nd-text);
}
.nd-table th{
  position: sticky; top: 0; z-index: 2;
  font: 600 0.6875rem var(--nd-font-mono); letter-spacing: 0.09em; text-transform: uppercase;
  color: var(--nd-dim); text-align: left; white-space: nowrap;
  padding: 10px 14px; background: var(--nd-panel);
  border-bottom: 1px solid var(--nd-border-strong);
}
.nd-table td{
  padding: 9px 14px; background: var(--nd-panel);
  border-bottom: 1px solid var(--nd-border);
  font-variant-numeric: tabular-nums;
}
.nd-table tbody tr:nth-child(even) td{
  background: color-mix(in srgb, var(--nd-panel-2) 55%, var(--nd-panel));
}
.nd-table tbody tr{ transition: background var(--nd-t-fast) var(--nd-ease); }
.nd-table tbody tr:hover td{ background: var(--nd-lime-faint); }
.nd-table tbody tr:last-child td{ border-bottom: 0; }
.nd-table .num, .nd-table th.num{ text-align: right; }
.nd-table .sym{ font-weight: 600; white-space: nowrap; }
.nd-table .sym a{ color: var(--nd-text); text-decoration: none; }
.nd-table .sym a:hover{ color: var(--nd-lime); text-decoration: underline; }
.nd-table .up{ color: var(--nd-up); }
.nd-table .dn{ color: var(--nd-down); }
/* Sticky first column (symbol) */
.nd-table th:first-child, .nd-table td:first-child{
  position: sticky; left: 0; z-index: 1;
}
.nd-table th:first-child{ z-index: 3; }
/* Sort indicators — visible, state-driven (aria-sort) */
.nd-table th.nd-sortable{ cursor: pointer; }
.nd-table th.nd-sortable::after,
.nd-table th[aria-sort="ascending"]::after,
.nd-table th[aria-sort="descending"]::after{
  content: ""; display: inline-block; margin-left: 7px; vertical-align: middle;
  border-inline: 4px solid transparent; opacity: .35;
}
.nd-table th.nd-sortable::after{ border-bottom: 5px solid currentColor; }
.nd-table th[aria-sort="ascending"]::after{
  border-bottom: 5px solid var(--nd-lime); opacity: 1;
}
.nd-table th[aria-sort="descending"]::after{
  border-top: 5px solid var(--nd-lime); border-bottom: 0; opacity: 1;
}
.nd-table--dense th{ padding: 8px 12px; }
.nd-table--dense td{ padding: 6px 12px; }
/* <640px card fallback (opt-in via .nd-table--cards) */
@media (max-width: 640px){
  .nd-table--cards thead{
    position: absolute; width: 1px; height: 1px; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  .nd-table--cards, .nd-table--cards tbody,
  .nd-table--cards tr, .nd-table--cards td{ display: block; width: 100%; }
  .nd-table--cards tr{
    padding: var(--nd-s3) var(--nd-s4);
    border-bottom: 1px solid var(--nd-border-strong);
  }
  .nd-table--cards tbody tr:last-child{ border-bottom: 0; }
  .nd-table--cards td{
    display: flex; justify-content: space-between; align-items: baseline;
    gap: var(--nd-s4); padding: 5px 0; border-bottom: 0; background: transparent;
  }
  .nd-table--cards tbody tr:nth-child(even) td,
  .nd-table--cards tbody tr:hover td{ background: transparent; }
  .nd-table--cards td::before{
    content: attr(data-th);
    font: 600 0.6875rem var(--nd-font-mono); letter-spacing: 0.09em;
    text-transform: uppercase; color: var(--nd-dim);
  }
  .nd-table--cards th:first-child, .nd-table--cards td:first-child{ position: static; }
}

/* ============================================================
   TAB SYSTEM (Wave A) — one tabs component, ARIA tabs
   pattern (Vercel web-design-guidelines / APG):
     <div class="nd-tabs nd-tabs--pill" role="tablist">
       <button role="tab" aria-selected="true"
               aria-controls="panel-id" id="tab-id">…
     <div role="tabpanel" id="panel-id" aria-labelledby="tab-id"
          tabindex="0">…
   Behaviour contract for page JS: roving tabindex (selected
   tab tabindex="0", others "-1"), ArrowLeft/ArrowRight move,
   Home/End jump, activation on focus (automatic) or Enter/
   Space (manual). The selected state is [aria-selected] —
   unmistakable, never hover-only; `.on` is honoured as a
   legacy alias so existing toggles keep painting. Where a
   page already carries state in the URL, page JS syncs the
   selected tab from/to the query param (e.g. ?metric=).
   ============================================================ */
.nd-tabs{ display: flex; gap: var(--nd-s2); flex-wrap: wrap; }
.nd-tabs [role="tab"]{
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 40px; padding: 0 16px;
  font: 600 0.8125rem var(--nd-font-sans); color: var(--nd-muted);
  background: transparent; border: 1px solid transparent; border-radius: var(--nd-r-md);
  cursor: pointer;
  transition: color var(--nd-t-fast) var(--nd-ease), background var(--nd-t-fast) var(--nd-ease),
    border-color var(--nd-t-fast) var(--nd-ease), box-shadow var(--nd-t-fast) var(--nd-ease);
}
.nd-tabs [role="tab"]:hover{ color: var(--nd-text); }
.nd-tabs [role="tab"]:focus-visible{ outline: none; box-shadow: var(--nd-focus-ring); }
.nd-tabs [role="tab"]:disabled{ opacity: .45; cursor: not-allowed; }
/* Pill variant — segmented control (flagship metric tabs) */
.nd-tabs--pill [role="tab"]{
  border-color: var(--nd-border-strong); background: var(--nd-panel);
  border-radius: var(--nd-r-pill); box-shadow: var(--nd-rim), var(--nd-e1);
}
.nd-tabs--pill [role="tab"][aria-selected="true"],
.nd-tabs--pill [role="tab"].on{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 88%, white), var(--nd-lime));
  color: var(--nd-on-lime); border-color: transparent;
}
/* Underline variant — editorial section tabs */
.nd-tabs--underline{ gap: var(--nd-s5); border-bottom: 1px solid var(--nd-border); }
.nd-tabs--underline [role="tab"]{
  min-height: 44px; padding: 0 2px; border-radius: 0;
  box-shadow: inset 0 -2px 0 transparent;
}
.nd-tabs--underline [role="tab"][aria-selected="true"],
.nd-tabs--underline [role="tab"].on{
  color: var(--nd-text); box-shadow: inset 0 -2px 0 var(--nd-lime);
}
.nd-tabpanel:focus-visible{ outline: none; box-shadow: var(--nd-focus-ring); }

@media (prefers-reduced-motion: reduce){
  .nd-btn, .nd-card--lift, .nd-tabs [role="tab"]{ transition-duration: 150ms; }
  .nd-btn--primary:hover, .nd-card--lift:hover{ transform: none; }
  .nd-ticker-track{ animation: none; }
}

/* ============================================================
   WAVE G1 ROLLOUT (2026-10-23) — site-wide premium layer.
   Page rhythm, scroll affordances, tab-state bridges and the
   nav-pill link group. Everything consumes nd-tokens; page
   CSS with class specificity still wins where it defines
   its own treatment.
   ============================================================ */

/* ---- Page rhythm: one container + title band + section beat.
   .nd-wrap centres content on the token grid; .nd-pageband is
   the standard title block that sits directly under the shared
   nav (title first — no breadcrumbs, owner law); .nd-section
   is the vertical beat between major page sections. ---- */
.nd-wrap{
  max-width: var(--nd-page-max); margin-inline: auto;
  padding-inline: var(--nd-gutter);
}
.nd-pageband{ padding: var(--nd-s8) 0 var(--nd-s6); }
.nd-pageband .nd-eyebrow{ margin-bottom: var(--nd-s3); }
.nd-pageband h1{
  font-family: var(--nd-font-display); font-weight: 600;
  font-size: var(--step-4); line-height: 1.1; letter-spacing: -0.01em;
  color: var(--nd-text); margin: 0 0 var(--nd-s3);
}
.nd-pageband .nd-lede{
  font: 400 var(--step-2)/1.6 var(--nd-font-sans);
  color: var(--nd-muted); max-width: 68ch; margin: 0;
}
.nd-section{ padding-block: var(--nd-s8); }
.nd-section + .nd-section{ padding-top: 0; }

/* ---- Scroll affordance for table scroll regions: styled thin
   scrollbar + fixed inset edge shadow so a wide table always
   reads as scrollable (never page-level horizontal overflow). ---- */
.nd-tablewrap{
  scrollbar-width: thin;
  scrollbar-color: var(--nd-border-strong) transparent;
  overscroll-behavior-x: contain;
  box-shadow: var(--nd-rim), var(--nd-e1),
    inset -18px 0 18px -18px rgba(0, 0, 0, 0.55);
}
.nd-tablewrap::-webkit-scrollbar{ height: 8px; width: 8px; }
.nd-tablewrap::-webkit-scrollbar-thumb{
  background: var(--nd-border-strong); border-radius: 999px;
}
.nd-tablewrap::-webkit-scrollbar-track{ background: transparent; }
/* Family scroll wrappers that adopt .nd-tablewrap in markup get
   the same scrollbar treatment even when their own class sets
   the panel treatment. */
.ds-table-scroll, .sx-table-wrap, .table-scroll, .table-wrap,
.dc-tablewrap, .ev-tablewrap, .v2-tablewrap, .mf-tablewrap,
.sn-tablewrap, .ipo-tablewrap, .scrollx, .bk-scroll, .trades-wrap,
.rp-table-wrap, .nl-sh-wrap{
  scrollbar-width: thin;
  scrollbar-color: var(--nd-border-strong) transparent;
  overscroll-behavior-x: contain;
}
.ds-table-scroll::-webkit-scrollbar, .sx-table-wrap::-webkit-scrollbar,
.table-scroll::-webkit-scrollbar, .table-wrap::-webkit-scrollbar,
.dc-tablewrap::-webkit-scrollbar, .ev-tablewrap::-webkit-scrollbar,
.v2-tablewrap::-webkit-scrollbar, .mf-tablewrap::-webkit-scrollbar,
.sn-tablewrap::-webkit-scrollbar, .ipo-tablewrap::-webkit-scrollbar,
.scrollx::-webkit-scrollbar, .bk-scroll::-webkit-scrollbar,
.trades-wrap::-webkit-scrollbar, .rp-table-wrap::-webkit-scrollbar,
.nl-sh-wrap::-webkit-scrollbar{
  height: 8px; width: 8px;
}
.ds-table-scroll::-webkit-scrollbar-thumb, .sx-table-wrap::-webkit-scrollbar-thumb,
.table-scroll::-webkit-scrollbar-thumb, .table-wrap::-webkit-scrollbar-thumb,
.dc-tablewrap::-webkit-scrollbar-thumb, .ev-tablewrap::-webkit-scrollbar-thumb,
.v2-tablewrap::-webkit-scrollbar-thumb, .mf-tablewrap::-webkit-scrollbar-thumb,
.sn-tablewrap::-webkit-scrollbar-thumb, .ipo-tablewrap::-webkit-scrollbar-thumb,
.scrollx::-webkit-scrollbar-thumb, .bk-scroll::-webkit-scrollbar-thumb,
.trades-wrap::-webkit-scrollbar-thumb, .rp-table-wrap::-webkit-scrollbar-thumb,
.nl-sh-wrap::-webkit-scrollbar-thumb{
  background: var(--nd-border-strong); border-radius: 999px;
}

/* ---- Tab-state bridges: legacy painters mark the selected
   tab with .active / .is-active instead of (or alongside)
   aria-selected. Inside an adopted .nd-tabs list those classes
   paint the same selected state, so old wiring looks native. ---- */
.nd-tabs--pill [role="tab"].active,
.nd-tabs--pill [role="tab"].is-active{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 88%, white), var(--nd-lime));
  color: var(--nd-on-lime); border-color: transparent;
}
.nd-tabs--underline [role="tab"].active,
.nd-tabs--underline [role="tab"].is-active{
  color: var(--nd-text); box-shadow: inset 0 -2px 0 var(--nd-lime);
}
/* Non-button tabs (links/spans a painter emits) still get the
   base tab geometry when a family class carries the role. */
.nd-tabs [role="tab"]{ user-select: none; }

/* ---- Nav pills: the link-group sibling of .nd-tabs for tab-
   LOOKING navigation whose items are separate pages (signals
   strategy switcher etc.). Links, not tabs: no role=tab, the
   current page is aria-current="page". Same pill paint as
   .nd-tabs--pill so the suite reads as one language. ---- */
.nd-navpills{ display: flex; gap: var(--nd-s2); flex-wrap: wrap; }
.nd-navpills a{
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 40px; padding: 0 16px;
  font: 600 0.8125rem var(--nd-font-sans); color: var(--nd-muted);
  background: var(--nd-panel); border: 1px solid var(--nd-border-strong);
  border-radius: var(--nd-r-pill); box-shadow: var(--nd-rim), var(--nd-e1);
  text-decoration: none;
  transition: color var(--nd-t-fast) var(--nd-ease), border-color var(--nd-t-fast) var(--nd-ease),
    background var(--nd-t-fast) var(--nd-ease);
}
.nd-navpills a:hover{ color: var(--nd-text); border-color: var(--nd-lime); }
.nd-navpills a:focus-visible{ outline: none; box-shadow: var(--nd-focus-ring); }
.nd-navpills a[aria-current="page"]{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 88%, white), var(--nd-lime));
  color: var(--nd-on-lime); border-color: transparent;
}

@media (prefers-reduced-motion: reduce){
  .nd-navpills a{ transition-duration: 150ms; }
}

/* ---- Filter pills: single-select toggle chips (aria-pressed
   groups: verdict filters, view toggles). Token-driven in both
   themes; selected = lime fill, never a hard-coded ink block. ---- */
.nd-filterpill{
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 40px; padding: 0 18px;
  font: 600 0.8125rem var(--nd-font-sans); color: var(--nd-muted);
  background: var(--nd-panel); border: 1px solid var(--nd-border-strong);
  border-radius: var(--nd-r-pill); box-shadow: var(--nd-rim), var(--nd-e1);
  cursor: pointer;
  transition: color var(--nd-t-fast) var(--nd-ease), border-color var(--nd-t-fast) var(--nd-ease),
    background var(--nd-t-fast) var(--nd-ease);
}
.nd-filterpill:hover{ color: var(--nd-text); border-color: var(--nd-lime); }
.nd-filterpill:focus-visible{ outline: none; box-shadow: var(--nd-focus-ring); }
.nd-filterpill[aria-pressed="true"], .nd-filterpill.active{
  background: linear-gradient(180deg, color-mix(in srgb, var(--nd-lime) 88%, white), var(--nd-lime));
  color: var(--nd-on-lime); border-color: transparent;
}

/* ---- Page title for pages whose H1 stands without a masthead
   wrapper: same display type + rhythm as .nd-pageband h1. ---- */
.nd-pagetitle{
  font-family: var(--nd-font-display); font-weight: 600;
  font-size: var(--step-4); line-height: 1.1; letter-spacing: -0.01em;
  color: var(--nd-text); margin: var(--nd-s8) 0 var(--nd-s3);
}

/* SKIP LINK (Phase 5): visually-hidden-until-focus fallback for chrome pages
   whose family CSS carries no .skip-link rule. Family rules loaded after
   this file win on equal specificity. */
.skip-link{position:absolute;top:-48px;left:12px;z-index:200;padding:8px 14px;
  border-radius:8px;background:var(--nd-lime,#B8E62E);color:var(--nd-on-lime);
  font-weight:700;text-decoration:none;transition:top .15s ease}
.skip-link:focus{top:12px}

/* BASE FONT (Phase 5, master trap 2.6.2): the shared stack never set
   body{font-family}, so every chrome page without a per-page body rule
   rendered body copy in Times. One shared rule fixes all of them;
   per-page body[data-page] rules loaded later still win. */
body{font-family:var(--nd-font-sans)}

/* ---- R6 (2026-10-29): light-theme contrast to AA ---- */
/* Footer headings were lime at opacity .8 -> blended olive #6f953e
   (3.24:1) on light. Full opacity restores #4D7C0F = 4.66:1. */
[data-theme="light"] #nd-footer .nd-footcol h3 { opacity: 1; }
