body.login-bg{
  margin:0; min-height:100vh; display:flex; align-items:center; justify-content:center;
  background:linear-gradient(135deg,#0f4c81 0%,#1a6fb5 55%,#2e8bc9 100%);
  font-family:"Microsoft YaHei","Segoe UI",sans-serif;
}
.login-card{
  background:#fff; border-radius:12px; padding:40px 44px 30px; width:340px;
  box-shadow:0 18px 50px rgba(0,0,0,.35);
}
.login-card h1{ margin:0 0 4px; font-size:24px; color:#17324d; text-align:center; }
.login-card .sub{ margin:0 0 24px; color:#8899a6; font-size:13px; text-align:center; }
.login-card label{ display:block; font-size:13px; color:#54606c; margin:14px 0 6px; }
.login-card input{
  width:100%; box-sizing:border-box; padding:10px 12px; border:1px solid #cdd6de;
  border-radius:6px; font-size:14px; outline:none;
}
.login-card input:focus{ border-color:#1a6fb5; box-shadow:0 0 0 3px rgba(26,111,181,.15); }
.login-card button{
  width:100%; margin-top:24px; padding:12px; border:0; border-radius:6px;
  background:#1a6fb5; color:#fff; font-size:16px; cursor:pointer;
}
.login-card button:hover{ background:#155a96; }
.login-card .foot{ margin-top:22px; font-size:12px; color:#aab4bd; text-align:center; }
.msg{ margin-top:12px; font-size:13px; min-height:18px; }
.msg.err{ color:#d64541; }
.msg.ok{ color:#2e9e5b; }

/* ---- 门户与管理后台 ---- */
.app{ margin:0; font-family:"Microsoft YaHei","Segoe UI",sans-serif; background:#f2f5f8; color:#2c3a47; }
.topbar{
  background:#17324d; color:#fff; padding:0 24px; height:56px;
  display:flex; align-items:center; justify-content:space-between;
}
.topbar .brand{ font-size:18px; font-weight:bold; }
.topbar .user{ font-size:13px; }
.topbar button{ background:transparent; border:1px solid rgba(255,255,255,.4); color:#fff; border-radius:5px; padding:5px 14px; cursor:pointer; font-size:12px; margin-left:12px; }
.wrap{ max-width:1100px; margin:24px auto; padding:0 16px; }
.card{ background:#fff; border-radius:10px; padding:22px 26px; box-shadow:0 2px 10px rgba(23,50,77,.07); margin-bottom:18px; }
.card h2{ margin:0 0 14px; font-size:17px; color:#17324d; border-left:4px solid #1a6fb5; padding-left:10px; }
.big-btn{
  display:inline-block; background:#1a6fb5; color:#fff; border:0; border-radius:8px;
  padding:16px 42px; font-size:17px; cursor:pointer;
}
.big-btn:hover{ background:#155a96; }
.big-btn:disabled{ background:#9db6c8; cursor:not-allowed; }
.info-grid{ display:flex; gap:30px; flex-wrap:wrap; margin-top:16px; }
.info-item .k{ font-size:12px; color:#8899a6; margin-bottom:3px; }
.info-item .v{ font-size:16px; color:#2c3a47; font-weight:bold; }
.warn{ background:#fff7e0; border:1px solid #f0d48a; color:#8a6d1a; padding:10px 14px; border-radius:6px; font-size:13px; margin-top:14px; }
.danger{ background:#fdeceb; border:1px solid #f2b8b5; color:#a3332e; padding:10px 14px; border-radius:6px; font-size:13px; margin-top:14px; }
table{ width:100%; border-collapse:collapse; font-size:13px; }
th,td{ padding:10px 14px; border-bottom:1px solid #e8edf1; text-align:left; vertical-align:middle; }
th{ background:#f6f9fb; color:#54606c; font-weight:bold; white-space:nowrap; }
tr:hover td{ background:#fafcfd; }
td .cell-main{ display:block; }
td .cell-sub{ display:block; font-size:11px; color:#8899a6; margin-top:2px; }
td .ops{ display:inline-flex; gap:6px; align-items:center; }
.tag{ display:inline-block; padding:2px 8px; border-radius:10px; font-size:12px; }
.tag.green{ background:#e2f5e9; color:#237a41; }
.tag.red{ background:#fdeceb; color:#a3332e; }
.tag.gray{ background:#edf1f4; color:#54606c; }
.tag.blue{ background:#e8f0fb; color:#2b5cad; }
.btn{
  border:0; border-radius:5px; padding:6px 12px; font-size:12px; cursor:pointer; background:#1a6fb5; color:#fff; white-space:nowrap;
}
.btn.ghost{ background:#eef3f7; color:#37536b; }
.btn.danger{ background:#d64541; }
.btn:hover{ filter:brightness(.95); }
input[type=text],input[type=password],input[type=date],select{
  padding:7px 10px; border:1px solid #cdd6de; border-radius:5px; font-size:13px; outline:none;
}
.dialog-mask{ position:fixed; inset:0; background:rgba(15,35,55,.45); display:none; align-items:center; justify-content:center; z-index:10; }
.dialog{ background:#fff; border-radius:10px; padding:24px 28px; width:460px; max-height:86vh; overflow:auto; }
.dialog h3{ margin:0 0 16px; color:#17324d; }
.dialog .row{ margin-bottom:12px; }
.dialog .row label{ display:block; font-size:12px; color:#54606c; margin-bottom:4px; }
.dialog .row input,.dialog .row select{ width:100%; box-sizing:border-box; }
.dialog .actions{ text-align:right; margin-top:18px; }
.tabs{ display:flex; gap:8px; margin-bottom:18px; }
.tabs button{
  border:0; background:#e3eaf0; color:#37536b; padding:8px 20px; border-radius:6px 6px 0 0; cursor:pointer; font-size:14px;
}
.tabs button.active{ background:#fff; color:#17324d; font-weight:bold; box-shadow:0 -2px 6px rgba(23,50,77,.08); }
