/* ============================================================
   城市智慧照明统一管控平台  ·  样式表
   设计基准 1920 x 1080，自适应等比缩放
   ============================================================ */

:root{
  --c-bg-0:#010512;
  --c-bg-1:#04123a;
  --c-bg-2:#062054;
  --c-line:rgba(64,158,255,.30);
  --c-line-2:rgba(64,158,255,.14);
  --c-cyan:#3fe6ff;
  --c-blue:#1f8cff;
  --c-blue-d:#0a4d9e;
  --c-txt:#cfe6ff;
  --c-txt-2:#7ea6d8;
  --c-txt-3:#4d76ad;
  --c-warn:#ffb020;
  --c-err:#ff4d5e;
  --c-ok:#2ce8a0;
  --c-pur:#a06bff;
}

*{ margin:0; padding:0; box-sizing:border-box; }

html,body{
  width:100%; height:100%;
  background:#01030c;
  overflow:hidden;
  font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB",-apple-system,sans-serif;
  color:var(--c-txt);
  -webkit-font-smoothing:antialiased;
}

.viewport{
  position:fixed; inset:0;
  display:flex; align-items:center; justify-content:center;
  background:radial-gradient(ellipse at 50% 45%, #05102c 0%, #01030c 70%);
  overflow:hidden;
}

.screen{
  position:relative;
  /* 尺寸由 JS 按视口动态设置：宽度铺满左右，高度等比，避免黑边 */
  width:1920px; height:1080px;
  transform-origin:center center;
  overflow:hidden;
  background:linear-gradient(175deg,#03103a 0%,#020a24 38%,#01060f 100%);
  /* 纵向流式布局：屏幕变高时各区块自动伸展，不露白 */
  display:flex; flex-direction:column;
}
/* 各区块脱离绝对定位，改由 flex 分配高度 */
.screen > .hd,
.screen > .kpi-row,
.screen > .body,
.screen > .ticker{ position:relative; left:auto; top:auto; right:auto; bottom:auto; width:auto; }
.screen > .hd{ flex:0 0 118px; }
.screen > .kpi-row{ flex:0 0 92px; }
.screen > .body{ flex:1 1 auto; min-height:0; overflow:hidden; }
.screen > .ticker{ flex:0 0 34px; margin:0 34px 10px; }

/* ---------------- 背景层 ---------------- */
.bg-base{ position:absolute; inset:0;
  background:
    radial-gradient(ellipse 60% 45% at 50% 46%, rgba(20,80,190,.42) 0%, transparent 70%),
    radial-gradient(ellipse 90% 60% at 50% 105%, rgba(0,120,255,.22) 0%, transparent 65%);
}
.bg-grid{
  position:absolute; inset:0; opacity:.30;
  background-image:
    linear-gradient(rgba(63,180,255,.10) 1px, transparent 1px),
    linear-gradient(90deg, rgba(63,180,255,.10) 1px, transparent 1px);
  background-size:60px 60px;
  mask-image:radial-gradient(ellipse 70% 60% at 50% 45%, #000 20%, transparent 78%);
  -webkit-mask-image:radial-gradient(ellipse 70% 60% at 50% 45%, #000 20%, transparent 78%);
}
.bg-stars{ position:absolute; inset:0; }
.bg-stars i{
  position:absolute; border-radius:50%;
  background:#fff;
  box-shadow:0 0 4px 1px rgba(150,210,255,.85);
  animation:twk var(--d) ease-in-out infinite alternate;
}
@keyframes twk{ from{opacity:.08; transform:scale(.6);} to{opacity:.9; transform:scale(1.25);} }
.bg-glow{
  position:absolute; left:50%; top:44%;
  width:1100px; height:640px; margin:-320px 0 0 -550px;
  background:radial-gradient(ellipse at center, rgba(30,140,255,.20), transparent 62%);
  filter:blur(28px);
  animation:breathe 7s ease-in-out infinite;
}
@keyframes breathe{ 0%,100%{opacity:.55; transform:scale(1);} 50%{opacity:1; transform:scale(1.06);} }

/* 外框 */
.frame{
  position:absolute; inset:14px;
  border:1px solid rgba(64,170,255,.30);
  pointer-events:none;
  box-shadow:inset 0 0 90px rgba(20,90,200,.20);
}
.frame::before,.frame::after{
  content:''; position:absolute; width:44px; height:44px;
  border:2px solid var(--c-cyan); opacity:.75;
  filter:drop-shadow(0 0 6px rgba(63,230,255,.8));
}
.frame::before{ left:-2px; top:-2px; border-right:0; border-bottom:0; }
.frame::after{ right:-2px; bottom:-2px; border-left:0; border-top:0; }

/* ---------------- 标题 ---------------- */
.hd{
  position:relative; flex:0 0 118px;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  text-align:center;
}
.hd-title{
  position:relative;
  font-size:46px; font-weight:800; letter-spacing:9px;
  color:#eaf6ff;
}

/* 主标题流光效果（只作用于文字本身） */
.hd-main{
  position:relative; display:inline-block;
  color:#eaf6ff;
  text-shadow:
    0 0 14px rgba(80,190,255,.95),
    0 0 34px rgba(40,140,255,.75),
    0 0 68px rgba(20,100,255,.45);
}
.hd-main::after{
  content:attr(data-text);
  position:absolute; left:0; top:0; width:100%;
  color:#5fd8ff; opacity:.4;
  animation:titleGlow 3.4s ease-in-out infinite;
  pointer-events:none;
}
@keyframes titleGlow{
  0%,100%{ transform:translateY(0); opacity:.22; filter:blur(4px);}
  50%{ transform:translateY(3px); opacity:.58; filter:blur(9px);}
}

/* 「辰数智建」徽标：定位在「可视化大屏」右下角 */
.hd-brand{
  position:absolute; left:100%; bottom:-4px;
  margin-left:14px;
  padding:3px 12px;
  font-size:17px; font-weight:700; letter-spacing:3px;
  color:#0a2a63; white-space:nowrap;
  background:linear-gradient(90deg,#3fe6ff,#1f8cff);
  border-radius:3px;
  box-shadow:0 0 16px rgba(63,200,255,.75);
}

@media screen and (max-width: 1180px){
  .hd-title{ display:flex; flex-direction:column; align-items:center; gap:10px; }
  .hd-brand{
    position:static; left:auto; bottom:auto; margin-left:0;
    font-size:14px; letter-spacing:2px; padding:3px 11px; order:2;
  }
  .hd-main{ order:1; }
}
.hd-en{
  margin-top:6px;
  font-size:11px; letter-spacing:3.4px;
  color:rgba(110,175,240,.72);
}

/* ---------------- 右上角：时钟 + 登录 ---------------- */
.hd-right{
  position:absolute; right:34px; top:50%;
  transform:translateY(-50%);
  display:flex; flex-direction:column; align-items:flex-end; gap:7px;
}
.hd-clock{ display:flex; flex-direction:column; align-items:flex-end; }
.hc-time{
  font-size:26px; font-weight:700; letter-spacing:1.5px; color:#eaf6ff;
  font-family:"DIN Alternate","Bahnschrift",sans-serif;
  text-shadow:0 0 12px rgba(80,190,255,.9);
  line-height:1.1;
}
.hc-date{ font-size:12px; color:#8fb6e0; letter-spacing:.8px; }
.hd-login{
  display:flex; align-items:center; gap:5px;
  height:26px; padding:0 11px;
  font-size:12.5px; color:#a9cdf5; font-family:inherit; letter-spacing:.5px;
  background:linear-gradient(180deg, rgba(16,62,150,.72), rgba(6,26,78,.55));
  border:1px solid rgba(72,168,255,.45);
  border-radius:3px; cursor:pointer; transition:.2s;
}
.hd-login svg{ color:var(--c-cyan); }
.hd-login:hover{ color:#fff; border-color:var(--c-cyan);
  box-shadow:0 0 12px rgba(63,230,255,.5); }

@media screen and (max-width: 1180px){
  .hd-right{
    position:static; transform:none;
    flex-direction:row; align-items:center; justify-content:center;
    gap:12px; margin-top:6px;
  }
  .hd-clock{ flex-direction:row; align-items:center; gap:8px; }
  .hc-time{ font-size:16px; } .hc-date{ font-size:11px; }
}
@media screen and (max-width: 1180px){
  .hd-title{ display:flex; flex-direction:column; align-items:center; gap:8px; }
  .hd-brand{
    margin-right:0; font-size:15px; letter-spacing:2px; padding:3px 12px;
    order:2;
  }
  .hd-main{ order:1; }
}
.hd-deco{
  position:absolute; top:16px; width:430px; height:52px;
  border-top:2px solid transparent;
  background:
    linear-gradient(90deg, transparent, rgba(63,200,255,.85), transparent) top/100% 2px no-repeat,
    linear-gradient(90deg, transparent, rgba(63,200,255,.30), transparent) bottom/100% 1px no-repeat;
  opacity:.85;
}
.hd-deco-l{ left:52px;  transform:skewX(-38deg); }
.hd-deco-r{ right:52px; transform:skewX(38deg); }

/* ---------------- 顶部 KPI ---------------- */
.kpi-row{
  position:relative; flex:0 0 92px;
  margin:0 34px;
  display:flex; gap:18px;
}
/* KPI 卡片 */
.kpi{
  position:relative; flex:1; height:92px;
  display:flex; align-items:center; gap:14px;
  padding:0 16px;
  background:linear-gradient(105deg, rgba(16,72,175,.62) 0%, rgba(9,38,110,.40) 55%, rgba(6,26,80,.20) 100%);
  border:1px solid rgba(72,168,255,.42);
  border-radius:3px;
  box-shadow:inset 0 0 26px rgba(30,110,220,.34), 0 0 14px rgba(0,80,200,.22);
  overflow:hidden;
}
.kpi::before{
  content:''; position:absolute; left:0; top:0; bottom:0; width:4px;
  background:linear-gradient(180deg,var(--c-cyan),var(--c-blue));
  box-shadow:0 0 12px var(--c-cyan);
}
.kpi::after{
  /* 圆形光晕装饰。原先 right:-30px 会伸出卡片右边界 30px，
     导致 scrollWidth 溢出（视觉上被 overflow:hidden 裁掉，不可见）。
     改为 right:10px 内缩，视觉几乎一致且不再触发溢出。 */
  content:''; position:absolute; right:10px; top:50%;
  width:120px; height:120px; margin-top:-60px; border-radius:50%;
  background:radial-gradient(circle,rgba(80,190,255,.28),transparent 68%);
  pointer-events:none;
}
.kpi-ico{
  position:relative; z-index:2;
  flex:0 0 52px; height:52px;
  display:flex; align-items:center; justify-content:center;
  background:linear-gradient(145deg,rgba(50,140,255,.55),rgba(10,50,140,.35));
  border:1px solid rgba(110,200,255,.6);
  transform:rotate(45deg);
  border-radius:8px;
  box-shadow:0 0 14px rgba(40,150,255,.5), inset 0 0 12px rgba(80,190,255,.35);
}
.kpi-ico span{
  transform:rotate(-45deg);
  font-size:25px; color:#bfe9ff;
  text-shadow:0 0 10px rgba(90,210,255,.95);
}
.kpi-txt{ position:relative; z-index:2; min-width:0; }
.kpi-lab{
  font-size:15px; color:#a9cdf5; letter-spacing:.6px;
  white-space:nowrap;
}
.kpi-val{
  margin-top:3px;
  font-size:27px; font-weight:800; letter-spacing:1px;
  color:#fff;
  text-shadow:0 0 12px rgba(70,190,255,.95);
  font-family:"DIN Alternate","Bahnschrift","Impact",sans-serif;
}
.kpi-val small{ font-size:15px; font-weight:600; margin-left:3px; color:#9fd0f8; }

/* ---------------- 主体布局 ---------------- */
/* 主体：左右栏固定宽，中间地图弹性伸缩 → 宽度铺满时左右对齐 */
.body{
  position:relative;
  margin:10px 34px 8px;
  display:grid;
  grid-template-columns:490px minmax(0,1fr) 452px;
  gap:20px;
  min-height:0;
}
.col{ display:flex; flex-direction:column; gap:16px; min-height:0; min-width:0; }
/* 面板在纵向弹性分配：去掉内联固定高度带来的溢出 */
.col > .panel{ height:auto !important; flex:1 1 0; min-height:0; }
.col-right > .panel:nth-child(1){ flex:1.55 1 0; }
.col-right > .panel:nth-child(2){ flex:1.05 1 0; }
.col-right > .panel:nth-child(3){ flex:1.0 1 0; }
.col-right > .panel:nth-child(4){ flex:.82 1 0; }

/* ---------------- 面板通用 ---------------- */
.panel{
  position:relative;
  background:linear-gradient(160deg, rgba(12,48,124,.40) 0%, rgba(5,22,68,.30) 100%);
  border:1px solid var(--c-line-2);
  border-radius:2px;
  padding:8px 10px 10px;
  box-shadow:inset 0 0 24px rgba(20,80,180,.14);
  display:flex; flex-direction:column;
  min-height:0;
}
.panel::before,.panel::after{
  content:''; position:absolute; width:12px; height:12px;
  border:1px solid var(--c-cyan); opacity:.55;
}
.panel::before{ left:-1px; top:-1px; border-right:0; border-bottom:0; }
.panel::after{ right:-1px; bottom:-1px; border-left:0; border-top:0; }

.panel-hd{
  position:relative; display:flex; align-items:center; gap:7px;
  height:24px; flex:0 0 24px; margin-bottom:2px;
}
.ph-line{
  width:3px; height:13px; border-radius:1px;
  background:linear-gradient(180deg,var(--c-cyan),var(--c-blue));
  box-shadow:0 0 8px var(--c-cyan);
}
.ph-idx{ font-size:14px; color:var(--c-cyan); font-weight:700; }
.ph-txt{ font-size:16px; color:#e2f1ff; font-weight:700; letter-spacing:1.4px;
  text-shadow:0 0 10px rgba(60,160,255,.6); }
.ph-live{
  margin-left:auto; font-size:11px; color:#8ff0d0;
  padding:1px 8px; border:1px solid rgba(44,232,160,.5); border-radius:2px;
  background:rgba(44,232,160,.10);
}
.ph-live::before{
  content:''; display:inline-block; width:5px; height:5px; border-radius:50%;
  background:#2ce8a0; margin-right:5px; vertical-align:middle;
  box-shadow:0 0 6px #2ce8a0; animation:blink 1.4s infinite;
}
@keyframes blink{ 0%,100%{opacity:1;} 50%{opacity:.25;} }

/* 三小图布局 */
.p3{ flex:1; display:flex; gap:6px; min-height:0; }
.mini{ flex:1; min-width:0; min-height:0; }

/* ---------------- 运营总览 ---------------- */
.ov-body{ flex:1; display:flex; align-items:center; gap:12px; min-height:0; position:relative; }
.ov-globe{ flex:0 0 128px; height:128px; }
.ov-stats{ flex:1; display:flex; align-items:center; justify-content:space-around; }
.ov-item{ text-align:center; }
.ov-num{
  font-size:34px; font-weight:800; color:#fff;
  font-family:"DIN Alternate","Bahnschrift","Impact",sans-serif;
  text-shadow:0 0 14px rgba(70,190,255,.95);
}
.ov-num-g{ color:#7ff3c8; text-shadow:0 0 14px rgba(44,232,160,.85); }
.ov-lab{ margin-top:2px; font-size:13px; color:#8fb6e0; }
.ov-div{ width:1px; height:38px; background:linear-gradient(180deg,transparent,rgba(90,170,255,.5),transparent); }
.ov-legend{
  position:absolute; left:0; right:0; bottom:2px;
  display:flex; justify-content:center; gap:14px; font-size:12px; color:#8fb6e0;
}
.ov-legend span{ display:flex; align-items:center; gap:4px; }
.dot{ width:7px; height:7px; border-radius:50%; display:inline-block; }
.d1{ background:#2ce8a0; box-shadow:0 0 6px #2ce8a0; }
.d2{ background:#ffb020; box-shadow:0 0 6px #ffb020; }
.d3{ background:#5b7fae; box-shadow:0 0 6px #5b7fae; }

/* ---------------- 中栏地图 ---------------- */
.col-mid{ position:relative; }
.map-wrap{ position:relative; flex:1; min-height:0; }
.map-box{ position:absolute; inset:0; }

/* 雷达扫描环与轨道环：按需求停用（会遮挡地图中心，干扰点位阅读）
   注意：下面 .radar / .orbit 的尺寸规则会覆盖本块样式，
   因此 display:none 必须写在各自规则之后，否则会被重定义冲掉。 */
.radar,.orbit{
  position:absolute; left:50%; top:50%;
  pointer-events:none; border-radius:50%;
}
.radar{
  width:520px; height:520px; margin:-260px 0 0 -260px;
  display:none;                      /* 最终生效：停用 */
}
.radar i{
  position:absolute; inset:0; border-radius:50%;
  border:1px solid rgba(63,200,255,.18);
  animation:radarOut 4s linear infinite;
}
.radar i:nth-child(2){ animation-delay:1.33s; }
.radar i:nth-child(3){ animation-delay:2.66s; }
@keyframes radarOut{
  from{ transform:scale(.32); opacity:.9;}
  to  { transform:scale(1);   opacity:0;}
}
.orbit{
  border:1px dashed rgba(63,200,255,.16);
  display:none;                      /* 最终生效：停用 */
}
.orbit-1{ width:600px; height:600px; margin:-300px 0 0 -300px; animation:spin 46s linear infinite; }
.orbit-2{ width:730px; height:730px; margin:-365px 0 0 -365px; animation:spin 76s linear infinite reverse; }
@keyframes spin{ to{ transform:rotate(360deg);} }

/* 点位详情 */
.point-panel{
  position:absolute; left:2px; top:14px;
  width:200px;
  background:linear-gradient(160deg, rgba(14,60,150,.60), rgba(4,20,64,.45));
  border:1px solid rgba(72,168,255,.45);
  border-radius:2px;
  box-shadow:0 0 22px rgba(0,90,220,.4), inset 0 0 20px rgba(30,110,220,.25);
  backdrop-filter:blur(3px);
  overflow:hidden;
}
.pp-hd{
  display:flex; align-items:center; gap:6px;
  padding:7px 10px;
  font-size:14px; font-weight:700; color:#dcefff; letter-spacing:1px;
  background:linear-gradient(90deg, rgba(30,110,230,.55), transparent);
  border-bottom:1px solid rgba(72,168,255,.30);
}
.pp-hd em{ margin-left:auto; font-style:normal; font-size:12px; color:var(--c-cyan);
  text-shadow:0 0 8px rgba(63,230,255,.8); }
.pp-dot{
  width:7px; height:7px; border-radius:50%; background:var(--c-cyan);
  box-shadow:0 0 8px var(--c-cyan); animation:blink 1.6s infinite;
}
@keyframes ppIn{
  from{ opacity:.3; transform:translateX(-16px); }
  to  { opacity:1;   transform:translateX(0); }
}

.pp-body{ padding:8px 10px 10px; }
.pp-row{
  display:flex; justify-content:space-between; align-items:center;
  font-size:12.5px; line-height:2.1;
  border-bottom:1px dashed rgba(72,168,255,.14);
}
.pp-row:last-child{ border-bottom:0; }
.pp-row span{ color:#83a9d4; }
.pp-row b{ color:#eaf6ff; font-weight:700; font-family:"Bahnschrift",sans-serif; }
.s-ok{ color:#2ce8a0 !important; }
.s-warn{ color:#ffb020 !important; }
.s-err{ color:#ff4d5e !important; }

/* 地图面包屑（下钻导航） */
.map-crumb{
  position:absolute; left:10px; top:8px; z-index:30;
  display:none; align-items:center; gap:6px;
  height:28px; padding:0 11px;
  background:linear-gradient(90deg, rgba(10,52,140,.88), rgba(6,28,86,.72));
  border:1px solid rgba(72,168,255,.55);
  border-radius:2px;
  box-shadow:0 0 14px rgba(0,90,220,.45);
  backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px);
  font-size:13px; white-space:nowrap;
}
.map-crumb.show{ display:flex; }
.crumb{ color:#cfe6ff; }
.crumb.back{
  font-family:inherit; font-size:13px; color:#7ff3c8; cursor:pointer;
  background:none; border:0; padding:0;
  transition:.2s;
}
.crumb.back:hover{ color:#fff; text-shadow:0 0 8px rgba(127,243,200,.9); }
.crumb-sep{ color:#4d76ad; }
.crumb-cur{ color:#3fe6ff; font-weight:700; text-shadow:0 0 8px rgba(63,230,255,.8); }

/* 城市视图下，面包屑上移让位给点位详情面板 */
.map-wrap.drilled .map-crumb{ left:auto; right:10px; }
@media screen and (max-width: 1180px){
  .map-crumb{ left:8px; top:8px; font-size:12px; height:26px; }
  .map-wrap.drilled .map-crumb{ left:8px; right:auto; top:auto; bottom:8px; }
}

.map-tip{
  position:absolute; left:10px; bottom:8px;
  font-size:11px; color:rgba(120,165,215,.55);
  letter-spacing:.6px; pointer-events:none;
}

/* 中栏底部导航 */
.mid-nav{
  flex:0 0 62px; display:flex; gap:14px; align-items:center; justify-content:center;
}
.mnav{
  position:relative;
  min-width:182px; height:44px; padding:0 20px;
  display:flex; align-items:center; justify-content:center; gap:8px;
  font-size:15px; color:#a9cdf5; font-family:inherit; letter-spacing:.8px;
  background:linear-gradient(180deg, rgba(16,62,150,.62), rgba(6,26,78,.42));
  border:1px solid rgba(72,168,255,.40);
  border-radius:3px; cursor:pointer;
  transition:.22s;
  overflow:hidden;
}
.mnav .mi{ font-size:16px; color:var(--c-cyan); text-shadow:0 0 8px rgba(63,230,255,.8); }
.mnav:hover{ color:#fff; border-color:rgba(63,230,255,.85);
  box-shadow:0 0 18px rgba(30,150,255,.45); transform:translateY(-2px); }
.mnav.active{
  color:#fff; border-color:var(--c-cyan);
  background:linear-gradient(180deg, rgba(40,130,255,.78), rgba(12,58,150,.55));
  box-shadow:0 0 22px rgba(40,160,255,.6), inset 0 0 16px rgba(80,200,255,.3);
}
.mnav .q{
  position:absolute; right:6px; top:5px;
  width:14px; height:14px; line-height:13px; text-align:center;
  font-size:11px; font-style:normal; border-radius:50%;
  border:1px solid rgba(150,200,255,.6); color:#9fd0f8;
}

/* ---------------- 设备运维表 ---------------- */
.tbl-wrap{
  flex:1; min-height:0; overflow:hidden;
  position:relative;
}
/* 底部渐隐，提示内容可滚动（表格行数会随时钟动态增加） */
.tbl-wrap::after{
  content:''; position:absolute; left:0; right:0; bottom:0; height:22px;
  background:linear-gradient(180deg, transparent, rgba(6,26,80,.92));
  pointer-events:none;
}
.tbl{ width:100%; border-collapse:collapse; font-size:13px; }
.tbl thead th{
  padding:5px 5px; font-weight:600; color:#9fd0f8; text-align:left;
  background:linear-gradient(180deg, rgba(40,110,220,.42), rgba(14,50,130,.28));
  border-bottom:1px solid rgba(72,168,255,.38);
  letter-spacing:.4px;
  white-space:nowrap; position:sticky; top:0; z-index:2;
}
.tbl tbody td{
  /* 行高控制在 28px 内，保证 7 行 + 表头可完整显示于PC 端面板 */
  padding:4px 5px;
  color:#c9e2ff;
  border-bottom:1px solid rgba(72,168,255,.12);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.tbl tbody tr{ transition:.18s; }
.tbl tbody tr:hover{ background:rgba(40,130,255,.24); }
/* PC 端：列宽分配——设备编号/类型/区域均衡，状态与在线时长略窄 */
.tbl th:nth-child(1),.tbl td:nth-child(1){ width:19%; }
.tbl th:nth-child(2),.tbl td:nth-child(2){ width:20%; }
.tbl th:nth-child(3),.tbl td:nth-child(3){ width:25%; }
.tbl th:nth-child(4),.tbl td:nth-child(4){ width:15%; }
.tbl th:nth-child(5),.tbl td:nth-child(5){ width:21%; }
.tbl tbody tr.new{ animation:rowIn .5s ease; }
@keyframes rowIn{ from{ background:rgba(63,230,255,.32); } to{ background:transparent; } }
.st-tag{ padding:1px 8px; border-radius:2px; font-size:11.5px; font-weight:600; }
.st-ok{ color:#2ce8a0; background:rgba(44,232,160,.14); border:1px solid rgba(44,232,160,.4); }
.st-warn{ color:#ffb020; background:rgba(255,176,32,.14); border:1px solid rgba(255,176,32,.4); }
.st-err{ color:#ff4d5e; background:rgba(255,77,94,.14); border:1px solid rgba(255,77,94,.4); }

/* ---------------- 资源 / 告警 条形 ---------------- */
.res-wrap{ flex:1; display:flex; flex-direction:column; justify-content:space-around; gap:5px; min-height:0; padding-top:2px; }
.res-row{ display:flex; align-items:center; gap:10px; font-size:13px; }
.res-lab{ flex:0 0 70px; color:#8fb6e0; text-align:right; }
.res-bar{
  flex:1; height:11px; position:relative; border-radius:1px;
  background:rgba(255,255,255,.06);
  box-shadow:inset 0 0 6px rgba(0,20,60,.6);
  overflow:hidden;
}
.res-fill{
  position:absolute; left:0; top:0; bottom:0; width:0;
  background:linear-gradient(90deg, rgba(20,90,220,.9), var(--c-cyan));
  box-shadow:0 0 10px rgba(63,200,255,.75);
  border-radius:1px;
  transition:width 1.1s cubic-bezier(.22,.9,.3,1);
}
.res-bar .res-ghost{
  position:absolute; inset:0;
  background:repeating-linear-gradient(90deg, rgba(255,255,255,.14) 0 2px, transparent 2px 6px);
}
.res-val{
  flex:0 0 82px; font-family:"Bahnschrift",sans-serif; font-weight:700;
  font-size:14px; color:#eaf6ff; text-shadow:0 0 8px rgba(63,180,255,.7);
  text-align:right;
}
.res-val em{ font-style:normal; font-size:11.5px; color:#7ea6d8; margin-left:3px; }

.res-row.lv1 .res-fill{ background:linear-gradient(90deg,rgba(200,30,50,.9),#ff4d5e); box-shadow:0 0 10px rgba(255,77,94,.75); }
.res-row.lv1 .res-val{ color:#ff8a95; }
.res-row.lv2 .res-fill{ background:linear-gradient(90deg,rgba(200,110,10,.9),#ffb020); box-shadow:0 0 10px rgba(255,176,32,.7); }
.res-row.lv2 .res-val{ color:#ffc95c; }
.res-row.lv3 .res-fill{ background:linear-gradient(90deg,rgba(20,90,220,.9),#2f9cff); box-shadow:0 0 10px rgba(47,156,255,.7); }

/* ---------------- 系统接入 ---------------- */
.sys-wrap{ flex:1; display:flex; gap:10px; align-items:center; }
.sys{
  flex:1; position:relative; height:52px;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
  font-size:13.5px; color:#bcd9f7; font-family:inherit; letter-spacing:.5px;
  background:linear-gradient(180deg, rgba(20,80,190,.55), rgba(8,32,96,.42));
  border:1px solid rgba(72,168,255,.42);
  border-radius:3px; cursor:pointer; transition:.2s;
}
.sys span{ font-size:16px; color:var(--c-cyan); text-shadow:0 0 8px rgba(63,230,255,.8); }
.sys:hover{ transform:translateY(-2px); border-color:rgba(63,230,255,.85);
  box-shadow:0 0 18px rgba(30,150,255,.45); color:#fff; }
.sys .st{
  position:absolute; right:7px; top:7px;
  width:6px; height:6px; border-radius:50%; background:#3d5f8c;
}
.sys.on .st{ background:#2ce8a0; box-shadow:0 0 7px #2ce8a0; animation:blink 1.8s infinite; }

/* ---------------- 滚动播报 ---------------- */
.ticker{
  position:relative; flex:0 0 34px;
  margin:0 34px 8px;
  display:flex; align-items:center; gap:10px;
  background:linear-gradient(90deg, rgba(8,40,110,.55), rgba(4,18,58,.35));
  border:1px solid rgba(72,168,255,.22);
  border-radius:2px;
  overflow:hidden;
}
.tk-lab{
  flex:0 0 auto; padding:0 12px; height:100%;
  display:flex; align-items:center;
  font-size:13px; font-weight:700; color:#0a2a63;
  background:linear-gradient(90deg,#3fe6ff,#1f8cff);
  letter-spacing:1px;
}
/* 播报滚动：由 JS 用 requestAnimationFrame 匀速驱动
   （原先用 CSS translateX(-100%) + 34s 周期，因内容总宽达11000px+
    位移量过大，视觉上几乎察觉不到在动） */
.tk-view{ flex:1; overflow:hidden; height:100%; display:flex; align-items:center; }
.tk-run{
  white-space:nowrap; font-size:13.5px; color:#a9cdf5;
  will-change:transform;
}
.tk-run span{ margin-right:70px; }
.tk-run span b{ color:var(--c-cyan); font-weight:600; }
.tk-run span i{ font-style:normal; color:#ffb020; }
.tk-view:hover .tk-run{ animation-play-state:paused; }

/* ============================================================
   SEO 静态兜底内容
   —— 大屏内容由 JS 动态生成，爬虫不执行 JS 抓不到正文。
      这里保留真实可读内容，正常浏览时用 clip 方式隐藏
      （不是 display:none，仍占位、不影响读屏与 SEO 判定）。
      无 JS 环境（爬虫 / 禁用脚本）下会自动显示为可读页面。
   ============================================================ */
.seo-fallback{
  position:absolute; left:-9999px; top:0;
  width:1px; height:1px; overflow:hidden;
}
html.no-js .seo-fallback{
  position:static; width:auto; height:auto; overflow:visible;
  padding:40px 24px; color:#cfe6ff;
  background:#04123a;
}
html.no-js .screen{ display:none; }

@media screen and (max-width: 1180px){
  /* 移动端同样保持隐藏（JS可用时），仅在无 JS 环境才展开 */
  .seo-fallback{ position:absolute; left:-9999px; top:0;
    width:1px; height:1px; overflow:hidden; }
  html.no-js .seo-fallback{
    position:static; width:auto; height:auto; overflow:visible;
    padding:24px 16px; color:#8fb6e0; font-size:14px; line-height:1.9;
  }
  html.no-js .screen{ display:none; }
}

/* ---------------- 滚动条 ---------------- */
::-webkit-scrollbar{ width:4px; height:4px; }
::-webkit-scrollbar-thumb{ background:rgba(63,200,255,.35); border-radius:2px; }
::-webkit-scrollbar-track{ background:transparent; }

/* ECharts 提示框统一 */
.tip-box{
  background:rgba(6,30,80,.94) !important;
  border:1px solid rgba(72,168,255,.6) !important;
  border-radius:2px !important;
  box-shadow:0 0 16px rgba(0,90,220,.5) !important;
  font-size:12.5px !important;
  color:#dcefff !important;
  padding:7px 11px !important;
}
.tip-box .t-t{ color:var(--c-cyan); font-weight:700; margin-bottom:4px; }
.tip-box .t-r{ display:flex; justify-content:space-between; gap:16px; line-height:1.7; }
.tip-box .t-r span{ color:#8fb6e0; }
.tip-box .t-r b{ color:#fff; font-family:"Bahnschrift",sans-serif; }

/* ============================================================
   全屏工具条
   ============================================================ */
.fs-bar{
  position:fixed; right:26px; bottom:20px; z-index:60;
}
.fs-btn{
  display:flex; align-items:center; gap:6px;
  height:30px; padding:0 12px;
  font-size:12.5px; color:#a9cdf5; font-family:inherit; letter-spacing:.5px;
  background:linear-gradient(180deg, rgba(16,62,150,.72), rgba(6,26,78,.55));
  border:1px solid rgba(72,168,255,.42);
  border-radius:3px; cursor:pointer; transition:.2s;
}
.fs-btn svg{ color:var(--c-cyan); }
.fs-btn:hover{ color:#fff; border-color:var(--c-cyan);
  box-shadow:0 0 14px rgba(63,230,255,.5); }

/* 竖屏引导 */
.rotate-tip{
  position:fixed; inset:0; z-index:999;
  display:none; flex-direction:column; align-items:center; justify-content:center; gap:16px;
  background:linear-gradient(160deg,#03103a,#01060f);
  text-align:center;
}
.rt-icon{ font-size:52px; animation:rot 2.4s ease-in-out infinite; }
@keyframes rot{ 0%,100%{transform:rotate(0);} 50%{transform:rotate(90deg);} }
.rt-txt{ font-size:17px; color:#cfe6ff; line-height:1.9; letter-spacing:1px; }
.rt-txt small{ font-size:12.5px; color:#7ea6d8; }

/* ============================================================
   移动端适配
   —— 大屏 (>1180px) 沿用 1920x1080 等比缩放
   —— 中屏 (≤1180px) 切换为纵向流式布局
   ============================================================ */

/* --- 平板 / 手机：解除缩放，改为流式 --- */
@media screen and (max-width: 1180px){
  .viewport{ align-items:flex-start; justify-content:center; overflow-y:auto;
    -webkit-overflow-scrolling:touch; }

  .screen{
    width:100%; height:auto; min-height:100%;
    transform:none !important;
    padding-bottom:env(safe-area-inset-bottom);
    display:block;   /* 移动端回到普通流式布局 */
  }
  /* 解除桌面端 flex 高度绑定 */
  .screen > .hd,
  .screen > .kpi-row,
  .screen > .body,
  .screen > .ticker{
    position:relative; left:auto; right:auto; top:auto; bottom:auto;
    width:auto; height:auto; margin:0; flex:none;
  }
  .frame{ inset:8px; }

  /* 背景层跟随内容高度 */
  .bg-base,.bg-grid,.bg-stars,.bg-glow{
    position:fixed; width:100%; height:100%;
  }

  /* 标题 */
  .hd{
    position:relative; top:auto; left:auto; width:100%;
    height:auto; padding:16px 14px 10px;
  }
  .hd-title{ font-size:clamp(19px, 5.2vw, 30px); letter-spacing:3px; }
  .hd-en{ display:none; }
  .hd-deco{ width:22%; height:22px; top:14px; }
  .hd-deco-l{ left:12px; } .hd-deco-r{ right:12px; }

  /* KPI：两列网格 */
  .kpi-row{
    position:relative; left:auto; top:auto;
    width:100%; height:auto;
    display:grid; grid-template-columns:repeat(2, 1fr);
    gap:8px; padding:6px 10px 12px;
  }
  .kpi{ height:62px; padding:0 10px; gap:10px; border-radius:4px; }
  .kpi-ico{ flex:0 0 34px; height:34px; border-radius:6px; }
  .kpi-ico span{ font-size:16px; }
  .kpi-lab{ font-size:11px; }
  .kpi-val{ font-size:19px; margin-top:1px; }
  .kpi-val small{ font-size:11px; }

  /* 主体：单列纵向流 */
  .body{
    position:relative; left:auto; top:auto;
    width:100%; height:auto;
    display:flex; flex-direction:column; gap:12px;
    padding:0 10px 14px;
  }

  /* 中栏优先（核心内容） */
  .col-mid{ order:-1; }
  .col{ gap:12px; }

  /* 面板高度自适应 */
  .panel{ height:auto !important; min-height:0; padding:10px 10px 12px; }
  /* 移动端：面板恢复自然高度，不做纵向弹性分配 */
  .col > .panel,
  .col-right > .panel:nth-child(1),
  .col-right > .panel:nth-child(2),
  .col-right > .panel:nth-child(3),
  .col-right > .panel:nth-child(4){ flex:none; height:auto !important; }

  /* 三小图在移动端横向铺满 */
  .p3{ display:grid; grid-template-columns:1fr; gap:8px; }
  .mini{ width:100%; height:150px; }

  /* 运营总览 */
  .ov-body{ flex-direction:column; gap:10px; padding:8px 0 22px; }
  .ov-globe{ flex:0 0 118px; width:118px; height:118px; }
  .ov-stats{ width:100%; }
  .ov-num{ font-size:26px; }
  .ov-lab{ font-size:11px; }

  /* 地图 */
  .map-wrap{ height:66vh; min-height:340px; }
  /* 地图雷达扫描环与轨道环 —— 已停用（会遮挡地图中心区域） */
.radar,.orbit{ display:none; }

  /* 详情：默认折叠为标题条，点击展开（避免遮挡地图） */
  .point-panel{
    position:absolute; left:8px; right:8px; top:8px;
    width:auto; margin-top:0; z-index:12;
    background:linear-gradient(160deg, rgba(8,40,105,.86), rgba(4,18,58,.70));
    backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
    max-height:44px; overflow:hidden;
    transition:max-height .3s ease;
  }
  .point-panel.open{ max-height:300px; }
  .pp-hd{ cursor:pointer; justify-content:flex-start; }
  .pp-hd::after{
    content:'▾'; margin-left:auto; margin-right:2px;
    font-size:12px; color:var(--c-cyan); transition:transform .3s ease;
  }
  .pp-hd em{ order:2; }
  .point-panel.open .pp-hd::after{ transform:rotate(180deg); }
  .pp-row{ font-size:11.5px; line-height:1.9; }
  .pp-row span{ font-size:11px; }
  .map-tip{ display:none; }

  /* 导航：横向滚动 */
  .mid-nav{
    flex:0 0 auto; display:flex; gap:8px; justify-content:flex-start;
    overflow-x:auto; padding-bottom:4px;
    -webkit-overflow-scrolling:touch; scrollbar-width:none;
  }
  .mid-nav::-webkit-scrollbar{ display:none; }
  .mnav{ flex:0 0 auto; min-width:auto; height:40px; padding:0 14px; font-size:13px; }

  /* 表格 */
  .tbl{ font-size:12px; }
  .tbl thead th{ padding:7px 3px; font-size:11px; }
  .tbl tbody td{ padding:7px 3px; }

  /* 条形 */
  .res-row{ font-size:12px; }
  .res-lab{ flex:0 0 56px; font-size:11.5px; }
  .res-val{ flex:0 0 68px; font-size:12px; }

  /* 系统接入 */
  .sys-wrap{ flex-direction:column; gap:8px; }
  .sys{ width:100%; flex-direction:row; gap:8px; height:44px; justify-content:flex-start; padding:0 14px; }

  /* 播报 */
  .ticker{
    position:relative; left:auto; bottom:auto;
    width:100%; height:30px; margin-top:10px;
  }
  .tk-run{ font-size:12px; }

  /* 全屏按钮固定在右下角 */
  .fs-bar{
    position:fixed; right:12px;
    bottom:calc(12px + env(safe-area-inset-bottom)); z-index:900;
  }
  .fs-btn{ height:36px; padding:0 14px; font-size:13px; }

  /* 图表提示框触控友好 */
  .tip-box{ font-size:13px !important; padding:9px 13px !important; }
}

/* --- 小屏手机（≤560px）进一步压缩 --- */
@media screen and (max-width: 560px){
  .kpi-row{ grid-template-columns:repeat(2, 1fr); gap:7px; padding:4px 8px 10px; }
  .kpi{ height:56px; padding:0 8px; gap:8px; }
  .kpi-ico{ flex:0 0 28px; height:28px; }
  .kpi-ico span{ font-size:14px; }
  .kpi-val{ font-size:17px; }
  .ph-txt{ font-size:14px; letter-spacing:.8px; }
  .body{ padding:0 8px 12px; }
  .panel-hd{ height:22px; flex:0 0 22px; }
  .mini{ height:136px; }
  .map-wrap{ height:58vh; min-height:300px; }
  .hd{ padding:12px 10px 8px; }
  .hd-title{ letter-spacing:2px; }
  .ticker{ margin-top:8px; }
  .tk-lab{ padding:0 8px; font-size:11.5px; }
  /* 表格横向滚动，避免挤压 */
  .tbl-wrap{ overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .tbl{ min-width:430px; }
}

/* --- 触控设备：去掉 hover 位移，避免误触 --- */
@media (hover: none){
  .mnav:hover, .sys:hover{ transform:none; }
  .fs-btn:hover{ transform:none; }
}

/* --- 矮屏横屏（如手机横屏 844x390）：压缩纵向留白 --- */
@media screen and (max-height: 460px) and (orientation: landscape){
  .hd{ padding:6px 12px 4px; }
  .hd-title{ font-size:17px; letter-spacing:2px; }
  /* KPI 改为横向滑动单行，最大化纵向空间给地图 */
  .kpi-row{
    display:flex; flex-wrap:nowrap; gap:8px;
    overflow-x:auto; padding:4px 10px 8px;
    scrollbar-width:none; -webkit-overflow-scrolling:touch;
  }
  .kpi-row::-webkit-scrollbar{ display:none; }
  .kpi{ flex:0 0 auto; min-width:150px; height:44px; }
  .kpi-val{ font-size:16px; }
  /* 横屏：地图是核心，尽量放大并居中 */
  .map-wrap{ height:82vh; min-height:210px; }
  .point-panel{ max-height:34px; }
  .mini{ height:112px; }
  .point-panel{ max-height:36px; }
  .point-panel.open{ max-height:44vh; }
  .pp-row{ line-height:1.7; }
  .mnav{ height:36px; font-size:12.5px; }
}

/* --- 竖屏手机：提示转屏（矮于宽的极端竖屏） --- */
@media screen and (orientation: portrait) and (max-width: 560px){
  .rotate-tip{ display:none; } /* 小屏也允许竖屏使用，不强制拦截 */
}

/* --- 打印 / 减少动画偏好 --- */
@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{
    animation-duration:.01ms !important; animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
  }
}