:root{
  --bg:#f5f7fa; --card:#fff; --line:#e5e9f0; --text:#1f2937; --muted:#6b7280;
  --primary:#0f766e; --primary-2:#115e59;
  --normal:#10b981; --watch:#f59e0b; --warn:#f97316; --alert:#dc2626;
  --radius:10px;
}
*{box-sizing:border-box}
/* 必须放在最前：否则 .login-wrap{display:grid} 会覆盖 UA 的 [hidden]{display:none}，
   导致登录页永远显示。 */
[hidden]{display:none!important}
body{margin:0;font:14px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif;
  color:var(--text);background:var(--bg)}
button{font:inherit;cursor:pointer;border:1px solid var(--line);background:#fff;
  border-radius:8px;padding:6px 12px;color:var(--text)}
button:hover{border-color:#cbd5e1}
button.primary{background:var(--primary);color:#fff;border-color:var(--primary)}
button.primary:hover{background:var(--primary-2)}
button.link{border:0;background:transparent;color:var(--primary);padding:2px 4px}
button.danger{color:var(--alert);border-color:#fecaca}
input,select,textarea{font:inherit;padding:7px 10px;border:1px solid var(--line);
  border-radius:8px;background:#fff;color:var(--text);width:100%}
table{width:100%;border-collapse:collapse}
th,td{text-align:left;padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
th{font-weight:600;color:var(--muted);font-size:13px;background:#fafbfc}
tr:hover td{background:#fafcff}
.muted{color:var(--muted)}
.err{color:var(--alert);min-height:20px}

/* 登录 */
.login-wrap{display:grid;place-items:center;min-height:100vh}
.login-card{background:#fff;padding:32px;border-radius:14px;width:340px;
  box-shadow:0 10px 30px rgba(15,23,42,.08)}
.login-card h1{margin:0 0 4px;font-size:20px}
.login-card label{display:block;margin:14px 0 0;font-size:13px;color:var(--muted)}
.login-card input{margin-top:6px}
.login-card button{width:100%;margin-top:18px;background:var(--primary);color:#fff;
  border-color:var(--primary);padding:9px}

/* 布局 */
.app{display:grid;grid-template-columns:196px 1fr;min-height:100vh}
.side{background:#0f172a;color:#cbd5e1;display:flex;flex-direction:column;padding:18px 12px}
.brand{font-weight:700;color:#fff;font-size:16px;padding:4px 10px 16px;letter-spacing:1px}
.side nav{display:flex;flex-direction:column;gap:2px;flex:1}
.side nav a{color:#cbd5e1;text-decoration:none;padding:9px 12px;border-radius:8px;font-size:14px}
.side nav a:hover{background:#1e293b;color:#fff}
.side nav a.on{background:var(--primary);color:#fff}
.side-foot{display:flex;justify-content:space-between;align-items:center;
  font-size:12px;color:#94a3b8;padding:10px}
.side-foot .link{color:#94a3b8}
main{padding:22px 26px;max-width:1280px}

/* 组件 */
.h1{font-size:19px;font-weight:700;margin:0 0 4px}
.page-head{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:16px;
  gap:12px;flex-wrap:wrap}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:16px;margin-bottom:16px}
.grid{display:grid;gap:14px;align-items:start}
.grid.c4{grid-template-columns:repeat(4,1fr)}
.grid.c3{grid-template-columns:repeat(3,1fr)}
.grid.c2{grid-template-columns:repeat(2,1fr)}
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px}
.stat .n{font-size:26px;font-weight:700;line-height:1.2}
.stat .l{color:var(--muted);font-size:13px}
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.spacer{flex:1}
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.toolbar input,.toolbar select{width:auto;min-width:130px}

.badge{display:inline-block;padding:1px 8px;border-radius:999px;font-size:12px;
  border:1px solid transparent;white-space:nowrap}
.badge.normal{background:#ecfdf5;color:#047857;border-color:#a7f3d0}
.badge.watch{background:#fffbeb;color:#b45309;border-color:#fde68a}
.badge.warn{background:#fff7ed;color:#c2410c;border-color:#fed7aa}
.badge.alert{background:#fef2f2;color:#b91c1c;border-color:#fecaca}
.badge.gray{background:#f3f4f6;color:#4b5563;border-color:#e5e7eb}
.badge.blue{background:#eff6ff;color:#1d4ed8;border-color:#bfdbfe}

.bar{height:8px;border-radius:999px;background:#eef2f7;overflow:hidden}
.bar > i{display:block;height:100%}
.drop{border:2px dashed #cbd5e1;border-radius:12px;padding:22px;text-align:center;
  color:var(--muted);background:#fafcff;cursor:pointer}
.drop.hot{border-color:var(--primary);background:#ecfdf5;color:var(--primary)}
.drawer-mask{position:fixed;inset:0;background:rgba(15,23,42,.35);display:grid;
  justify-items:end;z-index:60}
.drawer{background:#fff;width:min(720px,96vw);height:100%;overflow:auto;padding:20px 22px}
.kv{display:grid;grid-template-columns:110px 1fr;gap:6px 12px;font-size:14px}
.kv b{color:var(--muted);font-weight:500}
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%);background:#111827;
  color:#fff;padding:9px 16px;border-radius:10px;z-index:99;font-size:13px;max-width:80vw}
.empty{padding:26px;text-align:center;color:var(--muted)}
.tabs{display:flex;gap:6px;margin-bottom:12px}
.tabs button.on{background:var(--primary);color:#fff;border-color:var(--primary)}
.pre{background:#0f172a;color:#e2e8f0;padding:12px;border-radius:8px;overflow:auto;
  font:12px/1.5 ui-monospace,Consolas,monospace;max-height:320px}
@media (max-width:860px){
  .app{grid-template-columns:1fr}
  .side{flex-direction:row;overflow:auto;padding:8px}
  .side nav{flex-direction:row}
  .brand,.side-foot{display:none}
  .grid.c4,.grid.c3,.grid.c2{grid-template-columns:1fr 1fr}
}
