/* ============================================================================
   NOVAHOSTCLOUD — THEME LAYER (Original / Dark / White)
   ----------------------------------------------------------------------------
   PRESENTATION ONLY. No backend, routing, billing, provisioning or lifecycle
   behaviour is affected. Loaded last on the public home page and inside the
   Nova Cloud Console so it can override earlier sheets by source order.

   HOW IT WORKS
   * The site already ships a layered design-token system (--nc-* canonical in
     nova-console.css, plus the legacy --bg/--panel/--text aliases declared in
     index.php and the page-local --card/--stroke set in nhd-servers.php).
     This file does NOT introduce a second token system: it overrides those
     EXISTING tokens per theme, so every component that already reads a token
     re-colours itself with no per-component work.
   * `html[data-theme]` (specificity 0,1,1) outranks `:root` (0,1,0), so the
     page-local :root blocks cannot pin a stale palette.
   * ORIGINAL is the absence of the attribute => the site's current appearance
     is byte-for-byte unchanged for anyone who never picks a theme.
   * The few components whose colours are hardcoded literals rather than tokens
     (mostly the public landing sections, which pre-date the token layer) get
     explicit light-theme overrides in the generated section below.
   ============================================================================ */

html[data-theme="dark"]{
  color-scheme:dark;
  /* surfaces — a deeper, cooler navy than the Original theme */
  --nc-bg:#050a14; --nc-bg-2:#081228; --nc-panel:#0b1730; --nc-panel-2:#0a1428; --nc-elev:#12203c;
  --nc-line:#1e2b4b; --nc-line-soft:#16223d;
  /* text */
  --nc-text:#e8f2ff; --nc-text-2:#aebbd8; --nc-muted:#7f8ea8; --nc-faint:#5d6a83;
  /* accents (brand preserved) */
  --nc-purple:#7c5cff; --nc-purple-2:#9d7dff; --nc-blue:#4d8bff;
  --nc-accent-grad:linear-gradient(135deg,#7c5cff,#4d8bff);
  /* semantic */
  --nc-green:#34d399; --nc-green-bg:#08251c; --nc-green-line:#1c5f49;
  --nc-orange:#fbaa46; --nc-orange-bg:#281c0d; --nc-orange-line:#6d4c1c;
  --nc-red:#f4667f; --nc-red-bg:#260c16; --nc-red-line:#6d2138;
  --nc-cyan:#48d6e8;
  /* depth */
  --nc-shadow:0 18px 48px rgba(2,5,14,.60); --nc-shadow-sm:0 8px 22px rgba(2,5,14,.45);
  /* legacy aliases (index.php :root) */
  --bg:#050a14; --bg-soft:#081228; --panel:#0b1730; --panel-2:#12203c;
  --line:#16223d; --line-strong:#1e2b4b;
  --text:#e8f2ff; --muted:#7f8ea8; --muted-2:#5d6a83;
  --cyan:#9d7dff; --cyan-soft:#9d7dff; --blue:#4d8bff; --violet:#7c5cff;
  --green:#34d399; --amber:#fbaa46;
  --shadow:0 24px 60px rgba(2,5,14,.55);
  /* page-local aliases (nhd-servers.php :root) */
  --card:#0e1b34; --stroke:rgba(120,180,255,.10); --stroke-2:rgba(120,180,255,.18);
}

html[data-theme="light"]{
  color-scheme:light;
  /* surfaces — layered: page -> section -> card -> elevated, never flat white */
  --nc-bg:#f4f7fb; --nc-bg-2:#eef2f8; --nc-panel:#ffffff; --nc-panel-2:#fbfcfe; --nc-elev:#ffffff;
  --nc-line:#dfe5ef; --nc-line-soft:#e9eef6;
  /* text */
  /* PHASE 87: --nc-faint was #78849a = 3.51:1 on --nc-bg / 3.77:1 on --nc-panel and
     3.36:1 on --nc-bg-2, i.e. under AA for every de-emphasised label, breadcrumb,
     placeholder and footer that reads it. #616c86 clears AA on all three surfaces
     (4.91 / 5.27 / 4.69:1) and on the #f1f4f9 badge tint (4.78:1) as well. One token,
     so every consumer is corrected at once. */
  --nc-text:#101a2c; --nc-text-2:#3f4f6b; --nc-muted:#5a6982; --nc-faint:#616c86;
  /* accents — deepened for contrast on white */
  /* PHASE 89: --nc-purple-2 / --nc-blue were ~4% too light for the Light page
     background, so every one of their ~14 text/icon consumers in this section sat at
     4.35-4.68:1 on #f4f7fb (#ffffff) and 3.67-3.86:1 on their own tinted chips.
     #673fdd / #1d4ed8 clear AA on both surfaces (5.83-6.26:1 page, 4.79-5.44:1 chips)
     while keeping the same hue families. Light-scoped block, so Original (L32) and
     Dark (L32) are untouched, and .auth-pop-guard-label keeps its Phase-87
     #5b34c8 override. */
  --nc-purple:#6a44f0; --nc-purple-2:#673fdd; --nc-blue:#1d4ed8;
  --nc-accent-grad:linear-gradient(135deg,#6a44f0,#2f6fe0);
  /* semantic — tinted surfaces, saturated ink */
  /* PHASE 87: these three inks were only 3.14 / 3.51 / 3.91:1 against their OWN tints
     (--nc-*-bg), and white-on-them was 3.48 / 3.86 / 4.46:1, so the icon+label state
     badges and the toast states both failed AA in Light mode. Deepened here once, so
     every consumer (badges, toasts, status icons, tinted buttons) is corrected together
     instead of being patched per component. New: on-tint 5.88 / 5.70 / 5.81:1,
     white-on-fill 6.60 / 6.50 / 6.62:1. */
  --nc-green:#0b6b41; --nc-green-bg:#e6f7ef; --nc-green-line:#b9e6d2;
  --nc-orange:#8a4f06; --nc-orange-bg:#fdf3e3; --nc-orange-line:#f0d9ae;
  --nc-red:#b21f42; --nc-red-bg:#fdecef; --nc-red-line:#f5c7d1;
  --nc-cyan:#0e93a8;
  /* depth — restrained, never heavy */
  --nc-shadow:0 18px 48px rgba(15,26,46,.10); --nc-shadow-sm:0 8px 22px rgba(15,26,46,.08);
  /* legacy aliases (index.php :root) */
  --bg:#f4f7fb; --bg-soft:#eef2f8; --panel:#ffffff; --panel-2:#f1f5fa;
  --line:#e9eef6; --line-strong:#d5dce8;
  --text:#101a2c; --muted:#5a6982; --muted-2:#616c86;
  /* PHASE 89: these legacy aliases (read by index.php's own :root consumers, e.g.
     `.brand b{color:var(--cyan)}` for the "HostCloud" wordmark) still held the OLD
     literal values, so they rendered 4.35:1 on --nc-bg and 4.16:1 on --nc-bg-2 while
     the canonical tokens they mirror had already been deepened. Re-pointed AT the
     tokens so the alias can never drift from its canonical value again — the same
     rule already applied to --green / --amber below. --violet is left as a literal
     because it already equals --nc-purple exactly. */
  --cyan:var(--nc-purple-2); --cyan-soft:var(--nc-purple-2); --blue:var(--nc-blue); --violet:#6a44f0;
  /* PHASE 87: kept in step with --nc-green / --nc-orange above, otherwise pages that
     consume the legacy alias would render a lighter semantic ink than pages that use
     the canonical token — the exact "half-themed" mismatch this phase removes. */
  --green:#0b6b41; --amber:#8a4f06;
  --shadow:0 18px 46px rgba(15,26,46,.10);
  /* page-local aliases (nhd-servers.php :root) */
  --card:#ffffff; --stroke:rgba(15,26,46,.10); --stroke-2:rgba(15,26,46,.16);
}

/* root shell so no theme can leave an unreadable canvas */
html[data-theme="dark"], html[data-theme="dark"] body{ background-color:var(--nc-bg); }
html[data-theme="light"], html[data-theme="light"] body{ background-color:var(--nc-bg); }
html[data-theme="light"] body{ color:var(--nc-text); }
html[data-theme="dark"] body{ color:var(--nc-text); }

/* the console body carries its own background utility — align it with the token */
html[data-theme="light"] .nc-body{ background:var(--nc-bg); color:var(--nc-text); }
html[data-theme="dark"] .nc-body{ background:var(--nc-bg); color:var(--nc-text); }

/* native controls + scrollbars follow the theme */
html[data-theme="light"] ::selection{ background:rgba(106,68,240,.18); color:#101a2c; }
html[data-theme="dark"] ::selection{ background:rgba(124,92,255,.30); color:#e8f2ff; }

/* ============================================================================
   GENERATED LIGHT-THEME COMPONENT OVERRIDES
   Derived from the real declarations in index.php (inline <style> block),
   nova-home.css, nova-console.css and auth-popup.css. Scoped to
   html[data-theme="light"], so Original and Dark are untouched by this block.
   COLOUR-BEARING DECLARATIONS ONLY: layout properties are deliberately not
   restated, because doing so inside a higher-specificity rule overrides the
   base sheet's responsive rules.
   ============================================================================ */

html[data-theme="light"] .text-gradient{color:transparent;background:linear-gradient(92deg,#fff 2%,var(--nc-purple-2, #7b56f5) 42%,var(--nc-blue, #2f6fe0) 92%)}
html[data-theme="light"] .cloud-bg{background:
    radial-gradient(circle at 78% 8%,rgba(77,139,255,.2),transparent 31%),
    radial-gradient(circle at 15% 68%,rgba(124,92,255,.12),transparent 32%),
    linear-gradient(180deg,var(--nc-bg, #f4f7fb) 0%,#f4f7fb 55%,var(--nc-bg, #f4f7fb) 100%)}
html[data-theme="light"] .status-bar{background:rgba(255,255,255,.94);color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .status-center{color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .system-live{color:var(--nc-green, #0f9d63)}
html[data-theme="light"] .site-header{background:rgba(255,255,255,.86)}
html[data-theme="light"] .site-header.scrolled{background:rgba(255,255,255,.94);box-shadow:0 18px 50px rgba(15,26,46,.06)}
html[data-theme="light"] .brand-mark{border:1px solid rgba(124,92,255,.38);background:linear-gradient(145deg,rgba(124,92,255,.15),rgba(47,111,224,.10));box-shadow:inset 0 0 22px rgba(124,92,255,.07),0 0 25px rgba(124,92,255,.07);color:var(--cyan)}
html[data-theme="light"] .brand-mark:after{border:1px solid rgba(15,26,46,.07)}
html[data-theme="light"] .main-nav a{color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .nav-cta{border:1px solid var(--line);background:rgba(15,26,46,.035)}
html[data-theme="light"] .mobile-toggle{border:1px solid var(--line);background:rgba(15,26,46,.035);color:#fff}
html[data-theme="light"] .hero-kicker{border:1px solid rgba(124,92,255,.18);background:rgba(124,92,255,.055);color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .button.primary{color:#fff;background:linear-gradient(105deg,var(--cyan),var(--nc-blue, #2f6fe0));box-shadow:0 15px 42px rgba(124,92,255,.2)}
html[data-theme="light"] .hero-trust{color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .rack-label{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .server-unit{border:1px solid rgba(34,44,82,.14);background:linear-gradient(180deg,var(--nc-panel-2, #ffffff),var(--nc-bg, #f4f7fb));box-shadow:inset 0 1px rgba(255,255,255,.03)}
html[data-theme="light"] .server-vents{background:repeating-linear-gradient(90deg,var(--nc-line, #d5dce8) 0 3px,transparent 3px 7px)}
html[data-theme="light"] .server-port{border:1px solid var(--nc-line, #d5dce8);box-shadow:inset 0 0 6px var(--nc-bg, #f4f7fb)}
html[data-theme="light"] .scene-card{border:1px solid rgba(124,92,255,.18);background:rgba(7,11,24,.78);box-shadow:0 18px 44px rgba(0,0,0,.31);color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .scene-card b{color:var(--nc-text, #101a2c)}
html[data-theme="light"] .proxy-country{color:var(--nc-text, #101a2c)}
html[data-theme="light"] .plan-card{border:1px solid var(--line);background:linear-gradient(145deg,#ffffff,rgba(7,11,24,.96));box-shadow:0 20px 55px rgba(15,26,46,.06)}
html[data-theme="light"] .server-identity{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .server-rack i{border:1px solid rgba(124,92,255,.25);background:var(--nc-panel-2, #ffffff)}
html[data-theme="light"] .stock-badge{border:1px solid rgba(52,211,153,.16);background:rgba(52,211,153,.06);color:var(--nc-green, #0f9d63)}
html[data-theme="light"] .stock-badge.out{border-color:rgba(251,170,70,.15);background:rgba(251,170,70,.055);color:var(--nc-orange, #b4740f)}
html[data-theme="light"] .plan-specs li{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .plan-specs b{color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .plan-link{border:1px solid rgba(124,92,255,.2);background:rgba(124,92,255,.065);color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .plan-link.disabled{border-color:rgba(15,26,46,.07);background:rgba(15,26,46,.035);color:var(--nc-faint, #78849a)}
html[data-theme="light"] .infra-rack3d{border:1px solid rgba(124,92,255,.22);background:linear-gradient(145deg,var(--nc-panel,#ffffff),var(--nc-bg-2,#eef2f8));box-shadow:18px 18px 46px rgba(15,26,46,.13),-10px 0 42px rgba(124,92,255,.08),inset 0 1px rgba(15,26,46,.07)}
html[data-theme="light"] .infra-rack3d:after{background:linear-gradient(90deg,var(--nc-panel-2, #ffffff),var(--nc-bg, #f4f7fb));border:1px solid rgba(124,92,255,.15)}
html[data-theme="light"] .infra-rack-head{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .infra-rack-head b{color:var(--nc-green, #0f9d63)}
html[data-theme="light"] .infra-rack-head b:before{background:var(--nc-green, #0f9d63);box-shadow:0 0 8px var(--nc-green, #0f9d63)}
html[data-theme="light"] .infra-unit{border:1px solid rgba(124,92,255,.15);background:linear-gradient(180deg,var(--nc-panel-2, #ffffff),var(--nc-bg, #f4f7fb));box-shadow:inset 0 1px rgba(255,255,255,.03)}
html[data-theme="light"] .infra-unit:before{background:var(--nc-green, #0f9d63);box-shadow:0 0 8px var(--nc-green, #0f9d63)}
html[data-theme="light"] .infra-unit:nth-child(3):before{background:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .infra-unit:nth-child(5):before{background:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .infra-unit:after{background:repeating-linear-gradient(90deg,var(--nc-line, #d5dce8) 0 4px,transparent 4px 8px)}
html[data-theme="light"] .infra-load i{background:linear-gradient(90deg,var(--nc-purple-2, #7b56f5),var(--nc-blue, #2f6fe0));box-shadow:0 0 10px rgba(124,92,255,.6)}
html[data-theme="light"] .infra-telemetry{border:1px solid rgba(124,92,255,.18);background:rgba(255,255,255,.92);box-shadow:0 14px 32px rgba(15,26,46,.10);color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .infra-telemetry b{color:var(--nc-text, #101a2c)}
html[data-theme="light"] .infra-telemetry b span{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .infra-telemetry.latency b{color:var(--nc-green, #0f9d63)}
html[data-theme="light"] .data-path:after{background:var(--nc-purple-2, #7b56f5);box-shadow:0 0 10px var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .step-number{border:1px solid rgba(124,92,255,.27);background:var(--nc-bg-2, #eef2f8);box-shadow:0 0 0 9px var(--bg),0 15px 40px rgba(0,0,0,.25);color:var(--cyan)}
html[data-theme="light"] .footer-col h4{color:var(--nc-text-2, #3f4f6b)}
html[data-theme="light"] .footer-col a{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .footer-bottom{color:var(--nc-faint, #78849a)}
html[data-theme="light"] .payment-pills span{border:1px solid rgba(15,26,46,.07);background:rgba(255,255,255,.025)}
html[data-theme="light"] .nh-h2{color:#101a2c}
html[data-theme="light"] .nh-lead{color:#5a6982}
html[data-theme="light"] .nh-kicker{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-grad{background:linear-gradient(100deg,#7b56f5,var(--nc-blue, #2f6fe0));color:transparent}
html[data-theme="light"] .nh-loc{border:1px solid rgba(52,211,153,.35);background:rgba(52,211,153,.12);color:var(--nc-green)}
html[data-theme="light"] .nh-hero-sub{color:#3f4f6b}
html[data-theme="light"] .nh-point b{color:#101a2c}
html[data-theme="light"] .nh-point span{color:#5a6982}
html[data-theme="light"] .nh-btn{border:1px solid #d5dce8;background:#ffffff;color:#101a2c}
html[data-theme="light"] .nh-btn:hover{border-color:#6a44f0}
html[data-theme="light"] .nh-btn-primary{background:linear-gradient(135deg,#6a44f0,#2f6fe0);border-color:transparent;color:#fff;box-shadow:0 12px 30px rgba(124,92,255,.32)}
html[data-theme="light"] .nh-btn-primary:hover{background:linear-gradient(135deg,var(--nc-purple-2, #7b56f5),var(--nc-blue, #2f6fe0))}
html[data-theme="light"] .nh-trustline{color:var(--nc-faint)}
html[data-theme="light"] .nh-trustline i{color:var(--nc-green)}
html[data-theme="light"] .nh-price-card{border:1px solid #d5dce8;background:linear-gradient(165deg,#f7f9fd,rgba(13,19,41,.96));box-shadow:0 22px 60px rgba(15,26,46,.10)}
html[data-theme="light"] .nh-tag{border:1px solid rgba(124,92,255,.42);background:rgba(124,92,255,.14);color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-tag-monthly{border-color:rgba(77,139,255,.4);background:rgba(77,139,255,.13);color:var(--nc-blue, #2f6fe0)}
html[data-theme="light"] .nh-tag-proxy{border-color:rgba(52,211,153,.35);background:rgba(52,211,153,.12);color:var(--nc-green)}
html[data-theme="light"] .nh-price-note{color:#5a6982}
html[data-theme="light"] .nh-price-label{color:var(--nc-faint)}
html[data-theme="light"] .nh-price-value span{color:#5a6982}
html[data-theme="light"] .nh-price-fallback{border:1px solid #d5dce8;background:#ffffff;color:#3f4f6b}
html[data-theme="light"] .nh-flist li{color:#3f4f6b}
html[data-theme="light"] .nh-flist i{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-price-link{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-price-link:hover{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-prod{border:1px solid #e3e8f1;background:linear-gradient(165deg,#ffffff,#fbfcfe)}
html[data-theme="light"] .nh-prod:hover{border-color:#6a44f0}
html[data-theme="light"] .nh-prod-primary{border-color:rgba(124,92,255,.4);background:linear-gradient(165deg,#f8f7ff,#fbfcfe)}
html[data-theme="light"] .nh-prod-ico.is-blue{background:rgba(47,111,224,.10);border-color:rgba(47,111,224,.30)}
html[data-theme="light"] .nh-prod-sub{color:#5a6982}
html[data-theme="light"] .nh-dc-badge{border:1px solid rgba(47,111,224,.30);background:rgba(47,111,224,.10);color:var(--nc-blue, #2f6fe0)}
html[data-theme="light"] .nh-proxy-flags small{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-prod-cta{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-prod-cta.is-blue{color:var(--nc-blue, #2f6fe0)}
html[data-theme="light"] .nh-prod-cta.is-green{color:var(--nc-green)}
html[data-theme="light"] .nh-location-dc b{border:1px solid rgba(47,111,224,.30);background:rgba(47,111,224,.10);color:var(--nc-blue, #2f6fe0)}
html[data-theme="light"] .nh-strip{border:1px solid #e3e8f1;background:#e3e8f1}
html[data-theme="light"] .nh-strip > div{background:var(--nc-bg-2, #eef2f8)}
html[data-theme="light"] .nh-strip b{color:#101a2c}
html[data-theme="light"] .nh-strip span{color:#5a6982}
html[data-theme="light"] .nh-step{border:1px solid #e3e8f1;background:#ffffff}
html[data-theme="light"] .nh-step-num{background:linear-gradient(135deg,#6a44f0,#2f6fe0);color:#fff}
html[data-theme="light"] .nh-step b{color:#101a2c}
html[data-theme="light"] .nh-step span{color:#5a6982}
html[data-theme="light"] .nh-why div{border:1px solid #e3e8f1;background:#ffffff;color:#3f4f6b}
html[data-theme="light"] .nh-why i{color:var(--nc-green)}
html[data-theme="light"] .nh-pay{border:1px solid #e3e8f1;background:#ffffff}
html[data-theme="light"] .nh-pay p{color:#5a6982}
html[data-theme="light"] .nh-pay-pills span{border:1px solid #d5dce8;background:#ffffff;color:#3f4f6b}
html[data-theme="light"] .nova-bolt{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-point-ico{color:var(--nc-purple-2, #7b56f5);background:linear-gradient(145deg,rgba(124,92,255,.2),rgba(124,92,255,.08));border-color:rgba(124,92,255,.42);box-shadow:0 0 22px rgba(124,92,255,.14)}
html[data-theme="light"] .nh-point-ico.is-blue{color:var(--nc-blue, #2f6fe0);background:linear-gradient(145deg,rgba(77,139,255,.2),rgba(77,139,255,.07));border-color:rgba(77,139,255,.45);box-shadow:0 0 22px rgba(77,139,255,.14)}
html[data-theme="light"] .nh-point-ico.is-green{color:var(--nc-green, #0f9d63);background:linear-gradient(145deg,rgba(52,211,153,.18),rgba(52,211,153,.06));border-color:rgba(52,211,153,.42);box-shadow:0 0 22px rgba(52,211,153,.13)}
html[data-theme="light"] .nh-prod-ico{color:var(--nc-purple-2, #7b56f5);background:linear-gradient(145deg,rgba(124,92,255,.2),rgba(124,92,255,.07));border-color:rgba(124,92,255,.45);box-shadow:0 0 26px rgba(124,92,255,.15)}
html[data-theme="light"] .nh-prod-ico.is-blue{color:var(--nc-blue, #2f6fe0);background:linear-gradient(145deg,rgba(77,139,255,.2),rgba(77,139,255,.07));border-color:rgba(77,139,255,.45);box-shadow:0 0 26px rgba(77,139,255,.15)}
html[data-theme="light"] .nh-prod-ico.is-green{color:var(--nc-green, #0f9d63);background:linear-gradient(145deg,rgba(52,211,153,.18),rgba(52,211,153,.06));border-color:rgba(52,211,153,.42);box-shadow:0 0 26px rgba(52,211,153,.14)}
html[data-theme="light"] .nh-strip-ico{color:var(--nc-purple-2, #7b56f5);background:rgba(124,92,255,.1);border-color:rgba(124,92,255,.34);box-shadow:0 0 18px rgba(124,92,255,.1)}
html[data-theme="light"] .nh-pay{border-color:rgba(124,92,255,.28);background:linear-gradient(165deg,#f7f9fd,#fbfcfe)}
html[data-theme="light"] .nh-hero-points .nh-point-ico{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-hero-points .nh-point-ico.is-blue{color:var(--nc-blue, #2f6fe0)}
html[data-theme="light"] .nh-hero-points .nh-point-ico.is-green{color:var(--nc-green, #0f9d63)}
html[data-theme="light"] .nh-strip .nh-strip-ico{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-products .nh-prod-ico{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .nh-products .nh-prod-ico.is-blue{color:var(--nc-blue, #2f6fe0)}
html[data-theme="light"] .nh-products .nh-prod-ico.is-green{color:var(--nc-green, #0f9d63)}
html[data-theme="light"] .server-scene .scene-card{box-shadow:0 14px 34px rgba(15,26,46,.08)}
html[data-theme="light"] .rack{border:1px solid rgba(124,92,255,.3);box-shadow:0 0 55px rgba(124,92,255,.27),0 0 130px rgba(77,139,255,.15),0 50px 95px rgba(15,26,46,.12),inset 0 1px 0 rgba(15,26,46,.08)}
html[data-theme="light"] .server-unit{border:1px solid rgba(15,26,46,.10);background:linear-gradient(180deg,var(--nc-elev, #f1f5fa),var(--nc-panel-2, #ffffff));box-shadow:inset 0 1px rgba(15,26,46,.04),0 0 18px rgba(77,139,255,.09)}
html[data-theme="light"] .server-unit::before{background:linear-gradient(180deg,var(--nc-purple, #6a44f0),var(--nc-blue, #2f6fe0));box-shadow:0 0 12px rgba(124,92,255,.75)}
html[data-theme="light"] .server-port{border-color:var(--nc-line-soft, #e3e8f1);box-shadow:inset 0 0 8px var(--nc-bg, #f4f7fb),0 0 8px rgba(47,111,224,.30)}
html[data-theme="light"] .rack-label{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .nh-price-card{border:1px solid rgba(124,92,255,.28);background:linear-gradient(165deg,#f7f9fd,#fbfcfe);box-shadow:0 30px 70px rgba(15,26,46,.12),0 0 60px rgba(124,92,255,.12)}
html[data-theme="light"] .card-rack .nova-bolt{color:var(--nc-text, #101a2c);background:rgba(124,92,255,.18);border:1px solid rgba(96,165,250,.6);box-shadow:0 0 22px rgba(124,92,255,.55)}
html[data-theme="light"] .nh-flist i{color:var(--nc-purple-2, #7b56f5);background:rgba(124,92,255,.16);border:1px solid rgba(124,92,255,.4);box-shadow:0 0 12px rgba(124,92,255,.18)}
html[data-theme="light"] .nc-side{background:linear-gradient(180deg,#ffffff,#f7f9fd)}
html[data-theme="light"] .nc-nav a.nc-danger-link{color:#c22546}
html[data-theme="light"] .nc-nav-badge{border:1px solid rgba(15,26,46,.14);background:rgba(15,26,46,.07);color:#2d4a8a}
/* PHASE 87: the rule above re-inks the badge dark, but a badge that sits INSIDE the
   active nav item lands on the purple/blue accent gradient (.nc-nav a.nc-on), where
   #2d4a8a on the translucent dark chip measured 1.78:1. On the accent fill the badge
   follows the item's own white treatment instead. */
html[data-theme="light"] .nc-nav a.nc-on .nc-nav-badge{border-color:#ffffff;background:#ffffff;color:#5b34c8}
html[data-theme="light"] .nc-topbar{background:rgba(255,255,255,.86)}
html[data-theme="light"] .nc-badge.is-stopped{background:#eef2f8;border-color:var(--nc-line);color:var(--nc-text-2)}
html[data-theme="light"] .nc-badge.is-busy{background:#f1eefe;border-color:#d9d2fb;color:var(--nc-purple-2)}
html[data-theme="light"] .nc-badge.is-deleted{background:#f1f4f9;border-color:#dfe5ef;color:var(--nc-faint)}
html[data-theme="light"] .nc-badge.is-info{background:rgba(47,111,224,.10);border-color:rgba(47,111,224,.30);color:#1f5fd0}
/* PHASE 87: .is-running / .is-suspended / .is-danger were the three states with NO
   Light rule. They read var(--nc-*) for both surface and ink, so deepening the three
   semantic tokens above fixes them with no per-state literal at all — the badge dot
   (.nc-badge::before{background:currentColor}) follows the same ink. Left here as a
   comment rather than as rules, so the file keeps ONE source of truth for the colour. */

/* PHASE 87 — console toasts. The background already follows the Light palette
   (--nc-*-bg), but the ink stayed a dark-theme literal, giving 1.13 / 1.35 / 1.19:1:
   every toast was unreadable in White mode. Re-pointed to the deepened semantic inks.
   The toast carries no icon and no close control (nova-console.js L36-L48 renders a
   single text node), so text, border and surface are the whole surface area. */
html[data-theme="light"] .nc-toast.is-success{border-color:var(--nc-green-line);background:var(--nc-green-bg);color:var(--nc-green)}
html[data-theme="light"] .nc-toast.is-error{border-color:var(--nc-red-line);background:var(--nc-red-bg);color:var(--nc-red)}
html[data-theme="light"] .nc-toast.is-warn{border-color:var(--nc-orange-line);background:var(--nc-orange-bg);color:var(--nc-orange)}
/* PHASE 87: this Light rule paired a DARK strip (#161c3c) with the Light ink token,
   i.e. dark-on-dark at 2.01:1 — the inline status line was unreadable in White mode.
   It is restated as the light tinted status surface it was evidently meant to be:
   #3f4f6b on #f1eefe = 7.24:1. Only the background value changed. */
html[data-theme="light"] .nc-actline{border:1px solid #d9d2fb;background:#f1eefe;color:var(--nc-text-2)}
html[data-theme="light"] .nc-ctrl-restart{border-color:rgba(77,139,255,.4);color:#1f5fd0;background:rgba(77,139,255,.11)}
html[data-theme="light"] .nc-drawer{background:linear-gradient(180deg,#ffffff,#f7f9fd)}
html[data-theme="light"] .nc-bottombar{background:rgba(255,255,255,.97)}
html[data-theme="light"] .nc-qa2-dc{border:1px solid rgba(47,111,224,.30);background:rgba(47,111,224,.10);color:#1f5fd0}
html[data-theme="light"] .nc-rack{background:linear-gradient(180deg,#14203e,#0a1226);border:1px solid rgba(151,193,255,.3);box-shadow:0 0 26px rgba(124,92,255,.24),inset 0 1px 0 rgba(15,26,46,.07)}
html[data-theme="light"] .nc-ctrl:not(:disabled).nc-ctrl-restart{background:rgba(77,139,255,.14);border-color:rgba(77,139,255,.55);color:#1f5fd0}
html[data-theme="light"] .auth-pop-card{background:linear-gradient(168deg,var(--nc-panel, #ffffff) 0%,var(--nc-panel-2, #ffffff) 46%,var(--nc-bg-2, #eef2f8) 100%);border:1px solid rgba(124,92,255,.28);box-shadow:
        0 8px 0 var(--nc-bg, #f4f7fb),
        0 30px 70px rgba(0,0,0,.65),
        inset 0 1px 0 rgba(15,26,46,.07),
        0 0 46px rgba(124,92,255,.14)}
html[data-theme="light"] .auth-pop-guard-label{color:var(--nc-purple-2, #7b56f5);background:rgba(16,23,51,.7);border:1px solid rgba(124,92,255,.5);box-shadow:0 0 16px rgba(124,92,255,.28),inset 0 1px 0 rgba(15,26,46,.07)}
html[data-theme="light"] .auth-pop-head p{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .auth-pop-sub{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .auth-pop-msg{box-shadow:0 3px 0 var(--nc-bg, #f4f7fb),0 8px 18px rgba(0,0,0,.35),inset 0 1px 0 rgba(15,26,46,.06)}
html[data-theme="light"] .auth-pop-msg.err{color:var(--nc-red, #d93a5c);background:linear-gradient(135deg,rgba(244,102,127,.18),rgba(244,102,127,.12));border:1px solid rgba(244,102,127,.4)}
html[data-theme="light"] .auth-pop-msg.ok{color:var(--nc-green, #0f9d63);background:linear-gradient(135deg,rgba(52,211,153,.18),rgba(52,211,153,.12));border:1px solid rgba(52,211,153,.4)}
html[data-theme="light"] .auth-pop-label{color:var(--nc-faint, #78849a)}
html[data-theme="light"] .auth-pop-link{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .auth-pop-field:focus-within{border-color:var(--nc-purple-2, #7b56f5);box-shadow:0 0 0 3px rgba(124,92,255,.13)}
html[data-theme="light"] .auth-pop-field > span{color:var(--nc-faint, #78849a)}
html[data-theme="light"] .auth-pop-field input{background:none;border:0;color:var(--nc-text, #101a2c)}
html[data-theme="light"] .auth-pop-field input::placeholder{color:var(--nc-faint, #78849a)}
html[data-theme="light"] .auth-pop-eye{background:none;border:0;color:var(--nc-faint, #78849a)}
html[data-theme="light"] .nova-eye{background:linear-gradient(135deg,rgba(124,92,255,.14),rgba(77,139,255,.18));border:1px solid rgba(124,92,255,.3);box-shadow:inset 0 1px 0 rgba(15,26,46,.07),0 3px 8px rgba(15,26,46,.08)}
html[data-theme="light"] .nova-eye:hover{color:var(--nc-purple-2, #7b56f5);border-color:rgba(124,92,255,.65);box-shadow:0 0 12px rgba(124,92,255,.35)}
html[data-theme="light"] .auth-pop-remember{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .auth-pop-remember input:checked{background:var(--nc-accent-grad, linear-gradient(135deg,#6a44f0,#2f6fe0));border-color:var(--nc-purple-2, #7b56f5);box-shadow:0 0 10px rgba(124,92,255,.4)}
html[data-theme="light"] .auth-pop-remember:hover{color:var(--nc-text, #101a2c)}
html[data-theme="light"] .auth-pop-btn{border:0;color:#fff;background:var(--nc-accent-grad, linear-gradient(135deg,#6a44f0,#2f6fe0));box-shadow:0 4px 0 #3b2f7a,0 12px 26px rgba(124,92,255,.28)}
html[data-theme="light"] .auth-pop-terms{color:var(--nc-faint, #78849a)}
html[data-theme="light"] .auth-pop-terms a{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .auth-pop-foot{color:var(--nc-muted, #5a6982)}
html[data-theme="light"] .auth-pop-foot a{color:var(--nc-purple-2, #7b56f5)}
html[data-theme="light"] .auth-pop-alt{color:var(--nc-faint, #78849a)}
html[data-theme="light"] .auth-pop-alt a{color:var(--nc-purple-2, #7b56f5)}

@media(max-width:860px){
  html[data-theme="light"] .mobile-panel a{color:var(--nc-text-2, #3f4f6b)}
  html[data-theme="light"] .mobile-panel a:last-child{border:1px solid rgba(124,92,255,.18);background:rgba(124,92,255,.06);color:var(--nc-purple-2, #7b56f5)}
}

/* ============================================================================
   LIGHT-THEME INK FIXES — curated, deliberately NOT generated
   ----------------------------------------------------------------------------
   The generated block maps dark surfaces and dark-theme text colours, but `#fff`
   is ambiguous: it is CORRECT on gradient/accent buttons and WRONG on surfaces
   this theme turns light. Every selector below is a #fff (or a #fff-filled
   glyph) sitting on a surface that becomes light, restated in dark ink so no
   heading, label or icon can disappear in White mode.

   Selectors deliberately LEFT white (white on a gradient/accent fill, correct in
   both themes): .button.primary, .nh-btn-primary, .nh-step-num, .nc-nav a.nc-on,
   .nc-avatar, .nc-btn-primary, .nc-dash-wallet-ico, .nc-stat2-ico, .nc-qa2-ico,
   .nc-side-help a, .auth-pop-btn, .auth-pop-remember input:checked::after.
   ============================================================================ */

html[data-theme="light"] .nh-h1,
html[data-theme="light"] .nh-price-head h3,
html[data-theme="light"] .nh-price-value b,
html[data-theme="light"] .nh-prod h3,
html[data-theme="light"] .nh-pay h3,
html[data-theme="light"] .nc-brand-text b,
html[data-theme="light"] .nc-notice b,
html[data-theme="light"] .nc-empty b,
html[data-theme="light"] .auth-pop-head h2,
html[data-theme="light"] .status-bar a:hover,
html[data-theme="light"] .main-nav a:hover,
html[data-theme="light"] .nc-nav a:hover{
  color:#101a2c;
}

/* console sidebar burger: both the button colour and the #fff bars were invisible on white */
html[data-theme="light"] .mobile-toggle{ color:#101a2c; }
html[data-theme="light"] .mobile-toggle span{ background:#101a2c; }

/* hover surface on a light sidebar needs a tint, not a white panel on white */
html[data-theme="light"] .nc-nav a:hover{ background:rgba(106,68,240,.10); }

/* nav underline accent must stay visible against a light header */
html[data-theme="light"] .main-nav a:after{ background:var(--nc-purple); }

/* gradient headline started on #fff — on white that first stop disappears */
html[data-theme="light"] .text-gradient{
  background:linear-gradient(92deg,#101a2c 2%,var(--nc-purple-2,#7b56f5) 42%,var(--nc-blue,#2f6fe0) 92%);
  -webkit-background-clip:text; background-clip:text; color:transparent;
}
html[data-theme="light"] .nh-grad{
  background:linear-gradient(100deg,var(--nc-purple-2,#7b56f5),var(--nc-blue,#2f6fe0));
  -webkit-background-clip:text; background-clip:text; color:transparent;
}

/* the accent-filled icon tiles keep white glyphs, but need depth to read on white */
html[data-theme="light"] .nc-stat2-ico,
html[data-theme="light"] .nc-qa2-ico,
html[data-theme="light"] .nc-avatar,
html[data-theme="light"] .nc-dash-wallet-ico,
html[data-theme="light"] .nc-side-help a,
html[data-theme="light"] .nc-btn-primary{ color:#fff; }

/* form controls must never inherit light-theme ink onto a dark fill */
html[data-theme="light"] input::placeholder,
html[data-theme="light"] textarea::placeholder{ color:var(--nc-faint,#78849a); opacity:1; }

/* keep the light theme's footer from being a flat white slab */
html[data-theme="light"] .site-footer{ background:var(--nc-bg-2); }


/* ============================================================================
   PHASE 83 — WHITE-THEME FIXES FOR HARDCODED DARK SURFACES
   ----------------------------------------------------------------------------
   Every rule below fixes a defect that was MEASURED on the live site in White
   mode (element colour + effective background + WCAG ratio), not inferred from
   reading CSS. Two classes of defect were confirmed:

   1. Dark tiles whose text follows a token but whose background is a literal.
      `.nc-opt` and `.nc-preset` both hardcode `background:#151b3a` while their
      text is `var(--nc-text)`, so in White the ink flipped to #101a2c on a
      #151b3a tile — measured ratio 1.04 (effectively invisible), 16 elements on
      the deploy page and 4 on the wallet page.
      NOTE: the Phase 82 generated map could not catch these — that block is
      derived from index.php / nova-home.css / nova-console.css only, and
      `#151b3a` is not one of the mapped literals.

   2. Nova Proxies (`customer-proxies.php`) renders a whole private dark palette.
      It hand-writes its own <head>, links only nova-console.css, and its inline
      block declares its own :root plus hardcoded `.npc-*` gradients — so it never
      loaded the theme sheet and stayed fully dark even with data-theme="light".

   COLOUR-BEARING DECLARATIONS ONLY, and nothing here is applied unless
   html[data-theme="light"], so Original and Dark are untouched.
   ============================================================================ */

/* ---------- 1. configure option tiles + wallet quick-amount presets ---------- */
html[data-theme="light"] .nc-opt,
html[data-theme="light"] .nc-preset{
  background:#ffffff;
  border-color:var(--nc-line);
  color:var(--nc-text);
}
html[data-theme="light"] .nc-opt:hover,
html[data-theme="light"] .nc-preset:hover{
  border-color:rgba(106,68,240,.45);
  background:#fbfcfe;
}
html[data-theme="light"] .nc-opt.nc-on{
  border-color:var(--nc-purple);
  background:rgba(106,68,240,.10);
  box-shadow:0 0 0 3px rgba(106,68,240,.13);
}
html[data-theme="light"] .nc-preset.nc-on{
  border-color:var(--nc-purple);
  background:rgba(106,68,240,.12);
}
html[data-theme="light"] .nc-opt small{color:var(--nc-muted)}
html[data-theme="light"] .nc-opt:hover small,
html[data-theme="light"] .nc-opt.nc-on small{color:var(--nc-purple)}
html[data-theme="light"] .nc-opt .os-logo,
html[data-theme="light"] .nc-opt-os .os-logo{color:var(--nc-text);opacity:.9}
html[data-theme="light"] .nc-opt.nc-on .os-logo{color:var(--nc-purple);opacity:1}
html[data-theme="light"] .nc-opt.nc-off{opacity:.5}

/* ---------- 2. Nova Proxies page chrome (own dark palette) ---------- */
html[data-theme="light"] .npc-topbar{background:rgba(255,255,255,.92);border-bottom-color:var(--nc-line)}
html[data-theme="light"] .npc-mark{
  border-color:rgba(106,68,240,.45);
  background:linear-gradient(145deg,rgba(106,68,240,.16),rgba(47,111,224,.10));
  color:var(--nc-purple);
}
html[data-theme="light"] .npc-brand b{color:var(--nc-purple)}
html[data-theme="light"] .npc-account{color:var(--nc-muted)}
html[data-theme="light"] .npc-wallet{border-left-color:var(--nc-line)}
html[data-theme="light"] .npc-wallet strong{color:var(--nc-text)}
html[data-theme="light"] .npc-user{color:var(--nc-purple)}
html[data-theme="light"] .npc-sidebar{background:#fbfcfe;border-right-color:var(--nc-line)}
html[data-theme="light"] .npc-side-label{color:var(--nc-faint)}
html[data-theme="light"] .npc-nav a{color:var(--nc-text-2)}
html[data-theme="light"] .npc-nav a:hover{border-color:var(--nc-line);background:rgba(15,26,46,.04);color:var(--nc-text)}
html[data-theme="light"] .npc-nav a.active{
  border-color:rgba(106,68,240,.45);
  background:linear-gradient(105deg,rgba(106,68,240,.16),rgba(47,111,224,.07));
  color:var(--nc-text);
  box-shadow:0 8px 22px rgba(106,68,240,.10);
}
html[data-theme="light"] .npc-nav .ico{color:var(--nc-purple)}
html[data-theme="light"] .npc-side-help{
  border-color:rgba(106,68,240,.28);
  background:linear-gradient(145deg,rgba(106,68,240,.10),rgba(47,111,224,.06));
}
html[data-theme="light"] .npc-side-help span{color:var(--nc-muted)}
html[data-theme="light"] .npc-breadcrumb{color:var(--nc-faint)}
html[data-theme="light"] .npc-breadcrumb b{color:var(--nc-purple)}
html[data-theme="light"] .npc-kicker{color:var(--nc-purple)}
html[data-theme="light"] .npc-hero p{color:var(--nc-muted)}
html[data-theme="light"] .npc-outline{
  color:var(--nc-purple);border-color:var(--nc-line);background:rgba(15,26,46,.03);
}
html[data-theme="light"] .npc-outline:hover{border-color:rgba(106,68,240,.45);background:rgba(106,68,240,.08)}
html[data-theme="light"] .npc-stat{background:#ffffff;border-color:var(--nc-line)}
html[data-theme="light"] .npc-stat-label{color:var(--nc-faint)}
html[data-theme="light"] .npc-stat-value{color:var(--nc-text)}
html[data-theme="light"] .npc-stat-note{color:var(--nc-muted)}
html[data-theme="light"] .npc-location{background:#ffffff;border-color:var(--nc-line);color:var(--nc-text)}
html[data-theme="light"] .npc-location:hover,
html[data-theme="light"] .npc-location.active{
  border-color:rgba(106,68,240,.55);
  background:linear-gradient(145deg,rgba(106,68,240,.10),rgba(47,111,224,.05));
}
html[data-theme="light"] .npc-location-meta{color:var(--nc-muted)}
html[data-theme="light"] .npc-location-price{color:var(--nc-faint)}
html[data-theme="light"] .npc-location-price b{color:var(--nc-purple)}
html[data-theme="light"] .npc-filter-box{background:#ffffff;border-color:var(--nc-line)}
html[data-theme="light"] .npc-search{background:#f7f9fd;border-color:var(--nc-line);color:var(--nc-faint)}
html[data-theme="light"] .npc-search input{color:var(--nc-text)}
html[data-theme="light"] .npc-search input::placeholder{color:var(--nc-faint)}
html[data-theme="light"] .npc-filter-btn{background:rgba(15,26,46,.03);border-color:var(--nc-line);color:var(--nc-text-2)}
html[data-theme="light"] .npc-filter-btn:hover,
html[data-theme="light"] .npc-filter-btn.active{
  border-color:rgba(106,68,240,.5);background:rgba(106,68,240,.12);color:var(--nc-text);
}
html[data-theme="light"] .npc-result-row{color:var(--nc-muted)}
html[data-theme="light"] .npc-result-row b{color:var(--nc-purple)}
html[data-theme="light"] .npc-order{background:#ffffff;border-color:var(--nc-line)}
html[data-theme="light"] .npc-order h3{color:var(--nc-text)}
html[data-theme="light"] .npc-order-meta{color:var(--nc-muted)}
html[data-theme="light"] .npc-status{color:var(--nc-text-2);background:rgba(15,26,46,.04);border-color:var(--nc-line)}
html[data-theme="light"] .npc-expiry{color:var(--nc-text-2)}
html[data-theme="light"] .npc-cred{background:#f7f9fd;border-color:var(--nc-line)}
html[data-theme="light"] .npc-cred small{color:var(--nc-faint)}
html[data-theme="light"] .npc-cred code{color:var(--nc-text)}
html[data-theme="light"] .npc-small-btn{color:var(--nc-purple);border-color:var(--nc-line)}
html[data-theme="light"] .npc-small-btn:hover{border-color:rgba(106,68,240,.45);background:rgba(106,68,240,.08)}
html[data-theme="light"] .npc-order-notice{background:rgba(106,68,240,.08);color:var(--nc-text-2)}
html[data-theme="light"] .npc-modal{background:rgba(15,26,46,.45)}
html[data-theme="light"] .npc-modal-card{background:#ffffff;border-color:rgba(106,68,240,.35);color:var(--nc-text)}
html[data-theme="light"] .npc-modal-close{color:var(--nc-muted)}
html[data-theme="light"] .npc-modal-copy{color:var(--nc-muted)}
html[data-theme="light"] .npc-modal-row{border-bottom-color:var(--nc-line)}
html[data-theme="light"] .npc-modal-row span{color:var(--nc-muted)}
html[data-theme="light"] .npc-modal-row b{color:var(--nc-text)}
html[data-theme="light"] .npc-wallet-row{color:var(--nc-text-2);border-bottom-color:var(--nc-line)}
html[data-theme="light"] .npc-cancel{border-color:var(--nc-line);color:var(--nc-text-2)}
html[data-theme="light"] .npc-modal-foot{color:var(--nc-faint)}

/* ---------- 3. Hero/stat VALUES that kept a hardcoded white ink ----------
   Measurement class the generator could not see: these large value elements
   hardcode `color:#fff` while their card background is a GRADIENT whose stops the
   token layer re-points to white in White mode. The result is white text on a
   near-white card — measured ratio 1.07, i.e. the value is invisible. This is a
   different failure from #1 (there the ink went dark on a dark tile; here the ink
   stayed light on a light tile). Found by reading rendered values, not CSS:
     customer-wallet.php  #balanceVal        (the hero wallet balance)
     customer-billing.php .bl-stat-val   x4  (totals)
     customer-helpdesk.php .spt-stat-val x4  (ticket counts)
   Only these measured selectors are listed; the pattern may exist on pages that
   were not audited and is flagged for a follow-up pass. */
html[data-theme="light"] .bl-stat-val,
html[data-theme="light"] .spt-stat-val,
html[data-theme="light"] #balanceVal{ color:var(--nc-text); }

/* DELIBERATELY NOT OVERRIDDEN — `.npc-plan` and `.npc-support-card` keep their
   dark, per-plan accent treatment. Their inner text was NOT flagged by the live
   contrast audit (all of it measured >= 3.0), and their inner rules were not
   readable in this phase, so lightening those backgrounds could have turned
   readable text unreadable. Left as found and flagged for a follow-up pass. */

/* ============================================================================
   PHASE 83 — COMPACT ICON THEME CONTROL  (Original / Dark / White)
   ----------------------------------------------------------------------------
   Replaces the Phase 82 text-labelled rail with a small icon-only control:
   ~80 x 28 px, three icon stops, no visible label text, with a sliding knob.
   The markup and JS are UNCHANGED — nova-theme.js still builds three
   .nht-btn buttons carrying data-theme-value + aria-pressed; this file only
   restyles them, so the Phase 82 verified switching/persistence logic is intact.
   ============================================================================ */
.nht-host{display:inline-flex;align-items:center;flex:none;min-width:0}

.nht{
  position:relative;display:inline-flex;align-items:center;gap:2px;padding:2px;max-width:100%;
  border:1px solid var(--nc-line,#222c52);
  border-radius:999px;
  background:var(--nc-panel-2,#0d1329);
  -webkit-user-select:none;user-select:none
}

/* sliding knob: one 24px pill that travels between the three icon stops */
.nht::before{
  content:"";position:absolute;top:2px;left:2px;width:24px;height:24px;border-radius:999px;
  background:var(--nc-accent-grad,linear-gradient(135deg,#7c5cff,#4d8bff));
  box-shadow:0 3px 10px rgba(106,68,240,.32);
  transition:transform .22s cubic-bezier(.4,0,.2,1)
}
.nht:has(.nht-btn[data-theme-value="dark"][aria-pressed="true"])::before{transform:translateX(26px)}
.nht:has(.nht-btn[data-theme-value="light"][aria-pressed="true"])::before{transform:translateX(52px)}

.nht-btn{
  position:relative;z-index:1;flex:0 0 24px;width:24px;height:24px;padding:0;margin:0;
  display:grid;place-items:center;border:0;border-radius:999px;background:transparent;
  color:var(--nc-muted,#8590b4);cursor:pointer;font:inherit;
  transition:color .16s ease
}
.nht-btn i{font-style:normal;font-size:12px;line-height:1}
/* the Phase 82 labels are retired — the control is icon-only by request */
.nht-btn span{display:none!important}
/* :not([aria-pressed="true"]) — hover must never repaint the ACTIVE pill, or its
   white glyph would sit on a pale tint (the Phase 82 regression we must not reintroduce) */
.nht-btn:not([aria-pressed="true"]):hover{color:var(--nc-text,#eaf0ff)}
.nht-btn:focus-visible{outline:2px solid var(--nc-purple-2,#9d7dff);outline-offset:2px}
.nht-btn[aria-pressed="true"]{color:#fff}

/* graceful fallback where :has() is unsupported — the active stop paints itself */
@supports not selector(:has(*)){
  .nht::before{display:none}
  .nht-btn[aria-pressed="true"]{
    background:var(--nc-accent-grad,linear-gradient(135deg,#7c5cff,#4d8bff));
    box-shadow:0 3px 10px rgba(106,68,240,.32)
  }
}

/* per-theme chrome for the control itself */
html[data-theme="dark"] .nht{background:var(--nc-panel-2);border-color:var(--nc-line)}
html[data-theme="light"] .nht{background:#ffffff;border-color:var(--nc-line);box-shadow:0 1px 4px rgba(15,26,46,.06)}
html[data-theme="light"] .nht-btn{color:var(--nc-muted)}
html[data-theme="light"] .nht-btn:not([aria-pressed="true"]):hover{color:var(--nc-text)}
html[data-theme="light"] .nht-btn[aria-pressed="true"]{color:#fff}

/* ============================================================================
   PLACEMENT — TOP-RIGHT
   ----------------------------------------------------------------------------
   Home: the CTA keeps its right-edge anchor and the control sits immediately
   inside it, so no existing element moves. The CTA and the hamburger are wrapped
   together so exactly three grid children remain and the centred nav is untouched.
   Console: the control goes after the flexible spacer, i.e. in the right-hand
   group immediately left of the account chip, which stays right-most.
   ============================================================================ */
/* grid-column:3 is explicit on purpose. When <=860px hides .main-nav and the CTA,
   the grid would otherwise be left with only two children and .nav-right would
   auto-place into column 2 — which rode the control over the brand at 390px. */
.nav-right{display:flex;align-items:center;gap:12px;justify-self:end;grid-column:3;min-width:0}
.nav-left{display:flex;align-items:center;justify-self:start;min-width:0}
.nav-wrap .nav-left>.brand{justify-self:auto}

.nc-topbar .nht-host{flex:none;margin-left:0}
.nc-topbar-title{min-width:0}

/* Wrapping the CTA changed its ancestor, so the base sheet's
   `.nav-wrap > .nav-cta { display:none }` no longer matches. Restate it for the
   new path — this is what keeps the Phase 82 mobile fix (CTA hidden, hamburger
   shown) from regressing. Applies in every theme, so it has no theme prefix. */
@media (max-width:860px){
  .nav-wrap>.nav-right>.nav-cta{display:none}
}
@media (max-width:620px){
  .nav-right{gap:8px}
}
/* On very small screens the account chip alone is ~45% of the viewport, which
   pushed the control's centre past the mid-point. Giving the control the last
   flex slot keeps it in the top-right corner without touching the chip's styling. */
@media (max-width:560px){
  .nc-topbar .nht-host{order:3}
  .nc-topbar-user{order:2}
}
@media (prefers-reduced-motion:reduce){
  .nht::before{transition:none}
}

/* ============================================================================
   PHASE 87 — WHITE-MODE CARD SURFACES  (Nova VPS Direct · Rent VPS · Nova Proxies)
   ----------------------------------------------------------------------------
   PRESENTATION ONLY. Every rule below is scoped to html[data-theme="light"], so
   Original (absence of the attribute) and Dark (data-theme="dark") cannot match
   any of them. No layout, sizing, spacing, radius, font or transition property is
   restated anywhere in this block — colour-bearing declarations only — so every
   responsive rule in the page-local sheets keeps winning at its own breakpoint.

   WHY THIS BLOCK EXISTS. The forensic takeover established that the Phase 82-86
   theme layer themes every surface that reads the shared --nc-* token layer, and
   that these four surfaces do not read it: each declares its OWN page-local token
   set or hardcodes literals, so no Light token could ever reach it. The failure is
   a MISSING rule, not a misfiring one — which is why the fix is to re-point each
   page-local palette once, rather than to out-specify it element by element.

     1. browse-plans.php    `.pricing-section`  — Nova VPS Direct plan cards
        page-local palette (--card:rgba(18,18,28,.72), --text:#ffffff). Its h2
        carries no colour of its own, so it inherited #ffffff and rendered a white
        heading on the light page: 1.07:1, i.e. "Our Server Plans" was effectively
        absent.
     2. customer-proxies.php `.npc-plan`        — Nova Proxies plan cards
        card face is a literal #141024 -> #0a0814. Every ink inside derives from
        one per-plan --c/--c-rgb pair, so the card is re-pointable with a single
        variable per plan type.
     3. nhd-servers.php      `.nvd-scope`       — Nova VPS Direct "My Server" card
        page-local palette (--card:#101019, --text:#ffffff, --muted:#8b8b9e) plus
        a literal rgba(0,0,0,.32) credential tile that holds TOKEN ink — the one
        place where re-pointing the palette alone would create dark-on-dark.
     4. nhd-servers.php      nhd_rent_css()     — Rent VPS card + Manage Server card
        `.nc-srv:not(.nc-srv-plain)`, `.nc-rent*` and `.nc-mg-left .nc-ctrl`
        hardcode dark surfaces with #fff / #8b8b9e ink.
     5. auth-popup.css       `.auth-pop-guard-label` — the NOVA GUARD pill
        the Phase 82 Light rule re-pointed the ink but kept the dark 70%-opaque
        pill, which composites to #585d70 over the white popup: 1.40:1.

   RULES OF ENGAGEMENT APPLIED TO EVERY CARD
     * the card SURFACE becomes white/light;
     * TEXT KEEPS ITS EXISTING COLOUR wherever it still reads, and is re-pointed
       ONLY where the white surface would make it unreadable — never recoloured
       wholesale;
     * BUTTONS / CONTROLS KEEP THEIR BRAND COLOUR FAMILY. Where a plan accent was a
       *text* colour on the old dark face it is deepened by just enough to clear AA
       on white, which is also what keeps the white label on the same accent-filled
       CTA readable. No button is turned white and no accent is replaced by a
       neutral.
     * borders become the light hairline (--nc-line); shadows the restrained light
       depth. No giant shadows, no new gradients, no new colours.
   ============================================================================ */

/* ---------------------------------------------------------------------------
   87.1  NOVA VPS DIRECT — PLAN CARDS  (browse-plans.php .pricing-section)
   The section owns a local palette, so the fix is to re-point that palette. Each
   `.plan` reads `--accent` from one of the four hue variables, which is why
   deepening them fixes the pill, the price, the brand accent and the CTA fill in
   one move instead of element by element.
   Deepened hues on white: green 5.39 · purple 5.70 · blue 6.65 · pink 6.24 : 1
   White CTA label on mix(accent 88%, black 12%): 6.55 / 6.90 / 7.99 / 7.58 : 1
   --------------------------------------------------------------------------- */
html[data-theme="light"] .pricing-section{
  --bg:#f4f7fb; --bg-soft:#eef2f8;
  --card:rgba(255,255,255,.94);
  --stroke:rgba(15,26,46,.10);
  --text:#101a2c; --muted:#5a6982; --muted-2:#3f4f6b;
  --shadow:0 16px 40px rgba(15,26,46,.08);
  --green:#0a7a4b; --purple:#7c3aed; --blue:#1d4ed8; --pink:#be123c;
  color:var(--text);
}
/* ambient corner glows: kept (they are the section's identity) but taken to a
   pastel alpha so they read as light depth instead of dark smoke on a light page */
html[data-theme="light"] .pricing-section::before{background:radial-gradient(closest-side,rgba(162,89,255,.13),rgba(162,89,255,0) 78%)}
html[data-theme="light"] .pricing-section::after{background:radial-gradient(closest-side,rgba(61,155,255,.11),rgba(61,155,255,0) 78%)}

/* chrome that sat on rgba(255,255,255,.04) — invisible on white without a tint */
html[data-theme="light"] .pricing-section .eyebrow{background:rgba(15,26,46,.04);color:var(--muted-2)}
html[data-theme="light"] .pricing-section .toggle{background:rgba(15,26,46,.04)}
html[data-theme="light"] .pricing-section .toggle button:hover{color:var(--text)}

/* the card face itself; hover keeps the same restrained depth, only the accent
   bloom changes, so the card cannot appear to "lift" differently in White mode */
html[data-theme="light"] .pricing-section .plan{
  background:linear-gradient(180deg,rgba(255,255,255,.92) 0%,var(--card) 34%);
  box-shadow:var(--shadow),0 0 0 1px rgba(15,26,46,.02) inset,0 0 30px -14px color-mix(in srgb,var(--accent) 55%,transparent);
}
html[data-theme="light"] .pricing-section .plan:hover{
  box-shadow:var(--shadow),0 0 34px -12px color-mix(in srgb,var(--accent) 60%,transparent);
}
/* the ribbon keeps its accent fill but flips its label to white: the original
   near-black label (#04120a) on the deepened green would sit at 3.79:1 */
html[data-theme="light"] .pricing-section .ribbon{color:#fff}
/* the oversized IP value carried a wide accent glow, tuned for a near-black face */
html[data-theme="light"] .pricing-section .ip-value{text-shadow:0 0 22px color-mix(in srgb,var(--accent) 26%,transparent)}
html[data-theme="light"] .pricing-section .plans-empty{border-color:var(--nc-line)}

/* ---------------------------------------------------------------------------
   87.2  NOVA PROXIES — PLAN CARDS  (customer-proxies.php .npc-plan)
   The base pair is declared first so the four .t-* rules below it win. `--c2` (the
   CTA's second gradient stop) is deepened only on green, where the original
   #0fa84f left the white button label at 3.10:1; the other three stops already
   clear AA once `--c` is deepened.
   NOTE: `.npc-plan` also appears in browse-plans.php, but only in a comment (the
   Phase-83 note that deferred this work) — these rules are reached by the Nova
   Proxies cards only.
   --------------------------------------------------------------------------- */
html[data-theme="light"] .npc-plan{--c:#0a7a4b;--c-rgb:10,122,75;--c2:#0a804e}
html[data-theme="light"] .npc-plan.t-green{--c:#0a7a4b;--c-rgb:10,122,75;--c2:#0a804e}
html[data-theme="light"] .npc-plan.t-purple{--c:#7c3aed;--c-rgb:124,58,237;--c2:#6d28d9}
html[data-theme="light"] .npc-plan.t-blue{--c:#1d4ed8;--c-rgb:29,78,216;--c2:#1d4ed8}
html[data-theme="light"] .npc-plan.t-pink{--c:#be123c;--c-rgb:190,18,60;--c2:#be123c}
html[data-theme="light"] .npc-plan{
  background:linear-gradient(180deg,#ffffff,#f7f9fd);
  border-color:rgba(var(--c-rgb),.55);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 0 22px -8px rgba(var(--c-rgb),.26),0 12px 28px rgba(15,26,46,.08);
}
html[data-theme="light"] .npc-plan::before{background:radial-gradient(120% 62% at 50% -12%,rgba(var(--c-rgb),.10),transparent 62%)}
html[data-theme="light"] .npc-plan:hover{border-color:rgba(var(--c-rgb),.85);box-shadow:inset 0 1px 0 rgba(255,255,255,.9),0 0 30px -8px rgba(var(--c-rgb),.38),0 16px 32px rgba(15,26,46,.10)}
/* ink: only the literal dark-face colours are re-pointed; the accent-driven price,
   type badge and CTA keep following --c exactly as in Original and Dark */
html[data-theme="light"] .npc-plan h3{color:var(--nc-text)}
html[data-theme="light"] .npc-plan-group{color:var(--nc-muted)}
html[data-theme="light"] .npc-plan-location{color:var(--nc-text-2)}
html[data-theme="light"] .npc-plan-note{color:var(--nc-muted)}
html[data-theme="light"] .npc-plan-price small{color:var(--nc-muted)}
html[data-theme="light"] .npc-plan-price{text-shadow:0 0 18px rgba(var(--c-rgb),.28)}
html[data-theme="light"] .npc-type{text-shadow:none}
html[data-theme="light"] .npc-buy,
html[data-theme="light"] .npc-guest{box-shadow:0 8px 20px -8px rgba(var(--c-rgb),.55),inset 0 1px 0 rgba(255,255,255,.28)}
html[data-theme="light"] .npc-buy:hover,
html[data-theme="light"] .npc-guest:hover{box-shadow:0 10px 26px -8px rgba(var(--c-rgb),.7)}

/* ---------------------------------------------------------------------------
   87.3  NOVA VPS DIRECT — "MY SERVER" CARD  (nhd-servers.php .nvd-scope)
   Same shape as 87.1: re-point the page-local palette, then restate only what uses
   a literal. Semantic state colours (running / suspended / fault) keep their
   meaning, deepened for a white surface.
   --------------------------------------------------------------------------- */
html[data-theme="light"] .nvd-scope{
  --bg:#f4f7fb; --card:#ffffff;
  --stroke:rgba(15,26,46,.10); --stroke-2:rgba(15,26,46,.16);
  --text:#101a2c; --muted:#5a6982; --muted-2:#3f4f6b;
  --green:#0a7a4b; --purple:#7c3aed; --blue:#1d4ed8; --amber:#8a4f06; --red:#b21f42;
  color:var(--text);
}
html[data-theme="light"] .nvd-scope .srv{
  background:linear-gradient(180deg,rgba(61,155,255,.05),var(--card) 32%);
  border-color:var(--nc-line);
  box-shadow:0 16px 40px rgba(15,26,46,.08);
}
html[data-theme="light"] .nvd-scope .srv-icon{box-shadow:0 0 20px -12px rgba(10,122,75,.7)}
/* literal chip / badge surfaces that were translucent white on a dark face */
html[data-theme="light"] .nvd-scope .tag{background:rgba(15,26,46,.05);border-color:var(--nc-line)}
html[data-theme="light"] .nvd-scope .os-badge{color:var(--blue);background:rgba(61,155,255,.09);border-color:rgba(61,155,255,.34)}
/* The credential tile is THE trap: the base rule pairs a literal rgba(0,0,0,.32)
   surface with token ink (.cred-item .v inherits --text). Re-pointing --text for a
   white card without moving this surface would produce dark-on-dark, so both sides
   move together here. */
html[data-theme="light"] .nvd-scope .cred{background:rgba(11,107,65,.05);border-color:rgba(11,107,65,.22)}
html[data-theme="light"] .nvd-scope .cred-item{background:var(--nc-bg-2);border-color:var(--nc-line)}
html[data-theme="light"] .nvd-scope .cred-item .acts button{background:var(--nc-panel);border-color:var(--nc-line);color:var(--nc-text-2)}
html[data-theme="light"] .nvd-scope .cred-item .acts button:hover{color:var(--nc-text);border-color:var(--nc-purple)}
html[data-theme="light"] .nvd-scope .cred-item .acts button.ok{color:var(--green);border-color:rgba(11,107,65,.45);background:rgba(11,107,65,.10)}
/* quick actions: each action keeps its colour identity, the literal light blues
   (#8fc2ff / #c9a8ff) are re-pointed to the deepened brand hues, and the hover ink
   is no longer #fff — on a light tint that was invisible */
html[data-theme="light"] .nvd-scope .act{background:var(--nc-panel);border-color:var(--nc-line);color:var(--nc-text-2)}
html[data-theme="light"] .nvd-scope .act:hover:not(:disabled){color:var(--nc-text);border-color:var(--nc-purple)}
html[data-theme="light"] .nvd-scope .act.restart{color:var(--blue);background:rgba(61,155,255,.09);border-color:rgba(61,155,255,.34)}
html[data-theme="light"] .nvd-scope .act.pw{color:var(--purple);background:rgba(124,58,237,.08);border-color:rgba(124,58,237,.32)}
html[data-theme="light"] .nvd-scope .act.start{background:rgba(11,107,65,.08);border-color:rgba(11,107,65,.34)}
html[data-theme="light"] .nvd-scope .act.stop{background:rgba(138,79,6,.09);border-color:rgba(138,79,6,.34)}
html[data-theme="light"] .nvd-scope .act.danger{background:rgba(178,31,66,.08);border-color:rgba(178,31,66,.32)}
html[data-theme="light"] .nvd-scope .srv-foot .sep{background:#c3cbd9}
/* inline result / message strips: translucent white on white is invisible */
html[data-theme="light"] .nvd-scope .srv-msg{color:var(--nc-text-2);background:var(--nc-bg-2);border-color:var(--nc-line)}
html[data-theme="light"] .nvd-scope .srv-msg.err{color:var(--nc-red);background:var(--nc-red-bg);border-color:var(--nc-red-line)}
html[data-theme="light"] .nvd-scope .newpw button{background:var(--nc-panel);border-color:var(--nc-line);color:var(--nc-text-2)}
/* dialogs: the two .md-* panels keep their accent-filled primary buttons, but the
   panel surface and form controls must follow the light theme, and the two bright
   gradient CTAs are deepened only enough for their white label to read */
html[data-theme="light"] .nvd-scope .md-card{background:var(--nc-panel);border-color:var(--nc-line);color:var(--nc-text);box-shadow:0 30px 70px rgba(15,26,46,.22)}
html[data-theme="light"] .nvd-scope .md-card .md-sub{color:var(--nc-muted)}
html[data-theme="light"] .nvd-scope .md-field label{color:var(--nc-text-2)}
html[data-theme="light"] .nvd-scope .field{color:var(--nc-text);background:var(--nc-bg-2);border-color:var(--nc-line)}
html[data-theme="light"] .nvd-scope .field:focus{border-color:var(--nc-purple)}
html[data-theme="light"] .nvd-scope select.field option{background:#ffffff;color:var(--nc-text)}
html[data-theme="light"] .nvd-scope .md-note{color:var(--nc-muted)}
html[data-theme="light"] .nvd-scope .md-note.err{color:var(--nc-red)}
html[data-theme="light"] .nvd-scope .md-note.ok{color:var(--nc-green)}
html[data-theme="light"] .nvd-scope .md-warn{color:var(--nc-red);background:var(--nc-red-bg);border-color:var(--nc-red-line)}
html[data-theme="light"] .nvd-scope .md-btn.ghost{background:var(--nc-bg-2);color:var(--nc-text-2);border:1px solid var(--nc-line)}
html[data-theme="light"] .nvd-scope .md-btn.ghost:hover{background:var(--nc-line-soft)}
html[data-theme="light"] .nvd-scope .md-btn.go{background:linear-gradient(90deg,#1e40af,#2563eb)}
html[data-theme="light"] .nvd-scope .md-btn.bad{background:linear-gradient(90deg,#a3122b,#c2264a)}

/* ---------------------------------------------------------------------------
   87.4  RENT VPS — SERVER CARD + MANAGE SERVER CARD  (nhd-servers.php nhd_rent_css)
   The outer list card (.nc-srv without .nc-srv-plain), the embedded rental panel and
   the Manage Server action controls. The left status rail keeps its exact meaning
   (running / stopped / suspended / fault / deleted) — only its lightness is
   corrected for a white surface, and the two states that were translucent white
   become deliberate light greys so all five stay distinguishable.
   The `.nc-rent*` children are scoped under `.nc-rent` because nhd-create.php also
   renders a standalone `.nc-rent-note` (a purple-tinted info note) that must NOT be
   recoloured green by this block.
   --------------------------------------------------------------------------- */
html[data-theme="light"] .nc-srv:not(.nc-srv-plain){
  background:linear-gradient(180deg,rgba(61,155,255,.05),var(--nc-panel) 32%);
  border-color:var(--nc-line);
  box-shadow:0 16px 40px rgba(15,26,46,.08);
}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-running{border-left-color:var(--nc-green)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-stopped{border-left-color:#9aa6bd}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-suspended{border-left-color:var(--nc-orange)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-danger{border-left-color:var(--nc-red)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-deleted{border-left-color:#c3cbd9}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-ico{color:var(--nc-green);background:rgba(11,107,65,.08);border-color:rgba(11,107,65,.35);box-shadow:0 0 20px -12px rgba(11,107,65,.6)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-stopped .nc-srv-ico{color:var(--nc-muted);background:var(--nc-bg-2);border-color:var(--nc-line);box-shadow:none}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-suspended .nc-srv-ico{color:var(--nc-orange);background:rgba(138,79,6,.09);border-color:rgba(138,79,6,.35);box-shadow:none}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-danger .nc-srv-ico{color:var(--nc-red);background:rgba(178,31,66,.09);border-color:rgba(178,31,66,.4);box-shadow:none}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain).is-state-deleted .nc-srv-ico{color:var(--nc-faint);background:var(--nc-bg-2);border-color:var(--nc-line);box-shadow:none}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-name{color:var(--nc-text)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-spec{color:var(--nc-muted)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-chip{color:var(--nc-text-2);background:rgba(15,26,46,.04);border-color:var(--nc-line)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-col label,
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-rate label{color:var(--nc-faint)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-col b,
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-rate b{color:var(--nc-text)}
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-col small,
html[data-theme="light"] .nc-srv:not(.nc-srv-plain) .nc-srv-rate small{color:var(--nc-muted)}

/* rental panel: an inset surface, not a black slab on a white card */
html[data-theme="light"] .nc-rent{background:linear-gradient(160deg,rgba(106,68,240,.05),transparent),var(--nc-bg-2);border-color:var(--nc-line)}
html[data-theme="light"] .nc-rent .nc-rent-cap{color:var(--nc-purple)}
html[data-theme="light"] .nc-rent .nc-rent-chip{background:var(--nc-panel);border-color:var(--nc-line);color:var(--nc-text-2)}
html[data-theme="light"] .nc-rent .nc-rent-cell{background:var(--nc-panel);border-color:var(--nc-line)}
html[data-theme="light"] .nc-rent .nc-rent-cell label{color:var(--nc-faint)}
html[data-theme="light"] .nc-rent .nc-rent-cell b{color:var(--nc-text)}
html[data-theme="light"] .nc-rent .nc-rent-cell small{color:var(--nc-muted)}
html[data-theme="light"] .nc-rent .nc-rent-note{border-color:var(--nc-green-line);background:var(--nc-green-bg);color:var(--nc-green)}
html[data-theme="light"] .nc-rent .nc-rent-note span{color:var(--nc-text-2)}
html[data-theme="light"] .nc-rent .nc-rent-note.is-off{border-color:var(--nc-line);background:var(--nc-panel)}
html[data-theme="light"] .nc-rent .nc-rent-note.is-off b{color:var(--nc-muted)}
html[data-theme="light"] .nc-rent .nc-rent-warn{border-color:var(--nc-orange-line);background:var(--nc-orange-bg);color:var(--nc-orange)}
html[data-theme="light"] .nc-rent .nc-rent-warn span{color:var(--nc-text-2)}
html[data-theme="light"] .nc-rent .nc-rent-warn.is-bad{border-color:var(--nc-red-line);background:var(--nc-red-bg)}
html[data-theme="light"] .nc-rent .nc-rent-warn.is-bad,
html[data-theme="light"] .nc-rent .nc-rent-warn.is-bad b{color:var(--nc-red)}
html[data-theme="light"] .nc-rent .nc-rent-hint{color:var(--nc-faint)}

/* Manage Server action controls: per-action identity kept (start green · stop red ·
   restart blue · change-password purple · reinstall amber · delete red), restated on
   the light tinted-surface language. Disabled states keep a dimmed trace of their own
   meaning instead of the old washed-out ink on a dark fill, and the hover ink is no
   longer #fff, which was invisible on a light tint.
   NOTE: the Manage Server INNER CARD itself is `.nc-card`, which is already
   token-driven and correct in Light mode — it is deliberately not restated here. */
html[data-theme="light"] .nc-mg-left .nc-ctrl{background:var(--nc-panel);border-color:var(--nc-line);color:var(--nc-text-2);box-shadow:var(--nc-shadow-sm)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-start{background:var(--nc-green-bg);border-color:var(--nc-green-line);color:var(--nc-green)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-stop{background:var(--nc-red-bg);border-color:var(--nc-red-line);color:var(--nc-red)}
/* restart uses a deeper blue than --nc-blue: at #2f6fe0 on its own 8% tint it measured
   4.22:1, just under AA for a 12-13px control label */
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-restart{background:rgba(29,78,216,.08);border-color:rgba(29,78,216,.32);color:#1d4ed8}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-pw{background:rgba(106,68,240,.08);border-color:rgba(106,68,240,.30);color:var(--nc-purple)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-reinstall{background:var(--nc-orange-bg);border-color:var(--nc-orange-line);color:var(--nc-orange)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-delete{background:var(--nc-red-bg);border-color:var(--nc-red-line);color:var(--nc-red)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled):hover{color:var(--nc-text);transform:translateY(-1px)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-restart:hover{border-color:var(--nc-blue)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:not(:disabled).nc-ctrl-pw:hover{border-color:var(--nc-purple)}
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled{background:#f1f4f9;border-color:#e3e8f1;color:#9aa6bd;opacity:1}
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled.nc-ctrl-start{background:#eef7f2;border-color:#d3e9de;color:#7fa99a}
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled.nc-ctrl-stop,
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled.nc-ctrl-delete{background:#f9eef1;border-color:#f0d7dd;color:#b98b97}
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled.nc-ctrl-restart{background:#eef3fb;border-color:#d5e0f2;color:#8ba0bf}
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled.nc-ctrl-pw{background:#f2eefa;border-color:#ded5f5;color:#9c8cc0}
html[data-theme="light"] .nc-mg-left .nc-ctrl:disabled.nc-ctrl-reinstall{background:#fbf3e6;border-color:#f2e0c2;color:#b09468}

/* ---------------------------------------------------------------------------
   87.5  NOVA GUARD  (index.php login popup — .auth-pop-guard-label)
   The Phase 82 Light rule re-pointed the ink but kept the pill's own dark
   70%-opaque #101733 background. Composited over the white popup card that becomes
   an effective #585d70, and #7b56f5 on it measured 1.40:1 — the label was present
   and effectively invisible. The pill becomes a light lavender surface with the
   deeper brand ink: 6.55:1 on the pill, 7.58:1 on the card.
   The robot, the backdrop-filter glass and the dark scrim are all untouched — only
   this label's own surface and ink are restated.
   --------------------------------------------------------------------------- */
html[data-theme="light"] .auth-pop-guard-label{
  color:#5b34c8;
  background:rgba(106,68,240,.10);
  border:1px solid rgba(106,68,240,.32);
  box-shadow:0 0 16px rgba(106,68,240,.10),inset 0 1px 0 rgba(255,255,255,.65);
}


/* ============================================================================
   PHASE 92 â€” LIGHT-THEME SURFACES THAT HAD NO OVERRIDE AT ALL
   ----------------------------------------------------------------------------
   PRESENTATION ONLY. Every rule is scoped to html[data-theme="light"], so Original
   and Dark cannot match any of it. Nothing here changes layout, sizing, spacing or
   behaviour â€” colour/border/shadow declarations only.

   Each surface below was measured as DARK in Light mode because it had no light
   rule anywhere in the tree (forensic pass, Phase 92):

     1. .mobile-panel          index.php:477  background rgba(7,11,24,.97) + blur
                               index.php:479  item border rgba(255,255,255,.06)
        -> the existing light rule only re-inked the <a> text; the panel body,
           its border and its shadow were never repainted.
     2. #nhPageLoader          nova-loader.php:34-106   NO light rule anywhere.
        (up-nova-loader.php is DEAD â€” nothing includes it; the live loader is
         nova-loader.php, mounted by chatbot-widget.php:709 and
         nova-support-widget.php:433.)
     3. .cb-* (Configure&Buy)  browse-plans.php:419-472  NO light rule anywhere;
        .cb-modal declares color-scheme:dark and background:#101018.
     4. .feature-card          index.php:391  the dark backplate behind the
                               homepage cloud/rack â€” NO light rule anywhere.
        .infra-load track     index.php:412  track stayed dark.
     5. .auth-pop-overlay      auth-popup.css:9  backdrop had NO light rule; every
                               inner .auth-pop-* piece already had one.
   ============================================================================ */

/* ---- 1. mobile navigation drawer ------------------------------------------ */
html[data-theme="light"] .mobile-panel{border-color:var(--nc-line,#dfe5ef);background:rgba(255,255,255,.97);box-shadow:0 24px 60px rgba(15,26,46,.14)}
html[data-theme="light"] .mobile-panel a{border-bottom-color:rgba(15,26,46,.07)}

/* ---- 2. global page loader (#nhPageLoader) ------------------------------- */
html[data-theme="light"] #nhPageLoader{background:radial-gradient(circle at 50% 44%,rgba(124,92,255,.10),transparent 62%),rgba(244,247,251,.95)}
html[data-theme="light"] #nhPageLoader .nhl-tag{color:var(--nc-faint,#616c86)}
html[data-theme="light"] #nhPageLoader .nhl-ring::after{background:radial-gradient(circle,rgba(124,92,255,.16) 0%,rgba(77,139,255,.05) 46%,transparent 70%)}
html[data-theme="light"] #nhPageLoader .nhl-track{stroke:rgba(124,92,255,.16)}
html[data-theme="light"] #nhPageLoader .nhl-head i{background:var(--nc-purple-2,#673fdd);box-shadow:0 0 10px var(--nc-purple-2,#673fdd),0 0 24px rgba(124,92,255,.55)}
html[data-theme="light"] #nhPageLoader .nhl-pct{color:var(--nc-text,#101a2c);text-shadow:0 0 20px rgba(157,125,255,.35)}
html[data-theme="light"] #nhPageLoader .nhl-pct span{opacity:.55}
html[data-theme="light"] #nhPageLoader .nhl-status{color:var(--nc-text-2,#3f4f6b)}
html[data-theme="light"] #nhPageLoader .nhl-status i{background:var(--nc-green,#0b6b41);box-shadow:0 0 10px rgba(11,107,65,.42)}
html[data-theme="light"] #nhPageLoader .nhl-steps i{background:rgba(124,92,255,.16)}
html[data-theme="light"] #nhPageLoader .nhl-steps i.on{background:linear-gradient(90deg,var(--nc-purple,#6a44f0),var(--nc-blue,#1d4ed8));box-shadow:0 0 10px rgba(124,92,255,.45)}
html[data-theme="light"] #nhPageLoader .nhl-steps i.cur{background:linear-gradient(90deg,var(--nc-purple-2,#673fdd),var(--nc-blue,#1d4ed8));box-shadow:0 0 14px rgba(157,125,255,.55)}

/* ---- 3. Nova VPS Direct "Configure and Buy" popup ------------------------ */
html[data-theme="light"] .cb-overlay{background:rgba(15,26,46,.42)}
html[data-theme="light"] .cb-modal{--stroke2:rgba(15,26,46,.12);color-scheme:light;background:linear-gradient(180deg,#ffffff,#fbfcfe);border-color:var(--nc-line,#dfe5ef);box-shadow:0 30px 70px rgba(15,26,46,.20);color:var(--nc-text,#101a2c)}
html[data-theme="light"] .cb-modal h3{color:var(--nc-text,#101a2c)}
html[data-theme="light"] .cb-sub{color:var(--nc-faint,#616c86)}
html[data-theme="light"] .cb-status{color:#1f5fd0;background:rgba(47,111,224,.10);border-color:rgba(47,111,224,.30)}
html[data-theme="light"] .cb-spec{background:#f7f9fd;border-color:var(--nc-line,#dfe5ef)}
html[data-theme="light"] .cb-spec span{color:var(--nc-faint,#616c86)}
html[data-theme="light"] .cb-label{color:var(--nc-text-2,#3f4f6b)}
html[data-theme="light"] .cb-os-select{background:linear-gradient(180deg,rgba(11,107,65,.10),#ffffff);border-color:rgba(11,107,65,.35);color:var(--nc-text,#101a2c);color-scheme:light}
html[data-theme="light"] .cb-os-select option{background:#ffffff;color:var(--nc-text,#101a2c)}
html[data-theme="light"] .cb-os-select option:checked{background:#e8eefe;color:var(--nc-text,#101a2c)}
html[data-theme="light"] .cb-wallet{background:var(--nc-green-bg,#e6f7ef);border-color:var(--nc-green-line,#b9e6d2)}
html[data-theme="light"] .cb-wallet span{color:var(--nc-text-2,#3f4f6b)}
html[data-theme="light"] .cb-walcheck span{color:var(--nc-text,#101a2c)}
html[data-theme="light"] .cb-walsplit{color:var(--nc-text-2,#3f4f6b)}
html[data-theme="light"] .cb-walsplit b{color:var(--nc-text,#101a2c)}
html[data-theme="light"] .cb-hint{color:var(--nc-faint,#616c86)}
html[data-theme="light"] .cb-price-note{color:var(--nc-faint,#616c86)}
html[data-theme="light"] .cb-btn.back{background:#f1f4f9;color:var(--nc-text-2,#3f4f6b)}
html[data-theme="light"] .cb-btn.back:hover{background:#e7ecf5}
/* the pay CTA keeps its blue identity; the stops are deepened so the white label
   clears AA (the light stop #6fb4ff measured 2.1:1 against white) */
html[data-theme="light"] .cb-btn.pay{background:linear-gradient(90deg,#1d4ed8,#2563eb);box-shadow:0 12px 30px rgba(29,78,216,.35)}

/* ---- 4. homepage cloud/rack backplate ------------------------------------ */
html[data-theme="light"] .feature-card{border-color:var(--nc-line,#dfe5ef);background:linear-gradient(145deg,#ffffff,#f7f9fd)}
html[data-theme="light"] .infra-gridplane{border-color:rgba(124,92,255,.13);background-image:linear-gradient(rgba(124,92,255,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(124,92,255,.07) 1px,transparent 1px)}
html[data-theme="light"] .infra-load{background:rgba(15,26,46,.07)}

/* ---- 5. auth popup backdrop --------------------------------------------- */
html[data-theme="light"] .auth-pop-overlay{background:radial-gradient(ellipse 75% 60% at 50% 35%,rgba(124,92,255,.30),rgba(15,26,46,.52) 70%)}
/* ---- 6. Rent VPS Light-theme repairs --------------------------------------
   Two Rent VPS surfaces hardcode dark literals, so they kept a dark look in the
   Light ("White") theme. Both are repaired here, by the same method already used
   for sections 1-5 above (.mobile-panel, #nhPageLoader, .cb-*, .feature-card,
   .auth-pop-overlay): every rule is scoped to html[data-theme="light"], so
   Original (no data-theme attribute) and Dark (data-theme="dark") are untouched.

   Every rule below maps to one proven defect. Nothing here is polish.

   6a. "Your Server is Ready" completion screen
       Declared inline in nhd-create.php (<style>, "ready screen" block).
       #readyScreen is a FULL-VIEWPORT fixed overlay painting background
       #020a12: a near-black slab over an otherwise white page, which drops the
       dark --nc-text ink to 1.14:1. .rdy-row .nc-copy pins background #151b3a,
       and .rdy-card keeps a 40%-black drop shadow. The remaining .rdy-* rules
       already read --nc-* tokens, so they re-ink themselves once the slab is
       repainted. Nothing here touches #provScreen (the terminal), the terminal
       helpers, any keyframe, any timing or any geometry.

   6b. Console modal form controls
       Declared in nova-console.css. .nc-input / .nc-select paint background
       #080d1e, so the typed-DELETE confirmation box renders black with
       --nc-text on top: 1.11:1, i.e. invisible. .nc-modal-err paints #ffb3c1 on
       the Light --nc-red-bg tint: 1.48:1. .nc-modal-bg is a 78%-black scrim and
       .nc-btn-danger:hover is a dark-maroon literal. These are the controls of
       the Rent VPS "Delete Server" confirmation.
   ============================================================================ */

/* ---- 6a. Rent VPS "Your Server is Ready" completion screen ---------------- */
html[data-theme="light"] #readyScreen{
    background:
        radial-gradient(circle at 50% 8%, rgba(11,107,65,.06), transparent 42%),
        linear-gradient(180deg,#ffffff 0%,var(--nc-bg,#f4f7fb) 100%);
}
html[data-theme="light"] .rdy-card{
    box-shadow:0 18px 46px rgba(15,26,46,.10);
}
html[data-theme="light"] .rdy-row .nc-copy{
    background:#eef2f9;
    border-color:var(--nc-line,#dfe5ef);
    color:var(--nc-text-2,#3f4f6b);
}
html[data-theme="light"] .rdy-row .nc-copy:hover{
    border-color:var(--nc-purple,#6a44f0);
    color:var(--nc-purple-2,#673fdd);
}

/* ---- 6b. Console modal form controls -------------------------------------- */
html[data-theme="light"] .nc-input,
html[data-theme="light"] .nc-select{
    background:#ffffff;
    border-color:var(--nc-line,#dfe5ef);
    color:var(--nc-text,#101a2c);
    color-scheme:light;
}
html[data-theme="light"] .nc-input::placeholder{
    color:var(--nc-faint,#616c86);
    opacity:1;
}
html[data-theme="light"] .nc-input:focus,
html[data-theme="light"] .nc-select:focus{
    border-color:var(--nc-purple,#6a44f0);
    box-shadow:0 0 0 3px rgba(124,92,255,.14);
}
html[data-theme="light"] .nc-modal-bg{
    background:rgba(15,26,46,.42);
}
html[data-theme="light"] .nc-modal-err{
    color:var(--nc-red,#b21f42);
}
html[data-theme="light"] .nc-btn-danger:hover{
    background:#fbdde4;
}
