  :root {
    --accent: #00e5ff; --accent-2: #38bdf8;
    --green: #00ff9d; --blue: #38bdf8; --red: #ff4d6a; --amber: #ffaa3c;
    --purple: #c084fc; --teal: #2dd4ee;
    --panel-bg: rgba(8, 22, 52, 0.38);
    --panel-bg-solid: rgba(6, 16, 40, 0.55);
    --panel-border: rgba(0, 200, 255, 0.32);
    --card-bg: rgba(10, 40, 82, 0.30);
    --card-border: rgba(0, 229, 255, 0.38);
    --text: #dceeff; --text-dim: #7fb3e0;

    /* ---- 全屏自适应布局栅格（随视口伸缩，无整体缩放）---- */
    --edge: clamp(10px, 0.9vw, 22px);                                  /* 左/右/底部外边距 */
    --topbar-h: clamp(56px, 6.2vh, 78px);                              /* 顶部栏高度 */
    --timeline-h: clamp(76px, 8.6vh, 104px);                           /* 底部时间轴高度 */
    --panel-top: calc(var(--topbar-h) + var(--edge));                  /* 面板起始 Y */
    --panel-bottom: calc(var(--timeline-h) + var(--edge));             /* 面板结束 Y（距底） */
    --side-w: clamp(268px, 18.2vw, 400px);                             /* 左侧/右侧面板宽度 */
    --side-w-wide: calc(clamp(280px, 19.2vw, 420px) - 10px);           /* 稍宽的面板（如监控右栏「飞行计划」卡片，按要求收窄 10px） */
    --altbar-right: calc(var(--side-w) + var(--edge) * 2.6);           /* 空域刻度条距右距离 */
    --altbar-h: clamp(360px, 56vh, 720px);                             /* 空域刻度条高度 */
  }
  * { margin:0; padding:0; box-sizing:border-box; }
  html,body { width:100%; height:100%; overflow:hidden; background:#020817; color:var(--text); font-family:"Microsoft YaHei","PingFang SC","Segoe UI",sans-serif; letter-spacing:.2px; }
  canvas { display:block; }
  /* 注：#app 的尺寸/定位/缩放见文件后段「布局自适应」区块（1920×1080 设计稿 + scale） */
  #app { background:radial-gradient(ellipse at center,#0a1838 0%,#02060f 70%);
    --theme-glow:#00e5ff; --theme-glow-soft:rgba(0,229,255,.28); --theme-hot:#20f7b2; --theme-panel:rgba(6,18,45,.78); }
  #app[data-theme="monitor"] { --theme-glow:#5ad1ff; --theme-glow-soft:rgba(90,209,255,.28); --theme-hot:#7dd3fc; --theme-panel:rgba(6,20,50,.82); }
  #app[data-theme="airspace"] { --theme-glow:#6ee7f9; --theme-glow-soft:rgba(110,231,249,.28); --theme-hot:#22d3ee; --theme-panel:rgba(4,25,45,.84); }
  #app[data-theme="training"] { --theme-glow:#b388ff; --theme-glow-soft:rgba(179,136,255,.28); --theme-hot:#7c3aed; --theme-panel:rgba(16,14,52,.82); }
  #app[data-theme="ems"] { --theme-glow:#ff5b6e; --theme-glow-soft:rgba(255,91,110,.30); --theme-hot:#ff9d57; --theme-panel:rgba(42,8,18,.84); }
  #gis-canvas-container { position:absolute; inset:0; }
  #gis-canvas-container::after { content:""; position:absolute; inset:0; pointer-events:none;
    background:
      radial-gradient(circle at 50% 52%, rgba(255,255,255,.06), transparent 18%),
      radial-gradient(circle at 50% 52%, var(--theme-glow-soft), transparent 42%),
      linear-gradient(180deg, rgba(4,12,30,0) 45%, rgba(4,12,30,.35) 100%);
    mix-blend-mode:screen; opacity:.9; transition:background .5s ease; }
  #app::before { content:""; position:absolute; inset:0; pointer-events:none; z-index:0;
    background-image:
      radial-gradient(1px 1px at 20% 30%, rgba(255,255,255,.6), transparent),
      radial-gradient(1px 1px at 70% 60%, rgba(160,220,255,.5), transparent),
      radial-gradient(1px 1px at 40% 80%, rgba(255,255,255,.4), transparent),
      radial-gradient(1px 1px at 90% 20%, rgba(160,220,255,.5), transparent),
      radial-gradient(1px 1px at 10% 70%, rgba(255,255,255,.4), transparent),
      radial-gradient(1px 1px at 60% 40%, rgba(160,220,255,.4), transparent);
    background-size:800px 800px; opacity:.5; }

  /* ========== 顶部栏 ========== */
  #top-bar { position:absolute; top:0; left:0; right:0; height:var(--topbar-h); z-index:50;
    display:flex; align-items:center; justify-content:space-between;
    padding:0 var(--edge); background:linear-gradient(180deg, rgba(8,16,40,.88) 0%, rgba(8,16,40,0) 100%);
    pointer-events:none; }
  #top-bar > * { pointer-events:auto; }
  .brand { display:flex; align-items:center; gap:14px; }
  .brand .logo { width:38px; height:38px; border-radius:8px;
    background:linear-gradient(135deg,#00e5ff,#1e90ff);
    box-shadow:0 0 18px rgba(0,229,255,.6), inset 0 0 8px rgba(255,255,255,.4);
    display:flex; align-items:center; justify-content:center;
    font-size:22px; color:#0a1838; font-weight:bold; }
  .brand .title { font-size:22px; font-weight:700; letter-spacing:2px; color:#e6f7ff; text-shadow:0 0 10px rgba(0,229,255,.6); }
  .brand .sub { font-size:12px; color:#6ab7ff; letter-spacing:4px; margin-top:2px; }
  .theme-tabs { position:absolute; left:50%; transform:translateX(-50%);
    display:flex; gap:4px; background:rgba(8,20,50,.55); padding:4px; border-radius:10px; border:1px solid rgba(0,229,255,.25); backdrop-filter:blur(8px); }
  .theme-tab { padding:8px 18px; font-size:13px; color:#9cc7ff; cursor:pointer; border-radius:6px; transition:all .25s; user-select:none; white-space:nowrap; }
  .theme-tab:hover { color:#fff; background:rgba(0,229,255,.1); }
  .theme-tab.active { color:#020817; font-weight:700;
    background:linear-gradient(135deg,var(--theme-glow),#1e90ff); box-shadow:0 0 14px var(--theme-glow-soft); }
  .clock { font-size:14px; color:#6ab7ff; letter-spacing:1px; text-align:right; }
  .clock .date { font-size:11px; color:#4a7fbf; }
  #top-bar, #timeline-bar { transition:border-color .45s ease, box-shadow .45s ease, background .45s ease; }
  #app[data-theme="ems"] #top-bar { background:linear-gradient(180deg, rgba(28,10,20,.92) 0%, rgba(28,10,20,0) 100%); }
  #app[data-theme="ems"] #timeline-bar { border-top-color:rgba(255,91,110,.45); box-shadow:0 -4px 24px rgba(255,91,110,.18); }
  #app[data-theme="training"] #timeline-bar { border-top-color:rgba(179,136,255,.45); box-shadow:0 -4px 24px rgba(179,136,255,.16); }

  /* ========== 视图 ========== */
  .view { position:absolute; inset:0; z-index:30; pointer-events:none; display:none; }
  .view.active { display:block; }
  .view .panel { pointer-events:auto; }

  /* ========== 面板（加宽到 336px） ========== */
  .panel { position:absolute; background:linear-gradient(135deg, rgba(10,26,60,.40) 0%, rgba(5,14,36,.48) 100%);
    border:1px solid var(--panel-border); border-radius:10px; padding:12px 14px;
    backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px);
    box-shadow:0 0 22px rgba(0,90,200,.18), inset 0 0 18px rgba(0,150,255,.05);
    overflow:hidden; display:flex; flex-direction:column; }
  .panel-body { flex:1; min-height:0; overflow:hidden; }
  /* 隐去滚动条外观但保留滚动能力：用于内容高度临界、滚动条会偶发闪现的面板 */
  .panel-body.sb-none { scrollbar-width:none; -ms-overflow-style:none; }
  .panel-body.sb-none::-webkit-scrollbar { width:0; height:0; }
  .panel-title { font-size:14px; color:#f2f9ff; letter-spacing:1px; font-weight:700;
    margin-bottom:12px; padding-left:10px; border-left:4px solid var(--theme-glow);
    display:flex; align-items:center; justify-content:space-between;
    text-shadow:0 0 8px var(--theme-glow-soft); }
  .panel-title .hint { font-size:11px; color:var(--accent); font-weight:400; letter-spacing:0; text-shadow:none; }
  .panel-title .sub-hd { font-size:12px; color:#f2f9ff; font-weight:700; margin:8px 0 6px; padding-left:8px; border-left:3px solid var(--accent-2); }

  /* ====== 酷炫科技动效 ====== */
  @property --ba { syntax:'<angle>'; inherits:false; initial-value:0deg; }

  /* 全局动态网格 + 扫描线 */
  #app::after {
    content:''; position:absolute; inset:0; pointer-events:none; z-index:1;
    background-image:
      linear-gradient(rgba(0,229,255,.022) 1px, transparent 1px),
      linear-gradient(90deg, rgba(0,229,255,.022) 1px, transparent 1px),
      linear-gradient(180deg, transparent, rgba(0,229,255,.06) 50%, transparent);
    background-size:50px 50px, 50px 50px, 100% 280px;
    background-repeat:repeat, repeat, no-repeat;
    animation:gridScan 8s linear infinite;
  }
  @keyframes gridScan {
    0% { background-position:0 0, 0 0, 0 -280px; }
    100% { background-position:50px 50px, 50px 50px, 0 100vh; }
  }

  /* 面板流光边框 */
  .panel::before {
    content:''; position:absolute; inset:0; border-radius:inherit;
    padding:1.5px;
    background:conic-gradient(from var(--ba),
      transparent 0deg, transparent 240deg,
      rgba(0,229,255,.95) 305deg, rgba(56,189,248,.4) 335deg, transparent 360deg);
    -webkit-mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    -webkit-mask-composite:xor; mask-composite:exclude;
    animation:borderSpin 4s linear infinite;
    pointer-events:none; z-index:5;
  }
  @keyframes borderSpin { to { --ba:360deg; } }

  /* 面板四角L型标记 */
  .panel::after {
    content:''; position:absolute; inset:0; border-radius:inherit;
    pointer-events:none; z-index:5; opacity:.6;
    background:
      linear-gradient(var(--theme-glow),var(--theme-glow)) 0 0/12px 2px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 0 0/2px 12px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 100% 0/12px 2px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 100% 0/2px 12px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 0 100%/12px 2px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 0 100%/2px 12px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 100% 100%/12px 2px no-repeat,
      linear-gradient(var(--theme-glow),var(--theme-glow)) 100% 100%/2px 12px no-repeat;
  }

  /* 标题流光下划线 */
  .panel-title { position:relative; }
  .panel-title::after {
    content:''; position:absolute; bottom:-2px; left:0; right:0; height:1px;
    background:linear-gradient(90deg, transparent, var(--accent), transparent);
    background-size:200% 100%; animation:titleShimmer 3s linear infinite;
  }
  @keyframes titleShimmer { 0%{background-position:200% 0;} 100%{background-position:-200% 0;} }

  /* 指标卡 hover 发光 + 数值脉冲 */
  .m-card { transition:all .25s; }
  .m-card:hover {
    border-color:var(--accent); box-shadow:0 0 14px rgba(0,229,255,.3), inset 0 0 12px rgba(0,150,255,.12);
    transform:translateY(-1px);
  }
  .m-card .v { animation:valGlow 3s ease-in-out infinite; }
  @keyframes valGlow { 0%,100%{text-shadow:0 0 8px rgba(0,229,255,.4);} 50%{text-shadow:0 0 14px rgba(0,229,255,.75);} }

  /* 列表行 hover 高亮 */
  .flight-row, .alert-item, .rank-card, .data-row { transition:all .2s; }
  .flight-row:hover, .alert-item:hover, .rank-card:hover, .data-row:hover {
    background:rgba(0,229,255,.06); box-shadow:inset 0 0 8px rgba(0,229,255,.1);
  }

  /* 面板内容区扫描线 */
  .panel-body { position:relative; }
  .panel-body::after {
    content:''; position:absolute; left:0; right:0; height:1px; top:0;
    background:linear-gradient(90deg, transparent, rgba(0,229,255,.18), transparent);
    pointer-events:none; z-index:0;
    animation:bodyScan 5s ease-in-out infinite;
  }
  @keyframes bodyScan {
    0% { top:0; opacity:0; } 10% { opacity:1; }
    90% { opacity:1; } 100% { top:100%; opacity:0; }
  }

  /* 顶部栏底部流光线 */
  #top-bar::after {
    content:''; position:absolute; bottom:0; left:0; right:0; height:1px;
    background:linear-gradient(90deg, transparent, var(--theme-glow), var(--accent-2), transparent);
    background-size:200% 100%; opacity:.5; animation:titleShimmer 4s linear infinite;
  }

  /* 主题标签 active 脉冲 */
  .theme-tab.active { animation:tabPulse 2s ease-in-out infinite; }
  @keyframes tabPulse {
    0%,100% { box-shadow:0 0 14px rgba(0,229,255,.55); }
    50% { box-shadow:0 0 22px rgba(0,229,255,.85); }
  }

  /* 指标卡 */
  .card-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
  /* 三卡一行：平均分 / 合格率 / 优秀率 必须并排（用户 2026-10-15 明确），不再折成两行 */
  .card-grid.cols-3 { grid-template-columns:repeat(3,1fr); }
  .m-card { background:var(--card-bg); border:1px solid var(--card-border);
    border-radius:8px; padding:8px 6px; text-align:center;
    box-shadow:inset 0 0 12px rgba(0,150,255,.08); }
  .m-card .v { font-size:22px; font-weight:700; color:var(--accent);
    font-family:"DIN Alternate","Arial Black",sans-serif; line-height:1.1;
    text-shadow:0 0 10px rgba(0,229,255,.5); font-feature-settings:"tnum"; }
  .m-card .l { font-size:10px; color:var(--text-dim); margin-top:2px; }
  .m-card .d { font-size:10px; margin-top:2px; font-weight:700; }
  .d.up { color:var(--green); } .d.down { color:var(--red); }

  /* 环形仪表 */
  .gauge-row { display:flex; justify-content:space-around; align-items:flex-start; margin-top:4px; }
  .gauge { text-align:center; }
  .gauge svg { display:block; margin:0 auto; }
  .gauge .cap { font-size:10px; color:var(--text-dim); margin-top:3px; }
  .gauge .cap b { color:#fff; }
  .risk-mini { display:flex; gap:12px; align-items:center; margin-bottom:8px; padding:8px 10px; border-radius:10px;
    background:rgba(10,40,82,.20); border:1px solid rgba(0,180,255,.14); }
  .risk-mini-legend { flex:1; min-width:0; }
  .risk-mini-row { display:flex; align-items:center; gap:8px; margin-bottom:4px; font-size:10px; color:var(--text-dim); }
  .risk-mini-row:last-child { margin-bottom:0; }
  .risk-mini-row i { width:8px; height:8px; border-radius:50%; flex:none; box-shadow:0 0 8px currentColor; }
  .risk-mini-row b { margin-left:auto; color:#fff; font-size:11px; font-weight:700; }

  /* ========== 动态滚动列表 ========== */
  .marquee { position:relative; overflow:hidden; flex:1 1 0; min-height:48px; }
  .marquee-track { animation:none; will-change:transform; }
  .marquee:hover .marquee-track { animation-play-state:paused; }
  @keyframes mqScroll { 0% { transform:translateY(0); } 100% { transform:translateY(-50%); } }
  /* 静态态（内容不满一屏，如空态卡 / 单条数据）：居中展示、不滚动 */
  .marquee.mq-static { display:flex; align-items:center; justify-content:center; }
  .marquee.mq-static .marquee-track { animation:none !important; }

  /* 实时飞行行 */
  .flight-row {
    display:flex; align-items:center; gap:10px;
    padding:8px 10px; margin-bottom:6px; border-radius:8px;
    background:rgba(10,40,82,.28); border:1px solid rgba(0,180,255,.15); }
  .flight-row .dot { width:9px; height:9px; border-radius:50%; flex:none; }
  .flight-row .dot.fly { background:var(--green); box-shadow:0 0 8px var(--green); }
  .flight-row .dot.wait { background:#8fa6c4; box-shadow:0 0 8px rgba(143,166,196,.85); }
  .flight-row .dot.done { background:var(--blue); box-shadow:0 0 8px var(--blue); }
  .flight-row .dot.err { background:var(--red); box-shadow:0 0 8px var(--red); animation:pulse 1s infinite; }
  .flight-row .info { flex:1; min-width:0; }
  .flight-row .id { font-size:13px; font-weight:700; color:#fff; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  /* 航空器编号徽标（lams_aircraft.code，如 UAV-D01 / HEL-H03） */
  .flight-row .ac-code { display:inline-block; margin-left:6px; padding:0 6px; border-radius:3px;
    font-size:10px; line-height:16px; font-weight:700; letter-spacing:.5px; vertical-align:middle;
    color:#8fd7ff; background:rgba(56,189,248,.14); border:1px solid rgba(56,189,248,.45);
    font-family:"DIN Alternate",Consolas,monospace; }
  .flight-row .desc { font-size:11px; color:var(--text-dim); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .flight-row .st { font-size:13px; font-weight:700; flex:none; }
  .st.fly { color:var(--green); } .st.wait { color:#8fa6c4; } .st.done { color:var(--blue); } .st.err { color:var(--red); }
  @keyframes pulse { 0%,100%{opacity:1;} 50%{opacity:.3;} }

  /* 告警大数字 */
  .alert-big { text-align:center; padding:6px 8px; border-radius:10px;
    background:rgba(40,10,24,.35); border:1px solid rgba(255,77,106,.35); margin-bottom:6px; }
  .alert-big .num { font-size:30px; font-weight:800; color:var(--red);
    font-family:"DIN Alternate","Arial Black",sans-serif; text-shadow:0 0 14px rgba(255,77,106,.7); line-height:1; font-feature-settings:"tnum"; }
  .alert-big .num.flash { animation:flash 1s infinite; }
  @keyframes flash { 0%,100%{opacity:1;} 50%{opacity:.35;} }
  .alert-big .lb { font-size:11px; color:var(--text-dim); margin-top:2px; }
  .alert-big .t { font-size:10px; color:var(--red); margin-top:1px; font-weight:700; }

  /* 告警条 */
  .alert-item { position:relative; padding:8px 12px 8px 16px; margin-bottom:6px; border-radius:7px; overflow:hidden; }
  .alert-item::before { content:""; position:absolute; left:0; top:0; bottom:0; width:4px; }
  .alert-item.urgent { background:rgba(255,77,106,.14); }
  .alert-item.urgent::before { background:var(--red); box-shadow:0 0 8px var(--red); }
  .alert-item.urgent .ttl { color:#ff8fa3; }
  .alert-item.normal { background:rgba(255,170,60,.12); }
  .alert-item.normal::before { background:var(--amber); box-shadow:0 0 8px var(--amber); }
  .alert-item.normal .ttl { color:#ffc870; }
  .alert-item.info { background:rgba(56,189,248,.12); }
  .alert-item.info::before { background:var(--blue); box-shadow:0 0 8px var(--blue); }
  .alert-item.info .ttl { color:#8fd4ff; }
  /* 已处置 / 已闭环：整行转绿（平静态），优先级高于上面的等级配色 ——
     等级类（urgent/normal/info）仍保留在 class 上（供「列表↔图例」高亮识别），
     仅由 .done 覆盖背景 / 左色条 / 文字色。 */
  .alert-item.done { background:rgba(0,255,157,.10); }
  .alert-item.done::before { background:var(--green); box-shadow:0 0 8px var(--green); }
  .alert-item.done .ttl { color:#7dffcd; }
  .alert-item.done .line2 { color:rgba(125,255,205,.78); }
  .alert-item .line1 { display:flex; justify-content:space-between; font-size:12px; font-weight:700; }
  .alert-item .line1 .tm { color:var(--text-dim); font-weight:400; font-size:11px; }
  .alert-item .line2 { font-size:10px; color:var(--text-dim); margin-top:2px; }

  /* 通用列表 */
  .data-row { display:flex; justify-content:space-between; align-items:center; padding:6px 4px; font-size:12px; color:var(--text); border-bottom:1px dashed rgba(0,150,255,.15); }
  .data-row:last-child { border-bottom:0; }
  .data-row .dim { color:var(--text-dim); }
  .tag { padding:1px 8px; border-radius:9px; font-size:10px; white-space:nowrap; }
  .tag.fly { background:rgba(0,255,157,.15); color:var(--green); border:1px solid var(--green); }
  .tag.done { background:rgba(56,189,248,.15); color:var(--blue); border:1px solid var(--blue); }
  .tag.err { background:rgba(255,77,106,.15); color:var(--red); border:1px solid var(--red); }
  .tag.wait { background:rgba(56,189,248,.14); color:#8fd4ff; border:1px solid rgba(56,189,248,.55); box-shadow:0 0 10px rgba(56,189,248,.18); }

  /* 进度条 */
  .pbar { height:8px; background:rgba(255,255,255,.07); border-radius:4px; overflow:hidden; margin-top:4px; }
  .pbar > i { display:block; height:100%; border-radius:4px; background:linear-gradient(90deg,#1e90ff,var(--accent)); box-shadow:0 0 8px rgba(0,229,255,.6); }
  .pbar > i.warn { background:linear-gradient(90deg,#ff6a00,var(--red)); box-shadow:0 0 8px rgba(255,77,106,.6); }
  .occ-row { margin-bottom:9px; }
  .occ-row .lab { display:flex; justify-content:space-between; font-size:11px; color:var(--text-dim); }
  .occ-row .lab b { color:#fff; }

  /* 横向柱 */
  .hbar-row { display:flex; align-items:center; gap:8px; margin-bottom:7px; font-size:11px; }
  /* 飞行监控 · 禁飞区闯入 TOP5：行距收紧，保证 5 行 + 底部两卡不超过面板高度（2026-10-13） */
  #mon-hbars .hbar-row { margin-bottom:7px; font-size:12px; }
  #mon-hbars .hbar-row:last-child { margin-bottom:0; }
  #mon-hbars .hbar-row .nm { width:96px; }
  #mon-hbars .hbar-row .track { height:13px; border-radius:6.5px; }
  #mon-hbars .hbar-row .val { font-size:12px; width:38px; }
  .hbar-row .nm { width:88px; color:var(--text-dim); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .hbar-row .track { flex:1; height:10px; background:rgba(255,255,255,.06); border-radius:5px; overflow:hidden; }
  .hbar-row .track > i { display:block; height:100%; border-radius:5px; background:linear-gradient(90deg,#1e60ff,var(--accent)); }
  .hbar-row .track > i.hot { background:linear-gradient(90deg,#ff8a00,var(--red)); }
  .hbar-row .val { width:34px; text-align:right; color:var(--accent); font-weight:700; font-feature-settings:"tnum"; }

  /* 排行 */
  .rank-row { display:flex; align-items:center; gap:10px; padding:6px; border-bottom:1px dashed rgba(0,150,255,.15); font-size:12px; }
  .rank-row .no { width:20px; height:20px; border-radius:50%; background:rgba(0,150,255,.18); color:var(--text-dim); font-weight:700; display:flex; align-items:center; justify-content:center; flex:none; font-size:10px; }
  .rank-row .no.g1 { background:linear-gradient(135deg,#ffd700,#ff9d00); color:#332; box-shadow:0 0 8px rgba(255,200,0,.6); }
  .rank-row .no.g2 { background:linear-gradient(135deg,#e5e5e5,#9aa5b1); color:#223; }
  .rank-row .no.g3 { background:linear-gradient(135deg,#d98e4a,#a05a1e); color:#211; }
  .rank-row .nm { flex:1; }
  .rank-row .nm .sub { font-size:10px; color:var(--red); }
  .rank-row .sc { color:var(--accent); font-weight:700; font-size:14px; font-feature-settings:"tnum"; }

  /* 学员排行卡（参考设计稿：排名+奖牌+姓名 / 大分值 / 进度条 / 统计行） */
  .rank-card { background:rgba(10,40,82,.28); border:1px solid rgba(0,180,255,.15);
    border-radius:8px; padding:9px 12px 8px; margin-bottom:8px; }
  .rank-card .rk-top { display:flex; align-items:center; gap:8px; }
  .rank-card .no { width:22px; height:22px; border-radius:50%; background:rgba(0,150,255,.18);
    color:var(--text-dim); font-weight:700; display:flex; align-items:center; justify-content:center; flex:none; font-size:12px; }
  .rank-card .medal { font-size:16px; flex:none; filter:drop-shadow(0 0 4px rgba(255,200,0,.5)); }
  .rank-card .nm { flex:1; font-size:15px; font-weight:700; color:#fff; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .rank-card .sc { font-size:24px; font-weight:800; color:var(--green);
    font-family:"DIN Alternate","Arial Black",sans-serif; text-shadow:0 0 10px rgba(0,255,157,.5); line-height:1; font-feature-settings:"tnum"; }
  .rank-card.mid .sc { color:var(--amber); text-shadow:0 0 10px rgba(255,170,60,.5); }
  .rank-card .rk-bar { height:6px; background:rgba(255,255,255,.08); border-radius:3px; margin:8px 0 5px; overflow:hidden; }
  .rank-card .rk-bar > i { display:block; height:100%; border-radius:3px;
    background:linear-gradient(90deg,#00c896,#00ff9d); box-shadow:0 0 6px rgba(0,255,157,.6); }
  .rank-card.mid .rk-bar > i { background:linear-gradient(90deg,#ff8a00,#ffc83c); box-shadow:0 0 6px rgba(255,170,60,.6); }
  /* 待作答占位（刚开课、本场暂无提交时按本班名册展示）：整体压暗，不参与名次竞争观感 */
  .rank-card.pending { background:rgba(10,40,82,.16); border-color:rgba(0,180,255,.10); }
  .rank-card.pending .no { background:rgba(120,150,190,.14); color:#8fa6c4; }
  .rank-card.pending .nm { color:#b9cbdd; font-weight:600; }
  .rank-card.pending .rk-sub { color:#8fa6c4; }
  /* 空态卡：本场无人提交（老师刚点开始讲课 / 学员还没交卷）—— 排行榜的"清空"态 */
  .rank-card.empty { background:rgba(10,40,82,.14); border:1px dashed rgba(0,180,255,.22);
    display:flex; align-items:center; justify-content:center; padding:22px 12px; cursor:default; }
  .rank-card.empty .rk-empty { font-size:13px; color:#8fa6c4; letter-spacing:1px; }
  .rank-card.empty::before { content:"—"; color:rgba(0,180,255,.45); margin-right:10px; font-size:16px; font-weight:700; }
  .rank-card .rk-sub { font-size:10px; color:var(--text-dim); letter-spacing:.5px; }
  .rank-card { cursor: pointer; }
  .rank-card.focus { border-color: var(--accent); background: rgba(0,229,255,.14);
    box-shadow: 0 0 16px rgba(0,229,255,.30); transform: translateX(4px); }
  /* 【2026-10-16】.rank-card.box-sel（框选命中学员高亮）随框选功能一并移除 */

  /* 学员个人能力雷达图标题联动 */
  .radar-focus-tip { font-size:10px; color:var(--accent); text-align:center; margin-bottom:4px; letter-spacing:.5px; }
  .radar-wrap { height:118px; margin-bottom:8px; padding:2px 0 4px; }
  /* 【2026-10-16】「班级整体能力概览」紧凑化（需求：平均分/合格率/优秀率三项压低，
     保证整块内容在不被滚动条/裁切的情况下完整展示）。
     实测：1366×768 时面板可视高仅 233px、内容 302px（溢出 69px）；
     1920×1080 不溢出。故这里让雷达随视口高度收缩 + 三卡瘦身：
       · 雷达 118px → clamp(60px, 9vh, 118px)（768 高时约 69px，省 ~49px）
       · 三卡 padding 8px→5px、数值 20px→clamp(14px,1.15vw,18px)、标签 10px→9px
       · 栅格间距 8px→6px、卡片组下外边距 8px→6px
     合计省下 ~65~70px，小分辨率下不再被裁切。 */
  /* padding 置 0：把整个高度让给 SVG 视口（旧值 2px/4px 会让雷达画布少 6px，间接压缩半径） */
  #tr-ability-panel .radar-wrap { height:clamp(58px, 8.8vh, 118px); margin-bottom:6px; padding:0; }
  #tr-ability-panel .radar-focus-tip { margin-bottom:2px; }
  #tr-ability-panel .card-grid.cols-3 { gap:6px; margin-bottom:6px !important; }
  #tr-ability-panel .card-grid.cols-3 .m-card { padding:5px 4px; }
  #tr-ability-panel .card-grid.cols-3 .m-card .v { font-size:clamp(14px, 1.15vw, 18px); }
  #tr-ability-panel .card-grid.cols-3 .m-card .l { font-size:9px; margin-top:1px; }
  #tr-ability-panel .occ-row .lab { font-size:10px; }
  .radar-wrap svg { width:100%; height:100%; display:block; }

  /* 工具类：内容纵向撑满分布；键值加宽行距 */
  .body-spread { display:flex; flex-direction:column; justify-content:space-evenly; }
  .body-spread .hbar-row, .body-spread .occ-row { margin-bottom:0; }
  .kv.kv-spacious { gap:10px 14px; font-size:12px; line-height:1.3; }
  .kv.kv-spacious .k { color:#9cc7ff; }

  /* 图例 */
  .legend-row { display:flex; align-items:center; gap:8px; padding:4px 2px; font-size:11px; color:var(--text); }
  .legend-row .sw { width:16px; height:11px; border-radius:2px; flex:none; }
  .legend-row .nm { width:40px; font-weight:700; }
  .legend-row .ht { color:var(--text-dim); flex:1; }
  .legend-row .nm2 { font-size:10px; color:var(--text-dim); }

  /* 告警列表：被地图定位命中的行 */
  .alert-item.alert-focus {
    outline:1px solid rgba(0,229,255,.75);
    box-shadow:0 0 12px rgba(0,229,255,.35) inset, 0 0 10px rgba(0,229,255,.25); }

  /* 【2026-10-16】框选工具条 / 框选矩形 / 框选结果面板 整套样式已随功能一并移除 */

  /* 特情流程 */
  .steps { position:relative; padding-left:4px; }
  /* 【2026-10-16】流程只保留节点名（第二行小字已移除），行间距相应拉大：10px → 18px */
  .step { display:flex; gap:10px; position:relative; padding-bottom:18px; }
  .step::before { content:""; position:absolute; left:7px; top:16px; bottom:-2px; width:2px; background:rgba(0,255,157,.30); }
  .step:last-child::before { display:none; }
  /* 管制处置流程：全部节点恒为绿色，不再按 done/cur/todo 动态变色（用户 2026-10-15 明确）。
     故这里不写 .step.done / .step.cur / .step.todo 的分支样式 —— 标记点、标题、连接线一律绿，
     「超时」也不再飘红。DOM 上仍可能带 done/cur/todo 类名，但已无对应样式、不影响呈现。 */
  .step .pt { width:16px; height:16px; border-radius:50%; flex:none; margin-top:2px; z-index:1; border:2px solid var(--green); background:var(--green); box-shadow:0 0 8px var(--green); }
  .step .tx .t1 { font-size:12px; font-weight:700; color:var(--green); }
  /* .t2（完成·耗时 / 进行中·已耗时 / 待开始·标准）已于 2026-10-16 按需求移除渲染；
     样式保留仅为兼容历史 DOM，实际不再出现。 */
  .step .tx .t2 { display:none; }
  .step .tx .t2 .over { color:var(--text-dim); }

  /* 指令 chips */
  .chips { display:flex; flex-wrap:wrap; gap:6px; margin-top:8px; }
  .chip { font-size:11px; padding:4px 10px; border-radius:12px; border:1px solid var(--card-border); color:var(--accent); background:rgba(0,150,255,.1); cursor:pointer; transition:all .2s; }
  .chip:hover { background:rgba(0,229,255,.25); box-shadow:0 0 8px rgba(0,229,255,.4); }

  /* 空域高度刻度条（右侧面板左侧 · 64×自适应高 · 垂直居中 · 不压左右卡片） */
  .alt-scale-bar {
    position: absolute;
    right: var(--altbar-right);
    top: calc(50% - var(--altbar-h) / 2);
    width: 64px;
    height: var(--altbar-h);
    pointer-events: auto;
    z-index: 30;
    color: #e3f6ff;
    font-family: 'Rajdhani', 'Orbitron', sans-serif;
    user-select: none;
  }
  .alt-scale-bar .asb-title {
    position: absolute;
    left: 50%;
    top: -22px;
    transform: translateX(-50%);
    font-size: 11px;
    letter-spacing: 2px;
    color: var(--text-dim);
    text-shadow: 0 0 8px rgba(56,189,248,.45);
    white-space: nowrap;
  }
  .alt-scale-bar .asb-wrap {
    position: relative;
    height: 100%;
    width: 64px;
    display: flex;
    justify-content: center;
  }
  .alt-scale-bar .asb-track {
    position: absolute;
    right: 22px;
    top: 0;
    bottom: 0;
    width: 4px;
    border-radius: 3px;
    background: linear-gradient(180deg, rgba(255,91,110,.0) 0%, rgba(56,189,248,.55) 45%, rgba(56,189,248,.55) 100%);
    box-shadow: 0 0 12px rgba(56,189,248,.35);
  }
  .alt-scale-bar .asb-zone {
    position: absolute;
    left: 10px;
    right: 18px;
    border-radius: 4px;
    pointer-events: none;
    border: 1px solid transparent;
  }
  .alt-scale-bar .asb-zone.zone-drone {
    bottom: 0;
    height: 12% !important;
    top: auto !important;
    background: linear-gradient(180deg, rgba(196,181,253,.18), rgba(196,181,253,.28));
    border-color: rgba(196,181,253,.6);
    box-shadow: 0 0 10px rgba(196,181,253,.28), inset 0 0 6px rgba(196,181,253,.18);
  }
  .alt-scale-bar .asb-zone.zone-heli {
    top: 0;
    height: 88% !important;
    bottom: auto !important;
    background: linear-gradient(180deg, rgba(56,189,248,.16), rgba(34,211,238,.24));
    border-color: rgba(56,189,248,.65);
    box-shadow: 0 0 10px rgba(56,189,248,.3), inset 0 0 6px rgba(56,189,248,.18);
  }
  .alt-scale-bar .asb-zone .asb-zone-lab {
    position: absolute;
    left: -2px;
    font-size: 10px;
    letter-spacing: 1px;
    white-space: nowrap;
    color: var(--text-dim);
    text-shadow: 0 0 6px rgba(56,189,248,.35);
    pointer-events: none;
  }
  .alt-scale-bar .asb-zone.zone-drone .asb-zone-lab { bottom: 0px;left: 2px; color: #c4b5fd; text-shadow: 0 0 8px rgba(196,181,253,.5); writing-mode: vertical-rl; transform: rotate(0deg); letter-spacing: 2px; }
  .alt-scale-bar .asb-zone.zone-heli  .asb-zone-lab { top:8px;left: 2px; color: #67e8f9; text-shadow: 0 0 8px rgba(56,189,248,.5); writing-mode: vertical-rl; transform: rotate(0deg); letter-spacing: 2px; }
  .alt-scale-bar .asb-tick {
    position: absolute;
    left: 0;
    right: 22px;
    height: 0;
    pointer-events: none;
  }
  .alt-scale-bar .asb-tick::before {
    content: '';
    position: absolute;
    right: 0;
    top: 0;
    width: 10px;
    height: 1px;
    background: rgba(186,230,253,.6);
    box-shadow: 0 0 4px rgba(56,189,248,.45);
  }
  .alt-scale-bar .asb-tick.big::before {
    width: 16px;
    right: 0;
    background: rgba(224,242,254,.85);
    box-shadow: 0 0 8px rgba(56,189,248,.6);
  }
  .alt-scale-bar .asb-tick .lab {
    position: absolute;
    right: -2px;
    top: 0;
    transform: translate(100%, -50%);
    font-size: 10px;
    letter-spacing: 1px;
    color: var(--text-dim);
    text-align: left;
    width: auto;
    padding-left: 4px;
    text-shadow: 0 0 6px rgba(56,189,248,.35);
  }
  .alt-scale-bar .asb-tick.big .lab {
    color: #bae6fd;
    font-size: 11px;
    font-weight: 600;
  }
  .alt-scale-bar .asb-cursor {
    position: absolute;
    left: 0;
    right: 0;
    height: 18px;
    transform: translateY(-50%);
    pointer-events: none;
    transition: top .18s cubic-bezier(.2,.8,.2,1);
    display: flex;
    align-items: center;
    gap: 4px;
  }
  .alt-scale-bar .asb-cursor::before {
    content: '';
    position: absolute;
    left: 6px; right: 24px;
    top: 50%; height: 2px;
    background: linear-gradient(90deg, rgba(255,200,80,.35), rgba(255,170,60,.95));
    box-shadow: 0 0 10px rgba(255,170,60,.75);
    transform: translateY(-50%);
  }
  .alt-scale-bar .asb-cursor::after {
    content: '';
    position: absolute;
    right: 18px;
    top: 50%;
    width: 0; height: 0;
    border: 5px solid transparent;
    border-left: 7px solid #ffaa3c;
    transform: translateY(-50%);
    filter: drop-shadow(0 0 6px rgba(255,170,60,.7));
  }
  .alt-scale-bar .asb-cursor .asb-cur-lab {
    position: absolute;
    left: 2px;
    top: 50%;
    transform: translate(0, -50%);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1px;
    padding: 2px 6px;
    color: #fff7e3;
    background: linear-gradient(180deg, rgba(255,170,60,.38), rgba(255,110,64,.28));
    border: 1px solid rgba(255,170,60,.75);
    border-radius: 4px;
    box-shadow: 0 0 10px rgba(255,170,60,.55), inset 0 0 6px rgba(255,255,255,.1);
    white-space: nowrap;
    text-shadow: 0 0 8px rgba(255,200,120,.75);
  }
  .alt-scale-bar .asb-mask {
    position: absolute;
    left: 4px;
    right: 16px;
    border-left: 1px solid rgba(14,116,144,.35);
    border-right: 1px solid rgba(14,116,144,.35);
    pointer-events: none;
  }
  #app[data-theme="training"] .alt-scale-bar .asb-zone.zone-drone { background: linear-gradient(180deg, rgba(179,136,255,.14), rgba(179,136,255,.22)); border-color: rgba(179,136,255,.58); box-shadow: 0 0 10px rgba(179,136,255,.26), inset 0 0 6px rgba(179,136,255,.16); }
  #app[data-theme="training"] .alt-scale-bar .asb-zone.zone-heli  { background: linear-gradient(180deg, rgba(126,87,255,.14), rgba(156,120,255,.22)); border-color: rgba(179,136,255,.55); box-shadow: 0 0 10px rgba(126,87,255,.26), inset 0 0 6px rgba(179,136,255,.14); }
  #app[data-theme="training"] .alt-scale-bar .asb-track { background: linear-gradient(180deg, rgba(124,58,237,.0) 0%, rgba(179,136,255,.55) 45%, rgba(179,136,255,.55) 100%); box-shadow: 0 0 12px rgba(179,136,255,.35); }
  #app[data-theme="ems"] .alt-scale-bar .asb-zone.zone-drone { background: linear-gradient(180deg, rgba(255,91,110,.12), rgba(255,91,110,.22)); border-color: rgba(255,91,110,.55); box-shadow: 0 0 10px rgba(255,91,110,.26), inset 0 0 6px rgba(255,91,110,.14); }
  #app[data-theme="ems"] .alt-scale-bar .asb-zone.zone-heli  { background: linear-gradient(180deg, rgba(255,157,87,.14), rgba(255,91,110,.20)); border-color: rgba(255,157,87,.58); box-shadow: 0 0 10px rgba(255,157,87,.28), inset 0 0 6px rgba(255,157,87,.16); }
  #app[data-theme="ems"] .alt-scale-bar .asb-track { background: linear-gradient(180deg, rgba(255,91,110,.0) 0%, rgba(255,157,87,.55) 45%, rgba(255,91,110,.55) 100%); box-shadow: 0 0 12px rgba(255,157,87,.35); }
  #app[data-theme="ems"] .alt-scale-bar .asb-cursor .asb-cur-lab { background: linear-gradient(180deg, rgba(255,91,110,.42), rgba(255,56,86,.30)); border-color: rgba(255,91,110,.78); box-shadow: 0 0 10px rgba(255,91,110,.58), inset 0 0 6px rgba(255,255,255,.1); }

  /* 键值 */
  .kv { display:grid; grid-template-columns:auto 1fr; gap:4px 12px; font-size:11px; }
  .kv .k { color:var(--text-dim); white-space:nowrap; }
  .kv .v2 { color:#fff; font-weight:600; text-align:right; }
  .ems-risk-strip { display:grid; grid-template-columns:repeat(2,1fr); gap:8px; margin-bottom:10px; }  /* 2026-10-14 阶段倒计时移除后 3 列 → 2 列 */
  .ers-item { padding:8px 8px 6px; border-radius:9px; border:1px solid rgba(255,255,255,.08); background:rgba(255,255,255,.04); text-align:center; }
  .ers-item .lb { font-size:10px; color:var(--text-dim); letter-spacing:1px; }
  .ers-item .vl { margin-top:3px; font-size:16px; font-weight:800; color:#fff; font-family:"DIN Alternate","Arial Black",sans-serif; font-feature-settings:"tnum"; }
  .ers-item.warn .vl { color:var(--red); text-shadow:0 0 10px rgba(255,77,106,.45); }
  .ers-item.amber .vl { color:var(--amber); text-shadow:0 0 10px rgba(255,170,60,.35); }

  /* 考核信息条 */
  .exam-bar { position:absolute; top:var(--panel-top); left:50%; transform:translateX(-50%);
    display:flex; align-items:center;
    background:var(--panel-bg-solid); border:1px solid var(--panel-border);
    border-radius:10px; padding:6px 8px; backdrop-filter:blur(8px); z-index:16;
    white-space:nowrap; max-width:calc(100vw - 60px);
    box-shadow:0 0 22px rgba(0,90,200,.18); }
  .exam-bar .ex-item { padding:2px 14px; text-align:center; }
  .exam-bar .ex-item .lb { color:var(--text-dim); font-size:10px; margin-bottom:2px; letter-spacing:1px; }
  .exam-bar .ex-item .vl { color:var(--accent); font-size:14px; font-weight:700; font-family:"DIN Alternate","Microsoft YaHei",sans-serif; font-feature-settings:"tnum"; }
  .exam-bar .ex-sep { width:1px; height:30px; background:linear-gradient(180deg,transparent,rgba(0,229,255,.4),transparent); flex:none; }
  .exam-bar .ex-cd { padding:0 18px; text-align:center; }
  .exam-bar .ex-cd .lb { color:var(--text-dim); font-size:10px; margin-bottom:1px; letter-spacing:1px; }
  .exam-bar .cd { font-size:26px; font-weight:800; color:var(--red); font-family:"DIN Alternate","Arial Black",sans-serif; text-shadow:0 0 12px rgba(255,77,106,.7); font-feature-settings:"tnum"; line-height:1; }
  /* 讲课态（默认课 / 已结束讲课）：不展示「剩余考核时长」与「已提交」，完成率按 100%。
     类名由 live-adapter.js 按后台 training.phase 切换。 */
  .exam-bar.is-lecture #exam-sep-cd,
  .exam-bar.is-lecture #exam-cd-box,
  .exam-bar.is-lecture #exam-submit-box { display:none; }

  /* ========== 航空器详情浮层 ========== */
  /* 【2026-10-16】航空器浮层层级调整（需求：内容窗体层级高于飞行标签，
     航线上的「无人机/直升机」标签不得盖住任何面板）：
     面板 .view=30 / 时间轴=30 ＞ 详情参数卡=14 ＞ 机型标签=12 ＞ 3D 画布(0)。
     标签仍在地图之上、但落到所有窗体之下；需要盖住面板的抽屉/浮层单独提到更高。 */
  #ac-overlay { position:absolute; inset:0; z-index:14; pointer-events:none; }
  .ac-card {
    position:absolute; transform:translate(-50%, -100%);
    background:linear-gradient(135deg, rgba(8,22,52,.82), rgba(5,14,36,.88));
    border:1px solid var(--accent); border-radius:8px; padding:8px 12px;
    box-shadow:0 0 16px rgba(0,229,255,.35), inset 0 0 10px rgba(0,150,255,.08);
    font-size:11px; backdrop-filter:blur(6px);
    min-width:150px; opacity:0; transition:opacity .2s; pointer-events:none; padding:6px 10px; }
  .ac-card.show { opacity:1; }
  .ac-card::after { content:""; position:absolute; left:50%; bottom:-6px; transform:translateX(-50%) rotate(45deg);
    width:10px; height:10px; background:rgba(8,22,52,.85); border-right:1px solid var(--accent); border-bottom:1px solid var(--accent); }
  .ac-card .hd { font-size:12px; font-weight:700; color:#fff; letter-spacing:.5px; }
  .ac-card .hd .st { font-size:10px; padding:1px 6px; border-radius:8px; margin-left:6px; }
  .ac-card .hd .st.fly { color:var(--green); background:rgba(0,255,157,.15); border:1px solid var(--green); }
  .ac-card .hd .st.done { color:var(--blue); background:rgba(56,189,248,.15); border:1px solid var(--blue); }
  .ac-card .hd .st.err { color:var(--red); background:rgba(255,77,106,.15); border:1px solid var(--red); }
  .ac-card .hd .st.wait { color:var(--text-dim); background:rgba(127,179,224,.12); border:1px solid rgba(127,179,224,.55); }
  .ac-card .kv { display:grid; grid-template-columns:1fr auto; gap:1px 12px; margin-top:4px; }
  .ac-card .kv .k { color:var(--text-dim); }
  .ac-card .kv .v { color:#fff; font-weight:600; font-feature-settings:"tnum"; }

  /* ========== 航空器机型类别常显标签（三维场景：一眼分辨直升机/无人机） ========== */
  #ac-tag-overlay { position:absolute; inset:0; z-index:12; pointer-events:none; }
  .ac-tag {
    position:absolute; transform:translate(-50%, -50%); white-space:nowrap;
    font-size:10px; line-height:16px; font-weight:700; letter-spacing:.5px;
    padding:0 6px; border-radius:9px; opacity:0; transition:opacity .25s;
    background:rgba(4,14,32,.66); backdrop-filter:blur(2px); }
  .ac-tag.show { opacity:1; }
  /* 直升机：橙色高亮，突出显示 */
  .ac-tag.heli { color:#ffb340; border:1px solid rgba(255,179,64,.8); box-shadow:0 0 10px rgba(255,179,64,.5); }
  /* 无人机：青绿次级 */
  .ac-tag.drone { color:#00ff9d; border:1px solid rgba(0,255,157,.4); font-weight:600; }

  /* ========== 底部 24h 时间轴 ========== */
  #timeline-bar { position:absolute; bottom:0; left:0; right:0; height:var(--timeline-h); z-index:30;
    background:linear-gradient(0deg, rgba(4,12,30,.96) 0%, rgba(6,16,40,.88) 70%, rgba(8,20,50,.55) 100%);
    border-top:1px solid rgba(0,229,255,.35); box-shadow:0 -4px 24px rgba(0,120,255,.18);
    padding:0 var(--edge); display:flex; align-items:center; gap:22px; }
  .tl-title { flex:none; width:130px; }
  .tl-title .t1 { font-size:14px; font-weight:700; color:#f2f9ff; text-shadow:0 0 8px rgba(0,229,255,.5); }
  .tl-title .t2 { font-size:10px; color:var(--text-dim); letter-spacing:2px; margin-top:3px; }
  .timeline { position:relative; flex:1; height:100%; }
  .timeline-track { position:absolute; top:50%; left:0; right:0; height:3px; transform:translateY(-50%);
    background:linear-gradient(90deg, transparent, rgba(0,229,255,.45) 8%, rgba(0,229,255,.45) 92%, transparent); border-radius:2px; }
  .tl-event { position:absolute; top:50%; transform:translate(-50%,-50%); width:8px; height:8px; border-radius:50%; cursor:pointer; pointer-events:auto; }
  .tl-event.task { box-shadow:0 0 10px rgba(56,189,248,.65); }
  .tl-event.warn { box-shadow:0 0 10px rgba(255,170,60,.75); }
  .tl-event.ems { box-shadow:0 0 14px rgba(255,77,106,.75); animation:pulse 1.4s infinite; }
  .tl-event.fly  { background:#22e2c0; box-shadow:0 0 10px rgba(34,226,192,.65); }
  .tl-event.done { background:#52a7ff; box-shadow:0 0 10px rgba(82,167,255,.65); }
  .tl-event.err  { background:#ff4d6a; box-shadow:0 0 10px rgba(255,77,106,.75); z-index:8; }
  /* 【2026-10-16】时间轴圆点悬停信息卡：fixed 定位跟随圆点，永不触发鼠标事件 */
  #tl-tip { position:fixed; z-index:9999; display:none; pointer-events:none;
    min-width:190px; max-width:270px; padding:10px 12px 9px; border-radius:8px;
    background:rgba(6,18,45,.95); border:1px solid rgba(0,229,255,.4);
    box-shadow:0 8px 26px rgba(0,0,0,.5), 0 0 14px rgba(0,229,255,.18);
    color:#dbeaff; font-size:12px; line-height:1.6; }
  #tl-tip .hd { display:flex; align-items:center; gap:8px; padding-bottom:5px; margin-bottom:6px;
    border-bottom:1px solid rgba(0,229,255,.18); }
  #tl-tip .hd b { color:#fff; font-size:13px; letter-spacing:.4px; }
  #tl-tip .hd .st { margin-left:auto; font-size:11px; line-height:1; padding:3px 8px; border-radius:9px;
    color:#04121f; font-weight:700; white-space:nowrap; }
  #tl-tip .row { display:flex; justify-content:space-between; gap:14px; }
  #tl-tip .row .k { color:#7fa7cc; white-space:nowrap; flex:none; }
  #tl-tip .row .v { color:#e8f4ff; text-align:right; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .tl-ticks { position:absolute; top:50%; left:0; right:0; display:flex; justify-content:space-between; transform:translateY(-50%); }
  .tl-tick { position:relative; width:1px; height:10px; background:rgba(0,229,255,.4); }
  .tl-tick span { position:absolute; top:12px; left:50%; transform:translateX(-50%); font-size:10px; color:var(--text-dim); white-space:nowrap; }
  .tl-cursor { position:absolute; top:50%; transform:translate(-50%,-50%); width:15px; height:15px;
    background:var(--accent); border-radius:50%; box-shadow:0 0 12px var(--accent), 0 0 26px rgba(0,229,255,.6); z-index:2; }
  .tl-cursor::before { content:""; position:absolute; inset:-7px; border-radius:50%; border:1px solid rgba(0,229,255,.28); animation:cursorPulse 1.8s ease-out infinite; }
  .tl-cursor .lab { position:absolute; bottom:18px; left:50%; transform:translateX(-50%); font-size:11px; color:var(--accent); white-space:nowrap; font-weight:700; font-feature-settings:"tnum"; }
  @keyframes cursorPulse { 0% { transform:scale(.75); opacity:.8; } 100% { transform:scale(1.55); opacity:0; } }
  .tl-stats { flex:none; width:210px; display:flex; justify-content:space-between; font-size:11px; color:var(--text-dim); }
  .tl-stats b { display:block; font-size:18px; color:var(--accent); font-family:"DIN Alternate",sans-serif; font-feature-settings:"tnum"; }
  .tl-stats b.r { color:var(--red); }

  /* 特情底部效能 */
  .ems-bottom { position:absolute; bottom:calc(var(--panel-bottom) - 4px); left:calc(var(--side-w) + var(--edge)); right:calc(var(--side-w) + var(--edge) * 2); z-index:16;
    display:flex; gap:14px; align-items:center;
    background:var(--panel-bg-solid); border:1px solid var(--panel-border); border-radius:10px;
    padding:10px 18px; backdrop-filter:blur(8px); font-size:11px; }
  .ems-bottom .em { flex:1; text-align:center; }
  .ems-bottom .em .v { font-size:18px; font-weight:700; color:var(--accent); font-family:"DIN Alternate",sans-serif; font-feature-settings:"tnum"; }
  .ems-bottom .em .l { color:var(--text-dim); margin-top:2px; }
  .ems-bottom .score { text-align:center; padding:0 16px; border-left:1px solid rgba(0,229,255,.2); border-right:1px solid rgba(0,229,255,.2); }
  .ems-bottom .score .v { font-size:26px; font-weight:800; color:var(--green); font-family:"DIN Alternate",sans-serif; text-shadow:0 0 10px rgba(0,255,157,.5); font-feature-settings:"tnum"; }

  /* 特情顶部告警横条（替代三维 Sprite 大 Label，样式与 ems-bottom 一致）
     两形态：.ems-topbar（两机冲突对）/ .ems-topbar.single（单机·范围告警播报）
     2026-10-14：宽度自适应内容 + 水平居中（原先两端拉满、内容被 flex 撑得稀疏），
     内间距同步缩小。 */
  .ems-topbar { position:absolute; top:var(--panel-top); left:50%; transform:translateX(-50%); z-index:16;
    width:max-content; max-width:calc(100vw - var(--side-w) * 2 - var(--edge) * 3);
    display:flex; gap:10px; align-items:center;
    background:linear-gradient(180deg, rgba(42,8,18,.92), rgba(18,4,10,.92));
    border:1px solid rgba(255,91,110,.48); border-radius:10px;
    padding:8px 14px; backdrop-filter:blur(8px); font-size:11px;
    box-shadow:0 0 24px rgba(255,91,110,.2), inset 0 0 20px rgba(255,91,110,.08); }
  .ems-topbar .warn-tag { flex:none; display:flex; align-items:center; gap:6px; padding:5px 12px;
    background:rgba(255,91,110,.15); border:1px solid rgba(255,91,110,.45); border-radius:6px;
    color:#ffd6db; font-weight:700; font-size:12px; }
  .ems-topbar .warn-tag::before { content:"⚠"; color:#ff5b6e; }
  .ems-topbar .pair { flex:none; display:flex; align-items:center; gap:10px; padding:0 12px;
    border-left:1px solid rgba(255,91,110,.22); border-right:1px solid rgba(255,91,110,.22); }
  .ems-topbar .pair .kv { display: flex;align-items: center;gap: 6px;flex: 1;flex-direction: column; }
  .ems-topbar .pair .kv .ln { font-size:10px; color:var(--text-dim); letter-spacing:.5px; }
  .ems-topbar .pair .kv .lv { font-size:16px; font-weight:700; font-family:"DIN Alternate",sans-serif; color:#ff9eaa; font-feature-settings:"tnum"; }
  .ems-topbar .pair .cross { font-size:13px; font-weight:700; color:#ff5b6e; text-shadow:0 0 8px rgba(255,91,110,.55); }
  .ems-topbar .em { flex:none; text-align:center; padding:0 6px; white-space:nowrap; }
  .ems-topbar .em .v { font-size:18px; font-weight:700; color:#ffc9cf; font-family:"DIN Alternate",sans-serif; text-shadow:0 0 6px rgba(255,91,110,.35); font-feature-settings:"tnum"; }
  .ems-topbar .em .l { color:var(--text-dim); margin-top:2px; }
  /* 单机·范围形态：只剩一个告警对象，字号略降 */
  .ems-topbar.single .pair .kv .lv { font-size:15px; }
  /* 非 EMS 主题，强制隐藏顶部告警横条（不依赖 JS animate 调用顺序，纯 CSS 保证） */
  #app:not([data-theme="ems"]) #ems-topbar { display: none !important; }

  /* 加载层 */
  #loading { position:absolute; inset:0; z-index:100; background:#02060f;
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:16px; transition:opacity .8s; }
  #loading.hide { opacity:0; pointer-events:none; }
  .loader-ring { width:64px; height:64px; border:3px solid rgba(0,229,255,.15); border-top-color:var(--accent); border-radius:50%; animation:spin 1s linear infinite; box-shadow:0 0 24px rgba(0,229,255,.4); }
  @keyframes spin { to { transform:rotate(360deg); } }
  #loading .txt { color:var(--accent); letter-spacing:4px; font-size:13px; }
  #loading .progress { width:260px; height:4px; background:rgba(0,229,255,.15); border-radius:2px; overflow:hidden; }
  #loading .progress .bar { width:0%; height:100%; background:linear-gradient(90deg,#1e90ff,var(--accent)); box-shadow:0 0 8px var(--accent); transition:width .3s; }
  /* 【2026-10-16】全局禁显滚动条（需求：任何内容都不得出现滚动条）。
     滚动能力保留（滚轮/触控仍可滚动列表），只是滚动条本身一律不可见：
     webkit 系宽度归零 + 滑块透明；Firefox 用 scrollbar-width:none。 */
  ::-webkit-scrollbar { width:0; height:0; display:none; }
  ::-webkit-scrollbar-track { background:transparent; }
  ::-webkit-scrollbar-thumb { background:transparent; border-radius:0; }
  ::-webkit-scrollbar-thumb:hover { background:transparent; }
  * { scrollbar-width:none; -ms-overflow-style:none; }
  /* =====================================================================
     全屏自适应布局（需求 7.3：1920×1080 / 3840×2160 / 拼接屏均可全屏展示）
     方案：不使用整体缩放。#app 直接铺满视口（100%×100%），
           所有面板的位置与宽度基于视口比例（vw/vh/clamp + 栅格变量），
           任何分辨率下都自动铺满全屏、无黑边、无拉伸变形。
     ===================================================================== */
  body { position:relative; overflow:hidden; }
  /* #app 铺满视口，作为全屏 HUD 容器 */
  #app {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
  }

  /* ========== 3D 汇聚高亮（机型/状态筛选、点击定位用）========== */
  .ac-card .st.wait { color: #8fa6c4; background: rgba(120,150,190,.15); border: 1px solid rgba(120,150,190,.6); }
  .selectable { cursor: pointer; }
  .selectable:hover { background: rgba(0,229,255,.10) !important; box-shadow: inset 0 0 10px rgba(0,229,255,.14); }
  .is-dimmed { opacity: .32; filter: saturate(.5); }
  @keyframes togPulse {
    0%,100% { box-shadow: 0 0 8px rgba(255,77,106,.5), inset 0 0 6px rgba(255,255,255,.08); }
    50%     { box-shadow: 0 0 18px rgba(255,77,106,.9), inset 0 0 10px rgba(255,255,255,.14); }
  }

  /* ========== 飞行计划：选中态 ========== */
  #mon-plans .flight-row.plan-active {
    background: rgba(0,229,255,.14) !important;
    border-color: var(--accent) !important;
    box-shadow: 0 0 12px rgba(0,229,255,.28);
  }

  /* ========== 详情抽屉（飞行监控：3 个标签页）==========
     位置与右侧「飞行计划」面板完全重合，z-index 更高（打开时盖在飞行计划上方） */
  #mon-detail {
    position: absolute; right: var(--edge); top: var(--panel-top); width: var(--side-w-wide); bottom: var(--panel-bottom); z-index: 35;
    background: linear-gradient(180deg, rgba(6,18,48,.96), rgba(4,12,30,.96));
    border: 1px solid var(--panel-border); border-radius: 10px;
    padding: 14px 16px; backdrop-filter: blur(9px);
    box-shadow: 0 10px 34px rgba(0,20,60,.45), 0 0 22px rgba(0,120,255,.16);
    transform: translateX(24px); opacity: 0; pointer-events: none;
    transition: transform .34s cubic-bezier(.22,1,.36,1), opacity .26s;
    display: flex; flex-direction: column; overflow: hidden;
  }
  #mon-detail.open { transform: translateX(0); opacity: 1; pointer-events: auto; }
  #mon-detail .dp-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; }
  #mon-detail .dp-title { font-size:14px; font-weight:700; color:#f2f9ff; letter-spacing:1px;
    padding-left:10px; border-left:4px solid var(--accent); }
  #mon-detail .dp-close { cursor:pointer; color:var(--text-dim); font-size:16px; line-height:1; padding:2px 6px; border-radius:5px; }
  #mon-detail .dp-close:hover { color:#fff; background:rgba(0,229,255,.14); }
  .dp-tabs { display:flex; gap:6px; margin-bottom:10px; flex:none; }
  .dp-tab { flex:1; text-align:center; font-size:11px; padding:6px 4px; border-radius:6px; cursor:pointer;
    color:var(--text-dim); border:1px solid rgba(0,229,255,.20); background:rgba(0,229,255,.04); transition:all .2s; }
  .dp-tab:hover { color:#fff; background:rgba(0,229,255,.12); }
  .dp-tab.active { color:#020817; font-weight:700; background:linear-gradient(135deg,var(--accent),#1e90ff);
    border-color:transparent; box-shadow:0 0 12px rgba(0,229,255,.35); }
  .dp-body { flex:1; min-height:0; overflow-y:auto; }
  .dp-pane { display:none; }
  .dp-pane.active { display:block; }

  /* ========== 特情处置建议 ========== */
  .advice-box { margin-top:10px; padding:9px 11px; border-radius:8px; font-size:11px; line-height:1.6;
    color:#cfe9ff; background:rgba(0,180,255,.10); border:1px solid rgba(0,229,255,.26);
    border-left:3px solid var(--accent); }
  .advice-box .hd { font-size:11px; font-weight:700; color:var(--accent); margin-bottom:5px; letter-spacing:1px; }

  /* ========== 指令芯片：点击下发交互反馈 ========== */
  .chip.dispatching { opacity:.5; pointer-events:none; }
  .chip.issued { color:#020817; background:linear-gradient(135deg,var(--green),#00c896); border-color:transparent; font-weight:700; }

  /* ========== 扣分 / 加分记录滚动条 ========== */
  .score-log { display:flex; flex-direction:column; gap:6px; }
  .score-item { display:flex; align-items:center; justify-content:space-between; font-size:11px;
    padding:5px 9px; border-radius:6px; border-left:3px solid; }
  .score-item.plus  { color:#8ff5c8; background:rgba(0,255,157,.09); border-color:var(--green); }
  .score-item.minus { color:#ffb0bd; background:rgba(255,77,106,.10); border-color:var(--red); }
  .score-item .sv { font-weight:700; font-family:"DIN Alternate",sans-serif; font-feature-settings:"tnum"; }
  .score-big { font-size:40px; font-weight:800; color:var(--green); line-height:1;
    font-family:"DIN Alternate","Arial Black",sans-serif; text-shadow:0 0 14px rgba(0,255,157,.55);
    font-feature-settings:"tnum"; }

  /* ========== 空域图层开关（图例行点击）========== */
  .legend-row { cursor: pointer; border-radius: 6px; padding-left: 4px; padding-right: 4px; transition: all .2s; }
  .legend-row:hover { background: rgba(0,229,255,.08); }
  .legend-row.off { opacity: .38; }
  .legend-row .sw { position: relative; }
  .legend-row.off .sw::after { content:"✕"; position:absolute; inset:0; display:flex; align-items:center;
    justify-content:center; font-size:9px; color:#fff; text-shadow:0 0 3px #000; }

  /* ========== 数据链路状态指示（断线兜底）========== */
  #link-status { position:absolute; top:8px; left:50%; transform:translateX(-50%); z-index:70;
    display:none; align-items:center; gap:8px; padding:5px 14px; border-radius:14px; font-size:11px;
    color:#ffd6db; background:rgba(66,14,30,.92); border:1px solid rgba(255,91,110,.5);
    box-shadow:0 0 18px rgba(255,91,110,.35); }
  #link-status.show { display:flex; }

