*{box-sizing:border-box;margin:0;padding:0}
body{font-family:"Microsoft YaHei",system-ui,sans-serif;background:#f4f6f9;color:#26303b;font-size:14px}
.hidden{display:none!important}
a{color:#2f6fed;text-decoration:none}
/* login */
.login-wrap{display:flex;align-items:center;justify-content:center;height:100vh;background:linear-gradient(135deg,#1f3a5f,#2f6fed)}
.login-card{background:#fff;border-radius:10px;padding:38px 34px;width:340px;box-shadow:0 10px 40px rgba(0,0,0,.25)}
.login-card h1{font-size:20px;margin-bottom:6px}
.login-card .sub{color:#8a94a6;font-size:12px;margin-bottom:22px}
.login-card input{width:100%;padding:10px 12px;margin-bottom:12px;border:1px solid #d7dde8;border-radius:6px;font-size:14px}
.err{color:#e04b4b;font-size:12px;margin-top:10px;min-height:16px}
/* layout */
.side{position:fixed;left:0;top:0;bottom:0;width:210px;background:#1f2a3a;color:#c6cede;overflow:auto}
.brand{padding:20px 18px;font-size:17px;font-weight:700;color:#fff;border-bottom:1px solid #2c3a4e}
nav a{display:block;padding:11px 18px;color:#c6cede;font-size:14px;border-left:3px solid transparent}
nav a:hover{background:#26334a;color:#fff}
nav a.on{background:#26334a;color:#fff;border-left-color:#2f6fed}
.me{position:sticky;bottom:0;background:#18212e;padding:12px 18px;font-size:13px;border-top:1px solid #2c3a4e}
.me .row{display:flex;gap:10px;align-items:center;margin-top:6px}
.me a{color:#8fa4c4;font-size:12px}
.main{margin-left:210px;padding:22px 26px;min-height:100vh}
.page-title{font-size:19px;font-weight:700;margin-bottom:16px}
/* cards */
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:14px;margin-bottom:20px}
.card{background:#fff;border-radius:8px;padding:16px 18px;box-shadow:0 1px 3px rgba(20,40,80,.08)}
.card .k{color:#8a94a6;font-size:12px;margin-bottom:8px}
.card .v{font-size:22px;font-weight:700}
.card .v small{font-size:12px;color:#8a94a6;font-weight:400}
/* panel & table */
.panel{background:#fff;border-radius:8px;padding:16px 18px;box-shadow:0 1px 3px rgba(20,40,80,.08);margin-bottom:18px}
.panel h3{font-size:15px;margin-bottom:12px}
.toolbar{display:flex;gap:10px;align-items:center;margin-bottom:12px;flex-wrap:wrap}
.toolbar input,.toolbar select{padding:7px 10px;border:1px solid #d7dde8;border-radius:6px;font-size:13px}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{padding:9px 10px;text-align:left;border-bottom:1px solid #eef1f5;white-space:nowrap}
th{background:#f7f9fc;color:#5b6676;font-weight:600}
tr:hover td{background:#f9fbff}
td .act{color:#2f6fed;cursor:pointer;margin-right:10px}
td .act.danger{color:#e04b4b}
.muted{color:#8a94a6}
.ok{color:#1aab66}.bad{color:#e04b4b}
.tag{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;background:#eef2fb;color:#4a5b7a}
.tag.green{background:#e6f7ee;color:#1aab66}.tag.red{background:#fdecec;color:#e04b4b}
.tag.orange{background:#fff3e0;color:#e08a00}.tag.blue{background:#e8f0ff;color:#2f6fed}
.tag.gray{background:#eef1f5;color:#7a8699}
/* buttons */
.btn{padding:8px 16px;border:1px solid #d7dde8;background:#fff;border-radius:6px;cursor:pointer;font-size:13px}
.btn:hover{border-color:#2f6fed;color:#2f6fed}
.btn.primary{background:#2f6fed;border-color:#2f6fed;color:#fff}
.btn.primary:hover{background:#2660d8}
.btn.sm{padding:4px 10px;font-size:12px}
.btn.block{width:100%}
/* modal */
.modal{position:fixed;inset:0;background:rgba(15,25,40,.5);display:flex;align-items:center;justify-content:center;z-index:50}
.modal-box{background:#fff;border-radius:10px;width:460px;max-width:94vw;max-height:90vh;display:flex;flex-direction:column}
.modal-head{padding:14px 18px;font-weight:700;border-bottom:1px solid #eef1f5;display:flex;justify-content:space-between}
.modal-body{padding:16px 18px;overflow:auto}
.modal-foot{padding:12px 18px;border-top:1px solid #eef1f5;text-align:right;display:flex;gap:10px;justify-content:flex-end}
.f{margin-bottom:12px}
.f label{display:block;font-size:12px;color:#5b6676;margin-bottom:5px}
.f input,.f select,.f textarea{width:100%;padding:8px 10px;border:1px solid #d7dde8;border-radius:6px;font-size:13px}
.f2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.chk{display:flex;align-items:center;gap:6px;font-size:13px}
/* toast */
.toast{position:fixed;top:20px;left:50%;transform:translateX(-50%);background:#26303b;color:#fff;padding:10px 22px;border-radius:6px;z-index:99;font-size:13px}
.toast.bad{background:#e04b4b}
.prog{height:8px;background:#eef1f5;border-radius:5px;overflow:hidden;margin:6px 0}
.prog i{display:block;height:100%;background:#2f6fed}
.grid-rules{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.detail-pre{background:#f7f9fc;border:1px solid #e6ebf3;border-radius:6px;padding:12px;font-size:12px;line-height:1.6;white-space:pre-wrap;word-break:break-all;max-height:360px;overflow:auto}
