/* JOVE NMS skin v3 — Ant Design (ChirpStack) reskinned to the xOS admin design system.
   LIGHT by default (post-login), DARK via the injected theme selector (html.jove-dark).
   The LOGIN route is always the dark xOS mirror. Injected via nginx sub_filter. */

/* ===== shared: buttons, card punch, KPIs, tables, dashboard sizing (both themes) ===== */
.ant-btn{ border-radius:9px !important; }
.ant-btn-primary{ background:linear-gradient(180deg,#4fb2f4,#1683d4) !important; border-color:#1683d4 !important; color:#04121e !important; font-weight:600; }
.ant-btn-primary:hover{ filter:brightness(1.07); }
a{ color:#1683d4; }
.ant-card{ position:relative; overflow:hidden; border-radius:14px !important; }
.ant-card::before{ content:""; position:absolute; top:0; left:0; right:0; height:1px; background:linear-gradient(90deg,transparent,#2fa1ee,transparent); opacity:.55; z-index:1; }
.ant-statistic-content, .ant-statistic-content-value{ font-family:ui-monospace,"SF Mono",Menlo,Consolas,monospace !important; font-variant-numeric:tabular-nums; }
.ant-statistic-title{ text-transform:uppercase; letter-spacing:.08em; font-size:11px !important; }
.ant-table-thead>tr>th{ text-transform:uppercase; letter-spacing:.06em; font-size:11px !important; font-family:ui-monospace,Menlo,Consolas,monospace !important; }
.dashboard-chart{ max-width:230px !important; margin:0 auto !important; }
.dashboard-chart canvas{ max-height:190px !important; }
.leaflet-container{ min-height:640px !important; border-radius:14px; }

/* logo: dark artwork sits on the light header as-is; inverts to white in dark theme */
img.logo{ height:26px !important; width:auto !important; display:block !important; }
html:not(.jove-dark) img.logo{ filter:none !important; }
.jove-logo{ display:none !important; }

/* theme selector (injected into the header) */
.jove-theme-toggle{ display:inline-flex; align-items:center; gap:7px; cursor:pointer; user-select:none;
  border:1px solid #d3d9e2; background:#fff; color:#57606d; border-radius:999px; padding:5px 12px;
  font:600 11px/1 ui-monospace,Menlo,Consolas,monospace; letter-spacing:.1em; text-transform:uppercase; margin-left:14px; }
.jove-theme-toggle .dot{ width:8px; height:8px; border-radius:50%; background:#f0b429; box-shadow:0 0 8px rgba(240,180,41,.6); }

/* ===== LIGHT (default) — xOS light polish ===== */
.ant-layout, .ant-layout-content{ background:#f4f6f9 !important; }
.ant-layout-header{ background:#fff !important; border-bottom:1px solid #e5e9ef !important; box-shadow:0 1px 0 rgba(22,131,212,.06); }
.ant-card{ background:#fff !important; border:1px solid #e5e9ef !important; box-shadow:0 12px 34px -22px rgba(20,45,80,.28) !important; }
.ant-statistic-content{ color:#106aad !important; }
.ant-statistic-title{ color:#57606d !important; }
.ant-menu-item-selected{ background:#e6f1fb !important; box-shadow:inset 3px 0 0 #1683d4; }

/* ===== DARK (html.jove-dark) — full dark xOS ===== */
html.jove-dark .ant-layout, html.jove-dark .ant-layout-content{ background:#070b12 !important; color:#e8ecf2; }
html.jove-dark .ant-layout-header{ background:linear-gradient(135deg,#0a1526,#070b12) !important; border-bottom:1px solid #212832 !important; }
html.jove-dark img.logo{ filter:brightness(0) invert(1) drop-shadow(0 0 12px rgba(47,161,238,.5)) !important; }
html.jove-dark .ant-layout-sider, html.jove-dark .ant-menu, html.jove-dark .ant-menu-sub, html.jove-dark .ant-menu-root{ background:#13171e !important; }
html.jove-dark .ant-menu-item, html.jove-dark .ant-menu-submenu-title, html.jove-dark .ant-menu-item a{ color:#8793a6 !important; }
html.jove-dark .ant-menu-item-selected, html.jove-dark .ant-menu-item-active{ background:#14263a !important; color:#fff !important; box-shadow:inset 3px 0 0 #2fa1ee; }
html.jove-dark .ant-menu-item-selected a{ color:#fff !important; }
html.jove-dark .ant-card, html.jove-dark .ant-modal-content, html.jove-dark .ant-modal-header, html.jove-dark .ant-drawer-content, html.jove-dark .ant-drawer-header{ background:#13171e !important; color:#e8ecf2 !important; border-color:#212832 !important; }
html.jove-dark .ant-card{ box-shadow:0 24px 60px -34px rgba(0,0,0,.85) !important; }
html.jove-dark .ant-card-head{ color:#e8ecf2 !important; border-color:#212832 !important; background:linear-gradient(180deg,rgba(47,161,238,.06),transparent) !important; }
html.jove-dark .ant-typography, html.jove-dark h1, html.jove-dark h2, html.jove-dark h3, html.jove-dark h4, html.jove-dark .ant-breadcrumb a{ color:#e8ecf2 !important; }
html.jove-dark .ant-breadcrumb, html.jove-dark .ant-breadcrumb-separator, html.jove-dark .ant-statistic-title{ color:#8793a6 !important; }
html.jove-dark .ant-statistic-content{ color:#78b6f0 !important; }
html.jove-dark .ant-table{ background:#13171e !important; color:#e8ecf2 !important; }
html.jove-dark .ant-table-thead>tr>th{ background:#1a2130 !important; color:#8793a6 !important; border-color:#212832 !important; }
html.jove-dark .ant-table-tbody>tr>td{ background:transparent !important; border-color:#212832 !important; color:#e8ecf2 !important; }
html.jove-dark .ant-table-tbody>tr:hover>td{ background:#14263a !important; }
html.jove-dark .ant-btn-default{ background:#1a2130 !important; border-color:#2b323e !important; color:#e8ecf2 !important; }
html.jove-dark .ant-input, html.jove-dark .ant-input-affix-wrapper, html.jove-dark .ant-input-number, html.jove-dark .ant-select-selector, html.jove-dark .ant-picker{ background:rgba(8,12,20,.6) !important; border-color:#212832 !important; color:#e8ecf2 !important; }
html.jove-dark .ant-input::placeholder{ color:#5b6576 !important; }
html.jove-dark .ant-leaflet-container, html.jove-dark .leaflet-container{ border:1px solid #212832; }
.jove-dark .jove-theme-toggle{ border-color:#2b323e; background:#13171e; color:#8793a6; }
.jove-dark .jove-theme-toggle .dot{ background:#63b3ff; box-shadow:0 0 8px rgba(99,179,255,.7); }

/* ===== kill the yellow autofill (both themes) ===== */
html.jove-dark input:-webkit-autofill, html.jove-dark input:-webkit-autofill:hover, html.jove-dark input:-webkit-autofill:focus,
html.jove-dark .ant-input:-webkit-autofill{
  -webkit-box-shadow:0 0 0 1000px rgba(8,12,20,.92) inset !important; -webkit-text-fill-color:#e8ecf2 !important; caret-color:#2fa1ee !important;
  transition:background-color 99999s ease-out 0s !important; }
html:not(.jove-dark):not(.jove-login) input:-webkit-autofill{ -webkit-box-shadow:0 0 0 1000px #fff inset !important; -webkit-text-fill-color:#0e1319 !important;
  transition:background-color 99999s ease-out 0s !important; }

/* ===== LOGIN — always the dark xOS operator-console mirror ===== */
#jove-net{ position:fixed; inset:0; z-index:0; display:none; }
.jove-vignette{ display:none; position:fixed; inset:0; z-index:1; pointer-events:none;
  background:radial-gradient(120% 90% at 50% 40%, transparent 42%, rgba(3,5,9,.5) 78%, rgba(3,5,9,.9) 100%); }
html.jove-login, html.jove-login body, html.jove-login .ant-layout, html.jove-login .ant-layout-content{ background:#05070c !important; }
html.jove-login .ant-layout-header, html.jove-login .ant-layout-sider, html.jove-login .ant-layout-footer, html.jove-login .jove-theme-toggle{ display:none !important; }
html.jove-login #jove-net{ display:block; }
html.jove-login .jove-vignette{ display:block; }
html.jove-login .ant-card, html.jove-login form.ant-form{
  position:relative; z-index:2; max-width:404px; margin:0 auto; padding:38px 34px 30px !important;
  background:rgba(16,22,34,.62) !important; border:1px solid rgba(120,150,190,.14) !important; border-radius:18px !important;
  backdrop-filter:blur(18px) saturate(1.2); -webkit-backdrop-filter:blur(18px) saturate(1.2);
  box-shadow:0 40px 120px -30px rgba(0,0,0,.8), inset 0 1px 0 rgba(255,255,255,.05) !important; }
html.jove-login img.logo{ filter:brightness(0) invert(1) drop-shadow(0 0 14px rgba(47,161,238,.55)) !important; }
.jove-login-brand{ text-align:center; margin:2px 0 0; }
.jove-login-brand img{ height:30px; filter:brightness(0) invert(1) drop-shadow(0 0 14px rgba(47,161,238,.55)); }
.jove-eyebrow{ text-align:center; font:600 10px/1 ui-monospace,Menlo,Consolas,monospace; letter-spacing:.34em; text-transform:uppercase; color:#2fa1ee; margin:16px 0 22px; }
.jove-hud{ position:fixed; top:20px; left:22px; z-index:3; display:none; align-items:center; gap:9px; font:600 11px/1 ui-monospace,Menlo,Consolas,monospace; letter-spacing:.12em; text-transform:uppercase; color:#8793a6; }
html.jove-login .jove-hud{ display:flex; }
.jove-hud .live{ width:7px; height:7px; border-radius:50%; background:#31d17a; box-shadow:0 0 0 3px rgba(49,209,122,.16),0 0 12px rgba(49,209,122,.8); animation:jovepulse 2.4s infinite; }
@keyframes jovepulse{ 0%{box-shadow:0 0 0 0 rgba(49,209,122,.5)} 70%{box-shadow:0 0 0 10px rgba(49,209,122,0)} 100%{box-shadow:0 0 0 0 rgba(49,209,122,0)} }
html.jove-login .ant-input, html.jove-login .ant-input-affix-wrapper, html.jove-login .ant-input-password{
  background:rgba(8,12,20,.6) !important; border:1px solid rgba(120,150,190,.14) !important; border-radius:10px !important; color:#e8ecf2 !important; padding:11px 12px !important; }
html.jove-login .ant-input-affix-wrapper .ant-input{ background:transparent !important; border:0 !important; padding:2px 0 !important; }
html.jove-login .ant-input-affix-wrapper:focus-within, html.jove-login .ant-input:focus{
  border-color:#2fa1ee !important; box-shadow:0 0 0 3px rgba(47,161,238,.14),0 0 22px -6px rgba(47,161,238,.55) !important; }
html.jove-login .ant-form-item-label>label{ color:#8793a6 !important; font:600 10px/1 ui-monospace,Menlo,Consolas,monospace; letter-spacing:.22em; text-transform:uppercase; height:auto; }
html.jove-login .ant-btn-primary{
  width:100% !important; border:0 !important; border-radius:11px !important; padding:14px !important; height:auto !important;
  font:600 12px/1 ui-monospace,Menlo,Consolas,monospace !important; letter-spacing:.2em !important; text-transform:uppercase !important;
  color:#04121e !important; background:linear-gradient(180deg,#4fb2f4,#1683d4) !important;
  box-shadow:0 10px 30px -8px rgba(47,161,238,.55), inset 0 1px 0 rgba(255,255,255,.35) !important; }

/* login: force dark inputs (beat antd white + autofill), remove the nested box, drop the asterisk */
html.jove-login input, html.jove-login .ant-input, html.jove-login .ant-input-affix-wrapper, html.jove-login .ant-input-password{
  background:rgba(8,12,20,.6) !important; color:#e8ecf2 !important; }
html.jove-login input:-webkit-autofill{ -webkit-box-shadow:0 0 0 1000px rgba(8,12,20,.95) inset !important; -webkit-text-fill-color:#e8ecf2 !important; caret-color:#2fa1ee !important; transition:background-color 99999s ease-out 0s !important; }
html.jove-login .ant-form, html.jove-login .ant-form-vertical, html.jove-login .ant-card .ant-card, html.jove-login .ant-card > .ant-card-body > div:first-child:not(.jove-login-brand):not(.jove-eyebrow){ background:transparent !important; }
html.jove-login .ant-card .ant-card, html.jove-login .ant-form > div[style*="border"]{ border:0 !important; box-shadow:none !important; }
html.jove-login .ant-form-item-required::before, html.jove-login .ant-form-item-required::after{ display:none !important; }
html.jove-login .ant-input-password-icon, html.jove-login .anticon{ color:#8793a6 !important; }
.jove-hide{ display:none !important; }
.jove-login-foot{ text-align:center; margin-top:18px; font:600 10px/1.4 ui-monospace,Menlo,Consolas,monospace; letter-spacing:.2em; text-transform:uppercase; color:#5b6576; }

/* login: FORCE vertical form — label ABOVE full-width input (fixes label-covered-by-input + makes the card portrait) */
html.jove-login .ant-form-item{ display:block !important; margin:0 0 18px !important; }
html.jove-login .ant-form-item-row{ display:block !important; margin:0 !important; }
html.jove-login .ant-form-item-label{ display:block !important; width:auto !important; max-width:100% !important; text-align:left !important; padding:0 0 7px !important; white-space:normal !important; flex:none !important; }
html.jove-login .ant-form-item-control{ display:block !important; width:100% !important; max-width:100% !important; flex:0 0 100% !important; }
html.jove-login .ant-form-item-control-input, html.jove-login .ant-form-item-control-input-content{ width:100% !important; }
html.jove-login .ant-input, html.jove-login .ant-input-affix-wrapper{ width:100% !important; box-sizing:border-box !important; }
/* exactly one card — flatten any inner container */
html.jove-login .ant-card .ant-card, html.jove-login .ant-card-body > .ant-card, html.jove-login .ant-card-body > div[class*="ant-card"]{ background:transparent !important; border:0 !important; box-shadow:none !important; max-width:100% !important; padding:0 !important; margin:0 !important; }
html.jove-login .ant-card-body{ padding:0 !important; }

/* ===== LOGIN: exact xOS LoginGate replica (overlay that drives the real ChirpStack form) ===== */
.xoslg{position:fixed;top:0;left:0;right:0;bottom:0;width:100vw;height:100vh;z-index:99999;--ink:#eaf1f8;--muted:#8793a6;--faint:#5b6576;--azure:#2fa1ee;--azure-deep:#1683d4;--azure-glow:rgba(47,161,238,.55);--line:rgba(120,150,190,.14);--card:rgba(16,22,34,.62);--mono:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Consolas,monospace;--sans:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;background:#05070c;color:var(--ink);font-family:var(--sans);overflow:hidden;-webkit-font-smoothing:antialiased;}
.xoslg *{box-sizing:border-box;}
.xoslg #net{position:absolute;inset:0;width:100%;height:100%;display:block;z-index:0;}
.xoslg .vignette{position:absolute;inset:0;z-index:1;pointer-events:none;background:radial-gradient(120% 90% at 50% 40%, transparent 40%, rgba(3,5,9,.55) 78%, rgba(3,5,9,.9) 100%);}
.xoslg .scan{position:absolute;inset:0;z-index:1;pointer-events:none;opacity:.35;background:repeating-linear-gradient(180deg, transparent 0 3px, rgba(120,160,210,.025) 3px 4px);}
.xoslg .hud{position:absolute;top:0;left:0;right:0;z-index:3;display:flex;align-items:center;justify-content:space-between;padding:16px 24px;font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);}
.xoslg .hud .l{display:flex;align-items:center;gap:9px;}
.xoslg .hud .live{width:7px;height:7px;border-radius:50%;background:#31d17a;box-shadow:0 0 0 3px rgba(49,209,122,.16),0 0 12px rgba(49,209,122,.8);animation:xoslgpulse 2.4s infinite;}
@keyframes xoslgpulse{0%,100%{opacity:1}50%{opacity:.45}}
.xoslg .stage{position:relative;z-index:2;width:100vw;height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;}
.xoslg .card{width:404px;max-width:92vw;flex:none;background:var(--card);border:1px solid var(--line);border-radius:18px;backdrop-filter:blur(18px) saturate(1.2);-webkit-backdrop-filter:blur(18px) saturate(1.2);box-shadow:0 40px 120px -30px rgba(0,0,0,.8), inset 0 1px 0 rgba(255,255,255,.05);padding:38px 34px 30px;position:relative;overflow:hidden;}
.xoslg .card::before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--azure),transparent);opacity:.7;}
.xoslg .logo{height:30px;width:auto;display:block;margin:2px auto 0;filter:brightness(0) invert(1) drop-shadow(0 0 14px var(--azure-glow));}
.xoslg .eyebrow{margin:20px 0 26px;text-align:center;font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--azure);}
.xoslg .eyebrow .sep{color:var(--faint);margin:0 8px;}
.xoslg .field{margin-bottom:15px;}
.xoslg .field label{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);margin-bottom:7px;}
.xoslg .field .box{display:flex;align-items:center;gap:10px;background:rgba(8,12,20,.6);border:1px solid var(--line);border-radius:10px;padding:0 12px;transition:border-color .18s, box-shadow .18s;}
.xoslg .field .box:focus-within{border-color:var(--azure);box-shadow:0 0 0 3px rgba(47,161,238,.14),0 0 22px -6px var(--azure-glow);}
.xoslg .field .box svg{color:var(--faint);flex:none;}
.xoslg .field input{flex:1;background:transparent;border:0;outline:0;color:var(--ink);font-family:var(--sans);font-size:14px;padding:12px 0;}
.xoslg .field input::placeholder{color:var(--faint);}
.xoslg .field input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #0a0f18 inset !important;-webkit-text-fill-color:var(--ink) !important;caret-color:var(--azure);transition:background-color 99999s ease-out 0s !important;}
.xoslg .field .eye{color:var(--faint);cursor:pointer;background:none;border:0;padding:4px;display:flex;}
.xoslg .err{display:block;font-size:12.5px;color:#ff8f8f;background:rgba(255,90,90,.09);border:1px solid rgba(255,90,90,.28);border-radius:9px;padding:9px 12px;margin-bottom:12px;text-align:center;}
.xoslg .btn{width:100%;border:0;border-radius:11px;padding:14px;cursor:pointer;font-family:var(--mono);font-size:12px;letter-spacing:.2em;text-transform:uppercase;font-weight:600;color:#04121e;background:linear-gradient(180deg,#4fb2f4,var(--azure-deep));box-shadow:0 10px 30px -8px var(--azure-glow), inset 0 1px 0 rgba(255,255,255,.35);transition:transform .12s, box-shadow .18s;}
.xoslg .btn:hover{transform:translateY(-1px);}
.xoslg .cardfoot{margin-top:20px;text-align:center;font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--faint);}
.xoslg .tagline{position:absolute;bottom:18px;left:0;right:0;z-index:3;text-align:center;font-family:var(--mono);font-size:10px;letter-spacing:.24em;text-transform:uppercase;color:var(--faint);}
