/* ==========================================================================
   KaloKar Control — admin console
   Carries the panel's own visual language (near-black ground, brass accent,
   Space Grotesk / Inter / JetBrains Mono) into a denser, operational layout.
   ========================================================================== */

/* ==========================================================================
   Fonts

   Bundled, not fetched. The panel used to pull three families from
   fonts.googleapis.com on every page load, which meant a licence console that
   did not render correctly without a connection and told a third party every
   time somebody opened it. `font-src 'self'` in the CSP now makes an external
   font request fail rather than silently succeed.

   Space Grotesk and Inter are not in assets/fonts/ yet — see the README there
   for the one command. Until they are, these resolve to local() or to the
   system fallback, and nothing goes over the network either way.
   ========================================================================== */
@font-face{
  font-family:'JetBrains Mono';
  src:local('JetBrains Mono'), local('JetBrainsMono-Regular'),
      url('fonts/JetBrainsMono-Regular.woff') format('woff');
  font-weight:400; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'JetBrains Mono';
  src:local('JetBrains Mono Bold'), local('JetBrainsMono-Bold'),
      url('fonts/JetBrainsMono-Bold.woff') format('woff');
  font-weight:500 700; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Space Grotesk';
  src:local('Space Grotesk Medium'), local('SpaceGrotesk-Medium'),
      url('fonts/SpaceGrotesk-Medium.woff2') format('woff2'),
      url('fonts/SpaceGrotesk-Medium.woff') format('woff'),
      url('fonts/SpaceGrotesk-Medium.ttf') format('truetype');
  font-weight:500; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Space Grotesk';
  src:local('Space Grotesk SemiBold'), local('SpaceGrotesk-SemiBold'),
      url('fonts/SpaceGrotesk-SemiBold.woff2') format('woff2'),
      url('fonts/SpaceGrotesk-SemiBold.woff') format('woff'),
      url('fonts/SpaceGrotesk-SemiBold.ttf') format('truetype');
  font-weight:600; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Space Grotesk';
  src:local('Space Grotesk Bold'), local('SpaceGrotesk-Bold'),
      url('fonts/SpaceGrotesk-Bold.woff2') format('woff2'),
      url('fonts/SpaceGrotesk-Bold.woff') format('woff'),
      url('fonts/SpaceGrotesk-Bold.ttf') format('truetype');
  font-weight:700; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Inter';
  src:local('Inter Regular'), local('Inter-Regular'),
      url('fonts/Inter-Regular.woff2') format('woff2'),
      url('fonts/Inter-Regular.woff') format('woff'),
      url('fonts/Inter-Regular.ttf') format('truetype');
  font-weight:400; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Inter';
  src:local('Inter Medium'), local('Inter-Medium'),
      url('fonts/Inter-Medium.woff2') format('woff2'),
      url('fonts/Inter-Medium.woff') format('woff'),
      url('fonts/Inter-Medium.ttf') format('truetype');
  font-weight:500; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Inter';
  src:local('Inter SemiBold'), local('Inter-SemiBold'),
      url('fonts/Inter-SemiBold.woff2') format('woff2'),
      url('fonts/Inter-SemiBold.woff') format('woff'),
      url('fonts/Inter-SemiBold.ttf') format('truetype');
  font-weight:600; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Inter';
  src:local('Inter Bold'), local('Inter-Bold'),
      url('fonts/Inter-Bold.woff2') format('woff2'),
      url('fonts/Inter-Bold.woff') format('woff'),
      url('fonts/Inter-Bold.ttf') format('truetype');
  font-weight:700; font-style:normal; font-display:swap;
}

:root{
  --void:#060807;
  --surface:#100e0b;
  --raised:#191512;
  --sunk:#0b0a08;
  --line:rgba(242,245,243,.08);       /* was .09; .07 in the panel. One value now */
  --line-hi:rgba(242,245,243,.16);

  --ink:#f2f5f3;
  --ink-2:rgba(242,245,243,.62);      /* was .66; .55 in the panel */
  --ink-3:rgba(242,245,243,.44);

  --brass:#b0946f;
  --brass-lit:#d3bb99;
  --brass-dim:rgba(176,148,111,.16);

  --live:#6fcf97;
  --hold:#e3b04b;
  --dead:#ff6b62;

  /* ---- scale ----
     Identical to the panel's, name for name and value for value. That is the
     whole of what makes two separate codebases look like one product. */
  --r-1:8px; --r-2:10px; --r-3:12px; --r-4:16px; --r-pill:999px;
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:20px; --s-6:24px; --s-7:32px;
  --t-fast:.12s; --t-base:.16s; --t-slow:.22s;
  --lh-1:1.25; --lh-2:1.35; --lh-3:1.55; --lh-4:1.75;

  /* Kept: existing rules reference these by name. --r-sm was 9px here and 10px
     in the panel, for the same kind of control. */
  --r-lg:var(--r-4); --r-md:var(--r-3); --r-sm:var(--r-1);
  /* The same three stacks as the extension, ending on faces that are already
     installed rather than on a generic. */
  --font-h:'Space Grotesk','Inter','Segoe UI',system-ui,-apple-system,'Helvetica Neue',sans-serif;
  --font-ui:'Inter','Segoe UI',system-ui,-apple-system,'Helvetica Neue',sans-serif;
  --font-m:'JetBrains Mono','Cascadia Mono','SF Mono',Consolas,'Liberation Mono',monospace;

  --rail:236px;
}

*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}

html{-webkit-text-size-adjust:100%}
body{
  min-height:100vh;
  background:var(--void) radial-gradient(1200px 780px at 78% -18%, #15110c, #060807) fixed;
  color:var(--ink);
  font:400 14px/1.55 var(--font-ui);
  -webkit-font-smoothing:antialiased;
}

a{color:var(--brass-lit);text-decoration:none}
a:hover{text-decoration:underline}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}
input,select,textarea{font:inherit;color:inherit}
table{border-collapse:collapse;width:100%}
svg{flex:none}

:focus-visible{outline:2px solid var(--brass-lit);outline-offset:2px;border-radius:8px}

.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

.mono{font-family:var(--font-m);font-variant-ligatures:none}
.mute{color:var(--ink-3)}
.nowrap{white-space:nowrap}

/* --------------------------------------------------------------------------
   Shell
   -------------------------------------------------------------------------- */
.shell{display:grid;grid-template-columns:var(--rail) minmax(0,1fr);min-height:100vh}

.rail{
  position:sticky;top:0;align-self:start;height:100vh;
  display:flex;flex-direction:column;gap:6px;
  padding:20px 14px;
  background:linear-gradient(180deg,#141210,#0d0b09 60%,#0a0908);
  border-right:1px solid var(--line);
}
.brand{display:flex;align-items:center;gap:10px;padding:2px 8px 18px}
.brand-mark{
  width:30px;height:30px;border-radius:8px;display:grid;place-items:center;flex:none;
  background:radial-gradient(120% 120% at 30% 24%, #e2cda9, #b8a488 46%, #8a7154);
  color:#0a0908;font:700 11px/1 var(--font-h);letter-spacing:.02em;
}
.brand-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.brand-name{font:700 15px/1 var(--font-h)}
.brand-sub{font-size:11px;color:var(--ink-3)}

.nav{display:flex;flex-direction:column;gap:2px}
.nav-group{margin-top:14px;padding:0 10px 6px;font-size:11px;color:var(--ink-3);letter-spacing:.02em}
.nav a{
  display:flex;align-items:center;gap:10px;
  padding:8px 10px;border-radius:var(--r-sm);
  color:var(--ink-2);font-weight:500;text-decoration:none;
  border-left:2px solid transparent;
}
.nav a:hover{background:rgba(242,245,243,.05);color:var(--ink);text-decoration:none}
.nav a[aria-current="page"]{
  background:var(--brass-dim);color:var(--brass-lit);
  border-left-color:var(--brass);font-weight:600;
}
.nav a svg{color:currentColor;opacity:.85}
.nav .n-count{margin-left:auto;font:600 11px/1 var(--font-m);color:var(--ink-3)}
.nav a[aria-current="page"] .n-count{color:var(--brass-lit)}

.rail-foot{margin-top:auto;padding-top:16px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:8px}
.who{display:flex;align-items:center;gap:8px;padding:0 6px}
.who-ava{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;flex:none;
  background:var(--raised);border:1px solid var(--line-hi);font:600 11px/1 var(--font-h);color:var(--brass-lit)}
.who-txt{min-width:0}
.who-name{font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.who-role{font-size:11px;color:var(--ink-3)}

.main{min-width:0;padding:26px clamp(16px,3vw,34px) 64px}
.wrap{max-width:1180px;margin:0 auto}

/* --------------------------------------------------------------------------
   Page head
   -------------------------------------------------------------------------- */
.phead{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:22px}
.phead h1{font:600 26px/1.25 var(--font-h);letter-spacing:-.015em}
.phead p{color:var(--ink-2);margin-top:6px;max-width:62ch}
.phead .spacer{margin-left:auto}
.phead-actions{display:flex;gap:8px;flex-wrap:wrap}

/* --------------------------------------------------------------------------
   Service state band — the one loud element in the console
   -------------------------------------------------------------------------- */
.band{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border:1px solid var(--line-hi);border-radius:var(--r-lg);overflow:hidden;
  background:linear-gradient(180deg,#161310,#0e0c0a);
  margin-bottom:14px;
}
.band.is-degraded{border-color:rgba(227,176,75,.5);box-shadow:0 0 0 1px rgba(227,176,75,.14)}
.band.is-down{border-color:rgba(255,107,98,.55);box-shadow:0 0 0 1px rgba(255,107,98,.16)}

.band-cell{padding:16px 18px;border-right:1px solid var(--line);display:flex;flex-direction:column;gap:8px}
.band-cell:last-child{border-right:0}
.band-k{font-size:12px;color:var(--ink-3)}
.band-v{display:flex;align-items:center;gap:8px;font:600 15px/1.25 var(--font-h)}
.band-dot{width:9px;height:9px;border-radius:50%;flex:none;background:var(--live);
  box-shadow:0 0 0 3px rgba(111,207,151,.16)}
.band-dot.is-hold{background:var(--hold);box-shadow:0 0 0 3px rgba(227,176,75,.16)}
.band-dot.is-dead{background:var(--dead);box-shadow:0 0 0 3px rgba(255,107,98,.16)}
.band-note{font-size:12px;color:var(--ink-3)}

.band-alert{
  display:flex;gap:12px;align-items:flex-start;
  padding:12px 16px;margin-bottom:22px;border-radius:var(--r-md);
  background:rgba(227,176,75,.09);border:1px solid rgba(227,176,75,.32);color:#f3dfb4;
}
.band-alert.is-down{background:rgba(255,107,98,.09);border-color:rgba(255,107,98,.34);color:#ffcdc9}
.band-alert strong{font-weight:600}

/* --------------------------------------------------------------------------
   Metrics strip
   -------------------------------------------------------------------------- */
.metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));
  gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r-md);
  overflow:hidden;margin-bottom:26px}
.metric{background:var(--surface);padding:14px 16px}
.metric dt{font-size:12px;color:var(--ink-3);margin-bottom:6px}
.metric dd{font:600 22px/1 var(--font-h);letter-spacing:-.02em}
.metric dd small{font:500 12px/1 var(--font-ui);color:var(--ink-3);margin-left:6px}
.metric.is-warn dd{color:var(--hold)}
.metric.is-bad dd{color:var(--dead)}

/* --------------------------------------------------------------------------
   Slabs — content sections
   -------------------------------------------------------------------------- */
.slab{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);margin-bottom:20px}
.slab-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:16px 18px;border-bottom:1px solid var(--line)}
.slab-head h2{font:600 15px/1.25 var(--font-h)}
.slab-head p{font-size:12.5px;color:var(--ink-3);width:100%}
.slab-head .spacer{margin-left:auto}
.slab-body{padding:18px}
.slab-body.is-flush{padding:0}
.grid-2{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px}

/* --------------------------------------------------------------------------
   Tables — reflow to stacked rows on narrow screens
   -------------------------------------------------------------------------- */
table.data{font-size:13.5px}
table.data th{
  text-align:left;font:600 12px/1 var(--font-ui);color:var(--ink-3);
  padding:12px 16px;border-bottom:1px solid var(--line);white-space:nowrap;background:var(--sunk);
}
table.data th a{color:inherit}
table.data td{padding:12px 16px;border-bottom:1px solid var(--line);vertical-align:middle}
table.data tbody tr:last-child td{border-bottom:0}
table.data tbody tr:hover{background:rgba(242,245,243,.025)}
table.data td.num,table.data th.num{text-align:right;font-family:var(--font-m)}
table.data td.act{text-align:right;white-space:nowrap}
.row-key{font:600 13px/1 var(--font-m);color:var(--brass-lit);letter-spacing:.01em}
.row-sub{display:block;font-size:12px;color:var(--ink-3);margin-top:4px}

.empty{padding:44px 20px;text-align:center}
.empty h3{font:600 15px/1.35 var(--font-h);margin-bottom:6px}
.empty p{color:var(--ink-3);max-width:44ch;margin:0 auto 16px}

/* --------------------------------------------------------------------------
   Chips
   -------------------------------------------------------------------------- */
.chip{display:inline-flex;align-items:center;gap:6px;padding:4px 10px 4px 8px;border-radius:999px;
  font-size:12px;font-weight:600;white-space:nowrap;
  background:rgba(242,245,243,.06);border:1px solid var(--line-hi);color:var(--ink-2)}
.chip i{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.chip-live{background:rgba(111,207,151,.12);border-color:rgba(111,207,151,.34);color:#8fe0b0}
.chip-hold{background:rgba(227,176,75,.12);border-color:rgba(227,176,75,.34);color:#f0c96f}
.chip-dead{background:rgba(255,107,98,.12);border-color:rgba(255,107,98,.36);color:#ff9089}
.chip-brass{background:var(--brass-dim);border-color:rgba(176,148,111,.4);color:var(--brass-lit)}

.count{display:inline-block;min-width:22px;padding:1px 8px;border-radius:999px;
  background:var(--brass-dim);color:var(--brass-lit);font:600 11.5px/1.55 var(--font-m);text-align:center}
.count.is-zero{background:rgba(242,245,243,.06);color:var(--ink-3)}

/* --------------------------------------------------------------------------
   Buttons
   -------------------------------------------------------------------------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:8px 16px;border-radius:var(--r-sm);
  font:600 13px/1 var(--font-ui);
  background:var(--raised);border:1px solid var(--line-hi);color:var(--ink);
  transition:background .16s ease,border-color .16s ease,color .16s ease;
}
.btn:hover{background:#221d18;border-color:rgba(242,245,243,.26);text-decoration:none}
.btn:active{transform:translateY(1px)}
.btn[disabled],.btn.is-off{opacity:.45;pointer-events:none}

.btn-primary{background:var(--brass);border-color:var(--brass);color:#100e0b}
.btn-primary:hover{background:var(--brass-lit);border-color:var(--brass-lit)}
.btn-danger{background:rgba(255,107,98,.1);border-color:rgba(255,107,98,.4);color:#ff9089}
.btn-danger:hover{background:rgba(255,107,98,.18);border-color:rgba(255,107,98,.6)}
.btn-sm{padding:6px 12px;font-size:12.5px}
.btn-ghost{background:transparent;border-color:transparent;color:var(--ink-2)}
.btn-ghost:hover{background:rgba(242,245,243,.06);color:var(--ink)}

.btn-row{display:flex;gap:8px;flex-wrap:wrap}
form.inline{display:inline}

/* --------------------------------------------------------------------------
   Forms
   -------------------------------------------------------------------------- */
.field{margin-bottom:16px}
.field > label,.lbl{display:block;font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:6px}
.hint{font-size:12px;color:var(--ink-3);margin-top:6px}

.inp,select.inp,textarea.inp{
  width:100%;padding:10px 12px;border-radius:var(--r-sm);
  background:var(--sunk);border:1px solid var(--line-hi);color:var(--ink);
  transition:border-color .16s ease,background .16s ease;
}
.inp:hover{border-color:rgba(242,245,243,.24)}
.inp:focus{outline:none;border-color:var(--brass);background:#0e0c0a;box-shadow:0 0 0 3px rgba(176,148,111,.16)}
.inp::placeholder{color:var(--ink-3)}
.inp[aria-invalid="true"]{border-color:var(--dead)}
textarea.inp{min-height:110px;resize:vertical;line-height:1.55}
select.inp{
  appearance:none;-webkit-appearance:none;padding-right:34px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23b0946f' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;
}
.field-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px}

.check{display:flex;align-items:flex-start;gap:10px;padding:8px 0;cursor:pointer}
.check input{width:17px;height:17px;margin-top:1px;accent-color:var(--brass);flex:none;cursor:pointer}
.check span{font-size:13.5px}
.check em{display:block;font-style:normal;font-size:12px;color:var(--ink-3);margin-top:2px}

.filters{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end}
.filters .field{margin:0;min-width:150px}
.filters .grow{flex:1;min-width:200px}

/* Quota / progress bar */
.qwrap{display:flex;align-items:center;gap:10px;min-width:150px}
.qbar{flex:1;height:6px;border-radius:999px;background:rgba(242,245,243,.09);overflow:hidden;min-width:60px}
.qbar span{display:block;height:100%;border-radius:999px}
.q-live{background:var(--brass)}
.q-hold{background:var(--hold)}
.q-dead{background:var(--dead)}
.qtext{font-size:12px;color:var(--ink-2);white-space:nowrap}

/* --------------------------------------------------------------------------
   Key reveal — the one moment a licence key is visible
   -------------------------------------------------------------------------- */
.keyout{
  border:1px solid rgba(176,148,111,.45);border-radius:var(--r-md);
  background:linear-gradient(180deg,rgba(176,148,111,.12),rgba(176,148,111,.04));
  padding:20px;margin-bottom:22px;
}
.keyout h2{font:600 15px/1.25 var(--font-h);margin-bottom:6px}
.keyout p{font-size:13px;color:var(--ink-2);margin-bottom:14px;max-width:60ch}
.keyval{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.keyval code{
  flex:1;min-width:230px;padding:12px 16px;border-radius:var(--r-sm);
  background:var(--sunk);border:1px solid var(--line-hi);
  font:600 16px/1 var(--font-m);letter-spacing:.06em;color:var(--brass-lit);
  overflow-x:auto;white-space:nowrap;
}

/* --------------------------------------------------------------------------
   Flash + toast
   -------------------------------------------------------------------------- */
.flashes{display:flex;flex-direction:column;gap:8px;margin-bottom:20px}
.flash{display:flex;gap:12px;align-items:flex-start;padding:12px 16px;border-radius:var(--r-md);font-size:13.5px}
.flash-success{background:rgba(111,207,151,.1);border:1px solid rgba(111,207,151,.32);color:#a5e6c0}
.flash-error{background:rgba(255,107,98,.1);border:1px solid rgba(255,107,98,.34);color:#ffa9a3}
.flash-info{background:rgba(176,148,111,.11);border:1px solid rgba(176,148,111,.34);color:var(--brass-lit)}

/* --------------------------------------------------------------------------
   Confirm dialog
   -------------------------------------------------------------------------- */
dialog.confirm{
  border:1px solid var(--line-hi);border-radius:var(--r-lg);padding:0;
  background:linear-gradient(180deg,#181512,#100e0c);color:var(--ink);
  width:min(420px,calc(100vw - 32px));box-shadow:0 30px 80px rgba(0,0,0,.6);
}
dialog.confirm::backdrop{background:rgba(3,4,4,.72)}
.confirm-body{padding:22px}
.confirm-body h2{font:600 16px/1.35 var(--font-h);margin-bottom:8px}
.confirm-body p{color:var(--ink-2);font-size:13.5px}
.confirm-foot{display:flex;gap:8px;justify-content:flex-end;padding:14px 22px;border-top:1px solid var(--line)}

/* --------------------------------------------------------------------------
   Pager
   -------------------------------------------------------------------------- */
.pager{display:flex;align-items:center;gap:14px;padding:14px 18px;border-top:1px solid var(--line)}
.pg{font-size:13px;font-weight:600}
.pg.is-off{color:var(--ink-3)}
.pg-at{margin-left:auto;font-size:12.5px;color:var(--ink-3)}

/* --------------------------------------------------------------------------
   Definition list (licence detail)
   -------------------------------------------------------------------------- */
.dl{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px 20px;font-size:13.5px}
.dl dt{color:var(--ink-3)}
.dl dd{text-align:right;min-width:0}
/* A value that must stay on one line — a long IPv6 address — ends in an
   ellipsis inside its card instead of widening it. The full value is in the
   title and is still what a copy picks up. */
.dl dd.clip{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.timeline{list-style:none;display:flex;flex-direction:column}
.timeline li{display:grid;grid-template-columns:auto 1fr;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);font-size:13px}
.timeline li:last-child{border-bottom:0}
.timeline .t-when{color:var(--ink-3);font-size:12px;white-space:nowrap}

/* --------------------------------------------------------------------------
   Login
   -------------------------------------------------------------------------- */
.gate{min-height:100vh;display:grid;place-items:center;padding:20px}
.gate-card{
  width:min(392px,100%);padding:34px 30px;border-radius:var(--r-lg);
  background:linear-gradient(180deg,#151210,#0e0d0b 58%,#0b0a08);
  border:1px solid var(--line);box-shadow:0 26px 70px rgba(0,0,0,.55);
}
.gate-card .brand{justify-content:center;padding-bottom:22px}
.gate-card h1{font:600 19px/1.25 var(--font-h);text-align:center;margin-bottom:6px}
.gate-card .gate-sub{text-align:center;color:var(--ink-3);font-size:13px;margin-bottom:24px}
.gate-card .btn{width:100%;margin-top:6px;padding:12px}

/* --------------------------------------------------------------------------
   Responsive
   -------------------------------------------------------------------------- */
@media (max-width:1020px){
  .shell{grid-template-columns:1fr}
  .rail{
    position:sticky;top:0;z-index:40;height:auto;flex-direction:row;align-items:center;gap:4px;
    padding:10px 12px;border-right:0;border-bottom:1px solid var(--line);
    overflow-x:auto;scrollbar-width:none;
  }
  .rail::-webkit-scrollbar{display:none}
  .brand{padding:0 12px 0 2px;flex:none}
  .brand-sub{display:none}
  .nav{flex-direction:row;gap:2px;flex:none}
  .nav-group{display:none}
  .nav a{border-left:0;border-bottom:2px solid transparent;border-radius:var(--r-sm);white-space:nowrap;padding:8px 12px}
  .nav a[aria-current="page"]{border-left:0;border-bottom-color:var(--brass)}
  .nav .n-count{margin-left:6px}
  .rail-foot{margin:0 0 0 auto;padding:0 0 0 12px;border-top:0;border-left:1px solid var(--line);flex:none}
  .who-txt{display:none}
  .main{padding:20px 16px 56px}
}

@media (max-width:820px){
  .phead h1{font-size:22px}
  .band-cell{border-right:0;border-bottom:1px solid var(--line)}
  .band-cell:last-child{border-bottom:0}

  /* Tables become stacked records. Each cell carries its own label, so no
     horizontal scrolling and no truncated licence keys on a phone. */
  table.data thead{display:none}
  table.data,table.data tbody,table.data tr,table.data td{display:block;width:100%}
  table.data tr{padding:14px 16px;border-bottom:1px solid var(--line)}
  table.data tr:last-child{border-bottom:0}
  table.data td{
    border:0;padding:4px 0;display:grid;grid-template-columns:minmax(96px,34%) 1fr;
    gap:12px;align-items:center;
  }
  table.data td::before{
    content:attr(data-label);font-size:12px;color:var(--ink-3);font-weight:500;
  }
  table.data td.act,table.data td.num{text-align:left}
  table.data td.act{padding-top:12px;display:flex;justify-content:flex-start}
  table.data td.act::before{display:none}
  table.data td:first-child{padding-bottom:10px}
  .dl{grid-template-columns:minmax(0,1fr);gap:2px 0}
  .dl dt{margin-top:10px}
  .dl dd{text-align:left}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;transition-duration:.001ms !important}
  .btn:active{transform:none}
}

@media print{
  .rail,.phead-actions,.btn,.pager{display:none}
  body{background:#fff;color:#000}
}

/* --------------------------------------------------------------------------
   Dropdowns

   The panel's own list, carrying the same face as the one in the Premiere
   panel. The native <select> underneath keeps its styling above — with
   scripting off that is what renders, and it has to stay presentable.
   -------------------------------------------------------------------------- */

/* The real control, clipped the way `.sr` clips a label: out of sight, still
   in the form, still what gets posted. */
.dd-native{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
  opacity:0;pointer-events:none;
}

.dd{position:relative}

/* Deliberately the same shape as `.inp`: a field that behaves differently
   should not look like a different kind of field. */
.dd-btn{
  width:100%;display:flex;align-items:center;gap:8px;
  padding:10px 12px;border-radius:var(--r-sm);
  background:var(--sunk);border:1px solid var(--line-hi);color:var(--ink);
  text-align:left;cursor:pointer;
  transition:border-color .16s ease,background .16s ease,box-shadow .16s ease;
}
.dd-btn:hover:not(:disabled){border-color:rgba(242,245,243,.24)}
.dd-btn:disabled{opacity:.5;cursor:not-allowed}
.dd-btn:focus-visible{
  outline:none;border-color:var(--brass);background:#0e0c0a;
  box-shadow:0 0 0 3px rgba(176,148,111,.16);
}
.dd.dd-open > .dd-btn{
  border-color:var(--brass);background:#0e0c0a;
  box-shadow:0 0 0 3px rgba(176,148,111,.16);
}

.dd-val{
  flex:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* A placeholder option — "— choose a licence —" — reads as instruction, not as
   an answer, so it is dimmed until something is actually picked. */
.dd.is-empty > .dd-btn .dd-val{color:var(--ink-3)}

.dd-chev{flex:none;color:var(--brass);transition:transform .16s ease}
.dd.dd-open .dd-chev{transform:rotate(180deg)}

/* Small mono chip, for an option that carries a short token as well as a name.
   Set data-code on the <option> to use it. */
.dd-code{
  flex:none;font:600 10px/1 var(--font-m);letter-spacing:.06em;
  color:var(--brass-lit);background:var(--brass-dim);
  border:1px solid rgba(176,148,111,.22);border-radius:8px;padding:4px 6px;
}
.dd-code[hidden]{display:none}

/* ---- the list ---- */
.dd-menu{
  position:absolute;z-index:60;top:calc(100% + 6px);left:0;right:0;
  min-width:100%;overflow-y:auto;overscroll-behavior:contain;
  background:var(--raised);border:1px solid var(--line-hi);
  border-radius:var(--r-md);padding:6px;
  box-shadow:0 22px 54px rgba(0,0,0,.62), 0 0 0 1px rgba(0,0,0,.35);
  animation:ddin .16s ease;
}
.dd-menu[hidden]{display:none}
.dd.dd-up .dd-menu{top:auto;bottom:calc(100% + 6px);animation:ddup .16s ease}

@keyframes ddin{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:none}}
@keyframes ddup{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}

.dd-search{
  position:sticky;top:-5px;z-index:2;background:var(--raised);
  padding:2px 2px 6px;margin:-1px -1px 4px;
}
.dd-search input{
  width:100%;padding:8px 10px;border-radius:var(--r-sm);
  background:var(--sunk);border:1px solid var(--line);color:var(--ink);
  font-size:13px;
}
.dd-search input::placeholder{color:var(--ink-3)}
.dd-search input:focus{outline:none;border-color:rgba(176,148,111,.5)}

.dd-opt{
  width:100%;display:flex;align-items:center;gap:8px;
  padding:8px 10px;border-radius:var(--r-sm);
  color:var(--ink-2);font-size:13.5px;text-align:left;cursor:pointer;
  transition:background .12s ease,color .12s ease;
}
.dd-opt[hidden]{display:none}
.dd-opt:hover,.dd-opt:focus{background:rgba(242,245,243,.06);color:var(--ink);outline:none}
.dd-opt:focus-visible{outline:none;box-shadow:inset 0 0 0 1px rgba(176,148,111,.45)}
.dd-opt[aria-selected="true"]{color:var(--ink);font-weight:500}
.dd-opt:disabled{opacity:.4;cursor:not-allowed}
.dd-opt:disabled:hover{background:none}

.dd-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.dd-hint{
  flex:none;font-size:11.5px;color:var(--ink-3);
  padding-left:8px;white-space:nowrap;
}

.dd-chk{flex:none;color:var(--brass-lit);display:none;line-height:0}
.dd-opt[aria-selected="true"] .dd-chk{display:block}

.dd-empty{
  padding:14px 10px;font-size:12.5px;color:var(--ink-3);
  text-align:center;display:none;
}

/* In a filter bar the control is one of several on a row, so it keeps the
   row's height rather than the form field's breathing room. */
.filters .dd{min-width:150px}

@media (prefers-reduced-motion: reduce){
  .dd-menu{animation:none}
  .dd-chev{transition:none}
}

/* --------------------------------------------------------------------------
   Account security — enrolment, codes, recovery
   -------------------------------------------------------------------------- */

/* A code field is read back digit by digit off a phone screen, so it is set
   wide and monospaced rather than at body size. */
.code-inp{
  font:600 19px/1 var(--font-m);letter-spacing:.32em;
  text-align:center;padding:12px 12px;
}
/* The sign-in box takes a recovery code too — fourteen characters where the
   common case is six. Tighten rather than overflow. */
.code-inp:not(:placeholder-shown){font-size:17px;letter-spacing:.18em}
.code-inp::placeholder{letter-spacing:.32em;color:rgba(242,245,243,.18)}

.gate-card .btn-ghost{margin-top:10px;width:100%}

/* ---- enrolment ---- */
.steps{list-style:none;counter-reset:step}
.steps > li{
  position:relative;counter-increment:step;
  padding:0 0 26px 40px;border-left:1px solid var(--line);
  margin-left:12px;
}
.steps > li:last-child{border-left-color:transparent;padding-bottom:0}
.steps > li::before{
  content:counter(step);
  position:absolute;left:-13px;top:-2px;
  width:26px;height:26px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font:600 12px/1 var(--font-m);
  color:var(--brass-lit);background:var(--surface);
  border:1px solid rgba(176,148,111,.35);
}
.steps h3{font:600 14.5px/1.35 var(--font-h);margin-bottom:4px}

.qr-row{display:flex;gap:22px;flex-wrap:wrap;align-items:flex-start;margin-top:16px}

.qr{
  flex:none;width:212px;height:212px;
  display:flex;align-items:center;justify-content:center;
  padding:8px;border-radius:var(--r-md);
  background:#d8d4cd;border:1px solid var(--line-hi);
}
.qr svg{display:block;width:100%;height:100%}
.qr .hint{color:#3b372f;text-align:center;padding:0 12px}

.qr-manual{flex:1;min-width:230px}
.qr-manual .btn{margin-top:10px}

/* The key, and the recovery command on the same page — both are things people
   select and copy, so they are laid out to be selectable rather than pretty. */
.keyline{
  display:block;padding:12px 14px;border-radius:var(--r-sm);
  background:var(--sunk);border:1px solid var(--line-hi);
  font:600 14px/1.55 var(--font-m);letter-spacing:.08em;
  color:var(--brass-lit);word-break:break-all;user-select:all;
}

/* ---- recovery codes ---- */

/* Shown once, so the block is marked out from everything around it. */
.slab-mark{border-color:rgba(176,148,111,.4);background:linear-gradient(180deg,#171310,var(--surface))}

.codes{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));
  gap:8px;list-style:none;counter-reset:code;
}
.codes li{
  counter-increment:code;
  display:flex;align-items:center;gap:10px;
  padding:12px 12px;border-radius:var(--r-sm);
  background:var(--sunk);border:1px solid var(--line);
  font:600 14px/1 var(--font-m);letter-spacing:.06em;
  color:var(--ink);user-select:all;
}
.codes li::before{
  content:counter(code);
  font:500 11px/1 var(--font-m);color:var(--ink-3);
  min-width:14px;text-align:right;user-select:none;
}

/* ---- the rail footer becomes a link ---- */
a.who{display:flex;text-decoration:none;color:inherit;border-radius:var(--r-sm);padding:6px 8px;margin:-6px -8px}
a.who:hover{background:rgba(242,245,243,.05);text-decoration:none}
a.who[aria-current="page"]{background:var(--brass-dim)}

/* A quiet mark, not a siren. It sits beside the name until the account has a
   second factor, and says nothing once it does. */
.who-warn{
  flex:none;margin-left:auto;
  width:18px;height:18px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font:700 11px/1 var(--font-m);
  color:var(--hold);background:rgba(227,176,75,.14);
  border:1px solid rgba(227,176,75,.34);
}

/* ==========================================================================
   Spacing utilities

   Seventy-three inline `style=` attributes were spread across eighteen PHP
   templates, and thirty-seven of them were the same handful of declarations
   written out again and again — `margin-top:10px` in ten places,
   `font-size:12px` in seven.

   That is not a styling problem, it is a maintenance one: changing the rhythm
   of the panel meant finding and editing seventy-three strings, and nothing
   would tell you when you had missed one.

   Every value here is a step on the shared scale, so the repeated ones are now
   one decision in one place. The handful that remain inline are genuinely
   one-off — a bar width computed from a percentage, a colour chosen by a PHP
   expression — and belong where they are.
   ========================================================================== */

.mt-1{margin-top:var(--s-1)}
.mt-2{margin-top:var(--s-2)}
.mt-3{margin-top:var(--s-3)}
.mt-4{margin-top:var(--s-4)}
.mt-5{margin-top:var(--s-5)}
.mt-6{margin-top:var(--s-6)}

.mb-1{margin-bottom:var(--s-1)}
.mb-2{margin-bottom:var(--s-2)}
.mb-3{margin-bottom:var(--s-3)}
.mb-4{margin-bottom:var(--s-4)}
.mb-5{margin-bottom:var(--s-5)}
.mb-6{margin-bottom:var(--s-6)}

.w-full{width:100%}
.t-sm{font-size:12px}
.t-xs{font-size:11.5px}

/* A sub-heading inside a slab: the one used above forms and grouped controls. */
.h-sub{font:600 14px/var(--lh-1) var(--font-h);margin-bottom:var(--s-2);color:var(--ink)}

/* A section divided from its neighbour by air rather than by a rule. */
.pad-sec{padding:var(--s-6) 0}

/* "Nothing here yet" inside a flush slab body. */
.empty-note{padding:var(--s-6);color:var(--ink-3);font-size:12.5px}

/* ---- gaps the class cross-check turned up -------------------------------- */

/* Used on the account page and had no rule; the buttons had no separation from
   what sits above them. */
.row-actions{display:flex;flex-wrap:wrap;gap:var(--s-2);align-items:center}

/* Same as the panel: the scroll is on .dd-menu, this is the list inside it. */
.dd-list{display:block}

/* ==========================================================================
   On/off switch
   For things that are simply allowed or not, like a device's access. A real
   submit button with role=switch, so it works with no script and announces
   its state. The colours are the live and dead chips' own.
   ========================================================================== */
.switch{display:inline-flex;align-items:center;gap:8px;padding:4px 2px;border:0;background:none;vertical-align:middle;
  color:var(--ink-2);font:500 12.5px/1 var(--font-ui);cursor:pointer;border-radius:var(--r-pill)}
.switch-track{position:relative;flex:none;width:34px;height:20px;border-radius:var(--r-pill);
  background:rgba(255,107,98,.12);border:1px solid rgba(255,107,98,.36);
  transition:background var(--t-base),border-color var(--t-base)}
.switch-track::after{content:'';position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
  background:#ff9089;transition:transform var(--t-base),background var(--t-base)}
.switch[aria-checked="true"] .switch-track{background:rgba(111,207,151,.12);border-color:rgba(111,207,151,.34)}
.switch[aria-checked="true"] .switch-track::after{transform:translateX(14px);background:#8fe0b0}
.switch[aria-checked="true"] .switch-txt{color:#8fe0b0}
.switch[aria-checked="false"] .switch-txt{color:#ff9089}
.switch:hover .switch-track{filter:brightness(1.25)}
@media (prefers-reduced-motion: reduce){.switch-track,.switch-track::after{transition:none}}

/* Overview: the versions box holds two short lines, not one big figure. */
.metric dd.ver{font-size:15px;line-height:1.6;font-weight:600}
.metric dd.ver span{color:var(--ink-3);font-weight:500;margin-right:6px}
