*{box-sizing:border-box;margin:0;padding:0}
:root{--bg:#0b0e13;--sf:#141a21;--sf2:#1b232c;--bd:#283039;--tx:#eaf0f6;--mu:#8a97a4;--ac:#1f8fff;--gn:#0ecb81;--rd:#f6465d;--am:#f5821f;--pu:#1ec8b0;--r:8px;--rl:12px}
html.light{--bg:#f2f4f6;--sf:#f8f9fb;--sf2:#eaedf0;--bd:#ced4da;--tx:#1f2328;--mu:#6a737d;--ac:#1f8fff;--gn:#0a9d63;--rd:#e23a4e;--am:#d9740f;--pu:#0f9e8b}
html.light input[type=date],html.light input[type=time],html.light input[type=datetime-local]{color-scheme:light}
html.light tr:hover td{background:rgba(0,0,0,.025)}
html.light tr.sel td{background:rgba(9,105,218,.06)}
html.light tr.ctx-hl td{background:rgba(9,105,218,.04);outline-color:rgba(9,105,218,.3)}
html.light .bg{background:rgba(26,127,55,.12);color:#1a7f37}
html.light .br{background:rgba(207,34,46,.12);color:#cf222e}
html.light .ba{background:rgba(154,103,0,.12);color:#9a6700}
html.light .chip{background:rgba(9,105,218,.12);color:#0969da}
html.light .btn-p{background:var(--ac);color:#fff}
html.light .btn-p:hover{background:#0860ca}
html.light .btn-s{background:var(--gn);color:#fff}
html.light .btn-s:hover{background:#158a30}
html.light .btn-d{background:rgba(207,34,46,.12);color:#cf222e}
html.light .btn-d:hover{background:rgba(207,34,46,.22)}
html.light .toast-item{background:var(--sf);color:var(--tx)}
html.light .toast-item.ok{border-color:var(--gn);color:var(--gn)}
html.light .toast-item.err{border-color:var(--rd);color:var(--rd)}
html.light .warn-banner{background:rgba(154,103,0,.1);border-color:var(--am);color:var(--am)}
html.light .ctx-menu{background:var(--sf)}
html.light .emodal{background:var(--sf)}
body{background:var(--bg);color:var(--tx);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:14px;min-height:100vh}
.app{display:flex;height:100vh;overflow:hidden}
.sidebar{width:190px;min-width:190px;background:var(--sf);border-right:1px solid var(--bd);display:flex;flex-direction:column}
.logo{padding:15px 13px 11px;font-size:15px;font-weight:700;border-bottom:1px solid var(--bd)}
.logo span{color:var(--ac)}
.nav{padding:5px 0;flex:1}
.ni{display:flex;align-items:center;gap:8px;padding:7px 12px;color:var(--mu);cursor:pointer;border-radius:6px;margin:1px 5px;font-size:13px;transition:background .12s,color .12s}
.ni:hover{background:var(--sf2);color:var(--tx)}
.ni.active{background:var(--sf2);color:var(--ac)}
.main{flex:1;overflow-y:auto;padding:16px;min-width:0}
.page{display:none}.page.active{display:block}
.ptitle{font-size:17px;font-weight:700;margin-bottom:14px}
.card{background:var(--sf);border:1px solid var(--bd);border-radius:var(--rl);padding:14px;margin-bottom:12px}
.ctitle{font-size:13px;font-weight:600;margin-bottom:10px}
.sg{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;margin-bottom:12px}
.sb{background:var(--sf2);border:1px solid var(--bd);border-radius:var(--r);padding:16px 10px;text-align:center;transition:transform .12s,border-color .12s}
.sb:hover{border-color:var(--ac);transform:translateY(-1px)}
.sn{font-size:27px;font-weight:800;line-height:1;letter-spacing:-.5px}
.sl{font-size:10px;color:var(--mu);margin-top:6px;text-transform:uppercase;letter-spacing:1px;line-height:1.25;min-height:25px;display:flex;align-items:center;justify-content:center;text-align:center}
/* table */
.tw{overflow-x:auto;border-radius:var(--r);border:1px solid var(--bd)}
table{width:100%;border-collapse:collapse;font-size:12px}
thead{background:var(--sf2)}
th{padding:0;border-bottom:1px solid var(--bd);white-space:nowrap;position:relative;vertical-align:top}
.thl{padding:7px 8px;color:var(--mu);font-weight:500;font-size:11px;display:flex;align-items:center;justify-content:center;gap:2px;cursor:default;user-select:none}
.thl.filterable{cursor:pointer}.thl.filterable:hover{color:var(--tx)}
.thl .arr{font-size:9px;opacity:.5;flex-shrink:0}
.thl .arr.active{color:var(--ac);opacity:1}
td{padding:6px 8px;border-bottom:1px solid var(--sf2);vertical-align:middle;height:33px;box-sizing:border-box}
tr:last-child td{border-bottom:none}
tr:hover td{background:rgba(255,255,255,.02)}
tr.sel td{background:rgba(88,166,255,.07)}
/* phones table: scroll inside the box with a sticky header row */
#phones-scroll{max-height:calc(100vh - 240px);overflow:auto}
#phones-table thead th{position:sticky;top:0;z-index:6;background:var(--sf2)}
tr.locked-row td{background:rgba(210,153,34,.07)}
/* lock toggle in its own header column: open lock = show all, closed lock = only locked */
.lock-toggle{font-size:13px;line-height:1;cursor:pointer;opacity:.5;transition:opacity .12s;user-select:none}
.lock-toggle:hover{opacity:.85}
.lock-toggle.active{opacity:1}
/* "not live yet" badge on placeholder buttons */
.soon{display:inline-block;margin-left:5px;font-size:8px;font-weight:700;letter-spacing:.3px;padding:0 4px;border-radius:6px;background:rgba(139,148,158,.22);color:var(--mu);vertical-align:middle;line-height:14px;text-transform:uppercase}
tr.locked-row.sel td{background:rgba(210,153,34,.14)}
/* filter dropdown */
.fdrop{position:fixed;min-width:200px;max-width:260px;background:var(--sf);border:1px solid var(--bd);border-radius:var(--r);z-index:500;padding:8px;box-shadow:0 4px 16px rgba(0,0,0,.4)}
.fdrop input{background:var(--sf2);border:1px solid var(--bd);border-radius:5px;color:var(--tx);font-size:11px;padding:4px 7px;width:100%;outline:none;margin-bottom:6px}
.fdrop input:focus{border-color:var(--ac)}
.fdrop-list{max-height:180px;overflow-y:auto;margin-bottom:6px}
.fdrop-item{display:flex;align-items:center;gap:6px;padding:3px 2px;font-size:11px;cursor:pointer;border-radius:4px}
.fdrop-item:hover{background:var(--sf2)}
.fdrop-item input{width:13px;height:13px;accent-color:var(--ac);flex-shrink:0;margin:0}
.fdrop-acts{display:flex;gap:6px;margin-bottom:6px;font-size:11px}
.fdrop-acts a{color:var(--ac);cursor:pointer;text-decoration:none}
.fdrop-acts a:hover{text-decoration:underline}
.fdrop-count{font-size:10px;color:var(--mu);margin-left:auto}
.fdrop-range{display:flex;gap:5px;align-items:center;font-size:11px;color:var(--mu)}
.fdrop-range input{width:60px;padding:3px 5px;font-size:11px}
.fdrop-btns{display:flex;gap:5px;margin-top:6px}
.fdrop-btns button{flex:1;padding:4px;border-radius:5px;border:none;cursor:pointer;font-size:11px;font-weight:500}
.fdrop-ok{background:var(--ac);color:#000}
.fdrop-cancel{background:var(--sf2);color:var(--tx);border:1px solid var(--bd)!important;border:none}
/* badge chip */
.badge{display:inline-block;padding:2px 8px;border-radius:5px;font-size:11px;font-weight:700;letter-spacing:.3px}
.bg{background:rgba(63,185,80,.15);color:#3fb950}
.br{background:rgba(248,81,73,.15);color:#f85149}
.ba{background:rgba(210,153,34,.15);color:#d29922}
.bm{background:var(--sf2);color:var(--mu)}
.chip{display:inline-block;padding:2px 8px;border-radius:5px;font-size:11px;font-weight:700;background:rgba(31,143,255,.16);color:var(--ac);letter-spacing:.3px}
/* number library */
.nl-badge{display:inline-block;padding:2px 7px;border-radius:5px;font-size:10px;font-weight:700;letter-spacing:.2px;white-space:nowrap}
.nl-st-unregistered{background:var(--sf2);color:var(--mu)}
.nl-st-pending{background:rgba(245,130,31,.16);color:var(--am)}
.nl-st-submitted{background:rgba(31,143,255,.16);color:var(--ac)}
.nl-st-registered{background:rgba(14,203,129,.16);color:var(--gn)}
.nl-dot{display:inline-block;width:7px;height:7px;border-radius:50%;vertical-align:middle}
.nl-dot.on{background:var(--gn);box-shadow:0 0 4px var(--gn)}
.nl-dot.off{background:var(--mu)}
/* FWOTP live multi-column slot view */
.nl-cols{display:grid;gap:12px;overflow-x:auto}
.nl-col{border:1px solid var(--bd);border-radius:var(--r);overflow:hidden;min-width:0}
.nl-col-h{display:flex;align-items:center;gap:1px;padding:9px 12px;background:var(--sf2);border-bottom:1px solid var(--bd)}
.nl-logo-sq{display:inline-block;width:9px;height:9px;border-radius:2px}
.nl-gw-ball{display:inline-block;width:10px;height:10px;border-radius:50%;margin:0 7px 0 4px}
.nl-gw-id{font-weight:800;font-size:15px;letter-spacing:.5px;color:var(--tx)}
.nl-slot-tbl{width:100%;border-collapse:collapse;font-size:12px}
.nl-slot-tbl td{padding:2px 6px;border-bottom:1px solid var(--bd);vertical-align:middle;line-height:1.35}
.nl-slot-tbl thead.nl-hd th,.nl-slot-tbl tr.nl-hd th{position:sticky;top:0;background:var(--sf);color:var(--mu);font-size:10px;font-weight:700;text-align:left;padding:4px 6px;border-bottom:1px solid var(--bd);white-space:nowrap}
.nl-slot-tbl tr:last-child td{border-bottom:none}
.nl-slot-tbl tr.nl-empty td{color:var(--mu)}
.nl-slot-tbl .nl-c1{width:24px}.nl-slot-tbl .nl-c2{width:46px;white-space:nowrap}.nl-slot-tbl .nl-c6{width:30px;text-align:center}
/* 号码库归档: 号码记录行高压缩到约一半(仅归档展开区, 不影响 FWOTP 实时表) */
.nla-box-b .nl-slot-tbl td{padding:0 6px;line-height:1.0}
.nl-fwd{font-size:11px;font-weight:700}.nl-fwd.ok{color:var(--gn)}.nl-fwd.wait{color:var(--am)}
/* 号码库(archive) foldable batch grid */
.nla-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:8px;align-items:start}
.nla-box{border:1px solid var(--bd);border-radius:var(--r);overflow:hidden}
.nla-box-h{display:flex;align-items:center;gap:6px;padding:7px 10px;background:var(--sf2);cursor:pointer;user-select:none}
.nla-box-h:hover{background:var(--bd)}
.nla-caret{color:var(--mu);font-size:10px;width:10px}
.nla-box-b{overflow:visible}/* show all numbers, no scrollbar */
/* batch-swap aligned columns: card list & paste box share line-height so rows line up */
.bem-colh{font-size:10px;font-weight:700;color:var(--mu);text-transform:uppercase;letter-spacing:.3px;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bem-list{height:46vh;max-height:46vh;overflow:auto;font-family:monospace;font-size:12px;line-height:22px;padding:4px 8px;border-radius:var(--r);box-sizing:border-box}
#bem-cards{border:1px solid var(--bd);background:var(--sf2)}
.bem-list .bem-row{height:22px;line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bem-list .bem-row .bem-i{color:var(--mu);display:inline-block;width:26px}
.bem-list .bem-row.bem-has{color:var(--tx)}
.choice-title{font-size:14px;font-weight:700;color:var(--tx);margin-bottom:14px;text-align:center}
/* forms */
input,select,textarea{background:var(--sf2);border:1px solid var(--bd);border-radius:var(--r);color:var(--tx);font-size:12px;padding:6px 8px;width:100%;outline:none;font-family:inherit}
input[type=checkbox]{width:13px;height:13px;cursor:pointer;accent-color:var(--ac);padding:0}
input[type=date],input[type=time]{color-scheme:dark;overflow:hidden}
input[type=date]::-webkit-calendar-picker-indicator,input[type=time]::-webkit-calendar-picker-indicator{margin-right:-4px;border-radius:4px}
input:focus,select:focus,textarea:focus{border-color:var(--ac)}
textarea{resize:vertical;font-family:'Courier New',monospace;font-size:12px;line-height:1.6}
label{font-size:11px;color:var(--mu);display:block;margin-bottom:3px}
.fg{margin-bottom:8px}
/* buttons */
.btn{padding:7px 15px;border-radius:8px;border:1px solid var(--bd);cursor:pointer;font-size:12px;font-weight:600;transition:background .14s,border-color .14s,opacity .14s,transform .05s;display:inline-flex;align-items:center;gap:5px;background:var(--sf2);color:var(--tx)}
.btn:hover{background:var(--bd);border-color:var(--mu)}
.btn:active{opacity:.85;transform:translateY(.5px)}
.btn-p{background:var(--ac);border-color:transparent;color:#fff}.btn-p:hover{background:#3ba0ff;border-color:transparent}
.btn-s{background:var(--gn);border-color:transparent;color:#04231a}.btn-s:hover{background:#1ad693;border-color:transparent}
.btn-d{background:rgba(246,70,93,.14);border-color:rgba(246,70,93,.32);color:var(--rd)}.btn-d:hover{background:rgba(246,70,93,.26);border-color:rgba(246,70,93,.5)}
.btn-sm{padding:5px 11px;font-size:11px}
.fb{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end;margin-bottom:10px}
.fb .fg{margin:0;min-width:90px}
.hint{font-size:11px;color:var(--mu);margin-top:3px}
.ar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:8px}
.mono{font-family:'Courier New',monospace;font-size:11px}
.mc{color:var(--mu)}.gc{color:var(--gn)}.rdc{color:var(--rd)}.amc{color:var(--am)}.pu{color:var(--pu)}
.mr{display:grid;grid-template-columns:88px 68px 158px 62px 30px;gap:5px;align-items:center;margin-bottom:5px}
.mr input{padding:5px 6px;font-size:11px}
.rcel{font-size:11px;color:var(--mu);background:var(--sf2);border:1px solid var(--bd);border-radius:var(--r);padding:5px 7px;font-family:monospace}
/* context menu */
.ctx-menu{position:fixed;z-index:8000;background:var(--sf);border:1px solid var(--bd);border-radius:var(--r);box-shadow:0 4px 20px rgba(0,0,0,.55);min-width:170px;padding:4px 0;font-size:13px}
.ctx-item{padding:7px 14px;cursor:pointer;color:var(--tx);display:flex;align-items:center;gap:9px;user-select:none}
.ctx-item:hover{background:var(--sf2)}
.ctx-item.ctx-danger{color:#ffffff;background:rgba(248,81,73,.18)}
.ctx-item.ctx-danger:hover{background:rgba(248,81,73,.3)}
.ctx-item.ctx-warn{color:#ffffff;background:rgba(188,140,255,.15)}
.ctx-item.ctx-warn:hover{background:rgba(188,140,255,.28)}
.ctx-sep{height:1px;background:var(--bd);margin:4px 0}
/* right-click submenu (FWOTP 分发 → 用户名 flyout) */
.ctx-item.ctx-has-sub{position:relative}
.ctx-arrow{margin-left:auto;color:var(--mu);font-size:11px}
.ctx-submenu{display:none;position:absolute;left:100%;top:-5px;min-width:150px;max-height:280px;overflow-y:auto;background:var(--sf);border:1px solid var(--bd);border-radius:var(--r);box-shadow:0 4px 20px rgba(0,0,0,.55);padding:4px 0}
.ctx-has-sub:hover .ctx-submenu{display:block}
#nl-ctx-menu.sub-left .ctx-submenu{left:auto;right:100%}
.ctx-submenu .ctx-item{padding:6px 14px}
.ctx-submenu .ctx-empty{padding:7px 14px;color:var(--mu);font-size:12px;white-space:nowrap}
tr.ctx-hl td{background:rgba(88,166,255,.04);outline:1px solid rgba(88,166,255,.25);outline-offset:-1px}
.nl-slot-tbl tr.nl-sel td{background:rgba(88,166,255,.18)}
.nl-slot-tbl tbody tr:hover td{background:rgba(88,166,255,.10)}
.nl-slot-tbl tbody tr.nl-sel:hover td{background:rgba(88,166,255,.28)}
/* edit modal */
.emodal-bg{display:none;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:8100;align-items:center;justify-content:center}
.emodal{background:var(--sf);border:1px solid var(--bd);border-radius:var(--rl);padding:22px;width:360px;max-width:92vw}
.emodal-hdr{font-size:15px;font-weight:700;margin-bottom:18px;display:flex;justify-content:space-between;align-items:center}
.emodal-close{cursor:pointer;color:var(--mu);font-size:20px;line-height:1;padding:0 2px}
.emodal-close:hover{color:var(--tx)}
/* mobile */
@media(max-width:640px){
  body{font-size:13px}
  html,body{overflow-x:hidden;max-width:100%}
  .app{overflow-x:hidden;max-width:100vw}
  .sidebar{width:0;min-width:0;overflow:hidden;position:fixed;z-index:100;height:100vh;transition:width .2s;box-shadow:2px 0 16px rgba(0,0,0,.4)}
  .sidebar.open ~ .main .mob-menu button{visibility:hidden}
  .sidebar.open{width:220px;min-width:220px}
  .logo{padding:14px}
  .ni{padding:11px 12px;font-size:14px;margin:2px 8px}
  .main{padding:10px;overflow-x:hidden;max-width:100%;box-sizing:border-box}
  .mob-menu{display:flex!important}
  .ptitle{font-size:16px}
  .card{padding:12px;border-radius:10px}
  .sg{grid-template-columns:repeat(2,1fr)!important}
  /* full-width stacked filter/action bars */
  .fb{flex-direction:column;align-items:stretch;gap:8px}
  .fb .fg{min-width:0;width:100%;overflow:hidden}
  .fb .fg input,.fb .fg select{width:100%!important;min-width:0!important;max-width:100%!important;box-sizing:border-box!important}
  .ar{gap:6px}
  /* roomier tap targets */
  .btn{padding:9px 14px;font-size:13px}
  .btn-sm{padding:7px 11px;font-size:12px}
  input,select,textarea{font-size:14px;padding:9px 10px}
  input[type=checkbox]{width:18px;height:18px}
  /* keep wide tables scrollable without squashing */
  table{font-size:12px}
  th,.thl{padding:8px 7px}
  td{padding:8px 7px}
  /* manual-row grid: stack on narrow screens */
  .mr{grid-template-columns:1fr 1fr;gap:6px}
  .mr input,.mr .rcel{font-size:12px;padding:7px 8px}
  /* charts: allow horizontal scroll, shrink axis padding */
  .chart-wrap{padding:16px 28px 26px 28px}
  .pie-wrap{flex-direction:column;align-items:flex-start}
}
@media(max-width:420px){
  .sg{grid-template-columns:1fr 1fr!important}
  .sn{font-size:19px}
  .mr{grid-template-columns:1fr}
}
/* scrollbar — minimal track-less style */
*::-webkit-scrollbar{width:4px;height:4px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}
*::-webkit-scrollbar-thumb:hover{background:var(--mu)}
*{scrollbar-width:thin;scrollbar-color:var(--bd) transparent}
/* collapsible phone toolbar — collapses to zero height, animates open/closed */
#phone-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:0;margin:0;max-height:0;opacity:0;overflow:hidden;pointer-events:none;transition:max-height .25s ease,opacity .2s ease,padding .25s ease,margin .25s ease}
#phone-toolbar.open{max-height:200px;opacity:1;pointer-events:auto;padding:4px 0 6px;margin-bottom:2px}
/* custom confirm dialog */
#confirm-overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:10100;display:none;align-items:center;justify-content:center}
#confirm-overlay.show{display:flex}
#confirm-box{background:var(--sf);border:1px solid var(--bd);border-radius:var(--rl);padding:22px 24px;max-width:320px;width:90%;box-shadow:0 8px 32px rgba(0,0,0,.45)}
#confirm-msg{font-size:13px;color:var(--tx);line-height:1.6;margin-bottom:18px;white-space:pre-wrap}
#confirm-btns{display:flex;justify-content:flex-end;gap:8px}
#copy-overlay,.choice-overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:10000;display:none;align-items:center;justify-content:center}
#copy-overlay.show,.choice-overlay.show{display:flex}
#copy-box,.choice-box{background:var(--sf);border:1px solid var(--bd);border-radius:var(--rl);padding:20px 22px;max-width:300px;width:90%;box-shadow:0 8px 32px rgba(0,0,0,.45)}
#copy-box{max-width:420px}
.copy-scope{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--tx);cursor:pointer;user-select:none;white-space:nowrap}
.copy-scope input{width:15px;height:15px;accent-color:var(--ac);cursor:pointer;margin:0}
#copy-box .btn{white-space:nowrap;padding-left:8px;padding-right:8px}
/* distribute panel: fixed wider box, no horizontal scrollbar, sized dropdowns */
#nl-distribute-overlay .choice-box{max-width:440px;width:440px}
#nl-distribute-list{overflow-x:hidden}
#nl-distribute-list select{height:30px;border:1px solid var(--bd);background:var(--bg);color:var(--tx);border-radius:6px;padding:0 6px}
#nl-distribute-list input[type=number]{height:30px}
.copy-title{font-size:13px;color:var(--tx);font-weight:600;margin-bottom:16px;text-align:center}
/* toast stack (Telegram-style, bottom-right, slides up) */
#toast-container{position:fixed;bottom:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:7px;align-items:flex-end;pointer-events:none}
.toast-item{background:var(--sf2);border:1px solid var(--bd);border-radius:var(--r);padding:9px 14px;font-size:12px;max-width:280px;opacity:0;transform:translateY(16px);transition:opacity .22s ease,transform .22s ease;pointer-events:none}
.toast-item.show{opacity:1;transform:translateY(0)}
.toast-item.ok{border-color:var(--gn);color:var(--gn)}
.toast-item.err{border-color:var(--rd);color:var(--rd)}
.toast-undo-btn{margin-left:10px;background:var(--am);color:#000;border:none;border-radius:5px;padding:3px 10px;font-size:11px;font-weight:700;cursor:pointer;pointer-events:auto;flex-shrink:0}
.toast-undo-row{display:flex;align-items:center;gap:4px}
.toast-countdown{font-size:10px;color:var(--mu);margin-left:4px}
/* warn banner */
.warn-banner{background:rgba(210,153,34,.15);border:1px solid var(--am);border-radius:var(--r);padding:7px 12px;font-size:12px;color:var(--am);margin-bottom:10px;display:none}
/* ── Permission-driven visibility ── */
body.perm-phones-read .ph-action{display:none!important}
body.perm-phones-none [data-page="phones"]{display:none!important}
body.perm-replace-read .rp-action{display:none!important}
body.perm-replace-none [data-page="replace"]{display:none!important}
body.perm-ucs-read .ucs-action{display:none!important}
body.perm-ucs-none [data-page="ucs"]{display:none!important}
body.perm-cfg-read .cfg-action{display:none!important}
body.perm-cfg-none [data-page="config"]{display:none!important}
body.perm-dashboard-none [data-page="dashboard"]{display:none!important}
body.perm-imp-backup-none .imp-backup-card{display:none!important}
body.perm-imp-backup-read .imp-backup-action{display:none!important}
body.perm-imp-import-none .imp-import-card{display:none!important}
body.perm-imp-import-read .imp-import-action{display:none!important}
body.perm-imp-datamgmt-none .imp-datamgmt-card{display:none!important}
body.perm-imp-datamgmt-read .imp-datamgmt-action{display:none!important}
/* admin page - user management */
#page-admin .user-row{display:grid;grid-template-columns:1fr 80px 1fr 100px;gap:8px;align-items:center;padding:8px 0;border-bottom:1px solid var(--bd);font-size:12px}
#page-admin .user-row:last-child{border-bottom:none}
.perm-grid{display:grid;grid-template-columns:130px repeat(3,1fr);border:1px solid var(--bd);border-radius:var(--r);overflow:hidden;margin-bottom:4px}
.perm-grid .pg-hdr{background:var(--sf2);font-size:10px;color:var(--mu);text-align:center;padding:7px 4px;font-weight:600;border-bottom:1px solid var(--bd)}
.perm-grid .pg-hdr.pg-lh{text-align:left;padding-left:10px}
.perm-grid .pg-label{padding:7px 10px;font-size:12px;color:var(--tx);display:flex;align-items:center;border-top:1px solid var(--bd)}
.perm-grid .pg-cell{display:flex;justify-content:center;align-items:center;border-top:1px solid var(--bd);padding:4px}
.perm-grid input[type=radio]{accent-color:var(--ac);cursor:pointer;width:15px;height:15px}
#umodal-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:4000;align-items:center;justify-content:center}
#umodal-overlay.open{display:flex}
#umodal-box{background:var(--bg);border:1px solid var(--bd);border-radius:var(--r);padding:20px;width:min(540px,96vw);max-height:90vh;overflow-y:auto}
#umodal-box h3{margin:0 0 14px;font-size:14px;font-weight:700}
/* bar chart */
.chart-wrap{position:relative;padding:20px 40px 30px 40px;overflow-x:auto}
.chart-inner{display:flex;gap:6px;align-items:flex-end;min-height:170px}
.bitem{display:flex;flex-direction:column;align-items:center;min-width:34px;position:relative}
.bbar{background:var(--ac);border-radius:3px 3px 0 0;width:100%;transition:height .3s;min-height:2px}
.bval{font-size:10px;color:var(--tx);font-weight:600;margin-bottom:3px;white-space:nowrap}
.blabel{font-size:9px;color:var(--mu);margin-top:4px;white-space:nowrap}
.y-axis{position:absolute;left:0;top:20px;bottom:30px;display:flex;flex-direction:column;justify-content:space-between;font-size:9px;color:var(--mu);text-align:right;width:36px}
.y-grid{position:absolute;left:40px;right:40px;border-top:1px solid var(--bd);font-size:9px;color:var(--mu)}
/* pie */
.pie-wrap{display:flex;align-items:center;gap:14px}
.pie-legend{display:flex;flex-direction:column;gap:5px}
.pie-item{display:flex;align-items:center;gap:6px;font-size:11px}
.pie-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}
/* pager */
.pager{display:flex;align-items:center;gap:8px;margin-top:8px;font-size:11px;color:var(--mu)}
.pager button{background:var(--sf2);border:1px solid var(--bd);border-radius:5px;color:var(--tx);font-size:11px;padding:3px 8px;cursor:pointer}
.pager select{width:auto;padding:3px 6px;font-size:11px}
/* watermark */
#wm{position:fixed;top:50%;left:calc(50% + 95px);transform:translate(-50%,-50%);width:270px;height:270px;background:url('/static/logo.svg') no-repeat center/contain;opacity:.07;pointer-events:none;z-index:0}
@media(max-width:640px){#wm{left:50%}}

/* ── login overlay ── */
#login-overlay{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;background:#090d13}
.login-card{position:relative;width:400px;max-width:92vw;background:#1a2235;border:1px solid rgba(88,166,255,.30);border-radius:20px;padding:48px 40px 38px;box-shadow:0 0 0 1px rgba(88,166,255,.06),0 24px 80px rgba(0,0,0,.6),0 0 60px rgba(88,166,255,.07)}
.login-input{width:100%;background:#0d1420;border:1px solid #2d3a50;color:#e6edf3;font-size:14px;padding:13px 16px;outline:none;box-sizing:border-box;transition:border-color .18s,box-shadow .18s;font-family:inherit;display:block}
.login-input:focus{border-color:#58a6ff;box-shadow:0 0 0 3px rgba(88,166,255,.14)}
#login-user.login-input{border-bottom:none;border-radius:10px 10px 0 0}
#login-pass.login-input{border-radius:0 0 10px 10px;padding-right:44px}
/* lock font-size & colors against browser autofill repaint (text was flashing small->big) */
.login-input:-webkit-autofill,.login-input:-webkit-autofill:hover,.login-input:-webkit-autofill:focus,.login-input:-webkit-autofill:active{font-size:14px!important;-webkit-text-fill-color:#e6edf3;-webkit-box-shadow:0 0 0 1000px #0d1420 inset;transition:background-color 99999s ease-in-out 0s;caret-color:#e6edf3}
html.light .login-input:-webkit-autofill{-webkit-text-fill-color:#1f2328;-webkit-box-shadow:0 0 0 1000px #f6f8fa inset;caret-color:#1f2328}
#login-btn{width:100%;margin-top:20px;background:linear-gradient(135deg,#1E92FF 0%,#0B60D8 100%);border:none;border-radius:10px;color:#fff;font-size:14px;font-weight:700;padding:14px;cursor:pointer;transition:opacity .15s,transform .1s;letter-spacing:.8px}
#login-btn:hover{opacity:.88}
#login-btn:active{transform:scale(.98)}
html.light #login-overlay{background:#e8ecf2}
html.light .login-card{background:#ffffff;border:1px solid #d0d7de;box-shadow:0 8px 48px rgba(0,0,0,.14)}
html.light .login-input{background:#f6f8fa;border:1px solid #d0d7de;color:#1f2328}
html.light .login-input:focus{border-color:#0969da;box-shadow:0 0 0 3px rgba(9,105,218,.12)}
