/* Admin page styles. Same color tokens as app.css / mockup/admin_common.css (kept in sync by hand --
   admin.css is a separate stylesheet from app.css because the Admin page is a standalone page, not part
   of the trading-app shell). Mobile-first (bottom tabs, per spec §10 "HP dulu, tab bawah"); >=900px shows
   the same content with full-width table columns instead of cards (spec §10: "isi sama, tabel pengguna
   tampil dengan kolom lengkap seperti mockup A/B"). */
:root{--bg:#0f1420;--panel:#131722;--card:#1b2030;--border:#2a3142;--text:#d1d4dc;--muted:#8b93a7;--acc:#1e90ff;--pos:#1baf7a;--neg:#e34948;
  --good:#0ca30c;--warning:#fab219;--critical:#d03b3b}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 system-ui,-apple-system,"Segoe UI",sans-serif}
a{color:inherit}
.muted{color:var(--muted)}
.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:14px 16px}
.sect{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin:14px 2px 6px}
table{border-collapse:collapse;width:100%}
th{text-align:left;font-weight:500;color:var(--muted);font-size:12px;padding:7px 8px;border-bottom:1px solid var(--border);white-space:nowrap;cursor:pointer}
td{padding:8px;border-bottom:1px solid #1f2533;white-space:nowrap;font-variant-numeric:tabular-nums}
tr.u:hover td{background:#161c2a}
.num{text-align:right}
.chip{display:inline-block;font-size:11.5px;padding:1px 8px;border-radius:999px;border:1px solid}
.chip.good{color:#7fdc7f;border-color:#1f5a1f;background:#0c1f0c}.chip.warn{color:#fbd27a;border-color:#6b5419;background:#2a220c}
.chip.crit{color:#ff9d9d;border-color:#6b2424;background:#2a1010}.chip.off{color:var(--muted);border-color:var(--border)}
.pos{color:var(--pos)}.neg{color:var(--neg)}
.btn{border:1px solid var(--border);background:var(--card);color:var(--text);border-radius:6px;padding:4px 10px;cursor:pointer;font:600 12.5px system-ui;text-decoration:none;display:inline-block}
.btn:hover{border-color:#3a4458}.btn.danger{color:#ff9d9d}.btn.pri{background:var(--acc);border-color:var(--acc);color:#fff}
.btn.sm{padding:3px 9px;font-size:12px}
.btn:disabled{opacity:.5;cursor:not-allowed}
.chart{position:relative}
.chart .grid{stroke:#232a3a;stroke-width:1}.chart .ax{fill:var(--muted);font-size:11px}
.chart .bar{fill:var(--acc)}.chart .hit.on .bar{fill:#5aaeff}
.chart .tip{position:absolute;top:0;transform:translate(-50%,-100%);background:#0b0f19;border:1px solid var(--border);border-radius:6px;padding:3px 8px;font-size:12px;white-space:nowrap;pointer-events:none}
.spark polyline{fill:none;stroke:#5d6b85;stroke-width:1.5;stroke-linejoin:round}.spark circle{fill:var(--acc);stroke:var(--panel);stroke-width:2}
.meter{margin:8px 0}.meter .ml{display:flex;justify-content:space-between;font-size:12.5px;margin-bottom:4px}
.meter .mt{height:8px;border-radius:8px;background:#1d3550;overflow:hidden}.meter .mt i{display:block;height:100%;border-radius:8px;background:var(--acc)}
.meter .mt.warn{background:#3a3016}.meter .mt.warn i{background:var(--warning)}.meter .mt.crit{background:#3a1a1a}.meter .mt.crit i{background:var(--critical)}
.feed{list-style:none;margin:0;padding:0}.feed li{display:grid;grid-template-columns:70px 1fr;gap:8px;padding:6px 0;border-bottom:1px solid #1f2533;font-size:13px}
.feed .t{color:var(--muted);font-variant-numeric:tabular-nums}.feed b{color:#fff;font-weight:600}
.k-limit::before,.k-email_failed::before{content:"\26a0 ";color:var(--warning)}
.k-admin_action::before{content:"\1f6e1 "}
.k-login::before,.k-logout::before{content:"\2192 ";color:var(--muted)}
.k-trade_closed::before{content:"\25c6 ";color:var(--acc)}
.k-session_created::before,.k-session_deleted::before{content:"\25b6 ";color:var(--muted)}
.k-violation::before{content:"\26a0 ";color:var(--warning)}
.k-code_sent::before{content:"\2709 ";color:var(--muted)}
.set{display:grid;grid-template-columns:1fr auto;gap:10px 16px;align-items:center;font-size:13.5px}
.set input{width:90px;background:var(--card);border:1px solid var(--border);color:var(--text);border-radius:5px;padding:4px 6px;text-align:right}
.set .seg{display:inline-flex;border:1px solid var(--border);border-radius:6px;overflow:hidden}
.set .seg span{padding:4px 10px;font-size:12.5px;cursor:pointer}
.set .seg span.on{background:var(--acc);color:#fff}
.drawer{position:fixed;top:0;right:0;bottom:0;width:440px;max-width:100%;background:var(--panel);border-left:1px solid var(--border);box-shadow:-20px 0 50px #0008;padding:18px;overflow:auto;transform:translateX(100%);transition:.2s;z-index:40}
.drawer.on{transform:none}.drawer .x{float:right;cursor:pointer;color:var(--muted);font-size:18px}
.kv{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:12px 0}.kv div{background:var(--card);border-radius:8px;padding:8px 10px}.kv b{display:block;font-size:18px;color:#fff}.kv span{font-size:12px;color:var(--muted)}

#denied{background:var(--bg);min-height:100vh}
#app{display:flex;flex-direction:column;height:100vh}
.topbar{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--border);background:var(--panel)}
.topbar b{color:#fff;font-size:15px}
.spacer{flex:1}
.body{flex:1;overflow:auto;padding:12px}
.tab{display:none}.tab.on{display:block}
.tabs{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--border);background:var(--panel)}
.tabs div{text-align:center;padding:8px 0 10px;font-size:11.5px;color:var(--muted);cursor:pointer}
.tabs div i{display:block;font-style:normal;font-size:18px}
.tabs div.on{color:#fff}.tabs div.on i{color:var(--acc)}
.tiles{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-bottom:10px}
.tiles div{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:10px 12px}
.tiles b{display:block;font-size:24px;color:#fff;font-weight:600}.tiles span{font-size:12px;color:var(--muted)}
.uc{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:10px 12px;margin-bottom:8px;cursor:pointer}
.uc .h{display:flex;justify-content:space-between;align-items:center}.uc b{color:#fff}.uc .w{font-size:12.5px;color:var(--muted);margin-top:2px}
.uc .row{display:flex;justify-content:space-between;font-size:12.5px;margin-top:6px;gap:6px}

/* >=900px: desktop layout (spec S10) -- tabs move to the top as a row, user list becomes a full table
   instead of cards. Online/Security/Settings content is identical at both sizes (same markup), only the
   Users tab swaps #us_cards for #us_tablewrap via JS (admin.js checks matchMedia). */
@media (min-width:900px){
  .tabs{position:sticky;top:0;grid-template-columns:repeat(4,max-content);gap:4px;padding:0 14px;border-top:0;border-bottom:1px solid var(--border);justify-content:start}
  .tabs div{padding:10px 14px}
  .body{max-width:1100px;margin:0 auto;width:100%;padding:16px 20px}
  .tiles{grid-template-columns:repeat(4,1fr)}
}
