:root{
  --bg:#eef1f6;
  --card:#ffffff;
  --line:#e3e7ee;
  --line-soft:#eef1f6;
  --text:#111827;
  --text-2:#374151;
  --muted:#6b7280;
  --muted-2:#9ca3af;
  --brand:#1e5eff;
  --brand-soft:#eaf0ff;
  --up:#d4291f;
  --down:#0a9d5a;
  --warn:#b45309;
  --warn-bg:#fff7e6;
  --warn-line:#f3d19b;
  --radius:12px;
  --shadow:0 1px 2px rgba(16,24,40,.05),0 1px 3px rgba(16,24,40,.06);
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{margin:0;padding:0}
body{
  background:var(--bg);color:var(--text);
  font:14px/1.55 -apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  -webkit-font-smoothing:antialiased;
}
button{font-family:inherit}
a{color:var(--brand)}

/* ---------------- 登录页 ---------------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;
  background:radial-gradient(1200px 500px at 50% -10%,#dbe6ff 0%,#eef1f6 60%)}
.login-card{width:100%;max-width:404px;background:var(--card);border:1px solid var(--line);
  border-radius:16px;box-shadow:0 10px 40px rgba(16,24,40,.10);padding:30px 28px 24px}
.login-logo{width:44px;height:44px;border-radius:12px;background:var(--brand);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:700;margin-bottom:14px}
.login-card h1{font-size:20px;margin:0 0 4px;letter-spacing:.3px}
.login-card .sub{color:var(--muted);font-size:13px;margin-bottom:20px}
.field{margin-bottom:14px}
.field label{display:block;font-size:12.5px;color:var(--text-2);margin-bottom:6px;font-weight:500}
.field input{width:100%;height:42px;padding:0 12px;border:1px solid var(--line);border-radius:9px;
  font-size:14px;background:#fbfcfe;outline:none;transition:border-color .15s,box-shadow .15s}
.field input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);background:#fff}
.btn{height:42px;border:none;border-radius:9px;background:var(--brand);color:#fff;font-size:14px;
  font-weight:600;cursor:pointer;transition:filter .15s}
.btn:hover{filter:brightness(1.06)}
.btn:disabled{opacity:.6;cursor:default}
.btn-block{width:100%}
.login-err{background:#fdecec;border:1px solid #f6c9c6;color:#b42318;border-radius:9px;
  padding:9px 12px;font-size:13px;margin-bottom:14px}
.risk-box{margin-top:18px;background:var(--warn-bg);border:1px solid var(--warn-line);border-radius:10px;
  padding:11px 13px;font-size:12px;line-height:1.6;color:var(--warn)}
.risk-box b{display:block;margin-bottom:3px;font-size:12.5px}
.risk-box p{margin:0}

/* ---------------- 顶栏 ---------------- */
.topbar{position:sticky;top:0;z-index:40;background:#fff;border-bottom:1px solid var(--line)}
.topbar-in{max-width:1720px;margin:0 auto;padding:0 20px;height:58px;display:flex;align-items:center;gap:14px}
.brand{display:flex;align-items:center;gap:9px;font-weight:700;font-size:15.5px;white-space:nowrap}
.brand .dot{width:26px;height:26px;border-radius:8px;background:var(--brand);color:#fff;font-size:14px;
  display:flex;align-items:center;justify-content:center;font-weight:700}
.topbar .meta{color:var(--muted);font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topbar .spacer{flex:1}
.tb-btn{height:32px;padding:0 13px;border-radius:8px;border:1px solid var(--line);background:#fff;
  color:var(--text-2);font-size:13px;cursor:pointer;white-space:nowrap}
.tb-btn:hover{background:#f7f9fc;border-color:#cfd6e2}
.tb-btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.tb-btn.primary:hover{filter:brightness(1.06)}

/* 风险横幅：单行，超长省略 */
.risk-banner{background:var(--warn-bg);border-bottom:1px solid var(--warn-line);color:var(--warn)}
.risk-banner .in{max-width:1720px;margin:0 auto;padding:7px 20px;font-size:12.5px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.risk-banner .tag{display:inline-block;background:var(--warn);color:#fff;border-radius:4px;
  padding:0 6px;font-size:11px;margin-right:8px;vertical-align:1px}

/* ---------------- 页面栅格 ---------------- */
.page{max-width:1720px;margin:0 auto;padding:16px 20px 60px}
.sec{margin-bottom:16px}
.sec-head{display:flex;align-items:center;gap:10px;margin:18px 0 11px}
.sec-head .sec-l{width:3px;height:15px;border-radius:2px;background:var(--brand)}
.sec-head h2{margin:0;font-size:14.5px;font-weight:700;letter-spacing:.2px}
.sec-head .sec-line{flex:1;height:1px;background:linear-gradient(90deg,var(--line),transparent)}
.sec-head .sec-tip{font-size:12px;color:var(--muted-2);white-space:nowrap}

/* ---------------- 筛选 ---------------- */
.filter-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:14px 16px}
.f-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.f-row + .f-row{margin-top:11px;padding-top:11px;border-top:1px dashed var(--line-soft)}
.f-label{font-size:12.5px;color:var(--muted);min-width:60px;flex:0 0 auto}
.chips{display:flex;gap:7px;flex-wrap:wrap}
.chip{height:30px;padding:0 12px;border-radius:8px;border:1px solid var(--line);background:#fff;
  color:var(--text-2);font-size:12.5px;cursor:pointer;display:inline-flex;align-items:center;gap:5px}
.chip:hover{border-color:#c8d2e2;background:#f8fafd}
.chip.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.chip .cnt{background:rgba(255,255,255,.28);border-radius:5px;padding:0 5px;font-size:11px}
.chip:not(.on) .cnt{background:#eef1f6;color:var(--muted)}
input[type=date]{height:30px;border:1px solid var(--line);border-radius:8px;padding:0 8px;font-size:12.5px;
  color:var(--text-2);background:#fff;font-family:inherit}
input[type=date]:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.pick-btn{height:30px;min-width:150px;max-width:250px;padding:0 11px;border-radius:8px;border:1px solid var(--line);
  background:#fff;color:var(--text-2);font-size:12.5px;cursor:pointer;text-align:left;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pick-btn:hover{border-color:#c8d2e2;background:#f8fafd}
.pick-btn.on{border-color:var(--brand);color:var(--brand);background:var(--brand-soft);font-weight:600}
.f-actions{margin-left:auto;display:flex;gap:8px;align-items:center}
.dirty{font-size:12px;color:var(--warn)}
.scope-bar{margin-top:11px;padding-top:10px;border-top:1px dashed var(--line-soft);font-size:12.5px;
  color:var(--muted);display:flex;gap:16px;flex-wrap:wrap}
.scope-bar b{color:var(--text)}
.tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.tag{display:inline-flex;align-items:center;gap:5px;background:var(--brand-soft);color:#1b3fbf;
  border:1px solid #d3e0ff;border-radius:7px;padding:2px 4px 2px 9px;font-size:12px}
.tag i{cursor:pointer;font-style:normal;opacity:.6;padding:0 3px;border-radius:4px}
.tag i:hover{opacity:1;background:#fff}
.tag.more{background:#f1f3f7;color:var(--muted);border-color:var(--line);padding:2px 9px}

/* ---------------- KPI ---------------- */
.kpis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px}
.kpi{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:13px 15px 14px;position:relative;overflow:hidden}
.kpi .k-name{font-size:12.5px;color:var(--muted);display:flex;align-items:center;gap:5px;margin-bottom:7px}
.kpi .k-name .hint{width:14px;height:14px;border-radius:50%;border:1px solid var(--muted-2);color:var(--muted-2);
  font-size:10px;display:inline-flex;align-items:center;justify-content:center;cursor:help;flex:0 0 auto}
.kpi .k-val{font-size:23px;font-weight:700;letter-spacing:-.4px;line-height:1.15;word-break:break-all}
.kpi .k-val .unit{font-size:13px;font-weight:600;color:var(--muted);margin-left:2px;letter-spacing:0}
.kpi .k-s{font-size:11.5px;color:var(--muted-2);margin-top:6px;display:flex;gap:8px;flex-wrap:wrap;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.delta{font-weight:600}
.delta.up{color:var(--up)}
.delta.down{color:var(--down)}
.delta.flat{color:var(--muted-2)}
.kpi.accent{background:linear-gradient(180deg,#f7faff,#fff);border-color:#d9e4ff}

/* ---------------- 卡片 ---------------- */
.grid4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.span-1{grid-column:span 1}
.span-2{grid-column:span 2}
.span-3{grid-column:span 3}
.span-4{grid-column:span 4}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);display:flex;flex-direction:column;min-width:0}
.card-head{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--line-soft)}
.card-head h3{margin:0;font-size:14px;font-weight:650;white-space:nowrap}
.card-head .c-sub{font-size:12px;color:var(--muted-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card-head .head-tools{margin-left:auto;display:flex;gap:8px;align-items:center}
.card-body{padding:12px 16px 16px;flex:1;min-width:0}
.chart-host{width:100%;min-width:0}
.chart-host svg{display:block;width:100%;height:auto}

/* ---------------- 排行 ---------------- */
.rank{display:flex;flex-direction:column;gap:9px}
.rank-item{display:grid;grid-template-columns:22px minmax(90px,150px) 1fr auto;gap:9px;align-items:center;font-size:12.5px}
.rank-item .no{width:20px;height:20px;border-radius:6px;background:#f1f3f7;color:var(--muted);
  display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}
.rank-item:nth-child(1) .no{background:#ffe8e5;color:#c0392b}
.rank-item:nth-child(2) .no{background:#fff2e0;color:#b4741a}
.rank-item:nth-child(3) .no{background:#e9f5ff;color:#1b6fb8}
.rank-item .nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rank-item .bar{height:8px;background:#f1f3f7;border-radius:5px;overflow:hidden}
.rank-item .bar i{display:block;height:100%;border-radius:5px;background:linear-gradient(90deg,#3b74ff,#7aa2ff)}
.rank-item .bar i.m{background:linear-gradient(90deg,#ff8f3b,#ffc07a)}
.rank-item .vv{font-variant-numeric:tabular-nums;font-weight:600;white-space:nowrap;text-align:right}
.rank-item .vv em{font-style:normal;font-weight:400;color:var(--muted-2);margin-left:6px;font-size:11.5px}

/* ---------------- 表格 ---------------- */
.tbl-wrap{overflow:auto;max-height:560px;border-radius:9px;border:1px solid var(--line-soft)}
table.tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px}
table.tbl th,table.tbl td{padding:8px 11px;text-align:right;white-space:nowrap;
  border-bottom:1px solid var(--line-soft);font-variant-numeric:tabular-nums}
table.tbl thead th{position:sticky;top:0;z-index:2;background:#f7f9fc;color:var(--text-2);font-weight:650;
  font-size:12px;cursor:pointer;border-bottom:1px solid var(--line)}
table.tbl thead th:hover{background:#eef2f8}
table.tbl th.tl,table.tbl td.tl{text-align:left}
table.tbl tbody tr:hover{background:#fafbfd}
table.tbl tbody tr:nth-child(even){background:#fcfdff}
table.tbl tbody tr:nth-child(even):hover{background:#f6f8fc}
.tbl-detail,.tbl-detail th,.tbl-detail td{user-select:none;-webkit-touch-callout:none}
.no-export{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;color:var(--muted-2);
  border:1px dashed var(--line);border-radius:7px;padding:2px 9px;background:#fafbfd;cursor:not-allowed}
.mini-search{height:28px;width:150px;border:1px solid var(--line);border-radius:7px;padding:0 9px;
  font-size:12.5px;background:#fff;font-family:inherit}
.mini-search:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.mini-select{height:28px;border:1px solid var(--line);border-radius:7px;padding:0 7px;font-size:12.5px;
  background:#fff;font-family:inherit;color:var(--text-2);max-width:180px}
.mini-select:focus{outline:none;border-color:var(--brand)}

/* ---------------- 选择面板 ---------------- */
.mask{position:fixed;inset:0;background:rgba(17,24,39,.34);z-index:60;display:flex;
  align-items:flex-start;justify-content:center;padding:70px 20px 30px;overflow:auto}
.panel{width:100%;max-width:520px;background:#fff;border-radius:14px;box-shadow:0 20px 60px rgba(16,24,40,.24);
  display:flex;flex-direction:column;max-height:min(76vh,720px)}
.panel-head{padding:15px 18px;border-bottom:1px solid var(--line-soft);display:flex;align-items:center;gap:10px}
.panel-head h3{margin:0;font-size:14.5px}
.panel-head .x{margin-left:auto;border:none;background:#f1f3f7;width:28px;height:28px;border-radius:8px;
  cursor:pointer;color:var(--muted);font-size:15px;line-height:1}
.panel-head .x:hover{background:#e6eaf1;color:var(--text)}
.panel-search{padding:12px 18px;border-bottom:1px solid var(--line-soft);display:flex;gap:9px;align-items:center}
.panel-search input{flex:1;height:36px;border:1px solid var(--line);border-radius:9px;padding:0 11px;
  font-size:13px;font-family:inherit}
.panel-search input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.panel-list{overflow:auto;padding:6px 8px;flex:1;min-height:110px}
.opt{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;cursor:pointer;font-size:13px}
.opt:hover{background:#f6f8fc}
.opt input{width:15px;height:15px;accent-color:var(--brand);flex:0 0 auto}
.opt span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.opt .geo{color:var(--muted-2);font-size:11.5px;margin-left:auto;flex:0 0 auto}
.panel-foot{padding:12px 18px;border-top:1px solid var(--line-soft);display:flex;align-items:center;gap:10px}
.panel-foot .hint{font-size:12.5px;color:var(--muted);margin-right:auto}
.panel-foot .btn{height:36px;padding:0 16px}

/* ---------------- 分享弹窗 ---------------- */
.share-link{display:flex;gap:8px;margin-bottom:12px}
.share-link input{flex:1;height:38px;border:1px solid var(--line);border-radius:9px;padding:0 11px;
  font-size:13px;background:#f8fafd;font-family:ui-monospace,Menlo,monospace;color:var(--text-2)}
.share-msg{background:var(--warn-bg);border:1px solid var(--warn-line);border-radius:10px;padding:12px 14px;
  font-size:12.5px;line-height:1.75;color:var(--warn);white-space:pre-wrap;max-height:220px;overflow:auto}

/* ---------------- 状态条 ---------------- */
.load-err{background:#fdecec;border:1px solid #f6c9c6;color:#b42318;border-radius:10px;
  padding:11px 14px;font-size:13px;margin-bottom:14px;display:flex;align-items:center;gap:12px}
.load-err .sp{flex:1}
.load-err button{height:30px;padding:0 12px;border-radius:8px;border:1px solid #e9a9a3;background:#fff;
  color:#b42318;font-size:12.5px;cursor:pointer;white-space:nowrap}
.note{font-size:12px;color:var(--muted);line-height:1.7}
.note ul{margin:6px 0 0;padding-left:18px}
.note li{margin-bottom:3px}
.empty{padding:34px 10px;text-align:center;color:var(--muted-2);font-size:13px}
.toast{position:fixed;left:50%;bottom:36px;transform:translateX(-50%);background:#111827;color:#fff;
  padding:9px 18px;border-radius:9px;font-size:13px;z-index:90;box-shadow:0 8px 24px rgba(0,0,0,.24)}
.tipbox{position:fixed;z-index:95;max-width:290px;background:#111827;color:#e5e7eb;font-size:12px;
  line-height:1.6;padding:9px 12px;border-radius:9px;box-shadow:0 10px 30px rgba(0,0,0,.28);pointer-events:none}

/* ---------------- 响应式 ---------------- */
@media (max-width:1520px){
  .kpis{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:1240px){
  .grid4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .span-3,.span-4{grid-column:span 2}
}
@media (max-width:820px){
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid4{grid-template-columns:minmax(0,1fr)}
  .span-2,.span-3,.span-4{grid-column:span 1}
  .topbar-in{height:auto;padding:10px 14px;flex-wrap:wrap}
  .topbar .meta{order:9;flex:1 1 100%;white-space:normal}
  .page{padding:12px 14px 50px}
  .f-label{min-width:auto;flex:1 1 100%}
  .f-actions{margin-left:0;flex:1 1 100%}
  .card-head{flex-wrap:wrap}
  .card-head h3{flex:1 1 100%}
  .card-head .head-tools{flex:1 1 100%;flex-wrap:wrap;margin-left:0}
  .mini-search{flex:1 1 130px;width:auto;min-width:110px}
  .mini-select{flex:1 1 auto;min-width:0;max-width:100%}
  .rank-item{grid-template-columns:20px minmax(70px,110px) 1fr auto}
}
@media (max-width:480px){
  .kpis{grid-template-columns:minmax(0,1fr)}
  .rank-item{grid-template-columns:20px 1fr auto}
  .rank-item .bar{display:none}
}
