/* ============ 畅行视界 · 终端风格（配色取自 fmo-show） ============ */
:root{
  --bg:#0b1a2e;
  --card:#12243d;
  --surface-2:#172b47;
  --surface-3:#1c3454;
  --border:#24446b;
  --line:#1e3a5f;
  --text:#ffffff;
  --text-2:#c2d3e6;
  --text-3:#8fa6bd;
  --blue:#3b82f6;
  --blue-2:#3b82f6;
  --blue-weak:#132a4a;
  --green:#22c55e;
  --amber:#eab308;
  --c1:#22c55e;   /* 畅通 */
  --c2:#eab308;   /* 缓行 */
  --c3:#f97316;   /* 拥堵 */
  --c4:#ef4444;   /* 严重拥堵 */
  --c1-bg:#0e2b2a; --c2-bg:#2b2a13; --c3-bg:#2b1d15; --c4-bg:#2b1619;
  --shadow:none;
  --radius:6px;
  --r-card:6px;
  --r-btn:4px;
  --r-tag:3px;
  --r-pill:999px;
  --font:"Microsoft YaHei","PingFang SC","Segoe UI",sans-serif;
  --font-mono:Consolas,Menlo,"Courier New",monospace;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:var(--font);
  background:var(--bg); color:var(--text); font-size:13px; line-height:1.55;
  overflow-x:hidden;
}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
.sim-clock b,.wo-id,.term-id,code,#simTimeText{font-family:var(--font-mono)}
.hidden{display:none!important}
*:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
button:focus-visible,select:focus-visible,input:focus-visible{box-shadow:none}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:#4a6785;border-radius:4px}
::-webkit-scrollbar-track{background:transparent}

/* ---------- 顶部栏 ---------- */
.topbar{
  position:sticky;top:0;z-index:60;display:flex;align-items:center;gap:18px;
  background:#0f1e33;border-bottom:1px solid var(--border);
  padding:10px 20px; box-shadow:none;
}
.brand{display:flex;align-items:center;gap:10px;min-width:300px}
.brand-logo{width:38px;height:38px;border-radius:3px;background:var(--blue-weak);display:grid;place-items:center;flex:none}
.brand-text h1{font-size:18px;font-weight:700;letter-spacing:.5px;line-height:1.2;color:var(--text)}
.brand-text .ver{font-size:11px;font-weight:400;color:var(--text-3);background:var(--bg);border:1px solid var(--border);padding:1px 7px;border-radius:3px;margin-left:6px;vertical-align:2px}
.brand-text p{font-size:11px;color:var(--text-2)}
.main-nav{display:flex;gap:4px;background:#1c3454;padding:4px;border-radius:3px;flex:1;justify-content:center}
.nav-item{
  display:flex;align-items:center;gap:7px;padding:7px 18px;border-radius:3px;
  font-size:14px;color:var(--text-2);font-weight:500;transition:.15s;
}
.nav-item:hover{color:var(--blue-2)}
.nav-item.active{background:#0f1e33;color:var(--blue-2);box-shadow:none;font-weight:600}
.ni-ico{width:14px;height:14px;border-radius:4px;display:inline-block;position:relative;flex:none}
.ni-n{background:#3b82f6}
.ni-c{background:#22c55e}
.ni-d{background:#3b82f6}
.ni-a{background:#3b82f6}
.ni-r{background:#3b82f6}
.ni-ico::after{content:"";position:absolute;inset:3px;background:rgba(8,21,40,.35);border-radius:2.5px}
.top-tools{display:flex;align-items:center;gap:10px;min-width:330px;justify-content:flex-end}
.sim-clock{display:flex;align-items:baseline;gap:6px;background:#12243d;color:#ffffff;padding:6px 14px;border-radius:3px}
.sim-clock .sc-label{font-size:11px;color:#3b82f6}
.sim-clock b{font-size:17px;font-variant-numeric:tabular-nums;letter-spacing:1px}
.sim-clock .sc-date{font-size:11px;color:#3b82f6}
.date-control{display:flex;align-items:center;gap:5px;padding:5px 7px;background:#1c3454;border:1px solid var(--border);border-radius:3px;color:var(--text-3);font-size:11px;white-space:nowrap}.date-control input,.date-control select{color:var(--text);border:0;outline:0;background:transparent;font:inherit;cursor:pointer}.date-control input{width:102px}.date-control select{max-width:86px}.date-control option{background:var(--card);color:var(--text)}
.day-type-badge{font-size:11px;padding:4px 7px;border:1px solid var(--border);border-radius:3px;color:var(--text-2);white-space:nowrap}.day-type-badge.workday{color:var(--blue-2);background:var(--blue-weak)}.day-type-badge.weekend{color:#3b82f6;background:#1c3454}.day-type-badge.holiday{color:#eab308;background:#2c2a12;border-color:#eab308}
.sim-state{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);background:#1c3454;padding:6px 10px;border-radius:3px}
.sim-state .dot{width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:none}
.sim-state.paused .dot{background:var(--amber);box-shadow:none}
.tool-group{display:flex;gap:6px}
.tbtn{background:#1c3454;border:1px solid var(--border);padding:6px 12px;border-radius:3px;font-size:12px;color:var(--text-2);transition:all 150ms cubic-bezier(0.4,0,0.2,1)}
.tbtn:hover{border-color:var(--blue);color:var(--blue-2);transform:translateY(-1px)}
.tbtn:active{transform:translateY(0)}
.tbtn.on{background:var(--blue);color:#ffffff;border-color:var(--blue)}
.tbtn.off{opacity:.55;filter:grayscale(.4)}
.tselect{background:#1c3454;border:1px solid var(--border);border-radius:3px;padding:6px 8px;font-size:12px;color:var(--text);outline:none;transition:border-color 150ms}

/* ---------- 布局 ---------- */
.main{max-width:1560px;margin:0 auto;padding:16px 18px 16px}
.view{display:none}
.view.active{display:block;animation:fadein .25s ease}
.view.fadeout{display:block;animation:fadeout .2s ease forwards}
@keyframes fadein{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@keyframes fadeout{from{opacity:1;transform:none}to{opacity:0;transform:translateY(-4px)}}
.card{background:#12243d;border:1px solid var(--border);border-radius:var(--radius);box-shadow:none;padding:14px 16px;transition:border-color 200ms}
.card:hover{border-color:rgba(59,130,246,0.4)}
.card-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.card-head h3{font-size:15px;font-weight:600;display:flex;align-items:center;gap:8px}
.card-head h3::before{content:"";width:4px;height:15px;border-radius:2px;background:var(--blue-2)}
.card-head.sub{margin-top:8px;margin-bottom:6px}
.card-head.sub h4{font-size:13px;font-weight:600}
.card-head.sub h4::before{content:"";width:4px;height:13px;border-radius:2px;background:#3b82f6;margin-right:7px;display:inline-block}
.head-tip{font-size:11px;color:var(--text-3)}
.seg{display:flex;background:#1c3454;padding:3px;border-radius:3px}
.seg-item{padding:5px 13px;border-radius:3px;font-size:12px;color:var(--text-2)}
.seg-item.active{background:#0f1e33;color:var(--blue-2);font-weight:600;box-shadow:none}
.seg-sm .seg-item{padding:4px 10px;font-size:12px}

/* ---------- 通用按钮 ---------- */
.primary-btn{background:var(--blue);color:#ffffff;border-radius:3px;padding:8px 16px;font-size:13px;font-weight:600;transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease,filter 150ms ease,opacity 150ms ease}
.primary-btn:hover{filter:brightness(1.08);transform:none;box-shadow:none}
.primary-btn:active{transform:none}
.primary-btn.ghost{background:#1c3454;color:var(--blue-2);border:1px solid var(--blue)}
.primary-btn.on{opacity:.8;cursor:wait}
.mini-btn{background:#1c3454;border-radius:3px;padding:4px 9px;font-size:12px;color:var(--text-2);transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease,filter 150ms ease,opacity 150ms ease}
.mini-btn:hover{color:var(--blue-2);transform:none}
.mini-btn:active{transform:none}
.mini-btn.primary{background:var(--blue);color:#ffffff;font-weight:600}
.mini-btn.primary:hover{background:#3b82f6;color:#ffffff}
.mini-btn.danger{color:#ef4444}
.mini-btn.danger.solid{background:#3a1a1a;color:#f87171;border:1px solid rgba(239,68,68,.45);font-weight:600}
.mini-btn.danger.solid:hover{background:#4a2020;color:#fecaca}

/* ---------- KPI ---------- */
.kpi-row{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:14px}
.kpi{display:flex;align-items:center;gap:14px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;box-shadow:none}
.kpi .k-ico{width:44px;height:44px;border-radius:3px;display:grid;place-items:center;flex:none;font-size:22px}
.kpi .k-body{flex:1;min-width:0}
.kpi .k-label{font-size:12px;color:var(--text-3)}
.kpi .k-value{font-size:24px;font-weight:700;line-height:1.15;font-variant-numeric:tabular-nums}
.kpi .k-value small{font-size:13px;font-weight:400;color:var(--text-3);margin-left:3px}
.kpi .k-sub{font-size:11px;color:var(--text-3);margin-top:1px}
.kpi .k-sub b{color:var(--text-2);font-weight:600}
.bg-blue{background:var(--blue-weak)} .bg-green{background:#10291a}.bg-amber{background:#2c2a12}.bg-red{background:#2a1e12}
.lv-tag{display:inline-flex;align-items:center;font-size:11px;padding:0 8px;border-radius:3px;height:18px}
.lv-tag.s1{color:#22c55e;background:var(--c1-bg)}
.lv-tag.s2{color:#eab308;background:var(--c2-bg)}
.lv-tag.s3{color:#f97316;background:var(--c3-bg)}
.lv-tag.s4{color:#ef4444;background:var(--c4-bg)}
.lv-tag.s5{color:var(--text-2);background:#1c3454}

/* ---------- 全国态势 ---------- */
.nat-grid{display:grid;grid-template-columns:1.6fr 1fr;grid-auto-rows:auto;gap:14px}
.nat-map-card,.trend-card,.note-card{grid-column:1}
.rank-card{grid-column:2;grid-row:span 2}
.nat-canvas-wrap{position:relative;min-height:430px;border-radius:3px;overflow:hidden;background:#0f1e33;border:1px solid #3b82f6}
.nat-canvas-wrap canvas{width:100%;height:100%;display:block}
.canvas-chip{position:absolute;top:10px;left:10px;background:rgba(18,36,61,.75);border:1px solid rgba(59,130,246,.25);border-radius:3px;padding:4px 10px;font-size:12px;color:#ffffff;box-shadow:none}
.canvas-legend{position:absolute;right:10px;bottom:10px;display:flex;gap:8px;background:rgba(18,36,61,.75);border:1px solid rgba(59,130,246,.25);padding:5px 9px;border-radius:3px}
.canvas-legend .lg-i{display:flex;align-items:center;gap:5px;font-size:11px;color:#ffffff}
.canvas-legend .lg-i i{width:11px;height:11px;border-radius:3px;display:inline-block}
/* 历史回放控制条（浮在地图画布底部） */
.replay-bar{position:absolute;left:10px;right:10px;bottom:42px;z-index:3;display:flex;align-items:center;gap:10px;background:rgba(18,36,61,.88);border:1px solid rgba(59,130,246,.3);border-radius:3px;padding:7px 12px;}
.replay-bar.hidden{display:none}
.replay-bar .rbtn{background:#1c3454;border:1px solid rgba(59,130,246,.35);color:#3b82f6;border-radius:3px;padding:4px 12px;font-size:13px;min-width:52px;cursor:pointer}
.replay-bar .rbtn:hover{border-color:var(--blue);color:var(--blue-2)}
.replay-bar .rbtn.ghost{background:transparent;color:#3b82f6;min-width:auto;padding:4px 8px;font-size:12px}
.replay-bar input[type=range]{flex:1;accent-color:#3b82f6;cursor:pointer}
.replay-bar .rtime{font-family:"Consolas",monospace;font-size:13px;color:#3b82f6;min-width:52px;text-align:center}
.legend-item{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text-2);margin-right:4px}
.legend-item:last-child{margin-right:0}
.legend-item i{width:10px;height:10px;border-radius:3px;display:inline-block}
.rank-list{max-height:640px;overflow:auto;display:flex;flex-direction:column;gap:6px;padding-right:2px}
/* 卡片式排名项：默认仅显示主行+进度条，hover 展开 5 行明细 */
.rank-i{position:relative;display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:3px;cursor:pointer;border:1px solid transparent;background:rgba(28,52,84,.45);transition:background .18s,border-color .18s,box-shadow .18s}
.rank-i:hover{background:rgba(59,130,246,.15);border-color:rgba(59,130,246,.5);box-shadow:none}
.rank-i .rank-row{display:flex;align-items:center;gap:8px}
.rank-i .rank-no{width:28px;flex:none;text-align:center;font-weight:800;font-size:24px;color:var(--text-3);font-variant-numeric:tabular-nums;line-height:1}
.rank-i .rank-no.top{color:#0f1e33;border-radius:3px}
.rank-i .rank-no.top:nth-child(1),.rank-i:has(.rank-no.top):nth-child(1) .rank-no.top{background:#ef4444}
/* 让 top1/2/3 直接通过 :nth-of-type 选择（卡片列表容器内） */
.rank-list .rank-i:nth-of-type(1) .rank-no.top{background:#ef4444;color:#0f1e33}
.rank-list .rank-i:nth-of-type(2) .rank-no.top{background:#3b82f6;color:#0f1e33}
.rank-list .rank-i:nth-of-type(3) .rank-no.top{background:#eab308;color:#0f1e33}
.rank-i .rank-no.free{background:rgba(34,197,94,.18);color:#22c55e;font-size:13px;border-radius:3px;padding:2px 0}
.rank-i .rank-name{flex:1;min-width:0;font-size:15px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rank-name .warn-tag{font-style:normal;font-size:11px;color:#ef4444;background:rgba(239,68,68,.14);border:1px solid rgba(239,68,68,.45);border-radius:3px;padding:0 3px;margin-left:4px;vertical-align:1px;animation:warnPulse 1.2s ease-in-out infinite}
@keyframes warnPulse{0%,100%{opacity:1}50%{opacity:.45}}
.rank-i .rank-cur{flex:none;font-size:15px;font-weight:700;font-variant-numeric:tabular-nums;padding:0 6px}
.rank-i .rank-cur.s1{color:#22c55e}
.rank-i .rank-cur.s2{color:#eab308}
.rank-i .rank-cur.s3{color:#f97316}
.rank-i .rank-cur.s4{color:#ef4444}
.rank-i .rank-trend{flex:none;font-size:14px;font-weight:700;width:18px;text-align:center}
.rank-i .rank-trend.wk-up{color:#ef4444}
.rank-i .rank-trend.wk-down{color:#22c55e}
.rank-i .rank-trend.wk-flat{color:#8fa6bd}
/* 排行条：20% 起底，数字之外的第二种编码；实色等级色，不加发光 */
.rank-i .rank-bar{height:5px;background:rgba(59,130,246,.12);border-radius:3px;overflow:hidden}
.rank-i .rank-bar i{display:block;min-width:20%;height:100%;border-radius:3px;transition:width .6s cubic-bezier(.4,0,.2,1)}
/* hover 展开明细（无 transition：展开/收起瞬时完成，避免与每 200ms 的增量刷新
   或排序变化时的重建叠加产生"过渡动画被打断→反复闪烁"） */
.rank-i .rank-detail{display:flex;flex-direction:column;gap:3px;max-height:0;overflow:hidden;opacity:0;margin-top:0}
.rank-i:hover .rank-detail{max-height:260px;opacity:1;margin-top:4px}
.rank-i .rk-row{display:flex;justify-content:space-between;align-items:center;font-size:12px;padding:3px 6px;border-radius:2px}
.rank-i .rk-row:hover{background:rgba(255,255,255,.04)}
.rank-i .rk-k{color:#c2d3e6}
.rank-i .rk-v{color:#ffffff;font-weight:600;font-variant-numeric:tabular-nums}
.rank-i .rk-v b{font-size:14px;color:#ffffff;font-weight:700}
.rank-i .rk-v em{font-style:normal;color:#8fa6bd;font-weight:500;margin-left:2px;font-size:11px}
.rank-i .rk-v.wk-up{color:#ef4444}
.rank-i .rk-v.wk-down{color:#22c55e}
.rank-i .rk-v.wk-flat{color:#c2d3e6}
.rank-i .rk-v i{font-style:normal;margin-right:4px;font-size:14px;line-height:1;display:inline-block;vertical-align:middle}
.rank-i .rk-v i.w-sun{color:#3b82f6}
.rank-i .rk-v i.w-cloud{color:#c2d3e6}
.rank-i .rk-v i.w-overcast{color:#c2d3e6}
.rank-i .rk-v i.w-rain{color:#3b82f6}
.trend{font-size:11px;color:var(--text-3)}
.rank-note{margin-top:8px;font-size:11px;color:var(--text-3);text-align:right}
.trend-chart{height:220px;position:relative}
.trend-chart svg{width:100%;height:100%;display:block}
.trend-axis{position:absolute;left:0;right:0;bottom:0;height:14px;font-size:11px;color:var(--text-3);pointer-events:none}
.trend-axis span{position:absolute;white-space:nowrap;transform:translateX(-50%)}
.note-list{list-style:none;display:flex;flex-direction:column;gap:6px}
.note-list li{font-size:12px;color:var(--text-2);padding-left:14px;position:relative}
.note-list li::before{content:"";position:absolute;left:0;top:7px;width:5px;height:5px;border-radius:50%;background:var(--blue)}
.note-list code{background:#1c3454;border:1px solid var(--border);border-radius:4px;padding:0 4px;font-size:11px;color:#ef4444}

/* ---------- 城市路况 ---------- */
.city-layout{display:grid;grid-template-columns:1fr 340px;gap:14px}
.map-card{padding:0;overflow:hidden}
.city-canvas-wrap{position:relative;height:calc(100vh - 210px);min-height:560px;background:#0b1a2e}
.city-canvas-wrap canvas{width:100%;height:100%;display:block;cursor:grab}
.city-canvas-wrap canvas.dragging{cursor:grabbing}
.city-topbar{position:absolute;top:12px;left:12px;display:flex;align-items:flex-start;gap:8px;background:rgba(11,26,46,.97);border:1px solid var(--border);border-radius:4px;padding:9px 11px;box-shadow:none;max-width:calc(100% - 352px);flex-wrap:wrap}
.ct-label{font-size:12px;color:var(--text-3);font-weight:600;white-space:nowrap}
.city-chips{display:flex;flex-direction:column;gap:4px;max-height:calc(100vh - 280px);overflow-y:auto;padding-right:2px}
.city-chip-row{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.city-chip-tier{font-size:11px;color:var(--text-3);font-weight:600;flex-shrink:0;display:inline-flex;align-items:center;gap:3px;white-space:nowrap}
.city-chip-tier i{font-style:normal;color:#ffffff;background:var(--blue);border-radius:3px;padding:0 5px;font-size:11px;line-height:14px;min-width:14px;text-align:center}
.city-chip{border:1px solid var(--border);border-radius:4px;padding:2px 11px;font-size:12px;color:var(--text-2);background:#0f1e33}
.city-chip:hover{color:var(--blue);border-color:var(--blue)}
.city-chip.active,.city-chip.on{background:var(--blue);border-color:var(--blue);color:#ffffff;font-weight:600;box-shadow:none}
.city-stat{position:absolute;top:0;left:12px;width:238px;background:rgba(18,36,61,.93);;border:1px solid rgba(59,130,246,.26);border-radius:4px;padding:11px 13px 10px;box-shadow:none}
.stat-hd{display:flex;align-items:center;gap:7px;margin-bottom:9px}
.stat-hd .dot{width:7px;height:7px;border-radius:50%;flex:none;box-shadow:none}
.stat-hd b{font-size:14px;color:var(--text);letter-spacing:.5px}
.stat-hd .lv-tag{margin-left:auto}
.stat-grid{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:rgba(255,255,255,.07);border-radius:3px;overflow:hidden}
.stat-grid>div{background:rgba(11,26,46,.72);padding:7px 10px 6px}
.stat-grid b{display:block;font-size:15.5px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stat-grid span{display:block;margin-top:1px;font-size:11px;color:var(--text-3)}
.stat-net{display:flex;align-items:baseline;gap:5px;margin-top:9px;padding-top:8px;border-top:1px dashed rgba(255,255,255,.09);font-size:11px;color:var(--text-3);white-space:nowrap}
.stat-net>span{margin-right:auto}
.stat-net b{font-size:11.5px;font-weight:600;color:var(--text-2);font-variant-numeric:tabular-nums}
.stat-net em{font-style:normal;font-size:11px;color:var(--text-3)}
.stat-net i{width:1px;height:9px;background:rgba(255,255,255,.14)}
.cs-title{font-size:12px;color:var(--text-3);margin-bottom:6px;display:flex;align-items:center;gap:6px}
.cs-title b{color:var(--text)}
.cs-main{display:flex;align-items:baseline;gap:6px}
.cs-idx{font-size:30px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums}
.cs-main .lv-tag{margin-left:4px}
.cs-meta{margin-top:7px;display:flex;flex-direction:column;gap:3px;font-size:11px;color:var(--text-2)}
.cs-meta span{display:flex;justify-content:space-between;gap:14px}
.cs-meta span b{font-variant-numeric:tabular-nums}
.city-legend{position:absolute;left:0;right:0;bottom:38px;width:fit-content;margin:0 auto;display:flex;flex-wrap:wrap;justify-content:center;gap:8px;max-width:calc(100% - 130px);background:rgba(18,36,61,.94);border:1px solid var(--border);border-radius:3px;padding:6px 10px;box-shadow:none;font-size:11.5px;color:#ffffff;z-index:5}
.city-legend .lg-i{display:flex;align-items:center;gap:5px;padding:2px 4px;border-radius:4px}
.city-legend .lg-i:hover{background:#1c3454}
.city-legend .lg-i i{display:inline-block;border-radius:3px;flex-shrink:0}
.city-legend .lg-i i.sw{width:22px;height:6px;border-radius:3px;border:1px solid rgba(255,255,255,.15)}
.city-legend .lg-i i.dot{width:12px;height:12px;border-radius:50%;border:1.5px solid #ffffff;box-shadow:none}
.city-legend .lg-i i.warn{width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:11px solid #ef4444;position:relative}
.city-legend .lg-i i.warn::before{content:"!";position:absolute;top:1px;left:-2px;font-size:11px;font-weight:700;color:#ffffff;line-height:1}
.city-legend .lg-i i.hot{width:11px;height:11px;border-radius:50%;border:1.5px dashed #ef4444;box-sizing:border-box}
.city-legend .lg-divider{width:1px;height:14px;background:var(--border);margin:0 2px}
.city-legend .legend-item i.w4{width:12px;height:3px;border-radius:2px}
.map-hint{position:absolute;right:14px;bottom:10px;font-size:11px;color:#c2d3e6;background:rgba(18,36,61,.85);padding:2px 8px;border-radius:3px}
.tile-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(18,36,61,.97);border:1px solid var(--border);border-radius:3px;padding:16px 24px;box-shadow:none;display:flex;align-items:center;gap:12px;opacity:0;pointer-events:none;transition:opacity 200ms ease-out}
.tile-loading.show{opacity:1;pointer-events:auto}
.loading-spinner{width:20px;height:20px;border:3px solid var(--border);border-top-color:var(--blue);border-radius:50%;animation:spin 800ms linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.tile-loading span{font-size:13px;color:var(--text-2)}
.city-side{position:absolute;top:12px;right:12px;width:312px;background:rgba(11,26,46,.97);border:1px solid var(--border);border-radius:4px;box-shadow:none;overflow:hidden}
.side-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 0}
.side-list{height:300px;overflow:auto;padding:8px 9px 10px}
.side-item{display:flex;flex-direction:row;align-items:center;gap:8px;padding:8px 9px;border-radius:3px;cursor:pointer;border-bottom:1px dashed var(--line);transition:background 140ms ease,box-shadow 140ms ease}
.side-item:last-child{border-bottom:none}
.side-item:hover{background:#1c3454;box-shadow:none}
.si-dot{flex:none;width:8px;height:8px;border-radius:50%}
.si-ico{flex:none;width:22px;height:22px;border-radius:3px;display:grid;place-items:center;font-size:12px}
.si-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
.si-mid b{font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.si-mid span{font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.si-tag{flex:none;font-size:11px;line-height:1;padding:3px 6px;border-radius:2px;white-space:nowrap}
.si-tag.lv1{color:#22c55e;background:var(--c1-bg)}
.si-tag.lv2{color:#eab308;background:var(--c2-bg)}
.si-tag.lv3{color:#f97316;background:var(--c3-bg)}
.si-tag.lv4{color:#ef4444;background:var(--c4-bg)}
.si-tag.s1{color:#3b82f6;background:#1c3454}
.empty-mini{padding:16px 8px;text-align:center;font-size:12px;color:var(--text-3)}
.hot-rank{flex:none;width:20px;height:20px;border-radius:3px;display:grid;place-items:center;font-size:11px;font-weight:700;font-variant-numeric:tabular-nums}
.hot-rank.hi{color:#ef4444;background:rgba(239,68,68,.16);border:1px solid rgba(239,68,68,.45)}
.hot-rank.mid{color:#f97316;background:rgba(249,115,22,.16);border:1px solid rgba(249,115,22,.45)}
.hot-rank.lo{color:#eab308;background:rgba(234,179,8,.16);border:1px solid rgba(234,179,8,.45)}
.hot-cnt{flex:none;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
.hot-cnt.on{color:#ef4444;font-weight:600}
.si-top{display:flex;align-items:center;gap:7px;font-size:12px}
.si-top b{flex:1;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.si-top .lv-tag{flex:none}
.si-meta{font-size:11px;color:var(--text-3);display:flex;gap:10px;padding-left:2px}
.si-event{display:flex;gap:8px;align-items:flex-start;padding:7px 6px;border-radius:3px;cursor:pointer}
.si-event:hover{background:#1c3454}
.se-ico{flex:none;width:22px;height:22px;border-radius:3px;display:grid;place-items:center;font-size:12px;margin-top:1px}
.se-body{flex:1;min-width:0}
.se-body b{font-size:12px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.se-body span{font-size:11px;color:var(--text-3)}
.zoom-tools{position:absolute;right:14px;bottom:34px;display:flex;flex-direction:column;gap:5px}
.zoom-tools button{width:30px;height:30px;border-radius:3px;background:#0f1e33;border:1px solid var(--border);box-shadow:none;font-size:16px;color:var(--text-2);display:grid;place-items:center}
.zoom-tools button:hover{color:var(--blue);border-color:var(--blue)}
.city-popup{position:absolute;background:#12243d;border:1px solid var(--border);border-radius:4px;box-shadow:none;padding:12px 14px 10px;min-width:236px;z-index:20}
.pop-title{font-weight:700;font-size:13px;margin-bottom:6px;padding-bottom:8px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:6px}
.pop-row{display:flex;justify-content:space-between;font-size:12px;color:var(--text-2);padding:2px 0;gap:14px}
.pop-row b{color:var(--text);font-variant-numeric:tabular-nums}
.city-aside{display:flex;flex-direction:column;gap:6px;max-height:calc(100vh - 210px);overflow-y:auto;padding-right:2px}
.road-stat{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:8px}
.road-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 9px;background:#1c3454;border:1px solid var(--line);border-radius:3px;font-size:11px;color:var(--text-3);min-width:0}
.road-row span{display:inline-flex;align-items:center;gap:5px;min-width:0;white-space:nowrap}
.road-row b{font-size:14px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap}
.road-row.lv1 span::before,.road-row.lv2 span::before,.road-row.lv3 span::before,.road-row.lv4 span::before{content:"";width:6px;height:6px;border-radius:50%;flex:none}
.road-row.lv1 span::before{background:#22c55e}
.road-row.lv2 span::before{background:#eab308}
.road-row.lv3 span::before{background:#f97316}
.road-row.lv4 span::before{background:#ef4444}
.road-row.idx{grid-column:1/-1;background:rgba(59,130,246,.14);border-color:rgba(59,130,246,.28)}
.road-row.idx b{font-size:16px}
.road-row.idx b.s1{color:#22c55e}.road-row.idx b.s2{color:#eab308}.road-row.idx b.s3{color:#f97316}.road-row.idx b.s4{color:#ef4444}
/* 拥堵趋势预测 */
.city-predict{background:#1c3454;border:1px solid var(--line);border-radius:3px;padding:6px 9px 4px;margin-bottom:8px}
.pred-top{display:flex;align-items:baseline;gap:7px}
.pred-val{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1}
.pred-val.lv1{color:#22c55e}.pred-val.lv2{color:#eab308}.pred-val.lv3{color:#f97316}.pred-val.lv4{color:#ef4444}
.pred-lv{font-size:11px;color:var(--text-3)}
.pred-delta{margin-left:auto;font-size:11px;font-weight:600;padding:2px 6px;border-radius:2px;font-variant-numeric:tabular-nums}
.pred-delta.up{color:#ef4444;background:rgba(239,68,68,.14)}
.pred-delta.down{color:#22c55e;background:rgba(34,197,94,.14)}
.pred-delta.flat{color:var(--text-3);background:#1c3454}
.pred-chart{width:100%;height:62px;display:block;margin:2px 0 0;overflow:visible}
.pred-ml{fill:none;stroke:#93c5fd;stroke-width:1.3;stroke-dasharray:4 3;stroke-linecap:round;opacity:.9}
.pred-ml-line{margin-top:2px;font-size:11px;line-height:1.4;color:var(--text-3);font-variant-numeric:tabular-nums}
.pred-ml-line span{white-space:nowrap}
.pm-dash{display:inline-block;width:11px;height:0;margin-right:4px;vertical-align:middle;border-top:1.3px dashed #93c5fd}
.pm-solid{display:inline-block;width:11px;height:0;margin-right:4px;vertical-align:middle;border-top:2px solid #f97316}
.pm-guide{display:inline-block;width:11px;height:0;margin-right:4px;vertical-align:middle;border-top:1.2px dotted rgba(143,166,189,.7)}
.pred-legend{display:flex;flex-wrap:wrap;gap:6px 10px;margin-top:4px;font-size:11px;color:var(--text-3);line-height:1.4}
.pred-legend span{display:inline-flex;align-items:center;white-space:nowrap}
.pred-guide{stroke:rgba(143,166,189,.32);stroke-width:.7;stroke-dasharray:1.2 2.6}
.pred-head-l{display:flex;align-items:center;gap:8px;min-width:0}
.pred-compare-toggle{display:inline-flex;align-items:center;gap:5px;margin-left:auto;font-size:11px;color:var(--text-2);cursor:pointer;user-select:none;white-space:nowrap;border:1px solid var(--line);background:#0f1e33;border-radius:3px;padding:2px 7px}
.pred-compare-toggle:hover{border-color:rgba(59,130,246,.35);color:var(--text)}
.pred-compare-toggle input{appearance:none;-webkit-appearance:none;width:12px;height:12px;margin:0;flex:none;border:1px solid var(--border);background:#12243d;border-radius:2px;cursor:pointer;vertical-align:middle}
.pred-compare-toggle input:checked{background:#3b82f6;border-color:#3b82f6}
.pred-area{fill:rgba(59,130,246,.14)}
.pred-band{fill:rgba(59,130,246,.13)}
.pred-src{margin-top:2px;font-size:11px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pred-line{fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.pred-line.lv1{stroke:#22c55e}.pred-line.lv2{stroke:#eab308}.pred-line.lv3{stroke:#f97316}.pred-line.lv4{stroke:#ef4444}
.pred-dot{stroke:#0f1e33;stroke-width:1}
.pred-dot.lv1{fill:#22c55e}.pred-dot.lv2{fill:#eab308}.pred-dot.lv3{fill:#f97316}.pred-dot.lv4{fill:#ef4444}
.pred-axis{display:flex;justify-content:space-between;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
.pred-axis b{color:var(--text);font-weight:600}
.pred-note{margin-top:3px;font-size:11px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rs-cell{border:1px solid var(--line);border-radius:3px;padding:8px 10px;background:#1c3454}
.rs-cell b{font-size:19px;display:block;font-variant-numeric:tabular-nums}
.rs-cell span{font-size:11px;color:var(--text-3)}
.rs-cell.total b{color:var(--text)}
.aside-text{font-size:12px;color:var(--text-2);margin-bottom:10px}
.aside-text b{color:var(--blue-2)}
.disclaimer-mini{margin-top:10px;font-size:11px;color:var(--text-3);border-top:1px dashed var(--line);padding-top:8px}

/* ---------- 真实路况（高德） ---------- */
.live-traffic{background:#1c3454;border:1px solid var(--line);border-radius:3px;padding:10px;font-size:12px;color:var(--text-2)}
.lt-empty-title{font-size:13px;color:var(--text);font-weight:600;margin-bottom:2px}
.lt-hint{font-size:11px;color:var(--text-3);line-height:1.6}
.lt-keyrow{display:flex;gap:6px;margin-top:8px}
.lt-keyrow input{flex:1;min-width:0;background:#0f1e33;border:1px solid var(--line);border-radius:3px;color:var(--text);padding:6px 8px;font-size:12px;outline:none}
.lt-keyrow input:focus{border-color:var(--blue-2)}
.lt-keyrow button{flex:none;background:var(--blue);border:none;color:#ffffff;border-radius:3px;padding:0 12px;font-size:12px;cursor:pointer}
.lt-keyrow button:hover{filter:brightness(1.1)}
.lt-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.lt-tag{padding:1px 9px;border-radius:3px;font-size:11px;background:rgba(59,130,246,.16);color:var(--text-2)}
.lt-idx{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
.lt-time{margin-left:auto;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
/* 仿真 → 校准，右侧给与高德的实际偏差；高德本身已在标题行，不重复 */
.lt-cal{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin:3px 0 1px}
.lt-cal-s{font-size:11px;color:var(--text-3);white-space:nowrap}
.lt-cal-s b{font-size:14px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;vertical-align:-1px}
.lt-cal-s b.on{color:#3b82f6}
.lt-cal-s em{font-style:normal;font-size:11px;color:var(--text-3)}
.lt-cal-d{font-size:11px;color:var(--text-3);white-space:nowrap}
.lt-cal-d b{font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--text)}
.lt-cal-note{margin-bottom:6px;font-size:11px;line-height:1.5;color:var(--text-3);font-variant-numeric:tabular-nums}
.lt-pcts{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:8px}
.lt-pct{text-align:center;background:#0f1e33;border-radius:3px;padding:4px 2px}
.lt-pct b{display:block;font-size:14px;color:var(--text);font-variant-numeric:tabular-nums}
.lt-pct span{font-size:11px;color:var(--text-3)}
.lt-roads{max-height:66px;overflow:auto}
.lt-road{display:flex;align-items:center;gap:6px;padding:3px 0;border-top:1px dashed rgba(255,255,255,.06)}
.lt-road:first-child{border-top:none}
.lt-rname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.lt-rs{flex:none;font-size:11px}
.lt-rsp{flex:none;width:62px;text-align:right;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
.lt-foot{margin-top:8px;font-size:11px;color:var(--text-3)}
.lt-1{color:#22c55e}
.lt-2{color:#eab308}
.lt-3{color:#f97316}
.lt-4{color:#ef4444}
.lt-tag.lt-1{background:rgba(34,197,94,.16);color:#22c55e}
.lt-tag.lt-2{background:rgba(234,179,8,.16);color:#eab308}
.lt-tag.lt-3{background:rgba(249,115,22,.16);color:#f97316}
.lt-tag.lt-4{background:rgba(239,68,68,.16);color:#ef4444}

/* ---------- 事故协同 ---------- */
.d-head{display:flex;justify-content:space-between;align-items:flex-end;gap:14px;margin-bottom:12px;flex-wrap:wrap}
.d-head-l h2{font-size:20px;font-weight:700}
.d-head-l p{font-size:12px;color:var(--text-3);margin-top:2px}
.d-head-r{display:flex;gap:10px}
.stat-chip{background:var(--card);border:1px solid var(--border);border-radius:3px;padding:7px 16px;display:flex;align-items:center;gap:10px;box-shadow:none}
.stat-chip .k{font-size:11px;color:var(--text-3)}
.stat-chip b{font-size:20px;font-variant-numeric:tabular-nums}
.d-toolbar{display:flex;align-items:center;gap:16px;flex-wrap:wrap;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:10px 16px;margin-bottom:12px;box-shadow:none}
.switch-box{display:flex;align-items:center;gap:10px}
.switch{position:relative;display:inline-block;width:40px;height:22px;flex:none}
.switch input{opacity:0;width:0;height:0}
.switch i{position:absolute;inset:0;background:#4a6785;border-radius:4px;transition:.2s}
.switch i::before{content:"";position:absolute;left:3px;top:3px;width:16px;height:16px;background:#ffffff;border-radius:50%;transition:.2s;box-shadow:none}
.switch input:checked+i{background:var(--blue)}
.switch input:checked+i::before{transform:translateX(18px)}
.switch-text b{font-size:13px;display:block}
.switch-text small{font-size:11px;color:var(--text-3)}
.d-toolbar-note{font-size:11px;color:var(--text-3);flex:1;min-width:220px}
.scenario-control{display:flex;align-items:center;gap:5px;padding:3px 7px;border:1px solid var(--border);border-radius:3px;background:#1c3454;color:var(--text-3);font-size:11px;white-space:nowrap}
.scenario-control select{max-width:118px;border:0;outline:0;background:transparent;color:var(--text);font:inherit;cursor:pointer}.scenario-control option{background:var(--card);color:var(--text)}
.scenario-state{font-size:11px;color:var(--text-3);padding:4px 7px;border-radius:3px;border:1px solid transparent;white-space:nowrap}.scenario-state.active{color:#eab308;background:#2c2a12;border-color:#eab308}
.d-grid{display:grid;grid-template-columns:1fr 350px;gap:14px;align-items:start}
.board-card{grid-column:1}
.table-wrap{position:relative;min-height:120px}
.order-table{width:100%;border-collapse:collapse;font-size:12px}
.order-table th{text-align:left;font-weight:600;color:var(--text-3);font-size:11px;padding:8px 8px;border-bottom:1px solid var(--line);white-space:nowrap}
.order-table td{padding:8px 8px;border-bottom:1px dashed var(--line);vertical-align:top}
.order-table tr:last-child td{border-bottom:none}
.order-table tr:hover td{background:#1c3454}
.wo-id{font-family:Consolas,Menlo,monospace;color:var(--blue-2);font-weight:600;white-space:nowrap}
.acc-pos{max-width:230px}
.acc-pos b{display:block;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acc-pos span{font-size:11px;color:var(--text-3)}
.st-badge{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:1px 9px;border-radius:3px;white-space:nowrap;height:19px}
.st-badge i{width:6px;height:6px;border-radius:50%;background:currentColor}
.stb-pending{background:#1c3454;color:#c2d3e6}
.stb-onway{background:var(--blue-weak);color:var(--blue-2)}
.stb-onscene{background:#1c3454;color:#3b82f6}
.stb-closed{background:var(--c1-bg);color:var(--green)}
.tl-cell{display:flex;flex-direction:column;gap:1px;font-size:11px;color:var(--text-3);white-space:nowrap}
.tl-cell b{color:var(--text-2);font-weight:600}
.empty-state{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;color:var(--text-3);background:rgba(18,36,61,.6)}
.empty-ico{font-size:30px}
.empty-sub{font-size:11px}
.d-right{display:flex;flex-direction:column;gap:14px}
.mini-wrap{position:relative;height:250px;border-radius:3px;overflow:hidden;background:#1c3454;border:1px solid var(--line)}
.mini-wrap canvas{width:100%;height:100%}
.mini-map-status{position:absolute;left:9px;top:9px;display:flex;gap:7px;align-items:center;background:rgba(255,255,255,.94);border:1px solid #ffffff;border-radius:3px;padding:4px 7px;color:#5f7791;font-size:11px;box-shadow:none}
.mstat{display:inline-flex;align-items:center;gap:3px;white-space:nowrap}.mstat-dot{width:6px;height:6px;border-radius:50%;display:inline-block}.mstat-dot.green{background:#22c55e}.mstat-dot.blue{background:#3b82f6}.mstat-dot.orange{background:#3b82f6}.mstat-dot.red{background:#ef4444}
.mini-legend{position:absolute;right:8px;bottom:8px;display:flex;gap:8px;background:rgba(18,36,61,.92);border:1px solid var(--border);border-radius:3px;padding:3px 7px;font-size:11px;color:var(--text-2)}
.station-list{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow:auto}
.resource-list{display:flex;flex-direction:column;gap:7px}
.resource-item{display:flex;align-items:center;gap:9px;padding:8px 9px;border:1px solid var(--line);border-radius:3px;background:#1c3454}
.resource-item.full{border-color:#ef4444;background:#0f1e33}
.resource-icon{width:28px;height:28px;display:grid;place-items:center;background:#1c3454;border-radius:3px;font-size:16px}
.resource-main{flex:1;min-width:0}.resource-main b{display:block;font-size:12px}.resource-main span{display:block;font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:175px}
.resource-count{text-align:right;white-space:nowrap}.resource-count b{font-size:15px;color:var(--green)}.resource-item.full .resource-count b{color:var(--c4)}.resource-count span{font-size:11px;color:var(--text-3)}
.control-list{display:flex;flex-direction:column;gap:8px;max-height:330px;overflow:auto}.control-item{padding:9px 10px;border:1px solid var(--line);border-radius:3px;background:#1c3454}.control-item.applied{border-color:#22c55e;background:#0f1e33}.control-head{display:flex;justify-content:space-between;gap:8px;font-size:11px}.control-head span{color:#eab308;white-space:nowrap}.control-item p{font-size:11px;color:var(--text-3);margin-top:4px}.control-foot{display:flex;align-items:center;justify-content:space-between;margin-top:7px;font-size:11px;color:var(--text-3)}.control-foot b{color:#22c55e}.control-empty{font-size:11px;color:var(--text-3);padding:10px 2px}.mini-btn.done{background:#10291a;color:#22c55e;cursor:default}
.station{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:3px;padding:8px 10px}
.st-dot{width:10px;height:10px;border-radius:50%;flex:none}
.st-ok .st-dot{background:#22c55e;box-shadow:none}
.st-busy .st-dot{background:#3b82f6;box-shadow:none}
.st-mid .st-dot{background:var(--blue);box-shadow:none}
.st-name{flex:1;min-width:0}
.st-name b{font-size:12px;display:block}
.st-name span{font-size:11px;color:var(--text-3)}
.st-tag{font-size:11px;color:var(--text-2);white-space:nowrap}
/* 工单状态标签 + 动态倒计时 */
.st-tag.st-pending{color:#c2d3e6;background:#1c3454;padding:2px 8px;border-radius:3px}
.st-tag.st-onway{color:var(--blue-2);background:var(--blue-weak);padding:2px 8px;border-radius:3px}
.st-tag.st-onscene{color:#3b82f6;background:#1c3454;padding:2px 8px;border-radius:3px}
.st-tag.st-closed{color:var(--green);background:var(--c1-bg);padding:2px 8px;border-radius:3px}
/* 联动 7 态补充标签 */
.st-tag.st-assigned{color:#3b82f6;background:#1c3454;padding:2px 8px;border-radius:3px}
.st-tag.st-reviewing{color:#3b82f6;background:#2c2a12;padding:2px 8px;border-radius:3px}
.st-tag.st-cancelled{color:#c2d3e6;background:#1c3454;padding:2px 8px;border-radius:3px}
/* 双端联动状态徽标（顶部栏） */
.link-state{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--text-3);padding:4px 9px;border:1px solid var(--border);border-radius:3px;background:#1c3454;white-space:nowrap;transition:all .3s}
.link-state.on{color:var(--green);border-color:rgba(34,197,94,.5);background:rgba(16,41,26,.6);box-shadow:none}
/* 本机大屏终端编号：与手机编号对照，窄屏隐藏避免挤压工具栏 */
.term-id{display:inline-flex;align-items:center;font:600 11px/1 Consolas,Menlo,monospace;letter-spacing:.4px;color:#3b82f6;background:rgba(59,130,246,.1);border:1px solid rgba(59,130,246,.26);padding:5px 8px;border-radius:3px;white-space:nowrap}
@media (max-width:1500px){.term-id{display:none}}
.st-eta{font-size:11px;color:var(--text-3);margin-top:3px;white-space:nowrap}
/* 处置时间线：步骤胶囊 + 流动动画 */
.tl{display:inline-flex;align-items:center;gap:2px;white-space:nowrap}
.tl i{font-style:normal;font-size:11px;line-height:16px;padding:0 5px;border-radius:3px;color:#8fa6bd;transition:all .2s}
.tl i.on{color:#22c55e;background:var(--c1-bg)}
.tl i.act{color:#ffffff;background:var(--blue);box-shadow:none;animation:tlpulse 1s ease-in-out infinite}
.tl em{font-style:normal;color:#8fa6bd;font-size:11px;padding:0 1px}
@keyframes tlpulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.72;transform:scale(1.06)}}
.flow-card{margin-top:14px}
.order-table tr[data-order-id]{cursor:pointer;outline:none}
.order-table tr[data-order-id]:focus td,.order-table tr[data-order-id].on td{background:#1c3454}
.order-detail{position:fixed;inset:0;z-index:120;background:rgba(8,21,40,.72);display:flex;align-items:center;justify-content:center;padding:20px}
.order-detail-box{width:min(620px,100%);max-height:min(720px,calc(100vh - 40px));overflow:auto;background:var(--card);border:1px solid var(--border);border-radius:4px;box-shadow:none}
.order-detail-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 20px;border-bottom:1px solid var(--line)}
.order-detail-head h2{font-size:18px;margin-top:2px}
.detail-kicker{font-size:11px;color:var(--blue-2)}
.order-detail-body{padding:18px 20px}
.detail-summary{display:flex;align-items:center;gap:12px;padding:12px;background:#1c3454;border:1px solid var(--line);border-radius:3px}
.detail-summary .evt-ico{font-size:28px}
.detail-summary b{font-size:14px}
.detail-summary p{font-size:12px;color:var(--text-3);margin-top:2px}
.detail-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px}
.detail-grid>div{padding:9px 10px;background:#1c3454;border:1px solid var(--line);border-radius:3px}
.detail-grid span{display:block;font-size:11px;color:var(--text-3)}
.detail-grid b{display:block;margin-top:2px;font-size:13px}
.detail-section{margin-top:16px}
.detail-section h3{font-size:13px;color:var(--blue-2);margin-bottom:5px}
.detail-section p{font-size:12px;color:var(--text-2);line-height:1.7}
.detail-photos{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:6px}
.detail-photos img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:3px;border:1px solid var(--line);cursor:zoom-in;background:#1c3454;transition:transform .15s}
.detail-photos img:hover{transform:scale(1.02);border-color:var(--blue-2)}
.detail-flow{overflow-x:auto;padding:4px 0}
.detail-review{padding:12px;background:#1c3454;border:1px solid var(--line);border-radius:3px}
.detail-review textarea{display:block;width:100%;box-sizing:border-box;min-height:72px;margin:8px 0;padding:8px 10px;resize:vertical;background:#0f1e33;border:1px solid var(--line);border-radius:3px;color:var(--text);font:inherit;line-height:1.6}
.detail-review textarea:focus{outline:1px solid var(--blue);border-color:var(--blue)}
.review-actions{display:flex;justify-content:flex-end;gap:8px}
.review-history{list-style:none;margin:0;padding:0}
.review-history li{font-size:12px;color:var(--text-2);line-height:1.7;padding:6px 0;border-bottom:1px solid var(--line)}
.review-history li:last-child{border-bottom:0}
.review-history .rh-act{font-weight:600}
.review-history .rh-act.reject{color:#f87171}
.review-history .rh-act.approve{color:#22c55e}
.order-detail-foot{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--line)}
.flow-steps{display:flex;align-items:stretch;gap:6px;flex-wrap:wrap;margin-top:6px}
.step{flex:1;min-width:120px;background:#1c3454;border:1px solid var(--line);border-radius:3px;padding:10px;text-align:center}
.step i{width:24px;height:24px;border-radius:50%;background:var(--blue);color:#ffffff;font-style:normal;font-weight:700;display:inline-grid;place-items:center;margin-bottom:6px;font-size:12px}
.step b{display:block;font-size:13px;margin-bottom:2px}
.step span{font-size:11px;color:var(--text-3);display:block}
.step.arrow{align-self:center;background:none;border:none;flex:none;color:#c2d3e6;font-size:18px;padding:0 2px;min-width:auto}

/* ---------- 作品介绍 ---------- */
.about-grid{display:grid;grid-template-columns:1fr 330px;gap:14px;align-items:start}
.about-main h2{font-size:20px;margin-bottom:8px}
.about-lead{font-size:14px;color:var(--text-2);line-height:1.7;margin:0 0 6px}
.about-main h3{font-size:15px;margin:16px 0 8px;display:flex;align-items:center;gap:8px}
.about-main h3::before{content:"";width:4px;height:15px;border-radius:2px;background:var(--blue-2)}
.about-main p{font-size:13px;color:var(--text-2);margin-bottom:8px}
.about-main ul{list-style:none;margin:4px 0}
.about-main ul li{font-size:13px;color:var(--text-2);padding-left:18px;position:relative;margin-bottom:7px}
.about-main ul li::before{content:"";position:absolute;left:4px;top:7px;width:6px;height:6px;border-radius:2px;background:#3b82f6}
.ends-map{margin:8px 0 4px}
.ends-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.end-card{background:#0e1420;border:1px solid var(--border);border-radius:var(--r-card);padding:12px 14px}
.end-card .end-tag{display:inline-block;font-size:11px;color:#93c5fd;background:#1d3a63;border:1px solid #2a4a7a;border-radius:var(--r-tag);padding:1px 7px;margin-bottom:6px}
.end-card b{display:block;font-size:14px;margin-bottom:4px}
.end-card span:last-child{display:block;font-size:12px;color:var(--text-3);line-height:1.5}
.ends-hub{display:flex;justify-content:center;margin-top:10px;position:relative}
.ends-hub::before{content:"";position:absolute;top:-10px;left:16.6%;right:16.6%;height:10px;border-left:1px solid var(--border);border-right:1px solid var(--border);border-top:0;pointer-events:none}
.hub-box{background:#12243d;border:1px solid #3b82f6;border-radius:var(--r-card);padding:10px 16px;text-align:center;min-width:280px}
.hub-box b{display:block;font-size:13px;color:#93c5fd}
.hub-box span{display:block;font-size:11px;color:var(--text-3);margin-top:2px}
.arch{display:flex;gap:10px;margin:8px 0}
.arch-col{flex:1;text-align:center}
.arch-box{border-radius:var(--r-card);padding:12px;font-weight:700;color:#ffffff;font-size:13px;margin-bottom:6px}
.arch-box.top{background:#3b82f6}
.arch-box.mid{background:#22c55e}
.arch-box.bot{background:#3b82f6}
.arch-col p{font-size:11px;color:var(--text-3);text-align:left;padding:0 2px;line-height:1.55}
.flow-src{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:8px 0 10px;font-size:12px;color:var(--text-2)}
.flow-src span{background:#0e1420;border:1px solid var(--border);border-radius:var(--r-btn);padding:4px 8px}
.flow-src em{font-style:normal;color:var(--text-3)}
.flow-src b{color:#93c5fd;font-weight:600}
.about-flow{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;margin:4px 0 8px}
.af-step{background:#0e1420;border:1px solid var(--border);border-radius:var(--r-card);padding:10px 8px;text-align:center}
.af-step i{width:22px;height:22px;border-radius:50%;background:#1d3a63;color:#93c5fd;font-style:normal;font-weight:700;display:inline-grid;place-items:center;margin-bottom:6px;font-size:11px}
.af-step b{display:block;font-size:13px;margin-bottom:2px}
.af-step span{display:block;font-size:11px;color:var(--text-3);line-height:1.4}
.flow-note{font-size:12px;color:var(--text-3);margin:0 0 4px}
.info-table{width:100%;font-size:12px;border-collapse:collapse;margin-bottom:6px}
.info-table td{padding:7px 4px;border-bottom:1px dashed var(--line);vertical-align:top}
.info-table td:first-child{color:var(--text-3);white-space:nowrap;padding-right:10px;width:84px}
.about-side h3{font-size:15px;margin:14px 0 6px}
.demo-steps{padding-left:18px;display:flex;flex-direction:column;gap:6px}
.demo-steps li{font-size:12px;color:var(--text-2);line-height:1.55}
@media (max-width:1100px){
  .about-grid{grid-template-columns:1fr}
  .ends-row,.about-flow{grid-template-columns:repeat(3,minmax(0,1fr))}
  .ends-hub::before{left:16.6%;right:16.6%}
}
@media (max-width:640px){
  .ends-row,.about-flow,.arch{grid-template-columns:1fr;display:grid}
  .ends-hub::before{display:none}
}

/* ---------- 底部 / 提示 ---------- */
.footer{max-width:1560px;margin:0 auto;padding:6px 20px 14px;display:flex;justify-content:space-between;font-size:11px;color:var(--text-3)}
.tooltip{position:fixed;z-index:200;background:rgba(18,36,61,.92);color:#ffffff;font-size:12px;padding:7px 11px;border-radius:3px;pointer-events:none;max-width:260px;line-height:1.5;box-shadow:none}
.tooltip b{color:#eab308}
/* 快捷键帮助面板 */
.key-help{position:fixed;z-index:400;top:50%;left:50%;transform:translate(-50%,-50%);width:340px;background:#0f1e33;border:1px solid var(--border);border-radius:4px;box-shadow:none;overflow:hidden;animation:khin .18s ease}
.key-help.hidden{display:none}
.kh-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#1c3454;border-bottom:1px solid var(--line)}
.kh-head b{font-size:14px;color:var(--text)}
.kh-body{padding:6px 16px}
.kh-row{display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px dashed var(--line);font-size:13px;color:var(--text-2)}
.kh-row:last-child{border-bottom:none}
.kh-row kbd{display:inline-block;min-width:18px;text-align:center;padding:2px 7px;background:#0f1e33;border:1px solid var(--border);border-bottom-width:2px;border-radius:2px;font:12px/1.3 Consolas,Menlo,monospace;color:var(--text)}
.kh-foot{padding:10px 16px;font-size:11px;color:var(--text-3);background:#1c3454;border-top:1px solid var(--line)}
@keyframes khin{from{opacity:0;transform:translate(-50%,-48%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}
.toast-wrap{position:fixed;top:76px;right:20px;z-index:300;display:flex;flex-direction:column;gap:8px}
.toast{background:rgba(18,36,61,0.95);border:1px solid var(--border);border-left:4px solid var(--blue);border-radius:3px;box-shadow:none;padding:9px 14px;font-size:12px;color:var(--text);animation:toastin .25s ease;max-width:360px;}
.toast.ok{border-left-color:#22c55e}
.toast.warn{border-left-color:var(--amber)}
.toast.err{border-left-color:var(--c4)}
.toast b{display:block;font-size:13px}
@keyframes toastin{from{opacity:0;transform:translateX(20px)}to{opacity:1;transform:none}}
.toast.out{opacity:0;transition:opacity .3s}

/* ==================================================================
   视觉重构 v2 · 深空指挥舱
   原则：深海军蓝打底、青色只表示实时数据与可交互、红黄橙只留给告警；
   层级靠表面亮度拉开，不靠重阴影与装饰渐变。
   ================================================================== */
:root{
  --bg:#12243d;
  --card:#0f1e33;
  --border:rgba(59,130,246,.13);
  --line:rgba(59,130,246,.09);
  --text:#ffffff;
  --text-2:#c2d3e6;
  --text-3:#8fa6bd;
  --blue:#3b82f6;
  --blue-2:#3b82f6;
  --blue-weak:rgba(59,130,246,.12);
  --green:#22c55e;
  --amber:#eab308;
  --c1:#22c55e; --c2:#eab308; --c3:#f97316; --c4:#ef4444;
  --c1-bg:rgba(34,197,94,.13); --c2-bg:rgba(234,179,8,.13);
  --c3-bg:rgba(249,115,22,.14); --c4-bg:rgba(239,68,68,.13);
  --shadow:0 12px 32px rgba(8,21,40,.35);
}
body{
  background:
    rgba(59,130,246,.10),
    rgba(59,130,246,.10),
    var(--bg);
  font-feature-settings:"tnum" 1;
}
::selection{background:rgba(59,130,246,.28);color:#ffffff}
::-webkit-scrollbar-thumb{background:rgba(59,130,246,.22);border-radius:3px}
::-webkit-scrollbar-thumb:hover{background:rgba(59,130,246,.35)}

/* ---------- 顶栏 ---------- */
.topbar{background:rgba(11,26,46,.9);;border-bottom:1px solid var(--line);box-shadow:none;gap:12px;padding:9px 16px}
.brand{min-width:0}
.brand-text h1,.brand-text p{white-space:nowrap}
.brand-text p{font-size:11px}
.main-nav{padding:4px;gap:2px;overflow:hidden;min-width:0}
.nav-item{white-space:nowrap;padding:7px 14px;font-size:13px;flex:none}
.nav-item .ni-ico{display:none}
.top-tools{min-width:0;gap:7px}
.sim-clock{padding:6px 10px;gap:4px}
.sim-clock .sc-label,.sim-clock .sc-date{font-size:11px}
.sim-clock b{font-size:16px}
.date-control{padding:5px 6px;font-size:11px}
.date-control input{width:92px}
.sim-state{padding:6px 8px;font-size:11px}
.term-id{font-size:11px;padding:4px 7px}
.link-state{padding:5px 8px;font-size:11px}
.tbtn{padding:6px 9px;font-size:11px}
.tselect{padding:6px 6px;font-size:11px}
.brand-logo{background:rgba(59,130,246,.22);border:1px solid rgba(59,130,246,.28);box-shadow:none}
.brand-text h1{letter-spacing:.6px}
.brand-text .ver{background:rgba(59,130,246,.08);border-color:rgba(59,130,246,.24);color:#3b82f6}
.main-nav{background:#12243d;border:1px solid var(--line);border-radius:4px}
.nav-item{border-radius:3px;color:var(--text-2)}
.nav-item:hover{color:#3b82f6}
.nav-item.active{
  background:rgba(59,130,246,.18);
  color:#3b82f6;font-weight:600;
  box-shadow:none;
}
.ni-n{background:#3b82f6}
.ni-c{background:#22c55e}
.ni-d{background:#3b82f6}
.ni-a{background:#3b82f6}
.ni-r{background:#3b82f6}
.sim-clock{background:#12243d;border:1px solid rgba(59,130,246,.22);border-radius:3px;color:#ffffff}
.sim-clock .sc-label,.sim-clock .sc-date{color:#3b82f6}
.sim-clock b{font-weight:700;color:#3b82f6}
.date-control,.sim-state,.day-type-badge,.tbtn,.tselect,.link-state{background:#0f1e33;border:1px solid var(--border);border-radius:3px}
.tbtn:hover{border-color:rgba(59,130,246,.5);color:#3b82f6}
.tbtn.on{background:rgba(59,130,246,.16);border-color:rgba(59,130,246,.5);color:#3b82f6}
.day-type-badge.workday{color:#3b82f6;background:rgba(59,130,246,.10)}
.sim-state .dot{box-shadow:none}

/* ---------- 通用表面 ---------- */
.card{background:#12243d;border:1px solid var(--border);border-radius:4px;box-shadow:none}
.card:hover{border-color:rgba(59,130,246,.26)}
.card-head h3{font-size:15px;letter-spacing:.3px}
.card-head h3::before{width:3px;height:16px;background:#3b82f6;box-shadow:none}
.card-head.sub h4::before{background:#8fa6bd}
.head-tip{color:var(--text-3)}

/* ---------- 分段 / 标签 ---------- */
.seg{background:#12243d;border:1px solid var(--line);border-radius:3px}
.seg-item{border-radius:3px;color:var(--text-2)}
.seg-item.active{background:rgba(59,130,246,.16);color:#3b82f6;box-shadow:none}
.lv-tag{border-radius:3px;font-weight:600}
.lv-tag.s1{color:#22c55e;background:rgba(34,197,94,.14)}
.lv-tag.s2{color:#eab308;background:rgba(234,179,8,.14)}
.lv-tag.s3{color:#f97316;background:rgba(249,115,22,.15)}
.lv-tag.s4{color:#ef4444;background:rgba(239,68,68,.16)}
.lv-tag.s5{color:var(--text-2);background:#0f1e33}

/* ---------- 按钮 ---------- */
.primary-btn{background:#3b82f6;color:#12243d;font-weight:700;border-radius:3px;box-shadow:none}
.primary-btn:hover{filter:brightness(1.05);box-shadow:none;transform:none}
.primary-btn.ghost{background:rgba(59,130,246,.06);color:#3b82f6;border:1px solid rgba(59,130,246,.32);box-shadow:none}
.mini-btn{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.mini-btn:hover{color:#3b82f6;border-color:rgba(59,130,246,.35)}
.mini-btn.primary{background:#3b82f6;color:#12243d;border:none}
.mini-btn.danger{color:#ef4444}

/* ---------- KPI ---------- */
.kpi{background:#12243d;border:1px solid var(--border);border-radius:4px;box-shadow:none}
.kpi .k-ico{border-radius:4px}
.bg-blue{background:rgba(59,130,246,.12)} .bg-green{background:rgba(34,197,94,.12)}
.bg-amber{background:rgba(234,179,8,.12)} .bg-red{background:rgba(239,68,68,.12)}
.kpi .k-label{font-size:11px;letter-spacing:.4px}
.kpi .k-value{font-size:26px;color:#ffffff}
.kpi .k-sub b{color:#3b82f6}

/* ---------- 全国态势 ---------- */
.nat-canvas-wrap{background:#0f1e33;border:1px solid rgba(59,130,246,.12);border-radius:4px}
.canvas-chip,.canvas-legend{background:rgba(11,26,46,.78);border:1px solid rgba(59,130,246,.18);color:#ffffff;}
.replay-bar{background:rgba(11,26,46,.9);border:1px solid rgba(59,130,246,.22)}
.replay-bar .rbtn{background:#0f1e33;border:1px solid rgba(59,130,246,.22);color:#3b82f6;border-radius:3px}
.replay-bar .rbtn:hover{border-color:rgba(59,130,246,.5);color:#3b82f6}
.legend-item i{border-radius:4px}

/* ---------- 城市排名 ---------- */
.rank-i{background:rgba(18,36,61,.72);border:1px solid var(--line);border-radius:4px}
.rank-i:hover{background:rgba(59,130,246,.15);border-color:rgba(59,130,246,.5);box-shadow:none}
.rank-i .rank-no{font-weight:700;font-size:22px;color:#4a6785}
.rank-list .rank-i:nth-of-type(1) .rank-no.top{background:#ef4444;color:#2a1e12}
.rank-list .rank-i:nth-of-type(2) .rank-no.top{background:#3b82f6;color:#2a1e12}
.rank-list .rank-i:nth-of-type(3) .rank-no.top{background:#eab308;color:#2c2a12}
.rank-i .rank-name{font-size:14px}
.rank-i .rank-cur{font-size:14px}
.rank-note{color:var(--text-3)}
.trend-chart svg{filter:drop-shadow(0 6px 18px rgba(59,130,246,.10))}

/* ---------- 城市视图：面板 ---------- */
.city-topbar{background:rgba(11,26,46,.96);border:1px solid var(--border);border-radius:4px;box-shadow:none}
.city-chip{border:1px solid var(--line);background:#0f1e33;border-radius:4px;color:var(--text-2)}
.city-chip:hover{border-color:rgba(59,130,246,.45);color:#3b82f6;background:#0f1e33}
.city-chip.active,.city-chip.on{background:#3b82f6;border-color:transparent;color:#12243d;box-shadow:none}
.city-chip-tier i{background:rgba(59,130,246,.18);color:#3b82f6}
.city-stat{background:rgba(11,26,46,.9);border:1px solid rgba(59,130,246,.16);border-radius:4px;;box-shadow:none}
.stat-grid{background:rgba(59,130,246,.10)}
.stat-grid>div{background:rgba(11,26,46,.88)}
.stat-grid b{font-size:16px;color:#ffffff}
.stat-net{border-top-color:rgba(59,130,246,.12)}
.city-side{background:#12243d;border:1px solid var(--border);border-radius:4px;box-shadow:none}
.side-item{border-bottom:1px solid rgba(59,130,246,.07);border-radius:3px}
.side-item:hover{background:rgba(59,130,246,.06);box-shadow:none}
.si-tag{border-radius:3px;font-weight:600}
.si-tag.lv1{color:#22c55e;background:rgba(34,197,94,.14)}
.si-tag.lv2{color:#eab308;background:rgba(234,179,8,.14)}
.si-tag.lv3{color:#f97316;background:rgba(249,115,22,.15)}
.si-tag.lv4{color:#ef4444;background:rgba(239,68,68,.16)}
.hot-rank{border-radius:3px}
.city-legend{background:rgba(11,26,46,.88);border:1px solid var(--border);border-radius:3px;}
.city-legend .lg-i:hover{background:rgba(59,130,246,.08)}
.city-popup{background:#12243d;border:1px solid rgba(59,130,246,.18);border-radius:4px;box-shadow:none}
.pop-title{border-bottom:1px solid var(--line);color:#ffffff}
.pop-row{border-radius:3px}
.zoom-tools button{background:#0f1e33;border:1px solid var(--border);border-radius:3px;color:var(--text-2)}
.zoom-tools button:hover{color:#3b82f6;border-color:rgba(59,130,246,.45)}
.zoom-tools .box-btn{font-size:11px;letter-spacing:0;line-height:1.1;padding:5px 2px;height:34px}
.zoom-tools .box-btn.on{background:rgba(59,130,246,.18);border-color:rgba(59,130,246,.55);color:#3b82f6;box-shadow:none}
/* 实时路况图层（高德 JS API）：整块覆盖画布，交互交给高德地图 */
.amap-traffic{position:absolute;inset:0;background:#0f1e33}
.amap-frame{display:block;width:100%;height:100%;border:0}
.amap-fallback{display:grid;place-items:center;height:100%;font-size:13px;color:var(--text-3)}
/* 图层模式下隐藏只属于仿真画布的浮层，避免和真实地图打架 */
.city-canvas-wrap.layer-mode #cityStatCard,
.city-canvas-wrap.layer-mode #cityLegend,
.city-canvas-wrap.layer-mode #cityPopup,
.city-canvas-wrap.layer-mode #boxStats{display:none!important}
.box-stats{position:absolute;left:18px;bottom:62px;width:296px;z-index:22;padding:12px 14px;border-radius:4px;background:rgba(11,26,46,.97);border:1px solid rgba(59,130,246,.28);box-shadow:none;}
.box-stats.hidden{display:none}
.box-stats .bs-head{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;font-weight:600;color:#3b82f6;margin-bottom:9px}
.box-stats .bs-head b{font-weight:600;display:flex;align-items:center;gap:6px}
.box-stats .bs-head b::before{content:"";width:9px;height:9px;border:1.5px dashed #3b82f6;border-radius:2px}
.box-stats .bs-head button{color:#8fa6bd;font-size:13px;line-height:1;padding:2px}
.box-stats .bs-head button:hover{color:#ef4444}
.box-stats .bs-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.box-stats .bs-cell{background:rgba(59,130,246,.05);border:1px solid rgba(59,130,246,.10);border-radius:3px;padding:6px 9px}
.box-stats .bs-cell span{display:block;font-size:11px;color:#8fa6bd;letter-spacing:.3px}
.box-stats .bs-cell b{font-size:16px;color:#ffffff;font-variant-numeric:tabular-nums;line-height:1.35}
.box-stats .bs-cell small{font-size:11px;font-weight:400;color:#3b82f6;margin-left:2px}
.box-stats .bs-foot{margin-top:9px;font-size:11px;color:#3b82f6;display:flex;align-items:center;justify-content:space-between}
.box-stats .bs-foot em{font-style:normal;color:#3b82f6}

/* ---------- 城市侧栏卡片 ---------- */
.road-row{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.road-row b{color:#ffffff}
.road-row.idx{background:rgba(59,130,246,.14);border-color:rgba(59,130,246,.24)}
.road-row.idx b.s1{color:#22c55e}.road-row.idx b.s2{color:#eab308}
.road-row.idx b.s3{color:#f97316}.road-row.idx b.s4{color:#ef4444}
.city-predict{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.pred-val{font-size:23px}
.pred-val.lv1{color:#22c55e}.pred-val.lv2{color:#eab308}
.pred-val.lv3{color:#f97316}.pred-val.lv4{color:#ef4444}
.pred-delta{border-radius:3px}
.pred-guide{stroke:rgba(143,166,189,.28)}
.pred-area{fill:rgba(59,130,246,.12)}
.pred-band{fill:rgba(59,130,246,.10)}
.pred-src{color:#8fa6bd}
.pred-line{stroke-width:2}
.pred-line.lv1{stroke:#22c55e}.pred-line.lv2{stroke:#eab308}
.pred-line.lv3{stroke:#f97316}.pred-line.lv4{stroke:#ef4444}
.pred-dot.lv1{fill:#22c55e}.pred-dot.lv2{fill:#eab308}
.pred-dot.lv3{fill:#f97316}.pred-dot.lv4{fill:#ef4444}
.pred-axis b{color:#ffffff}
.live-traffic{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.lt-pct{background:#0f1e33;border:1px solid rgba(59,130,246,.08);border-radius:3px}
.lt-pct b{font-size:15px;color:#ffffff}
.lt-road{border-top:1px solid rgba(59,130,246,.07)}
.lt-rname{color:#ffffff}
.lt-keyrow input{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.lt-keyrow button{border-radius:3px;background:#3b82f6;color:#12243d;font-weight:700}
.lt-guard{margin-top:8px;padding:6px 8px;border-radius:3px;font-size:11px;line-height:1.5;
  color:#eab308;background:rgba(234,179,8,.09);border:1px solid rgba(234,179,8,.26)}
.lt-foot{font-variant-numeric:tabular-nums}
.disclaimer-mini{border-top:1px solid var(--line)}

/* ---------- 事故协同：工具栏与表格 ---------- */
.d-head-l h2{font-size:22px;letter-spacing:.5px;display:flex;align-items:center;gap:9px}
.d-head-l h2::before{content:"";width:3px;height:20px;border-radius:2px;background:#3b82f6;box-shadow:none}
.d-head-l p{margin-top:4px;padding-left:12px}
.stat-chip{background:#12243d;border:1px solid var(--border);border-radius:4px;box-shadow:none;display:flex;align-items:center;gap:10px;padding:8px 14px}
.stat-chip .k{font-size:11px;color:var(--text-3);letter-spacing:.3px}
.stat-chip b{font-size:18px;color:#ffffff;font-variant-numeric:tabular-nums}
.d-toolbar{background:#12243d;border:1px solid var(--border);border-radius:4px}
.switch i{background:#1c3454}
.switch input:checked+i{background:#3b82f6}
.switch input:checked+i::before{background:#ffffff}
.scenario-control{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.scenario-state.active{color:#eab308;background:rgba(234,179,8,.10);border-color:rgba(234,179,8,.28)}
.order-table th{background:#12243d;color:#3b82f6;font-size:11px;letter-spacing:.05em;border-bottom:1px solid var(--border);padding:9px 8px}
.order-table td{border-bottom:1px solid rgba(59,130,246,.06);padding:9px 8px}
.order-table tr:hover td{background:rgba(59,130,246,.05)}
.order-table tr[data-order-id]:focus td,.order-table tr[data-order-id].on td{background:rgba(59,130,246,.10)}
.wo-id{color:#3b82f6;font-family:Consolas,Menlo,monospace}
.st-badge{border-radius:3px;font-weight:600}
.stb-pending{background:#0f1e33;color:#3b82f6}
.stb-onway{background:rgba(59,130,246,.13);color:#3b82f6}
.stb-onscene{background:rgba(59,130,246,.16);color:#3b82f6}
.stb-closed{background:rgba(34,197,94,.14);color:#22c55e}
.tl i{border-radius:2px}
.tl i.on{color:#22c55e;background:rgba(34,197,94,.14)}
.tl i.act{background:#3b82f6;color:#12243d;box-shadow:none}
.resource-item{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.resource-item.full{background:rgba(239,68,68,.08);border-color:rgba(239,68,68,.28)}
.resource-icon{background:#0f1e33;border-radius:3px}
.control-item{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.control-item.applied{background:rgba(34,197,94,.07);border-color:rgba(34,197,94,.30)}
.control-head span{color:#eab308}
.station{border:1px solid var(--line);border-radius:3px;background:#0f1e33}
.st-ok .st-dot{background:#22c55e;box-shadow:none}
.st-busy .st-dot{background:#3b82f6;box-shadow:none}
.st-mid .st-dot{background:#3b82f6;box-shadow:none}
.st-tag.st-assigned{color:#3b82f6;background:rgba(59,130,246,.14)}
.st-tag.st-reviewing{color:#eab308;background:rgba(234,179,8,.12)}
.st-tag.st-cancelled{color:#c2d3e6;background:#0f1e33}
.link-state.on{color:#22c55e;border-color:rgba(34,197,94,.35);background:rgba(34,197,94,.08);box-shadow:none}
.term-id{color:#3b82f6;background:rgba(59,130,246,.08);border:1px solid rgba(59,130,246,.22);border-radius:3px}

/* ---------- 弹窗 / 浮层 ---------- */
.order-detail{background:rgba(8,21,40,.76);}
.order-detail-box{background:#12243d;border:1px solid rgba(59,130,246,.16);border-radius:4px;box-shadow:none}
.order-detail-head{border-bottom:1px solid var(--line)}
.detail-kicker{color:#3b82f6}
.detail-summary,.detail-grid>div,.step{background:#0f1e33;border:1px solid var(--line);border-radius:3px}
.detail-section h3{color:#3b82f6}
.step i{background:#3b82f6;color:#12243d}
.tooltip{background:rgba(11,26,46,.94);border:1px solid rgba(59,130,246,.18);border-radius:3px;box-shadow:none}
.tooltip b{color:#3b82f6}
.key-help{background:#0f1e33;border:1px solid rgba(59,130,246,.18);border-radius:4px}
.kh-head,.kh-foot{background:#0f1e33;border-color:var(--line)}
.kh-row kbd{background:#12243d;border:1px solid rgba(59,130,246,.18);border-radius:3px;color:#3b82f6}
.toast-wrap{top:auto;bottom:16px;right:16px;pointer-events:none}
.toast{background:var(--surface-3);border:1px solid var(--line);border-left:3px solid var(--blue);border-radius:var(--r-card);box-shadow:none;padding:7px 11px;line-height:1.45;max-width:330px}
/* 标题与正文同一行，提示条高度减半，少压住右下角内容 */
.toast b{display:inline;font-size:12px;margin-right:6px}
.toast.ok{border-left-color:#22c55e}
.toast.warn{border-left-color:#eab308}
.toast.err{border-left-color:#ef4444}
.footer{border-top:1px solid rgba(59,130,246,.06);margin-top:8px;padding-top:14px}
.note-list li::before{background:#3b82f6}
.note-list code{background:#0f1e33;border:1px solid var(--line);color:#ef4444}
.info-table td{border-bottom:1px solid rgba(59,130,246,.07)}
.about-main h3::before{background:#3b82f6}
.about-main ul li::before{background:#3b82f6}
.arch-box.top{background:#3b82f6;color:#12243d}
.arch-box.mid{background:#22c55e;color:#10291a}
.arch-box.bot{background:#3b82f6;color:#12243d}
.mini-wrap{background:#0f1e33;border:1px solid var(--line);border-radius:4px}
.mini-legend{background:rgba(11,26,46,.9);border:1px solid var(--border);border-radius:3px}
.empty-state{background:rgba(11,26,46,.7)}

/* ==================================================================
   视觉重构 v3 · 设计底线收敛
   参照 design-taste：一套圆角逻辑、一个强调色、层级靠 surface 与留白；
   去掉装饰性渐变与发光，标签字号不低于 11px，正文不设字距。
   ================================================================== */
:root{
  --r-card:6px;      /* 卡片 / 面板 */
  --r-btn:4px;       /* 按钮 / 输入框 / 分段控件 */
  --r-tag:3px;       /* 徽章 / 标签 */
  --r-pill:999px;    /* 胶囊（筛选 chip） */
  --surface-1:#0b1a2e;  /* 底 */
  --surface-2:#12243d;  /* 卡片 */
  --surface-3:#172b47;  /* 卡片内嵌块 */
  --shadow-card:none;
  --shadow-pop:none;
}

/* 圆角刻度：同一类元素只用一种 */
.card,.kpi,.stat-chip,.d-toolbar,.city-aside,.city-popup,.order-detail-box,
.key-help,.box-stats,.mini-wrap,.resource-item,.control-item,.station,.step,
.detail-summary,.detail-grid>div,.live-traffic,.city-predict,.rank-i{ border-radius:var(--r-card); }
.primary-btn,.mini-btn,.tbtn,.tselect,.date-control,.sim-state,.link-state,
.term-id,.zoom-tools button,.seg-item,.lt-keyrow input,.lt-keyrow button,
.replay-bar .rbtn,.city-chip{ border-radius:var(--r-btn); }
.lv-tag,.st-badge,.si-tag,.lt-tag,.day-type-badge,.pred-delta,.scenario-state,
.rank-no,.rank-no.free,.hot-rank{ border-radius:var(--r-tag); }
.seg{ padding:2px; border-radius:var(--r-btn); }
.city-chip{ border-radius:var(--r-pill); }

/* 表面：实色分层代替渐变+重阴影 */
.card,.kpi,.stat-chip,.d-toolbar{ background:var(--surface-2); box-shadow:none; }
.road-row,.city-predict,.live-traffic,.detail-summary,
.detail-grid>div,.step,.resource-item,.control-item,.station{ background:var(--surface-3); }
.city-topbar,.city-side,.city-stat,.city-popup,.box-stats,.order-detail-box{
  background:var(--surface-2); box-shadow:none;
}

/* 去发光：焦点靠位置、字重与对比，不靠光晕 */
.card-head h3::before{ background:var(--blue); box-shadow:none; }
.card-head.sub h4::before{ background:#8fa6bd; }
.d-head-l h2::before{ background:var(--blue); box-shadow:none; }
.nav-item.active{
  background:rgba(59,130,246,.14);
  box-shadow:none;
}
.brand-logo{ background:rgba(59,130,246,.10); border:1px solid rgba(59,130,246,.22); box-shadow:none; }
.sim-clock{ background:var(--surface-3); border:1px solid var(--border); }
.sim-state .dot{ box-shadow:none; }
.st-ok .st-dot,.st-busy .st-dot,.st-mid .st-dot{ box-shadow:none; }
.link-state.on{ box-shadow:none; }
.zoom-tools .box-btn.on{ box-shadow:none; }
.trend-chart svg{ filter:none; }
.tl i.act{ animation:none; box-shadow:none; }
.tl i.act::after{ content:none; }

/* 强调色落地：主按钮用实色，不用渐变 */
.primary-btn,.mini-btn.primary,.lt-keyrow button,.step i,.switch input:checked+i{
  background:var(--blue); color:#12243d;
}
.primary-btn{ box-shadow:none; }
.primary-btn:hover{ filter:brightness(1.06); box-shadow:none; transform:none; }
.primary-btn.ghost{ background:rgba(59,130,246,.08); border:1px solid rgba(59,130,246,.30); }
.rank-list .rank-i:nth-of-type(1) .rank-no.top{ background:#ef4444; color:#2a1e12; }
.rank-list .rank-i:nth-of-type(2) .rank-no.top{ background:#3b82f6; color:#2a1e12; }
.rank-list .rank-i:nth-of-type(3) .rank-no.top{ background:#eab308; color:#2c2a12; }
.arch-box.top,.arch-box.mid,.arch-box.bot{ background:var(--surface-3); color:var(--text); border:1px solid var(--border); }
.arch-box.top{ border-color:rgba(59,130,246,.35); }
.arch-box.mid{ border-color:rgba(34,197,94,.30); }
.arch-box.bot{ border-color:rgba(59,130,246,.26); }

/* 背景：纯黑，层级只靠 surface 明度差 */
body{
  background:var(--bg);
}
/* 正文字距归零；标题也不做负字距 */
.card-head h3,.kpi .k-label,.brand-text h1,.stat-chip .k,.order-table th,.d-head-l h2{ letter-spacing:0; }

/* 字号下限：标签 11px，副文本 11px */
.trend-axis,.pred-axis,.pred-note,.pred-src,.lt-foot,.disclaimer-mini,
.mini-legend,.control-item p,.resource-main span,.stat-grid span,.si-tag,
.mini-map-status,.box-stats .bs-cell span,.lt-pct span,.rank-note{ font-size:11px; }
.pred-src,.pred-ml-line,.lt-foot,.disclaimer-mini{ color:#8fa6bd; }

/* 卡片内边距与间距走 4 的倍数；留白比字号大一档，框不贴字 */
.card{ padding:16px 18px; }
.kpi{ padding:16px 18px; }
.card:hover{ border-color:rgba(59,130,246,.24); }
.rank-i{ padding:10px 13px; background:var(--surface-3); border:1px solid var(--line); }
.rank-i:hover{ background:rgba(59,130,246,.15); border-color:rgba(59,130,246,.5); box-shadow:none; }
.rank-list{ gap:4px; }

/* ---------- 全国态势：锁一屏高度，右下不再留空 ---------- */
#viewNational.active{ display:flex; flex-direction:column; height:calc(100vh - 151px); min-height:620px; gap:12px; }
.kpi-row{ flex:none; margin-bottom:0; gap:12px; }
.kpi{ display:flex; flex-direction:column; align-items:flex-start; gap:3px; padding:14px 18px; }
.kpi-k{ font-size:11px; color:var(--text-3); }
.kpi-row-v{ display:flex; align-items:baseline; gap:8px; min-width:0; }
.kpi-row-v b{ font-size:24px; font-weight:700; line-height:1.15; font-variant-numeric:tabular-nums; white-space:nowrap; }
.kpi-s{ font-size:11px; color:var(--text-3); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.kpi-row-v b.s1{ color:#22c55e } .kpi-row-v b.s2{ color:#eab308 }
.kpi-row-v b.s3{ color:#f97316 } .kpi-row-v b.s4{ color:#ef4444 }

.nat-grid{
  flex:1; min-height:0; display:grid; gap:12px;
  grid-template-columns:minmax(0,1.62fr) minmax(360px,1fr);
  grid-template-rows:minmax(0,1fr) 196px auto;
}
.nat-map-card{ grid-column:1; grid-row:1; display:flex; flex-direction:column; min-height:0; padding:14px 16px 16px; }
.nat-canvas-wrap{ flex:1; min-height:0; }
.trend-card{ grid-column:1; grid-row:2; display:flex; flex-direction:column; min-height:0; }
.trend-chart{ flex:1; min-height:0; height:auto; }
.tr-grid{ stroke:rgba(59,130,246,.12); stroke-width:1; }
.tr-ylab{ fill:#8fa6bd; font-size:11px; font-variant-numeric:tabular-nums; }
.rank-card{ grid-column:2; grid-row:1 / 3; display:flex; flex-direction:column; min-height:0; }
.rank-list{ flex:1; max-height:none; min-height:0; overflow-y:auto; justify-content:space-between; }
.rank-note{ flex:none; }
.note-card{ grid-column:1 / -1; grid-row:3; padding:12px 18px; }
.note-strip{ display:flex; flex-wrap:wrap; gap:6px 0; align-items:center; }
.note-strip span{ flex:1 1 200px; min-width:0; font-size:11px; color:var(--text-3); padding:0 14px; border-left:1px solid var(--line); line-height:1.5; }
.note-strip span:first-child{ padding-left:0; border-left:none; }
.note-strip b{ color:var(--text-2); font-weight:600; margin-right:6px; }
.note-strip code{ background:#0f1e33; border:1px solid var(--line); border-radius:var(--r-tag); padding:0 4px; color:#3b82f6; font-size:11px; }

/* ---------- 事故协同：整页锁一屏，表格与右栏各自滚动 ---------- */
#viewDispatch.active{ display:flex; flex-direction:column; height:calc(100vh - 151px); min-height:700px; gap:12px; }
#viewDispatch .d-head{ flex:none; margin-bottom:0; align-items:flex-start; }
#viewDispatch .d-head-r{ gap:8px; }
#viewDispatch .stat-chip{ padding:6px 14px; }
#viewDispatch .stat-chip b{ font-size:22px; }
#viewDispatch .d-toolbar{ flex:none; margin-bottom:0; padding:8px 14px; gap:10px 14px; }
#viewDispatch .d-grid{ flex:1; min-height:0; grid-template-columns:minmax(0,1fr) 340px; gap:12px; align-items:stretch; }
.board-card{ display:flex; flex-direction:column; min-height:0; }
.board-card .card-head{ flex:none; margin-bottom:10px; }
.board-card .table-wrap{ flex:1; min-height:0; overflow:auto; }
.order-table thead th{ position:sticky; top:0; z-index:1; background:var(--surface-2); }
.order-table td{ padding:7px 8px; }
.order-table .muted{ color:var(--text-3); }
/* 右栏：卡片不再被压缩，超出部分整体滚动 */
#viewDispatch .d-right{ min-height:0; overflow-y:auto; gap:12px; padding-right:4px; }
#viewDispatch .d-right > .card{ flex:none; }
#viewDispatch .mini-wrap{ height:190px; }
/* 大队数按区县全量（重庆 38 个），不设上限会把下方应急资源卡挤出可视区 */
#viewDispatch .station-list{ max-height:min(260px, 26vh); overflow-y:auto; }
#viewDispatch .control-list{ max-height:none; }

.evt-plan{
  margin-top:2px; max-width:170px; font-size:11px; color:var(--text-3);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}

/* 警力资源卡：标题行 + 辖区/工单行 + 在办工单行，13 个大队不再撑满右栏 */
.st-card{
  display:flex; flex-direction:column; gap:2px; padding:7px 10px;
  border:1px solid var(--line); border-radius:var(--r-card); background:var(--surface-3);
}
.st-hd{ display:flex; align-items:center; gap:8px; }
.st-hd b{ flex:1; min-width:0; font-size:12px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.st-hd .st-dot{ width:7px; height:7px; flex:none; }
.st-state{ font-size:11px; color:var(--text-3); white-space:nowrap; }
.st-info{ display:flex; gap:12px; font-size:11px; color:var(--text-3); }
.st-order{ font-size:11px; color:var(--text-2); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.st-order b{ color:var(--text); font-weight:600; }

/* 处置进度：进度条 + 当前阶段，替代六个文字胶囊 */
.tl-prog{ display:inline-flex; align-items:center; gap:8px; white-space:nowrap; }
.tl-bars{ display:inline-flex; gap:3px; }
.tl-bars i{ display:block; width:15px; height:5px; border-radius:2px; background:#1c3454; }
.tl-bars i.done{ background:var(--blue); }
.tl-bars i.cur{ background:#eab308; }
.tl-step{ font-size:11px; color:var(--text-3); font-variant-numeric:tabular-nums; min-width:56px; }
.detail-flow .tl-prog{ padding:6px 0; }
.detail-flow .tl-bars i{ width:34px; height:6px; }

/* 协同流程：编号圆点 + 连接线的一体式步骤条，不再用箭头卡片 */
#viewDispatch .flow-card{ flex:none; margin-top:0; padding:12px 16px; }
#viewDispatch .flow-card .card-head{ margin-bottom:8px; }
#viewDispatch .flow-steps{ display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); gap:0; margin-top:0; }
#viewDispatch .step{
  position:relative; background:none; border:none; border-radius:0;
  padding:0 14px 0 0; text-align:left; min-width:0;
}
#viewDispatch .step:not(:last-child)::after{
  content:""; position:absolute; left:20px; right:0; top:10px; height:1px; background:var(--line);
}
#viewDispatch .step i{
  position:relative; z-index:1; width:20px; height:20px; border-radius:50%; margin-bottom:6px;
  background:var(--surface-3); border:1px solid var(--line); color:var(--text-2);
  font-size:11px; font-weight:600;
}
#viewDispatch .step b{ font-size:12px; margin-bottom:2px; color:var(--text); }
#viewDispatch .step span{ font-size:11px; color:var(--text-3); line-height:1.45; }

/* ---------- 城市路况：城市切换收成一行，浮层统一 token ---------- */
#viewCity.active{ height:calc(100vh - 151px); min-height:640px; }
.city-layout{ height:100%; grid-template-columns:minmax(0,1fr) 340px; gap:12px; }
.map-card,.city-canvas-wrap{ height:100%; min-height:0; }
.city-aside{ max-height:100%; background:var(--surface-2); box-shadow:none; gap:4px; }
.city-aside .road-row{ padding:5px 9px; }

.city-topbar{
  top:12px; left:12px; width:238px; max-width:none; flex-wrap:nowrap; align-items:center;
  justify-content:space-between;
  gap:8px; padding:6px 8px 6px 12px;
  background:var(--surface-2); border:1px solid var(--border);
  border-radius:var(--r-card); box-shadow:none;
}
.ct-current{ font-size:13px; font-weight:600; color:var(--text); }
.ct-toggle{
  font-size:11px; color:var(--text-2); background:var(--surface-3);
  border:1px solid var(--line); border-radius:var(--r-btn); padding:4px 10px; cursor:pointer;
}
.ct-toggle:hover{ border-color:rgba(59,130,246,.45); color:#3b82f6; }
/* 收起时只留当前城市 + 切换按钮；展开时浮层向下铺开，不挤占地图高度 */
.city-chips{ display:none; }
.city-topbar.open .city-chips{
  display:flex; position:absolute; top:calc(100% + 6px); left:0; z-index:20;
  width:min(680px, calc(100vw - 480px)); max-height:54vh; overflow-y:auto;
  padding:10px 12px; gap:6px;
  background:var(--surface-2); border:1px solid var(--border);
  border-radius:var(--r-card); box-shadow:none;
}
.city-chip{
  border:1px solid var(--line); background:var(--surface-3); color:var(--text-2); border-radius:var(--r-pill);
}
.city-chip:hover{ border-color:rgba(59,130,246,.45); color:#3b82f6; background:#0f1e33; }
.city-chip.on{ background:var(--blue); border-color:var(--blue); color:#12243d; box-shadow:none; }

.city-stat{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-card); ; box-shadow:none; }
/* 城市面板展开时压住统计卡，暂时隐藏避免两个浮层叠在一起 */
.city-topbar.open ~ #cityStatCard{ visibility:hidden; }
.city-legend{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-card); ; box-shadow:none; }
.city-side{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-card); box-shadow:none; }
.side-list{ height:auto; max-height:300px; }
/* 列表可滚动时底部渐隐，最后一行不再被硬切一半 */
#cityList.cut{
  -webkit-mask-image:linear-gradient(#000 calc(100% - 18px), transparent);
  mask-image:linear-gradient(#000 calc(100% - 18px), transparent);
}

/* 1080 屏右栏也要一屏放完：样本出处与底图声明在页脚已有同义说明，这档先收掉 */
@media (max-height:1100px){
  .pred-src{ display:none; }
  .city-aside .disclaimer-mini{ display:none; }
}

/* 矮屏（笔记本 900 / 768）：排行榜收紧一档，10 名仍能一屏排下 */
@media (max-height:960px){
  .rank-list{ gap:2px; }
  .rank-i{ padding:5px 10px; gap:3px; }
  .rank-i .rank-no{ width:24px; font-size:20px; }
  .rank-i .rank-name,.rank-i .rank-cur{ font-size:14px; }
  /* 城市右栏在矮屏先收起重复说明段，再把分节留白压一档，
     保证"进入事故协同"按钮与底图来源声明都完整可见 */
  .aside-text{ display:none; }
  .city-aside .aside-note-head{ display:none; }
  .city-aside{ gap:4px; }
  .city-aside .card-head{ margin-bottom:6px; }
  .city-aside .card-head.sub{ margin:4px 0; }
  .city-aside .road-stat,.city-aside .city-predict{ margin-bottom:6px; }
  .city-aside .disclaimer-mini{ margin-top:8px; }
}

/* 窄桌面：收起品牌副标题与次要控件，保证顶栏单行不挤压 */
@media (max-width:1800px){
  .brand-text p{display:none}
}
@media (max-width:1700px){
  .nav-item{padding:7px 11px}
  .main-nav{gap:1px}
  .top-tools{gap:5px}
  .sim-clock .sc-label{display:none}
}
/* 1440 笔记本：顶栏按重要性递减收起，始终单行放得下五个入口 */
@media (max-width:1600px){
  .brand-text .ver{display:none}
  #dayTypeBadge{display:none}
  .nav-item{padding:7px 10px;font-size:13px}
  .top-tools{gap:5px}
  .date-control span{display:none}
  .sim-clock .sc-date{display:none}
}

@media (max-width:1360px){
  .nat-grid{grid-template-columns:1fr}
  .rank-card{grid-column:auto;grid-row:auto}
  .d-grid{grid-template-columns:1fr}
  .city-layout{grid-template-columns:1fr}
  .city-aside{display:none}
}

/* 平板优化 */
@media (max-width:960px){
  .topbar{flex-wrap:wrap;gap:12px;padding:8px 14px}
  .brand{min-width:auto}
  .brand-text p{display:none}
  .top-tools{min-width:auto;flex-wrap:wrap;gap:8px}
  .main-nav{order:3;width:100%;flex:none;justify-content:space-around}
  .city-canvas-wrap{height:50vh;min-height:400px}
  .city-side{width:260px}
  .mini-card{display:none}
  .d-right{display:grid;grid-template-columns:1fr;gap:14px}
}

/* 手机优化 */
@media (max-width:640px){
  .topbar{padding:6px 10px}
  .brand-logo{width:32px;height:32px}
  .brand-text h1{font-size:15px}
  .brand-text .ver{display:none}
  .sim-clock{flex-direction:column;gap:2px;padding:4px 10px;align-items:center}
  .sim-clock .sc-label{font-size:11px}
  .sim-clock b{font-size:14px}
  .sim-clock .sc-date{display:none}
  .date-control,.day-type-badge{font-size:11px;padding:3px 6px}
  .date-control input{width:90px}
  .date-control select{max-width:76px}
  .sim-state,.link-state{display:none}
  .tool-group{gap:4px}
  .tbtn{padding:4px 8px;font-size:11px}
  .tselect{padding:4px 6px;font-size:11px}
  .main{padding:10px 8px 20px}
  .kpi-row{grid-template-columns:1fr 1fr;gap:10px}
  .kpi{padding:10px 12px;gap:10px}
  .kpi .k-ico{width:36px;height:36px;font-size:18px}
  .kpi .k-value{font-size:20px}
  .kpi .k-label{font-size:11px}
  .nav-item{padding:6px 12px;flex-direction:column;gap:4px;font-size:12px}
  .nav-item span:not(.ni-ico){display:none}
  .rank-card{display:none}
  .city-canvas-wrap{height:40vh;min-height:320px}
  .city-side{width:100%;position:static;margin-top:12px}
  .city-aside{display:flex;flex-direction:row;max-height:none;overflow-x:auto;overflow-y:hidden;gap:10px;padding-bottom:6px}
  .city-aside .card{flex:none;width:86vw}
  .card{padding:12px}
  .card-head h3{font-size:14px}
}

/* ============ fmo 终端风收尾 ============ */
/* 空状态图标去彩色：黑白模式下 emoji 只作为剪影 */
.empty-ico{ filter:grayscale(1) brightness(1.25); }
/* 地图与卡片同底时靠边框划出区域 */
.city-canvas-wrap{ border:1px solid var(--border); border-radius:var(--r-card); overflow:hidden; }

/* ==================================================================
   配色 v4 · 蓝色归位（参照 EasySSH 暗色约定）
   正文用中性浅色，蓝色只回答「这里能点 / 这里是当前项」；
   绿黄橙红只回答「什么等级、什么告警」。两项职责不再混用。
   ================================================================== */
:root{
  --s3:#f97316;                        /* 拥堵＝橙，不再用品牌蓝顶替 */
  --s3-bg:rgba(249,115,22,.14);
  --link-on:#60a5fa;                   /* 进行中状态的亮蓝，深底上对比度够 */
}

/* ---- 顶栏：时钟是读数不是按钮，回到白色 ---- */
.sim-clock b{ color:#ffffff; }
.sim-clock .sc-label,.sim-clock .sc-date{ color:var(--text-3); }
.brand-text .ver{ color:#8fb2d8; }
.day-type-badge.weekend{ color:var(--text-2); background:var(--surface-3); }
.day-type-badge.workday{ color:var(--text); }

/* ---- 全国态势 ---- */
.replay-bar .rtime{ color:#ffffff; }
.kpi .k-sub b{ color:var(--text-2); }
.kpi-row-v b.s3{ color:var(--s3); }
.rank-i .rank-cur.s3{ color:var(--s3); }
.note-strip code{ color:var(--text-2); }
.box-stats .bs-head{ color:var(--text); }
.box-stats .bs-cell small{ color:var(--text-3); }
.box-stats .bs-foot,.box-stats .bs-foot em{ color:var(--text-3); }

/* ---- 等级：s3 / lv3 / lt-3 一律橙 ---- */
.lv-tag.s3{ color:var(--s3); background:var(--s3-bg); }
.si-tag.lv3{ color:var(--s3); background:var(--s3-bg); }
/* LEVELS 生成的是 s1–s4，此前只写了 lv1–lv4，拥堵路段标签因此丢了等级色 */
.si-tag.s1{ color:#22c55e; background:rgba(34,197,94,.14); }
.si-tag.s2{ color:#eab308; background:rgba(234,179,8,.14); }
.si-tag.s3{ color:var(--s3); background:var(--s3-bg); }
.si-tag.s4{ color:#ef4444; background:rgba(239,68,68,.16); }
.road-row.lv3 span::before{ background:var(--s3); }
.road-row.idx b.s3{ color:var(--s3); }
.pred-val.lv3{ color:var(--s3); }
.pred-line.lv3{ stroke:var(--s3); }
.pred-dot.lv3{ fill:var(--s3); }
.lt-3{ color:var(--s3); }
.lt-tag.lt-3{ color:var(--s3); background:var(--s3-bg); }
.hot-rank.mid{ color:var(--s3); background:var(--s3-bg); border-color:rgba(249,115,22,.45); }
.mstat-dot.orange{ background:var(--s3); }
.st-mid .st-dot{ background:var(--amber); }

/* ---- 事故协同：表头、单号、弹层小标题不再抢蓝 ---- */
.order-table th{ color:var(--text-3); }
.wo-id{ color:#9fc0e2; }
.term-id{ color:var(--text-2); }
.detail-kicker{ color:var(--text-3); }
.detail-section h3{ color:var(--text); }
.tooltip b{ color:#ffffff; }
.kh-row kbd{ color:var(--text-2); }
/* 工单状态：灰＝未派，蓝＝在途/在场（进行中），绿＝完结 */
.stb-pending{ background:var(--surface-3); color:var(--text-2); }
.stb-onway,.stb-onscene{ color:var(--link-on); }
.st-tag.st-onway,.st-tag.st-onscene,.st-tag.st-assigned{ color:var(--link-on); background:var(--surface-3); }
.lt-tag{ color:var(--text-2); background:var(--surface-3); }
.lt-cal-s b.on{ color:#ffffff; }
.city-chip-tier i{ background:var(--surface-3); color:var(--text-2); }

/* ---- 覆盖总览：分级条回到蓝→青→琥珀→红 ---- */
.cov-kpi .v.gold{ color:var(--amber); }
.cov-tier.t2 i{ background:#38bdf8; }
.cov-tier.t3 i{ background:var(--amber); }
.cov-bar.b2>span{ background:#38bdf8; }
.cov-bar.b3>span{ background:var(--amber); }

/* ---- 字号：11px 是徽章/图例的下限，说明性正文再提一档到 12px ---- */
.head-tip,.kpi .k-sub{ font-size:12px; }

/* ---- 顶部四个 KPI 框：数字放大一档，标签同步，框内不再右侧空一半 ---- */
.kpi{ padding:12px 18px; gap:2px; }
.kpi .k-label,.kpi-k{ font-size:13px; }
.kpi-row-v b{ font-size:30px; }
.kpi-s{ font-size:13px; }
.rank-note,.note-strip span,.note-strip code{ font-size:12px; }
.d-head-l p,.d-toolbar-note,.switch-text small{ font-size:12px; }
.aside-text,.si-meta,.st-info,.st-state,.st-order,.st-name span,
.lt-hint,.lt-foot,.evt-plan,.acc-pos span,.tl-step,.st-eta{ font-size:12px; }
.info-table td{ font-size:13px; }
.cov-kpi .l,.cov-badge,.cov-foot{ font-size:13px; }

/* ---- 一级导航：字号上去了，点击框跟着放大，避免字贴边 ---- */
.nav-item{ font-size:15px; padding:8px 16px; line-height:1.2; }
.nav-item.active{ box-shadow:none; }
.main-nav{ padding:5px; }
@media (max-width:1600px){
  .nav-item{ font-size:15px; padding:8px 14px; }
}
@media (max-width:1400px){
  .nav-item{ font-size:14px; padding:7px 11px; }
}
@media (max-width:1300px){
  .nav-item{ font-size:13px; padding:7px 6px; }
}
@media (max-width:960px){
  .nav-item{ font-size:14px; padding:7px 12px; }
}
@media (max-width:640px){
  .nav-item{ font-size:13px; }
}

/* ---- 第七轮：截图审查后的细节修正 ---- */
/* 活跃事件的「起」不该和数字同尺寸 */
.kpi-u{ font-size:15px; font-weight:600; color:var(--text-2); align-self:flex-end; margin:0 0 5px 6px; }
/* 右栏四张卡压到一屏内：三张列表各自限高滚动，最下面的管制卡才不至于完全看不见 */
#viewDispatch .mini-wrap{ height:160px; }
#viewDispatch .station-list{ max-height:min(180px, 19vh); }
#viewDispatch .resource-list{ max-height:96px; overflow-y:auto; }
#viewDispatch .control-list{ max-height:min(280px, 34vh); overflow-y:auto; }
#viewDispatch .resource-list{ mask-image:linear-gradient(to bottom,#000 calc(100% - 16px),transparent); -webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 16px),transparent); }
#viewDispatch .control-item.pending{ cursor:pointer; }
#viewDispatch .control-head{ align-items:center; flex-wrap:wrap; }
#viewDispatch .control-head .mini-btn{ margin-left:auto; flex:none; }
/* 2K/4K 屏幕纵向有余，右栏列表放宽，别在下面留一大片空 */
@media (min-height:1200px){
  #viewDispatch .mini-wrap{ height:240px; }
  #viewDispatch .station-list{ max-height:320px; }
  #viewDispatch .resource-list{ max-height:170px; }
  #viewDispatch .control-list{ max-height:320px; }
}
/* 工单看板与处置流程并成一列：看板撑满剩余高度，流程条贴底，右栏自己滚动 */
#viewDispatch .d-left{ display:flex; flex-direction:column; gap:12px; min-height:0; }
#viewDispatch .d-left .board-card{ flex:1; min-height:0; }
#viewDispatch .d-left .flow-card{ flex:none; }
/* 覆盖总览四个 KPI：数字统一白色，颜色只留给表格里的分级 */
/* 系统说明右栏加宽，长值（运行方式/依赖）不再挤成三行 */
.about-grid{ grid-template-columns:minmax(0,1fr) 392px; }
.info-table td:first-child{ width:72px; }
/* 城市右栏：内容到底部留白，把免责声明压到卡片底边 */
@media (min-width:641px){
  .city-aside{ display:flex; flex-direction:column; }
  .city-aside > *{ flex:0 0 auto; }
  /* 右栏还剩下百来像素：趋势图长高一档，剩下的空隙压到按钮上方 */
  .city-aside #cityPredict{ flex:0 1 auto; display:flex; flex-direction:column; }
  .city-aside .pred-chart{ flex:0 0 auto; height:104px; }
  .city-aside .primary-btn{ margin-top:auto; }
  .city-aside .disclaimer-mini{ margin-top:auto; }
}
/* 预测卡的四行小字各自单行省略，不要再撑出第三行 */
.pred-ml-line{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* ---- 第八轮：交互态截图后的修正 ---- */
/* 工单详情：整框 flex 列，正文自带滚动条，「关闭」按钮固定可见（此前被 overflow 滚出视野） */
.order-detail-box{ display:flex; flex-direction:column; overflow:hidden; }
.order-detail-head,.order-detail-foot{ flex:none; }
.order-detail-body{ flex:1 1 auto; min-height:0; overflow-y:auto; }

/* 最畅通 TOP5：space-between 会把 5 行拉成稀疏的等距，改为顶部紧凑排列 */
.rank-list{ justify-content:flex-start; gap:8px; }
/* 第 6 名起显示「畅 1」徽章，28px 装不下两个字，改为自适应宽 + 不换行 */
.rank-i .rank-no.free{ width:auto; min-width:36px; padding:2px 6px; white-space:nowrap; font-size:12px; letter-spacing:0; }
/* TOP5 只占一半行数：每行等高撑满卡片并垂直居中，避免下方留出三分之一空白 */
.rank-list > .rank-i{ flex:1 1 auto; justify-content:center; }

/* ---- 第九轮：排行悬停透明度、工单列宽锁定、全国 KPI 图标 ---- */
.rank-i:hover{
  background:rgba(59,130,246,.15);
  border-color:rgba(59,130,246,.5);
  box-shadow:none;
}
.order-table{ table-layout:fixed; width:100%; }
.order-table th:nth-child(1),.order-table td:nth-child(1){ width:76px; }
.order-table th:nth-child(3),.order-table td:nth-child(3){ width:56px; }
.order-table th:nth-child(5),.order-table td:nth-child(5){ width:88px; }
.order-table th:nth-child(6),.order-table td:nth-child(6){ width:210px; }
.order-table th:nth-child(7),.order-table td:nth-child(7){ width:88px; }
.order-table td{ overflow:hidden; }
.kpi{ display:flex; flex-direction:row; align-items:center; gap:12px; }
.kpi .k-ico{
  width:36px; height:36px; flex:none;
  color:var(--text-2);
  background:rgba(59,130,246,.10);
  border:1px solid var(--line);
  border-radius:4px;
}
.kpi .k-ico svg{ width:18px; height:18px; display:block; }
.kpi .k-body{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }

/* ---- 指挥中心审核台 ---- */
.detail-review{ background:var(--surface-3, #1c3454); }
.detail-review textarea{ background:#0e1420; color:var(--text); border-color:var(--line); }

/* ---- 公众上报入口弹层 ---- */
.citizen-entry-box{ width:min(440px,100%); }
.citizen-lead{ font-size:13px; color:var(--text-2); line-height:1.7; margin:0 0 12px; }
.citizen-qr{ display:flex; justify-content:center; margin:8px 0 12px; }
.citizen-qr img{ width:168px; height:168px; background:#fff; border-radius:8px; }
.citizen-url{ font-size:14px; word-break:break-all; }
.citizen-url a,.citizen-entry-box a{ color:#5b8fff; }

/* ---- 视觉统一 v10：顶栏防裁切与三端语言对齐 ---- */
/* 不使用玻璃拟态、数字渐变、导航发光；保持实心填充与清晰边界 */

/* 正文字体与等宽编号已在 :root / body 声明，此处不再重复覆盖 */

/* 主按钮：白字实心蓝，三端一致 */
.primary-btn{ color:#ffffff; }
.primary-btn.ghost{ color:#93c5fd; }

/* ===== 顶栏：五个导航标签必须完整可见，不得被时钟裁切 ===== */
.topbar{
  background:#0e1420;
  border-bottom:1px solid var(--line);
  box-shadow:none;
  display:flex;
  align-items:center;
  flex-wrap:nowrap;
  gap:12px;
  padding:8px 16px;
  overflow:visible;
}
.brand{
  flex:0 0 auto;
  min-width:auto;
  max-width:none;
}
.brand-text h1,.brand-text p{ white-space:nowrap; overflow:visible; }
.main-nav{
  flex:0 0 auto;          /* 按内容定宽，不被左右两侧挤扁 */
  min-width:max-content;
  overflow:visible;
  justify-content:center;
  gap:4px;
  padding:4px;
  background:#12243d;
  border:1px solid var(--line);
  border-radius:6px;
}
.nav-item{
  flex:none;
  white-space:nowrap;
  overflow:visible;
  font-size:13px;
  font-weight:500;
  line-height:1.2;
  padding:7px 12px;
  border-radius:4px;
  box-shadow:none;
}
.nav-item.active{
  background:#1d3a63;
  color:#93c5fd;
  font-weight:600;
  box-shadow:none;
}
.nav-item .ni-ico{ display:none; }
.top-tools{
  flex:1 1 auto;
  min-width:0;
  justify-content:flex-end;
  flex-wrap:nowrap;
  gap:6px;
  overflow:visible;
}
.sim-clock{
  background:#12243d;
  border:1px solid var(--line);
  flex:none;
}

/* 空间不够时，先收右侧次要控件，绝不压缩导航文字或左右内边距 */
@media (max-width:1800px){
  .brand-text p{ display:none; }
}
@media (max-width:1680px){
  .sim-clock .sc-label{ display:none; }
  #dayTypeBadge{ display:none; }
  .nav-item{ font-size:13px; padding:7px 11px; }
}
@media (max-width:1600px){
  .brand-text .ver{ display:none; }
  .date-control span{ display:none; }
  .sim-clock .sc-date{ display:none; }
  .nav-item{ font-size:13px; padding:7px 10px; }
}
@media (max-width:1480px){
  .sim-state{ display:none; }
  .date-control{ display:none; }
  .nav-item{ font-size:13px; padding:7px 10px; }
}
@media (max-width:1360px){
  .term-id{ display:none; }
  .nav-item{ font-size:13px; padding:7px 10px; }
}
@media (max-width:1280px){
  #btnKeyHelp,#btnVoice{ display:none; }
}
@media (max-width:960px){
  .topbar{ flex-wrap:wrap; }
  .main-nav{ order:3; width:100%; flex:none; min-width:0; justify-content:space-around; }
  .nav-item{ font-size:13px; padding:7px 10px; }
  .nav-item span:not(.ni-ico){ display:inline; }
  .date-control,.sim-state,.term-id{ display:none; }
}
@media (max-width:640px){
  .nav-item{ font-size:12px; padding:6px 8px; flex-direction:row; gap:0; }
  .nav-item span:not(.ni-ico){ display:inline; }
}

/* 工具栏与工单表：留白更匀、表头更易扫读（不改 fixed 列宽） */
.d-toolbar{ padding:10px 16px; gap:10px 14px; align-items:center; }
.order-table th{
  font-size:12px;
  font-weight:600;
  letter-spacing:0;
  padding:9px 10px;
  color:var(--text-3);
}
.order-table td{ padding:9px 10px; line-height:1.45; }
.d-toolbar-note{ color:var(--text-3); }


/* ===== 分析复盘 / 决赛演示加固 ===== */
.ni-v{background:#38bdf8}
.link-state.down{color:#fbbf24;border-color:rgba(251,191,36,.45);background:rgba(66,32,6,.55)}
.resource-item.contend{border-color:rgba(251,146,60,.55)}
.st-order.contend{color:#fdba74;margin-top:4px;font-size:11px}
#cityLegend .detour{display:inline-block;width:16px;height:0;border-top:2px dashed #38bdf8;vertical-align:middle;margin-right:4px}
#viewReview.active{display:flex;flex-direction:column;height:calc(100vh - 151px);min-height:700px;gap:12px}
#viewReview .d-head{flex:none}
#viewReview .d-toolbar{flex:none;margin-bottom:0;padding:8px 14px;gap:10px 14px}
.review-empty{padding:18px 20px}
.review-empty p{font-size:13px;color:var(--text-2);line-height:1.7;margin:0 0 8px}
.review-body{display:flex;flex-direction:column;gap:12px;flex:1;min-height:0;overflow:auto}
.review-body.dimmed{opacity:.72}
.review-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.review-chart{min-height:200px;padding:4px 8px 8px}
.review-empty-mini{font-size:13px;color:var(--text-3);padding:28px 12px;margin:0}
.review-note{padding:14px 18px 16px}
.review-note p{font-size:13px;color:var(--text-2);line-height:1.7;margin:0 0 8px}
.review-note ul{list-style:none;margin:0 0 8px;padding:0}
.review-note li{font-size:13px;color:var(--text-2);padding-left:16px;position:relative;margin-bottom:6px;line-height:1.6}
.review-note li::before{content:"";position:absolute;left:4px;top:8px;width:6px;height:6px;border-radius:2px;background:#3b82f6}
#btnReviewSession.on,#btnReviewSample.on{box-shadow:inset 0 0 0 1px #93c5fd}
@media (max-width:1100px){
  .review-grid{grid-template-columns:1fr}
}
@media (max-width:1680px){
  .nav-item{padding:7px 9px}
}

/* ===== 决赛补充：分级时限、预案图例、分流效果（实色描边，无玻璃、无发光） ===== */
.sev-tag{display:inline-block;padding:2px 8px;border:1px solid #334155;border-radius:2px;font-size:12px;line-height:1.4;background:#0f1e33;color:#e2e8f0}
.sev-tag.s1{color:#ca8a04;background:#422006;border-color:#a16207}
.sev-tag.s2{color:#fb923c;background:#7c2d12;border-color:#c2410c}
.sev-tag.s3{color:#fecaca;background:#7f1d1d;border-color:#ef4444}
.st-eta.sla-eta{color:#cbd5e1}
.st-eta.sla-overdue,.sla-overdue-text{color:#fecaca}
#cityLegend .plan-close,#cityLegend .plan-restrict{display:inline-block;width:14px;height:0;border-top:3px solid #9f1239;vertical-align:middle;margin-right:4px}
#cityLegend .plan-restrict{border-top-style:dashed;border-top-color:#c2410c}
#cityLegend .plan-divert{display:inline-block;width:8px;height:8px;border-radius:50%;background:#0e7490;border:1px solid #e0f2fe;vertical-align:middle;margin-right:4px}
#cityLegend .plan-cordon{display:inline-block;width:12px;height:12px;border:2px dashed #a16207;border-radius:50%;vertical-align:middle;margin-right:4px}
.city-diversion,.city-focus{padding:4px 0 8px}
.div-item,.focus-item{border:1px solid var(--border);background:#0f1e33;border-radius:3px;padding:8px 10px;margin-bottom:8px}
.div-head{display:flex;justify-content:space-between;gap:8px;margin-bottom:6px;font-size:12px}
.div-head b{color:#e2e8f0}
.div-head span,.div-note,.focus-item span{color:var(--text-3);font-size:12px}
.div-row{display:flex;justify-content:space-between;gap:8px;font-size:12px;padding:2px 0;color:var(--text-2)}
.div-row b{color:#e2e8f0;font-weight:600;text-align:right}
.div-note{margin:4px 0 0}
.focus-item{display:flex;justify-content:space-between;gap:8px;align-items:center}
.focus-item.kind-school b{color:#ca8a04}
.focus-item.kind-hospital b{color:#e11d48}
.focus-item.kind-bus b{color:#2563eb}
.plan-steps{list-style:none;margin:8px 0 0;padding:0}
.plan-steps li{font-size:13px;color:var(--text-2);padding:4px 0 4px 14px;position:relative;line-height:1.5}
.plan-steps li::before{content:"";position:absolute;left:2px;top:10px;width:6px;height:6px;border-radius:1px;background:#3b82f6}
#btnReviewParams.on{box-shadow:inset 0 0 0 1px #93c5fd}
#rvParams{margin-top:12px}

/* 全国 KPI：四卡等宽铺满，副文案靠右，避免首卡右侧大块留白 */
.kpi-row-v{ width:100%; }
.kpi-s{ margin-left:auto; text-align:right; min-width:0; }

/* 全国 KPI 改为六格等宽，副文案仍靠右；窄屏改为两行三列 */
.kpi-row{ grid-template-columns:repeat(6, minmax(0, 1fr)); gap:10px; }
.kpi{ min-width:0; padding:10px 12px; gap:10px; }
.kpi .k-ico{ width:32px; height:32px; }
.kpi-row-v b{ font-size:24px; }
@media (max-width:1600px){
  .kpi-row{ grid-template-columns:repeat(3, minmax(0, 1fr)); }
}
@media (max-width:640px){
  .kpi-row{ grid-template-columns:1fr 1fr; }
}

/* 超时提醒改为左边线 + 暗底，避免整表大红 */
.order-table tr.sla-overdue td{
  background:#2a1820;
  border-top:1px solid #5c2a32;
  border-bottom:1px solid #5c2a32;
}
.order-table tr.sla-overdue td:first-child{
  border-left:3px solid #ef4444;
}
.order-table tr.sla-overdue td:last-child{
  border-right:1px solid #5c2a32;
}

/* ===== 工单看板对齐：表头与单元格对齐，等级/操作居中 ===== */
.order-table th,
.order-table td{
  vertical-align:middle;
}
.evt-cell{
  display:flex;
  align-items:center;
  gap:8px;
  min-width:0;
}
.evt-cell > div{
  min-width:0;
}
.order-table .sev-tag{
  display:inline-block;
  white-space:nowrap;
  min-width:44px;
  text-align:center;
  box-sizing:border-box;
}
.order-table th:nth-child(1),
.order-table td:nth-child(1){ width:86px; }
.order-table th:nth-child(3),
.order-table td:nth-child(3){
  width:72px;
  text-align:center;
}
.order-table th:nth-child(5),
.order-table td:nth-child(5){ width:110px; }
.order-table th:nth-child(6),
.order-table td:nth-child(6){ width:200px; }
.order-table td:nth-child(6) .tl-prog{
  display:flex;
  align-items:center;
  justify-content:flex-start;
}
.order-table th:nth-child(7),
.order-table td:nth-child(7){
  width:100px;
  text-align:center;
}
.order-table td:nth-child(7) .mini-btn{
  display:block;
  width:80px;
  margin:0 auto 4px;
  box-sizing:border-box;
  text-align:center;
  padding-left:0;
  padding-right:0;
}
.order-table td:nth-child(7) .mini-btn:last-child{ margin-bottom:0; }

/* 悬停不位移，避免小按钮在指针边缘闪烁 */
.primary-btn:hover,.mini-btn:hover,.primary-btn:active,.mini-btn:active{ transform:none; }

/* 就近二次出警结果卡：实色填充、清晰边框，禁止毛玻璃 / KPI 渐变字 / 导航发光 */
.floyd-card{background:var(--card);border:1px solid var(--border);border-radius:6px;}
.floyd-card .card-head h3{color:var(--text);font-weight:700;}
.floyd-hint{margin:0 12px 8px;font-size:12px;color:var(--text-3);line-height:1.5;}
.floyd-list{display:flex;flex-direction:column;gap:8px;padding:0 12px 12px;max-height:280px;overflow:auto;}
.floyd-item{background:var(--surface-2);border:1px solid var(--line);border-radius:4px;padding:8px 10px;}
.floyd-item.on{border-color:var(--amber);background:#2c2a12;}
.floyd-item-head{display:flex;align-items:center;gap:8px;}
.floyd-item-head b{color:var(--text);font-weight:700;flex:1;}
.floyd-rank{display:inline-block;min-width:18px;text-align:center;font-size:11px;font-weight:700;color:#12243d;background:var(--amber);border:1px solid #ca8a04;border-radius:3px;padding:0 4px;}
.floyd-kind{font-size:11px;color:var(--text-2);border:1px solid var(--border);background:var(--surface-3);border-radius:3px;padding:0 6px;white-space:nowrap;}
.floyd-item-body{margin-top:4px;font-size:12px;color:var(--text-2);}
.floyd-item-body span{margin-right:10px;}
.floyd-empty{margin:0 12px 12px;font-size:12px;color:var(--text-3);}

/* 城市路况三段：概览 / 预测 / 实况 展示调整 */
.stat-hd .stat-seed{
  display:inline-flex;align-items:center;height:18px;padding:0 6px;border:1px solid rgba(147,197,253,.35);
  border-radius:3px;font-size:11px;color:#93c5fd;line-height:1;white-space:nowrap;
}
.stat-grid b.s1{color:#22c55e}.stat-grid b.s2{color:#eab308}
.stat-grid b.s3{color:#f97316}.stat-grid b.s4{color:#ef4444}
.road-stat{display:flex;flex-direction:column;gap:6px}
.road-row.idx{display:flex;align-items:center;gap:8px}
.road-row.idx b{margin-left:auto}
.road-row.idx em.lv-tag{flex:none;margin-left:0}
.road-seed{font-size:11px;color:#8fa6bd;line-height:1.45;padding:0 2px}
.road-mix{background:#0f1e33;border:1px solid var(--line);border-radius:3px;padding:8px 9px 7px}
.road-mix-bar{display:flex;height:8px;border-radius:4px;overflow:hidden;background:#12243d}
.road-mix-bar i{display:block;height:100%;min-width:0}
.road-mix-bar i.lv1{background:#22c55e}
.road-mix-bar i.lv2{background:#eab308}
.road-mix-bar i.lv3{background:#f97316}
.road-mix-bar i.lv4{background:#ef4444}
.road-mix-leg{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:6px;font-size:11px;color:var(--text-3)}
.road-mix-leg span{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.road-mix-leg span::before{content:"";width:6px;height:6px;border-radius:50%;flex:none}
.road-mix-leg .lv1::before{background:#22c55e}
.road-mix-leg .lv2::before{background:#eab308}
.road-mix-leg .lv3::before{background:#f97316}
.road-mix-leg .lv4::before{background:#ef4444}
.road-foot{font-size:11px;color:#8fa6bd;padding:0 2px 2px}
.city-predict .pred-align{display:flex;justify-content:space-between;gap:8px;margin:4px 0 2px;font-size:11px;color:var(--text-3)}
.city-predict .pred-align b{color:#ffffff;font-variant-numeric:tabular-nums;font-weight:600}
.city-predict .pred-src{white-space:normal;overflow:visible;text-overflow:unset;line-height:1.45}
.lt-grade-note{margin:0 0 6px;font-size:11px;line-height:1.5;color:#8fa6bd}
.live-traffic .lt-roads{max-height:88px}

/* ==================================================================
   视觉提升 v11 · 指挥舱层级（2026-11-13）
   对照交管指挥舱、城市交通运行监测平台与成熟 ITS 控制台的视觉原则：
   深底与卡片明度拉开、字号字重差级清楚、间距与卡片节奏统一，
   颜色只用于等级、状态与可操作项。禁止毛玻璃、KPI 渐变字、导航发光。
   ================================================================== */

:root{
  --bg:#0a1626;
  --surface-1:#0a1626;
  --card:#12243d;
  --surface-2:#12243d;
  --surface-3:#1a3050;
  --border:#2b4c73;
  --line:#203a5c;
  --text:#f3f7fb;
  --text-2:#c2d3e6;
  --text-3:#8fa6bd;
  --blue:#3b82f6;
  --blue-2:#60a5fa;
  --blue-weak:#143056;
  --shadow:none;
  --shadow-card:none;
  --shadow-pop:none;
}

body{
  background:var(--bg);
  color:var(--text);
  font-size:13px;
  line-height:1.55;
}

/* ---- 顶栏：比画布更深，底边用可见实线分界 ---- */
.topbar{
  background:#07101c;
  border-bottom:1px solid var(--border);
}

.main-nav{
  background:#0f1e33;
  border:1px solid var(--border);
}

.nav-item{
  color:var(--text-2);
}

.nav-item:hover{
  color:var(--text);
  background:#1a3050;
}

.nav-item.active{
  background:#1e3a5f;
  color:#ffffff;
  font-weight:600;
  box-shadow:none;
}

/* 时钟是读数：数字纯白等宽，标签用辅助色 */
.sim-clock{
  background:#0f1e33;
  border:1px solid var(--border);
}
.sim-clock b{
  color:#ffffff;
  font-size:17px;
  font-weight:700;
  font-variant-numeric:tabular-nums;
}
.sim-clock .sc-label,
.sim-clock .sc-date{
  color:var(--text-3);
}

.date-control,
.sim-state,
.day-type-badge,
.tbtn,
.tselect,
.link-state,
.term-id{
  background:#0f1e33;
  border:1px solid var(--border);
}

.tbtn:hover,
.tselect:hover{
  border-color:#3d6490;
  color:var(--text);
  transform:none;
}

/* ---- 通用卡片：实色填充 + 清晰边框，与深底形成稳定层级 ---- */
.card,
.kpi,
.stat-chip,
.d-toolbar,
.floyd-card{
  background:var(--surface-2);
  border:1px solid var(--border);
  box-shadow:none;
}

.card:hover{
  border-color:#3d6490;
}

.card-head{
  margin-bottom:12px;
}

.card-head h3{
  font-size:14px;
  font-weight:600;
  color:var(--text);
  letter-spacing:0;
}

.card-head h3::before{
  width:3px;
  height:14px;
  border-radius:1px;
  background:var(--blue);
  box-shadow:none;
}

.head-tip{
  font-size:12px;
  color:var(--text-3);
}

.seg{
  background:#0f1e33;
  border:1px solid var(--border);
}

.seg-item{
  color:var(--text-2);
}

.seg-item.active{
  background:#1e3a5f;
  color:#ffffff;
  font-weight:600;
  box-shadow:none;
}

/* ---- 全国态势：KPI 标签 / 数字 / 辅助说明三级差级 ---- */
.kpi{
  padding:12px 14px;
}

.kpi .k-label,
.kpi-k{
  font-size:12px;
  font-weight:500;
  color:var(--text-3);
  letter-spacing:0;
}

.kpi-row-v b,
.kpi .k-value{
  font-size:28px;
  font-weight:700;
  color:#ffffff;
  font-variant-numeric:tabular-nums;
  line-height:1.1;
}

.kpi-s,
.kpi .k-sub{
  font-size:12px;
  color:var(--text-3);
}

.kpi .k-sub b{
  color:var(--text-2);
  font-weight:600;
}

.kpi-u{
  font-size:13px;
  font-weight:500;
  color:var(--text-3);
}

.kpi .k-ico{
  background:var(--surface-3);
  border:1px solid var(--line);
  color:var(--text-2);
}

.kpi-row{
  gap:12px;
}

.nat-canvas-wrap{
  background:#0c1a2e;
  border:1px solid var(--border);
}

.canvas-chip,
.canvas-legend,
.replay-bar{
  background:var(--surface-2);
  border:1px solid var(--border);
  color:var(--text);
}

.replay-bar .rtime{
  color:#ffffff;
}

.rank-i{
  background:var(--surface-3);
  border:1px solid var(--line);
}

.rank-i:hover{
  background:#1e3a5f;
  border-color:#3d6490;
  box-shadow:none;
}

.rank-i .rank-name{
  font-size:14px;
  font-weight:600;
  color:var(--text);
}

.rank-i .rank-cur{
  font-size:16px;
  font-weight:700;
  font-variant-numeric:tabular-nums;
}

.note-card{
  padding:12px 16px;
}

.note-strip span{
  font-size:12px;
  color:var(--text-3);
}

.note-strip b{
  color:var(--text);
}

/* ---- 城市路况：地图浮层全部改为实色，不用半透明 ---- */
.city-topbar,
.city-stat,
.city-legend,
.city-side,
.city-popup,
.box-stats,
.mini-legend,
.mini-wrap{
  background:var(--surface-2);
  border:1px solid var(--border);
  box-shadow:none;
}

.city-topbar.open .city-chips{
  background:var(--surface-2);
  border:1px solid var(--border);
  box-shadow:none;
}

.zoom-tools button{
  background:var(--surface-2);
  border:1px solid var(--border);
}

.zoom-tools button:hover{
  color:var(--text);
  border-color:#3d6490;
}

.stat-grid b{
  font-size:18px;
  font-weight:700;
  font-variant-numeric:tabular-nums;
  color:#ffffff;
}

.pred-val{
  font-size:26px;
  font-weight:700;
  font-variant-numeric:tabular-nums;
}

.city-aside .card-head.sub{
  margin-top:12px;
  margin-bottom:8px;
}

.aside-text{
  font-size:12px;
  color:var(--text-2);
  line-height:1.65;
}

.road-row,
.city-predict,
.live-traffic,
.div-item,
.focus-item,
.road-mix{
  background:var(--surface-3);
  border:1px solid var(--line);
}

/* ---- 事故协同：页标题、统计芯片、表头更易扫读 ---- */
.d-head-l h2{
  font-size:20px;
  font-weight:700;
  color:var(--text);
  letter-spacing:0;
}

.d-head-l p{
  font-size:12px;
  color:var(--text-3);
}

.stat-chip{
  padding:8px 14px;
}

.stat-chip .k{
  font-size:12px;
  color:var(--text-3);
}

.stat-chip b,
#viewDispatch .stat-chip b{
  font-size:20px;
  font-weight:700;
  color:#ffffff;
  font-variant-numeric:tabular-nums;
}

.d-toolbar{
  background:var(--surface-2);
  border:1px solid var(--border);
}

.order-table th{
  color:var(--text-3);
  font-size:12px;
  font-weight:600;
  background:var(--surface-2);
  border-bottom:1px solid var(--border);
}

.order-table td{
  border-bottom:1px solid var(--line);
}

#viewDispatch .step b{
  font-size:13px;
  font-weight:600;
  color:var(--text);
}

#viewDispatch .step span{
  font-size:12px;
  color:var(--text-3);
}

.floyd-item,
.resource-item,
.control-item,
.station,
.st-card{
  background:var(--surface-3);
  border:1px solid var(--line);
}

/* 主按钮白字实色蓝；幽灵按钮实色浅底 + 清晰描边 */
.primary-btn{
  background:var(--blue);
  color:#ffffff;
  font-weight:600;
  box-shadow:none;
}

.primary-btn.ghost{
  background:var(--surface-3);
  color:#dbeafe;
  border:1px solid #3b6ea8;
}

.mini-btn.primary,
.lt-keyrow button{
  color:#ffffff;
}

/* ---- 作品介绍：标题、导语、分节留白拉开，模块更易扫读 ---- */
.about-grid{
  gap:16px;
}

.about-main,
.about-side{
  padding:20px 22px;
}

.about-main h2{
  font-size:22px;
  font-weight:700;
  color:var(--text);
  margin:0 0 12px;
  letter-spacing:0;
}

.about-lead{
  font-size:15px;
  color:var(--text-2);
  line-height:1.75;
  margin:0 0 20px;
}

.about-main h3,
.about-side h3{
  font-size:15px;
  font-weight:600;
  color:var(--text);
  margin:22px 0 12px;
}

.about-side h3:first-child{
  margin-top:0;
}

.about-main p{
  font-size:13px;
  color:var(--text-2);
  line-height:1.7;
}

.end-card{
  background:var(--surface-3);
  border:1px solid var(--border);
  padding:14px 16px;
  min-height:112px;
}

.end-card b{
  font-size:15px;
  font-weight:600;
}

.hub-box{
  background:var(--surface-3);
  border:1px solid var(--border);
}

.hub-box b{
  color:var(--text);
}

.arch-box{
  background:var(--surface-3);
  color:var(--text);
  border:1px solid var(--border);
  font-weight:600;
}

.arch-box.top,
.arch-box.bot{
  border-color:#3b6ea8;
}

.arch-box.mid{
  border-color:#2f7a52;
}

.arch-col p{
  font-size:12px;
  color:var(--text-3);
  line-height:1.6;
}

.af-step{
  background:var(--surface-3);
  border:1px solid var(--border);
  padding:12px 10px;
}

.af-step i{
  background:var(--blue-weak);
  border:1px solid var(--border);
  color:var(--text);
}

.af-step b{
  font-size:13px;
  font-weight:600;
}

.info-table td{
  padding:9px 6px;
  font-size:13px;
  border-bottom:1px solid var(--line);
}

.demo-steps{
  gap:8px;
}

.demo-steps li{
  font-size:13px;
  color:var(--text-2);
  line-height:1.65;
}

/* 浮层与提示用实色，避免半透明看起来像磨砂；遮罩层本身除外 */
.tooltip,
.toast,
.key-help,
.order-detail-box{
  background:var(--surface-2);
  border:1px solid var(--border);
  box-shadow:none;
}

.footer{
  color:var(--text-3);
}

@media (max-width:1600px){
  .kpi-row-v b,
  .kpi .k-value{ font-size:26px; }
}

@media (max-width:640px){
  .kpi-row-v b,
  .kpi .k-value{ font-size:22px; }
  .about-main,
  .about-side{ padding:16px; }
}

/* ---- 顶栏精简（v202611132246）：日型随日期自动识别，再收一层控件 ---- */
.topbar{
  display:flex;
  align-items:center;
  gap:12px;
  min-height:52px;
  padding:7px 16px;
}
.brand{ flex:none; }
.brand-text p{ display:none !important; }
.brand-text h1{ font-size:17px; line-height:1.2; }
.main-nav{
  flex:1 1 auto;
  justify-content:center;
  min-width:0;
}
.top-tools{
  flex:none;
  display:flex;
  align-items:center;
  gap:6px;
  min-width:0;
}
.sim-clock{
  display:flex;
  align-items:baseline;
  gap:8px;
  padding:5px 10px;
}
.sim-clock .sc-label{ display:none !important; }
.sim-clock .day-type-badge{
  background:transparent;
  border:none;
  padding:0;
  font-size:11px;
  color:var(--text-3);
}
.date-group{
  display:flex;
  align-items:center;
  gap:4px;
}
.date-group .date-control{ display:flex; padding:4px 6px; }
.date-group .date-control span{ display:none; }
.date-group input[type="date"]{ width:124px; background:transparent; color:inherit; border:0; }
.topbar .sim-state,
.topbar #btnKeyHelp{ display:none !important; }
body.mode-demo .topbar .term-id,
body.mode-demo .topbar .link-state{ display:none !important; }
.topbar .tbtn-icon{
  min-width:34px;
  padding:6px 8px;
  font-size:15px;
  line-height:1;
}
.topbar #simSpeed{
  min-width:86px;
  padding:6px 8px;
}
.topbar #btnPause{ min-width:52px; }
@media (max-width:1100px){
  .date-group{ display:none; }
}
/* 拥堵列表与指数对照（v202611141151） */
.side-sum{padding:8px 10px 6px;font-size:11px;line-height:1.45;color:var(--text-3);}

/* ---- 最终窄屏布局：大屏信息保留，手机改为自然纵向流 ---- */
@media (max-width:640px){
  .topbar{ gap:6px; padding:7px 8px; }
  .brand-logo{ width:30px; height:30px; }
  .brand-logo svg{ width:28px; height:28px; }
  .brand-text h1{ font-size:15px; }
  .top-tools{ flex:1 1 190px; gap:4px; }
  .sim-clock{ padding:4px 8px; }
  .topbar #btnPause{ min-width:44px; padding:5px 7px; }
  .topbar #simSpeed{ min-width:76px; padding:5px 6px; }

  .main-nav{
    display:grid;
    grid-template-columns:repeat(3,minmax(0,1fr));
    gap:3px;
    width:100%;
    padding:3px;
    overflow:visible;
  }
  .nav-item{
    width:100%;
    min-width:0;
    justify-content:center;
    padding:6px 3px;
    font-size:12px;
    line-height:1.2;
  }

  .main{ width:100%; padding:10px 8px 18px; }
  #viewNational.active,
  #viewDispatch.active,
  #viewReview.active{
    display:flex;
    height:auto;
    min-height:0;
    overflow:visible;
  }
  .kpi-row{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px; }
  .kpi{ min-width:0; padding:10px 12px; }
  .kpi-s{ display:none; }
  .kpi-row-v b{ max-width:100%; overflow:hidden; text-overflow:ellipsis; font-size:21px; }

  .nat-grid{ display:flex; flex-direction:column; min-height:0; gap:10px; }
  .nat-map-card,
  .trend-card,
  .note-card{ width:100%; min-width:0; }
  .nat-canvas-wrap{ flex:none; width:100%; height:320px; min-height:320px; }
  .trend-chart{ flex:none; width:100%; height:220px; min-height:220px; }
  .canvas-legend{ max-width:calc(100% - 20px); flex-wrap:wrap; }
  .note-strip{ display:grid; grid-template-columns:1fr; }
  .note-strip span{ padding:6px 0; border-left:0; border-top:1px solid var(--line); }
  .note-strip span:first-child{ border-top:0; }

  #viewDispatch .d-grid,
  .review-grid,
  .about-grid{ display:grid; grid-template-columns:minmax(0,1fr); }
  #viewDispatch .d-left,
  #viewDispatch .d-right,
  .about-main,
  .about-side{ min-width:0; width:100%; }
  #viewDispatch .d-right{ overflow:visible; }
  .d-head{ align-items:flex-start; }
  .d-head-r{ width:100%; overflow-x:auto; justify-content:flex-start; }
  .d-toolbar{ align-items:stretch; }
  .d-toolbar-note{ min-width:0; width:100%; }
  .order-table{ min-width:900px; }

  .city-layout{ display:block; }
  .city-canvas-wrap{ width:100%; min-height:420px; height:62vh; }
  .city-topbar{ max-width:calc(100% - 24px); }
  .city-stat{ max-width:calc(100% - 24px); }
  .footer{ gap:8px; padding:10px 12px 16px; flex-direction:column; }
}
