:root{
  --bg:#050b16;
  --panel-a:rgba(15,30,50,.93);
  --panel-b:rgba(7,15,28,.9);
  --line:rgba(56,189,248,.16);
  --line-2:rgba(56,189,248,.32);
  --txt:#e8f2ff;
  --muted:#7f9cbb;
  --muted-2:#5b7590;
  --cyan:#22d3ee;
  --blue:#3b82f6;
  --green:#34d399;
  --amber:#fbbf24;
  --red:#fb7185;
  --r:12px;
}

*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
[hidden]{display:none!important}
html,body{height:100%}
body{
  background:var(--bg);
  color:var(--txt);
  font-family:"PingFang SC","HarmonyOS Sans SC","Microsoft YaHei",system-ui,-apple-system,"Segoe UI",sans-serif;
  font-size:14px;
  min-height:100dvh;
  display:flex;
  flex-direction:column;
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
}

/* ---------- 背景 ---------- */
.bg{position:fixed;inset:0;z-index:0;overflow:hidden;pointer-events:none}
.bg-grid{
  position:absolute;inset:-1px;
  background-image:
    repeating-linear-gradient(45deg,rgba(56,189,248,.022) 0 1px,transparent 1px 7px),
    linear-gradient(rgba(56,189,248,.055) 1px,transparent 1px),
    linear-gradient(90deg,rgba(56,189,248,.055) 1px,transparent 1px);
  background-size:auto,56px 56px,56px 56px;
  mask-image:radial-gradient(circle at 50% 0%,#000 0%,rgba(0,0,0,.65) 55%,transparent 92%);
}
.bg-glow{position:absolute;border-radius:50%;filter:blur(90px);opacity:.5}
.bg-glow.g1{width:620px;height:620px;left:-160px;top:-220px;background:radial-gradient(circle,rgba(34,211,238,.30),transparent 66%)}
.bg-glow.g2{width:700px;height:700px;right:-200px;bottom:-280px;background:radial-gradient(circle,rgba(59,130,246,.26),transparent 66%)}
.bg-scan{position:absolute;inset:0;background:linear-gradient(180deg,transparent,rgba(34,211,238,.045) 48%,transparent);animation:scan 9s linear infinite}
@keyframes scan{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}

/* ---------- 顶栏 ---------- */
.topbar{
  position:relative;z-index:2;
  display:grid;grid-template-columns:1fr auto 1fr;align-items:center;
  gap:16px;padding:14px 22px 10px;
}
.brand{display:flex;align-items:center;gap:11px;min-width:0}
.logo{
  width:40px;height:40px;flex:0 0 40px;border-radius:11px;
  display:grid;place-items:center;font-size:19px;font-weight:700;color:#04121f;
  background:linear-gradient(140deg,#5cf0ff,#22d3ee 45%,#3b82f6);
  box-shadow:0 0 22px rgba(34,211,238,.45),inset 0 1px 0 rgba(255,255,255,.5);
}
.brand-txt{min-width:0}
.brand-txt h1{font-size:16px;font-weight:600;letter-spacing:.6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.brand-txt p{font-size:11px;color:var(--muted);letter-spacing:1.4px;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sys-state{
  display:flex;align-items:center;gap:5px;margin-left:8px;flex:0 0 auto;
  font-size:9.5px;font-weight:600;letter-spacing:1.6px;color:#34d399;
  border:1px solid rgba(52,211,153,.3);background:rgba(52,211,153,.07);border-radius:20px;padding:2px 8px;
}
.sys-state i{width:5px;height:5px;border-radius:50%;background:#34d399;box-shadow:0 0 9px #34d399;animation:pulse 1.8s infinite}

.title{display:flex;align-items:center;gap:14px;justify-content:center}
.t-inner{display:flex;flex-direction:column;align-items:center;gap:3px}
.t-sub{font-size:9px;letter-spacing:3.4px;color:rgba(127,156,187,.75);white-space:nowrap}
.hud-beam{position:relative;z-index:2;height:1px;margin:4px 20px 0;background:linear-gradient(90deg,transparent,rgba(56,189,248,.34),transparent)}
.hud-beam i{
  position:absolute;top:-1px;left:0;width:22%;height:3px;border-radius:2px;
  background:linear-gradient(90deg,transparent,#5cf0ff,transparent);
  box-shadow:0 0 14px rgba(34,211,238,.75);
  transform:translateX(-100%);will-change:transform;
  animation:beam 6.5s ease-in-out infinite;
}
/* 用 transform 位移替代 left（left 每帧触发布局+重绘，实测单此项占约 35% 单核 CPU） */
@keyframes beam{0%{transform:translateX(-100%)}55%{transform:translateX(364%)}100%{transform:translateX(-100%)}}
.title h2{
  font-size:clamp(19px,2.1vw,30px);font-weight:700;letter-spacing:4px;white-space:nowrap;
  background:linear-gradient(180deg,#ffffff,#8fd8ff 55%,#3ba6e0);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  text-shadow:0 0 34px rgba(56,189,248,.28);
}
.t-line{width:clamp(30px,7vw,110px);height:1px;background:linear-gradient(90deg,transparent,var(--line-2))}
.t-line.r{background:linear-gradient(90deg,var(--line-2),transparent)}

.meta{display:flex;align-items:center;justify-content:flex-end;gap:14px}
.clock{display:flex;flex-direction:column;align-items:flex-end;line-height:1.25}
.clock .t{font-size:20px;font-weight:600;letter-spacing:1.5px;font-variant-numeric:tabular-nums;color:#c8e9ff}
.clock .d{font-size:11px;color:var(--muted);letter-spacing:.6px}
.admin-btn{
  display:flex;align-items:center;gap:6px;height:34px;padding:0 12px;border-radius:9px;
  border:1px solid var(--line);color:#a9c6df;text-decoration:none;font-size:12px;
  background:rgba(15,30,50,.7);transition:.2s;
}
.admin-btn svg{width:15px;height:15px}
.admin-btn:hover{border-color:var(--line-2);color:#dff2ff;background:rgba(34,211,238,.12);box-shadow:0 0 18px rgba(34,211,238,.18)}

/* ---------- 主板 ---------- */
.board{
  position:relative;z-index:1;flex:1;min-height:0;
  display:grid;
  grid-template-columns:250px minmax(0,1fr) minmax(0,1fr) 286px;
  grid-template-rows:auto minmax(0,1.32fr) minmax(0,1.32fr) minmax(0,0.72fr);
  grid-template-areas:
    "kpis  kpis  kpis  kpis"
    "stock map   map   parts"
    "share map   map   recent"
    "trend trend trend trend";
  gap:12px;padding:8px 20px 10px;
}
.kpis{grid-area:kpis}
.p-stock{grid-area:stock}
.p-map{grid-area:map}
.p-parts{grid-area:parts}
.p-units{grid-area:share}
.p-trend{grid-area:trend}
.p-recent{grid-area:recent}

/* KPI（与面板同框架体系，通栏对齐下方面板边缘） */
.kpis{
  display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;
  width:100%;
}
.kpi{
  position:relative;display:flex;flex-direction:column;justify-content:center;gap:6px;
  padding:10px 16px 9px;border-radius:var(--r);
  background:linear-gradient(158deg,var(--panel-a),var(--panel-b));
  border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.045),0 14px 34px -22px rgba(0,0,0,.95);
  transition:border-color .25s,box-shadow .25s;
}
.kpi::before,.kpi::after{content:"";position:absolute;width:14px;height:14px;pointer-events:none;opacity:.7}
.kpi::before{left:-1px;top:-1px;border-left:2px solid var(--cyan);border-top:2px solid var(--cyan);border-top-left-radius:var(--r)}
.kpi::after{right:-1px;bottom:-1px;border-right:2px solid var(--cyan);border-bottom:2px solid var(--cyan);border-bottom-right-radius:var(--r)}
.kpi:hover{border-color:var(--line-2);box-shadow:inset 0 1px 0 rgba(255,255,255,.045),0 0 24px -6px rgba(34,211,238,.35)}
.kpi .k-top{display:flex;align-items:center;justify-content:space-between;gap:6px}
.kpi .k-label{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--muted);letter-spacing:.4px;white-space:nowrap}
.kpi .k-label::before{content:"";flex:0 0 3px;width:3px;height:10px;border-radius:2px;background:linear-gradient(180deg,var(--cyan),var(--blue));box-shadow:0 0 10px rgba(34,211,238,.7)}
.kpi .k-ico{width:20px;height:20px;border-radius:6px;display:grid;place-items:center;background:rgba(34,211,238,.1);color:var(--cyan);flex:0 0 20px}
.kpi .k-ico svg{width:12px;height:12px}
.kpi .k-val{
  display:flex;align-items:baseline;gap:4px;
  font-size:clamp(20px,1.85vw,27px);font-weight:700;letter-spacing:.3px;line-height:1;
  font-variant-numeric:tabular-nums;color:#dcf0ff;
  text-shadow:0 0 16px rgba(34,211,238,.24);
}
.kpi .k-val small{font-size:10.5px;font-weight:400;color:var(--muted-2);letter-spacing:0}
.kpi.amber .k-ico{background:rgba(251,191,36,.12);color:var(--amber)}
.kpi.amber .k-label::before{background:linear-gradient(180deg,var(--amber),#f97316);box-shadow:0 0 10px rgba(251,191,36,.6)}
.kpi.amber::before{border-color:var(--amber)}
.kpi.amber::after{border-color:var(--amber)}
.kpi.green .k-ico{background:rgba(52,211,153,.12);color:var(--green)}
.kpi.green .k-label::before{background:linear-gradient(180deg,var(--green),#0ea5e9);box-shadow:0 0 10px rgba(52,211,153,.6)}
.kpi.green::before{border-color:var(--green)}
.kpi.green::after{border-color:var(--green)}

/* 面板 */
.panel{
  position:relative;display:flex;flex-direction:column;min-height:0;overflow:hidden;
  border-radius:var(--r);border:1px solid var(--line);
  background-image:
    linear-gradient(90deg,rgba(34,211,238,.7),rgba(34,211,238,.18) 38%,transparent 72%),
    linear-gradient(158deg,var(--panel-a),var(--panel-b));
  background-size:100% 1px,100% 100%;
  background-repeat:no-repeat;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.045),0 14px 34px -22px rgba(0,0,0,.95);
}
.panel::before,.panel::after{content:"";position:absolute;width:20px;height:20px;pointer-events:none;opacity:.85;z-index:2}
.panel::before{
  left:-1px;top:-1px;border-left:2px solid var(--cyan);border-top:2px solid var(--cyan);
  border-top-left-radius:var(--r);box-shadow:-1px -1px 12px -4px rgba(34,211,238,.7);
}
.panel::after{
  right:-1px;bottom:-1px;border-right:2px solid var(--cyan);border-bottom:2px solid var(--cyan);
  border-bottom-right-radius:var(--r);box-shadow:1px 1px 12px -4px rgba(34,211,238,.7);
}
.panel > .p-head > h3 > i{box-shadow:0 0 12px rgba(34,211,238,.85)}
.span2{grid-column:span 2}

.p-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px 7px}
.p-head h3{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:600;letter-spacing:.8px;color:#d6ebff;min-width:0}
.p-code{
  font-size:9px;letter-spacing:1px;color:#7fd8ff;font-variant-numeric:tabular-nums;
  margin-left:2px;padding:1px 4px;border-radius:3px;
  border:1px solid rgba(34,211,238,.28);background:rgba(34,211,238,.08);
}
.p-sub{font-size:9px;letter-spacing:2.2px;color:rgba(91,117,144,.8);white-space:nowrap}
.hud-chip{
  font-size:10px;letter-spacing:.6px;color:#9ec6e8;white-space:nowrap;
  border:1px solid rgba(56,189,248,.22);border-radius:20px;padding:2px 9px;background:rgba(34,211,238,.06);
}
.hud-chip b{color:#5cf0ff;font-weight:700;font-variant-numeric:tabular-nums}
.hud-chip.dim{color:#5b7590;border-color:rgba(56,189,248,.12);background:transparent}
.map-tools{display:flex;align-items:center;gap:7px;flex:0 0 auto}
.map-reset{
  height:23px;padding:0 10px;border-radius:20px;cursor:pointer;font-family:inherit;
  font-size:10px;letter-spacing:.8px;color:#9ec6e8;
  border:1px solid rgba(56,189,248,.22);background:rgba(34,211,238,.05);transition:.2s;
}
.map-reset:hover{color:#eaf7ff;border-color:rgba(34,211,238,.5);background:rgba(34,211,238,.16);box-shadow:0 0 16px rgba(34,211,238,.25)}
.p-head h3 i{width:3px;height:13px;border-radius:2px;background:linear-gradient(180deg,var(--cyan),var(--blue));box-shadow:0 0 10px rgba(34,211,238,.7)}
.p-tag{font-size:11px;color:var(--muted);border:1px solid var(--line);border-radius:20px;padding:2px 9px;letter-spacing:.5px}
.p-tag.warn{color:var(--amber);border-color:rgba(251,191,36,.28);background:rgba(251,191,36,.07)}
.legend{display:flex;gap:12px;font-size:11px;color:var(--muted)}
.lg{display:flex;align-items:center;gap:5px}
.lg::before{content:"";width:9px;height:3px;border-radius:2px}
.lg.amount::before{background:linear-gradient(90deg,#22d3ee,#3b82f6);height:8px;width:6px;border-radius:2px}
.lg.count::before{background:var(--amber)}
.live{display:flex;align-items:center;gap:5px;font-size:10px;letter-spacing:1.5px;color:var(--green)}
.live b{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 8px var(--green);animation:pulse 1.8s infinite}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.75)}}

.p-body{flex:1;min-height:0;padding:0 12px 10px;position:relative;overflow:hidden}
.p-stock .p-body{overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(56,189,248,.25) transparent}
.skeleton{position:absolute;inset:8px 12px 12px;border-radius:8px;background:linear-gradient(100deg,rgba(255,255,255,.03) 30%,rgba(34,211,238,.08) 50%,rgba(255,255,255,.03) 70%);background-size:220% 100%;animation:shim 1.5s infinite}
@keyframes shim{0%{background-position:120% 0}100%{background-position:-40% 0}}

.chart-svg{width:100%;height:100%;display:block;overflow:visible}
.chart-svg text{font-family:inherit}

/* 配件排行 */
.rank{display:flex;flex-direction:column;justify-content:space-between;height:100%;gap:0;overflow:hidden}
.rank-row{display:grid;grid-template-columns:16px 1fr auto;align-items:center;gap:7px;padding:1px 0}
.rank-row .idx{font-size:10px;font-weight:700;color:var(--muted-2);text-align:center;font-variant-numeric:tabular-nums}
.rank-row .idx.top{color:var(--cyan)}
.rank-mid{min-width:0}
.rank-name{display:flex;justify-content:space-between;font-size:11px;color:#cfe4f7;gap:6px;line-height:1.3}
.rank-name em{font-style:normal;color:var(--muted-2);font-size:9.5px;flex:0 0 auto}
.rank-bar{height:4px;border-radius:3px;background:rgba(255,255,255,.055);margin-top:2px;overflow:hidden}
.rank-bar i{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,#22d3ee,#3b82f6);box-shadow:0 0 10px rgba(34,211,238,.45)}
.rank-row:nth-child(1) .rank-bar i{background:linear-gradient(90deg,#5cf0ff,#22d3ee)}
.rank-row:nth-child(2) .rank-bar i{background:linear-gradient(90deg,#4ade80,#22d3ee)}
.rank-row:nth-child(3) .rank-bar i{background:linear-gradient(90deg,#fbbf24,#f97316)}
.rank-val{font-size:11px;color:#a9c6df;font-variant-numeric:tabular-nums;min-width:38px;text-align:right}

/* 单位占比 */
.donut-wrap{display:flex;align-items:center;gap:12px;height:100%}
.donut{position:relative;flex:0 0 132px;width:132px;height:132px}
.donut svg{width:100%;height:100%;transform:rotate(-90deg)}
.donut-c{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1.2}
.donut-c b{font-size:15px;font-weight:700;color:#eaf7ff;font-variant-numeric:tabular-nums}
.donut-c span{font-size:10px;color:var(--muted);letter-spacing:.5px;margin-top:2px}
.dl{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.dl-row{display:flex;align-items:center;gap:6px;font-size:11.5px;min-width:0}
.dl-dot{width:7px;height:7px;border-radius:2px;flex:0 0 7px}
.dl-name{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#c3daf0}
.dl-pct{color:var(--muted);font-variant-numeric:tabular-nums;font-size:10.5px}

/* 库存预警 */
.stock-list{height:100%;display:flex;flex-direction:column;justify-content:space-between;gap:2px}
.st-row{display:grid;grid-template-columns:1fr auto;gap:6px;align-items:center;padding:3px 0;border-bottom:1px dashed rgba(56,189,248,.09)}
.st-row:last-child{border-bottom:none}
.st-n{font-size:11.5px;color:#cfe4f7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.st-n em{font-style:normal;display:block;font-size:10px;color:var(--muted-2);margin-top:1px}
.st-v{text-align:right;font-size:12.5px;font-variant-numeric:tabular-nums;color:#dff2ff;font-weight:600}
.st-v.low{color:var(--red)}
.st-v.mid{color:var(--amber)}

/* 最近动态 */
.recent{height:100%;display:flex;flex-direction:column;justify-content:space-between;gap:1px}
.rc{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:center;padding:4px 0;border-bottom:1px dashed rgba(56,189,248,.09)}
.rc:last-child{border-bottom:none}
.rc-t{font-size:10px;color:var(--muted-2);font-variant-numeric:tabular-nums;flex:0 0 auto}
.rc-m{min-width:0}
.rc-p{font-size:11.5px;color:#dff2ff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rc-u{font-size:10px;color:var(--muted-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.rc-a{font-size:11.5px;font-weight:600;color:var(--cyan);font-variant-numeric:tabular-nums;white-space:nowrap}

/* 无缝循环滚动列表（库存预警 / 配件消耗 / 最近动态）：内容超面板时复制两份匀速上滚 */
.loop-wrap{height:100%;overflow:hidden}
.loop-wrap.on{position:relative}
.loop-wrap.on::before,.loop-wrap.on::after{
  content:"";position:absolute;left:0;right:0;height:16px;z-index:2;pointer-events:none;
}
.loop-wrap.on::before{top:0;background:linear-gradient(rgba(10,22,40,.95),transparent)}
.loop-wrap.on::after{bottom:0;background:linear-gradient(transparent,rgba(10,22,40,.95))}
.loop-track{display:flex;flex-direction:column;min-height:0}
.loop-wrap.on .loop-track{animation:loopUp var(--loop-dur,24s) linear infinite}
.loop-wrap.on:hover .loop-track{animation-play-state:paused}
@keyframes loopUp{from{transform:translateY(0)}to{transform:translateY(-50%)}}
.loop-wrap.on .stock-list,.loop-wrap.on .rank,.loop-wrap.on .recent{height:auto;justify-content:flex-start}
.loop-wrap.on .st-row{padding:6px 0}
.loop-wrap.on .rc{padding:6px 0}
.loop-wrap.on .rank-row{padding:4px 0}
.empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--muted-2);font-size:12px;letter-spacing:1px}

/* ---------- 中央态势图 ---------- */
.p-map .p-body{padding:0 10px 10px}
.map-stage{
  position:relative;height:100%;min-height:0;border-radius:10px;overflow:hidden;
  border:1px solid rgba(56,189,248,.16);
  background:
    radial-gradient(130% 100% at 50% 44%,rgba(16,46,74,.85),rgba(4,10,20,.97) 74%);
  box-shadow:inset 0 0 70px rgba(6,28,50,.9),inset 0 1px 0 rgba(255,255,255,.045);
  cursor:grab;
  touch-action:none;   /* 触屏/触摸屏上禁用浏览器手势，拖动只给地图 */
}
.map-stage:active{cursor:grabbing}
.map-stage::before,.map-stage::after{
  content:"";position:absolute;width:16px;height:16px;pointer-events:none;z-index:3;
  border-color:rgba(34,211,238,.55);
}
.map-stage::before{left:6px;top:6px;border-left:1.5px solid;border-top:1.5px solid}
.map-stage::after{right:6px;bottom:6px;border-right:1.5px solid;border-bottom:1.5px solid}

/* 本地高德瓦片层（限定钦州市；深色滤镜已烘焙进 PNG，运行时零滤镜开销） */
.map-tiles{
  position:absolute;inset:0;z-index:1;overflow:hidden;background:#0a1524;
}
.map-tiles .mt-tile{
  position:absolute;left:0;top:0;width:256px;height:256px;
  will-change:transform;user-select:none;-webkit-user-drag:none;pointer-events:none;
}
/* 静态图片底图模式：canvas 逐帧重绘（软件渲染下合成层平移不重绘，canvas 最稳） */
.map-tiles .map-img{
  position:absolute;left:0;top:0;width:100%;height:100%;
  user-select:none;pointer-events:none;
}
/* 三维球体模式：WebGL 画布接管底图与节点，隐藏平面图层 */
.map-globe{
  position:absolute;inset:0;z-index:1;width:100%;height:100%;display:none;
  user-select:none;pointer-events:none;
}
.map-stage.globe-on .map-globe{display:block}
.map-stage.globe-on .map-tiles,
.map-stage.globe-on .map-svg,
.map-stage.globe-on .map-scale,
.map-stage.globe-on .map-compass{display:none}
.map-tint{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,rgba(7,18,34,.5),rgba(7,18,34,.14) 42%,rgba(7,18,34,.55));
  box-shadow:inset 0 0 90px rgba(4,14,28,.75);
}
.map-fail{
  position:absolute;left:50%;bottom:52px;transform:translateX(-50%);z-index:4;
  max-width:82%;padding:7px 14px;border-radius:8px;display:none;
  background:rgba(120,32,32,.9);border:1px solid rgba(255,120,120,.4);
  color:#ffd9d9;font-size:11px;letter-spacing:.4px;line-height:1.6;text-align:center;
}
.map-fail.on{display:block}
/* 拖动地图期间暂停全页动画，把每帧合成时间让给平移 */
body.panning *{animation-play-state:paused !important}
.map-zoom{
  position:absolute;right:12px;top:64px;z-index:4;display:flex;flex-direction:column;gap:1px;
  border:1px solid rgba(56,189,248,.28);border-radius:7px;overflow:hidden;
  background:rgba(6,22,38,.82);
}
.map-zoom button{
  width:26px;height:26px;border:0;background:transparent;color:#9fdcff;
  font-size:15px;line-height:1;cursor:pointer;font-family:inherit;
}
.map-zoom button:hover{background:rgba(34,211,238,.16);color:#eaf7ff}

.map-svg{position:absolute;inset:0;width:100%;height:100%;display:block;z-index:2;overflow:visible}
.map-svg .mnode{cursor:pointer}
.map-svg .mnode .tick{stroke:rgba(34,211,238,.55);stroke-width:1.2;stroke-linecap:round;pointer-events:none}
.map-svg .mnode.a .tick{stroke:rgba(52,211,153,.6)}
.map-svg .mnode.c .tick{stroke:rgba(100,116,139,.45)}
.map-svg .mnode .hit{fill:transparent}
.map-svg .mnode .halo{fill:rgba(34,211,238,.09);transform-box:fill-box;transform-origin:center;transition:transform .22s,fill .22s}
.map-svg .mnode .ring{fill:none;stroke:rgba(34,211,238,.55);stroke-width:1.1;transform-box:fill-box;transform-origin:center}
.map-svg .mnode .core{transform-box:fill-box;transform-origin:center}
.map-svg .mnode .lbl{
  font-size:11.5px;fill:#c8e2f6;letter-spacing:.3px;pointer-events:none;font-weight:500;
  paint-order:stroke;stroke:rgba(3,11,21,.92);stroke-width:3.2px;stroke-linejoin:round;
}
.map-svg .mnode:hover .halo{transform:scale(1.3)}
.map-svg .mnode:hover .lbl{fill:#eaf7ff}
.map-svg .mnode .ping{fill:none;stroke:rgba(52,211,153,.7);stroke-width:1;transform-box:fill-box;transform-origin:center;animation:ping 2.6s ease-out infinite}
@keyframes ping{0%{transform:scale(.6);opacity:.85}80%{transform:scale(2.1);opacity:0}100%{opacity:0}}
.map-svg .mnode.a .core{fill:#34d399}
.map-svg .mnode.a .ring{stroke:rgba(52,211,153,.6)}
.map-svg .mnode.a .halo{fill:rgba(52,211,153,.1)}
.map-svg .mnode.c .core{fill:#64748b}
.map-svg .mnode.c .ring{stroke:rgba(100,116,139,.5)}
.map-svg .mnode.c .halo{fill:rgba(100,116,139,.09)}
.map-svg .mnode.c .lbl{fill:#7f93a8}
.map-svg .mnode.on .halo{transform:scale(1.45);fill:rgba(34,211,238,.18)}
.map-svg .mnode.on .ring{stroke:#8ff4ff;stroke-width:1.6}
.map-svg .mnode.on .lbl{fill:#ffffff}
.map-svg .mnode.on .core{filter:drop-shadow(0 0 10px rgba(34,211,238,1))}

.map-legend{
  position:absolute;right:12px;bottom:9px;z-index:3;display:flex;gap:11px;
  font-size:9.5px;color:rgba(127,156,187,.9);letter-spacing:.3px;pointer-events:none;
}
.map-attr{
  position:absolute;right:12px;bottom:26px;z-index:3;pointer-events:none;
  font-size:8.5px;color:rgba(127,156,187,.6);letter-spacing:.4px;
}
.map-legend .ml{display:flex;align-items:center;gap:4px}
.map-legend .ml i{width:6px;height:6px;border-radius:50%}
.map-legend .ml i.a{background:#34d399;box-shadow:0 0 7px #34d399}
.map-legend .ml i.b{background:#22d3ee;box-shadow:0 0 7px #22d3ee}
.map-legend .ml i.c{background:#64748b}

/* 地图 HUD：坐标读数 / 指北针 / 比例尺 */
.map-hud{
  position:absolute;left:12px;top:12px;z-index:3;pointer-events:none;
  display:flex;flex-direction:column;gap:2px;padding:6px 12px 6px 9px;
  border-left:2px solid rgba(34,211,238,.55);
  background:linear-gradient(90deg,rgba(6,22,38,.72),rgba(6,22,38,0));
}
.map-hud .mh-row{display:flex;align-items:baseline;gap:8px;font-size:9.5px;letter-spacing:.5px;line-height:1.5}
.map-hud em{font-style:normal;color:rgba(91,117,144,.95);flex:0 0 26px}
.map-hud b{color:#9fdcff;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.3px}
.map-compass{
  position:absolute;right:14px;top:14px;z-index:3;width:42px;height:42px;pointer-events:none;
  border:1px solid rgba(56,189,248,.22);border-radius:50%;
  background:radial-gradient(circle,rgba(34,211,238,.12),transparent 72%);
  display:grid;place-items:center;
}
.map-compass b{position:absolute;top:-1px;left:50%;transform:translateX(-50%);font-size:8.5px;color:#8fd8ff;font-weight:700;letter-spacing:.5px}
.map-compass i{position:relative;width:1px;height:24px;background:linear-gradient(180deg,#5cf0ff,rgba(92,240,255,.12))}
.map-compass i::before{
  content:"";position:absolute;left:50%;top:-1px;transform:translateX(-50%);
  border:4px solid transparent;border-bottom:6px solid #5cf0ff;
}
.map-compass span{position:absolute;right:-2px;top:50%;transform:translateY(-50%);font-size:8px;color:rgba(91,117,144,.85)}
.map-scale{
  position:absolute;left:14px;bottom:10px;z-index:3;pointer-events:none;
  display:flex;align-items:center;gap:7px;font-size:9.5px;color:rgba(127,156,187,.9);letter-spacing:.4px;
}
.map-scale i{
  display:block;width:58px;height:6px;
  border-left:1px solid rgba(34,211,238,.65);border-right:1px solid rgba(34,211,238,.65);
  border-bottom:1px solid rgba(34,211,238,.65);
  background:linear-gradient(90deg,rgba(34,211,238,.3) 50%,transparent 50%);
}
.map-hint{
  position:absolute;left:50%;bottom:34px;transform:translateX(-50%);z-index:3;
  font-size:10px;color:rgba(127,156,187,.72);letter-spacing:.6px;pointer-events:none;
  white-space:nowrap;transition:opacity .2s;
}
body.pop-open .map-hint{opacity:0}

/* 节点弹窗 */
.map-pop{
  position:absolute;z-index:6;width:306px;max-width:calc(100% - 16px);
  max-height:calc(100% - 16px);
  display:flex;flex-direction:column;overflow:hidden;
  border-radius:12px;border:1px solid rgba(56,189,248,.34);
  background:linear-gradient(160deg,rgba(13,30,52,.985),rgba(4,11,22,.99));
  box-shadow:0 26px 54px -18px rgba(0,0,0,.95),0 0 30px -12px rgba(34,211,238,.4);
  animation:popIn .16s ease-out;
}
@keyframes popIn{from{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:none}}
.map-pop::before,.map-pop::after{content:"";position:absolute;width:12px;height:12px;border-color:var(--cyan)}
.map-pop::before{left:-1px;top:-1px;border-left:2px solid;border-top:2px solid;border-top-left-radius:12px}
.map-pop::after{right:-1px;bottom:-1px;border-right:2px solid;border-bottom:2px solid;border-bottom-right-radius:12px}
.mp-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;padding:11px 12px 9px;border-bottom:1px solid rgba(56,189,248,.16)}
.mp-head h4{font-size:14px;font-weight:700;letter-spacing:.6px;color:#eaf7ff}
.mp-head p{font-size:10.5px;color:var(--muted);margin-top:3px;line-height:1.45}
.mp-x{
  flex:0 0 22px;width:22px;height:22px;border-radius:6px;cursor:pointer;font-family:inherit;
  border:1px solid var(--line);background:rgba(255,255,255,.03);color:#9ec6e8;font-size:14px;line-height:1;
  display:grid;place-items:center;transition:.18s;
}
.mp-x:hover{color:#fff;border-color:var(--line-2);background:rgba(34,211,238,.16)}
.mp-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:rgba(56,189,248,.14);margin:9px 12px 0;border-radius:8px;overflow:hidden}
.mp-stats .ms{background:rgba(8,20,36,.92);padding:7px 6px;text-align:center}
.mp-stats .ms b{display:block;font-size:13.5px;color:#5cf0ff;font-variant-numeric:tabular-nums;letter-spacing:.3px}
.mp-stats .ms span{display:block;font-size:9.5px;color:var(--muted-2);margin-top:2px;letter-spacing:.3px}
.mp-list{padding:8px 12px 2px;flex:1;min-height:0;max-height:none;overflow-y:auto}
.mp-list::-webkit-scrollbar{width:4px}
.mp-list::-webkit-scrollbar-thumb{background:rgba(56,189,248,.28);border-radius:3px}
.mp-row{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:center;padding:5px 0;border-bottom:1px dashed rgba(56,189,248,.1)}
.mp-row:last-child{border-bottom:none}
.mp-row .t{font-size:9.5px;color:var(--muted-2);font-variant-numeric:tabular-nums;white-space:nowrap}
.mp-row .p{font-size:11.5px;color:#dff2ff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mp-row .p em{font-style:normal;color:var(--muted);font-size:10px}
.mp-row .a{font-size:11px;color:var(--cyan);font-variant-numeric:tabular-nums;white-space:nowrap}
.mp-empty{padding:18px 0;text-align:center;font-size:11px;color:var(--muted-2);letter-spacing:.5px}
.mp-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 12px 11px;border-top:1px solid rgba(56,189,248,.12);margin-top:4px}
.mp-foot span{font-size:9.5px;color:var(--muted-2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mp-go{
  flex:0 0 auto;height:27px;padding:0 12px;border:none;border-radius:7px;cursor:pointer;font-family:inherit;
  font-size:11px;font-weight:700;letter-spacing:.8px;color:#03121c;
  background:linear-gradient(135deg,#6ff2ff,#22d3ee 50%,#3b82f6);
  box-shadow:0 6px 16px -8px rgba(34,211,238,.9);transition:.2s;
}
.mp-go:hover{transform:translateY(-1px);box-shadow:0 10px 20px -8px rgba(34,211,238,1)}
.mp-loading{padding:22px 0;text-align:center;font-size:11px;color:var(--muted-2);letter-spacing:1px}

/* ---------- 底栏 ---------- */
.footbar{
  position:relative;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:0 22px 9px;font-size:11px;color:var(--muted-2);letter-spacing:.3px;
}
.foot-left{display:flex;align-items:center;gap:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dot{opacity:.5}
.notice{flex:1;min-width:0;display:flex;align-items:center;gap:8px;overflow:hidden}
.n-label{
  flex:0 0 auto;font-size:10px;letter-spacing:1px;color:var(--amber);
  border:1px solid rgba(251,191,36,.3);background:rgba(251,191,36,.08);border-radius:4px;padding:1px 6px;
}
.n-track{flex:1;overflow:hidden;position:relative;height:16px}
.n-track p{position:absolute;white-space:nowrap;font-size:11px;color:#9fbcd6;animation:marquee 26s linear infinite;padding-left:100%}
@keyframes marquee{0%{transform:translateX(0)}100%{transform:translateX(-100%)}}
.foot-right{white-space:nowrap;color:var(--muted-2)}
.foot-right span::before{content:"更新 ";opacity:.6}

/* ---------- 悬浮球 ---------- */
.fab{
  position:fixed;right:22px;bottom:22px;z-index:60;
  width:66px;height:66px;border-radius:50%;border:none;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  color:#03121c;
  background:linear-gradient(145deg,#6ff2ff,#22d3ee 45%,#3b82f6);
  box-shadow:0 10px 30px -8px rgba(34,211,238,.7),inset 0 1px 0 rgba(255,255,255,.55);
  transition:transform .25s cubic-bezier(.2,.9,.3,1.3),box-shadow .25s;
  font-family:inherit;
}
.fab svg{width:22px;height:22px}
.fab em{font-style:normal;font-size:10px;font-weight:700;letter-spacing:1px}
.fab:hover{transform:translateY(-3px) scale(1.04);box-shadow:0 16px 36px -8px rgba(34,211,238,.85)}
.fab:active{transform:scale(.96)}
.fab-pulse{position:absolute;inset:0;border-radius:50%;border:1px solid rgba(34,211,238,.65);animation:ring 2.4s ease-out infinite}
@keyframes ring{0%{transform:scale(1);opacity:.85}70%{transform:scale(1.55);opacity:0}100%{opacity:0}}
body.drawer-open .fab{transform:scale(.9);opacity:.9}

/* ---------- 抽屉 ---------- */
.sheet-mask{position:fixed;inset:0;z-index:55;background:rgba(2,7,14,.55);backdrop-filter:blur(3px);opacity:0;visibility:hidden;transition:.28s}
body.drawer-open .sheet-mask{opacity:1;visibility:visible}

.drawer{
  position:fixed;right:22px;bottom:100px;z-index:58;width:392px;max-width:calc(100vw - 44px);
  max-height:calc(100dvh - 130px);
  display:flex;flex-direction:column;
  border-radius:16px;border:1px solid rgba(56,189,248,.28);
  background:linear-gradient(160deg,rgba(16,32,54,.985),rgba(6,14,26,.99));
  box-shadow:0 30px 70px -20px rgba(0,0,0,.9),0 0 0 1px rgba(34,211,238,.06),inset 0 1px 0 rgba(255,255,255,.06);
  opacity:0;visibility:hidden;transform:translateY(14px) scale(.97);transform-origin:100% 100%;
  transition:opacity .26s,transform .3s cubic-bezier(.2,.8,.3,1.15),visibility .3s;
}
body.drawer-open .drawer{opacity:1;visibility:visible;transform:none}
.drawer-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:15px 16px 12px;border-bottom:1px solid rgba(56,189,248,.14)}
.drawer-head h3{font-size:15px;font-weight:700;letter-spacing:1px;color:#eaf7ff}
.drawer-head p{font-size:11px;color:var(--muted);margin-top:4px;letter-spacing:.3px}
.drawer-x{flex:0 0 28px;width:28px;height:28px;border-radius:8px;border:1px solid var(--line);background:rgba(255,255,255,.03);color:#a9c6df;cursor:pointer;display:grid;place-items:center;transition:.2s}
.drawer-x svg{width:14px;height:14px}
.drawer-x:hover{color:#fff;border-color:var(--line-2);background:rgba(34,211,238,.14)}
.drawer-body{padding:13px 16px 16px;overflow-y:auto;overscroll-behavior:contain}
.drawer-body::-webkit-scrollbar{width:5px}
.drawer-body::-webkit-scrollbar-thumb{background:rgba(56,189,248,.25);border-radius:3px}

.field{position:relative;margin-bottom:11px}
.field label{display:flex;align-items:center;gap:7px;font-size:11.5px;color:#a9c6df;letter-spacing:.5px;margin-bottom:5px}
.field label b{color:var(--red);font-weight:400}
.auto-tag{font-size:9.5px;color:var(--cyan);border:1px solid rgba(34,211,238,.3);background:rgba(34,211,238,.09);border-radius:3px;padding:0 4px;letter-spacing:.5px}
.inp-wrap{position:relative;display:flex;align-items:center}
.inp-ico{position:absolute;left:10px;width:15px;height:15px;color:#5f7d99;pointer-events:none}
.field input{
  width:100%;height:38px;border-radius:9px;border:1px solid rgba(56,189,248,.18);
  background:rgba(6,14,26,.9);color:#eaf7ff;font-size:13px;font-family:inherit;
  padding:0 11px 0 32px;outline:none;transition:.2s;
}
.field input::placeholder{color:#4f6a84;font-size:12px}
.field input:focus{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 3px rgba(34,211,238,.12);background:rgba(9,20,36,.95)}
.field input.calc{padding-left:11px;color:var(--cyan);font-variant-numeric:tabular-nums;letter-spacing:.5px}
.field input.calc.strong{font-size:16px;font-weight:700;color:#5cf0ff;background:rgba(34,211,238,.06);border-color:rgba(34,211,238,.3)}
.field input[readonly]{cursor:default}
.picked{position:absolute;right:8px;max-width:52%;font-size:10px;color:var(--green);background:rgba(52,211,153,.1);border:1px solid rgba(52,211,153,.25);border-radius:4px;padding:1px 5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}
.picked:empty{display:none}
.picked.warn{color:var(--red);background:rgba(251,113,133,.1);border-color:rgba(251,113,133,.3)}

.row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.qty-wrap{padding-left:0}
.qty-wrap input{padding:0 6px;text-align:center;font-size:15px;font-weight:600;color:#eaf7ff;font-variant-numeric:tabular-nums}
.qty-wrap .step{
  flex:0 0 34px;width:34px;height:38px;border:1px solid rgba(56,189,248,.18);
  background:rgba(34,211,238,.08);color:var(--cyan);font-size:16px;line-height:1;cursor:pointer;
  transition:.18s;font-family:inherit;
}
.qty-wrap .step:first-child{border-radius:9px 0 0 9px}
.qty-wrap .step:last-child{border-radius:0 9px 9px 0}
.qty-wrap .step:hover{background:rgba(34,211,238,.2);color:#fff}
.qty-wrap input{border-radius:0;border-left:none;border-right:none}

.sug{
  position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;
  max-height:206px;overflow-y:auto;border-radius:10px;
  border:1px solid rgba(56,189,248,.28);background:rgba(9,20,36,.99);
  box-shadow:0 18px 40px -14px rgba(0,0,0,.9);
}
.sug::-webkit-scrollbar{width:5px}
.sug::-webkit-scrollbar-thumb{background:rgba(56,189,248,.28);border-radius:3px}
.sug-item{padding:8px 11px;cursor:pointer;border-bottom:1px solid rgba(56,189,248,.07);transition:.14s}
.sug-item:last-child{border-bottom:none}
.sug-item:hover,.sug-item.active{background:rgba(34,211,238,.13)}
.sug-item .s1{font-size:12.5px;color:#e6f4ff;display:flex;justify-content:space-between;gap:8px}
.sug-item .s1 span{color:var(--cyan);font-size:11px;flex:0 0 auto;font-variant-numeric:tabular-nums}
.sug-item .s2{font-size:10.5px;color:var(--muted-2);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sug-empty{padding:12px;text-align:center;font-size:11.5px;color:var(--muted-2)}

.stock-hint{
  font-size:11px;color:var(--muted);background:rgba(56,189,248,.05);border:1px dashed rgba(56,189,248,.18);
  border-radius:8px;padding:7px 10px;margin:2px 0 12px;line-height:1.5;
}
.stock-hint b{color:#cfe4f7;font-weight:600}
.stock-hint.low{color:#ffc4cc;background:rgba(251,113,133,.07);border-color:rgba(251,113,133,.3)}
.submit{
  width:100%;height:44px;border:none;border-radius:10px;cursor:pointer;
  font-family:inherit;font-size:14px;font-weight:700;letter-spacing:1.5px;color:#03121c;
  background:linear-gradient(135deg,#6ff2ff,#22d3ee 40%,#3b82f6);
  box-shadow:0 10px 24px -10px rgba(34,211,238,.8);
  transition:.2s;
}
.submit:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 14px 28px -10px rgba(34,211,238,.95)}
.submit:disabled{opacity:.4;cursor:not-allowed;box-shadow:none;filter:grayscale(.3)}
.tip{font-size:10.5px;color:var(--muted-2);text-align:center;margin-top:9px;line-height:1.5}

.drawer-body.done{display:flex;flex-direction:column;align-items:center;padding:26px 18px 20px}
.done-ico{width:60px;height:60px;border-radius:50%;display:grid;place-items:center;color:#03121c;background:linear-gradient(145deg,#6ff2ff,#22d3ee);box-shadow:0 0 34px rgba(34,211,238,.6);animation:pop .45s cubic-bezier(.2,.9,.3,1.4)}
.done-ico svg{width:30px;height:30px}
@keyframes pop{0%{transform:scale(.4);opacity:0}100%{transform:scale(1);opacity:1}}
.drawer-body.done h4{font-size:16px;margin:14px 0 4px;letter-spacing:1.5px;color:#eaf7ff}
.done-card{width:100%;margin:14px 0 18px;border:1px solid rgba(56,189,248,.18);border-radius:10px;background:rgba(34,211,238,.05);padding:11px 13px}
.done-card .dc-row{display:flex;justify-content:space-between;gap:10px;font-size:12px;padding:4px 0;color:#b9d3e8}
.done-card .dc-row b{color:#eaf7ff;font-weight:600;text-align:right}
.done-card .dc-row.hl b{color:#5cf0ff;font-size:15px}
.done-actions{display:flex;gap:10px;width:100%}
.done-actions button{flex:1;height:40px;border-radius:9px;font-family:inherit;font-size:13px;cursor:pointer;letter-spacing:1px;transition:.2s}
.done-actions .ghost{background:transparent;border:1px solid rgba(56,189,248,.25);color:#a9c6df}
.done-actions .ghost:hover{background:rgba(34,211,238,.1);color:#fff}
.done-actions .primary{border:none;color:#03121c;font-weight:700;background:linear-gradient(135deg,#6ff2ff,#22d3ee 45%,#3b82f6);box-shadow:0 8px 20px -10px rgba(34,211,238,.8)}

.toast{
  position:fixed;left:50%;bottom:110px;transform:translate(-50%,14px);z-index:80;
  padding:10px 18px;border-radius:10px;font-size:12.5px;letter-spacing:.5px;
  background:rgba(10,22,38,.97);border:1px solid rgba(56,189,248,.3);color:#e6f4ff;
  box-shadow:0 18px 40px -14px rgba(0,0,0,.9);opacity:0;visibility:hidden;transition:.25s;max-width:86vw;text-align:center;
}
.toast.show{opacity:1;visibility:visible;transform:translate(-50%,0)}
.toast.err{border-color:rgba(251,113,133,.45);color:#ffd7dd}

@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
}

/* ---------- 响应式 ---------- */
@media (max-width:1560px){
  .board{grid-template-columns:238px minmax(0,1fr) minmax(0,1fr) 274px;gap:12px;padding:8px 16px 10px}
  .kpis{grid-template-columns:repeat(3,minmax(0,1fr))}
  .kpi .k-val{font-size:23px}
  .map-pop{width:286px}
}
@media (max-width:1280px){
  body{height:auto}
  /* 平板/手机：面板定高，列表内容超出即触发无缝循环滚动 */
  .p-stock,.p-parts,.p-recent{height:280px}
  .board{
    flex:0 0 auto;
    grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    grid-template-rows:auto minmax(380px,1.5fr) minmax(260px,1fr) minmax(240px,1fr) minmax(240px,1fr);
    grid-template-areas:
      "kpis  kpis"
      "map   map"
      "trend trend"
      "stock parts"
      "share recent";
  }
  .hud-beam{margin:4px 16px 0}
}
@media (max-width:1080px){
  .topbar{grid-template-columns:1fr auto;gap:10px;padding:12px 16px 8px}
  .title{display:none}
  .board{padding:6px 14px 10px}
  .sys-state{display:none}
}
@media (max-width:900px){
  body{height:auto;min-height:100dvh}
  .board{
    flex:0 0 auto;grid-template-columns:1fr;grid-template-rows:none;grid-auto-rows:auto;
    grid-template-areas:none;gap:12px;
  }
  .kpis,.p-stock,.p-map,.p-parts,.p-units,.p-trend,.p-recent{grid-area:auto}
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  .panel{min-height:236px}
  .p-map{min-height:392px}
  .p-trend{min-height:264px}
  .map-pop{width:auto;left:8px!important;right:8px;top:auto!important;bottom:8px}
  .mp-list{flex:0 1 auto;max-height:40dvh}
  .map-legend{display:none}
  .footbar{flex-direction:column;align-items:flex-start;gap:6px;padding:0 16px 88px}
  .foot-left{font-size:10px;flex-wrap:wrap}
  .notice{width:100%}
  .foot-right{display:none}
  .fab{width:58px;height:58px;right:16px;bottom:16px}
  .fab svg{width:19px;height:19px}
  .drawer{
    left:0;right:0;bottom:0;width:100%;max-width:100%;
    border-radius:18px 18px 0 0;max-height:88dvh;transform:translateY(100%);
  }
  body.drawer-open .drawer{transform:none}
  .toast{bottom:auto;top:16px}
  .clock .t{font-size:17px}
  .brand-txt p{display:none}
}
@media (max-width:520px){
  .kpis{grid-template-columns:1fr 1fr;gap:9px}
  .kpi{padding:10px 11px}
  .kpi .k-val{font-size:21px}
  .kpi .k-label{font-size:11px}
  .donut{flex-basis:112px;width:112px;height:112px}
  .row2{grid-template-columns:1fr 1fr;gap:8px}
  .p-map{min-height:360px}
  .p-sub{display:none}
}

/* ---------- 登录门禁（打开大屏前先登录） ---------- */
body.gate-body{display:flex;align-items:center;justify-content:center}
.gate{position:relative;z-index:2;width:100%;max-width:380px;padding:20px}
.gate-card{
  background:linear-gradient(160deg,rgba(13,28,50,.42),rgba(6,14,28,.32));
  border:1px solid rgba(255,255,255,.16);border-radius:16px;
  padding:34px 30px 26px;text-align:center;
  box-shadow:0 18px 60px rgba(2,8,20,.5);
  backdrop-filter:blur(14px) saturate(1.15);
  -webkit-backdrop-filter:blur(14px) saturate(1.15);
}
.gate-card::before{
  content:"";position:absolute;inset:8px;border:1px solid rgba(56,189,248,.08);
  border-radius:10px;pointer-events:none;
}
.gate-logo{
  width:56px;height:56px;margin:0 auto 14px;border-radius:14px;
  display:flex;align-items:center;justify-content:center;font-size:24px;font-weight:700;color:#06121f;
  background:linear-gradient(135deg,#5cf0ff,#2563eb);
  box-shadow:0 0 26px rgba(34,211,238,.45);
}
.gate-card h1{font-size:19px;letter-spacing:3px;color:#eaf7ff;text-shadow:0 2px 14px rgba(2,8,20,.65)}
.gate-sub{font-size:12px;color:var(--muted);margin:8px 0 20px;letter-spacing:1px}
.gate-field{text-align:left;margin-bottom:13px}
.gate-field label{display:block;font-size:11.5px;color:#a9c6df;letter-spacing:1px;margin-bottom:5px}
.gate-field .inp-wrap{position:relative;display:flex;align-items:center}
.gate-field svg{position:absolute;left:11px;width:15px;height:15px;color:#4f7fa8;pointer-events:none}
.gate-field input{
  width:100%;height:42px;padding:0 12px 0 33px;border-radius:10px;
  background:rgba(6,14,28,.5);border:1px solid rgba(255,255,255,.18);color:var(--txt);
  font-size:14px;outline:none;transition:.15s;
}
.gate-field input::placeholder{color:#4f6a84;font-size:12.5px}
.gate-field input:focus{border-color:rgba(34,211,238,.6);box-shadow:0 0 0 3px rgba(34,211,238,.12)}
.gate-btn{
  width:100%;height:44px;margin-top:6px;border:0;border-radius:10px;cursor:pointer;
  font-size:15px;font-weight:700;letter-spacing:4px;color:#06121f;
  background:linear-gradient(135deg,#5cf0ff,#3b82f6);
  box-shadow:0 8px 26px rgba(34,211,238,.3);transition:.15s;
}
.gate-btn:hover{filter:brightness(1.08)}
.gate-btn:disabled{opacity:.7;cursor:wait}
.gate-err{min-height:18px;margin-top:12px;font-size:12px;color:var(--red)}

/* ---------- 顶栏用户名 / 用户中心 ---------- */
.user-chip{
  display:flex;align-items:center;gap:8px;height:34px;padding:0 10px 0 4px;
  background:rgba(9,20,36,.7);border:1px solid var(--line);border-radius:20px;
  color:#cfe6f7;cursor:pointer;transition:.15s;font-family:inherit;
}
.user-chip:hover{border-color:var(--line-2);background:rgba(34,211,238,.1)}
.uc-avatar{
  width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700;color:#06121f;flex:none;
  background:linear-gradient(135deg,#5cf0ff,#3b82f6);
}
.uc-name{font-size:12.5px;letter-spacing:.5px;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.uc-caret{width:12px;height:12px;color:#5b8db5}
.uc-mask{position:fixed;inset:0;z-index:90;background:rgba(3,8,18,.45)}
.uc-pop{
  position:fixed;top:60px;right:16px;z-index:91;width:280px;
  background:linear-gradient(165deg,rgba(17,33,56,.97),rgba(9,19,36,.97));
  border:1px solid var(--line-2);border-radius:14px;overflow:hidden;
  box-shadow:0 22px 60px rgba(2,8,20,.65);
}
.ucp-head{display:flex;align-items:center;gap:12px;padding:16px 16px 13px;border-bottom:1px solid rgba(56,189,248,.14);background:rgba(34,211,238,.05)}
.uc-avatar.big{width:42px;height:42px;font-size:18px}
.ucp-id b{display:block;font-size:15px;color:#eaf7ff;letter-spacing:.5px}
.ucp-id span{font-size:11px;color:var(--cyan);letter-spacing:1px}
.ucp-body{padding:13px 16px 15px}
.ucp-title{font-size:11.5px;color:#a9c6df;letter-spacing:1.5px;margin-bottom:9px}
.ucp-field{margin-bottom:9px}
.ucp-field label{display:block;font-size:10.5px;color:#6d8cab;margin-bottom:4px;letter-spacing:.5px}
.ucp-field input{
  width:100%;height:34px;padding:0 10px;border-radius:8px;font-size:13px;
  background:rgba(9,20,36,.85);border:1px solid rgba(56,189,248,.2);color:var(--txt);outline:none;
}
.ucp-field input:focus{border-color:rgba(34,211,238,.55)}
.ucp-save{
  width:100%;height:34px;margin-top:2px;border:0;border-radius:8px;cursor:pointer;
  font-size:12.5px;font-weight:600;letter-spacing:1px;color:#06121f;
  background:linear-gradient(135deg,#5cf0ff,#3b82f6);
}
.ucp-save:disabled{opacity:.7}
.ucp-logout{
  width:100%;height:36px;margin-top:11px;border-radius:8px;cursor:pointer;
  font-size:13px;letter-spacing:2px;color:var(--red);
  background:rgba(251,113,133,.08);border:1px solid rgba(251,113,133,.35);
}
.ucp-logout:hover{background:rgba(251,113,133,.16)}

/* ---------- 登记抽屉：多配件行 ---------- */
.pline{
  position:relative;margin-bottom:12px;padding:10px 11px 11px;border-radius:12px;
  background:rgba(9,20,36,.55);border:1px solid rgba(56,189,248,.14);
}
.pl-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.pl-no{
  width:18px;height:18px;border-radius:6px;flex:none;
  display:flex;align-items:center;justify-content:center;
  font-size:10.5px;font-weight:700;color:#5cf0ff;
  background:rgba(34,211,238,.12);border:1px solid rgba(34,211,238,.3);
}
.pl-head label{flex:1;margin-bottom:0}
.pl-del{
  width:22px;height:22px;border-radius:7px;flex:none;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  color:#fb7185;background:rgba(251,113,133,.08);border:1px solid rgba(251,113,133,.3);
  transition:.12s;
}
.pl-del:hover{background:rgba(251,113,133,.18)}
.pl-del svg{width:11px;height:11px}
.pl-hint{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.5}
.pl-hint.low{color:#fda4af}
.pl-hint.new{color:#6ee7b7}
.sug-item.sug-new .s1 span{color:#34d399}
.pline .sug{left:0;right:0}
.pline .row2{margin-top:9px}
.add-part{
  width:100%;height:36px;margin-bottom:12px;border-radius:10px;cursor:pointer;
  font-size:12.5px;font-weight:600;letter-spacing:1px;color:#5cf0ff;
  background:rgba(34,211,238,.07);border:1px dashed rgba(34,211,238,.4);
  transition:.15s;font-family:inherit;
}
.add-part:hover{background:rgba(34,211,238,.14);border-color:rgba(34,211,238,.65)}
.grand-row{
  display:flex;align-items:center;justify-content:space-between;
  padding:10px 13px;margin-bottom:12px;border-radius:10px;
  background:rgba(34,211,238,.07);border:1px solid rgba(34,211,238,.28);
  font-size:12.5px;color:#a9c6df;letter-spacing:1px;
}
.grand-row b{font-size:17px;color:#5cf0ff;font-variant-numeric:tabular-nums;letter-spacing:.5px}

/* ---------- 自定义 LOGO（后台基本设置上传，未上传时保留文字图标） ---------- */
.logo.has-img,
.gate-logo.has-img{
  background:none;box-shadow:none;padding:0;overflow:hidden;
  text-shadow:none;
}
.logo.has-img img{width:100%;height:100%;object-fit:contain;display:block;filter:drop-shadow(0 0 10px rgba(34,211,238,.35))}
.gate-logo.has-img img{width:100%;height:100%;object-fit:contain;display:block;filter:drop-shadow(0 0 12px rgba(34,211,238,.4))}

/* ---------- 登录页背景图（后台「基本设置 → 登录页背景图」上传，留空＝纯深色科技风） ---------- */
.gate-visual{
  position:fixed;inset:0;z-index:0;
  background-size:cover;background-position:center;background-repeat:no-repeat;
}
.gate-visual::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(5,11,22,.16) 0%,rgba(5,11,22,.3) 50%,rgba(5,11,22,.55) 100%);
}
body.gate-hasbg{justify-content:center}
.gate-visual::before{
  content:"";position:absolute;inset:0;
  background:radial-gradient(ellipse 46% 62% at 50% 46%,rgba(5,11,22,.42) 0%,rgba(5,11,22,.18) 55%,rgba(5,11,22,0) 100%);
}
