:root { --brand:#2f6df6; --bg:#f5f7fb; --card:#fff; --txt:#1f2733; --sub:#6b7785; --line:#eef1f6; --danger:#e0524b; --ok:#1f9d57; }
* { box-sizing: border-box; }
body { margin:0; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif; color:var(--txt); background:var(--bg); }
.hidden { display:none !important; }
.muted { color:var(--sub); font-size:13px; }
.msg { color:var(--danger); font-size:12px; min-height:16px; }

/* 登录 */
.login { min-height:100vh; display:flex; align-items:center; justify-content:center; }
.login-card { background:var(--card); padding:36px; border-radius:16px; width:340px; box-shadow:0 8px 30px rgba(0,0,0,.08); text-align:center; }
.login-card h1 { margin:0 0 4px; font-size:22px; }
.login-card input { width:100%; padding:11px 12px; margin-top:12px; border:1px solid var(--line); border-radius:10px; font-size:14px; }
.login-card button { width:100%; margin-top:16px; padding:11px; background:var(--brand); color:#fff; border:none; border-radius:10px; font-size:14px; cursor:pointer; }

/* 布局 */
.app { display:flex; min-height:100vh; }
.sidebar { width:210px; background:#0f1b2d; color:#cfd8e3; padding:18px 0; display:flex; flex-direction:column; }
.sidebar .brand { padding:0 20px 16px; font-weight:700; color:#fff; font-size:16px; }
.sidebar nav a { display:block; padding:10px 20px; color:#aeb9c7; text-decoration:none; font-size:14px; cursor:pointer; }
.sidebar nav a:hover, .sidebar nav a.active { background:#1b2c45; color:#fff; }
.side-foot { margin-top:auto; padding:14px 20px; font-size:12px; color:#7e8aa0; border-top:1px solid #1b2c45; display:flex; justify-content:space-between; }
.side-foot a { color:#9fb4d6; text-decoration:none; }
.content { flex:1; padding:22px 30px; overflow:auto; }
.content header { display:flex; align-items:center; justify-content:space-between; margin-bottom:16px; }
.content header h2 { margin:0; font-size:20px; }

/* 通用组件 */
.btn { padding:9px 16px; background:var(--brand); color:#fff; border:none; border-radius:9px; font-size:14px; cursor:pointer; }
.btn.ghost { background:#eaf0ff; color:var(--brand); }
.btn.sm { padding:5px 10px; font-size:12px; }
.link { background:none; border:none; color:var(--brand); cursor:pointer; font-size:13px; padding:2px 4px; }
.link.danger { color:var(--danger); }
.count { color:var(--sub); font-size:13px; margin-bottom:10px; }
.toolbar { margin-bottom:12px; display:flex; gap:12px; align-items:center; }
.empty { text-align:center; color:var(--sub); padding:24px; }

/* 表格 */
.tbl { width:100%; border-collapse:collapse; background:var(--card); border-radius:12px; overflow:hidden; box-shadow:0 1px 3px rgba(0,0,0,.05); }
.tbl th, .tbl td { text-align:left; padding:11px 12px; border-bottom:1px solid var(--line); font-size:13px; vertical-align:top; }
.tbl th { background:#fafbfe; color:var(--sub); font-weight:600; }
.tbl tr:last-child td { border-bottom:none; }
.tbl tbody tr:hover { background:#f8faff; }

/* 表单 */
label { display:block; font-size:13px; color:var(--sub); margin:12px 0 5px; }
label.ck { display:flex; align-items:center; gap:8px; color:var(--txt); }
input[type=text], input[type=email], input[type=url], input[type=password], input[type=number], select, textarea {
  width:100%; padding:9px 11px; border:1px solid var(--line); border-radius:9px; font-size:14px; font-family:inherit; background:#fff; color:var(--txt);
}
textarea { resize:vertical; }
.fgrid { display:grid; grid-template-columns:1fr 1fr; gap:0 18px; }
.fhelp { grid-column:1 / -1; display:block; font-size:12px; color:var(--sub); margin:-2px 0 6px; opacity:.85; }
em.req { color:var(--danger); font-style:normal; }
.banner.note { background:#f4f7ff; color:#3a5bd9; border-color:#d8e0fb; font-size:13px; padding:10px 14px; }

/* 弹窗 */
.modal { position:fixed; inset:0; background:rgba(15,27,45,.5); display:flex; align-items:center; justify-content:center; z-index:50; }
.modal-card { background:#fff; width:680px; max-width:92vw; max-height:88vh; border-radius:14px; display:flex; flex-direction:column; overflow:hidden; }
.modal-head { display:flex; justify-content:space-between; align-items:center; padding:16px 20px; border-bottom:1px solid var(--line); }
.modal-head h3 { margin:0; font-size:16px; }
.modal-head button { background:none; border:none; font-size:22px; cursor:pointer; color:var(--sub); }
.modal-body { padding:18px 20px; overflow:auto; }
.modal-foot { padding:14px 20px; border-top:1px solid var(--line); text-align:right; }

/* 仪表盘卡片 */
.cards { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:14px; margin-bottom:20px; }
.stat { background:#fff; border:1px solid var(--line); border-radius:12px; padding:16px; }
.stat .n { font-size:24px; font-weight:700; }
.stat .l { color:var(--sub); font-size:12px; margin-top:4px; }
.badge { display:inline-block; padding:3px 10px; border-radius:20px; font-size:12px; margin-left:6px; }
.badge.on { background:#e6f7ee; color:var(--ok); }
.badge.off { background:#fdeceb; color:var(--danger); }
.banner { background:#fff; border:1px solid var(--line); border-radius:12px; padding:16px 18px; margin-bottom:16px; }
.banner h3 { margin:0 0 8px; font-size:15px; }
