:root{
  --primary:#1a56db; --primary-dark:#1242ab; --danger:#d92d20; --warn:#b54708;
  --ok:#067647; --bg:#f2f4f7; --card:#fff; --border:#d0d5dd; --text:#101828;
  --muted:#667085; --sidebar:#111c33; --sidebar-text:#cbd5e1;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:"Segoe UI","Microsoft YaHei",system-ui,sans-serif;background:var(--bg);color:var(--text);font-size:14px}
a{color:var(--primary);text-decoration:none}
.boot-loading{padding:80px;text-align:center;color:var(--muted)}
/* ---------- 布局 ---------- */
.layout{display:flex;min-height:100vh}
.sidebar{width:216px;background:var(--sidebar);color:var(--sidebar-text);flex-shrink:0;display:flex;flex-direction:column}
.sidebar .brand{padding:18px 16px;font-size:16px;font-weight:700;color:#fff;border-bottom:1px solid rgba(255,255,255,.08)}
.sidebar .brand small{display:block;font-weight:400;font-size:11px;color:var(--sidebar-text);margin-top:2px}
.sidebar nav{flex:1;padding:10px 8px;overflow-y:auto}
.sidebar nav a{display:block;padding:9px 12px;margin:2px 0;border-radius:6px;color:var(--sidebar-text);font-size:13.5px}
.sidebar nav a:hover{background:rgba(255,255,255,.08);color:#fff}
.sidebar nav a.active{background:var(--primary);color:#fff}
.sidebar .side-foot{padding:12px 16px;border-top:1px solid rgba(255,255,255,.08);font-size:12px}
.main{flex:1;display:flex;flex-direction:column;min-width:0}
.topbar{background:var(--card);border-bottom:1px solid var(--border);padding:10px 24px;display:flex;align-items:center;gap:12px}
.topbar h1{font-size:17px;flex:1}
.topbar .user-chip{color:var(--muted);font-size:13px;display:flex;align-items:center;gap:10px}
.content{padding:20px 24px;flex:1;overflow-x:auto}
/* ---------- 卡片/表格 ---------- */
.card{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:18px;margin-bottom:16px}
.card h2{font-size:15px;margin-bottom:12px}
.card h2 .hint{font-weight:400;font-size:12px;color:var(--muted);margin-left:8px}
table.grid{width:100%;border-collapse:collapse;font-size:13px}
.grid th,.grid td{border-bottom:1px solid #eaecf0;padding:8px 10px;text-align:left;white-space:nowrap;vertical-align:middle}
.grid th{background:#f9fafb;color:var(--muted);font-weight:600;position:sticky;top:0}
.grid tr:hover td{background:#f8faff}
.grid td.wrap{white-space:normal;min-width:160px}
.table-scroll{overflow-x:auto;border:1px solid var(--border);border-radius:8px}
.pager{display:flex;gap:8px;align-items:center;margin-top:12px;font-size:13px;color:var(--muted)}
.stat-row{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:16px}
.stat{flex:1;min-width:150px;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:14px 16px}
.stat .num{font-size:26px;font-weight:700}
.stat .lbl{color:var(--muted);font-size:12px;margin-top:2px}
.stat.warn .num{color:var(--warn)} .stat.danger .num{color:var(--danger)} .stat.ok .num{color:var(--ok)}
/* ---------- 表单 ---------- */
label.f{display:block;font-size:12.5px;color:var(--muted);margin:10px 0 4px}
label.f b.req{color:var(--danger)}
input.f,select.f,textarea.f{width:100%;padding:8px 10px;border:1px solid var(--border);border-radius:6px;font-size:13.5px;font-family:inherit;background:#fff}
input.f:focus,select.f:focus,textarea.f:focus{outline:2px solid #d1e0ff;border-color:var(--primary)}
.form-row{display:flex;gap:14px}.form-row>*{flex:1}
fieldset.fs{border:1px solid var(--border);border-radius:8px;padding:12px 14px;margin:10px 0}
fieldset.fs legend{font-size:12.5px;color:var(--muted);padding:0 6px}
.search-bar{display:flex;gap:10px;margin-bottom:14px;flex-wrap:wrap;align-items:center}
.search-bar input.f,.search-bar select.f{width:auto;min-width:160px}
/* ---------- 按钮/徽章 ---------- */
.btn{display:inline-block;padding:7px 14px;border-radius:6px;border:1px solid transparent;font-size:13px;cursor:pointer;background:var(--primary);color:#fff}
.btn:hover{background:var(--primary-dark)}
.btn.secondary{background:#fff;color:var(--text);border-color:var(--border)}
.btn.secondary:hover{background:#f9fafb}
.btn.danger{background:var(--danger)} .btn.danger:hover{background:#b42318}
.btn.ok{background:var(--ok)} .btn.warn{background:var(--warn)}
.btn.sm{padding:4px 10px;font-size:12px}
.btn:disabled{opacity:.5;cursor:not-allowed}
.badge{display:inline-block;padding:2px 9px;border-radius:99px;font-size:12px;font-weight:600}
.badge.requested{background:#eef2f6;color:#475467}
.badge.ongoing{background:#e0eaff;color:#1a56db}
.badge.tobechecked{background:#fef0c7;color:#b54708}
.badge.closed{background:#d1fadf;color:#067647}
.badge.pending{background:#eef2f6;color:#475467}
.badge.withdrawn{background:#fee4e2;color:#b42318}
.light{display:inline-block;width:14px;height:14px;border-radius:50%;vertical-align:-2px}
.light.J{background:#12b76a;box-shadow:0 0 0 3px #d1fadf}
.light.K{background:#f79009;box-shadow:0 0 0 3px #fef0c7}
.light.L{background:#f04438;box-shadow:0 0 0 3px #fee4e2}
.pbar{background:#eaecf0;border-radius:99px;height:8px;min-width:70px;overflow:hidden}
.pbar>i{display:block;height:100%;background:var(--primary)}
/* ---------- 向导步骤 ---------- */
.steps{display:flex;gap:6px;margin-bottom:18px;flex-wrap:wrap}
.steps .step{padding:7px 14px;border-radius:99px;background:#eef2f6;color:var(--muted);font-size:12.5px}
.steps .step.on{background:var(--primary);color:#fff;font-weight:600}
.steps .step.done{background:#d1fadf;color:#067647}
/* ---------- 登录页 ---------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#111c33,#1a3a7a)}
.login-card{background:#fff;border-radius:14px;padding:38px 36px;width:400px;box-shadow:0 20px 50px rgba(0,0,0,.35)}
.login-card h1{font-size:20px;margin-bottom:4px}
.login-card .sub{color:var(--muted);font-size:13px;margin-bottom:18px}
.login-card .err{color:var(--danger);font-size:13px;margin:10px 0;min-height:18px}
.login-tip{margin-top:16px;font-size:12px;color:var(--muted);line-height:1.7;border-top:1px dashed var(--border);padding-top:12px}
/* ---------- toast/modal ---------- */
#toast-box{position:fixed;top:18px;right:18px;z-index:999;display:flex;flex-direction:column;gap:8px}
.toast{background:#111c33;color:#fff;padding:11px 18px;border-radius:8px;font-size:13px;box-shadow:0 8px 24px rgba(0,0,0,.25);animation:tin .25s}
.toast.err{background:var(--danger)} .toast.ok{background:var(--ok)}
@keyframes tin{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.modal-mask{position:fixed;inset:0;background:rgba(16,24,40,.5);z-index:998;display:flex;align-items:center;justify-content:center}
.modal{background:#fff;border-radius:12px;padding:22px;width:min(720px,92vw);max-height:86vh;overflow:auto}
.modal h3{margin-bottom:14px;font-size:16px}
.modal .m-foot{margin-top:18px;display:flex;justify-content:flex-end;gap:10px}
.detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px 18px;font-size:13px}
.detail-grid .k{color:var(--muted)}
.detail-grid .v{font-weight:500}
.kv-block{margin-bottom:6px}
.tabs{display:flex;gap:4px;border-bottom:2px solid var(--border);margin-bottom:14px}
.tabs a{padding:8px 16px;font-size:13.5px;color:var(--muted);border-radius:6px 6px 0 0}
.tabs a.on{color:var(--primary);font-weight:600;border-bottom:2px solid var(--primary);margin-bottom:-2px}
.progress-steps input[type=radio]{margin-right:4px}
.muted{color:var(--muted)} .red{color:var(--danger)} .green{color:var(--ok)} .orange{color:var(--warn)}
.mail-frame{border:1px solid var(--border);border-radius:8px;padding:14px;background:#fff;max-height:420px;overflow:auto}
.survey-star{font-size:26px;cursor:pointer;color:#d0d5dd;user-select:none}
.survey-star.on{color:#f79009}
