/* =======================================================================
   NirvanaRO — "Celestial Engraved" global design system.
   Loaded AFTER flux.css, so it overrides the default theme wholesale.
   Restyles every FluxCP surface: chrome, tables, forms, menus, DB pages.
   ======================================================================= */
:root{
  --void:#070310; --void2:#0a0520; --void3:#0c0823;
  --indigo:#1a1442; --indigo2:#233056; --violet:#271552; --violet2:#2a205c;
  --gold-deep:#8a5d12; --gold:#c79a3c; --gold-bright:#e7bd5b; --gold-hi:#ffe9a8;
  --parchment:#cbb98f; --text:#ece7f5; --muted:#a99fce; --muted2:#6f6796;
  /* P0 audit: --fg is referenced ~27x across the Bazaar/Cockpit components
     (card names, filter inputs, modal rows) but was never defined here --
     those color declarations were silently invalid and fell back to
     inherited text color. Alias it to --text rather than touch every call
     site. */
  --fg:var(--text);
  /* W0 tokens v2 -- accent as raw channels so alpha variants re-theme too.
     101 rgba(231,189,91,x) / rgba(199,154,60,x) literals across 89 selectors
     were unreachable by any [data-theme] override; they now read these.
     Keep the channel triplets in lockstep with --gold / --gold-bright above. */
  --gold-rgb:199,154,60;
  --gold-bright-rgb:231,189,91;
  /* Ground ramp channels -- same reason as the accent: 34 more literals
     (table headers, hero gradients, scrims, veils) were theme-proof. */
  --void-rgb:7,3,16; --void3-rgb:12,8,35;
  --indigo-rgb:26,20,66; --violet-rgb:39,21,82;
  /* Semantic colors -- deliberately NOT themed: green means good in every
     regalia. Values are the dominant literals already in use site-wide
     (#4ade80 x67, #ff8f8f x43, #9fb4ff x12) so adopting them is a no-op. */
  --ok:#4ade80; --ok-soft:#8fe3a8;
  --warn:#e7bd5b;
  --danger:#ff8f8f; --danger-strong:#ff5d5d;
  --crystal:#9fb4ff;
  --on-gold:#1a1206;
  /* Motion language: Rise / Engrave / Ignite / Sweep / Pulse all key off these. */
  --ease-rune:cubic-bezier(.2,.7,.2,1);
  --t-fast:150ms; --t-med:350ms; --t-slow:900ms;
  --line:rgba(var(--gold-bright-rgb),.16); --line2:rgba(var(--gold-bright-rgb),.34);
  --panel:rgba(18,12,40,.72); --panel2:rgba(26,20,66,.55);
  --disp:'Cinzel',Georgia,'Times New Roman',serif;
  --deco:'Cinzel Decorative','Cinzel',serif;
  --serif:'Spectral',Georgia,serif;
  --body:'Manrope',system-ui,sans-serif;
  --max:1220px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:var(--body)!important;color:var(--text)!important;
  background:var(--void)!important;line-height:1.6;
  -webkit-font-smoothing:antialiased;overflow-x:hidden;
}
a{color:var(--gold-bright);text-decoration:none;transition:color .2s}
a:hover{color:var(--gold-hi)}
img{border:0}
h1,h2,h3,h4,h5{font-family:var(--disp);color:#fff;line-height:1.15;font-weight:700}
p{margin:0 0 1em}

/* kill the old table-frame chrome + light backgrounds FluxCP injects inline */
body > table{width:auto!important}
td[bgcolor]{background:transparent!important}
[bgcolor="#8ebceb"],[bgcolor="#f5f5f5"]{background:transparent!important}
#logo{display:none!important}          /* replaced by nav wordmark */
img[src*="content_"],img[src*="sidebar_"],img[src*="corner"]{display:none!important}

/* ============ COSMIC BACKDROP ============ */
#nv-nebula{position:fixed;inset:0;z-index:-3;width:100%;height:100%;display:block}
.nv-veil{position:fixed;inset:0;z-index:-2;pointer-events:none;
  background:
    radial-gradient(120% 80% at 72% -10%, rgba(var(--violet-rgb),.6), transparent 60%),
    radial-gradient(90% 70% at 12% 112%, rgba(var(--indigo-rgb),.66), transparent 55%),
    linear-gradient(180deg, var(--void) 0%, var(--void2) 45%, var(--void) 100%);}
.nv-veil-grain{position:fixed;inset:0;z-index:-2;pointer-events:none;opacity:.05;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");}

/* ============ TOP NAV ============ */
#nv-nav{position:fixed;top:0;left:0;right:0;z-index:200;display:flex;align-items:center;
  justify-content:space-between;gap:18px;padding:16px 30px;
  transition:.4s cubic-bezier(.2,.7,.2,1);border-bottom:1px solid transparent}
#nv-nav.solid{background:linear-gradient(180deg,rgba(var(--void-rgb),.95),rgba(var(--void-rgb),.75));
  border-bottom:1px solid var(--line);backdrop-filter:blur(12px);padding:10px 30px}
.nv-mark{font-family:var(--deco);font-weight:900;letter-spacing:3px;font-size:21px;white-space:nowrap;
  background:linear-gradient(180deg,var(--gold-hi),var(--gold),var(--gold-deep));
  -webkit-background-clip:text;background-clip:text;color:transparent;
  text-shadow:0 0 24px rgba(var(--gold-bright-rgb),.22)}
.nv-mark small{display:block;font-family:var(--disp);font-weight:600;font-size:8.5px;letter-spacing:4px;
  color:var(--parchment);-webkit-text-fill-color:var(--parchment);margin-top:-2px}
.nv-navlinks{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.nv-navlinks > a,.nv-drop > span{font-family:var(--disp);font-weight:600;font-size:12px;letter-spacing:1.5px;
  text-transform:uppercase;color:var(--muted);padding:8px 12px;cursor:pointer;position:relative;
  white-space:nowrap;transition:color .22s}
.nv-navlinks > a:hover,.nv-drop:hover > span{color:var(--gold-bright)}
.nv-nav-admin{font-family:var(--disp);font-weight:600;font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold);padding:8px 12px;white-space:nowrap;text-decoration:none;transition:color .22s}
.nv-nav-admin:hover{color:var(--gold-hi)}
.nv-navlinks > a::after{content:"";position:absolute;left:12px;right:12px;bottom:3px;height:1px;
  background:linear-gradient(90deg,var(--gold),transparent);transform:scaleX(0);transform-origin:left;transition:transform .28s}
.nv-navlinks > a:hover::after{transform:scaleX(1)}
/* dropdown groups (menu categories) */
.nv-drop{position:relative}
.nv-drop-menu{position:absolute;top:100%;left:0;min-width:190px;background:linear-gradient(180deg,rgba(var(--void3-rgb),.98),rgba(var(--void-rgb),.98));
  border:1px solid var(--line);backdrop-filter:blur(12px);padding:8px;opacity:0;visibility:hidden;
  transform:translateY(8px);transition:.25s;box-shadow:0 24px 60px rgba(0,0,0,.55);z-index:210}
.nv-drop:hover .nv-drop-menu{opacity:1;visibility:visible;transform:translateY(0)}
.nv-drop-menu a{display:block;font-family:var(--body);font-size:13px;letter-spacing:.3px;text-transform:none;
  color:var(--muted);padding:9px 12px;border-left:2px solid transparent;transition:.2s}
.nv-drop-menu a:hover{color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.07);border-left-color:var(--gold)}
.nv-cta{font-family:var(--disp)!important;font-weight:700!important;letter-spacing:1.5px;text-transform:uppercase;
  font-size:12px!important;color:#1a1206!important;padding:11px 20px!important;
  background:linear-gradient(135deg,var(--gold-hi),var(--gold),var(--gold-deep));
  clip-path:polygon(9px 0,100% 0,calc(100% - 9px) 100%,0 100%);box-shadow:0 6px 22px rgba(var(--gold-bright-rgb),.26);
  transition:.25s}
.nv-cta:hover{transform:translateY(-2px);color:#1a1206!important;box-shadow:0 10px 32px rgba(var(--gold-bright-rgb),.4)}
.nv-navlinks > a.nv-cta::after{display:none}
.nv-logout{font-family:var(--disp);font-weight:600;font-size:11px;letter-spacing:1.5px;text-transform:uppercase;
  color:var(--muted);padding:8px 10px;white-space:nowrap;text-decoration:none;transition:color .22s}
.nv-logout:hover{color:var(--gold-hi)}
.nv-navlinks > a.nv-logout::after{display:none}

/* mobile nav toggle -- hidden on desktop, shown only under the 960px
   breakpoint below. #nv-nav uses justify-content:space-between with just
   two in-flow children (.nv-mark + this button) once .nv-navlinks goes
   position:absolute on mobile, so it lands top-right with no extra
   positioning needed. */
#nv-nav-toggle{display:none;flex-direction:column;justify-content:center;align-items:center;gap:5px;
  width:38px;height:38px;flex:0 0 auto;background:none;border:1px solid var(--line2);border-radius:6px;
  cursor:pointer;padding:0}
#nv-nav-toggle span{display:block;width:20px;height:2px;background:var(--gold);border-radius:1px;
  transition:transform .25s,opacity .25s}
#nv-nav-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}
#nv-nav-toggle[aria-expanded="true"] span:nth-child(2){opacity:0}
#nv-nav-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* Below 960px, .nv-navlinks (9 items across Home/menu categories/Admin/
   Log In) can no longer fit #nv-nav's single row -- flex-wrap:wrap was
   letting it wrap into several stacked lines instead. #nv-nav is
   position:fixed, which takes it out of document flow entirely, so a
   taller wrapped nav never pushed .nv-hero's content down -- it just sat
   on top of it (the live bug this section fixes: the Log In button and
   Legend Tracks link visibly overlapping the NIRVANA hero title/tagline
   on a phone-width viewport). Fix: collapse the links behind a hamburger
   toggle instead of ever letting the fixed bar grow past one row. */
/* full-page dim behind the open mobile panel -- without this, whatever hero/
   page content sits just past the panel's own content-height bottom edge
   (e.g. the "See The World" button) was visible poking in right under
   "Log In", which read as unfinished even though nothing was actually
   overlapping/broken. Also doubles as a tap-outside-to-close target. */
.nv-nav-scrim{position:fixed;inset:0;z-index:190;background:rgba(4,2,12,.72);
  opacity:0;pointer-events:none;transition:opacity .3s ease}
.nv-nav-scrim.nv-open{opacity:1;pointer-events:auto}

@media(max-width:960px){
  #nv-nav{padding:12px 16px}
  #nv-nav-toggle{display:flex}
  .nv-navlinks{
    position:absolute;top:100%;left:0;right:0;flex-direction:column;flex-wrap:nowrap;align-items:stretch;gap:0;
    background:linear-gradient(180deg,rgba(var(--void-rgb),.98),rgba(var(--void-rgb),.96));
    border-bottom:1px solid var(--line);backdrop-filter:blur(12px);
    max-height:0;overflow:hidden;transition:max-height .3s ease}
  .nv-navlinks.nv-open{max-height:calc(100svh - 62px);overflow-y:auto}
  .nv-navlinks > a,.nv-nav-admin{width:100%;padding:14px 20px!important;font-size:13px!important;
    letter-spacing:1px!important;text-align:center;border-bottom:1px solid rgba(255,255,255,.06)}
  .nv-navlinks > a::after{display:none}
  /* desktop dropdowns open on :hover, which touch has no equivalent for --
     flatten each category to an always-expanded inline group instead of
     requiring a second tap gesture that doesn't discoverably exist. */
  .nv-drop{width:100%}
  .nv-drop > span{width:100%;display:block;padding:14px 20px;text-align:center;
    border-bottom:1px solid rgba(255,255,255,.06)}
  .nv-drop-menu{position:static;opacity:1;visibility:visible;transform:none;box-shadow:none;
    background:rgba(0,0,0,.25);backdrop-filter:none;border:0;padding:0;min-width:0}
  .nv-drop-menu a{text-align:center;padding:12px 20px;border-left:0;border-bottom:1px solid rgba(255,255,255,.04)}
}

/* ============ CONTENT SHELL (all non-landing pages) ============ */
.nv-shell{max-width:var(--max);margin:0 auto;padding:120px 26px 80px;position:relative;z-index:1}
.nv-content{background:var(--panel);border:1px solid var(--line);backdrop-filter:blur(8px);
  padding:clamp(22px,3.4vw,44px);position:relative;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 20px),calc(100% - 20px) 100%,0 100%)}
.nv-content::before{content:"";position:absolute;top:0;left:0;right:0;height:1px;
  background:linear-gradient(90deg,transparent,var(--gold),transparent)}
.nv-page-title{font-family:var(--disp);font-weight:700;font-size:clamp(24px,3.2vw,38px);
  margin:0 0 6px;background:linear-gradient(180deg,#fff,var(--parchment));
  -webkit-background-clip:text;background-clip:text;color:transparent;letter-spacing:.5px}
.nv-page-rule{display:flex;align-items:center;gap:14px;margin:0 0 26px}
.nv-page-rule .ln{height:1px;flex:1;background:linear-gradient(90deg,var(--gold),transparent)}
.nv-page-rule .dia{width:7px;height:7px;background:var(--gold-bright);transform:rotate(45deg);box-shadow:0 0 12px var(--gold)}

/* Season World merge P3 (2026-08-01) -- breadcrumb back to the Halls of
   Midgard, the one thing the 14 destination pages absorbed into the merge
   were all missing (they only ever linked outward, never back). */
.nv-crumb{margin:0 0 12px;font-size:12.5px}
.nv-crumb a{color:var(--muted);text-decoration:none;border-bottom:1px dotted var(--line)}
.nv-crumb a:hover{color:var(--gold-bright);border-color:var(--gold-bright)}

/* messages */
p.message,.message{background:linear-gradient(90deg,rgba(var(--gold-bright-rgb),.14),rgba(var(--gold-bright-rgb),.03))!important;
  border:1px solid var(--line2)!important;border-left:3px solid var(--gold)!important;color:var(--gold-hi)!important;
  padding:14px 18px!important;margin:0 0 22px!important;font-size:14px;border-radius:0!important}
p.notice,.notice{background:rgba(123,108,255,.1)!important;border-left:3px solid var(--violet2)!important;
  color:var(--muted)!important;padding:12px 16px!important}
.error,p.error,.errorMessage{background:rgba(255,93,143,.12)!important;border-left:3px solid #ff5d8f!important;color:#ffb3cc!important;padding:12px 16px!important}

/* ============ TABLES (the bulk of FluxCP) ============ */
#content table,.horizontal-table,.content_table,.nv-content table{
  width:100%;border-collapse:collapse;margin:0 0 22px;font-size:13.5px;background:transparent}
.horizontal-table th,.content_table th,.nv-content table th,#content table th{
  font-family:var(--disp);font-weight:600;font-size:11.5px;letter-spacing:1.5px;text-transform:uppercase;
  color:var(--gold);text-align:left;padding:12px 14px;
  background:linear-gradient(180deg,rgba(var(--violet-rgb),.55),rgba(var(--indigo-rgb),.35));
  border-bottom:1px solid var(--line2)}
.horizontal-table td,.content_table td,.nv-content table td,#content table td{
  padding:11px 14px;border-bottom:1px solid rgba(var(--gold-bright-rgb),.08);color:var(--text);vertical-align:top;background:transparent!important}
/* nuke every white cell FluxCP's flux.css injects (equal-specificity #fff) */
.horizontal-table th,.horizontal-table td,.vertical-table th,.vertical-table td,
.generic-form-table th,.generic-form-table td,.shop-table th,.shop-table td,
.woe-table th,.woe-table td,table.horizontal-table tr{background-color:transparent!important}
.horizontal-table tr:hover td,.content_table tr:hover td,#content table tbody tr:hover td{background:rgba(var(--gold-bright-rgb),.05)}
/* zebra */
tr.odd td,.odd{background:rgba(255,255,255,.012)}
tr.even td,.even{background:transparent}
/* label/value "horizontal" tables (account view etc.) */
.horizontal-table th{white-space:nowrap}
.not-applicable{color:var(--muted2)!important;font-style:italic}
.empty-row td{text-align:center;color:var(--muted2);padding:24px!important;font-style:italic}
.top-ranked td{background:rgba(var(--gold-bright-rgb),.06)!important}
.green,.for-sale.yes,.refineable.yes{color:#5fe0a0!important}
.for-sale.no,.refineable.no{color:#ff8fae!important}

/* stock FluxCP label|input form tables (login, register, password reset,
   resend confirmation, ...) render as a real 2-column <table> with no
   responsive treatment -- on a phone-width viewport the label <th> and
   the (default-sized, unconstrained) <input> <td> together exceed the
   viewport, pushing the actual input fields off-screen to the right
   (found 2026-07-14 checking the login page on mobile: only a sliver of
   each text box was visible past its card border). Stack label-above-
   input below 560px instead of trying to shrink a side-by-side layout
   that was never going to fit both columns at once. */
@media(max-width:560px){
  .generic-form-table,.generic-form-table tbody,.generic-form-table tr,
  .generic-form-table th,.generic-form-table td{display:block;width:100%}
  .generic-form-table tr{margin-bottom:10px}
  .generic-form-table th{text-align:left;padding:0 0 6px}
  .generic-form-table td{padding:0}
  .generic-form-table input[type=text],.generic-form-table input[type=password],
  .generic-form-table input[type=email],.generic-form-table input[type=number],
  .generic-form-table select{width:100%}
}

/* ============ FORMS ============ */
input[type=text],input[type=password],input[type=email],input[type=number],
input[type=search],input[type=date],select,textarea{
  font-family:var(--body)!important;font-size:14px!important;color:var(--text)!important;
  background:rgba(var(--void-rgb),.6)!important;border:1px solid var(--line)!important;border-radius:0!important;
  padding:10px 13px!important;transition:.2s!important;outline:none!important;max-width:100%}
input:focus,select:focus,textarea:focus{border-color:var(--gold)!important;
  background:rgba(var(--violet-rgb),.4)!important;box-shadow:0 0 0 3px rgba(var(--gold-bright-rgb),.12)!important}
select option{background:#0c0823;color:var(--text)}
input[type=submit],input[type=button],button,.button,.toggler{
  font-family:var(--disp)!important;font-weight:700!important;letter-spacing:1.2px!important;text-transform:uppercase!important;
  font-size:12.5px!important;color:#1a1206!important;cursor:pointer;border:none!important;border-radius:0!important;
  padding:11px 22px!important;background:linear-gradient(135deg,var(--gold-hi),var(--gold),var(--gold-deep))!important;
  box-shadow:0 5px 20px rgba(var(--gold-bright-rgb),.24);transition:.22s!important;
  clip-path:polygon(8px 0,100% 0,calc(100% - 8px) 100%,0 100%)}
input[type=submit]:hover,input[type=button]:hover,button:hover,.button:hover,.toggler:hover{
  transform:translateY(-2px);box-shadow:0 9px 28px rgba(var(--gold-bright-rgb),.4)}
label{color:var(--parchment);font-size:13px}
fieldset{border:1px solid var(--line);padding:18px;margin:0 0 18px;background:var(--panel2)}
legend{font-family:var(--disp);color:var(--gold);font-size:12px;letter-spacing:2px;text-transform:uppercase;padding:0 10px}

/* ============ LOGIN BAR (nirvana slim replacement) ============ */
#loginbox{display:none!important} /* legacy default-theme table, if it ever renders */
.nv-loginbar{display:flex;align-items:center;gap:10px;margin:0 0 22px;padding:9px 16px;font-size:13px;color:var(--muted);
  background:linear-gradient(90deg,rgba(var(--violet-rgb),.32),rgba(var(--void3-rgb),.18));border:1px solid var(--line);
  border-left:2px solid var(--gold);clip-path:polygon(0 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%)}
.nv-loginbar-dot{width:7px;height:7px;border-radius:50%;background:#4ade80;box-shadow:0 0 8px #4ade80;flex:none}
.nv-loginbar-txt a{color:var(--gold-bright);font-weight:600}
.nv-loginbar-srv select{padding:5px 8px!important;font-size:12px!important}
.nv-loginbar-out{margin-left:auto;font-size:12px;color:var(--muted2);letter-spacing:.4px;border:1px solid var(--line);padding:5px 12px}
.nv-loginbar-out:hover{color:var(--gold-hi);border-color:var(--gold)}

/* ============ KILL REMAINING WHITE SURFACES (flux.css #fff) ============ */
.generic-form,.generic-form-div,.info-text,#server_status,.request,.fs-path,
.raw-txn-log,.important .server-name,.box,.head,.sub-head{
  background:var(--panel2)!important;color:var(--text)!important;border-color:var(--line)!important}
.pages .current-page{background:linear-gradient(135deg,var(--gold-hi),var(--gold-deep))!important;color:#1a1206!important}

/* ============ SUB / PAGE MENUS (module tabs) ============ */
#submenu,.submenu,#pagemenu,.page-menu{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 24px;
  padding:0 0 14px;border-bottom:1px solid var(--line);list-style:none}
.page-menu-item,#submenu a,#pagemenu a,.submenu a{
  font-family:var(--disp);font-size:11.5px;font-weight:600;letter-spacing:1.2px;text-transform:uppercase;
  color:var(--muted);padding:8px 15px;border:1px solid transparent;transition:.2s;display:inline-block}
.page-menu-item:hover,#submenu a:hover,#pagemenu a:hover,.submenu a:hover{
  color:var(--gold-hi);border-color:var(--line2);background:rgba(var(--gold-bright-rgb),.06)}
.page-menu-item.active,#submenu a.active,.submenu a.current{color:#1a1206;
  background:linear-gradient(135deg,var(--gold-bright),var(--gold-deep))}

/* ============ PAGINATION ============ */
.paginator,.pages{display:flex;gap:5px;flex-wrap:wrap;align-items:center;margin:20px 0;justify-content:center}
.paginator a,.pages a,.paginator span,.pages span{
  min-width:34px;text-align:center;padding:7px 10px;border:1px solid var(--line);
  font-family:var(--disp);font-size:13px;color:var(--muted);transition:.2s}
.paginator a:hover,.pages a:hover{border-color:var(--gold);color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.08)}
.paginator .current,.pages .current,.paginator strong,.pages strong{
  color:#1a1206;background:linear-gradient(135deg,var(--gold-bright),var(--gold-deep));border-color:var(--gold)}

/* ============ NEWS (homepage CMS blocks when logged in) ============ */
.newsDiv{background:var(--panel2);border:1px solid var(--line);border-left:3px solid var(--gold);
  padding:20px 24px;margin:0 0 20px}
.newsDiv h4{font-family:var(--disp);color:var(--gold-hi);margin:0 0 6px;font-size:19px}
.newsDate{color:var(--muted2);font-size:12px}
.news_link a{font-size:12px;letter-spacing:1px;text-transform:uppercase}

/* ============ FOOTER ============ */
#nv-footer{border-top:1px solid var(--line);margin-top:60px;padding:50px 26px 34px;position:relative;z-index:1}
.nv-foot-grid{max-width:var(--max);margin:0 auto;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:30px}
.nv-foot-mark{font-family:var(--deco);font-weight:900;letter-spacing:2px;font-size:23px;
  background:linear-gradient(180deg,var(--gold-hi),var(--gold-deep));-webkit-background-clip:text;background-clip:text;color:transparent}
.nv-foot-grid h5{font-family:var(--disp);font-size:12px;letter-spacing:2px;text-transform:uppercase;color:var(--gold);margin:0 0 14px}
.nv-foot-grid a{display:block;color:var(--muted);font-size:13.5px;padding:5px 0}
.nv-foot-grid a:hover{color:var(--gold-hi)}
.nv-foot-note{max-width:var(--max);margin:36px auto 0;text-align:center;color:var(--muted2);font-size:11.5px;letter-spacing:.4px}
#copyright,#info{color:var(--muted2)!important;font-size:11px!important;text-align:center}
#copyright a{color:var(--muted)}
@media(max-width:760px){.nv-foot-grid{grid-template-columns:1fr 1fr}}

/* misc utility from default views */
.clear{clear:both}
.toggler{display:inline-block}
hr{border:0;border-top:1px solid var(--line);margin:24px 0}
code,pre{font-family:ui-monospace,monospace;background:rgba(var(--void-rgb),.6);border:1px solid var(--line);
  padding:2px 6px;color:var(--gold-bright);border-radius:0}

/* Grand Bazaar */
.nv-bazaar-hero{padding:10px 0 22px}
.nv-bazaar-balances{display:flex;gap:14px;align-items:center;margin-top:10px;flex-wrap:wrap}
.nv-bal{padding:6px 14px;border:1px solid var(--line);font-size:13px;letter-spacing:.4px}
.nv-bal-glory{color:var(--gold-hi);border-color:rgba(var(--gold-bright-rgb),.35)}
.nv-bal-crystal{color:#9fb4ff;border-color:rgba(123,108,255,.35)}
.nv-bal-link{color:var(--muted);font-size:13px;margin-left:auto}
/* W2 live layer: one-shot flash when a polled value actually changes --
   distinct from the site's existing pulse keyframes (nvcp-live/nvwbpulse),
   which are continuous loops for "this is live" status dots,
   not a single flash for "this number just moved". Class is added then
   removed after one play (JS listens for animationend) so it can retrigger
   on the next change. */
@keyframes nv-cp-flash{0%{text-shadow:0 0 0 transparent}30%{text-shadow:0 0 14px currentColor}100%{text-shadow:0 0 0 transparent}}
.nv-bal.nv-cp-flashing .nv-cp-count{animation:nv-cp-flash 1.1s ease-out}
@media(prefers-reduced-motion:reduce){.nv-bal.nv-cp-flashing .nv-cp-count{animation:none}}
.nv-plus-badge{padding:6px 14px;border:1px solid rgba(var(--gold-bright-rgb),.6);background:rgba(var(--gold-bright-rgb),.08);color:var(--gold-hi);font-size:12px;letter-spacing:.5px;font-family:var(--disp)}
.nv-cart-link.active{color:var(--gold-hi)}
.nv-cart-badge{display:inline-block;min-width:15px;padding:1px 5px;border-radius:9px;background:var(--gold-bright);color:#1a1206;font-size:10px;font-weight:700;text-align:center;line-height:1.4}
.nv-cart-lines{display:flex;flex-direction:column;gap:10px;margin:16px 0}
.nv-cart-line{display:flex;gap:12px;align-items:flex-start;padding:12px;border:1px solid var(--line);background:rgba(255,255,255,.02)}
.nv-cart-line-issue{border-color:rgba(220,90,90,.5);background:rgba(220,90,90,.06)}
.nv-cart-line-info{flex:1;min-width:0}
.nv-cart-line-name{font-weight:600;color:var(--fg)}
.nv-cart-line-meta{font-size:11px;color:var(--muted);margin-top:2px}
.nv-cart-line-warn{font-size:12px;color:#e08a8a;margin-top:6px}
.nv-cart-line-price{font-size:13px;color:var(--fg);margin-top:6px;display:flex;align-items:center;flex-wrap:wrap;gap:2px}
.nv-cart-price-changed{font-size:11px;color:var(--muted2);margin-left:6px}
.nv-cart-line-actions{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex-shrink:0}
.nv-cart-gift-details summary{list-style:none}
.nv-cart-gift-details summary::-webkit-details-marker{display:none}
.nv-cart-gift-details[open]{width:220px}
.nv-cart-summary{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);display:flex;flex-direction:column;align-items:flex-end;gap:6px}
.nv-cart-total{font-size:15px;font-weight:600;color:var(--fg)}
/* P4.C item detail tabs */
.nv-item-tabs{margin-top:24px}
.nv-item-tabbar{display:flex;gap:4px;border-bottom:1px solid var(--line);overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.nv-item-tabbar::-webkit-scrollbar{display:none}
.nv-item-tab{flex:0 0 auto;background:none;border:none;border-bottom:2px solid transparent;color:var(--muted);
  padding:10px 16px;font-size:13px;font-family:var(--body);cursor:pointer;white-space:nowrap;min-height:44px}
.nv-item-tab:hover{color:var(--fg)}
.nv-item-tab.active{color:var(--gold-hi);border-bottom-color:var(--gold-bright)}
.nv-item-tabpanel{display:none;padding:18px 4px;color:var(--fg)}
.nv-item-tabpanel.active{display:block}
.nv-item-tab-empty{color:var(--muted2);font-size:12px;font-style:italic}
.nv-item-statgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}
.nv-item-stat{display:flex;flex-direction:column;gap:2px;padding:8px 12px;border:1px solid var(--line);background:rgba(255,255,255,.02)}
.nv-item-stat span{font-size:10.5px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted2)}
.nv-item-stat b{font-size:14px;color:var(--fg)}
.nv-item-stat-wide{grid-column:1/-1}
.nv-item-droplist{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.nv-item-droplist li{padding:8px 12px;border:1px solid var(--line);background:rgba(255,255,255,.02);font-size:13px}
/* P4.E compare tray -- same left:50%+width:100vw+translateX(-50%) full-bleed
   fix as the P4.B mobile bars (see nirvana-backdrop-filter-fixed-position-
   containing-block-trap): .nv-content's backdrop-filter would otherwise
   constrain this fixed bar to its padded box, not the true viewport. */
.nv-compare-btn{position:absolute;top:8px;right:72px;z-index:2;width:26px;height:26px;display:flex;align-items:center;justify-content:center;
  background:rgba(var(--void-rgb),.7);border:1px solid var(--line);cursor:pointer;font-size:12px;padding:0;color:var(--muted)}
.nv-compare-btn:hover{border-color:var(--gold-bright)}
.nv-compare-btn.active{border-color:var(--gold-bright);background:rgba(var(--gold-bright-rgb),.15);color:var(--gold-hi)}
.nv-compare-tray{display:none;position:fixed;left:50%;bottom:0;width:100vw;transform:translateX(-50%);box-sizing:border-box;
  z-index:55;align-items:center;gap:10px;padding:10px 16px;background:rgba(var(--void-rgb),.95);backdrop-filter:blur(8px);
  border-top:1px solid var(--gold-bright)}
.nv-compare-tray.show{display:flex}
.nv-compare-tray-items{display:flex;gap:8px;flex:1;overflow-x:auto}
.nv-compare-chip{flex:0 0 auto;display:flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--line);font-size:11px;background:rgba(255,255,255,.03)}
.nv-compare-chip button{background:none;border:none;color:var(--muted2);cursor:pointer;font-size:12px;padding:0}
.nv-compare-panel{display:none;position:fixed;left:50%;bottom:0;width:100vw;transform:translateX(-50%);box-sizing:border-box;
  max-height:80vh;overflow-y:auto;z-index:61;background:var(--panel-bg,#150f24);border-radius:14px 14px 0 0;
  box-shadow:0 -8px 30px rgba(0,0,0,.5);padding:16px}
.nv-compare-panel.open{display:block}
.nv-compare-panel-backdrop{display:none;position:fixed;left:50%;top:0;bottom:0;width:100vw;transform:translateX(-50%);box-sizing:border-box;
  background:rgba(0,0,0,.55);z-index:60}
.nv-compare-panel-backdrop.open{display:block}
.nv-compare-table{width:100%;border-collapse:collapse;font-size:12px}
.nv-compare-table th,.nv-compare-table td{padding:6px 10px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
.nv-compare-table th{color:var(--muted2);font-weight:400;text-transform:uppercase;font-size:10px;letter-spacing:.5px}
@media(max-width:760px){.nv-compare-table{display:block;overflow-x:auto}}
@media(max-width:560px){
  .nv-item-statgrid{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:560px){
  .nv-cart-line{flex-wrap:wrap}
  .nv-cart-line-actions{flex-direction:row;align-items:center;width:100%;justify-content:flex-end}
}
.nv-bazaar-card-price s{color:var(--muted2);opacity:.7;margin-right:4px;font-size:11px}
.nv-btn s{color:rgba(26,18,6,.55);margin-right:4px;font-size:12px}
.nv-bazaar-filters{display:flex;gap:10px;margin:20px 0;flex-wrap:wrap;position:relative}
.nv-bazaar-filters select,.nv-bazaar-filters input[type=text]{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:8px 12px;font-family:var(--body)}
.nv-adv-panel{display:none;width:100%;border:1px solid var(--line);padding:16px;margin-top:6px;background:rgba(255,255,255,.015)}
.nv-adv-panel.open{display:block}
.nv-adv-close{display:none}
.nv-adv-backdrop{display:none}
@media(max-width:760px){
  /* Bottom-sheet drawer: the SAME #nv-adv panel + Advanced button used
     inline on wider screens (>760px: inline rail per the plan's own table)
     is repositioned as a fixed overlay here, not a second parallel UI. */
  /* left:50%+width:100vw+translateX(-50%) here (and combined into the same
     transform as the slide animation below) for the same reason documented
     by .nv-bz2-mobilebuybar above -- .nv-content's backdrop-filter creates a
     containing block that left:0;right:0 would silently resolve against
     instead of the true viewport. */
  .nv-adv-panel{position:fixed;left:50%;bottom:0;top:auto;width:100vw;box-sizing:border-box;max-height:80vh;
    overflow-y:auto;margin:0;border-radius:14px 14px 0 0;z-index:61;
    background:var(--panel-bg,#150f24);box-shadow:0 -8px 30px rgba(0,0,0,.5);
    transform:translateX(-50%) translateY(100%);transition:transform .25s ease;display:block}
  .nv-adv-panel.open{transform:translateX(-50%) translateY(0)}
  .nv-adv-backdrop{display:block;position:fixed;left:50%;top:0;bottom:0;width:100vw;transform:translateX(-50%);box-sizing:border-box;background:rgba(0,0,0,.55);z-index:60;
    opacity:0;pointer-events:none;transition:opacity .25s ease}
  .nv-adv-backdrop.open{opacity:1;pointer-events:auto}
  .nv-adv-row{flex-direction:column;align-items:stretch}
  .nv-adv-row label,.nv-adv-row select,.nv-adv-row input{width:100%}
  .nv-adv-close{display:flex;align-items:center;justify-content:center;width:100%;min-height:44px;
    background:none;border:0;border-bottom:1px solid var(--line);color:var(--muted);font-size:13px;
    cursor:pointer;position:sticky;top:0;background:var(--panel-bg,#150f24);z-index:1}
}
.nv-bz2-mobilebar{display:none}
@media(max-width:560px){
  .nv-bz2-mobilebar{display:flex;position:fixed;left:50%;bottom:0;width:100vw;transform:translateX(-50%);z-index:45;
    align-items:center;gap:10px;padding:10px 14px;background:var(--panel-bg,#150f24);
    border-top:1px solid var(--line);box-shadow:0 -4px 16px rgba(0,0,0,.4);box-sizing:border-box}
  .nv-bz2-mobilebar .nv-bal{font-size:13px}
  .nv-bz2-mobilebar .nv-cart-mobilebtn{margin-left:auto;position:relative;min-width:44px;min-height:44px;
    display:flex;align-items:center;justify-content:center;font-size:18px;padding:0}
  .nv-bz2-mobilebar .nv-cart-badge{position:absolute;top:2px;right:2px}
  .nv-bazaar{padding-bottom:64px}
}
.nv-adv-row{display:flex;gap:20px;flex-wrap:wrap;align-items:flex-end;margin-bottom:12px}
.nv-adv-row:last-child{margin-bottom:0}
.nv-adv-row label{display:flex;flex-direction:column;gap:6px;font-size:11px;letter-spacing:.5px;text-transform:uppercase;color:var(--muted2)}
.nv-adv-row label.nv-adv-check{flex-direction:row;align-items:center;text-transform:none;font-size:13px;color:var(--muted)}
.nv-adv-row select,.nv-adv-row input[type=number]{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:7px 10px;font-family:var(--body);width:120px}
.nv-bazaar-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:14px;margin:18px 0}
.nv-bazaar-card{display:block;padding:16px;border:1px solid var(--line);background:rgba(255,255,255,.02);text-decoration:none;transition:transform .2s,border-color .2s}
.nv-bazaar-card:hover{transform:translateY(-3px);border-color:var(--gold)}
.nv-bazaar-card-rarity{font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted2);margin-bottom:6px}
.nv-bazaar-card-name{font-family:var(--disp);font-size:15px;color:var(--fg);margin-bottom:4px}
.nv-bazaar-card-cat{font-size:12px;color:var(--muted);margin-bottom:10px}
.nv-bazaar-card-price{display:flex;gap:10px;font-size:13px}
.nv-bazaar-card-price span:first-child{color:var(--gold-hi)}
.nv-bazaar-card-price span:last-child{color:#9fb4ff}
.nv-bazaar-card.rarity-2{border-color:rgba(59,130,246,.3)}
.nv-bazaar-card.rarity-3{border-color:rgba(139,92,246,.4)}
.nv-bazaar-card.rarity-4{border-color:rgba(245,158,11,.5)}
.nv-bazaar-card.rarity-5{border-color:rgba(239,68,68,.55)}
.nv-bazaar-featured{margin-bottom:10px}
.nv-bazaar-featured h3{font-family:var(--disp);color:var(--gold-hi);font-size:15px;letter-spacing:1px}
.nv-bazaar-detail{padding:26px;border:1px solid var(--line);max-width:900px}
.nv-bazaar-back{color:var(--muted);font-size:13px;display:inline-block;margin-bottom:16px}
.nv-bazaar-buyform{margin-top:18px;display:flex;flex-direction:column;gap:10px;align-items:flex-start}
.nv-btn{background:linear-gradient(180deg,var(--gold-hi),var(--gold-deep));color:#1a1206;border:0;padding:10px 18px;font-family:var(--disp);letter-spacing:.5px;cursor:pointer}
.nv-btn-crystal{background:linear-gradient(180deg,#9fb4ff,#4b3fb0);color:#0b0820}
.nv-bazaar-buyform input[type=text]{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:8px 12px;font-family:var(--body);margin-top:4px}
.nv-paginator{margin:24px 0}
.nv-card-badges{display:flex;gap:4px;flex-wrap:wrap;margin-bottom:8px}
.nv-badge{display:inline-block;padding:2px 8px;font-size:9px;letter-spacing:1px;text-transform:uppercase;border:1px solid var(--line);font-family:var(--disp)}
.nv-badge-plus{color:var(--gold-hi);border-color:rgba(var(--gold-bright-rgb),.5);background:rgba(var(--gold-bright-rgb),.08)}
.nv-badge-limited{color:#ff9f9f;border-color:rgba(255,93,143,.4);background:rgba(255,93,143,.08)}
/* P2.5/P2.6: origin badge + slot pips -- same small-caps pill language as
   .nv-badge, sized for an inline run alongside the rarity line/badge rail. */
.nv-origin-badge{display:inline-block;padding:1px 6px;font-size:8.5px;letter-spacing:.8px;text-transform:uppercase;border:1px solid;border-radius:2px;font-family:var(--disp);opacity:.85}
.nv-slot-pips{display:inline-block;font-size:10px;letter-spacing:1px;color:var(--gold);opacity:.8;margin-left:4px}
.nv-daily-cap{margin-top:12px;max-width:360px}
.nv-daily-cap-label{font-size:11px;color:var(--muted)}
.nv-daily-cap-bar{height:5px;margin-top:5px;background:rgba(255,255,255,.06);border:1px solid var(--line)}
.nv-daily-cap-fill{height:100%;background:linear-gradient(90deg,var(--gold),var(--gold-hi))}
.nv-daily-cap-fill.full{background:linear-gradient(90deg,#ff5d8f,#ff9f9f)}
.nv-plus-lock{border:1px solid rgba(var(--gold-bright-rgb),.4);background:rgba(var(--gold-bright-rgb),.06);padding:16px;margin-top:14px}
.nv-plus-lock p{margin:0 0 10px;color:var(--gold-hi);font-size:14px}
.nv-flash-cta{margin-left:8px;font-weight:600;white-space:nowrap}

/* ===== Grand Bazaar v2 (Phase B storefront redesign, nv-bz2-*) ===== */
.nv-bz2-stickybar{position:sticky;top:70px;z-index:50;display:flex;gap:14px;align-items:center;
  padding:10px 16px;margin:0 0 16px;background:rgba(var(--void3-rgb),.92);backdrop-filter:blur(10px);
  border:1px solid var(--line);opacity:0;pointer-events:none;transform:translateY(-6px);transition:.25s}
.nv-bz2-stickybar.show{opacity:1;pointer-events:auto;transform:translateY(0)}
.nv-bz2-stickybar .nv-bal{padding:4px 10px;font-size:12px}
.nv-bz2-stickybar-search{margin-left:auto;background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:6px 10px;font-family:var(--body);font-size:12px;width:180px}

.nv-bz2-shelf{margin:8px 0 30px}
.nv-bz2-shelf-head{display:flex;align-items:baseline;gap:10px;margin-bottom:14px}
.nv-bz2-shelf-head h3{font-family:var(--disp);font-size:16px;letter-spacing:1px;margin:0;color:var(--gold-hi)}
.nv-bz2-shelf-sub{font-size:12px;color:var(--muted)}
.nv-bz2-shelf-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px}
.nv-bz2-shelfcard{--shelf-a:var(--gold);--shelf-glow:rgba(var(--gold-bright-rgb),.28);position:relative;display:block;
  border:1px solid rgba(var(--gold-bright-rgb),.15);border-radius:16px;
  background:linear-gradient(180deg,rgba(255,255,255,.03),rgba(255,255,255,.005));
  text-decoration:none;overflow:hidden;transition:transform .32s var(--ease-rune),border-color .32s,box-shadow .32s}
.nv-bz2-shelfcard:hover{transform:translateY(-6px);border-color:var(--shelf-a);box-shadow:0 18px 42px rgba(0,0,0,.45)}
.nv-bz2-shelfcard.nv-bz2-vault{--shelf-a:#8a94a6;--shelf-glow:rgba(138,148,166,.22)}
.nv-bz2-shelfcard.nv-bz2-festival{--shelf-a:#7b6cff;--shelf-glow:rgba(123,108,255,.32)}
.nv-bz2-shelf-portrait{position:relative;height:132px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(120% 100% at 50% 8%,rgba(var(--gold-rgb),0) 0%,rgba(var(--gold-rgb),.22) 100%),linear-gradient(180deg,#fdfaf1 0%,#f0dfb8 100%);border-bottom:1px solid rgba(var(--gold-bright-rgb),.18)}
.nv-bz2-shelf-portrait::after{content:'';position:absolute;left:50%;bottom:15px;width:min(46%,100px);height:9px;transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%,rgba(28,22,54,.20),transparent 72%);pointer-events:none;transition:.32s var(--ease-rune)}
.nv-bz2-shelf-portrait img{position:relative;max-height:94px;max-width:62%;object-fit:contain;
  filter:drop-shadow(0 4px 7px rgba(28,22,54,.20));transition:transform .32s var(--ease-rune),filter .32s}
.nv-bz2-shelfcard:hover .nv-bz2-shelf-portrait img{transform:translateY(-5px) scale(1.04);filter:drop-shadow(0 9px 15px rgba(28,22,54,.26))}
.nv-bz2-shelfcard:hover .nv-bz2-shelf-portrait::after{width:min(38%,84px);opacity:.7}
.nv-bz2-shelf-body{padding:14px 16px}
.nv-bz2-shelf-name{font-family:var(--disp);font-size:14px;color:var(--fg);margin-bottom:6px}
.nv-bz2-shelf-countdown{font-size:11px;color:var(--shelf-a);letter-spacing:.4px;margin-bottom:8px}
.nv-bz2-shelf-stockbar{height:4px;background:rgba(255,255,255,.06);border:1px solid var(--line);margin-bottom:8px}
.nv-bz2-shelf-stockfill{height:100%;background:var(--shelf-a)}
.nv-bz2-shelf-price{display:flex;gap:10px;font-size:12px}
.nv-bz2-shelf-price .g{color:var(--gold-hi)}
.nv-bz2-shelf-price .c{color:#9fb4ff}

/* P0.4: hero layout when the featured pool has <3 items -- a lonely card in
   a 5-col grid read as broken; mirrors the shelfcard portrait treatment. */
.nv-bz2-hero-grid{display:grid;gap:16px;margin:18px 0}
.nv-bz2-hero-grid-1{grid-template-columns:1fr}
.nv-bz2-hero-grid-2{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.nv-bz2-hero{position:relative;display:block;border:1px solid rgba(var(--gold-bright-rgb),.15);border-radius:16px;overflow:hidden;
  background:linear-gradient(180deg,rgba(255,255,255,.03),rgba(255,255,255,.005))}
.nv-bz2-hero.rarity-2{border-color:rgba(59,130,246,.3)}
.nv-bz2-hero.rarity-3{border-color:rgba(139,92,246,.4)}
.nv-bz2-hero.rarity-4{border-top:2px solid var(--gold);border-color:rgba(245,158,11,.5)}
.nv-bz2-hero.rarity-5{border-top:2px solid #ff5d8f;border-color:rgba(239,68,68,.55);box-shadow:0 0 22px rgba(239,68,68,.12)}
.nv-bz2-hero-link{display:flex;gap:24px;align-items:center;padding:24px;color:inherit;text-decoration:none}
.nv-bz2-hero-portrait{position:relative;flex:0 0 176px;height:176px;display:flex;align-items:center;justify-content:center;
  border-radius:12px;background:radial-gradient(120% 100% at 50% 8%,rgba(var(--gold-rgb),0) 0%,rgba(var(--gold-rgb),.22) 100%),linear-gradient(180deg,#fdfaf1 0%,#f0dfb8 100%);border:1px solid rgba(var(--gold-bright-rgb),.18)}
.nv-bz2-hero-portrait::after{content:'';position:absolute;left:50%;bottom:20px;width:min(42%,102px);height:10px;transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%,rgba(28,22,54,.20),transparent 72%);pointer-events:none;transition:.32s var(--ease-rune)}
.nv-bz2-hero-portrait img{position:relative;max-height:132px;max-width:70%;object-fit:contain;
  filter:drop-shadow(0 5px 9px rgba(28,22,54,.20));transition:transform .32s var(--ease-rune),filter .32s}
.nv-bz2-hero:hover .nv-bz2-hero-portrait img{transform:scale(1.05)}
.nv-bz2-hero-body{flex:1;min-width:200px}
.nv-bz2-hero-name{font-family:var(--disp);font-size:22px;color:var(--fg);margin:6px 0 4px}
.nv-bz2-hero-cat{font-size:12px;color:var(--muted);margin-bottom:12px}
.nv-bz2-hero-price{display:flex;gap:14px;font-size:15px;margin-bottom:16px}
.nv-bz2-hero-price .g{color:var(--gold-hi)}
.nv-bz2-hero-price .c{color:#9fb4ff}
@media(max-width:640px){.nv-bz2-hero-link{flex-direction:column;text-align:center;padding:18px}.nv-bz2-hero-portrait{flex:0 0 auto;width:100%}}

.nv-bz2-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:16px;margin:18px 0}
/* P4.B mobile-first shell: explicit column counts per the plan's own
   breakpoint table, layered on top of the auto-fill default above (which
   still governs any width the table doesn't pin down, e.g. > 960px). */
@media(max-width:960px){.nv-bz2-grid{grid-template-columns:repeat(4,1fr)}}
@media(max-width:760px){.nv-bz2-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.nv-bz2-grid{grid-template-columns:repeat(2,1fr);gap:10px}}
.nv-bz2-card{position:relative;display:block;border:1px solid rgba(var(--gold-bright-rgb),.15);border-radius:14px;overflow:hidden;
  background:linear-gradient(180deg,rgba(255,255,255,.03),rgba(255,255,255,.005));
  text-decoration:none;transition:transform .32s var(--ease-rune),border-color .32s,box-shadow .32s}
.nv-bz2-card:hover{transform:translateY(-6px);border-color:rgba(var(--gold-bright-rgb),.5);
  box-shadow:0 16px 38px rgba(0,0,0,.42)}
.nv-bz2-card.rarity-2{border-color:rgba(59,130,246,.26)}
.nv-bz2-card.rarity-3{border-color:rgba(139,92,246,.3)}
.nv-bz2-card.rarity-4{border-color:rgba(245,158,11,.34)}
.nv-bz2-card.rarity-5{border-color:rgba(239,68,68,.34)}
.nv-bz2-card.rarity-4:hover{border-color:rgba(245,158,11,.7);box-shadow:0 16px 38px rgba(0,0,0,.42),0 0 26px rgba(245,158,11,.16)}
.nv-bz2-card.rarity-5:hover{border-color:rgba(255,93,143,.7);box-shadow:0 16px 38px rgba(0,0,0,.42),0 0 26px rgba(239,68,68,.18)}
.nv-bz2-portrait{position:relative;height:104px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(120% 100% at 50% 8%,rgba(var(--gold-rgb),0) 0%,rgba(var(--gold-rgb),.22) 100%),linear-gradient(180deg,#fdfaf1 0%,#f0dfb8 100%);border-bottom:1px solid rgba(var(--gold-bright-rgb),.18)}
/* Contact shadow: grounds the sprite on the vitrine surface. Replaces the old
   heavy drop-shadow, which on a light panel rendered as a grey smudge behind
   every item (it blurs the alpha silhouette -- invisible on the dark theme it
   was designed for, conspicuous on white). */
.nv-bz2-portrait::after{content:'';position:absolute;left:50%;bottom:12px;width:min(48%,82px);height:8px;transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%,rgba(28,22,54,.20),transparent 72%);pointer-events:none;transition:.32s var(--ease-rune)}
.nv-bz2-portrait img{position:relative;max-height:76px;max-width:64%;object-fit:contain;
  filter:drop-shadow(0 3px 5px rgba(28,22,54,.20));transition:transform .32s var(--ease-rune),filter .32s}
.nv-bz2-card:hover .nv-bz2-portrait img{transform:translateY(-5px) scale(1.05);filter:drop-shadow(0 8px 13px rgba(28,22,54,.26))}
.nv-bz2-card:hover .nv-bz2-portrait::after{width:min(40%,68px);opacity:.7}
.nv-bz2-badgerail{position:absolute;top:8px;left:8px;display:flex;flex-direction:column;gap:3px;z-index:2}
.nv-bz2-pill{font-size:8.5px;letter-spacing:.8px;text-transform:uppercase;padding:2px 6px;
  background:rgba(var(--void-rgb),.85);border:1px solid var(--line);font-family:var(--disp)}
.nv-bz2-pill-plus{color:var(--gold-hi);border-color:rgba(var(--gold-bright-rgb),.5)}
.nv-bz2-pill-stock{color:#ff9f9f;border-color:rgba(255,93,143,.4)}
.nv-bz2-pill-sold{color:var(--muted2);border-color:var(--line2)}
.nv-bz2-pill-owned{color:#8fe0a8;border-color:rgba(52,211,153,.4)}
.nv-bz2-heart{position:absolute;top:8px;right:8px;z-index:2;width:26px;height:26px;display:flex;align-items:center;justify-content:center;
  background:rgba(var(--void-rgb),.7);border:1px solid var(--line);cursor:pointer;font-size:13px;padding:0}
.nv-bz2-heart:hover{border-color:#ff5d8f}
.nv-bz2-heart.active{border-color:#ff5d8f;background:rgba(255,93,143,.15)}
.nv-bz2-cartadd{position:absolute;top:8px;right:40px;z-index:2;width:26px;height:26px;display:flex;align-items:center;justify-content:center;
  background:rgba(var(--void-rgb),.7);border:1px solid var(--line);cursor:pointer;font-size:12px;padding:0}
.nv-bz2-cartadd:hover{border-color:var(--gold-bright)}
.nv-bz2-wishcount{position:absolute;bottom:8px;right:8px;z-index:2;font-size:10px;color:var(--muted2);
  background:rgba(var(--void-rgb),.7);padding:2px 6px;border:1px solid var(--line)}
.nv-bz2-body{padding:13px 15px 15px}
.nv-bz2-rarity{font-size:9px;letter-spacing:1.7px;text-transform:uppercase;color:var(--muted2);margin-bottom:6px}
.nv-bz2-name{font-family:var(--disp);font-size:14.5px;color:var(--fg);margin-bottom:4px;line-height:1.35}
.nv-bz2-cat{font-size:11px;color:var(--muted);margin-bottom:10px}
.nv-bz2-price{display:flex;gap:9px;font-size:12.5px;align-items:center;flex-wrap:wrap}
.nv-bz2-price .g{color:var(--gold-hi)}
.nv-bz2-price .c{color:#9fb4ff}
.nv-bz2-price-plus{font-size:9px;color:var(--gold-hi);border:1px solid rgba(var(--gold-bright-rgb),.4);padding:1px 5px;margin-left:2px}

.nv-bz2-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:16px 0}
@media(max-width:760px){
  .nv-bz2-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding-bottom:2px}
  .nv-bz2-tabs::-webkit-scrollbar{display:none}
  .nv-bz2-tabs .nv-bz2-tab{flex:0 0 auto}
  .nv-bz2-tab{padding:11px 16px;min-height:44px;display:inline-flex;align-items:center}
}
.nv-bz2-tab{font-size:12px;letter-spacing:.4px;color:var(--muted);border:1px solid var(--line);
  padding:7px 14px;text-decoration:none;transition:.2s}
.nv-bz2-tab:hover{color:var(--gold-hi);border-color:var(--gold)}
.nv-bz2-tab.active{color:var(--gold-hi);border-color:var(--gold);background:rgba(var(--gold-bright-rgb),.08)}

.nv-bz2-detailgrid{display:grid;grid-template-columns:minmax(240px,340px) 1fr;gap:30px}
@media(max-width:760px){.nv-bz2-detailgrid{grid-template-columns:1fr}}
.nv-bz2-detail-left .nv-item-hero{margin-bottom:14px}
.nv-bz2-collcard{border:1px solid rgba(var(--gold-bright-rgb),.3);background:rgba(var(--gold-bright-rgb),.05);padding:12px 14px;font-size:12.5px;color:var(--muted)}
.nv-bz2-collcard b{color:var(--gold-hi)}
.nv-bz2-gift-toggle{background:none;border:1px solid var(--line);color:var(--muted);padding:6px 12px;font-size:12px;cursor:pointer;margin-top:10px}
.nv-bz2-gift-toggle:hover{color:var(--gold-hi);border-color:var(--gold)}
.nv-bz2-gift-box{display:none;margin-top:10px}
.nv-bz2-gift-box.open{display:block}
.nv-bz2-related{margin-top:34px}
.nv-bz2-related h4{font-family:var(--disp);color:var(--gold-hi);font-size:14px;letter-spacing:.6px;margin-bottom:12px}
.nv-bz2-modal-backdrop{display:none;position:fixed;inset:0;z-index:500;background:rgba(4,2,12,.72);backdrop-filter:blur(2px);
  align-items:center;justify-content:center}
.nv-bz2-modal-backdrop.open{display:flex}
.nv-bz2-modal{width:340px;max-width:calc(100vw - 32px);background:linear-gradient(180deg,rgba(var(--void3-rgb),.98),rgba(var(--void-rgb),.98));
  border:1px solid var(--line);padding:22px;box-shadow:0 20px 60px rgba(0,0,0,.5)}
.nv-bz2-modal h4{font-family:var(--disp);color:var(--gold-hi);font-size:15px;margin:0 0 14px}
.nv-bz2-modal-row{display:flex;justify-content:space-between;font-size:13px;color:var(--muted);padding:6px 0;border-bottom:1px solid var(--line)}
.nv-bz2-modal-row b{color:var(--fg)}
.nv-bz2-modal-actions{display:flex;gap:10px;margin-top:18px}
.nv-bz2-modal-actions button{flex:1}

.nv-bz2-orderrow{display:flex;gap:14px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line)}
.nv-bz2-orderrow img{width:40px;height:40px;object-fit:contain;image-rendering:pixelated;background:rgba(255,255,255,.03);border:1px solid var(--line);padding:4px}
.nv-bz2-orderinfo{flex:1;min-width:0}
.nv-bz2-orderinfo .name{font-size:13.5px;color:var(--fg)}
.nv-bz2-orderinfo .meta{font-size:11px;color:var(--muted)}
.nv-bz2-chip{font-size:10px;letter-spacing:.6px;text-transform:uppercase;padding:3px 9px;white-space:nowrap}
.nv-bz2-chip-pending{color:#ffcf8f;border:1px solid rgba(255,207,143,.4);background:rgba(255,207,143,.08)}
.nv-bz2-chip-delivered{color:#8fe0a8;border:1px solid rgba(52,211,153,.4);background:rgba(52,211,153,.08)}
.nv-bz2-chip-gift{color:#9fb4ff;border:1px solid rgba(159,180,255,.4);background:rgba(159,180,255,.08)}
.nv-bz2-chip-refunded{color:var(--muted2);border:1px solid var(--line2);background:rgba(255,255,255,.02)}
/* P3 audit: 'expired' (30-day auto-sweep) was falling back to the refunded
   chip's exact styling -- same muted grey, easy to misread as a staff refund.
   Distinct (still muted-family, since both are "resolved/inactive") violet tint. */
.nv-bz2-chip-expired{color:#c9b6ff;border:1px solid rgba(201,182,255,.35);background:rgba(201,182,255,.06)}
.nv-bz2-buyagain{font-size:11px;color:var(--muted);margin-left:10px}
@media(max-width:640px){
  .nv-bz2-orderrow{flex-wrap:wrap}
  .nv-bz2-orderinfo{flex-basis:100%;order:2}
}

/* ===== P3 storefront polish ===== */
/* Card v3: owned full-card treatment -- reuses the exact desaturate technique
   already proven on .nv-coll-missing, applied to the opposite condition (you
   own it, not "you don't"), so an owned item reads instantly while browsing
   without needing to parse the badge rail. */
.nv-bz2-card.owned{opacity:.72;filter:grayscale(.5)}
.nv-bz2-card.owned:hover{opacity:1;filter:grayscale(.15)}
/* P4.E: owned/in-cart indicator for card surfaces that don't have the main
   grid's full badge-rail system (shelf/featured/because-you-own) -- bottom-
   left is the one corner not already used by the heart (top-right),
   cart-add (top-right, offset), or wishcount (bottom-right). */
.nv-bz2-statebadge{position:absolute;bottom:8px;left:8px;z-index:2;font-size:10px;
  padding:3px 7px;background:rgba(var(--void-rgb),.85);border:1px solid var(--line);color:var(--muted)}
/* Price footer hierarchy: the CURRENT payable price should read as the
   dominant number on the card; everything else (strikethrough, plus tag) is
   already visually lighter by color alone -- this adds weight contrast too. */
.nv-bz2-priceval{font-weight:700}

/* Active-filter chips + result count + persistent Clear-all. Was buried
   inside the Advanced panel before, which only auto-opened for a SUBSET of
   filters -- a plain category/search filter left no visible way to reset. */
.nv-bz2-chiprow{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:14px 0}
.nv-bz2-resultcount{font-size:12px;color:var(--muted);margin-right:4px}
.nv-bz2-filterchip{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--gold-hi);
  border:1px solid rgba(var(--gold-bright-rgb),.4);background:rgba(var(--gold-bright-rgb),.06);padding:4px 9px;text-decoration:none;transition:.2s}
.nv-bz2-filterchip:hover{border-color:var(--gold);background:rgba(var(--gold-bright-rgb),.12)}
.nv-bz2-filterchip span{color:var(--muted2)}
.nv-bz2-clearall{font-size:11px;color:var(--muted);text-decoration:underline;margin-left:2px}
.nv-bz2-clearall:hover{color:var(--gold-hi)}

/* P3.3 detail meta/stat chips -- same pill language as the card badge rail,
   laid out as a static (non-absolute) wrapping row under the hero image. */
.nv-bz2-metachips{display:flex;flex-wrap:wrap;gap:5px;margin-top:10px}
.nv-bz2-metachips .nv-bz2-pill{position:static}

/* Accessibility: broken hotlinked image placeholder (was display:none, a
   silent blank hole). Sized inline per-instance via nvImgFallback(). */
.nv-img-fallback{display:flex;align-items:center;justify-content:center;font-size:28px;opacity:.35;
  background:rgba(255,255,255,.02);border:1px dashed var(--line)}

/* Accessibility: focus-visible rings on the interactive controls that only
   had :hover before (keyboard users had no visible focus indicator at all). */
.nv-bz2-tab:focus-visible, .nv-bz2-filterchip:focus-visible, .nv-bz2-heart:focus-visible,
.nv-bz2-clearall:focus-visible, .nv-mgr-sort:focus-visible{
  outline:2px solid var(--gold-bright); outline-offset:2px;
}

/* Mobile: the sticky search bar's fixed 180px input plus balance chips could
   overflow a narrow viewport; let it shrink instead of forcing horizontal
   scroll. Bottom-fixed buy bar (detail page) is new -- thumb-reachable price
   + buy action instead of scrolling back up on a long description. */
@media(max-width:640px){
  .nv-bz2-stickybar-search{width:auto;flex:1;min-width:0}
  .nv-bz2-chiprow{gap:6px}
}
/* P4.B fix: this base rule MUST come before the @media(max-width:760px)
   override below it -- with equal specificity (one class each), later source
   order wins, so having the override BEFORE the always-on base rule (as this
   was originally written) meant display:none permanently won at every
   width, including <=760px. This mobile buy bar has been fully non-
   functional (permanently hidden) since it shipped -- confirmed via CDP
   getComputedStyle showing display:none at a 500px viewport, well inside the
   760px breakpoint, then confirmed the fix by re-checking after reordering. */
.nv-bz2-mobilebuybar{display:none;position:fixed;left:50%;bottom:0;width:100vw;transform:translateX(-50%);z-index:60;gap:10px;align-items:center;
  padding:10px 14px;background:linear-gradient(180deg,rgba(var(--void-rgb),.4),rgba(var(--void-rgb),.97) 30%);
  border-top:1px solid var(--line);backdrop-filter:blur(6px);box-sizing:border-box}
/* The two rules above/below use left:50%+width:100vw+translateX(-50%) rather
   than left:0;right:0 -- .nv-content (this theme's shared page wrapper) sets
   backdrop-filter:blur(...), and ANY backdrop-filter/filter/transform value
   other than none creates a new containing block for position:fixed
   descendants (same rule as transform, easy to forget since it's a
   different property). left:0;right:0 on a fixed descendant of .nv-content
   silently resolves against .nv-content's padded box instead of the true
   viewport -- confirmed via CDP getComputedStyle walking the ancestor chain
   (found backdropFilter:blur(8px) on .nv-content, the only non-none value in
   the whole chain). vw units aren't subject to this because they're defined
   from the initial viewport size directly, independent of the fixed-position
   containing-block algorithm, so this is the fix that actually reaches full
   width regardless of which ancestor ends up creating a containing block. */
.nv-bz2-mobilebuybar .price{flex:1;font-family:var(--disp);color:var(--gold-hi);font-size:14px}
.nv-bz2-mobilebuybar button{flex:0 0 auto}
@media(max-width:760px){
  .nv-bz2-mobilebuybar{display:flex}
}

/* Shop Manager */
.nv-mgr-tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:16px 0 24px}
.nv-mgr-tabs a{padding:10px 16px;color:var(--muted);text-decoration:none;font-size:13px;letter-spacing:.4px;border-bottom:2px solid transparent}
.nv-mgr-tabs a.active{color:var(--gold-hi);border-color:var(--gold)}
.nv-mgr-stats{display:flex;gap:16px;margin:16px 0 26px}
.nv-mgr-stat{flex:1;border:1px solid var(--line);padding:18px;text-align:center}
.nv-mgr-stat span{display:block;font-family:var(--disp);font-size:26px;color:var(--gold-hi);margin-bottom:6px}
.nv-mgr-bulk{display:flex;gap:10px;align-items:center;margin:14px 0}
.nv-mgr-bulk select{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:8px 12px}
/* W0: the bare `button` selector at css:254 sets the gold gradient with
   !important, which silently beat this class -- every destructive button on
   the site rendered GOLD. Confirmed via computed style, not by eye. The
   modifier needs !important to win, and reads the semantic token so it stays
   red in every regalia. 4 usages, all <button>, all in shopmanager.
   NOT done here: .nv-btn-crystal (css:365) is dead for the same reason, but
   it has 85 usages and is documented as misused-as-generic-secondary --
   flipping those blue is a W2/W3 button-system decision, not a token fix. */
.nv-btn-danger{background:linear-gradient(180deg,var(--danger),#a11d3a)!important;color:#2b0509!important}
.nv-btn[disabled],.nv-btn-disabled{opacity:.35;cursor:not-allowed;pointer-events:none}
.nv-mgr-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin:16px 0 26px}
/* P5.1 price-rules form + action row -- minimal layout only, this is a
   staff-only admin form, not a design investment surface. */
.nv-mgr-form{display:flex;flex-wrap:wrap;gap:12px 16px;align-items:flex-end;margin-bottom:20px}
.nv-mgr-form label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted)}
.nv-mgr-form input,.nv-mgr-form select{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:6px 8px;font-family:var(--body)}
.nv-mgr-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px}
/* P5.2 merchandising calendar */
.nv-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.nv-cal-dow{text-align:center;font-size:11px;color:var(--muted2);text-transform:uppercase;letter-spacing:.5px;padding:4px 0}
.nv-cal-cell{min-height:80px;border:1px solid var(--line);padding:4px;cursor:pointer;background:rgba(255,255,255,.01);font-size:11px}
.nv-cal-cell:hover{border-color:var(--gold-bright);background:rgba(255,255,255,.03)}
.nv-cal-cell-empty{border:none;cursor:default;background:none}
.nv-cal-cell-empty:hover{border:none;background:none}
.nv-cal-daynum{font-weight:600;color:var(--muted);margin-bottom:3px}
.nv-cal-event{padding:1px 4px;margin-bottom:2px;border-radius:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#0b0716}
.nv-cal-rotation{background:#5b8fe6}
.nv-cal-sale{background:#e7bd5b}
.nv-cal-seasonal{background:#8fe0a8}
.nv-cal-more{color:var(--muted2);font-size:10px}
@media(max-width:760px){.nv-cal-cell{min-height:56px;font-size:10px}}
.nv-mgr-card{border:1px solid var(--line);padding:16px 18px}
.nv-mgr-card h4{font-family:var(--disp);font-size:11px;letter-spacing:1.2px;text-transform:uppercase;color:var(--muted);margin:0 0 10px}
.nv-mgr-card .big{font-family:var(--disp);font-size:22px;color:var(--gold-hi)}
.nv-mgr-card .sub{font-size:11px;color:var(--muted);margin-top:4px}
.nv-mgr-card.nv-mgr-card-warn{border-color:rgba(255,93,143,.4)}
.nv-mgr-card.nv-mgr-card-warn .big{color:#ff8f8f}
.nv-mgr-card ul{list-style:none;margin:0;padding:0;font-size:12.5px}
.nv-mgr-card li{display:flex;justify-content:space-between;padding:4px 0;border-top:1px solid var(--line)}
.nv-mgr-card li:first-child{border-top:0}
.nv-mgr-sort{color:var(--muted);text-decoration:none}
.nv-mgr-sort:hover{color:var(--gold-hi)}
.nv-mgr-sort.active{color:var(--gold-hi)}
.nv-mgr-bulkbar{position:sticky;top:70px;z-index:40;display:flex;flex-wrap:wrap;gap:10px;align-items:center;
  padding:10px 14px;margin:0 0 14px;background:rgba(var(--void3-rgb),.95);backdrop-filter:blur(8px);
  border:1px solid var(--line);opacity:0;pointer-events:none;transform:translateY(-6px);transition:.2s}
.nv-mgr-bulkgroup{display:flex;gap:5px;align-items:center;padding-left:10px;border-left:1px solid var(--line)}
.nv-mgr-bulkbar.show{opacity:1;pointer-events:auto;transform:translateY(0)}
.nv-mgr-bulkbar select{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:6px 10px;font-size:12px}
.nv-mgr-bulkbar .count{font-size:12px;color:var(--gold-hi);white-space:nowrap}
.nv-mgr-spark-wrap{border:1px solid var(--line);padding:16px 18px;margin:0 0 26px}
.nv-mgr-spark-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px}
.nv-mgr-spark-head h4{font-family:var(--disp);font-size:11px;letter-spacing:1.2px;text-transform:uppercase;color:var(--muted);margin:0}
.nv-mgr-spark-head span{font-size:11px;color:var(--muted2)}
.nv-mgr-spark{display:flex;align-items:flex-end;gap:3px;height:60px}
.nv-mgr-spark-bar{flex:1;background:linear-gradient(180deg,var(--gold-hi),var(--gold-deep));min-height:2px;transition:opacity .15s}
.nv-mgr-spark-bar:hover{opacity:.7}
.nv-mgr-spark-bar.zero{background:rgba(255,255,255,.06)}
.nv-mgr-spark-bar.crystal{background:linear-gradient(180deg,#9fb4ff,#4b3fb0)}

/* P4.1 dashboard IA regroup + rarity bar */
.nv-mgr-section-h{font-family:var(--disp);font-size:12px;letter-spacing:1.4px;text-transform:uppercase;
  color:var(--muted);margin:30px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line)}
.nv-mgr-section-h:first-of-type{margin-top:0}
.nv-mgr-rarity-bar{display:flex;height:26px;border-radius:6px;overflow:hidden;border:1px solid var(--line);margin-bottom:10px}
.nv-mgr-rarity-seg{transition:opacity .15s}
.nv-mgr-rarity-seg:hover{opacity:.75}
.nv-mgr-rarity-seg.r1,.nv-mgr-rarity-legend i.r1{background:var(--muted2)}
.nv-mgr-rarity-seg.r2,.nv-mgr-rarity-legend i.r2{background:#3b82f6}
.nv-mgr-rarity-seg.r3,.nv-mgr-rarity-legend i.r3{background:#8b5cf6}
.nv-mgr-rarity-seg.r4,.nv-mgr-rarity-legend i.r4{background:var(--gold)}
.nv-mgr-rarity-seg.r5,.nv-mgr-rarity-legend i.r5{background:#ef4444}
.nv-mgr-rarity-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:11px;color:var(--muted);margin-bottom:26px}
.nv-mgr-rarity-legend span{display:inline-flex;align-items:center;gap:5px}
.nv-mgr-rarity-legend i{width:9px;height:9px;border-radius:2px;display:inline-block}

/* P4 UI/UX: Items tab density toggle */
.nv-density-compact th{padding:5px 8px!important;font-size:10px}
.nv-density-compact td{padding:3px 8px!important;font-size:11.5px}
.nv-density-compact .nv-item-thumb-sm{width:20px;height:20px}
.nv-density-toggle{background:transparent;border:1px solid var(--line);color:var(--muted);padding:5px 12px;font-size:11px;cursor:pointer;border-radius:3px}
.nv-density-toggle:hover{color:var(--gold-hi);border-color:var(--gold)}

/* Collections */
.nv-coll-card{border:1px solid var(--line);padding:20px;margin-bottom:20px}
.nv-coll-card.nv-coll-complete{border-color:rgba(var(--gold-bright-rgb),.5);background:rgba(var(--gold-bright-rgb),.03)}
.nv-coll-head{display:flex;justify-content:space-between;align-items:center}
.nv-coll-head h3{font-family:var(--disp);color:var(--fg);margin:0}
.nv-coll-progress{color:var(--gold-hi);font-size:13px}
.nv-coll-missing{opacity:.4;filter:grayscale(1)}

/* Item images (divine-pride.net) */
.nv-item-thumb-wrap{position:relative;width:64px;height:64px;margin:0 auto 10px}
.nv-item-thumb{display:block;width:64px;height:64px;object-fit:contain;image-rendering:pixelated;background:#fff;border:1px solid var(--line);padding:6px}
.nv-item-icon-badge{position:absolute;bottom:-6px;right:-6px;width:22px;height:22px;object-fit:contain;image-rendering:pixelated;background:#0b0716;border:1px solid var(--gold);border-radius:3px;padding:1px}
.nv-item-thumb-sm{display:block;width:32px;height:32px;object-fit:contain;image-rendering:pixelated}
.nv-item-hero{display:flex;align-items:flex-end;gap:10px;margin-bottom:16px}
.nv-item-thumb-lg{display:block;width:96px;height:96px;object-fit:contain;image-rendering:pixelated;background:#fff;border:1px solid var(--line);padding:10px}
.nv-item-icon{display:block;width:40px;height:40px;object-fit:contain;image-rendering:pixelated;background:#fff;border:1px solid var(--line);padding:6px}
/* Every item icon/thumbnail sitewide is served from /data/items/ (icon/
   collection/fallback), most as bare <img> tags with no class at all
   (Grand Bazaar catalogue grid, featured carousel, bundle offers, every
   Pasar Malam view). These render on a transparent background since P1's
   local-art extraction replaced the old hotlinked divine-pride images --
   which, being non-transparent JPEGs, had ACCIDENTALLY always shown items
   on a white rectangle (see ItemArt.php's own header comment). Owner asked
   for that white-backed look back as a real preference, so this restores
   it via CSS on top of the still-properly-keyed-transparent local art,
   rather than re-baking white pixels into the PNGs or reverting the P1
   extraction/transparency work itself. */
img[src^="/data/items/icon/"], img[src^="/data/items/collection/"], img[src^="/data/items/fallback/"]{background:#f6ecd6;border-radius:4px;object-fit:contain}

/* The catalogue/shelf/hero portrait wrappers above now carry the white
   background themselves (fixed-size, doesn't scale on hover). Cancel the
   generic rule on the <img> itself here specifically: those <img> tags get
   HTML width/height attributes (120x120, 190x120, 220x220) that don't
   match a sprite's real aspect ratio (typically ~75x100 native), so with
   object-fit:contain the browser reserves and letterboxes that FULL forced
   box -- painting white on the <img> itself filled that oversized box, not
   just the visible pixels. Two real bugs from that: the whole white box
   scaled on :hover along with the image (looked misaligned), and it
   extended further into the corner than the actual sprite did, colliding
   with the heart/cart-add buttons that float there. Now the drop-shadow
   filter hugs just the sprite's own transparent-PNG silhouette again. */
.nv-bz2-shelf-portrait img, .nv-bz2-portrait img, .nv-bz2-hero-portrait img{background:none}

.nv-item-desc{margin-top:16px;border:1px solid var(--line);padding:14px}
.nv-item-desc h4{margin:0 0 8px;font-family:var(--disp);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold-hi)}
.nv-item-desc p{white-space:normal;font-size:13.5px;line-height:1.6;color:var(--muted);margin:0;font-family:var(--body)}

/* Codex */
.nv-codex-section{padding:14px 0 40px;border-bottom:1px solid var(--line);scroll-margin-top:90px}
.nv-codex-section:last-child{border-bottom:0}
.nv-codex-sechead{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.nv-codex-sechead h2{font-family:var(--disp);color:var(--fg);margin:0;font-size:22px;letter-spacing:.5px}
.nv-codex-group-tag{margin-left:auto;font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted2);border:1px solid var(--line);padding:3px 8px}
.nv-codex-prose{color:var(--muted);font-size:14.5px;line-height:1.75;font-family:var(--body)}
.nv-codex-prose p{margin:0 0 12px}
.nv-codex-prose strong{color:var(--fg)}
.nv-codex-prose em{color:var(--gold-hi);font-style:italic}
.nv-codex-prose a{color:var(--gold-hi);text-decoration:underline}
.nv-codex-prose ul,.nv-codex-prose ol{margin:0 0 14px;padding-left:22px}
.nv-codex-prose li{margin-bottom:6px}
.nv-codex-prose code{font-size:12px}
.nv-codex-live{margin-top:20px;border:1px solid var(--line);background:rgba(255,255,255,.015);padding:18px}
.nv-codex-live h4{font-family:var(--disp);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold-hi);margin:0 0 12px}
.nv-codex-live table{margin:0}
.nv-codex-stats{display:flex;gap:16px;margin-bottom:14px;flex-wrap:wrap}
.nv-codex-stats div{flex:1;min-width:120px;border:1px solid var(--line);padding:14px;text-align:center;font-size:11px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2)}
.nv-codex-stats span{display:block;font-family:var(--disp);font-size:24px;color:var(--gold-hi);margin-bottom:4px;letter-spacing:0}
/* D2 (P6 2026-08-05): empty live-data states render as an INVITATION, not a
   gap -- unlit diamond seal + serif line. The copy already says "be the
   first"; now the box looks like it means it. */
.nv-codex-empty{display:flex;align-items:center;gap:12px;color:var(--muted);font-family:var(--serif);font-style:italic;font-size:13.5px;line-height:1.6;margin:0;padding:14px 16px;border:1px dashed var(--line);background:rgba(255,255,255,.012)}
.nv-codex-empty::before{content:"\25c7";flex:none;font-size:18px;color:var(--muted2);opacity:.7}
.nv-codex-first{color:var(--gold-hi);font-size:11px;letter-spacing:.5px}
/* Hall of Seasons (Season Director P2) */
.nv-codex-season-now{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:16px}
.nv-codex-season-tag{font-family:var(--disp);font-size:16px;color:var(--gold-hi)}
.nv-codex-season-phase{font-size:11px;letter-spacing:1px;text-transform:uppercase;padding:3px 12px;border:1px solid var(--gold);color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.08)}
.nv-codex-season-theme{font-family:var(--serif);font-style:italic;color:var(--parchment)}
.nv-codex-season-bonus{font-size:11px;letter-spacing:.5px;padding:3px 10px;border-left:2px solid var(--gold);color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.05)}

/* ===== Codex "Illuminated Grimoire" shell (P1 2026-08-05) =====
 * Frontispiece chapter grid + collapsible chapter spreads replace the old
 * 250px sticky sidebar. Section internals (.nv-codex-sechead/-prose/-live)
 * keep their rules above. Square-only language per the design system --
 * the "wax seal" is a rotated square (diamond), not a circle. */
.nv-cdx-front{padding:10px 0 34px;text-align:center}
.nv-cdx-sigil{font-size:34px;color:var(--gold-hi);text-shadow:0 0 24px rgba(var(--gold-bright-rgb),.45)}
.nv-cdx-tag{color:var(--muted);max-width:64ch;margin:10px auto 0}
.nv-cdx-pulse{margin-top:14px;font-family:var(--disp);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold)}
.nv-cdx-pulse-dot{margin:0 10px;color:var(--muted2)}
.nv-cdx-searchwrap{margin:22px auto 0;max-width:520px;position:relative}
.nv-cdx-search{width:100%!important;text-align:center!important;font-size:14px!important}
.nv-cdx-searchcount{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:11px;color:var(--muted2);letter-spacing:1px}
.nv-cdx-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px;margin-top:26px;text-align:left}
.nv-cdx-card{position:relative;display:block;border:1px solid var(--line);background:rgba(255,255,255,.015);padding:18px;text-decoration:none;transition:border-color .25s,transform .25s,box-shadow .25s}
.nv-cdx-card::before,.nv-cdx-card::after{content:"";position:absolute;width:10px;height:10px;border:1px solid rgba(var(--gold-bright-rgb),.5);transition:opacity .25s;opacity:.45}
.nv-cdx-card::before{top:-1px;left:-1px;border-right:0;border-bottom:0}
.nv-cdx-card::after{bottom:-1px;right:-1px;border-left:0;border-top:0}
.nv-cdx-card:hover{border-color:rgba(var(--gold-bright-rgb),.4);transform:translateY(-3px);box-shadow:0 10px 30px rgba(0,0,0,.35)}
.nv-cdx-card:hover::before,.nv-cdx-card:hover::after{opacity:1}
.nv-cdx-card-no{position:absolute;top:10px;right:14px;font-family:var(--deco,var(--disp));font-size:13px;color:var(--muted2);letter-spacing:2px}
.nv-cdx-card-glyph{display:block;font-size:22px;margin-bottom:8px}
.nv-cdx-card-name{display:block;font-family:var(--disp);font-size:14px;letter-spacing:1px;color:var(--gold-hi);margin-bottom:6px}
.nv-cdx-card-blurb{display:block;font-family:var(--serif);font-style:italic;font-size:12.5px;line-height:1.55;color:var(--muted)}
.nv-cdx-card-count{display:block;margin-top:10px;font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted2)}
/* chapter spreads */
.nv-cdx-book{border-top:1px solid var(--line)}
.nv-cdx-chapter{border-bottom:1px solid var(--line)}
.nv-cdx-chsum{display:flex;align-items:center;gap:16px;padding:20px 6px;cursor:pointer;list-style:none;transition:background .2s}
.nv-cdx-chsum::-webkit-details-marker{display:none}
.nv-cdx-chsum:hover{background:rgba(var(--gold-bright-rgb),.04)}
.nv-cdx-chno{font-family:var(--deco,var(--disp));min-width:46px;text-align:center;font-size:17px;color:var(--gold);border:1px solid var(--line2);padding:7px 0}
.nv-cdx-chname{font-family:var(--disp);font-size:17px;letter-spacing:1.5px;color:var(--text)}
.nv-cdx-chcount{margin-left:auto;font-size:11px;color:var(--muted2);letter-spacing:1px}
.nv-cdx-chsum::after{content:"\25be";color:var(--gold);font-size:13px;transition:transform .25s}
.nv-cdx-chapter[open]>.nv-cdx-chsum::after{transform:rotate(180deg)}
.nv-cdx-chbody{padding:6px 6px 10px;animation:nvcdxTurn .5s ease both}
@keyframes nvcdxTurn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
/* wax-seal section mark -- diamond, in the site's angular language */
.nv-cdx-seal{position:relative;width:38px;height:38px;flex:none;transform:rotate(45deg);border:1px solid var(--line2);background:linear-gradient(135deg,rgba(var(--gold-bright-rgb),.16),rgba(255,255,255,.02));box-shadow:inset 0 0 10px rgba(var(--gold-bright-rgb),.12);display:flex;align-items:center;justify-content:center;margin:4px 10px 4px 4px;animation:nvcdxSeal .5s ease both}
.nv-cdx-seal>span{transform:rotate(-45deg);font-size:16px;line-height:1}
@keyframes nvcdxSeal{from{opacity:0;transform:rotate(45deg) scale(1.35)}60%{transform:rotate(45deg) scale(.94)}to{opacity:1;transform:rotate(45deg) scale(1)}}
/* illuminated initial on each section's opening paragraph */
.nv-codex-prose>p:first-of-type::first-letter{font-family:var(--deco,var(--disp));float:left;font-size:44px;line-height:.85;color:var(--gold-hi);padding:5px 10px 3px 7px;margin:3px 9px 0 0;border:1px solid var(--line);background:rgba(var(--gold-bright-rgb),.05);text-shadow:0 0 14px rgba(var(--gold-bright-rgb),.35)}
/* coordinates rail (rendered by nv_codex_where(), used from P2 on) */
.nv-cdx-where{display:inline-flex;flex-wrap:wrap;gap:8px;margin:10px 0 4px}
.nv-cdx-where>*{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;padding:4px 10px;border:1px solid var(--line);background:rgba(255,255,255,.03)}
.nv-cdx-w-npc{color:var(--gold-hi);border-color:var(--line2)}
.nv-cdx-w-map{color:var(--muted)}
.nv-cdx-w-cmd{color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.08)}
/* "How to begin" plate (used from P3 on) */
.nv-cdx-howto{margin:16px 0;border:1px solid var(--line2);border-left:3px solid var(--gold);background:rgba(var(--gold-bright-rgb),.04);padding:14px 18px}
.nv-cdx-howto h5{font-family:var(--disp);font-size:11px;letter-spacing:2px;text-transform:uppercase;color:var(--gold-hi);margin:0 0 10px}
.nv-cdx-howto ol{margin:0;padding-left:20px;color:var(--muted);font-size:13.5px;line-height:1.8}
/* D5 sealed stamp (used from P2 on) */
.nv-cdx-stamp{display:inline-flex;align-items:center;gap:8px;font-family:var(--disp);font-size:10px;letter-spacing:2px;text-transform:uppercase;color:#ff8fae;border:1px dashed rgba(255,143,174,.5);padding:5px 12px;transform:rotate(-2deg)}
/* B3: legend 6-axis source mini-bars */
.nv-cdx-axis{display:inline-flex;align-items:flex-end;width:7px;height:14px;margin-right:3px;background:rgba(255,255,255,.05)}
.nv-cdx-axis i{display:block;width:100%;background:var(--gold);opacity:.8}
@media(prefers-reduced-motion:reduce){.nv-cdx-chbody,.nv-cdx-seal{animation:none}.nv-cdx-card:hover{transform:none}}
@media(max-width:860px){
	.nv-cdx-grid{grid-template-columns:1fr 1fr}
	.nv-cdx-chsum{gap:10px;padding:16px 2px}
	.nv-cdx-chname{font-size:14px;letter-spacing:1px}
	.nv-cdx-chcount{font-size:10px}
	/* Mobile table-clip rescue (same class of fix as NVMC, nirvana.css ~1360):
	   body{overflow-x:hidden} clips any table wider than the viewport with no
	   way to reach the cut-off columns. Live-data tables here run 4-7 columns
	   with nowrap headers, so every one of them hit this on a phone. */
	.nv-codex-live table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}
	.nv-codex-sechead{gap:8px}
	.nv-codex-group-tag{margin-left:0}
}
@media(max-width:520px){.nv-cdx-grid{grid-template-columns:1fr}}

/* Valor / PvP hub */
.nv-pvp-throne{display:flex;align-items:center;gap:18px;border:1px solid var(--line2);background:linear-gradient(120deg,rgba(var(--gold-bright-rgb),.08),rgba(255,255,255,.012));padding:18px 22px;margin:18px 0 24px}
.nv-pvp-throne-empty{border-color:var(--line);background:rgba(255,255,255,.012)}
.nv-pvp-throne-crest{position:relative;flex:0 0 auto;width:40px;height:40px}
.nv-pvp-throne-crest::before,.nv-pvp-throne-crest::after{content:"";position:absolute;inset:0;border-radius:50%;border:1px solid var(--gold-bright);box-shadow:0 0 12px var(--gold-deep)}
.nv-pvp-throne-crest::after{inset:7px;border-color:var(--gold-hi);box-shadow:none}
.nv-pvp-throne-crest i{position:absolute;inset:15px;background:var(--gold-hi);transform:rotate(45deg);box-shadow:0 0 8px var(--gold);font-style:normal}
.nv-pvp-throne-empty .nv-pvp-throne-crest::before,.nv-pvp-throne-empty .nv-pvp-throne-crest::after{border-color:var(--line2);box-shadow:none}
.nv-pvp-throne-empty .nv-pvp-throne-crest i{background:var(--muted2);box-shadow:none}
.nv-pvp-throne-label{font-family:var(--disp);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold)}
.nv-pvp-throne-name{font-family:var(--deco);font-size:24px;color:var(--gold-hi);line-height:1.2}
.nv-pvp-throne-meta{color:var(--muted);font-size:13px;margin-top:2px}
.nv-pvp-throne-note{color:var(--muted2);font-size:12px;margin:-16px 0 20px}
.nv-pvp-throne-note a{color:var(--gold)}
.nv-pvp-cols{display:grid;grid-template-columns:2fr 1fr;gap:26px;align-items:start}
@media(max-width:800px){.nv-pvp-cols{grid-template-columns:1fr}}
.nv-pvp-hall{list-style:none;padding:0;margin:0 0 18px;display:flex;flex-direction:column;gap:7px}
.nv-pvp-hall li{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;border:1px solid var(--line);padding:7px 11px;font-size:13px}
.nv-pvp-hall-title{font-family:var(--disp);font-size:10px;letter-spacing:.5px;text-transform:uppercase;color:var(--muted2)}
.nv-pvp-hall-title.juara{color:var(--gold-hi)}
.nv-pvp-hall-name{color:var(--text);font-family:var(--disp);font-size:13px}
.nv-pvp-hall-s{margin-left:auto;color:var(--muted2);font-size:11px}

/* Player Cockpit */
.nv-cp-hero{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;flex-wrap:wrap;padding:6px 0 18px}
.nv-cp-balances{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.nv-cp-chars{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.nv-cp-char{display:block;border:1px solid var(--line);padding:10px 16px;text-decoration:none;min-width:130px;transition:border-color .15s}
.nv-cp-char:hover{border-color:var(--gold)}
.nv-cp-char.active{border-color:var(--gold);background:rgba(var(--gold-bright-rgb),.06)}
.nv-cp-char-name{display:block;font-family:var(--disp);color:var(--fg);font-size:14px}
.nv-cp-char-meta{display:block;color:var(--muted);font-size:12px;margin-top:3px}
.nv-cp-on{color:#4ade80;font-style:normal;font-size:9px;vertical-align:middle}
.nv-cp-concierge{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:26px}
.nv-cp-jump{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);padding:8px 14px;color:var(--muted);text-decoration:none;font-size:13px;transition:color .15s,border-color .15s}
.nv-cp-jump:hover{color:var(--gold-hi);border-color:var(--gold)}
.nv-cp-jump-icon{font-size:14px}
.nv-cp-badge{display:inline-block;min-width:16px;text-align:center;background:rgba(var(--gold-bright-rgb),.16);border:1px solid var(--line2);color:var(--gold-hi);font-size:10px;font-family:var(--disp);padding:0 5px;border-radius:9px;margin-left:2px}
.nv-cp-jump.active{color:var(--gold-hi);border-color:var(--gold);background:rgba(var(--gold-bright-rgb),.09)}
.nv-cp-tab-group{display:flex;align-items:center;color:var(--muted);font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding-left:4px;margin-left:2px;white-space:nowrap}
.nv-cp-tab-group:first-child{margin-left:0;padding-left:0}
.nv-cp-tab-group:not(:first-child)::before{content:"";display:inline-block;width:1px;height:16px;background:var(--line);margin-right:10px}
/* W2: mobile bottom nav (thumb reach for the cockpit's own page-to-page
   navigation, distinct from the site's hamburger menu which handles the
   FULL site nav). Hidden above 760px (the site's existing mobile
   breakpoint); .nv-cp-tabs (the desktop bar) is the inverse toggle right
   below. Horizontally scrollable rather than a fixed subset of tabs -- the
   tab count here has changed twice in one day (6 -> 7 with Mythic), so
   picking "the important N" would already be stale. */
.nv-cp-bottomnav{display:none}
@media(max-width:760px){
	.nv-cp-tabs{display:none}
	.nv-cockpit{padding-bottom:calc(64px + env(safe-area-inset-bottom,0px))}
	.nv-cp-bottomnav{
		display:flex;position:fixed;left:0;right:0;bottom:0;z-index:40;
		background:rgba(7,3,16,.94);backdrop-filter:blur(10px);
		border-top:1px solid var(--line2);
		padding:6px 4px calc(6px + env(safe-area-inset-bottom,0px));
		overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;gap:2px}
	.nv-cp-bottomnav::-webkit-scrollbar{display:none}
	.nv-cp-bn-item{flex:0 0 auto;min-width:60px;display:flex;flex-direction:column;align-items:center;
		justify-content:center;gap:2px;padding:6px 8px;color:var(--muted);text-decoration:none;
		border-top:2px solid transparent}
	.nv-cp-bn-icon{font-size:19px;line-height:1}
	.nv-cp-bn-label{font-size:9.5px;letter-spacing:.2px;white-space:nowrap}
	.nv-cp-bn-item.active{color:var(--cp-a-hi);border-top-color:var(--cp-a)}
}
/* W2: command palette. Trigger sits in the hero balance row; the overlay
   itself is a direct child of .nv-cockpit so it isn't clipped by any
   ancestor's overflow:hidden (the pool-card overflow trap already found
   once this arc -- built this one to not be exposed to it at all). */
/* The bare `button` selector (css:251) forces the site's gold-CTA look with
   !important on background/color/border/padding/font-* -- caught via a real
   screenshot, not interaction tests (every DOM/keyboard check passed while
   this rendered as an unreadable gold-on-gold button). This is a QUIET
   secondary trigger, not a CTA, so every one of those properties needs an
   explicit !important override, same fix already applied once this arc to
   .nv-btn-danger for the identical reason. */
.nv-cp-pal-trigger{display:inline-flex!important;align-items:center;gap:7px;
	border:1px solid var(--line)!important;background:rgba(255,255,255,.02)!important;
	color:var(--muted)!important;padding:6px 12px!important;font-size:12.5px!important;
	font-family:var(--body)!important;font-weight:400!important;letter-spacing:normal!important;
	text-transform:none!important;box-shadow:none!important;
	cursor:pointer;transition:border-color .15s,color .15s}
.nv-cp-pal-trigger:hover,.nv-cp-pal-trigger:focus-visible{color:var(--gold-hi)!important;border-color:var(--gold)!important}
.nv-cp-pal-trigger kbd{font-family:var(--disp);font-size:9.5px;letter-spacing:.5px;color:var(--muted2);
	border:1px solid var(--line);padding:1px 5px;margin-left:2px}
@media(max-width:640px){.nv-cp-pal-trigger kbd{display:none}}
/* [hidden] must be written explicitly: the UA stylesheet's [hidden]{display:none}
   has the SAME specificity as this class rule, and this stylesheet loads after
   the UA one, so a bare display:flex here would silently win and the palette
   would render (and eat clicks) even with the hidden attribute set -- caught
   only by a real click landing on the "hidden" overlay instead of the trigger
   underneath it, not by any static check. */
.nv-cp-pal[hidden]{display:none}
.nv-cp-pal{position:fixed;inset:0;z-index:80;display:flex;align-items:flex-start;
	justify-content:center;padding:10vh 20px 20px}
.nv-cp-pal-scrim{position:absolute;inset:0;background:rgba(4,2,10,.7);backdrop-filter:blur(3px)}
.nv-cp-pal-box{position:relative;width:100%;max-width:560px;background:#0b0620;
	border:1px solid var(--line2);box-shadow:0 30px 80px rgba(0,0,0,.6);
	display:flex;flex-direction:column;max-height:70vh}
/* Same !important fight as the trigger button, this time against the global
   input[type=text] rule (css:243) -- caught in the same screenshot: it forces
   a full boxed border + solid background + tighter padding on every text
   input site-wide, which reads fine on a real form but wrong on a search
   field meant to blend into the palette box with just an underline. */
.nv-cp-pal-input{border:0!important;border-bottom:1px solid var(--line)!important;
	background:transparent!important;color:var(--text)!important;font-size:16px!important;
	padding:16px 18px!important;outline:none!important;font-family:var(--body)!important;
	border-radius:0!important;box-shadow:none!important}
.nv-cp-pal-input:focus{border-color:var(--line)!important;background:transparent!important;box-shadow:none!important}
.nv-cp-pal-input::placeholder{color:var(--muted2)}
.nv-cp-pal-list{overflow-y:auto;padding:6px}
.nv-cp-pal-row{display:flex;align-items:center;gap:12px;padding:10px 12px;cursor:pointer;color:var(--text)}
.nv-cp-pal-row .ic{font-size:17px;width:22px;text-align:center;flex:none}
.nv-cp-pal-row .tx{min-width:0;flex:1}
.nv-cp-pal-row .lb{font-family:var(--disp);font-size:13.5px;color:#fff}
.nv-cp-pal-row .sb{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nv-cp-pal-row .tag{flex:none;font-family:var(--disp);font-size:9px;letter-spacing:1px;text-transform:uppercase;
	color:var(--muted2);border:1px solid var(--line);padding:2px 6px}
.nv-cp-pal-row.hi{background:rgba(var(--cp-a-rgb),.12)}
.nv-cp-pal-row.hi .lb{color:var(--cp-a-hi)}
.nv-cp-pal-row.hi .tag{color:var(--cp-a-hi);border-color:var(--cp-a)}
.nv-cp-pal-empty{padding:24px 18px;text-align:center;color:var(--muted2);font-size:13px}
body.nv-pal-open{overflow:hidden}
/* Mission Control hub */
.nv-mc{padding-bottom:8px}
.nv-mc-badge{display:inline-block;border:1px solid var(--muted);padding:2px 10px;font-family:var(--disp);font-size:12px;letter-spacing:.5px;border-radius:2px}
.nv-mc-roletag{display:inline-block;border:1px solid var(--line2);padding:1px 8px;font-size:11px;font-family:var(--disp);color:var(--gold-hi)}
.nv-mc h3,.nv-mc h4{color:var(--gold-hi);font-family:var(--disp);letter-spacing:.5px}
.nv-mc h3{font-size:17px;margin:26px 0 14px}
.nv-mc h4{font-size:13px;letter-spacing:1px;text-transform:uppercase;color:var(--gold);margin:22px 0 10px}
.nv-mc-note{font-size:12.5px;color:var(--muted2);margin:8px 0;line-height:1.55;max-width:70ch}
.nv-mc-note code,.nv-mc code{background:rgba(var(--gold-bright-rgb),.08);border:1px solid var(--line);padding:1px 5px;font-size:12px;color:var(--gold-hi)}
/* stat cards */
.nv-mc-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:4px 0 8px}
.nv-mc-stat{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:16px 18px}
.nv-mc-stat span{display:block;font-family:var(--disp);font-size:26px;color:var(--gold-hi);line-height:1.1}
.nv-mc-stat small{display:block;font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2);margin-top:6px}
.nv-mc-stat.warn span{color:#ff8f8f}
.nv-mc-stat.ok span{color:#4ade80}
/* hover tooltips -- feature-flag descriptions etc. Custom instead of a
   native title="" because title can't wrap multi-sentence text or match
   the site's dark/gold styling. */
.nv-tip{position:relative;display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;background:rgba(var(--gold-bright-rgb),.16);border:1px solid var(--line2);color:var(--gold-hi);font-family:var(--disp);font-size:10px;line-height:1;cursor:help;vertical-align:middle;margin-left:5px}
.nv-tip:hover,.nv-tip:focus{background:var(--gold);color:var(--void);outline:none}
.nv-tip-box{visibility:hidden;opacity:0;position:absolute;top:calc(100% + 10px);left:50%;transform:translateX(-50%) translateY(-4px);width:300px;max-width:min(300px,80vw);background:var(--void2);border:1px solid var(--line2);box-shadow:0 16px 40px rgba(0,0,0,.5);padding:11px 13px;font-family:var(--body);font-size:12px;font-weight:400;line-height:1.6;color:var(--text);text-align:left;letter-spacing:normal;text-transform:none;z-index:60;transition:opacity .15s ease,transform .15s ease;pointer-events:none}
.nv-tip-box::after{content:"";position:absolute;bottom:100%;left:50%;transform:translateX(-50%);border:6px solid transparent;border-bottom-color:var(--void2)}
.nv-tip:hover .nv-tip-box,.nv-tip:focus .nv-tip-box{visibility:visible;opacity:1;transform:translateX(-50%) translateY(0)}
@media(max-width:640px){.nv-tip-box{width:230px}}
/* data + key/value tables */
.nv-mc table{width:100%;border-collapse:collapse;color:var(--text);font-size:13px;margin:6px 0}
.nv-mc table th{font-family:var(--disp);font-size:11px;letter-spacing:.8px;text-transform:uppercase;color:var(--gold);text-align:left;padding:9px 12px;border-bottom:1px solid var(--line2);background:rgba(var(--gold-bright-rgb),.03)}
.nv-mc table td{padding:8px 12px;border-bottom:1px solid var(--line);vertical-align:top}
.nv-mc table tbody tr:hover td{background:rgba(var(--gold-bright-rgb),.045)}
.nv-mc-kv td:first-child{color:var(--muted);width:42%}
.nv-mc-kv td:last-child{color:var(--text);font-family:var(--disp)}
/* forms */
.nv-mc form{margin:10px 0}
.nv-mc-form{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px;border:1px solid var(--line);background:rgba(255,255,255,.012);padding:16px;margin:10px 0}
.nv-mc-field{display:flex;flex-direction:column;gap:5px;font-size:11px;letter-spacing:.5px;text-transform:uppercase;color:var(--muted2)}
.nv-mc-field input,.nv-mc-field select{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--text);padding:8px 10px;font-family:var(--body);font-size:13px;text-transform:none;letter-spacing:0;min-width:120px}
.nv-mc-field input:focus,.nv-mc-field select:focus{border-color:var(--gold);outline:none}
.nv-mc-inline{display:inline-flex;gap:8px;align-items:flex-end;margin-right:8px}
.nv-mc-danger{border-color:rgba(255,107,107,.35)!important}
.nv-mc-cols2{display:grid;grid-template-columns:1fr 1fr;gap:22px}
@media(max-width:720px){.nv-mc-cols2{grid-template-columns:1fr}}
.nv-cp-h3{font-family:var(--disp);color:var(--gold-hi);font-size:16px;letter-spacing:.5px;margin:28px 0 14px}
/* align-items:start (2026-07-18): without it, CSS Grid stretches every card in a
   row to match its tallest row-mate — on My World's uneven card content (a rich
   GearScore card next to a 2-line Pilgrim's Vow) that left over 60% of some
   cards as dead padding. Cards now size to their own content; only real usage
   sites are control/index (My World), control/plus (Kingmaker/Happy Hour/
   Commissions/Rebirth — same unevenness), and two single-card full-width wraps
   in control/rotation where align-items has no visible effect either way. */
.nv-cp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;align-items:start}
/* W2 Arrange mode. Both buttons here need !important on the visual props --
   the bare `button` selector (css:251) forces the gold-CTA look on every
   button site-wide; this is a quiet inline control, not a CTA. (Standing
   trap on this codebase -- see the design-system memory.) */
.nv-cp-arrangebar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:-4px 0 12px}
.nv-cp-arrange-toggle,.nv-cp-arrange-reset{
	background:transparent!important;border:1px solid var(--line)!important;color:var(--muted)!important;
	font-family:var(--body)!important;font-weight:400!important;font-size:12px!important;
	letter-spacing:normal!important;text-transform:none!important;padding:5px 11px!important;
	box-shadow:none!important;cursor:pointer}
.nv-cp-arrange-toggle:hover,.nv-cp-arrange-reset:hover{color:var(--cp-a-hi)!important;border-color:var(--cp-a)!important}
.nv-cp-arrange-toggle[aria-pressed="true"]{color:var(--cp-a-hi)!important;border-color:var(--cp-a)!important;background:rgba(var(--cp-a-rgb),.1)!important}
.nv-cp-arrange-save{display:flex;align-items:center;gap:8px}
/* Editing state: cards get a dashed outline + their own control row. */
.nv-cp-arranging .nv-cp-card{outline:1px dashed rgba(var(--cp-a-rgb),.45);outline-offset:-1px}
.nv-cp-arranging .nv-cp-card[data-cp-hidden="1"]{opacity:.4}
.nv-cp-cardctl{display:flex;gap:4px;margin-bottom:8px}
.nv-cp-cardctl button{
	background:rgba(var(--cp-a-rgb),.1)!important;border:1px solid rgba(var(--cp-a-rgb),.4)!important;
	color:var(--cp-a-hi)!important;font-family:var(--body)!important;font-weight:400!important;
	font-size:11px!important;letter-spacing:normal!important;text-transform:none!important;
	padding:2px 8px!important;box-shadow:none!important;cursor:pointer;min-width:26px}
.nv-cp-cardctl button:hover{background:rgba(var(--cp-a-rgb),.22)!important}
/* W2 forms UX: a quiet marker on a form with unsaved edits. Deliberately
   subtle (a left rule, not a banner) -- it's a reassurance cue, not an
   alarm; the actual protection is the beforeunload prompt. */
.nv-cp-form-dirty{border-left:2px solid rgba(var(--cp-a-rgb),.55);padding-left:10px}
.nv-cp-card{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:18px;min-height:120px;transition:border-color .25s}
/* W2: per-page accent triplets -- the same --shelf-a/--shelf-glow pattern the
   Bazaar Vault/Festival shelves already prove (nirvana.css:394-399), so each
   cockpit page gets identity with ZERO new component CSS: a wrapper sets 3
   vars, the existing kit rules below read them. Default (no page class) is
   site gold -- Cockpit and Nirvana+ need no override, gold already IS their
   identity. Rules are scoped under .nv-cockpit specifically (never the bare
   .nv-cp-jump/.nv-cp-h3 selectors) because NVMC reuses both classes for its
   own tab bar (57 + 2 uses) with NO .nv-cockpit ancestor -- touching the
   shared rule directly would silently break NVMC's active-tab color the
   moment a page-accent class existed anywhere in the same stylesheet. */
.nv-cockpit{--cp-a:var(--gold-bright);--cp-a-hi:var(--gold-hi);--cp-a-rgb:var(--gold-bright-rgb)}
.nv-cp-page-autobuff{--cp-a:#5fb877;--cp-a-hi:#a8e8b8;--cp-a-rgb:95,184,119}
.nv-cp-page-companion{--cp-a:#a78bfa;--cp-a-hi:#d8c8ff;--cp-a-rgb:167,139,250}
.nv-cp-page-rotation{--cp-a:#5ba8d6;--cp-a-hi:#b8e0f5;--cp-a-rgb:91,168,214}
.nv-cp-page-customize{--cp-a:#e08fc4;--cp-a-hi:#ffd6ec;--cp-a-rgb:224,143,196}
.nv-cp-page-mythic{--cp-a:#c9772f;--cp-a-hi:#ffc98a;--cp-a-rgb:201,119,47}
.nv-cp-page-pvp{--cp-a:#d0574f;--cp-a-hi:#ffb0a6;--cp-a-rgb:208,87,79}
.nv-cockpit .nv-cp-jump.active{color:var(--cp-a-hi);border-color:var(--cp-a);background:rgba(var(--cp-a-rgb),.09)}
.nv-cockpit .nv-cp-h3{color:var(--cp-a-hi)}
.nv-cockpit .nv-cp-card-head{color:var(--cp-a)}
.nv-cockpit .nv-cp-card:hover,.nv-cockpit .nv-cp-panel:hover{border-color:rgba(var(--cp-a-rgb),.4)}
.nv-cp-card-head{font-family:var(--disp);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold);margin-bottom:12px}
.nv-cp-big{font-family:var(--disp);font-size:30px;color:var(--gold-hi);line-height:1}
.nv-cp-mid{font-family:var(--disp);font-size:18px;color:var(--fg)}
.nv-cp-sub{color:var(--muted);font-size:12.5px;margin:6px 0 0}
.nv-cp-empty{color:var(--muted2);font-style:italic;font-size:13px;margin:0;line-height:1.5}

/* Per-card "How to use this" collapsible (Cockpit guides, 2026-08-05).
   Generalises the inline pattern already proven in Combat Brain's "How
   rotation works" block (_companion_brain.php) into one real class instead
   of re-pasting the same inline styles at every call site -- the exact
   .nv-btn-sm mistake this codebase's own design-system notes warn about.
   Marker treatment (▸/▾, hidden native marker) matches .nv-obs-faq below
   so the whole site's disclosure widgets read as one family. */
.nv-cp-guide{margin-top:10px}
.nv-cp-guide>summary{font-size:12px;font-weight:600;cursor:pointer;color:var(--muted);list-style:none}
.nv-cp-guide>summary::-webkit-details-marker{display:none}
.nv-cp-guide>summary::before{content:"▸ ";color:var(--gold-bright)}
.nv-cp-guide[open]>summary::before{content:"▾ "}
.nv-cp-guide>summary:hover{color:var(--gold-hi)}
.nv-cp-guide-body{font-size:12px;line-height:1.7;margin:8px 0 0;padding:8px 10px;background:rgba(255,255,255,.03);border:1px solid var(--line)}
.nv-cp-guide-body p{margin:0 0 8px}
.nv-cp-guide-body p:last-child{margin-bottom:0}
.nv-cp-guide-body code{background:rgba(var(--gold-bright-rgb),.08);border:1px solid var(--line);padding:1px 5px;font-size:11.5px;color:var(--gold-hi)}
.nv-cp-guide-body a{color:var(--gold-hi)}
.nv-cp-renown-bars{display:flex;flex-direction:column;gap:5px;margin-top:12px}
.nv-cp-rn{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}
.nv-cp-rn b{color:var(--gold-hi)}
.nv-cp-garden{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}
.nv-cp-plot{width:34px;height:34px;display:flex;align-items:center;justify-content:center;border:1px solid var(--line);font-size:16px;background:rgba(255,255,255,.02)}
.nv-cp-plot.ready{border-color:#4ade80;background:rgba(74,222,128,.08)}
.nv-cp-chips{display:flex;gap:5px;flex-wrap:wrap}
.nv-cp-chip{font-size:11px;border:1px solid var(--line);padding:3px 8px;color:var(--muted)}
.nv-cp-mini{width:100%;font-size:12px;color:var(--muted)}
.nv-cp-mini td{padding:3px 6px;border-bottom:1px solid var(--line)}
.nv-cp-pulse{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.nv-cp-pulse div{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2)}
.nv-cp-pulse span{display:block;font-family:var(--disp);font-size:22px;color:var(--gold-hi);letter-spacing:0}
.nv-cp-afk-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:6px 0}
.nv-cp-prefs{border:1px solid var(--line);padding:20px;display:flex;flex-direction:column;gap:14px;max-width:520px}
.nv-cp-pref-row{display:flex;justify-content:space-between;align-items:center;gap:16px;font-size:14px;color:var(--muted)}
/* min-width:0 lets the select shrink below its widest option inside the flex
   row -- without it a long option (or a long character name in the primary-char
   picker) pushes past the form edge on a phone, where body{overflow-x:hidden}
   hides the spill rather than showing a scrollbar. Measured, not guessed. */
.nv-cp-pref-row select{background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--fg);padding:7px 10px;min-width:0;max-width:100%}
.nv-cp-pref-check{display:flex;align-items:center;gap:10px;font-size:14px;color:var(--muted)}
@media(max-width:640px){.nv-cp-pulse{grid-template-columns:1fr 1fr}}
/* Cockpit v2 — summary strip, command deck, companion mask, security */
.nv-cp-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:2px 0 20px}
.nv-cp-summary div{border:1px solid var(--line);background:rgba(255,255,255,.012);padding:12px 14px;text-align:center;font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2)}
.nv-cp-summary span{display:block;font-family:var(--disp);font-size:22px;color:var(--gold-hi);margin-bottom:3px;letter-spacing:0}
.nv-cp-char-job{display:block;font-size:11px;color:var(--gold);letter-spacing:.4px;margin-top:2px}
.nv-cp-deck{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;align-items:start}
.nv-cp-panel{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:20px}
.nv-cp-companion{grid-column:1/-1}
@media(min-width:1000px){.nv-cp-companion{grid-column:auto}}
/* patron */
.nv-cp-patron.is-plus{border-color:var(--line2);background:linear-gradient(160deg,rgba(var(--gold-bright-rgb),.06),rgba(255,255,255,.012))}
.nv-cp-perks{list-style:none;padding:0;margin:12px 0 0;display:flex;flex-direction:column;gap:6px}
.nv-cp-perks li{font-size:12.5px;color:var(--muted);padding-left:2px}
/* security */
.nv-cp-sec{display:flex;flex-direction:column;gap:0;margin-bottom:14px}
.nv-cp-sec-row{display:flex;justify-content:space-between;gap:12px;font-size:12.5px;padding:7px 0;border-bottom:1px solid var(--line)}
.nv-cp-sec-row:last-child{border-bottom:none}
.nv-cp-sec-row span{color:var(--muted2)}
.nv-cp-sec-row b{color:var(--text);font-weight:500;text-align:right;word-break:break-all}
.nv-cp-good{color:#4ade80 !important}
.nv-cp-bad{color:#ff6b6b !important}
.nv-cp-sec-actions{display:flex;gap:8px;flex-wrap:wrap}
/* companion command center */
.nv-cp-comp-status{display:flex;align-items:center;gap:9px;padding-bottom:14px;margin-bottom:14px;border-bottom:1px solid var(--line)}
.nv-cp-comp-status strong{font-family:var(--disp);font-size:15px;color:var(--text)}
.nv-cp-comp-dot{width:9px;height:9px;border-radius:50%;background:var(--muted2);box-shadow:0 0 0 3px rgba(255,255,255,.03)}
.nv-cp-comp-dot.on{background:#4ade80;box-shadow:0 0 8px rgba(74,222,128,.6)}
.nv-cp-mask-head{display:flex;justify-content:space-between;align-items:baseline;font-family:var(--disp);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold);margin-bottom:12px}
.nv-cp-mask-tools{font-family:var(--body);letter-spacing:0;text-transform:none;font-size:12px}
.nv-cp-mask-tools a{color:var(--muted);text-decoration:none}
.nv-cp-mask-tools a:hover{color:var(--gold-hi)}
.nv-cp-mask-group{margin-bottom:12px}
.nv-cp-mask-glabel{font-size:10px;letter-spacing:1px;text-transform:uppercase;margin-bottom:6px;opacity:.9}
.nv-cp-mask-grid{display:flex;flex-wrap:wrap;gap:6px}
.nv-cp-skill{display:flex;align-items:center;gap:7px;border:1px solid var(--line);padding:5px 9px;font-size:11.5px;color:var(--muted);cursor:pointer;user-select:none;transition:border-color .12s,color .12s,background .12s}
.nv-cp-skill:hover{border-color:var(--line2)}
.nv-cp-skill input{accent-color:var(--gold);width:13px;height:13px;margin:0;cursor:pointer}
.nv-cp-skill:has(input:checked){border-color:var(--gold);color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.06)}
.nv-cp-mask-foot{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:14px;padding-top:14px;border-top:1px solid var(--line);flex-wrap:wrap}
/* expanded prefs */
.nv-cp-pref-cols{display:grid;grid-template-columns:1fr 1fr;gap:22px}
.nv-cp-pref-sub{font-family:var(--disp);font-size:11px;letter-spacing:1.2px;text-transform:uppercase;color:var(--gold);margin-bottom:10px}
.nv-cp-pref-cols .nv-cp-pref-check{margin-bottom:9px}
@media(max-width:620px){.nv-cp-summary{grid-template-columns:1fr 1fr}.nv-cp-pref-cols{grid-template-columns:1fr}}

/* ---- Cockpit v3: real mob/skill/item art (Divine Pride) + CSS-native polish ---- */
.nv-cockpit.reveal{opacity:0;transform:translateY(20px);transition:opacity .8s ease,transform .8s ease}
.nv-cockpit.reveal.in{opacity:1;transform:none}

.nv-cp-mob-ico{width:20px;height:20px;object-fit:contain;image-rendering:pixelated;vertical-align:middle;border-radius:50%;background:rgba(255,255,255,.05);border:1px solid var(--line2);padding:1px}

/* Wishlist shelf (real item art, same CDN convention as the Bazaar) */
.nv-cp-wish-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;margin-bottom:26px}
.nv-cp-wish-item{display:flex;flex-direction:column;align-items:center;text-align:center;gap:5px;border:1px solid var(--line);padding:12px 8px;text-decoration:none;color:var(--muted);transition:border-color .15s}
.nv-cp-wish-item:hover{border-color:var(--gold)}
.nv-cp-wish-item .nv-item-thumb-sm{margin:0 auto}
.nv-cp-wish-name{font-size:11.5px;color:var(--text);line-height:1.3}
.nv-cp-wish-price{font-size:11px;color:var(--gold-hi)}
.nv-cp-wish-more{justify-content:center;color:var(--gold-hi);font-family:var(--disp);font-size:12px;letter-spacing:.5px}

/* APL Rotation (real skill art + name + target) */
.nv-cp-rot-list{display:flex;flex-direction:column;gap:6px}
.nv-cp-rot-rule{display:flex;align-items:center;gap:9px;border:1px solid var(--line);padding:6px 10px;font-size:12px;color:var(--muted)}
.nv-cp-skill-ico{width:24px;height:24px;object-fit:contain;image-rendering:pixelated;background:rgba(255,255,255,.03);border:1px solid var(--line);flex:none}
.nv-cp-rot-name{flex:1;color:var(--text)}
.nv-cp-rot-lv{color:var(--muted2);font-size:11px}
.nv-cp-rot-tgt{font-size:10px;letter-spacing:.5px;text-transform:uppercase;color:var(--muted2)}
.nv-cp-rot-cond{color:var(--gold-hi)}

/* Events Right Now — polish pass 2026-07-18. Three sub-parts: live event cards
   (icon + name + description, gold accent for high-priority ones), a scannable
   icon+time schedule grid (replaces the old plain table), and a compact recent-
   happenings feed (replaces the old plain table). */
.nv-cp-ev-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px}
.nv-cp-ev-card{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-left:3px solid var(--line2);background:rgba(255,255,255,.02);padding:10px 12px}
.nv-cp-ev-card.important{border-left-color:var(--gold);background:rgba(var(--gold-bright-rgb),.06);box-shadow:inset 0 0 0 1px rgba(var(--gold-bright-rgb),.14)}
.nv-cp-ev-icowrap{width:34px;height:34px;flex:none;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.04);border:1px solid var(--line2);font-size:17px}
.nv-cp-ev-card.important .nv-cp-ev-icowrap{border-color:var(--gold-deep);background:rgba(var(--gold-bright-rgb),.12)}
.nv-cp-ev-icowrap img{width:24px;height:24px;object-fit:contain;image-rendering:pixelated}
.nv-cp-ev-body{flex:1;min-width:0}
.nv-cp-ev-name{font-family:var(--disp);font-size:12.5px;letter-spacing:.3px;color:var(--text)}
.nv-cp-ev-card.important .nv-cp-ev-name{color:var(--gold-hi)}
.nv-cp-ev-desc{color:var(--muted);font-size:11.5px;margin-top:3px;line-height:1.4}

/* Schedule + Happenings are a fixed PAIR (2 cards), not an open-ended collection —
   .nv-cp-grid's auto-fill reserves extra empty column tracks when there are only 2
   children, leaving a lopsided gap. A plain 2-col split (collapsing to 1 on narrow
   viewports) is correct here; auto-fill/auto-fit is for unbounded card counts. */
.nv-cp-ev-pair{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
@media(max-width:760px){.nv-cp-ev-pair{grid-template-columns:1fr}}

.nv-cp-sched-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}
.nv-cp-sched-item{border:1px solid var(--line);background:rgba(255,255,255,.012);padding:7px 9px}
.nv-cp-sched-head{display:flex;align-items:center;gap:6px}
.nv-cp-sched-ico{font-size:14px;flex:none;width:16px;text-align:center}
.nv-cp-sched-name{color:var(--text);font-size:12px;min-width:0}
.nv-cp-sched-time{display:block;color:var(--muted2);font-size:10.5px;margin:4px 0 0 22px;line-height:1.35}

.nv-cp-feed{display:flex;flex-direction:column}
.nv-cp-feed-row{display:flex;gap:10px;padding:7px 2px;border-bottom:1px solid var(--line);font-size:12px}
.nv-cp-feed-row:last-child{border-bottom:none}
.nv-cp-feed-time{flex:none;color:var(--muted2);font-size:10.5px;white-space:nowrap;padding-top:2px;min-width:34px}
.nv-cp-feed-text{color:var(--muted);line-height:1.45}
@media(max-width:640px){.nv-cp-ev-grid{grid-template-columns:1fr}}

/* ===== RIGHT NOW ribbon (Cockpit hub, web-overhaul D1 2026-07-19) ===== */
.nv-cp-rightnow{display:flex;align-items:stretch;gap:10px;flex-wrap:wrap;margin:14px 0 18px;padding:12px 14px;border:1px solid var(--line2);background:linear-gradient(90deg,rgba(var(--gold-bright-rgb),.06),rgba(var(--indigo-rgb),.35))}
.nv-cp-rn-label{display:inline-flex;align-items:center;gap:8px;font-family:var(--disp);font-size:10.5px;letter-spacing:3px;text-transform:uppercase;color:var(--gold-bright);white-space:nowrap;padding-right:4px}
.nv-cp-rn-dot{width:7px;height:7px;border-radius:50%;background:#7ee2a0;box-shadow:0 0 10px #7ee2a0;animation:nvcp-live 2.2s ease-in-out infinite}
.nv-cp-rn-dot.idle{background:var(--muted2);box-shadow:none;animation:none}
@keyframes nvcp-live{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.7)}}
.nv-cp-rn-chip{display:inline-flex;align-items:center;gap:9px;padding:7px 12px;border:1px solid var(--line);background:rgba(var(--void-rgb),.5);text-decoration:none;color:var(--text);transition:.25s}
a.nv-cp-rn-chip:hover{border-color:var(--gold);background:rgba(var(--gold-bright-rgb),.08);transform:translateY(-1px)}
.nv-cp-rn-ico{font-size:15px}
.nv-cp-rn-txt{display:flex;flex-direction:column;line-height:1.25}
.nv-cp-rn-txt b{font-size:12px;font-weight:700;color:#fff}
.nv-cp-rn-txt em{font-style:normal;font-size:10.5px;color:var(--muted2)}
.nv-cp-rn-txt em code{font-size:10px;color:var(--gold-bright)}
.nv-cp-rn-idle{opacity:.85}

/* ===== Grimoire of Commands (D2) ===== */
.nv-cp-grim{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:6px 22px}
.nv-cp-grim-row{display:flex;align-items:baseline;gap:10px;padding:7px 4px;border-bottom:1px solid rgba(255,255,255,.05)}
.nv-cp-grim-cmd{font-size:12.5px;font-weight:700;color:var(--text);background:rgba(255,255,255,.05);padding:2px 8px;white-space:nowrap}
.nv-cp-grim-row.is-plus .nv-cp-grim-cmd{color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.1)}
.nv-cp-grim-desc{font-size:12px;color:var(--muted);line-height:1.45}
.nv-cp-grim-badge{margin-left:auto;font-family:var(--disp);font-size:9px;letter-spacing:1px;color:var(--gold);border:1px solid var(--line2);padding:2px 6px;white-space:nowrap}

/* ===== Site-wide micro-heals (web-overhaul D3 2026-07-19) =====
 * 1. .nv-btn rendered angled on <button> but FLAT on <a> — the clip-path rule
 *    matched only buttons. Documented visual debt; healed for both.
 * 2. .nv-btn-sm — the size override previously inline-pasted ~30x.
 * 3. :focus-visible — keyboard focus ring, site-wide (there was none). */
a.nv-btn{clip-path:polygon(8px 0,100% 0,calc(100% - 8px) 100%,0 100%);text-decoration:none;display:inline-block}
.nv-btn-sm{padding:6px 12px!important;font-size:12px!important}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:2px solid var(--gold-bright);outline-offset:2px}

/* ===== NVMC mobile table rescue (web-overhaul E3 2026-07-19) =====
 * Mission Control has 26 tables of 8-11 columns; body{overflow-x:hidden}
 * made them CLIP on phones. Rather than hand-wrapping 26 call sites in the
 * existing .nv-lb-scroll helper, scope the classic responsive pattern to
 * NVMC on small screens only: block-display tables scroll horizontally
 * inside their own box. Desktop rendering is untouched. */
@media(max-width:900px){
  .nv-mc table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}
  /* form controls with hardcoded widths were the other mobile clipper --
     the field wrapper needs min-width:0 too or the flex label grows to fit
     the select's intrinsic width and drags the row past the viewport */
  .nv-mc select,.nv-mc input[type=text],.nv-mc input[type=number],.nv-mc textarea{max-width:100%;box-sizing:border-box}
  .nv-mc .nv-mc-field{max-width:100%;min-width:0}
  .nv-mc form{flex-wrap:wrap}
}

/* Renown tier medallion — CSS-only (no external art exists for a custom tier ladder) */
.nv-cp-medallion{display:inline-block;width:26px;height:26px;border-radius:50%;flex:none;box-shadow:inset 0 0 0 1px rgba(255,255,255,.15)}
.nv-cp-med-t0{background:linear-gradient(160deg,#6b6b76,#3d3d47)}
.nv-cp-med-t1{background:linear-gradient(160deg,#8a9bb0,#4d5c70)}
.nv-cp-med-t2{background:linear-gradient(160deg,#7fc4d9,#2f7a8c)}
.nv-cp-med-t3{background:linear-gradient(160deg,#d0d6e0,#8892a3);box-shadow:inset 0 0 0 1px rgba(255,255,255,.3),0 0 10px rgba(208,214,224,.3)}
.nv-cp-med-t4{background:linear-gradient(160deg,var(--gold-bright),var(--gold-deep));box-shadow:inset 0 0 0 1px rgba(255,255,255,.25),0 0 10px rgba(var(--gold-rgb),.4)}
.nv-cp-med-t5{background:linear-gradient(160deg,var(--gold-hi),var(--gold));box-shadow:inset 0 0 0 1px rgba(255,255,255,.35),0 0 14px rgba(255,233,168,.55)}
.nv-cp-med-t6{background:conic-gradient(from 45deg,#ffe9a8,#ff9bd6,#9fb4ff,#7fe9c8,#ffe9a8);box-shadow:inset 0 0 0 1px rgba(255,255,255,.5),0 0 18px rgba(255,255,255,.4)}

/* Giant faint watermark sigil per card, driven by data-sigil (JS mirrors each
   card's own emoji, see control theme script) — decorative, no external assets. */
.nv-cp-card,.nv-cp-panel{position:relative;overflow:hidden}
.nv-cp-card[data-sigil]::before,.nv-cp-panel[data-sigil]::before{content:attr(data-sigil);position:absolute;right:-10px;top:-20px;font-size:80px;line-height:1;opacity:.05;pointer-events:none;filter:grayscale(1) brightness(1.7)}

/* Online-status breathing pulse */
@keyframes nv-cp-pulse{0%,100%{opacity:1;text-shadow:0 0 4px rgba(74,222,128,.8)}50%{opacity:.55;text-shadow:0 0 10px rgba(74,222,128,1)}}
.nv-cp-on{animation:nv-cp-pulse 1.6s ease-in-out infinite}

/* Taman Sari seed-type accent */
.nv-cp-plot.seed-1{border-color:#ff9bd6}
.nv-cp-plot.seed-2{border-color:#7fe9a0}
.nv-cp-plot.seed-3{border-color:#c79a6a}
.nv-cp-plot.seed-4{border-color:#9fb4ff}

@media(prefers-reduced-motion:reduce){.nv-cockpit.reveal{opacity:1;transform:none}.nv-cp-on{animation:none}}

/* ---- Cockpit v4: equipped gear strip, real hometown art, achievement ring, toggles ---- */
.nv-eq-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}
.nv-eq-slot{position:relative;width:36px;height:36px;border:1px solid var(--line);background:rgba(255,255,255,.02);display:flex;align-items:center;justify-content:center;flex:none}
.nv-eq-slot.empty{opacity:.35;border-style:dashed}
.nv-eq-slot .nv-item-icon{width:100%;height:100%;border:0;background:none;padding:2px}
.nv-eq-refine{position:absolute;bottom:-5px;right:-5px;background:#0b0716;border:1px solid var(--gold);color:var(--gold-hi);font-size:9px;line-height:1;padding:2px 3px;font-family:var(--disp)}

/* Real map art behind a card's own content — same onerror-hide discipline as every other hotlink. */
.nv-cp-card-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 30%;opacity:.16;z-index:-1;-webkit-mask-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent 85%);mask-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent 85%)}

/* Achievement donut ring — same conic-gradient technique as the Renown medallion */
.nv-cp-ring{position:relative;width:60px;height:60px;border-radius:50%;flex:none;background:conic-gradient(var(--gold-hi) calc(var(--pct)*1%),rgba(255,255,255,.08) 0)}
.nv-cp-ring::after{content:'';position:absolute;inset:6px;border-radius:50%;background:var(--void2)}
.nv-cp-ring-num{position:relative;z-index:1;width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-family:var(--disp);color:var(--gold-hi);font-size:14px}

/* Preference checkboxes -> toggle switches (pure CSS, same <input type=checkbox>, no markup change) */
.nv-cp-pref-check input[type=checkbox]{appearance:none;-webkit-appearance:none;width:34px;height:19px;border-radius:10px;background:rgba(255,255,255,.08);border:1px solid var(--line2);position:relative;cursor:pointer;transition:background .2s;flex:none;margin:0}
.nv-cp-pref-check input[type=checkbox]::before{content:'';position:absolute;top:1px;left:1px;width:15px;height:15px;border-radius:50%;background:var(--muted);transition:transform .2s,background .2s}
.nv-cp-pref-check input[type=checkbox]:checked{background:rgba(var(--gold-bright-rgb),.25);border-color:var(--gold)}
.nv-cp-pref-check input[type=checkbox]:checked::before{transform:translateX(15px);background:var(--gold-hi)}

@media(prefers-reduced-motion:reduce){.nv-cp-pref-check input[type=checkbox],.nv-cp-pref-check input[type=checkbox]::before{transition:none}}

/* ==========================================================================
   Cockpit polish pass (2026-08-02) — animated hero seal, glowing chrome,
   hover lift/glow, entrance stagger. Everything here is scoped under
   .nv-cockpit (never bare .nv-cp-card/.nv-cp-jump/.nv-bal) so it can't leak
   into wishlist/shop (which reuse .nv-cp-card) or the Bazaar sticky bar
   (which reuses .nv-bal) — same discipline the existing per-page accent
   block above already established. All @keyframes/transitions here are
   already covered by the sitewide prefers-reduced-motion kill-switch
   (`*{animation:none!important;transition:none!important}`, above) — no
   extra media query needed. Pure CSS, zero new JS, zero data/logic changes.
   ========================================================================== */

/* Two more per-page accent triplets for pages that didn't have one yet —
   Palace reuses the exact violet already established for Shadow Palace's
   own "violet wing" (nv-sp-wing.nv-sp-violet, --wing-a2:#7b6cff) so it
   doesn't invent a color the rest of the site doesn't already use there. */
.nv-cp-page-nemesis{--cp-a:#c23b4f;--cp-a-hi:#ff8fa3;--cp-a-rgb:194,59,79}
.nv-cp-page-ghost{--cp-a:#7ecbd6;--cp-a-hi:#c9f3fa;--cp-a-rgb:126,203,214}
.nv-cp-page-palace{--cp-a:#7b6cff;--cp-a-hi:#c8bfff;--cp-a-rgb:123,108,255}

/* Hero identity seal — a rotated glowing badge showing the current page's own
   tab glyph, recoloring per page for free off the --cp-a system above. */
.nv-cp-hero-id{display:flex;align-items:center;gap:16px}
.nv-cp-hero-seal{position:relative;flex:none;width:52px;height:52px;display:grid;place-items:center;
	transform:rotate(45deg);border:1px solid var(--cp-a);
	background:linear-gradient(160deg,rgba(var(--cp-a-rgb),.18),rgba(var(--void-rgb),.5));
	animation:nvcpSealPulse 4.5s ease-in-out infinite}
.nv-cp-hero-seal span{display:block;transform:rotate(-45deg);font-size:22px;line-height:1}
@keyframes nvcpSealPulse{
	0%,100%{box-shadow:0 0 20px rgba(var(--cp-a-rgb),.32),inset 0 0 14px rgba(var(--cp-a-rgb),.16)}
	50%{box-shadow:0 0 32px rgba(var(--cp-a-rgb),.52),inset 0 0 18px rgba(var(--cp-a-rgb),.28)}
}
.nv-cockpit .nv-page-title{text-shadow:0 0 26px rgba(var(--cp-a-rgb),.35)}

/* Balance chips + palette trigger — a slow diagonal sheen sweep, like light
   crossing a polished gem. Distinct from .nv-cp-flashing (the live-update
   flash on .nv-cp-count text) — this animates a ::before/::after layer, so
   the two never fight over the same property. */
.nv-cockpit .nv-cp-balances .nv-bal{position:relative;overflow:hidden}
.nv-cockpit .nv-cp-balances .nv-bal::before{content:'';position:absolute;inset:0;
	background:linear-gradient(100deg,transparent 35%,rgba(255,255,255,.16) 50%,transparent 65%);
	background-size:240% 100%;background-position:140% 0;animation:nvcpSheen 6.5s ease-in-out infinite;pointer-events:none}
.nv-cockpit .nv-cp-pal-trigger{position:relative;overflow:hidden}
.nv-cockpit .nv-cp-pal-trigger::after{content:'';position:absolute;inset:0;
	background:linear-gradient(100deg,transparent 40%,rgba(var(--gold-bright-rgb),.22) 50%,transparent 60%);
	background-size:260% 100%;background-position:140% 0;animation:nvcpSheen 7.5s ease-in-out .8s infinite;pointer-events:none}
@keyframes nvcpSheen{0%,55%{background-position:140% 0}100%{background-position:-40% 0}}

/* Tab bar — active tab gets a soft glow + a slow shimmering underline instead
   of a flat gold line. Hover gets a light lift, matching the card lift below. */
.nv-cockpit .nv-cp-jump{position:relative;transition:color .15s,border-color .15s,transform .15s}
.nv-cockpit .nv-cp-jump:hover{transform:translateY(-1px)}
.nv-cockpit .nv-cp-jump.active{box-shadow:0 0 16px rgba(var(--cp-a-rgb),.24),inset 0 0 0 1px rgba(var(--cp-a-rgb),.15)}
.nv-cockpit .nv-cp-jump.active::after{content:'';position:absolute;left:12%;right:12%;bottom:-1px;height:2px;
	background:linear-gradient(90deg,transparent,var(--cp-a-hi),transparent);background-size:200% 100%;
	animation:nvcpUnderline 2.8s linear infinite}
@keyframes nvcpUnderline{0%{background-position:200% 0}100%{background-position:-200% 0}}
.nv-cockpit .nv-cp-bn-item.active .nv-cp-bn-icon{text-shadow:0 0 12px rgba(var(--cp-a-rgb),.7)}

/* Character switcher — same lift language as the card grid below. */
.nv-cockpit .nv-cp-char{transition:border-color .2s,transform .2s,box-shadow .2s}
.nv-cockpit .nv-cp-char:hover{transform:translateY(-2px);box-shadow:0 10px 26px rgba(0,0,0,.35)}
.nv-cockpit .nv-cp-char.active{box-shadow:0 0 0 1px rgba(var(--cp-a-rgb),.3),0 0 20px rgba(var(--cp-a-rgb),.18)}

/* My World / Account & Security cards — hover lift+glow on top of the
   existing border-color transition (untouched, still defined on the bare
   .nv-cp-card rule elsewhere). Scoped under .nv-cockpit so wishlist/shop's
   own reuse of .nv-cp-card is completely unaffected. */
.nv-cockpit .nv-cp-card,.nv-cockpit .nv-cp-panel{transition:border-color .25s,transform .25s,box-shadow .25s}
.nv-cockpit .nv-cp-card:hover,.nv-cockpit .nv-cp-panel:hover{transform:translateY(-3px);
	box-shadow:0 18px 36px rgba(0,0,0,.38),0 0 0 1px rgba(var(--cp-a-rgb),.12)}

/* Entrance stagger for the first row of My World cards (Season is full-width
   solo, so row 2 is where a cascade actually reads) — same restraint as the
   Shadow Palace grid's own 3-entry precedent, not every card gets a hand-
   tuned delay. Cards use the sitewide .reveal primitive (IntersectionObserver
   already wired in the site footer) — below-the-fold cards animate in on
   scroll, not all at once on load. */
.nv-cp-grid > .reveal:nth-child(2){transition-delay:.05s}
.nv-cp-grid > .reveal:nth-child(3){transition-delay:.1s}
.nv-cp-grid > .reveal:nth-child(4){transition-delay:.15s}
.nv-cp-grid > .reveal:nth-child(5){transition-delay:.2s}

/* Renown "Eternal" tier medallion — the one CSS-native tier already using a
   conic-gradient rainbow; a slow spin sells the prestige without new art. */
.nv-cp-med-t6{animation:nvcpMedSpin 6s linear infinite}
@keyframes nvcpMedSpin{to{transform:rotate(360deg)}}

/* Achievement donut ring — soft ambient glow, cockpit-scoped only (this ring
   class is cockpit-specific already, but scoping stays consistent with the
   rest of this block). */
.nv-cockpit .nv-cp-ring{box-shadow:0 0 20px rgba(var(--gold-bright-rgb),.22)}

/* Live Now event cards flagged "important" — a slow breathing glow instead
   of a static gold inset, so the ones worth dropping what you're doing for
   actually read as urgent. */
.nv-cockpit .nv-cp-ev-card.important{animation:nvcpEvGlow 3s ease-in-out infinite}
@keyframes nvcpEvGlow{
	0%,100%{box-shadow:inset 0 0 0 1px rgba(var(--gold-bright-rgb),.14)}
	50%{box-shadow:inset 0 0 0 1px rgba(var(--gold-bright-rgb),.4),0 0 16px rgba(var(--gold-bright-rgb),.16)}
}

/* ---- Cockpit v5: Season card (Season Director P2) ---- */
.nv-cp-season{background:linear-gradient(160deg,rgba(var(--gold-bright-rgb),.05),rgba(255,255,255,.012))}
.nv-cp-season-row{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap}
.nv-cp-season-now{display:flex;align-items:center;gap:12px}
.nv-cp-season-phase{font-family:var(--disp);font-size:16px;padding:4px 14px;border:1px solid var(--line2);color:var(--gold-hi);letter-spacing:.5px}
.nv-cp-phase-1,.nv-cp-phase-4{border-color:var(--gold);background:rgba(var(--gold-bright-rgb),.1)}       /* Launch / Harvest = action */
.nv-cp-phase-3{border-color:rgba(255,107,107,.4);color:#ff9b9b}                                 /* Climax = last call */
.nv-cp-season-stats{display:flex;gap:22px;flex-wrap:wrap}
.nv-cp-season-stat{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2);text-align:right}
.nv-cp-season-stat span{display:block;font-family:var(--disp);font-size:22px;color:var(--gold-hi);letter-spacing:0;text-transform:none}
.nv-cp-season-bonus{margin-top:12px;padding:8px 14px;border-left:2px solid var(--gold);background:rgba(var(--gold-bright-rgb),.05);font-size:13px;color:var(--gold-hi);border-radius:0}
.nv-cp-season-claim{margin-top:12px;padding:10px 14px;border:1px solid var(--line2);background:rgba(var(--gold-bright-rgb),.06);font-size:13px;color:var(--text)}
.nv-cp-title{border-color:var(--line2);color:var(--muted)}
.nv-cp-title-gold{border-color:var(--gold);color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.08)}
@media(max-width:560px){.nv-cp-season-row{flex-direction:column;align-items:flex-start}.nv-cp-season-stat{text-align:left}}

/* Season Journal (Season Studio P7, 2026-07-21) — one row per paying ladder:
 * where you stand, what that band pays at Harvest, and what the next band up
 * is worth. Row shape follows .nv-cp-grim-row; the "next band" hint takes a
 * full-width basis so it wraps under its own row rather than squeezing the
 * payout column. Every column collapses to full width under 560px. */
.nv-cp-jrow{display:flex;align-items:baseline;gap:12px;padding:9px 4px;border-bottom:1px solid rgba(255,255,255,.05);flex-wrap:wrap}
.nv-cp-jrow:last-of-type{border-bottom:0}
.nv-cp-jlad{font-family:var(--disp);font-size:13px;color:var(--text);flex:none;min-width:148px}
.nv-cp-jlad .g{color:var(--gold);margin-right:6px}
.nv-cp-jstand{font-size:12.5px;color:var(--muted);flex:none;min-width:124px}
.nv-cp-jstand b{color:var(--gold-hi);font-family:var(--disp);font-size:14.5px}
.nv-cp-jstand.is-unranked{color:var(--muted2)}
.nv-cp-jpay{font-size:12.5px;color:var(--text);flex:1;min-width:190px;line-height:1.5}
.nv-cp-jpay .t{color:var(--gold-hi)}
.nv-cp-jpay.is-none{color:var(--muted2)}
.nv-cp-jnext{flex-basis:100%;font-size:11.5px;color:var(--muted2);padding-left:2px;line-height:1.5}
.nv-cp-jnext b{color:var(--gold)}
.nv-cp-jhist{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.nv-cp-jhist .h{font-size:11.5px;color:var(--muted);border:1px solid var(--line);padding:3px 8px}
.nv-cp-jhist .h.is-unclaimed{color:var(--gold-hi);border-color:var(--gold)}
@media(max-width:560px){.nv-cp-jlad,.nv-cp-jstand,.nv-cp-jpay{min-width:0;flex-basis:100%}}

/* Scene Director */
.nv-scene-hero{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;flex-wrap:wrap;padding:6px 0 18px}
.nv-scene-stats{display:flex;gap:14px}
.nv-scene-stats div{border:1px solid var(--line);padding:14px 18px;text-align:center;font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2)}
.nv-scene-stats span{display:block;font-family:var(--disp);font-size:24px;color:var(--gold-hi);margin-bottom:3px;letter-spacing:0}
.nv-scene-triggers{display:flex;gap:12px;margin-bottom:24px;flex-wrap:wrap}
.nv-scene-trig{display:flex;align-items:center;gap:9px;border:1px solid var(--line);padding:10px 16px;font-size:13px;color:var(--muted)}
.nv-scene-trig strong{color:var(--fg);font-family:var(--disp);font-size:12px;letter-spacing:.5px}
.nv-scene-trig-dot{width:8px;height:8px;border-radius:50%;background:var(--muted2)}
.nv-scene-trig.on{border-color:rgba(74,222,128,.4)}
.nv-scene-trig.on .nv-scene-trig-dot{background:#4ade80;box-shadow:0 0 8px #4ade80}
.nv-scene-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}
.nv-scene-card{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:18px;display:flex;flex-direction:column;gap:12px}
.nv-scene-card.ready{border-color:rgba(var(--gold-bright-rgb),.28)}
.nv-scene-card-top{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.nv-scene-card-top h3{font-family:var(--disp);color:var(--fg);margin:0;font-size:16px}
.nv-scene-type{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2);border:1px solid var(--line);padding:2px 7px;white-space:nowrap}
.nv-scene-meta{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.nv-scene-meta div{font-size:12.5px;color:var(--muted)}
.nv-scene-meta span{display:block;font-size:9px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2);margin-bottom:2px}
.nv-scene-trigmsg{margin:0;font-size:11.5px;padding:5px 9px;border-left:2px solid var(--line)}
.nv-scene-trigmsg.ok{color:#8fe3a8;border-color:rgba(74,222,128,.5)}
.nv-scene-trigmsg.off{color:var(--muted2);border-color:var(--line)}
.nv-scene-card-foot{display:flex;justify-content:space-between;align-items:center;margin-top:auto;gap:10px}
.nv-scene-badge{font-size:12px;letter-spacing:.4px}
.nv-scene-badge.ready{color:#4ade80}
.nv-scene-badge.cooling{color:var(--muted2)}
.nv-scene-h3{font-family:var(--disp);color:var(--gold-hi);font-size:16px;letter-spacing:.5px;margin:30px 0 14px}
.nv-scene-feed{width:100%}

/* Top Up */
.nv-topup-hero{display:flex;justify-content:space-between;align-items:flex-end;gap:24px;flex-wrap:wrap;padding:6px 0 20px}
.nv-topup-bal{border:1px solid rgba(123,108,255,.35);padding:14px 20px;text-align:right;font-size:11px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2)}
.nv-topup-bal span{display:block;font-family:var(--disp);font-size:26px;color:#9fb4ff;letter-spacing:0;margin-bottom:2px}
.nv-topup-bal em{display:block;font-style:normal;text-transform:none;letter-spacing:0;font-size:11px;color:var(--gold-hi);margin-top:4px}
.nv-topup-first{border:1px solid rgba(var(--gold-bright-rgb),.4);background:rgba(var(--gold-bright-rgb),.06);color:var(--gold-hi);padding:12px 18px;margin-bottom:22px;font-size:14px}
.nv-topup-h3{font-family:var(--disp);color:var(--gold-hi);font-size:16px;letter-spacing:.5px;margin:28px 0 14px}
.nv-topup-tiers{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px}
.nv-topup-tier{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:20px 14px;text-align:center;transition:transform .2s,border-color .2s}
.nv-topup-tier:hover{transform:translateY(-3px);border-color:var(--gold)}
.nv-topup-tier.best{border-color:rgba(var(--gold-bright-rgb),.5);background:rgba(var(--gold-bright-rgb),.04)}
.nv-topup-rm{font-family:var(--disp);font-size:15px;color:var(--muted);letter-spacing:1px}
.nv-topup-cr{font-family:var(--disp);font-size:24px;color:var(--gold-hi);margin:8px 0 6px}
.nv-topup-bonus{font-size:11px;letter-spacing:.5px;color:#8fe3a8}
.nv-topup-bonus.base{color:var(--muted2)}
.nv-topup-cols{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:8px}
.nv-topup-panel{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:22px}
.nv-topup-steps{margin:0;padding-left:20px;color:var(--muted);font-size:14px;line-height:1.7}
.nv-topup-steps strong{color:var(--fg)}
.nv-topup-banktbl{width:100%;font-size:14px}
.nv-topup-banktbl td{padding:8px 6px;border-bottom:1px solid var(--line);color:var(--fg)}
.nv-topup-banktbl td:first-child{color:var(--muted2);font-size:11px;letter-spacing:1px;text-transform:uppercase;width:120px;vertical-align:middle}
.nv-topup-note{color:var(--muted);font-size:12.5px;margin:12px 0 0}
.nv-topup-donor{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px}
.nv-topup-donor-tier{border:1px solid var(--line);padding:16px;text-align:center}
.nv-topup-donor-tier.have{border-color:rgba(74,222,128,.4);background:rgba(74,222,128,.04)}
.nv-topup-donor-role{font-family:var(--disp);color:var(--fg);font-size:15px;margin-bottom:5px}
.nv-topup-donor-tier.have .nv-topup-donor-role{color:#8fe3a8}
.nv-topup-donor-req{font-size:12px;color:var(--muted)}
.nv-topup-tag{font-size:11px;color:var(--gold-hi);border:1px solid rgba(var(--gold-bright-rgb),.35);padding:2px 8px}
.nv-topup-legal{color:var(--muted2);font-size:11.5px;margin-top:28px;line-height:1.6;border-top:1px solid var(--line);padding-top:14px}
@media(max-width:720px){.nv-topup-cols{grid-template-columns:1fr}}

/* AI Sage — standalone page */
.nv-sage-hero{padding:6px 0 20px}
.nv-sage-form{display:flex;flex-direction:column;gap:12px;max-width:560px}
.nv-sage-form textarea{font-family:var(--body)!important;resize:vertical}
.nv-sage-answer{margin-top:20px;border:1px solid rgba(var(--gold-bright-rgb),.3);background:rgba(var(--gold-bright-rgb),.04);padding:18px;max-width:560px}
.nv-sage-answer-head{font-family:var(--disp);color:var(--gold-hi);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;margin-bottom:10px}
.nv-sage-answer p{margin:0;color:var(--text);font-size:14px;line-height:1.6}

/* AI Sage — floating site-wide widget */
#nv-sage-launcher{position:fixed;bottom:22px;right:22px;width:52px;height:52px;border-radius:50%;
  background:linear-gradient(135deg,var(--gold-hi),var(--gold-deep));display:flex;align-items:center;justify-content:center;
  font-size:24px;cursor:pointer;box-shadow:0 6px 24px rgba(var(--gold-bright-rgb),.4);z-index:9999;transition:transform .2s}
#nv-sage-launcher:hover{transform:scale(1.08)}
.nv-sage-badge{position:absolute;top:-4px;right:-4px;background:#ff5d8f;color:#fff;font-size:10px;font-family:var(--body);
  border-radius:50%;width:18px;height:18px;display:flex;align-items:center;justify-content:center}
#nv-sage-panel{display:none;flex-direction:column;position:fixed;bottom:84px;right:22px;width:340px;max-width:calc(100vw - 32px);
  height:440px;max-height:calc(100vh - 120px);background:linear-gradient(180deg,rgba(var(--void3-rgb),.98),rgba(var(--void-rgb),.98));
  border:1px solid var(--line);z-index:9999;box-shadow:0 16px 50px rgba(0,0,0,.5);
  clip-path:polygon(0 0,100% 0,100% calc(100% - 12px),calc(100% - 12px) 100%,0 100%)}
#nv-sage-panel-head{padding:12px 16px;font-family:var(--disp);color:var(--gold-hi);font-size:13px;letter-spacing:.5px;
  border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px}
#nv-sage-reset,#nv-sage-close{margin-left:auto;cursor:pointer;color:var(--muted2);font-size:14px}
#nv-sage-reset:hover,#nv-sage-close:hover{color:var(--gold-hi)}
#nv-sage-log{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}
.nv-sage-msg{display:flex}
.nv-sage-user{justify-content:flex-end}
.nv-sage-bubble{max-width:80%;padding:8px 12px;font-size:13px;line-height:1.5;color:var(--text)}
.nv-sage-user .nv-sage-bubble{background:rgba(var(--gold-bright-rgb),.14);border:1px solid rgba(var(--gold-bright-rgb),.25)}
.nv-sage-assistant .nv-sage-bubble{background:rgba(255,255,255,.03);border:1px solid var(--line)}
#nv-sage-chips{display:flex;gap:6px;flex-wrap:wrap;padding:0 14px}
.nv-sage-chip{font-size:11px;border:1px solid var(--line);padding:3px 8px;color:var(--muted);text-decoration:none}
.nv-sage-chip:hover{color:var(--gold-hi);border-color:var(--gold)}
#nv-sage-inputrow{display:flex;gap:8px;padding:12px;border-top:1px solid var(--line)}
#nv-sage-input{flex:1;font-family:var(--body)!important;font-size:13px!important;resize:none;max-height:90px}
#nv-sage-send{background:linear-gradient(135deg,var(--gold-hi),var(--gold-deep));color:#1a1206;border:0;padding:0 16px;cursor:pointer;font-size:16px}
@media(max-width:480px){#nv-sage-panel{right:10px;bottom:76px}#nv-sage-launcher{right:12px;bottom:12px}}

/* Endgame pages — shared */
.nv-wb-h3,.nv-my-h3,.nv-ar-h3,.nv-lg-h3{font-family:var(--disp);color:var(--gold-hi);font-size:16px;letter-spacing:.5px;margin:28px 0 14px}

/* World Boss */
.nv-wb-live{border:1px solid rgba(239,68,68,.4);background:rgba(239,68,68,.05);margin:18px 0;
  display:flex;gap:20px;overflow:hidden}
.nv-wb-live-portrait{flex:0 0 auto;width:150px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(70% 90% at 50% 40%,rgba(239,68,68,.28),transparent 70%)}
.nv-wb-live-portrait img{max-width:120px;max-height:120px;object-fit:contain;filter:drop-shadow(0 10px 18px rgba(0,0,0,.65))}
.nv-wb-live-body{flex:1;min-width:0;padding:20px 20px 20px 0}
.nv-wb-live-head{display:flex;align-items:center;gap:8px;font-family:var(--disp);font-size:12px;letter-spacing:2px;color:#ff6b6b}
.nv-wb-pulse{width:9px;height:9px;border-radius:50%;background:#ff5d5d;box-shadow:0 0 10px #ff5d5d;animation:nvwbpulse 1.2s infinite}
@keyframes nvwbpulse{0%,100%{opacity:1}50%{opacity:.3}}
.nv-wb-live h2{font-family:var(--disp);color:#fff;margin:8px 0 4px;font-size:22px}
.nv-wb-hpbar{position:relative;height:22px;background:rgba(255,255,255,.05);border:1px solid var(--line);margin-top:12px}
.nv-wb-hpfill{height:100%;background:linear-gradient(90deg,#ef4444,#ff8f6b)}
.nv-wb-hpbar span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;letter-spacing:1px}
@media(max-width:560px){.nv-wb-live{flex-direction:column}.nv-wb-live-portrait{width:100%;height:120px}.nv-wb-live-body{padding:16px}}
.nv-wb-idle{border:1px solid var(--line);padding:16px 20px;margin:18px 0;color:var(--muted)}

.nv-wb-roster{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px}
.nv-wb-boss{border:1px solid var(--line);position:relative;overflow:hidden;transition:.3s;
  background:linear-gradient(180deg,rgba(255,255,255,.02),rgba(255,255,255,.005));
  clip-path:polygon(0 0,100% 0,100% calc(100% - 12px),calc(100% - 12px) 100%,0 100%)}
.nv-wb-boss:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(0,0,0,.4);border-color:var(--el,var(--line2))}
.nv-wb-boss.active{border-color:rgba(239,68,68,.6);box-shadow:0 0 24px rgba(239,68,68,.15)}
.nv-wb-portrait{height:130px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(60% 80% at 50% 38%,var(--el-glow,rgba(139,92,246,.3)),transparent 70%),
    linear-gradient(180deg,rgba(0,0,0,0),var(--void) 92%);border-bottom:1px solid var(--line)}
.nv-wb-portrait img{max-height:100px;max-width:68%;object-fit:contain;filter:drop-shadow(0 8px 14px rgba(0,0,0,.65));transition:.35s}
.nv-wb-boss:hover .nv-wb-portrait img{transform:scale(1.06) translateY(-2px)}
.nv-wb-body{padding:14px 16px 16px}
.nv-wb-boss-name{font-family:var(--disp);color:#fff;font-size:14.5px;line-height:1.3}
.nv-wb-rtags{display:flex;flex-wrap:wrap;gap:5px;margin:8px 0}
.nv-wb-rtag{font-size:9.5px;letter-spacing:1px;text-transform:uppercase;color:var(--muted);border:1px solid var(--line2);padding:1px 6px}
.nv-wb-blurb{font-family:var(--serif);font-style:italic;color:var(--parchment);font-size:12px;line-height:1.5;margin:0 0 8px;opacity:.85}
.nv-wb-boss-map{color:var(--muted2);font-size:11px;border-top:1px solid var(--line);padding-top:8px}
.nv-wb-tag{color:#ff6b6b;font-size:11px;font-family:var(--body)}
.nv-wb-first{color:var(--gold-hi)}
.nv-wb-noeng{color:var(--muted2);font-style:italic}
.nv-wb-cols{display:grid;grid-template-columns:1fr 1fr;gap:24px}
@media(max-width:760px){.nv-wb-cols{grid-template-columns:1fr}}

/* Mythic Midgard */
.nv-my-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px}
.nv-my-dungeon{border:1px solid var(--line);position:relative;overflow:hidden;
  background:linear-gradient(180deg,rgba(255,255,255,.02),rgba(255,255,255,.005));transition:.3s;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 14px),calc(100% - 14px) 100%,0 100%)}
.nv-my-dungeon:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(0,0,0,.4);border-color:var(--el,var(--line2))}
.nv-my-dungeon::before,.nv-my-dungeon::after{content:"";position:absolute;width:16px;height:16px;
  border:1px solid var(--gold);opacity:.5;z-index:2;pointer-events:none}
.nv-my-dungeon::before{top:6px;left:6px;border-right:0;border-bottom:0}
.nv-my-dungeon::after{top:6px;right:6px;border-left:0;border-bottom:0}
.nv-my-portrait{position:relative;height:170px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(60% 80% at 50% 38%,var(--el-glow,rgba(139,92,246,.3)),transparent 70%),
    linear-gradient(180deg,rgba(0,0,0,0),var(--void) 92%);border-bottom:1px solid var(--line)}
.nv-my-portrait img{max-height:135px;max-width:72%;object-fit:contain;filter:drop-shadow(0 10px 18px rgba(0,0,0,.65));transition:.35s}
.nv-my-dungeon:hover .nv-my-portrait img{transform:scale(1.06) translateY(-2px)}
.nv-my-body{padding:16px 18px 18px}
.nv-my-dhead{font-family:var(--disp);color:#fff;font-size:17px;margin:0 0 8px}
.nv-my-idx{font-family:var(--deco);font-size:12px;letter-spacing:.5px;color:var(--el,var(--gold));margin-right:8px;opacity:.9}
.nv-my-rtags{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px}
.nv-my-rtag{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted);border:1px solid var(--line2);padding:2px 7px}
.nv-my-blurb{font-family:var(--serif);font-style:italic;color:var(--parchment);font-size:13px;line-height:1.55;
  margin:0 0 14px;opacity:.85}
.nv-my-ladder{list-style:none;margin:0;padding:0;border-top:1px solid var(--line);padding-top:10px}
.nv-my-ladder li{display:flex;justify-content:space-between;font-size:13px;color:var(--muted);padding:3px 0;border-bottom:1px solid rgba(var(--gold-bright-rgb),.06)}
.nv-my-ladder b{color:var(--gold-hi)}
.nv-my-empty{color:var(--muted2);font-style:italic;font-size:13px;margin:0;border-top:1px solid var(--line);padding-top:10px}

.nv-my-section{margin:32px 0 10px}
.nv-my-section.nv-my-standard{--my-a2:#c9a86a}
.nv-my-section.nv-my-mplus{--my-a2:#b79cff}
.nv-my-section-head{font-family:var(--disp);font-size:clamp(16px,1.8vw,20px);color:#fff;margin:0 0 4px}
.nv-my-section-mood{color:var(--muted);font-size:12.5px;font-style:italic;margin:0 0 16px}

.nv-my-affix{border:1px solid var(--line2);background:rgba(255,255,255,.02);padding:16px 20px;margin:16px 0}
.nv-my-affix p{margin:4px 0 0;color:var(--muted);font-size:13px}
.nv-my-affix-head{display:flex;align-items:center;gap:8px;font-family:var(--disp);font-size:13px;letter-spacing:1px;color:var(--muted)}
.nv-my-affix-dot{width:8px;height:8px;border-radius:50%;background:currentColor;box-shadow:0 0 8px currentColor;animation:nvwbpulse 1.6s infinite}
.nv-my-affix.fortified{border-color:rgba(255,136,0,.4)}
.nv-my-affix.fortified .nv-my-affix-head{color:#ff8800}
.nv-my-affix.tyrannical{border-color:rgba(255,93,93,.4)}
.nv-my-affix.tyrannical .nv-my-affix-head{color:#ff5d5d}
.nv-my-affix.bolstering{border-color:rgba(74,222,128,.4)}
.nv-my-affix.bolstering .nv-my-affix-head{color:#4ade80}

.nv-my-mine-panel{border:1px solid var(--line2);background:rgba(var(--gold-bright-rgb),.04);padding:14px 20px;margin:16px 0}
.nv-my-mine-head{font-family:var(--disp);font-size:12px;letter-spacing:1px;text-transform:uppercase;color:var(--gold);margin-bottom:8px}
.nv-my-mine-row{display:flex;justify-content:space-between;font-size:13px;color:var(--gold-bright);font-weight:600;padding:3px 0}

.nv-my-podium{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:16px 0 20px}
.nv-my-podium-card{border:1px solid var(--line);border-top:3px solid var(--rank-color);background:rgba(255,255,255,.015);
  padding:18px 16px;text-align:center}
.nv-my-podium-card.rank1{background:rgba(255,215,0,.05)}
.nv-my-podium-rank{font-family:var(--deco);font-size:14px;color:var(--rank-color);letter-spacing:1px}
.nv-my-podium-card.rank1 .nv-my-podium-name{font-size:19px}
.nv-my-podium-name{font-family:var(--disp);color:#fff;font-size:16px;margin:8px 0 6px}
.nv-my-podium-rating{color:var(--gold-hi);font-size:13px;font-weight:600}
.nv-my-podium-meta{color:var(--muted2);font-size:11px;margin-top:4px}
@media(max-width:600px){.nv-my-podium{grid-template-columns:1fr}.nv-my-podium-card.rank1{padding-top:16px}}

.nv-my-activity{color:var(--muted);font-size:12.5px;margin:4px 0 24px}
.nv-my-activity b{color:var(--gold-hi)}

.nv-my-rewards{color:var(--muted2);font-size:11.5px;font-style:italic;margin-top:24px;border-top:1px solid var(--line);padding-top:14px}

/* Arena */
.nv-ar-tiers{display:flex;gap:8px;flex-wrap:wrap;margin:16px 0}
.nv-ar-tier{border:1px solid var(--line);border-top:2px solid var(--tc,var(--line));padding:10px 16px;
  text-align:center;flex:1;min-width:100px;font-size:12px;color:var(--muted2)}
.nv-ar-tier span{display:block;font-family:var(--disp);color:var(--tc,var(--gold-hi));font-size:14px;margin-bottom:3px}

.nv-ar-badge{font-size:10px;letter-spacing:.5px;text-transform:uppercase;color:var(--tc);
  border:1px solid var(--tc);padding:2px 8px;opacity:.9}
.nv-ar-hot{color:#ff8f5a;font-weight:600}

.nv-ar-podium{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:16px 0 20px}
.nv-ar-podium-card{border:1px solid var(--line);border-top:3px solid var(--rank-color);background:rgba(255,255,255,.015);padding:18px 16px;text-align:center}
.nv-ar-podium-card.rank1{background:rgba(255,215,0,.05)}
.nv-ar-podium-rank{font-family:var(--deco);font-size:14px;color:var(--rank-color);letter-spacing:1px}
.nv-ar-podium-name{font-family:var(--disp);color:#fff;font-size:16px;margin:8px 0 4px}
.nv-ar-podium-card.rank1 .nv-ar-podium-name{font-size:19px}
.nv-ar-podium-tier{color:var(--tc);font-size:12px;text-transform:uppercase;letter-spacing:1px;font-weight:600}
.nv-ar-podium-rating{color:var(--gold-hi);font-size:13px;font-weight:600;margin-top:4px}
.nv-ar-podium-meta{color:var(--muted2);font-size:11px;margin-top:4px}
@media(max-width:600px){.nv-ar-podium{grid-template-columns:1fr}}

/* Hall of Legends */
.nv-lg-tiers{display:flex;gap:6px;flex-wrap:wrap;margin:16px 0}
.nv-lg-tier{flex:1;min-width:90px;border:1px solid var(--line);padding:12px 8px;text-align:center}
.nv-lg-tname{display:block;font-family:var(--disp);color:var(--gold-hi);font-size:13px;margin-bottom:3px}
.nv-lg-tfloor{font-size:11px;color:var(--muted2)}

.nv-lg-crest{position:relative;display:inline-block;width:28px;height:28px;margin-bottom:6px}
.nv-lg-crest::before,.nv-lg-crest::after{content:"";position:absolute;inset:0;border-radius:50%;border:1px solid var(--line2)}
.nv-lg-crest::after{inset:5px;border-color:var(--muted2)}
.nv-lg-crest i{position:absolute;inset:11px;background:var(--muted2);transform:rotate(45deg);font-style:normal}
.nv-lg-crest.tier2::before,.nv-lg-crest.tier3::before{border-color:var(--gold)}
.nv-lg-crest.tier2::after,.nv-lg-crest.tier3::after{border-color:var(--gold-deep)}
.nv-lg-crest.tier2 i,.nv-lg-crest.tier3 i{background:var(--gold)}
.nv-lg-crest.tier4::before,.nv-lg-crest.tier5::before,.nv-lg-crest.tier6::before{border-color:var(--gold-bright);box-shadow:0 0 10px var(--gold-deep)}
.nv-lg-crest.tier4::after,.nv-lg-crest.tier5::after,.nv-lg-crest.tier6::after{border-color:var(--gold-hi)}
.nv-lg-crest.tier4 i,.nv-lg-crest.tier5 i,.nv-lg-crest.tier6 i{background:var(--gold-hi);box-shadow:0 0 8px var(--gold)}
.nv-lg-crest.tier6::before{box-shadow:0 0 16px var(--gold)}
.nv-lg-crest.sm{width:14px;height:14px;margin:0 4px 0 0;vertical-align:middle}
.nv-lg-crest.sm::after{inset:3px}
.nv-lg-crest.sm i{inset:5px}
.nv-lg-crest.lg{width:44px;height:44px;margin:0 0 10px}
.nv-lg-crest.lg::after{inset:8px}
.nv-lg-crest.lg i{inset:17px}

.nv-lg-podium{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:16px 0 20px}
.nv-lg-podium-card{border:1px solid var(--line);border-top:3px solid var(--rank-color);background:rgba(255,255,255,.015);padding:18px 16px;text-align:center}
.nv-lg-podium-card.rank1{background:rgba(255,215,0,.05)}
.nv-lg-podium-rank{font-family:var(--deco);font-size:14px;color:var(--rank-color);letter-spacing:1px}
.nv-lg-podium-name{font-family:var(--disp);color:#fff;font-size:16px;margin:8px 0 4px}
.nv-lg-podium-card.rank1 .nv-lg-podium-name{font-size:19px}
.nv-lg-podium-tier{color:var(--gold);font-size:12px;text-transform:uppercase;letter-spacing:1px}
.nv-lg-podium-renown{color:var(--muted);font-size:12px;margin-top:4px}
@media(max-width:600px){.nv-lg-podium{grid-template-columns:1fr}}

.nv-lg-bars{display:flex;align-items:flex-end;gap:2px;height:20px;margin-bottom:4px}
.nv-lg-bar{width:6px;height:var(--v);min-height:2px;background:var(--c);opacity:.85}
.nv-lg-topsrc{color:var(--muted2);font-size:11px}

/* Community & Culture */
.nv-cm-h3{font-family:var(--disp);color:var(--gold-hi);font-size:16px;letter-spacing:.5px;margin:28px 0 12px}
.nv-cm-champs{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px}
.nv-cm-champ{border:1px solid var(--line);padding:16px;background:rgba(255,255,255,.015);text-align:center}
.nv-cm-champ-ped{font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted2);margin-bottom:8px}
.nv-cm-champ-name{font-family:var(--disp);color:var(--gold-hi);font-size:17px}
.nv-cm-champ-title{color:var(--muted);font-size:12px;font-style:italic;margin-top:5px}
.nv-cm-cols{display:grid;grid-template-columns:1fr 1fr;gap:24px}
.nv-cm-open{font-size:10px;letter-spacing:.5px;color:#8fe3a8;border:1px solid rgba(74,222,128,.35);padding:1px 6px;margin-left:4px}
@media(max-width:760px){.nv-cm-cols{grid-template-columns:1fr}}

/* Sentinel anti-cheat console */
.nv-sn-h3{font-family:var(--disp);color:var(--gold-hi);font-size:15px;letter-spacing:.5px;margin:24px 0 12px}
.nv-sn-stats{display:flex;gap:14px;margin:18px 0}
.nv-sn-stat{flex:1;border:1px solid var(--line);padding:16px;text-align:center;font-size:11px;letter-spacing:1px;text-transform:uppercase;color:var(--muted2)}
.nv-sn-stat span{display:block;font-family:var(--disp);font-size:26px;margin-bottom:3px;color:var(--fg)}
.nv-sn-stat.high span{color:#ff5d5d}.nv-sn-stat.med span{color:var(--gold-hi)}.nv-sn-stat.low span{color:#9fb4ff}
.nv-sn-tier{font-family:var(--disp);font-size:11px;letter-spacing:1px;padding:3px 9px;border:1px solid var(--line)}
.nv-sn-high{color:#ff5d5d;border-color:rgba(239,68,68,.4)}
.nv-sn-med{color:var(--gold-hi);border-color:rgba(var(--gold-bright-rgb),.4)}
.nv-sn-low{color:#9fb4ff;border-color:rgba(123,108,255,.35)}
.nv-sn-none{color:var(--muted2)}
.nv-sn-back{color:var(--muted);font-size:13px;display:inline-block;margin-bottom:14px}
.nv-sn-dhead{display:flex;align-items:center;gap:14px}
.nv-sn-cols{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:10px}
@media(max-width:820px){.nv-sn-cols{grid-template-columns:1fr}}
.nv-sn-timeline{display:flex;flex-direction:column;gap:8px;max-height:520px;overflow-y:auto}
.nv-sn-sig{border:1px solid var(--line);border-left:2px solid var(--line);padding:10px 12px;background:rgba(255,255,255,.015)}
.nv-sn-sig-top{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--fg)}
.nv-sn-dot{width:8px;height:8px;border-radius:50%}
.nv-sn-w{font-size:11px;color:var(--muted2)}
.nv-sn-time{margin-left:auto;font-size:11px;color:var(--muted2)}
.nv-sn-explain{font-size:12.5px;color:var(--muted);margin-top:5px;line-height:1.4}
.nv-sn-hash{font-family:ui-monospace,monospace;font-size:10px;color:var(--muted2);margin-top:4px}
.nv-sn-actions{display:flex;flex-direction:column;gap:8px}
.nv-sn-actform{display:flex;gap:6px;align-items:center}
.nv-sn-reason{flex:1;background:rgba(255,255,255,.03)!important;border:1px solid var(--line)!important;color:var(--fg)!important;padding:6px 10px!important;font-size:12px!important}
.nv-sn-mins{width:70px!important;background:rgba(255,255,255,.03)!important;border:1px solid var(--line)!important;color:var(--fg)!important;padding:6px 8px!important;font-size:12px!important}
.nv-sn-chain{font-size:10px;letter-spacing:1px;padding:2px 8px;margin-left:8px}
.nv-sn-chain.ok{color:#4ade80;border:1px solid rgba(74,222,128,.4)}
.nv-sn-chain.broken{color:#ff5d5d;border:1px solid rgba(239,68,68,.5)}
.nv-sn-lures{width:100%;font-size:12px;color:var(--muted);margin:8px 0}
.nv-sn-lures td{padding:4px 6px;border-bottom:1px solid var(--line)}

@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* ===== Legend/Endgame leaderboard modules (nv-lb-*) ===== */
.nv-lb{max-width:var(--max)}
.nv-lb-lead{color:var(--muted);max-width:64ch;line-height:1.6;margin:8px 0 4px}
.nv-lb-sub{color:var(--muted2);font-size:13px;margin:0 0 8px}
.nv-lb-h3{font-family:var(--disp);color:var(--gold-bright);font-size:15px;letter-spacing:.5px;margin:22px 0 10px;border-bottom:1px solid var(--line);padding-bottom:6px}
.nv-lb-scroll{overflow-x:auto}
.nv-lb-hi{color:var(--gold-bright);font-weight:600}
.nv-lb-gold{color:var(--gold);font-family:var(--disp);font-size:13px}
.nv-lb-empty,.nv-lb-unbroken{color:var(--muted2);font-style:italic}
.nv-lb-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px}
.nv-lb-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px}
.nv-lb-card{border:1px solid var(--line);padding:12px 14px;background:rgba(255,255,255,.015)}
.nv-lb-card-h{font-family:var(--disp);color:var(--fg);font-size:13px;margin-bottom:6px}
.nv-lb-card-b{display:flex;justify-content:space-between;align-items:baseline;color:var(--muted)}
.nv-lb-card-b b{color:var(--gold-bright);font-size:17px}
.nv-lb-wing{margin-bottom:18px}
.nv-lb-wing-h{font-family:var(--disp);color:var(--violet2);font-size:13px;letter-spacing:1px;text-transform:uppercase;margin:0 0 8px}
.nv-lb-heroic{color:var(--gold);font-weight:600}
.nv-lb-normal{color:#6ab0ff}

/* ===== Shadow Palace boss gallery (nv-sp-*) ===== */
.nv-sp{max-width:var(--max);position:relative}
.nv-sp::before{content:"";position:absolute;top:-50px;right:-30px;width:420px;height:420px;z-index:-1;
  background-image:url('https://static.divine-pride.net/images/mobs/png/1917.png');
  background-repeat:no-repeat;background-size:contain;background-position:top right;
  opacity:.07;filter:grayscale(.35) contrast(1.1);
  -webkit-mask-image:radial-gradient(closest-side,#000 55%,transparent 100%);
  mask-image:radial-gradient(closest-side,#000 55%,transparent 100%);pointer-events:none}
@media(max-width:760px){.nv-sp::before{display:none}}

.nv-sp-wing{margin:36px 0 12px;position:relative}
.nv-sp-wing.nv-sp-violet{--wing-a:var(--violet2);--wing-a2:#7b6cff;--wing-glow:rgba(123,108,255,.32)}
.nv-sp-wing.nv-sp-blood{--wing-a:#7a1630;--wing-a2:#ff4d68;--wing-glow:rgba(255,77,104,.32)}
.nv-sp-wing-head{display:flex;align-items:center;gap:16px;margin-bottom:20px}
.nv-sp-wing-no{position:relative;flex:0 0 auto;width:44px;height:44px;display:grid;place-items:center;
  font-family:var(--deco);font-size:17px;color:var(--wing-a2)}
.nv-sp-wing-no::before{content:"";position:absolute;inset:0;border:1px solid var(--wing-a2);
  transform:rotate(45deg);box-shadow:0 0 16px var(--wing-glow)}
.nv-sp-wing-h{font-family:var(--disp);font-size:clamp(18px,2vw,23px);margin:0;color:#fff}
.nv-sp-wing-mood{margin:4px 0 0;color:var(--muted);font-size:12.5px;font-style:italic}

.nv-sp-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:18px;margin-bottom:16px}
.nv-sp-card{border:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),rgba(255,255,255,.005));
  position:relative;overflow:hidden;transition:.3s;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 14px),calc(100% - 14px) 100%,0 100%);
  animation:nvspin .5s ease both}
.nv-sp-grid .nv-sp-card:nth-child(1){animation-delay:.04s}
.nv-sp-grid .nv-sp-card:nth-child(2){animation-delay:.12s}
.nv-sp-grid .nv-sp-card:nth-child(3){animation-delay:.2s}
.nv-sp-card:hover{border-color:var(--wing-a2);transform:translateY(-3px);box-shadow:0 16px 40px rgba(0,0,0,.4)}
@keyframes nvspin{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}

.nv-sp-portrait{position:relative;height:180px;display:flex;align-items:center;justify-content:center;gap:8px;
  background:radial-gradient(60% 80% at 50% 38%,var(--wing-glow),transparent 70%),
    linear-gradient(180deg,rgba(0,0,0,0),var(--void) 92%);
  border-bottom:1px solid var(--line)}
.nv-sp-portrait img{max-height:150px;max-width:72%;object-fit:contain;
  filter:drop-shadow(0 10px 18px rgba(0,0,0,.65));transition:.35s}
.nv-sp-portrait.multi img{max-width:40%}
.nv-sp-card:hover .nv-sp-portrait img{transform:scale(1.06) translateY(-2px)}
.nv-sp-vs{width:1px;align-self:stretch;margin:14px 0;
  background:linear-gradient(180deg,transparent,var(--wing-a2),transparent);opacity:.5}

.nv-sp-body{padding:16px 18px 18px}
.nv-sp-name{font-family:var(--disp);font-size:17px;margin:0 0 8px;color:#fff}
.nv-sp-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.nv-sp-tag{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--muted);
  border:1px solid var(--line2);padding:2px 7px;font-family:var(--body)}
.nv-sp-tag:last-child{color:var(--gold)}
.nv-sp-blurb{font-family:var(--serif);font-style:italic;color:var(--parchment);font-size:13px;
  line-height:1.55;margin:0 0 14px;opacity:.85}
.nv-sp-status{border-top:1px solid var(--line);padding-top:12px}
.nv-sp-claim{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:4px}
.nv-sp-diff{font-size:11px;font-family:var(--disp);letter-spacing:1px;text-transform:uppercase}
.nv-sp-first{color:var(--muted);font-size:12.5px}
.nv-sp-first b{color:var(--gold-bright)}
.nv-sp-meta{color:var(--muted2);font-size:11.5px}
.nv-sp-unclaimed{display:flex;align-items:center;gap:8px;color:var(--muted2);font-style:italic;font-size:12.5px}
.nv-sp-dot{width:7px;height:7px;border-radius:50%;background:var(--wing-a2);box-shadow:0 0 8px var(--wing-a2);
  animation:nvwbpulse 1.6s infinite}

.nv-sp-seal{display:flex;align-items:center;gap:20px;border:1px solid var(--line);padding:18px 22px;background:rgba(255,255,255,.015)}
.nv-sp-seal-ring{position:relative;flex:0 0 auto;width:50px;height:50px}
.nv-sp-seal-ring::before,.nv-sp-seal-ring::after{content:"";position:absolute;inset:0;border-radius:50%;border:1px solid var(--line2)}
.nv-sp-seal-ring::after{inset:8px;border-color:var(--muted2)}
.nv-sp-seal-ring i{position:absolute;inset:19px;background:var(--muted2);transform:rotate(45deg);font-style:normal}
.nv-sp-seal.broken .nv-sp-seal-ring::before{border-color:var(--gold);box-shadow:0 0 14px var(--gold-deep)}
.nv-sp-seal.broken .nv-sp-seal-ring::after{border-color:var(--gold-bright)}
.nv-sp-seal.broken .nv-sp-seal-ring i{background:var(--gold-bright);box-shadow:0 0 10px var(--gold)}
.nv-sp-seal-name{font-family:var(--disp);font-size:14px;letter-spacing:.5px;color:var(--muted)}
.nv-sp-seal.broken .nv-sp-seal-name{color:var(--gold-hi)}
.nv-sp-seal-desc{color:var(--muted2);font-size:12px;margin:2px 0 6px}
.nv-sp-seal-claim{font-size:12.5px;color:var(--muted)}
.nv-sp-seal-claim b{color:var(--gold-bright)}
.nv-sp-seal-claim.muted{font-style:italic;color:var(--muted2)}
@media(max-width:600px){.nv-sp-seal{flex-direction:column;align-items:flex-start;gap:12px}}

/* ===== Shadow Palace v2: progress strip, pull tension, rewards, index, corners ===== */
.nv-sp-progress{display:flex;align-items:center;gap:14px;margin:4px 0 8px}
.nv-sp-progress-label{font-family:var(--disp);font-size:13px;color:var(--muted);white-space:nowrap}
.nv-sp-progress-label b{color:var(--gold-hi);font-size:16px}
.nv-sp-progress-bar{position:relative;flex:1;height:8px;background:rgba(255,255,255,.05);border:1px solid var(--line)}
.nv-sp-progress-fill{height:100%;background:linear-gradient(90deg,var(--gold-deep),var(--gold-bright));transition:width .6s ease}

.nv-sp-idx{font-family:var(--deco);font-size:12px;letter-spacing:.5px;color:var(--wing-a2);
  margin-right:7px;opacity:.85}

.nv-sp-reward{color:var(--muted2);font-size:11.5px;margin:0 0 12px;font-family:var(--body)}
.nv-sp-seal-rewards{color:var(--muted2);font-size:11px;margin-top:6px;font-style:italic}

.nv-sp-pulse{color:var(--muted);font-size:11.5px;margin-top:6px}
.nv-sp-pulse-mine{color:var(--gold-bright);font-size:11.5px;margin-top:3px;font-weight:600}

/* Corners only on the top edge -- the card's own clip-path already notches
   the bottom-right corner, so a bottom bracket pair would get half-clipped. */
.nv-sp-card::before,.nv-sp-card::after{content:"";position:absolute;width:16px;height:16px;
  border:1px solid var(--gold);opacity:.55;z-index:2;pointer-events:none}
.nv-sp-card::before{top:6px;left:6px;border-right:0;border-bottom:0}
.nv-sp-card::after{top:6px;right:6px;border-left:0;border-bottom:0}
.nv-sp-card:hover::before,.nv-sp-card:hover::after{opacity:1;border-color:var(--wing-a2)}

/* ===== Weekly Trial (nv-wt-*) ===== */
.nv-wt-affix{border:1px solid var(--line2);background:rgba(255,255,255,.02);padding:16px 20px;margin:16px 0}
.nv-wt-affix p{margin:4px 0 0;color:var(--muted);font-size:13px}
.nv-wt-affix-head{font-family:var(--disp);font-size:13px;letter-spacing:1px;color:var(--muted)}
.nv-wt-affix.berserk{border-color:rgba(255,93,93,.4)}
.nv-wt-affix.berserk .nv-wt-affix-head{color:#ff5d5d}
.nv-wt-affix.frenzy{border-color:rgba(199,120,221,.4)}
.nv-wt-affix.frenzy .nv-wt-affix-head{color:#c778dd}
.nv-wt-affix.hardened{border-color:rgba(111,140,255,.4)}
.nv-wt-affix.hardened .nv-wt-affix-head{color:#6f8cff}

.nv-wt-waves{display:grid;grid-template-columns:repeat(8,1fr);gap:8px;margin:16px 0 24px}
.nv-wt-wave{border:1px solid var(--line);text-align:center;position:relative;overflow:hidden;background:rgba(255,255,255,.015)}
.nv-wt-wave.boss{border-color:var(--gold);box-shadow:0 0 16px rgba(var(--gold-rgb),.25)}
.nv-wt-wave-no{position:absolute;top:4px;left:4px;font-family:var(--deco);font-size:10px;color:var(--muted2);z-index:2}
.nv-wt-wave.boss .nv-wt-wave-no{color:var(--gold-hi)}
.nv-wt-wave-portrait{height:64px;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,rgba(255,255,255,.02),var(--void));border-bottom:1px solid var(--line)}
.nv-wt-wave-portrait img{max-height:52px;max-width:80%;object-fit:contain;filter:drop-shadow(0 4px 8px rgba(0,0,0,.5))}
.nv-wt-wave-name{font-size:10px;color:var(--muted);padding:6px 2px;line-height:1.2}
.nv-wt-wave.boss .nv-wt-wave-name{color:var(--gold-hi);font-weight:600}
@media(max-width:700px){.nv-wt-waves{grid-template-columns:repeat(4,1fr)}}
@media(max-width:420px){.nv-wt-waves{grid-template-columns:repeat(2,1fr)}}

/* ===== The Abyss (nv-ab-*) ===== */
.nv-ab-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin:16px 0 24px}
.nv-ab-band{border:1px solid var(--line);overflow:hidden;background:rgba(255,255,255,.015);transition:.3s}
.nv-ab-band:hover{border-color:var(--line2);transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,0,0,.35)}
.nv-ab-portraits{height:110px;display:flex;align-items:center;justify-content:center;gap:10px;
  background:linear-gradient(180deg,rgba(255,255,255,.02),var(--void));border-bottom:1px solid var(--line)}
.nv-ab-portraits img{max-height:90px;max-width:38%;object-fit:contain;filter:drop-shadow(0 6px 12px rgba(0,0,0,.6))}
.nv-ab-vs{width:1px;align-self:stretch;margin:14px 0;background:linear-gradient(180deg,transparent,var(--line2),transparent)}
.nv-ab-body{padding:14px 16px 16px}
.nv-ab-range{font-family:var(--disp);color:#fff;font-size:15px;margin-bottom:8px}
.nv-ab-mob{color:var(--muted);font-size:12.5px;margin-top:3px}
.nv-ab-mob b{color:var(--gold-bright)}
.nv-ab-note{color:var(--muted2);font-size:11px;font-style:italic}

/* ===== Guild Throne (nv-th-*) -- reuses .nv-pvp-cols/.nv-pvp-hall/.nv-lb-* ===== */
.nv-th-hero{display:flex;gap:22px;align-items:center;border:1px solid var(--line2);
  background:linear-gradient(120deg,rgba(var(--gold-bright-rgb),.08),rgba(255,255,255,.012));padding:22px 26px;margin:18px 0 28px}
.nv-th-hero.vacant{border-color:var(--line);background:rgba(255,255,255,.012)}
.nv-th-crest{position:relative;flex:0 0 auto;width:64px;height:64px;display:flex;align-items:center;justify-content:center}
.nv-th-crest::before,.nv-th-crest::after{content:"";position:absolute;inset:0;border-radius:50%;border:1px solid var(--gold-bright);box-shadow:0 0 14px var(--gold-deep)}
.nv-th-crest::after{inset:9px;border-color:var(--gold-hi);box-shadow:none}
.nv-th-hero.vacant .nv-th-crest::before,.nv-th-hero.vacant .nv-th-crest::after{border-color:var(--line2);box-shadow:none}
.nv-th-crest i{position:absolute;inset:19px;background:var(--muted2);transform:rotate(45deg);font-style:normal}
.nv-th-crest img{max-width:44px;max-height:44px;object-fit:contain;position:relative;z-index:1}
.nv-th-title{font-family:var(--disp);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--gold)}
.nv-th-hero.vacant .nv-th-title{color:var(--muted2)}
.nv-th-guild{font-family:var(--deco);font-size:24px;color:var(--gold-hi);line-height:1.2;margin-top:2px}
.nv-th-gm{color:var(--muted);font-size:13px;margin-top:2px}
.nv-th-since{color:var(--muted2);font-size:12px;margin-top:2px}
.nv-th-sub{color:var(--muted);font-size:13px;margin:4px 0 0;max-width:52ch}
.nv-th-badges{display:flex;gap:10px;flex-wrap:wrap;margin-top:10px}
.nv-th-badge{border:1px solid var(--line2);padding:4px 12px;font-size:12px;color:var(--muted)}
.nv-th-dynasty{border:1px solid rgba(var(--gold-bright-rgb),.4);padding:4px 12px;font-size:12px;color:var(--gold-hi);
  display:flex;align-items:center;gap:8px}
.nv-th-pips{display:inline-flex;gap:3px}
.nv-th-pips i{width:8px;height:8px;border-radius:50%;background:var(--line2);font-style:normal;display:inline-block}
.nv-th-pips i.on{background:var(--gold);box-shadow:0 0 6px var(--gold)}
.nv-th-infamy{color:#ff5d5d;font-size:12px;font-weight:600;margin-top:8px}
.nv-th-infamy.mild{color:var(--gold);font-weight:400}
@media(max-width:560px){.nv-th-hero{flex-direction:column;text-align:center}.nv-th-badges{justify-content:center}}

.nv-th-mvps{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:16px 0 8px}
.nv-th-mvp{border:1px solid var(--line);background:rgba(255,255,255,.015);padding:16px}
.nv-th-mvp-cat{font-family:var(--disp);color:var(--gold);font-size:12px;letter-spacing:.5px;text-transform:uppercase}
.nv-th-mvp-desc{color:var(--muted2);font-size:11px;margin:4px 0 10px}
.nv-th-mvp-name{font-family:var(--disp);color:#fff;font-size:15px}
.nv-th-mvp-guild{color:var(--muted);font-size:12px;margin-top:2px}
.nv-th-mvp-score{color:var(--gold-hi);font-size:13px;font-weight:600;margin-top:4px}
.nv-th-note{color:var(--muted2);font-size:11px;font-style:italic;margin:8px 0 20px}

.nv-th-free{display:inline-block;border:1px solid rgba(74,222,128,.4);color:#4ade80;font-size:10px;
  letter-spacing:.5px;text-transform:uppercase;padding:2px 8px;margin-left:8px;vertical-align:middle}
.nv-th-subhead{font-family:var(--disp);color:var(--muted);font-size:12px;letter-spacing:.5px;text-transform:uppercase;margin:16px 0 8px}
.nv-th-called{color:#4ade80;font-weight:600;font-size:12px}

.nv-th-schedule{border-left:2px solid var(--gold);background:rgba(255,255,255,.02);padding:12px 16px;
  color:var(--muted);font-size:12.5px;line-height:1.7;margin:14px 0}
.nv-th-schedule-h{font-family:var(--disp);color:var(--gold-hi);font-size:12px;letter-spacing:.5px;text-transform:uppercase;margin-bottom:4px}
.nv-th-schedule b{color:var(--gold-bright)}

/* ===== Legend Track v2 shared kit (nv-lt-*) — generalizes the proven nv-sp-*
   gallery structure (hover/glow/clip-path/corners lifted verbatim) into a
   content-agnostic leaderboard vocabulary for jobtrials/journal/estate/tycoon/
   stronghold/mentor. Each section sets --lt-a / --lt-a2 / --lt-glow accents. ===== */
.nv-lt{max-width:var(--max);position:relative}

/* collective progress meter (mirrors nv-sp-progress) */
.nv-lt-meter{display:flex;align-items:center;gap:14px;margin:6px 0 22px}
.nv-lt-meter-label{font-family:var(--disp);font-size:13px;color:var(--muted);white-space:nowrap}
.nv-lt-meter-label b{color:var(--gold-hi);font-size:16px}
.nv-lt-meter-bar{position:relative;flex:1;height:8px;background:rgba(255,255,255,.05);border:1px solid var(--line)}
.nv-lt-meter-fill{height:100%;background:linear-gradient(90deg,var(--gold-deep),var(--gold-bright));transition:width .6s ease}

/* personalization banner (shown to logged-in viewers) */
.nv-lt-you{--lt-a2:var(--gold-bright);display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  border:1px solid var(--line2);background:linear-gradient(180deg,rgba(var(--gold-bright-rgb),.06),rgba(var(--gold-bright-rgb),.01));
  padding:14px 18px;margin:0 0 24px}
.nv-lt-you-badge{flex:0 0 auto;width:46px;height:46px;display:grid;place-items:center;position:relative;
  font-family:var(--deco);font-size:15px;color:var(--gold-hi)}
.nv-lt-you-badge::before{content:"";position:absolute;inset:0;border:1px solid var(--gold);transform:rotate(45deg);box-shadow:0 0 14px var(--gold-deep)}
.nv-lt-you-main{flex:1;min-width:200px}
.nv-lt-you-h{font-family:var(--disp);color:var(--gold-hi);font-size:14px;margin:0 0 3px}
.nv-lt-you-sub{color:var(--muted);font-size:12.5px}
.nv-lt-you-sub b{color:var(--gold-bright)}

/* accent-colored section (mirrors nv-sp-wing + nv-sp-wing-head) */
.nv-lt-section{margin:34px 0 12px;position:relative;
  --lt-a:var(--violet2);--lt-a2:#7b6cff;--lt-glow:rgba(123,108,255,.30)}
.nv-lt-section.lt-gold{--lt-a:var(--gold-deep);--lt-a2:var(--gold-bright);--lt-glow:rgba(var(--gold-bright-rgb),.28)}
.nv-lt-section.lt-blue{--lt-a:#1c3a63;--lt-a2:#6ab0ff;--lt-glow:rgba(106,176,255,.28)}
.nv-lt-section.lt-green{--lt-a:#1f4d33;--lt-a2:#8fe0a8;--lt-glow:rgba(143,224,168,.26)}
.nv-lt-section.lt-rose{--lt-a:#5a1730;--lt-a2:#ff6fa0;--lt-glow:rgba(255,111,160,.28)}
.nv-lt-head{display:flex;align-items:center;gap:16px;margin-bottom:18px}
.nv-lt-no{position:relative;flex:0 0 auto;width:44px;height:44px;display:grid;place-items:center;
  font-family:var(--deco);font-size:16px;color:var(--lt-a2)}
.nv-lt-no::before{content:"";position:absolute;inset:0;border:1px solid var(--lt-a2);transform:rotate(45deg);box-shadow:0 0 16px var(--lt-glow)}
.nv-lt-head-h{font-family:var(--disp);font-size:clamp(17px,2vw,22px);margin:0;color:#fff}
.nv-lt-head-mood{margin:4px 0 0;color:var(--muted);font-size:12.5px;font-style:italic}

/* card grid + card (mirrors nv-sp-grid/nv-sp-card incl. entry animation + corners) */
.nv-lt-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(258px,1fr));gap:18px;margin-bottom:16px}
.nv-lt-card{border:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),rgba(255,255,255,.005));
  position:relative;overflow:hidden;transition:.3s;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 14px),calc(100% - 14px) 100%,0 100%);
  animation:nvspin .5s ease both}
.nv-lt-grid .nv-lt-card:nth-child(1){animation-delay:.04s}
.nv-lt-grid .nv-lt-card:nth-child(2){animation-delay:.1s}
.nv-lt-grid .nv-lt-card:nth-child(3){animation-delay:.16s}
.nv-lt-grid .nv-lt-card:nth-child(4){animation-delay:.22s}
.nv-lt-card:hover{border-color:var(--lt-a2);transform:translateY(-3px);box-shadow:0 16px 40px rgba(0,0,0,.4)}
.nv-lt-card.lt-mine{border-color:var(--lt-a2);box-shadow:0 0 0 1px var(--lt-a2) inset}
.nv-lt-card::before,.nv-lt-card::after{content:"";position:absolute;width:16px;height:16px;
  border:1px solid var(--gold);opacity:.5;z-index:2;pointer-events:none}
.nv-lt-card::before{top:6px;left:6px;border-right:0;border-bottom:0}
.nv-lt-card::after{top:6px;right:6px;border-left:0;border-bottom:0}
.nv-lt-card:hover::before,.nv-lt-card:hover::after{opacity:1;border-color:var(--lt-a2)}

/* medallion art zone — the honest substitute for a portrait when a module has
   no per-entity sprite source: a big value on the same radial glow SP uses. */
.nv-lt-medal{position:relative;height:132px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:radial-gradient(60% 80% at 50% 40%,var(--lt-glow),transparent 70%),
    linear-gradient(180deg,rgba(0,0,0,0),var(--void) 94%);border-bottom:1px solid var(--line)}
.nv-lt-medal-rank{position:absolute;top:8px;left:10px;font-family:var(--deco);font-size:12px;color:var(--lt-a2);opacity:.85}
.nv-lt-medal-big{font-family:var(--deco);font-size:34px;line-height:1;color:#fff;text-shadow:0 0 18px var(--lt-glow)}
.nv-lt-medal-unit{font-family:var(--disp);font-size:12px;letter-spacing:1px;text-transform:uppercase;color:var(--muted);margin-top:6px}
.nv-lt-card:hover .nv-lt-medal-big{transform:scale(1.06);transition:.35s}
.nv-lt-crown{position:absolute;top:8px;right:10px;font-size:15px;filter:drop-shadow(0 0 6px var(--gold))}

.nv-lt-body{padding:15px 17px 17px}
.nv-lt-name{font-family:var(--disp);font-size:16px;margin:0 0 8px;color:#fff;display:flex;align-items:baseline;gap:8px}
.nv-lt-name .idx{font-family:var(--deco);font-size:12px;color:var(--lt-a2);opacity:.85}
.nv-lt-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.nv-lt-tag{font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:var(--muted);
  border:1px solid var(--line2);padding:2px 7px;font-family:var(--body)}
.nv-lt-blurb{font-family:var(--serif);font-style:italic;color:var(--parchment);font-size:13px;line-height:1.55;margin:0 0 12px;opacity:.85}
.nv-lt-reward{color:var(--muted2);font-size:11.5px;margin:0 0 12px}
/* mini progress bar inside a card */
.nv-lt-mini{height:6px;background:rgba(255,255,255,.06);border:1px solid var(--line);margin:2px 0 8px}
.nv-lt-mini-fill{height:100%;background:linear-gradient(90deg,var(--lt-a),var(--lt-a2))}
.nv-lt-status{border-top:1px solid var(--line);padding-top:11px;color:var(--muted);font-size:12px}
.nv-lt-status b{color:var(--gold-bright)}
.nv-lt-status .muted{color:var(--muted2);font-style:italic}

/* photo portrait — a real hotlinked image variant of nv-lt-medal, for cards
   backed by a genuine external asset (e.g. a Divine Pride map screenshot)
   rather than a number. Same radial-glow zone, image instead of a big digit. */
.nv-lt-photo{position:relative;height:132px;display:flex;align-items:center;justify-content:center;overflow:hidden;
  background:radial-gradient(60% 80% at 50% 40%,var(--lt-glow),transparent 70%),
    linear-gradient(180deg,rgba(0,0,0,0),var(--void) 94%);border-bottom:1px solid var(--line)}
.nv-lt-photo img{width:100%;height:100%;object-fit:cover;object-position:center 35%;
  filter:saturate(1.05) contrast(1.03);transition:.35s;opacity:.92}
.nv-lt-card:hover .nv-lt-photo img{transform:scale(1.07);opacity:1}
.nv-lt-photo-fade{position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,0) 45%,var(--void) 96%)}
.nv-lt-photo-glyph{font-size:38px;filter:drop-shadow(0 0 14px var(--lt-glow))}

/* locked/mystery card state — riddle not yet solved by the viewer. Keeps the
   shared card shell (consistent chrome) but mutes it and hides the reveal. */
.nv-lt-card.lt-locked .nv-lt-photo img,.nv-lt-card.lt-locked .nv-lt-medal-big{filter:grayscale(1) brightness(.35);opacity:.6}
.nv-lt-card.lt-locked .nv-lt-photo{background:radial-gradient(60% 80% at 50% 40%,rgba(255,255,255,.05),transparent 70%),linear-gradient(180deg,rgba(0,0,0,0),var(--void) 94%)}
.nv-lt-lock-icon{position:absolute;z-index:1;font-size:26px;opacity:.65;filter:drop-shadow(0 2px 6px rgba(0,0,0,.6))}
.nv-lt-card.lt-locked:hover{border-color:var(--line2);transform:none;box-shadow:none}
.nv-lt-card.lt-locked .idx,.nv-lt-card.lt-locked .nv-lt-name{color:var(--muted)}

/* seal capstone (mirrors nv-sp-seal) */
.nv-lt-seal{display:flex;align-items:center;gap:20px;border:1px solid var(--line);padding:18px 22px;background:rgba(255,255,255,.015);margin-top:8px}
.nv-lt-seal-ring{position:relative;flex:0 0 auto;width:50px;height:50px}
.nv-lt-seal-ring::before,.nv-lt-seal-ring::after{content:"";position:absolute;inset:0;border-radius:50%;border:1px solid var(--line2)}
.nv-lt-seal-ring::after{inset:8px;border-color:var(--muted2)}
.nv-lt-seal-ring i{position:absolute;inset:19px;background:var(--muted2);transform:rotate(45deg);font-style:normal}
.nv-lt-seal.broken .nv-lt-seal-ring::before{border-color:var(--gold);box-shadow:0 0 14px var(--gold-deep)}
.nv-lt-seal.broken .nv-lt-seal-ring::after{border-color:var(--gold-bright)}
.nv-lt-seal.broken .nv-lt-seal-ring i{background:var(--gold-bright);box-shadow:0 0 10px var(--gold)}
.nv-lt-seal-name{font-family:var(--disp);font-size:14px;letter-spacing:.5px;color:var(--muted)}
.nv-lt-seal.broken .nv-lt-seal-name{color:var(--gold-hi)}
.nv-lt-seal-desc{color:var(--muted2);font-size:12px;margin:2px 0 6px}
.nv-lt-seal-claim{font-size:12.5px;color:var(--muted)}
.nv-lt-seal-claim b{color:var(--gold-bright)}
.nv-lt-seal-claim.muted{font-style:italic;color:var(--muted2)}
@media(max-width:600px){.nv-lt-seal{flex-direction:column;align-items:flex-start;gap:12px}}

/* lore empty state */
.nv-lt-empty{border:1px dashed var(--line2);background:rgba(255,255,255,.015);padding:26px 24px;text-align:center;
  font-family:var(--serif);font-style:italic;color:var(--parchment);font-size:14px;line-height:1.6}
.nv-lt-empty b{color:var(--gold-hi);font-style:normal}

/* segmented breakdown bar -- shows a real multi-axis composition (e.g. which
   Renown axes make up a total) as proportional colored strips, not a fake avg. */
.nv-lt-segbar{display:flex;height:7px;overflow:hidden;border:1px solid var(--line);margin:4px 0 6px}
.nv-lt-segbar span{height:100%}
.nv-lt-seglegend{display:flex;flex-wrap:wrap;gap:8px;font-size:9.5px;color:var(--muted2);margin-bottom:10px}
.nv-lt-seglegend i{display:inline-block;width:7px;height:7px;margin-right:3px;border-radius:1px;font-style:normal}

/* Generic scroll-reveal — the footer's IntersectionObserver adds .in to every
   .reveal on the page, but only .nv-cockpit.reveal ever had a transition rule.
   This closes that gap for all themed pages (landing overrides with its own
   later-in-document inline rule; .nv-cockpit.reveal stays more specific). */
.reveal{opacity:0;transform:translateY(20px);transition:opacity .8s ease,transform .8s ease}
.reveal.in{opacity:1;transform:none}
/* Generic drawline (same observer): a gold rule that draws itself in on scroll.
   The landing page's own inline .drawline rules load later and override there. */
.drawline{height:1px;position:relative;overflow:hidden}
.drawline::before{content:"";position:absolute;inset:0;transform:scaleX(0);transform-origin:left;
  background:linear-gradient(90deg,transparent,var(--gold),transparent);transition:transform 1.4s cubic-bezier(.2,.7,.2,1)}
.drawline.in::before{transform:scaleX(1)}
@media(prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}.drawline::before{transform:scaleX(1);transition:none}}

/* ===== Season Hub (nv-sh-*) — public season showcase ===== */
.nv-sh{max-width:var(--max);position:relative}

/* shared section-header + card primitives (page-scoped, do NOT touch the
   global .nv-btn / .message etc. — see nv-sh-btn below for why) */
.nv-sh-sec{margin:0 0 56px}
.nv-sh-sec:last-child{margin-bottom:0}
.nv-sh-kicker{font-family:var(--disp);font-weight:600;letter-spacing:4px;font-size:11px;text-transform:uppercase;color:var(--gold);display:inline-flex;align-items:center;gap:10px}
.nv-sh-kicker::before{content:"";width:24px;height:1px;background:linear-gradient(90deg,transparent,var(--gold))}
.nv-sh-h2{font-family:var(--disp);font-weight:700;font-size:clamp(22px,3vw,32px);line-height:1.1;margin:12px 0 10px;color:#fff}
.nv-sh-lead{color:var(--muted);font-size:14px;max-width:62ch;margin:0 0 22px} /* painted by the .drawline::before animation */
.nv-sh-btn{font-family:var(--disp);font-weight:700;letter-spacing:1.2px;text-transform:uppercase;font-size:12px;
  padding:13px 26px;display:inline-flex;align-items:center;gap:8px;transition:.25s;border:none;text-decoration:none!important;
  clip-path:polygon(9px 0,100% 0,calc(100% - 9px) 100%,0 100%)}
.nv-sh-btn.gold{color:#1a1206!important;background:linear-gradient(135deg,var(--gold-hi),var(--gold),var(--gold-deep))}
.nv-sh-btn.gold:hover{transform:translateY(-2px);color:#1a1206!important}
.nv-sh-btn.ghost{color:var(--gold-bright)!important;background:transparent;border:1px solid var(--line2);clip-path:none}
.nv-sh-btn.ghost:hover{background:rgba(var(--gold-bright-rgb),.08);border-color:var(--gold);color:var(--gold-hi)!important}
.nv-sh-btn[disabled]{opacity:.42;cursor:not-allowed;filter:grayscale(.4)}
.nv-sh-nums{font-variant-numeric:tabular-nums}

/* hero */

/* ===== B2 "The Ascent" (2026-08-07) — the Season Pass as its own instrument.
   Inserted here, immediately before the reduced-motion rule below, so that
   rule's opt-out absorbs every new selector in the same commit (the file's
   own documented convention -- see the MOTION BUDGET header comment). Zero
   new continuous loops of its own; nothing here needs a reduced-motion entry. */
.nv-asc-meters{display:flex;flex-wrap:wrap;gap:12px;margin-top:10px}
.nv-asc-meter{flex:1 1 220px;min-width:200px;border:1px solid var(--line);padding:10px 14px;background:rgba(255,255,255,.015)}
.nv-asc-meter.is-bank{border-color:rgba(var(--gold-bright-rgb),.3)}
.nv-asc-meter.is-prestige{border-color:rgba(var(--violet-rgb),.35)}
.nv-asc-meter-h{font-size:13px;color:var(--muted)}
.nv-asc-meter-h b{color:var(--gold-hi);font-size:15px}
.nv-asc-meter-bar{height:6px;background:var(--void);border:1px solid var(--line2);margin:6px 0;overflow:hidden}
.nv-asc-meter-bar i{display:block;height:100%;width:var(--w,0%);background:linear-gradient(90deg,var(--gold),var(--gold-bright));transition:width .6s ease}
.nv-asc-meter-n{font-size:11.5px;color:var(--muted2);line-height:1.4}
.nv-asc-cta-row{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:12px}
.nv-sh-btn.is-static{cursor:default;opacity:.92}
.nv-sh-btn.is-disabled{cursor:not-allowed;opacity:.4;filter:grayscale(.4)}
.nv-asc-lanes{display:flex;flex-direction:column;gap:16px;margin-top:16px}
.nv-asc-lane h4{margin:0 0 8px;font-family:var(--disp);font-size:13px;letter-spacing:.4px;color:var(--muted)}
.nv-asc-lane h4 small{color:var(--muted2);font-weight:400;text-transform:none;letter-spacing:0;margin-left:6px}
.nv-asc-lane.is-prem h4{color:var(--gold-hi)}
.nv-asc-lane.lt-locked .nv-asc-rail{opacity:.5;filter:grayscale(.6)}
/* The scroll-not-wrap fix: a wrapping flex rail inside .nv-content is
   silently clipped by the container's clip-path with no scrollbar ever
   appearing -- a documented failure on this site, caught on a real render.
   overflow-x:auto + flex-wrap:nowrap is the only safe shape at up to 200
   tiers. Reuses NONE of .nv-lt-tracker's own container rules (that one
   wraps on purpose for its 6-item, non-scrolling use) -- only the pip/
   diamond/label LANGUAGE below is shared, via nv-asc-pip's own rules,
   deliberately not the class name, so this rail can never accidentally
   inherit a future change meant for the 6-item Legend Tracks hub. */
.nv-asc-rail{display:flex;flex-wrap:nowrap;gap:5px;overflow-x:auto;padding:4px 2px 10px;scrollbar-width:thin}
.nv-asc-pip{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:2px;width:30px}
.nv-asc-pip-dia{width:22px;height:22px;display:grid;place-items:center;position:relative;font-size:10px;opacity:.35;transition:.25s}
.nv-asc-pip-dia::before{content:"";position:absolute;inset:0;border:1px solid var(--line2);transform:rotate(45deg);transition:.25s}
.nv-asc-pip.has-reward .nv-asc-pip-dia{opacity:.7;width:26px;height:26px}
.nv-asc-pip.is-ready .nv-asc-pip-dia{opacity:1}
.nv-asc-pip.is-ready .nv-asc-pip-dia::before{border-color:var(--gold);box-shadow:0 0 10px var(--gold-deep);background:rgba(var(--gold-bright-rgb),.15)}
.nv-asc-pip.is-claimed .nv-asc-pip-dia{opacity:1;color:var(--gold-bright)}
.nv-asc-pip.is-claimed .nv-asc-pip-dia::before{border-color:var(--gold-bright);background:rgba(var(--gold-bright-rgb),.25)}
.nv-asc-pip-art{border-radius:2px;transform:rotate(-45deg);object-fit:contain}
.nv-asc-pip.has-reward .nv-asc-pip-dia .nv-asc-pip-art{transform:none}
.nv-asc-pip-t{font-size:8px;color:var(--muted2);letter-spacing:.3px}
.nv-asc-pip.is-ready .nv-asc-pip-t,.nv-asc-pip.is-claimed .nv-asc-pip-t{color:var(--gold-bright)}
.nv-asc-detail{margin-top:14px;border-top:1px solid var(--line);padding-top:10px}
.nv-asc-detail summary{cursor:pointer;font-size:12.5px;color:var(--muted);user-select:none}
.nv-asc-detail-body{margin-top:10px;max-height:340px;overflow-y:auto}
.nv-asc-detail-body table{width:100%;border-collapse:collapse;font-size:12px}
.nv-asc-detail-body th,.nv-asc-detail-body td{text-align:left;padding:5px 8px;border-bottom:1px solid var(--line)}
.nv-asc-detail-body th{color:var(--muted2);font-weight:500;font-size:10.5px;text-transform:uppercase;letter-spacing:.4px;position:sticky;top:0;background:var(--panel-bg,#150f24)}
@media(max-width:600px){.nv-asc-meter{flex:1 1 100%}}

/* ===== B3 "Surfacing" (2026-08-07) — personalization + Featured Content.
   Inserted here, same convention as B2's block just above: immediately
   before the reduced-motion rule below. Zero new continuous loops. ===== */
.nv-obs-feat{border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin-bottom:14px}
.nv-obs-feat-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px}
.nv-obs-feat-lbl{font-family:var(--disp);font-size:12px;letter-spacing:.4px;color:var(--parchment)}
.nv-obs-feat-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.nv-obs-feat-affix{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-top:10px}
.nv-obs-feat-week{text-align:center;border:1px solid var(--line);border-radius:8px;padding:6px 4px}
.nv-obs-feat-week.is-empty{opacity:.55}
.nv-obs-feat-week-lbl{display:block;font-size:9.5px;color:var(--muted2);letter-spacing:.3px;text-transform:uppercase}
.nv-obs-feat-week-affix{display:block;margin-top:3px;font-family:var(--disp);font-size:11px;color:var(--ac,var(--gold-hi))}
.nv-obs-feat-week-affix.is-tbd{color:var(--muted2)}
@media(max-width:640px){.nv-obs-feat-affix{grid-template-columns:repeat(3,1fr)}}

.nv-obs-yourseason{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0 14px}
.nv-obs-yourseason.is-quiet{opacity:.7}
.nv-obs-yourseason-lbl{font-family:var(--disp);font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:var(--muted2)}

.nv-obs-path.is-pledged{border-color:var(--line2);background:rgba(var(--gold-bright-rgb),.035)}
.nv-obs-path-goals{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.nv-obs-path-goal{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11.5px}
.nv-obs-path-goal .nm{flex:1 1 100%;color:var(--text)}
.nv-obs-path-goal-bar{flex:1 1 auto;min-width:80px;height:5px;border-radius:3px;background:rgba(255,255,255,.06);overflow:hidden}
.nv-obs-path-goal-bar i{display:block;height:100%;width:var(--w,0%);background:linear-gradient(90deg,var(--gold),var(--gold-hi))}
.nv-obs-path-goal .val{color:var(--muted2);white-space:nowrap}
.nv-obs-path-goal .st{color:var(--muted2);white-space:nowrap}
.nv-obs-path-goal.is-ready .st{color:var(--gold-hi)}
.nv-obs-path-goal.is-claimed .st{color:var(--ok)}
.nv-obs-path-goal-unknown{flex:1 1 auto;color:var(--muted2);font-style:italic}

.nv-obs-lane-row.is-claimed{opacity:.55}
.nv-obs-lane-row.is-ready .nv-obs-lane-state{color:var(--gold-hi)}
.nv-obs-lane-row.is-locked{opacity:.6}
.nv-obs-lane-req{color:var(--muted2);font-size:10.5px;white-space:nowrap;margin-right:6px}
.nv-obs-lane-state{color:var(--muted2);font-size:10.5px;white-space:nowrap;margin-left:6px}
.nv-obs-lane-gate{color:var(--muted2)}
.nv-obs-lane-gate.is-short{color:var(--danger)}

.nv-obs-medal.is-projected{border-color:var(--gold-bright);box-shadow:0 0 0 1px rgba(var(--gold-bright-rgb),.3)}
.nv-obs-medal.is-projected::after{content:"YOUR PROJECTED RANK";position:absolute;top:6px;left:50%;transform:translateX(-50%);
  font-family:var(--disp);font-size:7.5px;letter-spacing:.6px;color:var(--gold-bright);white-space:nowrap}

.nv-obs-fxmatrix table{width:100%;border-collapse:collapse;font-size:11.5px;margin:0 16px 12px}
.nv-obs-fxmatrix th,.nv-obs-fxmatrix td{text-align:left;padding:5px 8px;border-bottom:1px solid var(--line)}
.nv-obs-fxmatrix th{color:var(--muted2);font-weight:500;font-size:10px;text-transform:uppercase;letter-spacing:.4px}
@media(prefers-reduced-motion:reduce){}

@media(prefers-reduced-motion:reduce){}

/* roadmap — the track is a linear day axis; the now-marker is positioned on
   the CONTAINER (not inside a segment). Diamond dead-center on the bar, label
   floating above it — both absolutely placed so nothing can collide with the
   bar itself (v2 shipped the label overlapping the track; seen in Safari). */

@media(max-width:960px){}
@media(max-width:560px){}

/* events */

/* realm pulse feed */

@media(prefers-reduced-motion:reduce){}
@media(max-width:640px){}

/* standings */

@media(max-width:900px){}
.nv-sh-lb{width:100%;border-collapse:collapse}
.nv-sh-lb th{font-family:var(--disp);font-weight:600;font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:var(--gold);
  text-align:left;padding:9px 10px;border-bottom:1px solid var(--line2)}
.nv-sh-lb td{padding:10px 10px;border-bottom:1px solid rgba(var(--gold-bright-rgb),.08);font-size:13px;vertical-align:middle}
.nv-sh-lb tr.me td{background:rgba(var(--gold-bright-rgb),.07)}
.nv-sh-rank{font-family:var(--disp);font-weight:700;color:var(--parchment);width:32px}
.nv-sh-rank.r1{color:var(--gold-hi)}
.nv-sh-tier-pill{font-family:var(--disp);font-size:9px;letter-spacing:.6px;text-transform:uppercase;padding:3px 7px;border:1px solid var(--line2);color:var(--gold-bright);white-space:nowrap}
.nv-sh-breakdown{display:flex;flex-wrap:wrap;gap:6px;margin:12px 0}
.nv-sh-breakdown span{font-size:10px;color:var(--muted);border:1px solid var(--line);padding:4px 7px}
.nv-sh-breakdown b{color:var(--parchment)}
.nv-sh-pass-chip{font-size:11.5px;color:var(--muted);border:1px solid var(--line);padding:8px 11px;margin-top:12px}
.nv-sh-pass-chip b{color:var(--gold-hi)}
.nv-sh-pass-chip a{font-family:var(--disp);font-size:10px;letter-spacing:1px;text-transform:uppercase;margin-left:8px}
.nv-sh-titles{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.nv-sh-title-badge{font-family:var(--disp);font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--gold-bright);
  border:1px solid var(--line2);background:rgba(var(--gold-bright-rgb),.07);padding:4px 9px}

/* season pass */
.nv-sh-passme{padding:18px 22px;margin-bottom:16px}
.nv-sh-passme-bar{height:8px;border:1px solid var(--line2);background:rgba(var(--void-rgb),.5);margin-bottom:9px}
.nv-sh-passme-fill{height:100%;background:linear-gradient(90deg,var(--gold-deep),var(--gold-hi));box-shadow:0 0 10px rgba(var(--gold-bright-rgb),.4)}
.nv-sh-passme-next{font-size:12px;color:var(--muted)}
.nv-sh-passme-next b{color:var(--parchment)}

/* harvest */

@media(max-width:900px){}
@media(max-width:560px){}

/* economy */

@media(max-width:800px){}
.nv-sh-dormant-badge{display:inline-flex;align-items:center;gap:6px;font-family:var(--disp);font-size:9px;letter-spacing:.8px;
  text-transform:uppercase;color:var(--muted2);border:1px solid var(--line);padding:4px 8px;margin-bottom:9px}
.nv-sh-live-badge{display:inline-flex;align-items:center;gap:6px;font-family:var(--disp);font-size:9px;letter-spacing:.8px;
  text-transform:uppercase;color:#5fe0a0;border:1px solid rgba(95,224,160,.35);padding:4px 8px;margin-bottom:9px}

/* hall of seasons */

/* faq */

/* finale */

/* ===== Hub portrait (nv-hub-*) =====
   Shared by Endgame Hub and Legend Tracks Hub for cards backed by a real
   Divine Pride image (mob/item/map). Same visual language as the Shadow
   Palace gold-standard .nv-sp-portrait (radial glow + object-fit:contain +
   drop-shadow), wired to --lt-a2/--lt-glow (already in scope from the
   enclosing .nv-lt-section.lt-* wrapper) instead of Shadow Palace's own
   --wing-a2/--wing-glow, which are only ever set inline per wing and have
   no root fallback. Centering uses absolute+transform rather than flex —
   flex centering of an unconstrained <img> (only max-height/max-width, no
   explicit width/height) was observed pinning to the top-left in Safari. */
.nv-hub-portrait{position:relative;height:180px;overflow:hidden;
  background:radial-gradient(60% 80% at 50% 38%,var(--lt-glow),transparent 70%),
    linear-gradient(180deg,rgba(0,0,0,0),var(--void) 92%);
  border-bottom:1px solid var(--line)}
.nv-hub-portrait img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  max-height:150px;max-width:78%;object-fit:contain;
  filter:drop-shadow(0 10px 18px rgba(0,0,0,.65));transition:transform .35s}
.nv-lt-card:hover .nv-hub-portrait img{transform:translate(-50%,-50%) scale(1.06)}

/* ===== Battle-pass style progress tracker (nv-lt-tracker-*) =====
   Sits inside the existing .nv-lt-you personalization banner. Each pip
   reuses the same rotated-diamond technique as .nv-lt-you-badge/.nv-lt-no/
   .nv-lt-seal-ring (border on a ::before, rotate(45deg), the element's own
   text content stays unrotated and centered via grid) rather than a new
   shape language. */
.nv-lt-tracker{display:flex;gap:16px;flex-wrap:wrap;margin-top:12px}
.nv-lt-tracker-pip{display:flex;flex-direction:column;align-items:center;gap:6px;width:56px;text-decoration:none}
.nv-lt-tracker-dia{width:30px;height:30px;display:grid;place-items:center;position:relative;font-size:14px;opacity:.4;transition:.3s}
.nv-lt-tracker-dia::before{content:"";position:absolute;inset:0;border:1px solid var(--line2);transform:rotate(45deg);transition:.3s}
.nv-lt-tracker-pip.done .nv-lt-tracker-dia{opacity:1}
.nv-lt-tracker-pip.done .nv-lt-tracker-dia::before{border-color:var(--gold);box-shadow:0 0 12px var(--gold-deep);background:rgba(var(--gold-bright-rgb),.15)}
.nv-lt-tracker-pip:hover .nv-lt-tracker-dia{opacity:.75}
.nv-lt-tracker-pip.done:hover .nv-lt-tracker-dia{opacity:1;transform:translateY(-2px)}
.nv-lt-tracker-label{font-size:9px;letter-spacing:.4px;text-transform:uppercase;color:var(--muted2);text-align:center;line-height:1.25}
.nv-lt-tracker-pip.done .nv-lt-tracker-label{color:var(--gold-bright)}

/* ===== OAuth login/register buttons (web/addons/oauthlink) =====
   Button chrome uses the site's own palette; the brand SVGs inside
   keep their own official colors, matching how most dark-themed sites
   adapt "Sign in with X" button chrome while leaving the mark alone. */
.nv-oauth-divider{display:flex;align-items:center;gap:12px;margin:20px 0 14px;color:var(--muted2);font-size:12px;text-transform:uppercase;letter-spacing:.6px}
.nv-oauth-divider::before,.nv-oauth-divider::after{content:"";flex:1;height:1px;background:var(--line)}
.nv-oauth-buttons{display:flex;gap:10px;flex-wrap:wrap}
.nv-oauth-btn{display:flex;align-items:center;justify-content:center;gap:10px;flex:1 1 160px;padding:10px 16px;border:1px solid var(--line2);border-radius:8px;background:var(--panel2);color:var(--text)!important;font-family:var(--body);font-weight:600;font-size:14px;text-decoration:none!important;transition:border-color .2s,background .2s,transform .2s}
.nv-oauth-btn:hover{border-color:var(--gold);background:var(--panel);transform:translateY(-1px)}
.nv-oauth-btn svg{flex-shrink:0}

/* ===== Shadow Palace: Director-era affix banner + live rules line ===== */
/* Both are sourced from nv_sp_affix / nv_sp_ruleset, so what a visitor
   reads here is what the raid is actually running this week. */
.nv-sp-affix{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 12px;
  margin:10px 0 6px;padding:10px 14px;background:rgba(255,255,255,.035)}
.nv-sp-affix-label{font-family:var(--disp);font-size:12px;letter-spacing:.5px;
  text-transform:uppercase;color:var(--muted2)}
.nv-sp-affix-name{font-family:var(--deco);font-size:19px;letter-spacing:.5px}
.nv-sp-affix-blurb{flex:1 1 100%;font-size:13px;color:var(--muted);line-height:1.5}
.nv-sp-rules{margin:2px 0 18px;font-size:13px;color:var(--muted);line-height:1.6}
.nv-sp-rules b{color:var(--gold-hi);font-weight:600}
@media(max-width:600px){.nv-sp-affix{padding:9px 11px}.nv-sp-affix-name{font-size:17px}}

/* ===== Cockpit · Shadow Palace (control/palace) =====
   New shared primitives. nv-cp-grid/card/h/sub already existed; the rest
   below did not and are added here rather than being assumed. */
.nv-cp-kv{display:flex;flex-direction:column;gap:7px;margin:10px 0 2px}
.nv-cp-kv>div{display:flex;justify-content:space-between;align-items:baseline;
  gap:14px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.nv-cp-kv>div:last-child{border-bottom:none;padding-bottom:0}
.nv-cp-kv span{font-size:13px;color:var(--muted)}
.nv-cp-kv b{font-family:var(--disp);font-size:14px;color:var(--gold-hi);text-align:right}

.nv-cp-table{width:100%;border-collapse:collapse;margin:10px 0 6px;font-size:13px}
.nv-cp-table th{text-align:left;font-family:var(--disp);font-size:12px;
  letter-spacing:.4px;text-transform:uppercase;color:var(--muted2);
  padding:0 10px 7px 0;border-bottom:1px solid var(--line);white-space:nowrap}
.nv-cp-table td{padding:9px 10px 9px 0;border-bottom:1px solid var(--line);
  vertical-align:top;color:var(--muted)}
.nv-cp-table tr:last-child td{border-bottom:none}
.nv-cp-table strong{color:var(--ink,#e8e4f0)}
.nv-cp-dim{font-size:11px;color:var(--muted2);margin-top:2px}

.nv-cp-tag{display:inline-block;font-family:var(--disp);font-size:11px;
  letter-spacing:.3px;padding:2px 7px;margin:0 4px 3px 0;
  border:1px solid var(--line);color:var(--muted2);white-space:nowrap}
.nv-cp-tag.ok{color:#8fe0a8;border-color:rgba(143,224,168,.45)}
.nv-cp-tag.warn{color:#e0a36a;border-color:rgba(224,163,106,.45)}

.nv-cp-form{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 14px;margin:10px 0 14px}
.nv-cp-field{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted2)}
.nv-cp-field input,.nv-cp-field select{background:rgba(255,255,255,.05);
  border:1px solid var(--line);color:inherit;padding:6px 9px;font:inherit;font-size:13px}
.nv-cp-field input:focus,.nv-cp-field select:focus{outline:1px solid var(--gold-hi);outline-offset:-1px}

.nv-cp-notice{margin:0 0 14px;padding:10px 14px;font-size:13px;
  background:rgba(255,255,255,.04);border-left:3px solid var(--gold-hi);color:var(--muted)}

/* Tables are the one thing here that can't reflow; let them scroll in place
   rather than pushing the page sideways. */
@media(max-width:600px){
  .nv-cp-table{display:block;overflow-x:auto;white-space:nowrap}
  .nv-cp-form{gap:8px}
  .nv-cp-field{flex:1 1 100%}
}

/* Grid children default to min-width:auto, so a table with nowrap headers
   refuses to shrink and overflows its track — on the cockpit Palace page
   the ladder's two tables collided, the first table's last header running
   straight into the second table's first. min-width:0 lets the track win;
   the table then scrolls inside its own cell (rule below) instead of
   pushing the layout apart. */
.nv-cp-grid > *, .nv-cp-ev-pair > *{min-width:0}
.nv-cp-ev-pair .nv-cp-table{display:block;overflow-x:auto}

/* P6: Player Market / Wanted Orders -- reuses #content table's base styling,
   these just add the price/chip look that's specific to a market listing row. */
.nv-offers-price{font-weight:600;color:var(--gold-hi);white-space:nowrap}
.nv-offers-chip{display:inline-block;padding:1px 6px;margin-right:3px;font-size:10px;border:1px solid var(--line);border-radius:5px;color:var(--muted2)}
.nv-offers-chip-filled{border-color:var(--ok);color:var(--ok);box-shadow:0 0 6px rgba(74,222,128,.35)}
.nv-wanted-cancel-btn{font-size:11px;padding:2px 8px;border:1px solid var(--danger);color:var(--danger);background:transparent;border-radius:5px;cursor:pointer}
.nv-wanted-cancel-btn:hover{background:rgba(255,143,143,.12)}
.nv-wanted-field{display:block;margin-bottom:10px;font-size:12px;color:var(--muted)}
.nv-wanted-field input{display:block;margin-top:4px;width:100%;box-sizing:border-box}

/* ============================================================
   Bazaar card action buttons -- Spotlight / grid / hero.
   The sitewide `button` rule (top of this file) hard-sets gold gradient,
   11px/22px padding, square corners and an angled clip-path with
   !important -- which turned these into wide gold slabs sitting ON the
   artwork. Every property it marks !important has to be answered in kind.
   Design: 30px frosted discs, quiet until the card is hovered, so the item
   itself is the only thing competing for attention at rest.
   ============================================================ */
.nv-bz2-heart, .nv-bz2-cartadd, .nv-compare-btn{
  position:absolute!important;top:10px;z-index:3;
  width:27px!important;height:27px!important;min-width:0!important;
  display:flex!important;align-items:center;justify-content:center;
  padding:0!important;font-size:12px!important;line-height:1!important;
  letter-spacing:0!important;text-transform:none!important;font-weight:400!important;
  background:rgba(252,251,249,.92)!important;
  border:1px solid rgba(28,22,54,.14)!important;border-radius:50%!important;
  box-shadow:0 2px 8px rgba(28,22,54,.16);
  clip-path:none!important;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  color:#2a2247!important;cursor:pointer;
  opacity:.6;
  transition:opacity .28s var(--ease-rune),transform .28s var(--ease-rune),
             border-color .2s,background-color .2s!important}
.nv-bz2-heart{right:9px}
.nv-bz2-cartadd{right:42px}
.nv-compare-btn{right:75px}

/* Reveal on card hover, on keyboard focus, and permanently once a heart is
   active (a wishlisted item must still read as wishlisted at rest). */
.nv-bz2-card:hover .nv-bz2-heart, .nv-bz2-card:hover .nv-bz2-cartadd, .nv-bz2-card:hover .nv-compare-btn,
.nv-bz2-shelfcard:hover .nv-bz2-heart, .nv-bz2-shelfcard:hover .nv-bz2-cartadd, .nv-bz2-shelfcard:hover .nv-compare-btn,
.nv-bz2-hero:hover .nv-bz2-heart, .nv-bz2-hero:hover .nv-bz2-cartadd, .nv-bz2-hero:hover .nv-compare-btn,
.nv-bz2-heart:focus-visible, .nv-bz2-cartadd:focus-visible, .nv-compare-btn:focus-visible,
.nv-bz2-heart.active, .nv-compare-btn.active{opacity:1}

.nv-bz2-heart:hover, .nv-bz2-cartadd:hover, .nv-compare-btn:hover{
  background:#fff!important;transform:scale(1.06);box-shadow:0 4px 14px rgba(28,22,54,.22)}
.nv-bz2-heart:hover{border-color:rgba(255,93,143,.85)!important}
.nv-bz2-cartadd:hover, .nv-compare-btn:hover{border-color:rgba(var(--gold-bright-rgb),.9)!important}
.nv-bz2-heart.active{background:rgba(255,240,245,.96)!important;border-color:rgba(255,93,143,.75)!important}
.nv-compare-btn.active{background:rgba(255,250,235,.96)!important;border-color:rgba(var(--gold-bright-rgb),.8)!important}

/* Touch devices have no hover: keep the affordances permanently visible,
   just softened so they still sit behind the artwork visually. */
@media (hover:none){
  .nv-bz2-heart, .nv-bz2-cartadd, .nv-compare-btn{opacity:.92}
}

/* ============================================================================
 * SEASON HUB — "THE OBSERVATORY" (nv-obs-*, 2026-08-02)
 *
 * Replaces the 14-stacked-section report layout with six instruments. Reuses
 * the site's existing tokens throughout (--gold family, --void ramp, --disp /
 * --serif / --body faces) -- no new palette, no new fonts, no image assets.
 * All art here is drawn in SVG/CSS.
 *
 * MOTION CONTRACT: FOUR continuous loops (corrected B5, 2026-08-07 -- this
 * comment and modules/seasonhub/index.php's header both used to claim "one"):
 * the dial's ring drift (nvObsDrift), the current-phase arc pulse
 * (nvObsArcPulse), the live-status dot blink (nvObsBlink), and the
 * empty-state mark float (nvObsFloat). Everything else fires ONCE, triggered
 * by .is-in which the view's IntersectionObserver adds on first
 * scroll-into-view. The reduced-motion block at the end of this file
 * neutralises all four in one place -- this was a documentation gap, not an
 * accessibility one.
 * ========================================================================= */
.nv-obs{
  --obs-prelude:#7fe0c4;
  --obs-live:var(--gold-bright);
  --obs-climax:#e07a9d;
  --obs-harvest:#c79a3c;
  --obs-dim:rgba(var(--gold-bright-rgb),.14);
}

/* ---------- I · the dial ---------- */
.nv-obs-dialwrap{padding:clamp(18px,4vw,50px) 0 clamp(10px,2vw,20px);position:relative}
.nv-obs-dialgrid{display:grid;grid-template-columns:minmax(260px,420px) minmax(280px,1fr);
  gap:clamp(20px,4vw,54px);align-items:center;max-width:var(--max);margin:0 auto}
@media (max-width:860px){.nv-obs-dialgrid{grid-template-columns:1fr;gap:26px;justify-items:center;text-align:center}}

.nv-obs-dialstage{position:relative;width:100%;max-width:420px;aspect-ratio:1;display:grid;place-items:center}
.nv-obs-dial{width:100%;height:100%;overflow:visible}
.nv-obs-dial-body circle{fill:none;stroke:var(--line);stroke-width:1}
.nv-obs-dial-body circle.track{stroke:rgba(var(--gold-bright-rgb),.09);stroke-width:7}
/* Tick ring, drawn entirely in CSS. This was 72 hand-emitted <line> elements
   (~4.7KB of markup per render) purely for decoration; a repeating conic
   gradient masked to an annulus is byte-free and animates the same. Radii
   match the old SVG exactly: r=105..112 of a 260 box -> 40.4%..43.1%. */
.nv-obs-ticks{position:absolute;inset:0;border-radius:50%;pointer-events:none;
  background:
    repeating-conic-gradient(from 0deg,rgba(var(--gold-bright-rgb),.42) 0deg .9deg,transparent .9deg 30deg),
    repeating-conic-gradient(from 0deg,rgba(var(--gold-bright-rgb),.18) 0deg .5deg,transparent .5deg 5deg);
  -webkit-mask:radial-gradient(circle,transparent 0 40.4%,#000 40.4% 43.1%,transparent 43.1%);
          mask:radial-gradient(circle,transparent 0 40.4%,#000 40.4% 43.1%,transparent 43.1%);
  animation:nvObsDrift 240s linear infinite}
@keyframes nvObsDrift{to{transform:rotate(360deg)}}

.nv-obs-arc{fill:none;stroke:var(--arc);stroke-width:7;stroke-linecap:round;
  opacity:.9;filter:drop-shadow(0 0 7px color-mix(in srgb,var(--arc) 55%,transparent))}
.nv-obs-arc.is-future{opacity:.28;filter:none}
.nv-obs-arc.is-done{opacity:.5}
.nv-obs-arc.is-now{stroke-width:9;animation:nvObsArcPulse 4.5s ease-in-out infinite}
@keyframes nvObsArcPulse{0%,100%{opacity:.85}50%{opacity:1}}

.nv-obs-hand line{stroke:var(--gold-hi);stroke-width:2;stroke-linecap:round}
.nv-obs-hand circle{fill:var(--gold-hi);filter:drop-shadow(0 0 8px var(--gold-bright))}
.nv-obs-hand{transform-origin:130px 130px;transform:rotate(var(--deg))}
.nv-obs-hub{fill:rgba(7,3,16,.92);stroke:var(--line2);stroke-width:1}

.nv-obs-hubtext{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;pointer-events:none}
.nv-obs-hub-eyebrow{font-family:var(--disp);font-size:9.5px;letter-spacing:3px;
  text-transform:uppercase;color:var(--muted2)}
.nv-obs-hub-num{font-family:var(--deco);font-weight:900;font-size:clamp(30px,5.4vw,52px);
  line-height:1;color:var(--gold-hi);text-shadow:0 0 26px rgba(var(--gold-bright-rgb),.45);margin:3px 0}
.nv-obs-hub-count{font-family:var(--disp);font-size:clamp(12px,1.5vw,15px);color:var(--parchment);letter-spacing:.5px}
.nv-obs-hub-sub{font-family:var(--body);font-size:9.5px;letter-spacing:1.6px;text-transform:uppercase;color:var(--muted2);margin-top:2px}
.nv-obs-dialstage.is-dead .nv-obs-ticks{animation:none;opacity:.45}
.nv-obs-dialstage.is-dead .nv-obs-hub-num{color:var(--muted);text-shadow:none}

.nv-obs-eyebrow{font-family:var(--disp);font-size:10px;letter-spacing:3.4px;text-transform:uppercase;color:var(--muted2)}
.nv-obs-title{font-family:var(--deco);font-weight:900;font-size:clamp(30px,5.6vw,60px);line-height:1.02;
  margin:8px 0 12px;background:linear-gradient(180deg,#fff,var(--parchment));
  -webkit-background-clip:text;background-clip:text;color:transparent;text-wrap:balance}
.nv-obs-lede{font-family:var(--serif);font-size:clamp(14px,1.5vw,16.5px);line-height:1.62;
  color:var(--muted);max-width:52ch;margin:0 0 18px}
@media (max-width:860px){.nv-obs-lede{margin-inline:auto}}

.nv-obs-phaselist{display:flex;flex-direction:column;gap:5px;margin-bottom:16px;max-width:420px}
@media (max-width:860px){.nv-obs-phaselist{margin-inline:auto;width:100%}}
.nv-obs-phaserow{display:grid;grid-template-columns:10px 1fr auto auto;gap:10px;align-items:center;
  font-family:var(--body);font-size:12.5px;padding:5px 10px;border-radius:7px;
  border:1px solid transparent;transition:background var(--t-fast),border-color var(--t-fast)}
.nv-obs-phaserow .pip{width:8px;height:8px;border-radius:50%;background:var(--arc);opacity:.5}
.nv-obs-phaserow .nm{color:var(--text)}
.nv-obs-phaserow .dy{color:var(--muted2);font-variant-numeric:tabular-nums}
.nv-obs-phaserow .st{font-size:9.5px;letter-spacing:1.3px;text-transform:uppercase;color:var(--muted2)}
.nv-obs-phaserow.is-now{background:rgba(var(--gold-bright-rgb),.07);border-color:var(--line)}
.nv-obs-phaserow.is-now .pip{opacity:1;box-shadow:0 0 9px var(--arc)}
.nv-obs-phaserow.is-now .st{color:var(--gold-bright)}
.nv-obs-phaserow.is-done{opacity:.5}

.nv-obs-chips{display:flex;flex-wrap:wrap;gap:8px}
@media (max-width:860px){.nv-obs-chips{justify-content:center}}
.nv-obs-chip{display:inline-flex;align-items:center;gap:6px;font-family:var(--body);font-size:11.5px;
  color:var(--muted);border:1px solid var(--line);border-radius:20px;padding:5px 12px;background:rgba(var(--void3-rgb),.5)}
.nv-obs-chip b{color:var(--parchment)}
.nv-obs-chip.is-hot{border-color:var(--line2);color:var(--gold-hi)}
.nv-obs-chip.is-frozen{color:var(--danger);border-color:rgba(255,143,143,.3)}
.nv-obs-chip.is-live .dot,.nv-obs-ticker-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);
  box-shadow:0 0 8px var(--ok);animation:nvObsBlink 2.2s ease-in-out infinite}
@keyframes nvObsBlink{0%,100%{opacity:1}50%{opacity:.35}}
a.nv-obs-chip.is-link{text-decoration:none;transition:color var(--t-fast),border-color var(--t-fast)}
a.nv-obs-chip.is-link:hover{color:var(--gold-hi);border-color:var(--line2)}
.nv-obs-fineprint{font-family:var(--body);font-size:11px;color:var(--muted2);margin:12px 0 0;max-width:52ch}

.nv-obs-passmini{margin-top:18px;max-width:420px;border:1px solid var(--line);border-radius:10px;
  padding:12px 14px;background:rgba(var(--void3-rgb),.55)}
@media (max-width:860px){.nv-obs-passmini{margin-inline:auto;text-align:left}}
.nv-obs-passmini-top{font-family:var(--body);font-size:12.5px;color:var(--muted)}
.nv-obs-passmini-top b{color:var(--gold-hi)}
.nv-obs-passmini-bar,.nv-obs-passme-bar{height:6px;border-radius:6px;background:rgba(var(--gold-bright-rgb),.12);margin:8px 0 6px;overflow:hidden}
.nv-obs-passmini-bar i,.nv-obs-passme-bar i{display:block;height:100%;width:var(--w);border-radius:6px;
  background:linear-gradient(90deg,var(--gold),var(--gold-hi));transition:width 1.1s var(--ease-rune)}
.nv-obs-passmini-link{font-family:var(--body);font-size:11.5px;color:var(--gold-bright);text-decoration:none}
.nv-obs-passmini-link:hover{color:var(--gold-hi)}

/* ---------- sticky chapter rail ---------- */
.nv-obs-rail{position:sticky;top:64px;z-index:6;display:flex;justify-content:center;flex-wrap:wrap;gap:2px;
  margin:10px auto 26px;padding:5px;border:1px solid var(--line);border-radius:24px;width:fit-content;
  background:rgba(7,3,16,.82);backdrop-filter:blur(9px)}
.nv-obs-rail a{font-family:var(--disp);font-size:11px;letter-spacing:1.7px;text-transform:uppercase;
  color:var(--muted);text-decoration:none;padding:6px 15px;border-radius:20px;transition:color var(--t-fast),background var(--t-fast)}
.nv-obs-rail a:hover{color:var(--gold-hi);background:rgba(var(--gold-bright-rgb),.1)}
.nv-obs-anchor{display:block;position:relative;top:-110px;visibility:hidden}

/* ---------- II · constellations ---------- */
.nv-obs-progress{display:flex;align-items:center;gap:12px;margin:0 0 18px}
.nv-obs-progress-num{font-family:var(--deco);font-weight:900;font-size:26px;color:var(--gold-hi);line-height:1}
.nv-obs-progress-num small{font-size:14px;color:var(--muted2)}
.nv-obs-progress-txt{font-family:var(--body);font-size:12.5px;color:var(--muted)}

.nv-obs-sky{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:clamp(14px,2vw,26px)}
.nv-obs-const{--acc:var(--gold-bright);border:1px solid var(--line);border-radius:14px;
  padding:16px 16px 12px;background:linear-gradient(180deg,rgba(var(--void3-rgb),.6),rgba(var(--void-rgb),.35))}
.nv-obs-const.acc-gold{--acc:var(--gold-bright)}
.nv-obs-const.acc-rose{--acc:#e07a9d}
.nv-obs-const.acc-blue{--acc:#8aa8e0}
.nv-obs-const-head{display:flex;gap:12px;align-items:flex-start;margin-bottom:6px}
.nv-obs-const-no{flex:0 0 auto;width:28px;height:28px;border-radius:50%;border:1px solid var(--acc);
  color:var(--acc);display:grid;place-items:center;font-family:var(--disp);font-size:11px;font-weight:700}
.nv-obs-const-title{display:block;font-family:var(--disp);font-size:15px;color:var(--text);letter-spacing:.4px}
.nv-obs-const-mood{display:block;font-family:var(--body);font-size:11.5px;color:var(--muted2);margin-top:2px}

.nv-obs-const-map{position:relative;width:100%;aspect-ratio:16/9;margin:4px 0 2px}
.nv-obs-lines{position:absolute;inset:0;width:100%;height:100%}
.nv-obs-lines polyline{fill:none;stroke:var(--acc);stroke-width:1;opacity:.34;
  stroke-dasharray:600;stroke-dashoffset:600}
.nv-obs-const-map.is-in .nv-obs-lines polyline{transition:stroke-dashoffset 2.6s var(--ease-rune);stroke-dashoffset:0}

.nv-obs-star{position:absolute;transform:translate(-50%,-50%);width:0;height:0;text-decoration:none;z-index:2}
.nv-obs-star-dot{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:9px;height:9px;border-radius:50%;background:var(--acc);
  box-shadow:0 0 10px var(--acc),0 0 22px color-mix(in srgb,var(--acc) 50%,transparent);
  opacity:0;transition:opacity .5s var(--ease-rune),width var(--t-fast),height var(--t-fast)}
.nv-obs-const-map.is-in .nv-obs-star-dot{opacity:1;transition-delay:var(--d)}
.nv-obs-star.is-dim .nv-obs-star-dot{background:var(--muted2);box-shadow:none;opacity:.45}
.nv-obs-const-map.is-in .nv-obs-star.is-dim .nv-obs-star-dot{opacity:.45}
.nv-obs-star-name{position:absolute;left:50%;top:11px;transform:translateX(-50%);white-space:nowrap;
  font-family:var(--body);font-size:10px;letter-spacing:.3px;color:var(--muted);
  opacity:0;transition:opacity .5s var(--ease-rune)}
.nv-obs-const-map.is-in .nv-obs-star-name{opacity:.8;transition-delay:var(--d)}
.nv-obs-star:hover .nv-obs-star-dot,.nv-obs-star:focus-visible .nv-obs-star-dot{width:15px;height:15px}
.nv-obs-star:hover .nv-obs-star-name,.nv-obs-star:focus-visible .nv-obs-star-name{color:var(--gold-hi);opacity:1}
.nv-obs-star:focus-visible{outline:none}
.nv-obs-star:focus-visible .nv-obs-star-dot{box-shadow:0 0 0 3px rgba(var(--gold-bright-rgb),.5),0 0 14px var(--acc)}

.nv-obs-card{position:absolute;left:50%;top:22px;transform:translateX(-50%) translateY(6px);
  width:210px;display:flex;gap:9px;padding:10px;border-radius:10px;z-index:9;
  border:1px solid var(--line2);background:rgba(10,5,32,.97);backdrop-filter:blur(8px);
  opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--t-fast),transform var(--t-fast),visibility var(--t-fast)}
.nv-obs-star:hover .nv-obs-card,.nv-obs-star:focus-visible .nv-obs-card{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0)}
.nv-obs-card-art{width:42px;height:42px;object-fit:contain;flex:0 0 auto}
.nv-obs-card-glyph{width:42px;height:42px;display:grid;place-items:center;font-size:24px;flex:0 0 auto}
.nv-obs-card-body{display:flex;flex-direction:column;gap:3px;min-width:0}
.nv-obs-card-body b{font-family:var(--disp);font-size:12.5px;color:var(--gold-hi)}
.nv-obs-card-tags{display:flex;flex-wrap:wrap;gap:3px}
.nv-obs-card-tags .t{font-family:var(--body);font-size:8.5px;letter-spacing:.3px;color:var(--muted2);
  border:1px solid var(--line);border-radius:8px;padding:1px 5px}
.nv-obs-card-tags .t.on{color:var(--ok);border-color:rgba(74,222,128,.35)}
.nv-obs-card-blurb{font-family:var(--body);font-size:10.5px;line-height:1.42;color:var(--muted)}
.nv-obs-card-go{font-family:var(--body);font-size:10px;color:var(--gold-bright);margin-top:1px}
/* keep the last constellation's cards inside the viewport edge */
.nv-obs-const:last-child .nv-obs-star:nth-last-child(-n+2) .nv-obs-card{left:auto;right:0;transform:translateX(0) translateY(6px)}
.nv-obs-const:last-child .nv-obs-star:nth-last-child(-n+2):hover .nv-obs-card,
.nv-obs-const:last-child .nv-obs-star:nth-last-child(-n+2):focus-visible .nv-obs-card{transform:translateX(0) translateY(0)}

.nv-obs-fallback{display:none;flex-wrap:wrap;gap:6px;padding-top:10px;border-top:1px solid var(--line)}
.nv-obs-fchip{font-family:var(--body);font-size:11.5px;color:var(--muted);text-decoration:none;
  border:1px solid var(--line);border-radius:16px;padding:4px 11px;transition:color var(--t-fast),border-color var(--t-fast)}
.nv-obs-fchip:hover{color:var(--gold-hi);border-color:var(--line2)}
.nv-obs-fchip.is-dim{opacity:.55}
/* Touch / coarse pointers get the chip list instead of hover cards -- the map
   stays as ambient art but stops being the only way to reach a destination. */
@media (hover:none),(max-width:700px){
  .nv-obs-fallback{display:flex}
  .nv-obs-card{display:none}
  .nv-obs-star-name{font-size:9px}
}

/* ---------- shared: CSS-only tab group (radio + :checked, no JS) ---------- */
.nv-obs-tabs{display:flex;flex-wrap:wrap;gap:6px;position:relative}
.nv-obs-tabin{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.nv-obs-tab{font-family:var(--disp);font-size:11.5px;letter-spacing:1.6px;text-transform:uppercase;
  color:var(--muted);border:1px solid var(--line);border-radius:20px;padding:7px 17px;cursor:pointer;
  transition:color var(--t-fast),border-color var(--t-fast),background var(--t-fast)}
.nv-obs-tab:hover{color:var(--gold-hi)}
.nv-obs-tabin:checked + .nv-obs-tab{color:var(--on-gold);background:linear-gradient(180deg,var(--gold-bright),var(--gold));border-color:var(--gold)}
.nv-obs-tabin:focus-visible + .nv-obs-tab{outline:2px solid var(--gold-bright);outline-offset:2px}
.nv-obs-panel{display:none;width:100%;order:9;padding-top:18px}
/* B2 (2026-08-07): cap raised 3->6 pairs as insurance for any future tab
   group needing more slots -- safe for the two 2/3-panel groups that exist
   today (an unmatched nth-of-type selector is simply inert, not an error).
   Trap to remember before ever touching this again: nth-of-type counts
   <input> ELEMENTS among siblings, not "tabs" -- any non-tab <input> placed
   inside .nv-obs-tabs would silently shift every pairing below it. */
.nv-obs-tabs > .nv-obs-tabin:nth-of-type(1):checked ~ .nv-obs-panel[data-panel="1"],
.nv-obs-tabs > .nv-obs-tabin:nth-of-type(2):checked ~ .nv-obs-panel[data-panel="2"],
.nv-obs-tabs > .nv-obs-tabin:nth-of-type(3):checked ~ .nv-obs-panel[data-panel="3"],
.nv-obs-tabs > .nv-obs-tabin:nth-of-type(4):checked ~ .nv-obs-panel[data-panel="4"],
.nv-obs-tabs > .nv-obs-tabin:nth-of-type(5):checked ~ .nv-obs-panel[data-panel="5"],
.nv-obs-tabs > .nv-obs-tabin:nth-of-type(6):checked ~ .nv-obs-panel[data-panel="6"]{display:block}

/* ---------- III · the ledger ---------- */
.nv-obs-tiers{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:16px}
.nv-obs-tier{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:9px;
  padding:5px 10px;font-family:var(--body);font-size:11px;color:var(--muted)}
.nv-obs-tier b{color:var(--text);font-weight:600}
.nv-obs-tier small{color:var(--muted2);font-variant-numeric:tabular-nums}

.nv-obs-blank{text-align:center;padding:clamp(26px,5vw,54px) 20px;border:1px dashed var(--line);
  border-radius:14px;background:radial-gradient(ellipse at 50% 0%,rgba(var(--gold-bright-rgb),.05),transparent 70%)}
.nv-obs-blank-mark{font-size:34px;color:var(--gold-bright);opacity:.55;margin-bottom:8px;
  animation:nvObsFloat 7s ease-in-out infinite}
@keyframes nvObsFloat{0%,100%{transform:translateY(0);opacity:.5}50%{transform:translateY(-6px);opacity:.75}}
.nv-obs-blank-h{font-family:var(--deco);font-weight:700;font-size:clamp(17px,2.4vw,24px);color:var(--gold-hi);margin:0 0 8px}
.nv-obs-blank-p{font-family:var(--serif);font-style:italic;font-size:13.5px;color:var(--muted);max-width:46ch;margin:0 auto}
.nv-obs-blank-pills{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:16px}
.nv-obs-blank-pills span{font-family:var(--body);font-size:10px;letter-spacing:.6px;color:var(--muted2);
  border:1px solid var(--line);border-radius:14px;padding:3px 10px}

.nv-obs-podium{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-bottom:18px}
.nv-obs-pod{--pc:var(--gold-bright);flex:1 1 150px;max-width:200px;text-align:center;padding:14px 12px;
  border:1px solid color-mix(in srgb,var(--pc) 42%,transparent);border-radius:12px;
  background:linear-gradient(180deg,color-mix(in srgb,var(--pc) 9%,transparent),transparent)}
.nv-obs-pod.r1{order:2;transform:scale(1.06)}
.nv-obs-pod.r2{order:1}.nv-obs-pod.r3{order:3}
@media (max-width:560px){.nv-obs-pod.r1{transform:none}}
.nv-obs-pod-rank{font-family:var(--disp);font-weight:700;font-size:13px;color:var(--pc)}
.nv-obs-pod-name{font-family:var(--disp);font-size:14px;color:var(--text);margin-top:6px}
.nv-obs-pod-tier{font-family:var(--body);font-size:10.5px;color:var(--muted2)}
.nv-obs-pod-val{font-family:var(--disp);font-size:15px;color:var(--gold-hi);margin-top:4px}

.nv-obs-tbl{width:100%}
.nv-obs-bars{display:flex;gap:2px;align-items:flex-end;height:16px}
.nv-obs-bar{flex:1;background:var(--c);border-radius:2px;height:6px;opacity:.85;
  transform:scaleY(.35);transform-origin:bottom}
.nv-obs-bars.is-in .nv-obs-bar{height:calc(4px + var(--v) * .12);transform:scaleY(1);
  transition:height .9s var(--ease-rune),transform .9s var(--ease-rune);transition-delay:calc(var(--row,0) * 55ms)}
.nv-obs-barsrc{font-family:var(--body);font-size:10px;color:var(--muted2);margin-top:3px}
.nv-obs-note{font-family:var(--body);font-size:11.5px;color:var(--muted2);margin:10px 0 0;line-height:1.55}
.nv-obs-note b{color:var(--parchment)}

.nv-obs-ledgrid{display:grid;grid-template-columns:2fr 1fr;gap:18px;align-items:start}
@media (max-width:820px){.nv-obs-ledgrid{grid-template-columns:1fr}}
.nv-obs-you{border:1px solid var(--line);border-radius:12px;padding:15px;background:rgba(var(--void3-rgb),.55)}
.nv-obs-you.is-quiet{text-align:center;color:var(--muted);font-family:var(--body);font-size:12.5px;display:flex;
  flex-direction:column;gap:12px;align-items:center;justify-content:center;min-height:150px}
.nv-obs-you.is-quiet p{margin:0}
.nv-obs-you-head{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:7px}
.nv-obs-you-name{font-family:var(--disp);font-size:14px;color:var(--gold-hi)}
.nv-obs-you-rank{font-family:var(--disp);font-size:21px;color:var(--text)}
.nv-obs-you-rank small,.nv-obs-you-val small{font-size:11px;color:var(--muted2);font-family:var(--body)}
.nv-obs-you-val{font-family:var(--disp);font-size:14px;color:var(--parchment);margin-top:3px}

/* ---------- IV · the pulse ---------- */
.nv-obs-ticker{border:1px solid var(--line);border-radius:12px;padding:13px 15px;
  background:linear-gradient(90deg,rgba(var(--gold-bright-rgb),.06),transparent 60%)}
.nv-obs-ticker-live{display:flex;flex-wrap:wrap;align-items:center;gap:9px}
.nv-obs-ticker-lbl{font-family:var(--disp);font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--gold-bright)}
.nv-obs-ticker-live.is-quiet .nv-obs-ticker-lbl{color:var(--muted2)}
.nv-obs-ticker-ev{font-family:var(--body);font-size:12.5px;color:var(--text)}
.nv-obs-ticker-live.is-quiet .nv-obs-ticker-ev{color:var(--muted)}
.nv-obs-ticker-meta{display:flex;flex-wrap:wrap;gap:7px;margin-top:11px;padding-top:10px;border-top:1px solid var(--line)}

.nv-obs-feed{margin-top:14px;border:1px solid var(--line);border-radius:12px;overflow:hidden}
.nv-obs-feed-row{display:grid;grid-template-columns:22px minmax(90px,auto) 1fr auto;gap:10px;align-items:center;
  padding:9px 14px;font-family:var(--body);font-size:12px;border-top:1px solid var(--line);
  opacity:0;animation:nvObsFeedIn .5s var(--ease-rune) forwards;animation-delay:calc(var(--i) * 70ms)}
.nv-obs-feed-row:first-child{border-top:0}
@keyframes nvObsFeedIn{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
.nv-obs-feed-row .g{color:var(--gold-bright)}
.nv-obs-feed-row .n{color:var(--text)}
.nv-obs-feed-row .d{color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nv-obs-feed-row .a{color:var(--muted2);font-size:11px}
@media (max-width:640px){.nv-obs-feed-row{grid-template-columns:20px 1fr auto}.nv-obs-feed-row .d{display:none}}

.nv-obs-more{margin-top:16px;border:1px solid var(--line);border-radius:12px;overflow:hidden}
.nv-obs-more > summary{cursor:pointer;padding:12px 16px;font-family:var(--disp);font-size:12px;
  letter-spacing:1.2px;color:var(--muted);list-style:none}
.nv-obs-more > summary::-webkit-details-marker{display:none}
.nv-obs-more > summary::before{content:"▸ ";color:var(--gold-bright)}
.nv-obs-more[open] > summary::before{content:"▾ "}
.nv-obs-more > summary:hover{color:var(--gold-hi)}
.nv-obs-evgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:9px;padding:4px 14px 14px}
.nv-obs-ev{display:grid;grid-template-columns:20px 1fr auto;gap:7px;align-items:baseline;
  border:1px solid var(--line);border-radius:9px;padding:9px 11px}
.nv-obs-ev.is-dormant{opacity:.42}
.nv-obs-ev.is-now{border-color:rgba(74,222,128,.4);background:rgba(74,222,128,.05)}
.nv-obs-ev-g{color:var(--gold-bright)}
.nv-obs-ev-n{font-family:var(--disp);font-size:12px;color:var(--text)}
.nv-obs-ev-s{font-family:var(--body);font-size:8.5px;letter-spacing:.9px;text-transform:uppercase;color:var(--muted2)}
.nv-obs-ev.is-now .nv-obs-ev-s{color:var(--ok)}
.nv-obs-ev-d{grid-column:1/-1;font-family:var(--body);font-size:10.5px;line-height:1.45;color:var(--muted2)}
.nv-obs-boards{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:14px;padding:0 14px 16px}
.nv-obs-board h4{font-family:var(--disp);font-size:12.5px;letter-spacing:.8px;color:var(--parchment);margin:0 0 8px}
.nv-obs-board h4 small{font-family:var(--body);font-size:10px;color:var(--muted2);letter-spacing:0;margin-left:6px}
.nv-obs-board-empty{font-family:var(--body);font-size:11.5px;color:var(--muted2);font-style:italic;margin:0}

/* ---------- V · the almanac ---------- */
.nv-obs-paths{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;margin-bottom:16px}
.nv-obs-path{border:1px solid var(--line);border-radius:11px;padding:12px 14px}
.nv-obs-path .g{font-size:20px;color:var(--gold-bright)}
.nv-obs-path b{display:block;font-family:var(--disp);font-size:13px;color:var(--gold-hi);margin:5px 0 4px}
.nv-obs-path p{font-family:var(--body);font-size:11.5px;line-height:1.5;color:var(--muted);margin:0}
.nv-obs-path-steps{display:block;color:var(--muted2);margin-top:4px}

.nv-obs-medals{display:grid;grid-template-columns:repeat(auto-fit,minmax(165px,1fr));gap:14px;margin:18px 0}
.nv-obs-medal{position:relative;text-align:center;padding:26px 12px 16px;border:1px solid var(--line);
  border-radius:12px;background:linear-gradient(180deg,rgba(var(--gold-bright-rgb),.05),transparent);
  transform-origin:top center}
.nv-obs-medals.is-in .nv-obs-medal{animation:nvObsSwing .9s var(--ease-rune) backwards;animation-delay:calc(var(--i) * 90ms)}
@keyframes nvObsSwing{0%{opacity:0;transform:rotate(-4deg) translateY(-10px)}60%{transform:rotate(1.5deg)}100%{opacity:1;transform:none}}
.nv-obs-medal-chain{position:absolute;left:50%;top:0;width:1px;height:16px;transform:translateX(-50%);
  background:linear-gradient(180deg,var(--line2),transparent)}
.nv-obs-medal-disc{display:grid;place-items:center;width:44px;height:44px;margin:0 auto 9px;border-radius:50%;
  border:1px solid var(--line2);font-size:20px;color:var(--gold-hi);
  background:radial-gradient(circle at 50% 35%,rgba(var(--gold-bright-rgb),.22),rgba(var(--void-rgb),.9))}
.nv-obs-medal:hover .nv-obs-medal-disc{box-shadow:0 0 18px rgba(var(--gold-bright-rgb),.35)}
.nv-obs-medal-band{display:block;font-family:var(--disp);font-size:10px;letter-spacing:1.7px;text-transform:uppercase;color:var(--muted2)}
.nv-obs-medal-val{display:block;font-family:var(--disp);font-size:13.5px;color:var(--gold-hi);margin:5px 0 3px}
.nv-obs-medal-title{display:block;font-family:var(--serif);font-style:italic;font-size:11px;color:var(--muted)}

.nv-obs-claim{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;
  border:1px solid var(--line2);border-radius:12px;padding:14px 16px;margin-top:16px;
  font-family:var(--body);font-size:13px;color:var(--muted);background:rgba(var(--gold-bright-rgb),.04)}
.nv-obs-claim b{color:var(--gold-hi)}

.nv-obs-passme{border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:16px;background:rgba(var(--void3-rgb),.5)}
.nv-obs-passme-t{font-family:var(--disp);font-size:14px;color:var(--text)}
.nv-obs-passme-t small{color:var(--muted2);font-size:11px}
.nv-obs-passme-n{font-family:var(--body);font-size:11.5px;color:var(--muted)}
.nv-obs-passme-n b{color:var(--parchment)}

.nv-obs-lanes,.nv-obs-econ{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.nv-obs-lane{border:1px solid var(--line);border-radius:12px;padding:14px}
.nv-obs-lane.is-prem{border-color:var(--line2);background:rgba(var(--gold-bright-rgb),.035)}
.nv-obs-lane h4{font-family:var(--disp);font-size:12.5px;letter-spacing:.8px;color:var(--parchment);margin:0 0 4px}
.nv-obs-lane h4 small{font-family:var(--body);font-size:10px;color:var(--muted2);letter-spacing:0;margin-left:6px}
.nv-obs-lane-rows{display:flex;flex-direction:column;max-height:290px;overflow-y:auto;margin-top:8px}
.nv-obs-lane-row{display:flex;align-items:center;gap:9px;padding:6px 2px;border-top:1px solid var(--line);
  font-family:var(--body);font-size:11.5px;color:var(--muted)}
.nv-obs-lane-row:first-child{border-top:0}
.nv-obs-lane-row b{color:var(--text);font-weight:500;flex:1;min-width:0}
.nv-obs-lane-row.is-done{opacity:.5}
.nv-obs-lane-t{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:1px solid var(--line);
  display:grid;place-items:center;font-size:9.5px;color:var(--muted2)}
.nv-obs-lane-row.is-done .nv-obs-lane-t{color:var(--ok);border-color:rgba(74,222,128,.35)}
.nv-obs-lane-price{color:var(--gold-hi);white-space:nowrap;font-size:11px}
.nv-obs-emp-thumb{width:26px;height:26px;object-fit:contain;flex:0 0 auto}

/* ---------- VI · archive, faq, finale ---------- */
.nv-obs-arcgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:12px}
.nv-obs-arc{border:1px solid var(--line);border-radius:12px;padding:14px}
.nv-obs-arc.is-current{border-color:var(--line2);background:rgba(var(--gold-bright-rgb),.04)}
.nv-obs-arc-num{font-family:var(--deco);font-weight:900;font-size:22px;color:var(--gold-hi);line-height:1}
.nv-obs-arc-theme{font-family:var(--disp);font-size:13px;color:var(--text);margin:4px 0 2px}
.nv-obs-arc-meta{font-family:var(--body);font-size:10.5px;color:var(--muted2);margin-bottom:8px}
.nv-obs-arc-champ{display:flex;justify-content:space-between;gap:8px;font-family:var(--body);font-size:11.5px;
  color:var(--muted);padding:3px 0}
.nv-obs-arc-champ b{color:var(--parchment)}
.nv-obs-arc-champ.is-quiet{color:var(--muted2);font-style:italic;display:block}

.nv-obs-faq{margin:26px 0;border:1px solid var(--line);border-radius:12px;overflow:hidden}
.nv-obs-faq > summary{cursor:pointer;padding:13px 18px;font-family:var(--disp);font-size:12.5px;
  letter-spacing:1.2px;color:var(--muted);list-style:none}
.nv-obs-faq > summary::-webkit-details-marker{display:none}
.nv-obs-faq > summary::before{content:"▸ ";color:var(--gold-bright)}
.nv-obs-faq[open] > summary::before{content:"▾ "}
.nv-obs-faq > summary:hover{color:var(--gold-hi)}
.nv-obs-faq-body{padding:0 18px 16px}
.nv-obs-faq-body p{font-family:var(--body);font-size:12.5px;line-height:1.62;color:var(--muted);margin:0 0 12px;max-width:78ch}
.nv-obs-faq-body b{color:var(--parchment)}

.nv-obs-deadnote{text-align:center;padding:26px 20px}
.nv-obs-deadnote p{font-family:var(--serif);font-style:italic;font-size:14px;color:var(--muted);max-width:56ch;margin:0 auto}
.nv-obs-deadnote a{color:var(--gold-bright)}

.nv-obs-finale{text-align:center;padding:clamp(28px,5vw,58px) 20px 20px}
.nv-obs-finale h2{font-family:var(--deco);font-weight:900;font-size:clamp(23px,4.2vw,42px);line-height:1.05;
  margin:0 0 12px;background:linear-gradient(180deg,#fff,var(--parchment));
  -webkit-background-clip:text;background-clip:text;color:transparent}
.nv-obs-finale p{font-family:var(--serif);font-style:italic;font-size:14px;color:var(--muted);max-width:48ch;margin:0 auto 22px}

/* ---------- motion opt-out: one place, kills every loop and reveal ---------- */
@media (prefers-reduced-motion:reduce){
  .nv-obs-ticks,.nv-obs-arc.is-now,.nv-obs-chip.is-live .dot,.nv-obs-ticker-dot,
  .nv-obs-blank-mark,.nv-obs-feed-row,.nv-obs-medals.is-in .nv-obs-medal{animation:none}
  .nv-obs-feed-row{opacity:1}
  .nv-obs-lines polyline,.nv-obs-const-map.is-in .nv-obs-lines polyline{stroke-dashoffset:0;transition:none}
  .nv-obs-star-dot,.nv-obs-star-name,.nv-obs-const-map.is-in .nv-obs-star-dot,
  .nv-obs-const-map.is-in .nv-obs-star-name{opacity:1;transition:none}
  .nv-obs-star.is-dim .nv-obs-star-dot,.nv-obs-const-map.is-in .nv-obs-star.is-dim .nv-obs-star-dot{opacity:.45}
  .nv-obs-bar,.nv-obs-bars.is-in .nv-obs-bar{transition:none;transform:scaleY(1)}
  .nv-obs-passmini-bar i,.nv-obs-passme-bar i{transition:none}
}

/* =====================================================================
 * Grand Bazaar merge -- "One Roof, One Wire" (nv-gb-*), 2026-08-03
 *
 * Merges Grand Bazaar + Pasar Malam + My Orders + Collection + Wishlist
 * into one page: a lantern wire on which each lantern lights one aisle.
 * A dark lantern is a truthful empty state, not a failure state -- most
 * of this design exists to be honest at population ~1 without looking
 * broken.
 *
 * The lantern/rail visuals below are MOVED from pasarmalam/index.php's own
 * inline <style> (nv-pm-wirewrap/nv-pm-lantern/nv-pm-glow/nv-pm-rail/
 * nv-pm-railitem), renamed nv-gb-* now that they're the page-wide nav
 * rather than one page's own furniture. Card/grid/chip/badge/currency
 * classes (.nv-bz2-*) and the constellation (.nv-obs-const*/.nv-obs-star*)
 * are reused VERBATIM by the new aisle markup and get no new rules here.
 *
 * Motion budget follows the same PHILOSOPHY the Observatory established
 * (see modules/seasonhub/index.php's header comment -- corrected B5,
 * 2026-08-07: the Observatory itself actually runs four small ambient
 * loops, not one; the shared principle is "loops are rare, deliberate, and
 * reduced-motion-gated," not a literal sitewide cap of one): here, exactly
 * ONE continuous loop of the Grand Bazaar's own (the wire itself); everything
 * else fires once on reveal or lives on :hover. Ambient loops are gated
 * `@media (prefers-reduced-motion:
 * no-preference)`, same convention pasarmalam's original CSS used; the
 * sitewide `@media (prefers-reduced-motion:reduce){*{...!important}}`
 * block above still catches everything regardless as the final backstop.
 * ===================================================================== */

/* ---- lantern wire (the ONE continuous loop on this page) ---- */
.nv-gb-wirebar{position:relative;margin:0 0 18px;padding-top:46px}
.nv-gb-wirewrap{position:absolute;top:0;left:-2%;width:104%;height:58px;pointer-events:none}
.nv-gb-wire{width:100%;height:100%;display:block}
.nv-gb-lantern{position:absolute;top:0;width:22px;height:29px;transform-origin:50% -6px;pointer-events:none;
  clip-path:polygon(30% 0,70% 0,100% 22%,100% 78%,70% 100%,30% 100%,0 78%,0 22%);
  background:linear-gradient(180deg,#ffce6b 0%,#e8963a 45%,#a8531f 100%)}
.nv-gb-lantern::before{content:"";position:absolute;inset:0;background:
  repeating-linear-gradient(90deg,transparent 0 5px,rgba(60,20,5,.28) 5px 6px)}
.nv-gb-lantern::after{content:"";position:absolute;left:44%;top:100%;width:12%;height:8px;background:#c79a3c}
.nv-gb-lantern.violet{background:linear-gradient(180deg,#b9a5ff 0%,#7b6cff 50%,#3b2f8f 100%)}
.nv-gb-lantern.rose{background:linear-gradient(180deg,#ffb3c9 0%,#e07a9d 50%,#7c2f45 100%)}
.nv-gb-lantern.dark{background:linear-gradient(180deg,#4a4458 0%,#332f42 45%,#211e2c 100%);opacity:.55}
.nv-gb-glow{position:absolute;top:6px;left:50%;width:44px;height:44px;transform:translateX(-50%);
  background:radial-gradient(circle,rgba(255,206,107,.55),transparent 65%);pointer-events:none}
.nv-gb-lantern.violet + .nv-gb-glow{background:radial-gradient(circle,rgba(150,130,255,.4),transparent 65%)}
.nv-gb-lantern.rose + .nv-gb-glow{background:radial-gradient(circle,rgba(224,122,157,.4),transparent 65%)}
.nv-gb-lantern.dark + .nv-gb-glow{background:radial-gradient(circle,rgba(120,110,140,.16),transparent 65%)}
@media (prefers-reduced-motion:no-preference){
  .nv-gb-lantern{animation:nvpmsway var(--sw,5.2s) ease-in-out var(--dl,0s) infinite alternate}
  .nv-gb-lantern.dark{animation:none}
  .nv-gb-glow{animation:nvpmglow var(--sw,5.2s) ease-in-out var(--dl,0s) infinite alternate}
  .nv-gb-lantern.dark + .nv-gb-glow{animation:none}
}
/* ---- rail (nav) ---- */
/* Horizontally-scrollable at every width, not wrap -- 6 aisles + gap + 2
   drawer links (+ wallet strip taking its own row above) is too much to
   reliably wrap inside .nv-content's clip-path box; a flex item is free to
   SHRINK before it wraps, so text-heavy items squeezed past their
   min-content width were silently clipped by the box's clip-path with no
   scrollbar ever appearing (caught on a real render, not assumed). One
   `overflow-x:auto` on the container removes the failure mode entirely, at
   every viewport width, same conservative choice this codebase already
   made for wide admin tables (.nv-lb-scroll). */
.nv-gb-rail{position:relative;display:flex;align-items:stretch;gap:4px;flex-wrap:nowrap;
  overflow-x:auto;scrollbar-width:thin;-webkit-overflow-scrolling:touch}
.nv-gb-railgap{flex:1 1 auto;min-width:0}
.nv-gb-railitem{position:relative;display:inline-flex;align-items:center;gap:8px;padding:9px 15px;
  font-size:13px;letter-spacing:.4px;color:var(--muted);text-decoration:none;border:1px solid transparent;
  background:transparent;transition:color .2s,border-color .2s,background .2s,transform .2s;cursor:pointer}
.nv-gb-railitem .nv-gb-railicon{font-size:14px;line-height:1;filter:grayscale(.55) opacity(.75);transition:filter .2s}
.nv-gb-railitem:hover{color:var(--gold-hi);border-color:rgba(199,154,60,.3);background:rgba(199,154,60,.05);transform:translateY(-1px)}
.nv-gb-railitem:hover .nv-gb-railicon{filter:none}
.nv-gb-railitem:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.nv-gb-railitem.active{color:var(--gold-hi);border-color:rgba(199,154,60,.42);
  background:linear-gradient(180deg,rgba(199,154,60,.14),rgba(199,154,60,.03))}
.nv-gb-railitem.active .nv-gb-railicon{filter:none;text-shadow:0 0 10px rgba(255,206,107,.6)}
.nv-gb-railitem.active::after{content:"";position:absolute;left:12%;right:12%;bottom:-1px;height:2px;
  background:linear-gradient(90deg,transparent,var(--gold-hi),transparent);box-shadow:0 0 10px 1px rgba(255,206,107,.55)}
.nv-gb-railitem.dark{color:var(--muted2)}
.nv-gb-railitem.dark .nv-gb-railicon{filter:grayscale(1) opacity(.4)}
.nv-gb-railitem.out{color:var(--muted2,var(--muted));font-size:12.5px}
.nv-gb-railitem.out:hover{color:var(--parchment)}
.nv-gb-railbadge{display:inline-flex;align-items:center;justify-content:center;min-width:15px;height:15px;
  padding:0 4px;font-size:10px;border-radius:999px;background:var(--gold-bright);color:var(--on-gold);line-height:15px}
@media(max-width:760px){
  .nv-gb-rail{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .nv-gb-rail::-webkit-scrollbar{display:none}
  .nv-gb-railitem{flex:0 0 auto;min-height:44px}
  .nv-gb-railgap{display:none}
}
/* ---- aisle-switch transition: fires once per switch, not a loop ---- */
.nv-gb-panel{animation:nvgbrise .38s var(--ease-rune)}
@keyframes nvgbrise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.nv-gb-panel.nv-gb-leaving{animation:nvgbdip .18s var(--ease-rune) forwards}
@keyframes nvgbdip{to{opacity:0;transform:translateY(-6px)}}

/* ---- dark-aisle empty scene (truthful, not a failure state) ---- */
.nv-gb-darkscene{position:relative;padding:clamp(30px,6vw,64px) 20px;text-align:center;border:1px solid var(--line);
  background:radial-gradient(60% 90% at 50% 115%,rgba(199,120,40,.08),transparent 60%),
    linear-gradient(180deg,#0a0616 0%,#070310 60%,#0b0518 100%)}
.nv-gb-darkscene .ember{width:8px;height:8px;margin:0 auto 16px;border-radius:50%;
  background:radial-gradient(circle,rgba(255,206,107,.5),rgba(255,206,107,.08) 70%,transparent)}
.nv-gb-darkscene h3{font-family:var(--disp);color:var(--parchment);font-size:16px;margin:0 0 8px;letter-spacing:.3px}
.nv-gb-darkscene p{color:var(--muted);font-size:13px;max-width:46ch;margin:0 auto 18px;line-height:1.6}

/* ---- filter rail (Bazaar aisle facet chips, one row + drawer trigger) ---- */
.nv-gb-filterrail{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:14px 0}
.nv-gb-filterrail .spacer{flex:1 1 auto;min-width:8px}

/* ---- wishing wall (Wishlist aisle): tags hanging on their own short wire ---- */
.nv-gb-wishwire{position:relative;height:20px;margin:0 2px 22px}
.nv-gb-wishwire svg{width:100%;height:100%;display:block}
.nv-gb-wishgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:20px 16px}
.nv-gb-wishtag{position:relative;opacity:0;transform:translateY(-10px);animation:nvgbtagsettle .5s var(--ease-rune) forwards;
  animation-delay:var(--d,0s)}
.nv-gb-wishtag::before{content:"";position:absolute;left:50%;top:-14px;width:1px;height:14px;
  background:rgba(var(--gold-bright-rgb),.3);transform:translateX(-50%)}
.nv-gb-wishtag::after{content:"";position:absolute;left:50%;top:-16px;width:6px;height:6px;border-radius:50%;
  background:rgba(var(--gold-bright-rgb),.4);transform:translateX(-50%)}
@keyframes nvgbtagsettle{to{opacity:1;transform:none}}
.nv-gb-wishtag.lit .nv-bz2-card{border-color:rgba(var(--gold-bright-rgb),.6);box-shadow:0 0 22px -6px rgba(255,206,107,.5)}
@media (prefers-reduced-motion:no-preference){
  .nv-gb-wishtag.lit .nv-bz2-card{animation:nvpmglow 2.6s ease-in-out infinite alternate}
}
.nv-gb-wishlit-pill{position:absolute;top:8px;left:8px;z-index:2;font-size:8.5px;letter-spacing:.8px;text-transform:uppercase;
  padding:2px 6px;background:rgba(var(--gold-bright-rgb),.16);border:1px solid rgba(var(--gold-bright-rgb),.5);
  color:var(--gold-hi);font-family:var(--disp)}
.nv-gb-alertwall{display:flex;flex-direction:column;gap:1px;margin-bottom:20px;border:1px solid var(--line)}
.nv-gb-alertrow{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 14px;
  background:rgba(var(--gold-bright-rgb),.04)}
.nv-gb-alertrow a{color:var(--gold-hi)}

/* ---- ledger (Orders aisle): parcels as wax-sealed entries ---- */
.nv-gb-ledger{display:flex;flex-direction:column;gap:1px;border:1px solid var(--line);background:var(--line)}
.nv-gb-ledgerrow{display:flex;align-items:center;gap:14px;padding:12px 16px;background:var(--void2);position:relative}
.nv-gb-seal{flex:0 0 auto;width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-size:15px;position:relative}
.nv-gb-seal.pending{background:radial-gradient(circle at 40% 35%,#e7bd5b,#8a5d12 75%);box-shadow:0 0 0 2px rgba(var(--gold-bright-rgb),.25)}
.nv-gb-seal.delivered{background:transparent;border:2px dashed var(--line2);color:var(--ok-soft)}
.nv-gb-seal.refunded,.nv-gb-seal.expired{background:transparent;border:2px solid var(--line2);color:var(--muted2)}
@media (prefers-reduced-motion:no-preference){
  .nv-gb-seal.pending{animation:nvgbsealbreathe 3.2s ease-in-out infinite alternate}
}
@keyframes nvgbsealbreathe{from{box-shadow:0 0 0 2px rgba(var(--gold-bright-rgb),.2)}to{box-shadow:0 0 0 5px rgba(var(--gold-bright-rgb),.08)}}
.nv-gb-ledgerbody{flex:1 1 auto;min-width:0}
.nv-gb-ledgername{font-size:13.5px;color:var(--text)}
.nv-gb-ledgermeta{font-size:11.5px;color:var(--muted2);margin-top:2px}
.nv-gb-ledgerstatus{flex:0 0 auto;text-align:right;font-size:11px}
.nv-gb-ledger.reveal .nv-gb-ledgerrow{opacity:0;transform:translateY(6px);transition:opacity .4s var(--ease-rune),transform .4s var(--ease-rune)}
.nv-gb-ledger.reveal.in .nv-gb-ledgerrow{opacity:1;transform:none}
.nv-gb-ledger.reveal.in .nv-gb-ledgerrow:nth-child(2n){transition-delay:.04s}

/* ---- drawers (Cart / Your Stall): slide-in from the right ---- */
/* left:50%+width:100vw+translateX(-50%) here, NOT left/right:0 -- .nv-content's
   backdrop-filter creates a containing block for position:fixed descendants
   (documented above at the .nv-adv-panel/.nv-bz2-mobilebuybar rules); the
   SAME fix is applied to .nv-bz2-modal-backdrop just above, which used plain
   inset:0 and had the identical latent bug, just never reported because
   nobody had opened it from a viewport wide enough to see the gap. */
.nv-gb-drawer-backdrop{display:none;position:fixed;left:50%;top:0;bottom:0;width:100vw;transform:translateX(-50%);
  box-sizing:border-box;background:rgba(4,2,12,.6);z-index:150;opacity:0;transition:opacity .25s ease}
.nv-gb-drawer-backdrop.open{display:block;opacity:1}
/* Corrected 2026-08-03 (caught on a real authenticated render, not assumed):
   the original rule used `right:calc(50vw - 50%)` to try to anchor the panel
   to the true viewport's right edge from inside the same mis-containing
   .nv-content backdrop-filter box every other fixed element here has to
   route around -- unlike the LEFT-anchored fix (left:50%+width:100vw+
   translateX(-50%), which fully re-bases the box against the viewport),
   that formula does NOT correctly cancel the offset for `right`, and the
   drawer rendered as a visible inline-ish block instead of hidden off-
   screen. Fixed the same way as everywhere else: an OUTER element uses the
   proven left:50%/width:100vw/translateX(-50%) trick to re-base against the
   true viewport (full width, but pointer-events:none and transparent so it
   never blocks clicks on the page behind it), then a flex `justify-content:
   flex-end` lays the real, pointer-events:auto panel against ITS right
   edge -- which, because the outer box is now genuinely viewport-wide, IS
   the true viewport's right edge. */
.nv-gb-drawer{position:fixed;left:50%;top:0;bottom:0;width:100vw;transform:translateX(-50%);
  box-sizing:border-box;z-index:151;display:flex;justify-content:flex-end;pointer-events:none}
.nv-gb-drawer-panel{position:relative;width:min(440px,100vw);height:100%;box-sizing:border-box;pointer-events:auto;
  background:linear-gradient(180deg,rgba(var(--void3-rgb),.99),rgba(var(--void-rgb),.99));
  border-left:1px solid var(--line2);box-shadow:-20px 0 60px rgba(0,0,0,.5);
  transform:translateX(100%);transition:transform .3s var(--ease-rune);overflow-y:auto;padding:22px}
.nv-gb-drawer.open .nv-gb-drawer-panel{transform:translateX(0)}
.nv-gb-drawer-close{position:absolute;top:14px;right:14px;width:32px;height:32px;display:flex;align-items:center;
  justify-content:center;background:rgba(255,255,255,.03);border:1px solid var(--line);color:var(--muted);cursor:pointer}
.nv-gb-drawer-close:hover{color:var(--gold-hi);border-color:var(--line2)}
.nv-gb-drawer h3{font-family:var(--disp);color:var(--gold-hi);font-size:17px;margin:0 26px 16px 0}
@media(max-width:560px){.nv-gb-drawer-panel{width:100vw}}

/* ---- item vitrine overlay ---- */
.nv-gb-overlay-backdrop{display:none;position:fixed;left:50%;top:0;bottom:0;width:100vw;transform:translateX(-50%);
  box-sizing:border-box;background:rgba(4,2,12,.72);backdrop-filter:blur(2px);z-index:160;
  align-items:flex-start;justify-content:center;overflow-y:auto;padding:min(8vh,64px) 16px}
.nv-gb-overlay-backdrop.open{display:flex}
.nv-gb-overlay{width:min(920px,100%);background:linear-gradient(180deg,rgba(var(--void3-rgb),.99),rgba(var(--void-rgb),.99));
  border:1px solid var(--line2);box-shadow:0 30px 90px rgba(0,0,0,.55);position:relative;
  opacity:0;transform:translateY(16px) scale(.98);transition:opacity .28s var(--ease-rune),transform .28s var(--ease-rune)}
.nv-gb-overlay-backdrop.open .nv-gb-overlay{opacity:1;transform:none}
.nv-gb-overlay-close{position:absolute;top:14px;right:14px;z-index:2;width:32px;height:32px;display:flex;
  align-items:center;justify-content:center;background:rgba(255,255,255,.04);border:1px solid var(--line);color:var(--muted);cursor:pointer}
.nv-gb-overlay-close:hover{color:var(--gold-hi);border-color:var(--line2)}

/* Fix: .nv-bz2-modal-backdrop had the same fixed-position containing-block
   bug as .nv-adv-panel (used plain inset:0 inside .nv-content) -- the buy
   modal is folded into the merged page's money paths, so it gets the same
   correction as everything else here. */
.nv-bz2-modal-backdrop{left:50%!important;right:auto!important;width:100vw!important;transform:translateX(-50%)!important;
  box-sizing:border-box}

@media (prefers-reduced-motion:reduce){
  .nv-gb-lantern,.nv-gb-glow,.nv-gb-panel,.nv-gb-panel.nv-gb-leaving,.nv-gb-wishtag,
  .nv-gb-wishtag.lit .nv-bz2-card,.nv-gb-seal.pending,.nv-gb-ledger .nv-gb-ledgerrow{animation:none!important}
  .nv-gb-wishtag{opacity:1;transform:none}
  .nv-gb-ledger.reveal .nv-gb-ledgerrow{opacity:1;transform:none;transition:none}
}

/* =====================================================================
 * Night Market card system + Your-Stall furniture (nv-pm-*), 2026-08-03
 *
 * MOVED verbatim from pasarmalam/index.php's own inline <style> (that
 * page's GET views now redirect into the Night Market aisle / Your-Stall
 * drawer -- see modules/pasarmalam/index.php -- so its inline stylesheet
 * would otherwise never be loaded again). Only the hero/wire/rail/wallet
 * portion was NOT moved here -- it's superseded by the nv-gb-* wire above,
 * except .nv-pm-wallet/.nv-pm-purse/.nv-pm-coin/.nv-pm-amt/.nv-pm-cur,
 * which _wire.php's own wallet strip still reuses directly, so those come
 * along too. Keyframes nvpmsway/nvpmglow/nvpmtwinkle/nvpmignite/nvpmrise
 * were referenced by the nv-gb-* band above by name (reused, not
 * reinvented) but never actually defined until this band -- fixed here.
 * ===================================================================== */
@keyframes nvpmsway{from{transform:rotate(-4.5deg)}to{transform:rotate(4.5deg)}}
@keyframes nvpmglow{from{opacity:.55}to{opacity:1}}
@keyframes nvpmtwinkle{from{opacity:.12}to{opacity:.5}}
@keyframes nvpmignite{0%{opacity:0;text-shadow:none}60%{opacity:.7;text-shadow:0 0 6px rgba(255,206,107,.2)}80%{opacity:.55}100%{opacity:1;text-shadow:0 0 18px rgba(255,206,107,.35),0 0 46px rgba(255,150,60,.18)}}
@keyframes nvpmrise{to{opacity:1;transform:none}}

.nv-pm-wallet{position:relative;display:flex;gap:10px;flex-wrap:wrap;margin-top:16px;align-items:center}
.nv-pm-purse{display:inline-flex;align-items:baseline;gap:8px;padding:7px 14px;
  border:1px solid rgba(199,154,60,.32);background:linear-gradient(180deg,rgba(199,154,60,.10),rgba(199,154,60,.02));
  clip-path:polygon(7px 0,100% 0,100% calc(100% - 7px),calc(100% - 7px) 100%,0 100%,0 7px)}
.nv-pm-purse.crystal{border-color:rgba(123,108,255,.34);background:linear-gradient(180deg,rgba(123,108,255,.12),rgba(123,108,255,.02))}
.nv-pm-coin{font-size:14px;color:var(--gold-hi);line-height:1;text-shadow:0 0 9px rgba(255,206,107,.5)}
.nv-pm-purse.crystal .nv-pm-coin{color:#9fb4ff;text-shadow:0 0 9px rgba(123,108,255,.55)}
.nv-pm-amt{font-family:var(--disp);font-size:17px;letter-spacing:.5px;color:var(--gold-hi);line-height:1}
.nv-pm-purse.crystal .nv-pm-amt{color:#c3ccff}
.nv-pm-cur{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
@media(max-width:760px){.nv-pm-purse{padding:6px 11px}.nv-pm-amt{font-size:15px}}

/* currency filter tabs (restyled in-place, scoped to the Night Market aisle) */
.nv-pm .nv-bz2-tabs{gap:7px;margin:18px 0 4px}
.nv-pm .nv-bz2-tab{position:relative;padding:8px 16px;font-size:12.5px;color:var(--muted);
  border:1px solid rgba(199,154,60,.18);background:rgba(255,255,255,.015);
  clip-path:polygon(6px 0,100% 0,100% calc(100% - 6px),calc(100% - 6px) 100%,0 100%,0 6px);
  transition:color .2s,border-color .2s,background .2s,transform .2s}
.nv-pm .nv-bz2-tab:hover{color:var(--gold-hi);border-color:rgba(199,154,60,.45);
  background:rgba(199,154,60,.06);transform:translateY(-1px)}
.nv-pm .nv-bz2-tab.active{color:var(--gold-hi);border-color:rgba(199,154,60,.6);
  background:linear-gradient(180deg,rgba(199,154,60,.16),rgba(199,154,60,.04));
  box-shadow:0 0 14px -4px rgba(255,206,107,.5)}

/* stall cards (browse) */
.nv-pm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(235px,1fr));gap:14px;margin-top:14px}
.nv-pm-card{position:relative;display:flex;flex-direction:column;border:1px solid var(--line);
  background:linear-gradient(180deg,rgba(255,255,255,.025),rgba(255,255,255,0) 40%),var(--panel,rgba(255,255,255,.02));
  clip-path:polygon(10px 0,100% 0,100% calc(100% - 10px),calc(100% - 10px) 100%,0 100%,0 10px)}
.nv-pm-card:hover{border-color:rgba(199,154,60,.45)}
.nv-pm-awning{height:9px;background:repeating-linear-gradient(90deg,var(--pm-a,#c79a3c) 0 16px,rgba(0,0,0,.55) 16px 32px);
  border-bottom:1px solid rgba(0,0,0,.5);opacity:.85}
.nv-pm-card.cur-crystal{--pm-a:#7b6cff}
.nv-pm-card.cur-barter{--pm-a:#5d8f5d}
.nv-pm-card.keeper .nv-pm-awning{background:repeating-linear-gradient(90deg,#d84f33 0 16px,rgba(0,0,0,.55) 16px 32px)}
.nv-pm-cbody{display:flex;flex-direction:column;gap:7px;padding:12px 13px 13px;flex:1}
.nv-pm-crow{display:flex;align-items:center;gap:10px}
.nv-pm-cart-ico{width:44px;height:44px;flex:0 0 44px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 50% 42%,rgba(255,206,107,.14),transparent 70%)}
.nv-pm-cart-ico img{max-width:40px;max-height:40px;image-rendering:pixelated}
.nv-pm-cname{font-size:13.5px;line-height:1.3}
.nv-pm-cname a{color:var(--text)}
.nv-pm-cname a:hover{color:var(--gold-hi)}
.nv-pm-chiprow{display:flex;gap:4px;flex-wrap:wrap;min-height:16px}
.nv-pm-price{font-family:var(--disp);font-size:16px;color:var(--gold-hi);letter-spacing:.4px}
.nv-pm-card.cur-crystal .nv-pm-price{color:#9fb4ff}
.nv-pm-vend{font-size:11.5px;color:var(--muted);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.nv-pm-vend a{color:var(--parchment)}
.nv-pm-loc{font-size:11px;color:var(--muted2,var(--muted))}
.nv-pm-cbuy{margin-top:auto;padding-top:8px;border-top:1px solid rgba(199,154,60,.12)}
.nv-pm-keeperbadge{display:inline-flex;align-items:center;gap:4px;padding:1px 7px;font-size:10.5px;letter-spacing:.5px;
  border:1px solid rgba(216,79,51,.5);background:rgba(216,79,51,.1);color:#ffb09e;text-transform:uppercase}
.nv-pm-keeper-buy{font-size:11.5px;color:#ffb09e}
.nv-pm-total{font-size:11px;color:var(--gold-hi);margin-left:6px}
.nv-pm-buyform{display:flex;gap:4px;align-items:center;flex-wrap:wrap}
.nv-pm-online{width:7px;height:7px;background:#7fd68b;box-shadow:0 0 6px 1px rgba(127,214,139,.6);display:inline-block}
.nv-pm-loginbuy{font-size:11.5px}

/* item/vendor pages: offer tickets + storefront banner */
.nv-pm-offergrid{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.nv-pm-offerrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:10px 14px;
  border:1px solid var(--line);border-left:3px solid rgba(199,154,60,.4);background:rgba(255,255,255,.015);
  transition:border-color .2s,background .2s}
.nv-pm-offerrow:hover{border-color:rgba(199,154,60,.4);background:rgba(199,154,60,.04)}
.nv-pm-offerrow.keeper{border-left-color:#d84f33}
.nv-pm-offerprice{font-family:var(--disp);font-size:15px;color:var(--gold-hi);white-space:nowrap;min-width:110px}
.nv-pm-offerqty{font-size:11px;color:var(--muted);font-family:var(--body);margin-left:5px}
.nv-pm-offerchips{display:flex;gap:4px;flex-wrap:wrap;min-width:70px}
.nv-pm-offervend{flex:1 1 180px;font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.nv-pm-offervend a{color:var(--parchment)}
.nv-pm-offerbuy{flex:0 0 auto;margin-left:auto}
.nv-pm-storefront{display:flex;align-items:center;gap:14px;margin:8px 0 16px;padding:14px 16px;
  border:1px solid rgba(199,154,60,.28);background:linear-gradient(180deg,rgba(199,154,60,.08),transparent)}
.nv-pm-storefront.keeper{border-color:rgba(216,79,51,.32);background:linear-gradient(180deg,rgba(216,79,51,.08),transparent)}
.nv-pm-storefronticon{font-size:32px;line-height:1;filter:drop-shadow(0 0 10px rgba(255,206,107,.3))}
.nv-pm-storefrontmain h2{margin:0 0 4px;font-family:var(--disp);color:var(--gold-hi)}
.nv-pm-storefrontmain p{margin:0;font-size:12.5px;color:var(--muted);display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.nv-pm-histtbl tbody tr:nth-child(odd){background:rgba(255,255,255,.015)}
@media(max-width:640px){
  .nv-pm-offerrow{gap:8px 12px}
  .nv-pm-offerbuy{flex-basis:100%;margin-left:0;order:5}
}

/* Your Stall drawer (P4): page head + jump nav */
.nv-pm-stallhead{margin:4px 0 18px}
.nv-pm-stalltitle{font-family:var(--disp);margin:0 0 5px;font-size:22px;color:var(--gold-hi)}
.nv-pm-stallsub{color:var(--muted);max-width:66ch;margin:0 0 12px;font-size:13.5px;line-height:1.5}
.nv-pm-jump{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0 4px}
.nv-pm-jump a{padding:5px 13px;font-size:12px;letter-spacing:.3px;color:var(--parchment);
  border:1px solid rgba(199,154,60,.22);background:rgba(199,154,60,.04);text-decoration:none;transition:.2s}
.nv-pm-jump a:hover{border-color:rgba(199,154,60,.55);color:var(--gold-hi);background:rgba(199,154,60,.09);transform:translateY(-1px)}

.nv-pm-switcher{display:flex;align-items:center;gap:10px;margin:0 0 16px}
.nv-pm-switchlabel{font-size:11px;letter-spacing:.3px;color:var(--muted);white-space:nowrap}
.nv-pm-switcher select{min-width:240px}

/* two-lane shopfronts */
.nv-pm-fronts{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start;margin-top:6px}
@media(max-width:900px){.nv-pm-fronts{grid-template-columns:1fr}}
.nv-pm-front{border:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),rgba(255,255,255,0) 45%);
  clip-path:polygon(11px 0,100% 0,100% calc(100% - 11px),calc(100% - 11px) 100%,0 100%,0 11px);
  display:flex;flex-direction:column}
.nv-pm-front.consign{border-color:rgba(199,154,60,.3)}
.nv-pm-front-head{display:flex;align-items:flex-start;gap:12px;padding:16px 16px 13px;border-bottom:1px solid rgba(199,154,60,.14)}
.nv-pm-fronticon{font-size:25px;line-height:1;filter:drop-shadow(0 0 8px rgba(255,206,107,.25));flex:0 0 auto}
.nv-pm-front-head h3{margin:0 0 3px;font-family:var(--disp);font-size:15.5px;color:var(--text);letter-spacing:.2px}
.nv-pm-front-head p{margin:0;font-size:11.5px;color:var(--muted);line-height:1.4}
.nv-pm-front-headmeta{margin-left:auto;flex:0 0 auto;padding-top:1px}
.nv-pm-front-body{padding:15px 16px 19px;display:flex;flex-direction:column;gap:14px}

.nv-pm-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 11px;font-size:10px;letter-spacing:.6px;
  text-transform:uppercase;border:1px solid var(--line);color:var(--muted);white-space:nowrap;font-family:var(--disp)}
.nv-pm-pill .dot{width:6px;height:6px;flex:0 0 6px;border-radius:50%;background:currentColor}
.nv-pm-pill.on{color:#7fd68b;border-color:rgba(127,214,139,.4);background:rgba(127,214,139,.08)}
.nv-pm-pill.on .dot{box-shadow:0 0 6px 1px rgba(127,214,139,.6)}
.nv-pm-pill.off{color:var(--muted)}
.nv-pm-pill.pending{color:var(--gold-hi);border-color:rgba(199,154,60,.45);background:rgba(199,154,60,.09)}
.nv-pm-pill.pending .dot{animation:nvpmglow 1s ease-in-out infinite alternate}
.nv-pm-pill.err{color:#ff7d9d;border-color:rgba(255,93,143,.4);background:rgba(255,93,143,.08)}
.nv-pm-pill.warn2{color:var(--gold-hi);border-color:rgba(199,154,60,.4)}

.nv-pm-note{border:1px solid var(--line);background:rgba(255,255,255,.02);padding:11px 13px;
  font-size:12.5px;color:var(--muted);line-height:1.55;margin:0}
.nv-pm-note.err{border-color:rgba(255,93,143,.32);background:rgba(255,93,143,.06);color:#ffb3c6}
.nv-pm-note.warn{border-color:rgba(199,154,60,.32);background:rgba(199,154,60,.06);color:var(--parchment)}

.nv-pm-slotmeter{margin:0}
.nv-pm-picklabel{font-size:12px;color:var(--parchment);margin:0 0 8px;letter-spacing:.2px}

/* vendor-preview mini cards (open shop / open stall rows) */
.nv-pm-previewlist{display:flex;flex-direction:column;gap:8px}
.nv-pm-preview{display:flex;align-items:center;gap:11px;border:1px solid rgba(199,154,60,.24);
  background:linear-gradient(180deg,rgba(199,154,60,.07),transparent);padding:10px 12px;flex-wrap:wrap}
.nv-pm-preview-glow{width:32px;height:32px;flex:0 0 32px;display:flex;align-items:center;justify-content:center;
  font-size:16px;background:radial-gradient(circle,rgba(255,206,107,.22),transparent 70%)}
.nv-pm-preview-main{flex:1 1 160px;min-width:0}
.nv-pm-preview-title{font-size:12.5px;color:var(--text);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.nv-pm-preview-meta{font-size:11px;color:var(--muted);margin-top:2px}
.nv-pm-preview-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.nv-pm-retitle{display:flex;gap:5px;align-items:center}
.nv-pm-retitle input[type=text]{width:110px;background:rgba(255,255,255,.03);border:1px solid var(--line);
  color:var(--text);padding:4px 6px;font-size:11px}

/* locker chip grid */
.nv-pm-lockergrid{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.nv-pm-lockerchip{display:inline-flex;align-items:center;gap:6px;padding:4px 9px 4px 6px;font-size:11.5px;
  color:var(--parchment);border:1px solid var(--line);background:rgba(255,255,255,.02)}
.nv-pm-lockerchip img{width:16px;height:16px;image-rendering:pixelated}
.nv-pm-lockerchip.listed{border-color:rgba(127,214,139,.3);background:rgba(127,214,139,.05)}
.nv-pm-lockerchip b{color:var(--gold-hi);font-weight:600;margin-left:2px}

/* item picker rows (deposit / restock / vend-open / pm-open) */
.nv-pm-pickwrap{border:1px solid var(--line);max-height:300px;overflow-y:auto;background:rgba(0,0,0,.12)}
.nv-pm-pickwrap::-webkit-scrollbar{width:6px}
.nv-pm-pickwrap::-webkit-scrollbar-thumb{background:rgba(199,154,60,.3)}
.nv-pm-pickrow{display:flex;align-items:center;gap:9px;padding:7px 10px;border-bottom:1px solid rgba(255,255,255,.05);cursor:pointer}
label.nv-pm-pickrow{cursor:pointer}
div.nv-pm-pickrow{cursor:default}
.nv-pm-pickrow:last-child{border-bottom:0}
.nv-pm-pickrow:hover{background:rgba(199,154,60,.06)}
.nv-pm-pickrow input[type=checkbox]{width:15px;height:15px;flex:0 0 15px;accent-color:var(--gold-bright,#c79a3c)}
.nv-pm-pickicon{width:26px;height:26px;flex:0 0 26px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle,rgba(255,206,107,.1),transparent 70%)}
.nv-pm-pickicon img{max-width:22px;max-height:22px;image-rendering:pixelated}
.nv-pm-pickname{flex:1 1 120px;min-width:0;font-size:12px;display:flex;align-items:center;gap:5px;flex-wrap:wrap;color:var(--text)}
.nv-pm-pickhave{font-size:10.5px;color:var(--muted);white-space:nowrap;flex:0 0 auto}
.nv-pm-pickqty{width:52px;flex:0 0 52px}
.nv-pm-pickprice{width:78px;flex:0 0 78px}
.nv-pm-pickrow input[type=number]{background:rgba(255,255,255,.04)!important;border:1px solid var(--line)!important;
  color:var(--text)!important;padding:3px 6px!important;font-size:11.5px!important;height:auto!important}
.nv-pm-pickempty{padding:14px;text-align:center;color:var(--muted);font-size:12px;border:1px dashed var(--line)}

/* deposit source segmented toggle */
.nv-pm-segrow{display:flex;gap:0;margin-bottom:10px;border:1px solid var(--line)}
.nv-pm-seg{flex:1;text-align:center;padding:8px 6px;font-size:11px;letter-spacing:.3px;color:var(--muted);
  cursor:pointer;transition:.2s;position:relative}
.nv-pm-seg:first-child{border-right:1px solid var(--line)}
.nv-pm-seg input{position:absolute;opacity:0;pointer-events:none}
.nv-pm-seg:has(input:checked){color:var(--gold-hi);background:rgba(199,154,60,.08)}
.nv-pm-seg:hover{color:var(--parchment)}

@media(max-width:640px){
  .nv-pm-pickname{flex-basis:100%;order:1}
  .nv-pm-pickrow{flex-wrap:wrap}
}

/* section signs + utility */
.nv-pm-sign{display:flex;align-items:center;gap:10px;margin:26px 0 10px;font-family:var(--disp);
  font-size:17px;color:var(--gold-hi);letter-spacing:.06em}
.nv-pm-sign::before,.nv-pm-sign::after{content:"";height:1px;background:linear-gradient(90deg,transparent,rgba(199,154,60,.5),transparent);flex:1}
.nv-pm-filterrow{display:flex;gap:8px;align-items:center;margin:12px 0 2px;flex-wrap:wrap}
.nv-pm-filterrow input[type=search]{min-width:220px}
.nv-pm-count{font-size:12px;color:var(--muted)}

@media (prefers-reduced-motion:no-preference){
  .nv-pm-card{opacity:0;transform:translateY(9px);animation:nvpmrise .5s ease-out var(--d,0s) forwards}
}
@media (prefers-reduced-motion:reduce){
  .nv-pm-card{opacity:1;transform:none;animation:none}
  .nv-pm-pill.pending .dot{animation:none}
}
