/* ============ 数据大屏 ============ */
.dash {
  min-height: 100vh;
  background: radial-gradient(1100px 520px at 50% -8%, var(--bg-2) 0%, transparent 62%),
    var(--bg);
  padding: 0 0 18px;
}

.dash-top {
  position: relative;
  height: 68px;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 22px;
  /* v1.1.0.125：顶栏跟随所选色卡的主色（整站统一，不单独定义底色） */
  /* v1.1.0.126：顶栏用独立的深色渐变令牌（--bar-top/--bar-bottom）——
     不能拿 --txt 去混（深色主题的 --txt 是浅色，混出来顶栏变浅、白字看不清）。 */
  background-color: var(--bar-bottom, var(--acc-deep));
  background-image: linear-gradient(180deg, var(--bar-top, var(--acc-deep)) 0%, var(--bar-bottom, var(--acc-deep)) 100%);
  border-bottom: 1px solid var(--bar-line, var(--acc-deep));
  color: var(--acc-deep-text);
}
.dash-top::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px;
  background: var(--acc);
  opacity: .8;
}
.dash-brand { display: flex; align-items: center; gap: 12px; min-width: 0; }
.dash-logo {
  width: 38px; height: 40px; flex: none; object-fit: contain;
  filter: drop-shadow(0 0 14px color-mix(in srgb, var(--c-like) 50.0%, transparent));
}
.dash-title { min-width: 0; }
.dash-title h1 {
  /* v1.1.0.125：顶栏为主色实底 → 标题用其对比色实字（原渐变文字在浅底上不可读） */
  margin: 0; font-size: 19px; font-weight: 800; letter-spacing: 1.4px;
  color: var(--acc-deep-text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dash-title p { margin: 1px 0 0; font-size: 11.5px; color: color-mix(in srgb, var(--acc-deep-text) 82%, transparent); letter-spacing: .6px; }

.dash-top-right { display: flex; align-items: center; gap: 14px; }
/* v1.1.0.125：顶栏是主色实底 → 右侧文字（用户名/角色/入口按钮）用主色上的对比色 */
.dash-top-right .hide-sm,
.dash-top-right .u-name,
.dash-top-right .u-role { color: var(--acc-deep-text); }
.dash-top-right .hide-sm small { color: color-mix(in srgb, var(--acc-deep-text) 80%, transparent); }
/* 顶栏内的按钮：顶栏已是主色实底 → 按钮用「主色上的对比色」反色，
   否则主色按钮会与顶栏底色融成一片（截图里「进入管理后台」几乎看不见）。 */
.dash-top-right .btn {
  background: color-mix(in srgb, var(--acc-deep-text) 20%, transparent);
  border-color: color-mix(in srgb, var(--acc-deep-text) 55%, transparent);
  color: var(--acc-deep-text);
}
.dash-top-right .btn:hover { background: color-mix(in srgb, var(--acc-deep-text) 34%, transparent); }
.dash-top-right .btn-primary {
  background: var(--acc-deep-text); border-color: var(--acc-deep-text);
  color: var(--acc-deep); font-weight: 700;
}
.dash-top-right .btn-primary:hover { background: color-mix(in srgb, var(--acc-deep-text) 86%, var(--acc-deep)); }
.dash-clock { text-align: right; line-height: 1.35; }
.dash-clock .t { font-size: 20px; font-weight: 700; color: var(--acc-deep-text); font-variant-numeric: tabular-nums; letter-spacing: 1px; }
.dash-clock .d { font-size: 11.5px; color: color-mix(in srgb, var(--acc-deep-text) 78%, transparent); }

.dash-body {
  display: grid;
  grid-template-columns: 300px 1fr 320px;
  gap: 13px;
  padding: 13px 15px 0;
  align-items: start;
}
.dash-col { display: flex; flex-direction: column; gap: 13px; }
/* v1.1.0.98：AI 助手栏提升层级并成为定位基准 —— 避免地图右上搜索浮层（.map-search z-index:31，
   absolute）在个别布局下视觉压到助手面板上（用户反馈「助手下方出现多余搜索框」）。 */
.dash-col.ai-assistant-column { position: relative; z-index: 32; }

/* 首页右侧「预留模块区」占位（v1.1.0.27：原四个右侧模块下线，保留空白占位供后续接入其它模块） */
.dash-placeholder {
  border-style: dashed;
  border-color: color-mix(in srgb, var(--c-luodian) 35.0%, transparent);
  background: color-mix(in srgb, var(--panel) 40.0%, transparent);
  min-height: 60vh;
}
.dash-placeholder .panel-head { border-bottom-color: color-mix(in srgb, var(--c-luodian) 20.0%, transparent); }
.dash-placeholder .placeholder-body {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 10px; padding: 30px 16px; text-align: center; min-height: calc(60vh - 46px);
}
.dash-placeholder .ph-icon {
  width: 56px; height: 56px; border-radius: 14px;
  display: grid; place-items: center;
  /* v1.1.0.125：占位图标跟随方案主色（图标与其淡底同源，图标用深调保证可辨） */
  font-size: 30px; line-height: 1; color: var(--acc-ink);
  background: color-mix(in srgb, var(--acc) 12.0%, transparent);
  border: 1px dashed color-mix(in srgb, var(--acc) 50.0%, transparent);
}
.dash-placeholder .ph-text { margin: 0; font-size: 15px; color: var(--txt); font-weight: 600; }
.dash-placeholder .ph-sub { margin: 0; font-size: 12.5px; color: var(--sub); }

/* KPI 卡片 */
.kpi-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 11px;
  padding: 13px 15px 0;
}
.kpi {
  position: relative; overflow: hidden;
  padding: 12px 14px;
  background: linear-gradient(160deg, color-mix(in srgb, var(--panel) 78.0%, transparent), color-mix(in srgb, var(--panel) 90.0%, transparent));
  border: 1px solid var(--line);
  border-radius: 10px;
}
.kpi::before {
  content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px;
  background: var(--kc, var(--acc));
}
.kpi::after {
  content: ""; position: absolute; right: -18px; top: -18px;
  width: 62px; height: 62px; border-radius: 50%;
  background: var(--kc, var(--acc)); opacity: .1;
}
.kpi .label { font-size: 12px; color: var(--sub); letter-spacing: .5px; }
.kpi .val {
  margin-top: 3px; font-size: 26px; font-weight: 800; line-height: 1.1;
  /* v1.1.0.125：大号彩色数字用「主色深调」，保证浅底上仍 ≥4.5:1
     （直接用语义色/主色在浅底上常常只有 1.7~3.0） */
  /* v1.1.0.125：大号彩色数字用「主色深调」，保证浅底上 ≥4.5:1
     （原写法 var(--acc-text) 是**主色上的对比色**（白/深），放到浅底上会看不清） */
  color: var(--kc-ink, var(--acc-ink)); font-variant-numeric: tabular-nums;
  text-shadow: none;
}
.kpi .val small { font-size: 12px; font-weight: 600; color: var(--sub); margin-left: 3px; text-shadow: none; }

/* 图表区 */
.chart-box { height: 168px; }
.chart-box.tall { height: 210px; }
.legend { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 8px; font-size: 12px; color: var(--txt-2); }
.legend i { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin-right: 5px; }
.hyd-total { display: flex; align-items: baseline; justify-content: center; gap: 8px; margin-top: 6px; }
.hyd-total .ht-num { font-size: 26px; font-weight: 800; color: var(--txt); line-height: 1; }
.hyd-total .ht-label { font-size: 12px; color: var(--txt-2); }

/* 重点单位数据统计（按支队/大队展示各级数量） */
.level-by-org { padding: 2px 0; }
.lbo-row { padding: 8px 2px; border-bottom: 1px dashed color-mix(in srgb, var(--c-luodian) 18.0%, transparent); }
.lbo-row:last-child { border-bottom: 0; }
.lbo-top { display: flex; align-items: center; gap: 8px; }
.lbo-tag {
  flex: none; font-size: 10.5px; line-height: 1; padding: 2px 6px; border-radius: 4px;
  background: color-mix(in srgb, var(--acc-2) 16.0%, transparent); color: var(--tx-gold); border: 1px solid color-mix(in srgb, var(--acc-2) 38.0%, transparent);
}
.lbo-tag.b { background: color-mix(in srgb, var(--c-luodian) 16.0%, transparent); color: var(--tx-teal); border-color: color-mix(in srgb, var(--c-luodian) 38.0%, transparent); }
.lbo-name {
  flex: 1; min-width: 0; font-size: 12.5px; color: var(--txt);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lbo-cnts { flex: none; display: flex; gap: 8px; font-size: 11.5px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.lbo-cnts .c1 { color: var(--tx-coral); }
.lbo-cnts .c2 { color: var(--tx-amber); }
.lbo-cnts .c3 { color: var(--tx-teal); }
.lbo-cnts .ct { color: var(--tx-gold); font-weight: 700; }
.lbo-bar { display: flex; height: 9px; margin-top: 6px; background: color-mix(in srgb, var(--panel-2) 5.0%, transparent); border-radius: 5px; overflow: hidden; }
.lbo-bar i { display: block; height: 100%; transition: width .4s ease; }
.lbo-bar .s1 { background: var(--c-xiafei); }
.lbo-bar .s2 { background: var(--c-hupo); }
.lbo-bar .s3 { background: var(--c-luodian); }

/* 地图 */
.map-wrap { height: 520px; position: relative; }
/* 地图外壳：地图 + 悬浮控件（图层开关 / 搜索框 / 定位按钮）。
   悬浮控件放在 #mainMap 之外 —— 离线引擎构造时会清空容器内容，
   若控件在容器内会被清掉（图层按钮会消失）。 */
.map-shell { position: relative; }

/* 地图右上角：内容搜索框 + 「定位当前位置」按钮 */
.map-search {
  position: absolute; right: 10px; top: 10px; z-index: 31;
  width: 300px; max-width: calc(100% - 20px);
  display: flex; flex-direction: column; gap: 6px;
}
.map-search .ms-row { display: flex; gap: 6px; }
.map-search .ms-input {
  position: relative; flex: 1; display: flex; align-items: center;
  height: 34px; padding: 0 8px 0 30px; border-radius: 8px;
  background: color-mix(in srgb, var(--panel) 92.0%, transparent); border: 1px solid var(--line-2);
}
.map-search .ms-input:focus-within { border-color: color-mix(in srgb, var(--c-luodian) 75.0%, transparent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--txt-2) 16.0%, transparent); }
.map-search .ms-ico { position: absolute; left: 9px; width: 15px; height: 15px; color: var(--txt); pointer-events: none; }
.map-search input {
  flex: 1; min-width: 0; height: 100%; border: 0; background: transparent;
  color: var(--txt); font-size: 12.5px; outline: none;
}
.map-search input::placeholder { color: var(--txt); }
.map-search .ms-clear {
  display: none; flex: none; width: 20px; height: 20px; line-height: 18px; text-align: center;
  border: 0; border-radius: 50%; background: color-mix(in srgb, var(--panel-2) 8.0%, transparent); color: var(--txt);
  font-size: 14px; cursor: pointer;
}
.map-search .ms-input.has-val .ms-clear { display: block; }
.map-search .ms-clear:hover { background: color-mix(in srgb, var(--panel-2) 20.0%, transparent); color: var(--txt); }
.map-search .ms-loc {
  flex: none; width: 34px; height: 34px; border-radius: 8px; cursor: pointer;
  background: color-mix(in srgb, var(--panel) 92.0%, transparent); border: 1px solid var(--line-2); color: var(--tx-teal);
  display: inline-flex; align-items: center; justify-content: center;
}
.map-search .ms-loc svg { width: 17px; height: 17px; }
.map-search .ms-loc:hover { background: color-mix(in srgb, var(--bg-2) 95.0%, transparent); color: var(--txt); border-color: color-mix(in srgb, var(--c-luodian) 60.0%, transparent); }
.map-search .ms-loc.loading { color: var(--tx-teal); animation: msSpin 1s linear infinite; }
@keyframes msSpin { to { transform: rotate(360deg); } }
.map-search .ms-status {
  display: none; font-size: 11.5px; line-height: 1.4; padding: 5px 9px; border-radius: 7px;
  background: color-mix(in srgb, var(--bg) 92.0%, transparent); border: 1px solid var(--line-2); color: var(--txt);
}
.map-search .ms-status.show { display: block; }
.map-search .ms-status.err { color: var(--tx-coral); border-color: color-mix(in srgb, var(--c-xiafei) 45.0%, transparent); }
.map-search .ms-results {
  display: none; max-height: 320px; overflow-y: auto; padding: 5px; border-radius: 9px;
  background: color-mix(in srgb, var(--panel) 97.0%, transparent); border: 1px solid color-mix(in srgb, var(--c-luodian) 40.0%, transparent);
  box-shadow: 0 12px 30px color-mix(in srgb, var(--txt-2) 55.0%, transparent);
}
.map-search .ms-results.open { display: block; }
.map-search .ms-empty { padding: 12px 10px; font-size: 12px; color: var(--txt); text-align: center; }
.map-search .ms-item {
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  padding: 7px 9px; border: 0; border-radius: 7px; background: transparent; cursor: pointer;
}
.map-search .ms-item:hover, .map-search .ms-item.on { background: color-mix(in srgb, var(--c-luodian) 16.0%, transparent); }
.map-search .ms-kind {
  flex: none; font-size: 10.5px; padding: 1px 7px; border-radius: 9px;
  background: color-mix(in srgb, var(--panel-2) 7.0%, transparent); color: var(--txt);
}
.map-search .ms-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.map-search .ms-name { font-size: 12.5px; color: var(--txt); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.map-search .ms-name b { color: var(--tx-gold); font-weight: 700; }
.map-search .ms-sub { font-size: 11px; color: var(--txt); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.map-search .ms-go { flex: none; font-size: 11.5px; color: var(--tx-teal); }
.map-search .ms-item:hover .ms-go { color: var(--txt); }

/* 大屏地图：搜索框占据右上角，离线引擎的缩放控件 / 指北针顺次下移避免遮挡 */
.map-shell .xffa-map-controls { top: 54px; }
.map-shell .xffa-north { top: 172px; }

.map-layers {
  position: absolute; left: 10px; top: 10px; z-index: 8;
  display: flex; gap: 8px; flex-wrap: wrap; align-items: center; justify-content: flex-start;
}
/* v1.1.0.101：功能图标半透明悬浮（hover 才实心），不遮挡地图内容与原生控件
   v1.1.0.163：统计按钮改**实底着色胶囊**（用户反馈半透明灰底可见性差）——
   各按钮 inline style 的 color（--tx-red/--tx-teal/--tx-gold）作为专属主题色，
   按钮底 = 该色 18% 实底 + 同色描边 + 同色文字，一眼可辨；未选中也不至于隐形。 */
.map-layers button {
  padding: 4px 11px; font-size: 12px; border-radius: 14px; cursor: pointer;
  background: color-mix(in srgb, var(--map-btn-c, var(--panel)) 18.0%, var(--panel) 82.0%);
  border: 1px solid color-mix(in srgb, var(--map-btn-c, var(--line-2)) 55.0%, transparent);
  color: var(--map-btn-c, var(--txt));
  display: inline-flex; align-items: center; gap: 5px;
  backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.map-layers button:hover { background: color-mix(in srgb, var(--map-btn-c, var(--panel)) 32.0%, var(--panel) 68.0%); color: var(--map-btn-c, var(--txt)); }
.map-layers button i { width: 8px; height: 8px; border-radius: 50%; background: currentColor; display: inline-block; }
/* 选中态（该图层正在显示）：高亮 + 实心圆点 + 轻微外发光，
   让「已选中 / 未选中」一眼可辨（v1.1.0.8 强化，配合 aria-pressed）。 */
.map-layers button.on {
  color: var(--txt); border-color: currentColor; background: color-mix(in srgb, var(--bg-2) 90.0%, transparent);
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--txt-2) 10.0%, transparent), 0 2px 10px color-mix(in srgb, var(--txt-2) 35.0%, transparent);
  font-weight: 600;
}
.map-layers button.on i { box-shadow: 0 0 0 3px color-mix(in srgb, var(--txt-2) 18.0%, transparent); }
.map-layers button.on b { color: var(--txt); }
.map-layers button:focus-visible { outline: 2px solid var(--acc); outline-offset: 2px; }
.map-stat {
  position: absolute; right: 10px; bottom: 10px; z-index: 6;
  background: color-mix(in srgb, var(--bg) 90.0%, transparent); border: 1px solid var(--line-2);
  border-radius: 8px; padding: 8px 12px; font-size: 12px; color: var(--txt-2);
  display: flex; gap: 14px;
}
.map-stat b { color: var(--txt); font-size: 14px; margin-left: 4px; }

/* 地图模块内容区：原左下角「类别和数量」移入此处 */
.map-foot {
  display: flex; flex-wrap: wrap; gap: 8px 18px;
  padding: 10px 14px; border-top: 1px solid var(--line);
  background: color-mix(in srgb, var(--panel) 50.0%, transparent); font-size: 12px; color: var(--txt-2);
}
.map-foot .mf-item { display: inline-flex; align-items: center; gap: 6px; }
.map-foot .mf-item i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
.map-foot .mf-item b { color: var(--txt); font-size: 14px; margin-left: 2px; }
/* v1.1.0.125：图例数字用语义色的**深调**（浅底上直接用语义色只有 1.7~3.0，读不清） */
.map-foot .mf-item b { color: var(--tx-coral); }
.map-foot .mf-item:nth-child(1) b { color: var(--tx-coral); }   /* 一级 → 霞绯深调 */
.map-foot .mf-item:nth-child(2) b { color: var(--tx-amber); }  /* 二级 → 琥珀深调 */
.map-foot .mf-item:nth-child(3) b { color: var(--tx-teal); }   /* 三级 → 螺钿青深调 */
.map-foot .mf-item.warn b { color: var(--tx-coral); }

/* 地图图层按钮：可展开的多级菜单（重点单位按等级 / 消防水源按类型） */
.layer-group { position: relative; display: inline-flex; align-items: center; }
.layer-menu {
  position: absolute; top: 100%; left: 0; margin-top: 6px; z-index: 12;
  display: none; flex-direction: column; gap: 4px; padding: 8px;
  background: color-mix(in srgb, var(--panel) 96.0%, transparent); border: 0; border-radius: 8px;
  min-width: 128px; box-shadow: 0 8px 22px color-mix(in srgb, var(--txt-2) 50.0%, transparent);
}
.layer-menu.open { display: flex; }
/* 下拉选项：无描边（去掉深色描边造成的视觉黑边），选中态用背景色区分 */
.layer-menu .sub-layer {
  padding: 5px 11px; font-size: 12px; border-radius: 8px; cursor: pointer; text-align: left;
  background: color-mix(in srgb, var(--panel-2) 6.0%, transparent); border: 0; color: var(--sub);
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  transition: background .15s ease, color .15s ease;
}
.layer-menu .sub-layer i { width: 8px; height: 8px; border-radius: 50%; background: var(--acc, currentColor); display: inline-block; }
.layer-menu .sub-layer:hover { background: color-mix(in srgb, var(--panel-2) 12.0%, transparent); color: var(--txt); }
.layer-menu .sub-layer.on {
  /* v1.1.0.125：选中态底色含主色 → 文字用主色深调（在浅底混合色上仍清晰） */
  color: var(--acc-ink);
  background: color-mix(in srgb, var(--acc) 26%, transparent);
}
/* 图层父按钮（lg-parent）选中态：底色含主色 → 其内数字同样用主色深调 */
.layer-btn.on, .lg-parent.on { color: var(--acc-ink); }
.layer-btn.on b, .lg-parent.on b { color: var(--acc-ink); }

/* 地图标记基本信息浮层（点击 重点单位 / 消防水源 / 消防站 / 消防大队 图标后展示） */
.map-info {
  position: absolute; top: 58px; right: 14px; width: 288px; max-width: calc(100% - 28px);
  /* 卡片挂在地图容器内（.xffa-map 是 overflow:hidden），内容一多就会被地图下边缘裁掉。
     手机上「信息卡显示不完全」就是这么来的：给一个随地图高度收缩的上限 + 内部滚动，
     内容再长也能完整看到（桌面 520px 地图 → 上限约 448px）。 */
  max-height: calc(100% - 72px); overflow-y: auto; overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  /* v1.1.0.101 重设计：更宽的卡片 + 统一留白 + 半透明磨砂底板（深浅底图下都清晰）
     —— 底板保持高不透明度深色（浅色底图上仍可读），文字用高对比色 + 轻投影。 */
  background: linear-gradient(180deg, color-mix(in srgb, var(--panel) 93%, transparent), color-mix(in srgb, var(--bg) 96%, transparent));
  border: 1px solid color-mix(in srgb, var(--acc) 38%, transparent); border-radius: 14px;
  padding: 16px 18px 18px; color: var(--txt); z-index: 30;
  box-shadow: 0 14px 38px var(--shadow-color), 0 0 0 1px color-mix(in srgb, var(--txt) 6%, transparent) inset;
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
  opacity: 0; transform: translateY(-6px); transition: opacity .18s ease, transform .18s ease;
  visibility: hidden; pointer-events: auto;
  scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--line) 55.0%, transparent) transparent;
}
.map-info::-webkit-scrollbar { width: 6px; }
.map-info::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--c-luodian) 40.0%, transparent); border-radius: 3px; }
.map-info.show { opacity: 1; transform: none; visibility: visible; }
.map-info .mi-close {
  position: absolute; top: 10px; right: 10px; width: 24px; height: 24px; line-height: 22px;
  text-align: center; border: none; background: color-mix(in srgb, var(--panel-2) 6.0%, transparent); color: var(--txt);
  font-size: 19px; cursor: pointer; border-radius: 6px; transition: background .15s ease, color .15s ease;
}
.map-info .mi-close:hover { color: var(--txt); background: color-mix(in srgb, var(--panel-2) 16.0%, transparent); }
.map-info .mi-badge {
  display: inline-block; font-size: 11px; padding: 2px 10px; border-radius: 10px;
  margin-bottom: 8px; letter-spacing: .5px;
}
.map-info .mi-badge.u { background: color-mix(in srgb, var(--acc) 18.0%, transparent); color: var(--tx-orange); border: 1px solid color-mix(in srgb, var(--acc) 42.0%, transparent); }
.map-info .mi-badge.h { background: color-mix(in srgb, var(--c-luodian) 18.0%, transparent); color: var(--tx-teal); border: 1px solid color-mix(in srgb, var(--c-luodian) 42.0%, transparent); }
.map-info .mi-badge.o { background: color-mix(in srgb, var(--acc-2) 18.0%, transparent); color: var(--tx-gold); border: 1px solid color-mix(in srgb, var(--acc-2) 42.0%, transparent); }
/* 标题层级：一级 16px/600；正文 13px；辅助信息 11.5px（层级更清晰、留白更透气） */
.map-info .mi-title {
  font-size: 16px; font-weight: 600; margin-bottom: 12px; color: var(--txt);
  line-height: 1.4; word-break: break-all; letter-spacing: .2px;
  text-shadow: 0 1px 3px color-mix(in srgb, var(--c-xuanqi) 45.0%, transparent);
}
.map-info .mi-row {
  display: flex; gap: 12px; font-size: 13px; margin: 0 0 9px; line-height: 1.55;
  padding-bottom: 8px; border-bottom: 1px solid color-mix(in srgb, var(--c-luodian) 10.0%, transparent);
}
.map-info .mi-row:last-child { border-bottom: 0; padding-bottom: 0; }
.map-info .mi-k {
  flex: none; width: 62px; color: var(--tx-violet); font-size: 11.5px; letter-spacing: .3px;
  padding-top: 1px;   /* 与正文基线对齐 */
}
.map-info .mi-v { flex: 1; min-width: 0; color: var(--txt); word-break: break-all; }

/* 消防水源「状态展示区」（v1.1.0.24）
   地图点位按状态着色后，信息卡里必须把「能不能用 +  为什么」讲清楚：
   可用=绿框、不可用=灰框（与地图上灰色点位呼应），并保留原始状态文字备查。 */
.map-info .mi-status {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin: 0 0 9px; padding: 7px 10px; border-radius: 7px;
  font-size: 12.5px; line-height: 1.5;
}
.map-info .mi-status.ok { background: color-mix(in srgb, var(--c-luodian) 12.0%, transparent); border: 1px solid color-mix(in srgb, var(--c-luodian) 42.0%, transparent); }
.map-info .mi-status.bad { background: color-mix(in srgb, var(--panel-2) 14.0%, transparent); border: 1px solid color-mix(in srgb, var(--line) 45.0%, transparent); }
.map-info .mi-status-t { font-weight: 700; flex: none; }
.map-info .mi-status.ok .mi-status-t { color: var(--tx-teal); }
.map-info .mi-status.bad .mi-status-t { color: var(--txt); }
.map-info .mi-status-d { color: var(--txt); flex: 1 1 auto; min-width: 0; }
.map-info .mi-status-s {
  flex: none; padding: 1px 8px; border-radius: 9px; font-size: 11px; letter-spacing: .5px;
  background: color-mix(in srgb, var(--panel-2) 8.0%, transparent); color: var(--txt);
}
.map-info .mi-brief { font-size: 12px; color: var(--txt); margin-top: 6px; line-height: 1.5; }
.map-info .mi-nav {
  display: block; margin-top: 11px; padding: 8px 10px;
  text-align: center; font-size: 12.5px; text-decoration: none; cursor: pointer;
  color: var(--txt); background: color-mix(in srgb, var(--c-luodian) 14.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--c-luodian) 42.0%, transparent); border-radius: 8px;
  transition: background .15s ease, color .15s ease;
}
.map-info .mi-nav:hover { background: color-mix(in srgb, var(--c-luodian) 26.0%, transparent); color: var(--txt); }
.map-info .mi-link { color: var(--tx-teal); text-decoration: none; border-bottom: 1px dashed color-mix(in srgb, var(--c-luodian) 60.0%, transparent); }
.map-info .mi-link:hover { color: var(--txt); border-bottom-color: var(--c-like); }

/* 重点单位信息卡 - 周围水源（300/500/1000 米筛选） */
.map-info .mi-water { margin-top: 10px; padding-top: 9px; border-top: 1px dashed color-mix(in srgb, var(--c-luodian) 28.0%, transparent); }
.map-info .mi-water-h {
  font-size: 12.5px; font-weight: 600; color: var(--tx-teal); margin-bottom: 7px; letter-spacing: .5px;
  /* v1.1.0.37：区块小标题居中（「周围水源」「资料速览」等一律居中，不再左对齐） */
  text-align: center;
}
.map-info .mi-water-btns { display: flex; gap: 6px; }
.map-info .mi-water-btn {
  flex: 1; padding: 6px 0; font-size: 12px; cursor: pointer; text-align: center;
  color: var(--txt); background: color-mix(in srgb, var(--c-luodian) 10.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--c-luodian) 38.0%, transparent); border-radius: 7px;
  transition: background .15s ease, color .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.map-info .mi-water-btn:hover { background: color-mix(in srgb, var(--c-luodian) 22.0%, transparent); color: var(--txt); }
.map-info .mi-water-btn.active {
  background: color-mix(in srgb, var(--c-luodian) 92.0%, transparent); color: var(--txt-2); font-weight: 700;
  border-color: color-mix(in srgb, var(--c-luodian) 100.0%, transparent); box-shadow: 0 2px 8px color-mix(in srgb, var(--txt-2) 42.0%, transparent);
}
.map-info .mi-water-count {
  margin-top: 7px; font-size: 12px; color: var(--txt); line-height: 1.45;
  background: color-mix(in srgb, var(--panel) 22.0%, transparent); border-radius: 6px; padding: 5px 8px;
}

/* ============================================================
   重点单位「资料速览」按钮组 + 内容弹窗（v1.1.0.34）
   ------------------------------------------------------------
   · .mi-quick 在信息卡**内容流内**（不是 absolute 浮层）→ 横向排布、
     换行自适应，绝不会盖住卡片里的其它内容。
   · .mi-qmask 是独立的居中弹窗，z-index 高于信息卡；打开时会把信息卡收起，
     两个浮层不会叠在一起互相遮挡。
   · .mi-qbody 设 max-height + overflow-y:auto → 内容再长也只在正文里滚动，
     标题与关闭按钮始终可见。
   ============================================================ */
.map-info .mi-quick { margin-top: 10px; padding-top: 9px; border-top: 1px dashed color-mix(in srgb, var(--c-luodian) 28.0%, transparent); }
.map-info .mi-quick-h {
  font-size: 12.5px; font-weight: 600; color: var(--tx-teal); margin-bottom: 7px; letter-spacing: .5px;
  /* v1.1.0.37：与「周围水源」一致，区块小标题居中 */
  text-align: center;
}
.map-info .mi-quick-btns {
  display: flex; flex-wrap: nowrap; gap: 5px; justify-content: center;
}
/* v1.1.0.39：三个按钮**等宽排成一行**，不再每行挤两个、最后一行落单。
   等分 + min-width:0 + 文字省略 → 任何分辨率下都只有一行，且不会溢出卡片。 */
.map-info .mi-qbtn {
  display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  flex: 1 1 0; min-width: 0;
  padding: 5px 6px; font-size: 12px; line-height: 1.4; cursor: pointer;
  color: var(--txt); background: color-mix(in srgb, var(--c-luodian) 9.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--c-luodian) 20.0%, transparent); border-radius: 6px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.map-info .mi-qbtn .mi-qbtn-t { overflow: hidden; text-overflow: ellipsis; }
.map-info .mi-qbtn:hover:not(:disabled) {
  background: color-mix(in srgb, var(--c-luodian) 16.0%, transparent); color: var(--txt); border-color: color-mix(in srgb, var(--c-luodian) 40.0%, transparent);
}
.map-info .mi-qbtn:focus-visible { outline: 2px solid var(--c-luodian); outline-offset: 1px; }
/* 未填写：禁用态（v1.1.0.37）。用 opacity 统一压暗，不改底色/边框，
   这样七个按钮的「框」看起来依然一致，只是不能点。 */
.map-info .mi-qbtn:disabled { opacity: .45; cursor: not-allowed; }
.map-info .mi-qbtn:disabled:hover { background: color-mix(in srgb, var(--c-luodian) 9.0%, transparent); color: var(--txt); border-color: color-mix(in srgb, var(--c-luodian) 20.0%, transparent); }
/* v1.1.0.36 移除了「未填 / 图」文字角标；v1.1.0.37 起未填写项直接禁用，
   由浏览器与管理端 :disabled 样式表达，不再需要额外的 .empty 变体。 */

/* 资料内容弹窗（居中于地图容器） */
/* v1.1.0.177：**按模块分作用域** ——
   v1.1.0.175 把遮罩加深（58%→82%、blur 2→6px）、面板改不透明实色，
   那是为**模块二**的楼层平面图弹窗做的（主题色透进弹窗导致泛红、平面图判读受影响）。
   现在模块一已恢复旧形态（资料速览弹窗），它应当**沿用 v1.1.0.174 的旧观感**，
   故：基础规则回退为旧值，加深版只作用于 `body.embed-map`（模块二）。 */
.mi-qmask {
  position: absolute; inset: 0; z-index: 40;
  display: flex; align-items: center; justify-content: center; padding: 16px;
  background: color-mix(in srgb, var(--panel) 58.0%, transparent); backdrop-filter: blur(2px);
  opacity: 0; visibility: hidden; transition: opacity .16s ease;
}
.mi-qmask.show { opacity: 1; visibility: visible; }
.mi-qmodal {
  width: min(620px, 100%); max-height: 100%;
  display: flex; flex-direction: column;
  background: linear-gradient(180deg, color-mix(in srgb, var(--panel) 98.0%, transparent), color-mix(in srgb, var(--panel) 98.0%, transparent));
  border: 1px solid color-mix(in srgb, var(--c-luodian) 45.0%, transparent); border-radius: 12px;
  box-shadow: 0 16px 44px color-mix(in srgb, var(--txt-2) 60.0%, transparent); color: var(--txt);
  transform: translateY(-6px); transition: transform .16s ease;
}
/* 模块二（作战地图）：平面图弹窗用加深遮罩 + 不透明实色面板 */
body.embed-map .mi-qmask {
  background: color-mix(in srgb, var(--panel) 82.0%, transparent); backdrop-filter: blur(6px);
}
body.embed-map .mi-qmodal { background: var(--panel); }
.mi-qmask.show .mi-qmodal { transform: none; }
.mi-qhead {
  display: flex; align-items: center; gap: 10px; flex: none;
  padding: 11px 12px 11px 15px; border-bottom: 1px solid color-mix(in srgb, var(--c-luodian) 22.0%, transparent);
}
.mi-qtitle { font-size: 14px; font-weight: 600; color: var(--tx-teal); flex: 1; min-width: 0; }
.mi-qclose {
  flex: none; width: 24px; height: 24px; line-height: 22px; text-align: center;
  border: none; background: transparent; color: var(--txt); font-size: 20px;
  cursor: pointer; border-radius: 5px;
}
.mi-qclose:hover { color: var(--txt); background: color-mix(in srgb, var(--panel-2) 8.0%, transparent); }
/* 正文独立滚动：标题与关闭按钮不会被长内容顶出视野 */
.mi-qbody {
  flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch; padding: 14px 16px 18px;
}
.mi-qtext {
  font-size: 13.5px; line-height: 1.95; color: var(--txt); white-space: pre-wrap;
  word-break: break-word;
}
.mi-qempty {
  padding: 22px 8px; text-align: center; font-size: 13px; color: var(--txt);
  background: color-mix(in srgb, var(--panel) 20.0%, transparent); border-radius: 8px;
}
/* 「功能分区」弹窗的分层内容（v1.1.0.38）：每层 = 小标题 + 内容块，层间留白分隔 */
.mi-qlayers { display: flex; flex-direction: column; gap: 10px; }
.mi-qlayer {
  border: 1px solid color-mix(in srgb, var(--c-luodian) 22.0%, transparent); border-radius: 8px;
  background: color-mix(in srgb, var(--panel) 16.0%, transparent); overflow: hidden;
}
.mi-qlayer-t {
  padding: 6px 11px; font-size: 12.5px; font-weight: 600; color: var(--tx-teal);
  background: color-mix(in srgb, var(--c-luodian) 10.0%, transparent); border-bottom: 1px solid color-mix(in srgb, var(--c-luodian) 18.0%, transparent);
  letter-spacing: .4px;
}
.mi-qlayer-c {
  padding: 9px 11px; font-size: 13px; line-height: 1.9; color: var(--txt);
  white-space: pre-wrap; word-break: break-word;
}
/* ============ 页脚 ============
   v1.1.0.40 修复：.dash-foot / .powered-by / .pb-ico / .pb-arrow **此前完全没有基础样式**
   （只在响应式媒体查询里出现过一条 .dash-foot 的 margin），导致：
     · 页脚没有 flex 布局，三段文字竖着堆；
     · 两个内联 SVG（盾牌 + ↗ 箭头）只有 viewBox 没有尺寸，
       在 flex 容器里按 SVG 默认规则撑满 → 页脚下方冒出一个巨大的蓝色箭头色块。
   根因是「inline SVG 给了 viewBox 就以为会被限高」—— 必须显式给 width/height。
*/
.dash-foot {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  padding: 11px 16px 14px; font-size: 12.5px; color: var(--sub);
  border-top: 1px solid var(--line);
}
.powered-by {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 4px 11px; font-size: 12px; text-decoration: none;
  color: var(--sub); border: 1px solid var(--line); border-radius: 999px;
  transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.powered-by:hover { color: var(--txt); border-color: color-mix(in srgb, var(--c-luodian) 50.0%, transparent); background: color-mix(in srgb, var(--c-luodian) 8.0%, transparent); }
.powered-by b { color: var(--txt); font-weight: 600; }
.powered-by em { font-style: normal; font-size: 11.5px; opacity: .75; }
/* 关键：SVG 必须显式限尺寸，否则会撑成巨大色块 */
.pb-ico, .pb-arrow { width: 14px; height: 14px; flex: none; }
.pb-arrow { opacity: .55; }

/* ============ 响应式 ============ */
@media (max-width: 1500px) {
  .dash-body { grid-template-columns: 268px 1fr 288px; }
  .kpi-grid { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 1180px) {
  .dash-body { grid-template-columns: 1fr 1fr; }
  .dash-col.center { grid-column: 1 / -1; order: -1; }
  .map-wrap { height: 420px; }
}
@media (max-width: 768px) {
  .dash-top { height: auto; padding: 10px 14px; flex-wrap: wrap; gap: 8px; }
  .dash-title h1 { font-size: 15px; white-space: normal; }
  .dash-clock .t { font-size: 16px; }
  .dash-body { grid-template-columns: 1fr; padding: 10px 10px 0; gap: 10px; }
  .kpi-grid { grid-template-columns: repeat(2, 1fr); padding: 10px 10px 0; gap: 9px; }
  .kpi { padding: 10px 11px; }
  .kpi .val { font-size: 21px; }
  /* 手机上一张图要留出「图层开关 + 搜索框 + 信息卡」的竖向空间，320px 太挤：
     信息卡会被裁掉下半截，这里放宽到 400px。 */
  .map-wrap { height: 400px; }
  .chart-box { height: 150px; }
  .dash-foot { margin: 10px 10px 0; font-size: 11px; }
}

/* 窄屏：图层按钮收窄到左侧区域（v1.1.0.101：统一到左侧，搜索框在右侧不冲突），
   避免其换行后与右侧搜索框横向重叠。 */
@media (max-width: 700px) {
  .map-search { width: min(248px, calc(100% - 20px)); }
  .map-layers { left: 10px; right: auto; max-width: calc(100% - 20px); }
}
@media (max-width: 520px) {
  /* 手机竖屏：搜索框不再拉满整行（用户反馈「显示过长」），
     改为右侧固定宽度的紧凑输入条，定位按钮紧随其右；
     图层按钮下移一行（避免下拉菜单压住搜索框）但仍贴**左侧**，与地图上边界对齐。
     ⚠ 关键：图层下拉菜单（.layer-menu）从按钮下方展开，若与搜索框同处顶部一行，
     下拉框会与搜索框重叠（用户反馈「地图内按钮下拉框与搜索框重叠」）。
     手机端信息卡是底部抽屉，不与下移后的按钮冲突。 */
  .map-search { left: auto; right: 10px; width: min(252px, calc(100% - 20px)); }
  .map-layers { top: 52px; left: 10px; right: auto; max-width: calc(100% - 20px); }
  .map-search .ms-input { height: 32px; }
  .map-search .ms-loc { width: 32px; height: 32px; }
  /* 下拉结果别顶到地图外 */
  .map-search .ms-results { max-height: 42vh; }
  /* 信息卡改为「底部抽屉」：从地图底部向上撑开，标题永远可见，
     内容超出时卡内滚动 —— 彻底解决「显示不完全」。 */
  .map-wrap { height: 62vh; min-height: 360px; }
  .map-info {
    left: 10px; right: 10px; width: auto; top: auto; bottom: 10px;
    max-height: 62%; border-radius: 12px;
  }
  .map-info .mi-title { font-size: 14.5px; }
  .map-shell .xffa-map-controls { top: 96px; }
  .map-shell .xffa-north { top: 214px; }
}

/* v1.1.0.101：横屏矮屏（手机横放 / 窗口很矮）——控件不重叠、卡片不超屏 */
@media (orientation: landscape) and (max-height: 560px) {
  .map-info { top: 46px; width: 260px; max-height: calc(100% - 58px); padding: 12px 14px 14px; }
  .map-info .mi-title { font-size: 15px; margin-bottom: 9px; }
  .map-info .mi-row { font-size: 12.5px; margin-bottom: 7px; padding-bottom: 6px; }
  .map-layers { top: 8px; gap: 6px; }
  .map-layers button { padding: 3px 9px; font-size: 11.5px; }
}

/* ============ v1.1.0.142：主题色落到实处（前台作用域，仅作用于 data-page-scope="frontend"）============
   与后台 v1.1.0.141 同规则：整页背景 / 顶栏 = 当前色卡色号精确 hex（--scheme-hex，零色差）；
   内容卡片 = 同色系毛玻璃（--glass）；文字按对比度取白/深墨（--on-bg / --glass-text）。
   地图/图表内部自绘色不受 --bg/--panel 改动影响（作用域只重渲染结构与卡片容器）。 */
body[data-page-scope="frontend"] .dash {
  background: var(--scheme-hex);
}

/* 顶栏：实色 = 色卡色号原色，文字用其对比色；sticky 以支撑滚动渐透 */
body[data-page-scope="frontend"] .dash-top {
  position: sticky; top: 0; z-index: 50;
  background-color: var(--scheme-hex);
  background-image: none;
  border-bottom: 1px solid rgba(0,0,0,.16);
  color: var(--on-bg);
}
body[data-page-scope="frontend"] .dash-top::after { background: rgba(255,255,255,.35); }
body[data-page-scope="frontend"] .dash-title h1,
body[data-page-scope="frontend"] .dash-title p,
body[data-page-scope="frontend"] .dash-top-right .hide-sm,
body[data-page-scope="frontend"] .dash-top-right .u-name,
body[data-page-scope="frontend"] .dash-top-right .u-role,
body[data-page-scope="frontend"] .dash-clock .t,
body[data-page-scope="frontend"] .dash-clock .d { color: var(--on-bg); }
body[data-page-scope="frontend"] .dash-title p { color: color-mix(in srgb, var(--on-bg) 82%, transparent); }
body[data-page-scope="frontend"] .dash-top-right .hide-sm small { color: color-mix(in srgb, var(--on-bg) 80%, transparent); }
/* 顶栏按钮：反色处理（同后台 .adm-top 思路） */
body[data-page-scope="frontend"] .dash-top-right .btn {
  background: color-mix(in srgb, var(--on-bg) 20%, transparent);
  border-color: color-mix(in srgb, var(--on-bg) 55%, transparent);
  color: var(--on-bg);
}
body[data-page-scope="frontend"] .dash-top-right .btn:hover { background: color-mix(in srgb, var(--on-bg) 34%, transparent); }
body[data-page-scope="frontend"] .dash-top-right .btn-primary {
  background: var(--on-bg); border-color: var(--on-bg);
  color: var(--scheme-hex); font-weight: 700;
}
body[data-page-scope="frontend"] .dash-top-right .btn-primary:hover { background: color-mix(in srgb, var(--on-bg) 86%, var(--scheme-hex)); }
/* 右上角角色卡：文字随顶栏底色取对比色 */
body[data-page-scope="frontend"] .dash-top .user-chip,
body[data-page-scope="frontend"] .dash-top .user-chip * { color: var(--on-bg); }
body[data-page-scope="frontend"] .dash-top .user-chip > div > div:last-child { opacity: .82; }

/* 内容卡片：同色系毛玻璃（与后台一致） */
body[data-page-scope="frontend"] .panel {
  --txt: var(--glass-text); --txt-2: var(--glass-text-2, #5b5249); --sub: var(--glass-sub, #6b6259);
  background: var(--glass);
  color: var(--glass-text);
  border: 1px solid var(--glass-border);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  box-shadow: 0 8px 26px rgba(0,0,0,.18);
}
body[data-page-scope="frontend"] .panel-head { border-bottom-color: rgba(46,42,39,.12); }
body[data-page-scope="frontend"] .panel-head .sub { color: var(--glass-sub, #6b6259); }

/* ============================================================
   重点单位信息卡 · 楼层平面图区域（v1.1.0.175）
   ------------------------------------------------------------
   需求：信息卡精简后，原「周围水源 / 信息速览」位置改为楼层平面图 ——
   楼层按钮条 + 点击弹窗看图。
   风格沿用同卡片的 .mi-water-* 视觉语言（虚线分隔 + 居中小标题 +
   半透明胶囊按钮），保证与卡片整体观感一致。
   ============================================================ */
.map-info .mi-plans {
  margin-top: 10px; padding-top: 9px;
  border-top: 1px dashed color-mix(in srgb, var(--c-luodian) 28.0%, transparent);
}
.map-info .mi-plans-h {
  font-size: 12.5px; font-weight: 600; color: var(--tx-teal); margin-bottom: 7px; letter-spacing: .5px;
  text-align: center;
}
.map-info .mi-plans-btns { display: flex; flex-wrap: wrap; gap: 6px; }
.map-info .mi-pbtn {
  flex: 1 1 auto; min-width: 62px; padding: 6px 0; font-size: 12px; cursor: pointer; text-align: center;
  color: var(--txt); background: color-mix(in srgb, var(--c-luodian) 10.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--c-luodian) 38.0%, transparent); border-radius: 7px;
  transition: background .15s ease, color .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.map-info .mi-pbtn:hover {
  background: color-mix(in srgb, var(--c-luodian) 22.0%, transparent);
  border-color: color-mix(in srgb, var(--c-luodian) 60.0%, transparent);
}
.map-info .mi-pbtn.active {
  background: color-mix(in srgb, var(--c-luodian) 92.0%, transparent); color: var(--txt-2); font-weight: 700;
  border-color: color-mix(in srgb, var(--c-luodian) 100.0%, transparent);
  box-shadow: 0 2px 8px color-mix(in srgb, var(--txt-2) 42.0%, transparent);
}
.map-info .mi-plans-tip {
  /* v1.1.0.175：提示文字用 --txt-2（原 --sub 在朱漆红等深色主题下对比偏低、
     挤在窄框里几乎看不清） */
  margin-top: 7px; font-size: 11.5px; color: var(--txt-2); text-align: center; line-height: 1.45;
}
.map-info .mi-plans-empty {
  margin-top: 7px; font-size: 12px; color: var(--txt); line-height: 1.45; text-align: center;
  background: color-mix(in srgb, var(--panel) 22.0%, transparent); border-radius: 6px; padding: 6px 8px;
}

/* ---- v1.1.0.188：力量调派 / 详细任务分工已移出模块二信息卡
   （改在指挥调度中心右侧面板与详细分工页展示），相关样式随之下线；
   仅保留 .mi-doc-list / .mi-doc（任务分工文件的查看入口，后端接口仍在）。 */
.map-info .mi-doc-list {
  display: flex; flex-direction: column; gap: 7px; margin-top: 7px;
}
.map-info .mi-doc {
  display: flex; align-items: center; gap: 8px; text-decoration: none;
  padding: 7px 9px; border-radius: 7px;
  background: color-mix(in srgb, var(--panel) 20.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--line) 70.0%, transparent);
}
.map-info .mi-doc-n { font-size: 12px; color: var(--txt); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.map-info .mi-doc-s { font-size: 11px; color: var(--txt-2); flex: none; }
.map-info .mi-doc-go { font-size: 11.5px; color: var(--c-luodian); flex: none; }
.map-info .mi-doc:hover { border-color: var(--c-luodian); }

/* ---- 全景信息区块（v1.1.0.179）----
   与「楼层平面图」同一套视觉语言：虚线分隔 + 居中小标题 + 每行一条。
   每行左侧是全景分类、右侧是「打开全景 ›」链接。 */
.map-info .mi-pano {
  margin-top: 10px; padding-top: 9px;
  border-top: 1px dashed color-mix(in srgb, var(--c-luodian) 28.0%, transparent);
}
.map-info .mi-pano-h {
  font-size: 12.5px; font-weight: 600; color: var(--tx-teal); margin-bottom: 7px; letter-spacing: .5px;
  text-align: center;
}
.map-info .mi-pano-list { display: flex; flex-direction: column; gap: 5px; }
.map-info .mi-pano-row {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 5px 9px; border-radius: 7px;
  background: color-mix(in srgb, var(--panel) 22.0%, transparent);
  font-size: 12.5px;
}
.map-info .mi-pano-cat {
  color: var(--txt); font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.map-info .mi-pano-row .mi-link { flex: none; }

/* ---- 平面图弹窗（复用 .mi-qmask / .mi-qmodal 浮层语言） ---- */
/* v1.1.0.178：**视口级浮层** —— 原先弹窗挂在 #mainMap 内（position:absolute），
   尺寸与位置被地图框约束（手机上地图框很窄 → 弹窗挤成一条）。
   现挂到 body（position:fixed），并按手机 / 平板 / 电脑三端自适应。 */
.mi-pmask {
  position: fixed; inset: 0; z-index: 1200;
  padding: 3vh 3vw;
}
.mi-pmodal {
  width: min(94vw, 1180px);
  height: min(90vh, 900px);
  max-height: min(90vh, 900px);
}
/* 平板：铺满可用区域，保留外边距 */
@media (max-width: 1024px) {
  .mi-pmask { padding: 14px; }
  .mi-pmodal {
    width: calc(100vw - 28px);
    height: calc(100vh - 28px);
    max-height: calc(100vh - 28px);
  }
}
/* 手机：近全屏 + 楼层按钮可横向滚动（不再挤成多行） */
@media (max-width: 640px) {
  .mi-pmask { padding: 8px; }
  .mi-pmodal {
    width: calc(100vw - 16px);
    height: calc(100vh - 16px);
    max-height: calc(100vh - 16px);
    border-radius: 10px;
  }
  .mi-pfloors { padding: 8px 10px 0; flex-wrap: nowrap; overflow-x: auto; }
  .mi-pfloor-btn { flex: none; }
  .mi-phint { padding: 6px 10px 8px; font-size: 11px; }
  .mi-qhead { padding: 8px 8px 8px 12px; gap: 6px; }
  .mi-qtitle { font-size: 13px; }
  .mi-pact { min-width: 30px; height: 28px; line-height: 26px; }
}
.mi-pfloors {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 10px 18px 0;
  flex: none;
}
.mi-pfloors:empty { display: none; }
.mi-pfloor-btn {
  padding: 5px 12px; font-size: 12px; cursor: pointer; border-radius: 7px;
  color: var(--txt); background: color-mix(in srgb, var(--c-luodian) 10.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--c-luodian) 38.0%, transparent);
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.mi-pfloor-btn:hover { background: color-mix(in srgb, var(--c-luodian) 22.0%, transparent); }
.mi-pfloor-btn.active {
  background: color-mix(in srgb, var(--c-luodian) 92.0%, transparent); color: var(--txt-2); font-weight: 700;
  border-color: color-mix(in srgb, var(--c-luodian) 100.0%, transparent);
}
/* 顶部工具条：缩放按钮 + 比例 + 适应窗口 */
.mi-ptools { display: flex; align-items: center; gap: 6px; flex: none; }
.mi-pact {
  min-width: 26px; height: 24px; line-height: 22px; text-align: center; cursor: pointer;
  padding: 0 7px; font-size: 13px; border-radius: 6px;
  color: var(--txt); background: color-mix(in srgb, var(--panel-2) 70.0%, transparent);
  border: 1px solid color-mix(in srgb, var(--c-luodian) 32.0%, transparent);
  transition: background .15s ease, border-color .15s ease;
}
.mi-pact:hover { background: color-mix(in srgb, var(--c-luodian) 20.0%, transparent); }
.mi-pact.wide { font-size: 12px; }
.mi-pzoom {
  min-width: 46px; text-align: center; font-size: 11.5px; color: var(--txt-2);
  font-variant-numeric: tabular-nums;
}
.mi-pbody { padding-top: 12px; display: flex; min-height: 0; }
.mi-pimg-wrap {
  position: relative; flex: 1; min-width: 0; min-height: 200px;
  /* 平面图判读需要纯净底色 → 用 --bg 实色，不用半透明（否则主题色会染到图纸上） */
  background: var(--bg);
  border-radius: 8px; overflow: hidden;
}
/* 缩放舞台：图片按原始像素摆放，用 transform 控制缩放与平移 */
.mi-pstage {
  position: absolute; inset: 0; overflow: hidden; cursor: grab;
  touch-action: none;
}
.mi-pstage.dragging { cursor: grabbing; }
.mi-pimg {
  position: absolute; left: 0; top: 0;
  transform-origin: 0 0; max-width: none; max-height: none;
  user-select: none; -webkit-user-drag: none;
}
/* 加载失败：给出明确提示而不是一片空白 */
.mi-pimg-wrap.img-fail .mi-pstage { display: none; }
.mi-pimg-tip { display: none; }
.mi-pimg-wrap.img-fail .mi-pimg-tip {
  display: block; font-size: 12.5px; color: var(--tx-coral); text-align: center; line-height: 1.6;
  padding: 30px 12px;
}
/* 底部操作提示 */
.mi-phint {
  flex: none; padding: 8px 18px 12px; font-size: 11.5px; color: var(--txt-2);
  text-align: center; opacity: .85;
}
