.nav-btn { min-height: 62px; padding: 8px 4px; }
.nav-icon { margin-bottom: 4px; font-size: calc(15px * var(--fs, 1)); }
.nav-label { font-size: calc(10px * var(--fs, 1)); }

.header-meta {
  flex-wrap: nowrap;
  gap: 14px;
  min-width: 0;
  white-space: nowrap;
}
.ghost-mini {
  flex-shrink: 0;
  color: var(--cyan);
  border: 1px solid var(--line-strong);
  background: transparent;
  padding: 5px 10px;
  border-radius: 3px;
  cursor: pointer;
  font-size: calc(11px * var(--fs, 1));
  white-space: nowrap;
}
.chat-fab {
  display: none;
}

html.jwgy-authed .login-mask {
  display: none !important;
}
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) #amapContainer,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .amap-logo,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .amap-copyright,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .amap-logo img,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) a[href*="amap.com"],
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) a[href*="autonavi.com"],
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .app,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .chat-fab,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .chat-layer,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) .settings-mask,
html:not(.jwgy-authed) body:has(#loginMask:not(.hidden)) #eventDrawer {
  display: none !important;
  visibility: hidden !important;
  opacity: 0 !important;
  pointer-events: none !important;
}
.login-mask {
  position: absolute;
  inset: 0;
  z-index: 20000;
  overflow: hidden;
  display: grid;
  place-items: center;
  color: #e8f4ff;
  background:
    radial-gradient(ellipse 80% 50% at 50% 110%, rgba(255, 122, 48, 0.16), transparent 58%),
    radial-gradient(circle at 18% 18%, rgba(59, 200, 255, 0.18), transparent 32%),
    radial-gradient(circle at 86% 12%, rgba(247, 201, 72, 0.08), transparent 26%),
    linear-gradient(180deg, #02060c 0%, #06131f 42%, #071018 100%);
}
.login-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
}
.login-aurora,
.login-grid,
.login-scan,
.login-ridge,
.login-vignette,
.login-beam {
  position: absolute;
  inset: 0;
  pointer-events: none;
}
.login-aurora {
  background:
    radial-gradient(ellipse 80% 42% at 50% 0%, rgba(59, 200, 255, 0.38), transparent 70%),
    radial-gradient(ellipse 46% 30% at 72% 82%, rgba(255, 122, 48, 0.22), transparent 70%),
    radial-gradient(circle at 50% 48%, rgba(59, 200, 255, 0.14), transparent 42%);
  animation: loginAurora 9s ease-in-out infinite alternate;
}
.login-grid {
  background-image:
    linear-gradient(rgba(59, 200, 255, 0.18) 1px, transparent 1px),
    linear-gradient(90deg, rgba(59, 200, 255, 0.18) 1px, transparent 1px);
  background-size: 56px 56px;
  height: 70%;
  top: auto;
  transform: perspective(620px) rotateX(64deg) translateY(18%);
  transform-origin: center bottom;
  mask-image: linear-gradient(180deg, transparent 0%, #000 28%, #000 100%);
  animation: loginGrid 16s linear infinite;
}
.login-scan {
  background: repeating-linear-gradient(
    180deg,
    rgba(232, 244, 255, 0.05) 0 1px,
    transparent 1px 3px
  );
  mix-blend-mode: screen;
  opacity: 0.45;
}
.login-beam {
  background: linear-gradient(115deg, transparent 42%, rgba(59, 200, 255, 0.08) 50%, transparent 58%);
  animation: loginBeam 7.5s ease-in-out infinite;
}
.login-ridge {
  background:
    linear-gradient(180deg, transparent 48%, rgba(2, 6, 12, 0.55) 78%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 320' preserveAspectRatio='none'%3E%3Cpath fill='%230a2436' d='M0 224L80 208C160 192 320 160 480 170.7C640 181 800 235 960 240C1120 245 1280 203 1360 181.3L1440 160V320H0Z'/%3E%3Cpath fill='none' stroke='%233bc8ff' stroke-opacity='.85' stroke-width='2' d='M0 188C180 140 280 248 470 210C660 172 720 96 900 128C1080 160 1180 220 1440 150'/%3E%3Cpath fill='none' stroke='%23ff7a30' stroke-opacity='.8' stroke-width='1.8' d='M0 220C220 200 340 140 520 168C700 196 780 250 980 210C1180 170 1280 150 1440 190'/%3E%3C/svg%3E")
      no-repeat bottom / 100% 52%;
}
.login-vignette {
  background: radial-gradient(ellipse at center, transparent 36%, rgba(2, 6, 12, 0.72) 100%);
}
.login-radar {
  position: absolute;
  width: min(52%, 640px);
  aspect-ratio: 1;
  right: -6%;
  bottom: -10%;
  border-radius: 50%;
  border: 1px solid rgba(59, 200, 255, 0.32);
  background:
    repeating-radial-gradient(circle, transparent 0 42px, rgba(59, 200, 255, 0.16) 43px 44px),
    conic-gradient(from 0deg, transparent 0 70%, rgba(59, 200, 255, 0.42) 86%, transparent 100%);
  animation: loginRadar 5.5s linear infinite;
  pointer-events: none;
  opacity: 0.88;
  box-shadow: 0 0 80px rgba(59, 200, 255, 0.12);
}
.login-radar::after {
  content: "";
  position: absolute;
  inset: 22%;
  border-radius: 50%;
  border: 1px solid rgba(59, 200, 255, 0.16);
}
.login-rings {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 2;
  width: min(720px, 88%);
  aspect-ratio: 1;
  transform: translate(-50%, -50%);
  pointer-events: none;
}
.login-rings i {
  position: absolute;
  inset: 0;
  border: 1px solid rgba(59, 200, 255, 0.16);
  border-radius: 50%;
  animation: loginRing 10s linear infinite;
}
.login-rings i:nth-child(2) { inset: 9%; animation-duration: 14s; animation-direction: reverse; border-color: rgba(255, 122, 48, 0.18); }
.login-rings i:nth-child(3) { inset: 18%; animation-duration: 8s; border-style: dashed; }
.login-ticker {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 18px;
  z-index: 2;
  overflow: hidden;
  height: 18px;
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 1.2px;
  color: rgba(127, 227, 255, 0.78);
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.login-ticker span {
  display: inline-block;
  white-space: nowrap;
  padding-left: 100%;
  animation: loginTicker 36s linear infinite;
}
.login-card {
  position: relative;
  z-index: 3;
  width: min(480px, 92%);
  padding: 40px 36px 28px;
  border: 1px solid rgba(127, 227, 255, 0.42);
  background: linear-gradient(180deg, rgba(8, 28, 46, 0.88), rgba(5, 14, 24, 0.94));
  box-shadow:
    0 0 0 1px rgba(255, 122, 48, 0.16) inset,
    0 28px 80px rgba(0, 0, 0, 0.5),
    0 0 120px rgba(59, 200, 255, 0.22);
  backdrop-filter: blur(18px);
  overflow: hidden;
}
.login-card::before {
  content: "";
  position: absolute;
  left: -20%;
  top: 0;
  width: 40%;
  height: 2px;
  background: linear-gradient(90deg, transparent, #3bc8ff, #ff7a30, transparent);
  animation: loginSweep 3.6s ease-in-out infinite;
}
.login-card-glow {
  position: absolute;
  inset: -40% -20% auto;
  height: 140px;
  background: radial-gradient(circle, rgba(59, 200, 255, 0.22), transparent 68%);
  pointer-events: none;
}
.login-brand {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: 16px;
}
.login-card img {
  width: 58px;
  height: 58px;
  filter: drop-shadow(0 0 16px rgba(59, 200, 255, 0.45));
}
.login-brand em {
  display: block;
  margin-bottom: 4px;
  color: #7fe3ff;
  font-size: calc(10px * var(--fs, 1));
  font-style: normal;
  letter-spacing: 3px;
}
.login-card h1 {
  margin: 0;
  font-size: calc(26px * var(--fs, 1));
  letter-spacing: 3px;
  font-weight: 700;
}
.login-lead {
  margin: 0 0 22px;
  color: rgba(186, 214, 232, 0.82);
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.7;
}
.login-card label {
  display: block;
  margin-bottom: 6px;
  color: rgba(186, 214, 232, 0.7);
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 1px;
}
.login-card input {
  width: 100%;
  margin-bottom: 16px;
  padding: 12px 14px;
  color: #e8f4ff;
  border: 1px solid rgba(127, 227, 255, 0.28);
  background: rgba(2, 8, 16, 0.72);
  outline: none;
  letter-spacing: 2px;
}
.login-card input:focus {
  border-color: #3bc8ff;
  box-shadow: 0 0 0 3px rgba(59, 200, 255, 0.14);
}
.login-card .primary-btn {
  position: relative;
  overflow: hidden;
  padding: 12px 12px;
  font-weight: 700;
  letter-spacing: 2px;
  box-shadow: 0 0 24px rgba(59, 200, 255, 0.22);
}
.login-card .primary-btn::after {
  content: "";
  position: absolute;
  inset: 0 auto 0 -40%;
  width: 30%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.35), transparent);
  animation: loginBtnShine 2.8s ease-in-out infinite;
  pointer-events: none;
}
.login-error { min-height: 18px; color: #ff6b6b; font-size: calc(12px * var(--fs, 1)); }
.login-hint { margin-top: 10px; color: rgba(141, 167, 189, 0.72); font-size: calc(10px * var(--fs, 1)); }
.login-status {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
  color: rgba(127, 227, 255, 0.82);
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 0.6px;
}
.login-status i {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #3dff9a;
  box-shadow: 0 0 10px #3dff9a;
  animation: loginPulse 1.4s ease-in-out infinite;
}
.login-mask.login-unlock .login-card {
  animation: loginGrant 0.9s ease forwards;
}
.login-mask.login-unlock::after {
  content: "ACCESS GRANTED";
  position: absolute;
  z-index: 5;
  letter-spacing: 8px;
  color: #3dff9a;
  font-size: calc(13px * var(--fs, 1));
  text-shadow: 0 0 18px rgba(61, 255, 154, 0.7);
  animation: loginGrantText 0.9s ease forwards;
}
@keyframes loginAurora { to { opacity: 0.72; transform: translateY(-10px) scale(1.04); } }
@keyframes loginGrid { to { background-position: 48px 48px; } }
@keyframes loginBeam { 0%, 100% { transform: translateX(-12%); } 50% { transform: translateX(12%); } }
@keyframes loginRadar { to { transform: rotate(360deg); } }
@keyframes loginSweep { 0% { left: -30%; } 100% { left: 110%; } }
@keyframes loginTicker { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
@keyframes loginBtnShine { 0%, 40% { transform: translateX(0); } 100% { transform: translateX(420%); } }
@keyframes loginPulse { 50% { opacity: 0.35; transform: scale(0.8); } }
@keyframes loginGrant {
  0% { opacity: 1; transform: scale(1); filter: brightness(1); }
  55% { opacity: 1; transform: scale(1.03); filter: brightness(1.35); }
  100% { opacity: 0; transform: scale(1.08); filter: brightness(1.8); }
}
@keyframes loginGrantText { 0% { opacity: 0; } 40% { opacity: 1; } 100% { opacity: 0; } }
@keyframes loginRing { to { transform: rotate(360deg); } }
@media (max-width: 820px) {
  .login-radar { display: none; }
}

.three-col, .two-col {
  display: grid;
  gap: 12px;
  height: 100%;
  min-height: 0;
}
.three-col { grid-template-columns: 1fr 1.2fr 1fr; }
.acquire-grid { grid-template-columns: 2fr 3fr 5fr; }
#acquire .panel {
  display: flex;
  flex-direction: column;
  min-height: 0;
}
#acquire .scroll-pane {
  flex: 1;
  max-height: none;
}

/* AI 获客 · 关键词分类：按"地质灾害类型 / 行业领域 / 防护形式"分组 */
#keywordList {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.kw-group {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.kw-group-head {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--cyan);
  font-size: calc(10px * var(--fs, 1));
  letter-spacing: 0.14em;
  opacity: 0.9;
}
.kw-group-head::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--line);
}
.kw-cards {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 5px;
}
.mini-card.kw-card {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 6px;
  padding: 6px 8px;
  min-width: 0;
}
.mini-card.kw-card b {
  margin-bottom: 0;
  font-size: calc(11.5px * var(--fs, 1));
  line-height: 1.4;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mini-card.kw-card em {
  flex: 0 0 auto;
  font-style: normal;
  font-size: calc(11px * var(--fs, 1));
  font-weight: 600;
  color: var(--cyan);
  font-variant-numeric: tabular-nums;
}
.mini-card.kw-card:hover {
  border-color: rgba(59, 200, 255, 0.45);
}
.mini-card.kw-card.kw-empty {
  border-style: dashed;
  cursor: default;
}
.mini-card.kw-card.active em {
  color: #fff;
}
.mini-card.kw-card.kw-empty b {
  opacity: 0.55;
}
.mini-card.kw-card.kw-empty em {
  color: var(--muted);
  opacity: 0.6;
}
.kw-all .mini-card.kw-card {
  border-color: var(--line-strong);
  background: rgba(59, 200, 255, 0.05);
}
.acquire-scan-bar { padding: 10px 12px 12px; margin-top: 0; }
#scanBtn.scan-done,
.ghost-btn.scan-done { color: var(--green); border-color: rgba(43, 214, 162, 0.55); }
#scanBtn:disabled { opacity: 0.7; cursor: wait; }
.solution-card .ghost-btn:disabled { opacity: 0.85; cursor: default; }
.mini-card.scanning {
  animation: acquireScan 0.7s ease-in-out infinite;
}
@keyframes acquireScan {
  50% {
    border-color: rgba(59, 200, 255, 0.9);
    background: rgba(59, 200, 255, 0.12);
  }
}
.hot-card.fresh {
  border-color: rgba(43, 214, 162, 0.7);
  background: rgba(43, 214, 162, 0.08);
}
.hot-card .tier { color: var(--cyan); }
.hot-card.fresh .tier { color: var(--green); }
.solution-card {
  padding: 12px;
  border: 1px solid var(--line-strong);
  background: rgba(20, 50, 76, 0.28);
}
.solution-card h3 { margin: 8px 0; font-size: calc(16px * var(--fs, 1)); }
.solution-card p { margin: 6px 0; color: var(--muted); font-size: calc(12px * var(--fs, 1)); line-height: 1.6; }
.solution-card .sol-row { margin: 8px 0; font-size: calc(12px * var(--fs, 1)); line-height: 1.6; }
.solution-card .sol-row b { color: var(--text); }
.sol-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--line);
}
.sol-link {
  padding: 0;
  border: 0;
  background: none;
  color: var(--cyan);
  font-size: calc(12px * var(--fs, 1));
  cursor: pointer;
}
.sol-link + .sol-link::before {
  content: "";
  display: inline-block;
  width: 1px;
  height: 11px;
  margin: 0 12px;
  background: var(--line-strong);
  vertical-align: -1px;
}
.sol-link:hover { color: #7fe3ff; }
.scheme-flow {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 12px;
}
.scheme-block {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: start;
  gap: 8px 14px;
  padding: 12px 12px 12px 13px;
  border: 1px solid var(--line);
  border-left: 2px solid rgba(59, 200, 255, 0.5);
  background: rgba(7, 18, 30, 0.55);
}
.geo-qa-item {
  position: relative;
  display: block;
  width: 100%;
  padding: 8px 10px;
  border: 1px solid var(--line);
  background: rgba(5, 17, 29, 0.55);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.55;
}
.geo-qa-body {
  min-width: 0;
  width: 100%;
  padding-right: 72px;
}
.geo-qa-q,
.geo-qa-a {
  display: block;
  width: 100%;
  max-width: 100%;
  margin: 0;
  white-space: normal;
  overflow-wrap: anywhere;
  word-break: break-word;
  writing-mode: horizontal-tb;
}
.geo-qa-q {
  margin-bottom: 6px;
  color: var(--cyan);
  font-size: calc(12px * var(--fs, 1));
  font-weight: 600;
}
.geo-qa-a {
  color: var(--muted);
  font-weight: 400;
}
.geo-qa-actions {
  position: absolute;
  top: 8px;
  right: 8px;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 4px;
}
.geo-qa-push,
.geo-qa-flag {
  position: static;
}
.geo-qa-push {
  opacity: 0;
  pointer-events: none;
  padding: 4px 8px;
  border: 1px solid var(--line-strong);
  background: rgba(7, 18, 30, 0.92);
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  cursor: pointer;
  white-space: nowrap;
}
.geo-qa-item:hover .geo-qa-push,
.geo-qa-item:focus-within .geo-qa-push {
  opacity: 1;
  pointer-events: auto;
}
.geo-qa-push:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}
.geo-qa-flag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: var(--dim);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
  line-height: 1.4;
  white-space: nowrap;
}
.geo-qa-flag b {
  display: inline;
  margin: 0;
  color: var(--dim);
  font-size: calc(11px * var(--fs, 1));
  font-weight: 400;
}
.geo-qa-item.is-pushed {
  border-color: rgba(148, 168, 184, 0.28);
}
.scheme-block-head strong {
  display: block;
  color: var(--text);
  font-size: calc(13px * var(--fs, 1));
  font-weight: 600;
}
.scheme-block-head p {
  margin: 4px 0 0;
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.scheme-block-btns {
  grid-column: 2;
  grid-row: 1;
  align-self: start;
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 92px;
}
.scheme-block-btn {
  min-width: 92px;
  padding: 6px 12px;
  text-align: center;
  font-size: calc(12px * var(--fs, 1));
}
.geo-qa-del {
  padding: 2px 6px;
  color: var(--muted);
  border: 1px solid var(--line);
  background: transparent;
  font-size: calc(10px * var(--fs, 1));
  cursor: pointer;
}
.geo-qa-del:hover {
  color: #ff8a4c;
  border-color: rgba(255, 138, 76, 0.45);
}
.geo-qa-del:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}
.scheme-block-head { grid-column: 1; }
.geo-qa-list,
.scheme-block .platform-grid { grid-column: 1 / -1; }
.scheme-block-btn[disabled] {
  opacity: 0.38;
  cursor: not-allowed;
}
.geo-qa-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 10px;
  width: 100%;
  min-width: 0;
}
.geo-qa-list:empty { display: none; }
.geo-qa-item.is-live {
  border-color: rgba(59, 200, 255, 0.7);
  background: rgba(59, 200, 255, 0.08);
}
.geo-qa-item.is-live .geo-qa-a::after {
  content: "▍";
  margin-left: 2px;
  color: var(--cyan);
  animation: geoCaret 1s step-end infinite;
}
@keyframes geoCaret {
  50% { opacity: 0; }
}
.platform-push-head {
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.platform-push-head.done { color: var(--green); }
.push-dialog {
  width: min(720px, 86%);
  min-height: 0;
}
.push-dialog .platform-push-head {
  margin: 0 0 12px;
  font-size: calc(13px * var(--fs, 1));
}
.push-dialog .platform-grid { margin-top: 0; }
.platform-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
}
.platform-chip {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 7px 8px;
  border: 1px solid var(--line);
  background: rgba(20, 50, 76, 0.22);
  font-size: calc(11px * var(--fs, 1));
}
.platform-chip em {
  color: var(--dim);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.platform-chip.on {
  border-color: rgba(43, 214, 162, 0.55);
  background: rgba(43, 214, 162, 0.08);
}
.platform-chip.on em { color: var(--green); }
.platform-chip.run {
  border-color: rgba(59, 200, 255, 0.7);
  background: rgba(59, 200, 255, 0.1);
}
.platform-chip.run em { color: var(--cyan); }
#acquire.page.active {
  display: flex;
  flex-direction: column;
  gap: 0;
}
#acquire .acquire-workbar { flex: 0 0 32px; }
#acquire .acquire-grid { flex: 1; min-height: 0; }
.sol-row {
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 0.28s ease, transform 0.28s ease;
}
.sol-row.in {
  opacity: 1;
  transform: none;
}

.ai-workbar {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 28px;
  padding: 0 12px;
  border-bottom: 1px solid var(--line);
  background: linear-gradient(90deg, rgba(59, 200, 255, 0.1), transparent 72%);
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 0.2px;
}
.ai-workbar span {
  min-width: 0;
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ai-workbar span::after {
  content: "";
  display: inline-block;
  width: 1.2em;
  animation: aiEllipsis 1.2s steps(3, end) infinite;
}
@keyframes aiEllipsis {
  0% { content: ""; }
  33% { content: "."; }
  66% { content: ".."; }
  100% { content: "..."; }
}
.ai-workbar em {
  margin-left: auto;
  flex: 0 0 auto;
  color: var(--green);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.ai-pulse {
  flex: 0 0 auto;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--cyan);
  box-shadow: 0 0 8px var(--cyan);
  animation: aiPulse 1.1s ease-in-out infinite;
}
@keyframes aiPulse {
  50% { opacity: 0.28; transform: scale(0.65); box-shadow: 0 0 2px var(--cyan); }
}
#overview .left-stack .scroll-pane,
#overview .right-stack .event-list {
  flex: 1;
  height: auto;
  max-height: none;
  min-height: 0;
}
.ai-rail {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: 6px;
}
.ai-chip {
  padding: 0 5px;
  border: 1px solid var(--line-strong);
  color: var(--cyan);
  font-size: calc(9px * var(--fs, 1));
  line-height: 16px;
}
.ai-chip.on {
  color: var(--green);
  border-color: rgba(43, 214, 162, 0.45);
}
.ai-chip.dim { color: var(--dim); border-color: var(--line); }
.news-item.ai-reading,
.hot-card.ai-reading {
  border-color: rgba(59, 200, 255, 0.85);
  background: rgba(59, 200, 255, 0.1);
  box-shadow: inset 2px 0 0 var(--cyan);
}
.event-card.ai-writing {
  border-color: rgba(43, 214, 162, 0.8);
  background: rgba(43, 214, 162, 0.09);
}
.news-item.ai-reading .ai-chip,
.event-card.ai-writing .ai-chip.on { color: var(--green); }
.two-col { grid-template-columns: 1.4fr 0.8fr; }
/* 滚动容器隐藏滚动条但保留滚动（与 newsList/event-list 的既有惯例一致） */
.scroll-pane {
  overflow: auto;
  max-height: calc(100% - 42px);
  padding: 10px 12px 12px;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.scroll-pane::-webkit-scrollbar { width: 0; height: 0; display: none; }
#newsList,
#disasterList {
  scrollbar-width: none;
  -ms-overflow-style: none;
}
#newsList::-webkit-scrollbar,
#disasterList::-webkit-scrollbar {
  width: 0;
  height: 0;
  display: none;
}
.card-list { display: flex; flex-direction: column; gap: 8px; }
.mini-card, .hot-card, .qa-card, .news-item, .gate-card, .step-card {
  padding: 10px;
  border: 1px solid var(--line);
  background: rgba(20, 50, 76, 0.22);
  cursor: pointer;
}
.mini-card.active, .hot-card.active, .step-card.doing {
  border-color: rgba(59, 200, 255, 0.7);
  background: rgba(59, 200, 255, 0.08);
}
.mini-card b, .hot-card b, .news-item b, .step-card b { display: block; margin-bottom: 4px; }
.mini-card span, .hot-card span, .qa-card span, .news-item span, .step-card span {
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.5;
}
.tag {
  display: inline-block;
  margin-bottom: 6px;
  padding: 1px 6px;
  color: var(--cyan);
  border: 1px solid var(--line-strong);
  font-size: calc(10px * var(--fs, 1));
}
.photo-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
.photo-grid figure { margin: 0; }
.photo-grid img, .hero-shot {
  width: 100%;
  height: 132px;
  object-fit: cover;
  border: 1px solid var(--line);
}
.hero-shot { height: 220px; }
.photo-grid figcaption, .src-note { margin-top: 4px; color: var(--dim); font-size: calc(10px * var(--fs, 1)); }
.src-note { padding: 0 12px 10px; }

.layer-tabs { display: flex; gap: 6px; padding: 8px 12px 0; flex-wrap: wrap; }
.layer-tabs button {
  padding: 5px 10px;
  color: var(--muted);
  border: 1px solid var(--line);
  background: transparent;
  cursor: pointer;
}
.layer-tabs button.active { color: var(--cyan); border-color: var(--line-strong); }

.survey-stage {
  position: absolute;
  inset: 0;
  z-index: 4;
  background: #07131f;
}
.survey-stage.field-stage {
  z-index: 4;
  display: grid;
  grid-template-columns: 1fr minmax(240px, 32%);
  gap: 8px;
  padding: 10px;
  background: #07131f;
}
.field-map {
  position: relative;
  min-height: 0;
  border: 1px solid var(--line);
  background: #f3f6f1;
}
.field-map img, .field-map svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.field-map svg { pointer-events: none; }
.field-pin { pointer-events: auto; cursor: pointer; }
.field-pin circle { fill: rgba(255, 82, 99, 0.18); stroke: #ff5263; stroke-width: 3; }
.field-pin.active circle { fill: rgba(59, 200, 255, 0.28); stroke: #3bc8ff; }
.field-pin text {
  fill: #03101c;
  font-size: calc(18px * var(--fs, 1));
  font-weight: 700;
  pointer-events: none;
}
.field-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-height: 0;
  overflow: auto;
  padding: 12px;
  border: 1px solid var(--line);
  background: rgba(8, 22, 38, 0.92);
}
.field-card b { display: block; margin-bottom: 4px; }
.field-card p, .field-card span { color: var(--muted); font-size: calc(12px * var(--fs, 1)); line-height: 1.55; }
.field-card .compare-kpis { color: var(--cyan); }
.field-links { display: flex; flex-direction: column; gap: 6px; margin-top: auto; }
.field-links button { width: 100%; text-align: left; }
.survey-canvas { width: 100%; height: 100%; display: block; }
.survey-toolbar {
  position: absolute;
  left: 10px;
  bottom: 10px;
  z-index: 5;
  padding: 5px 8px;
  color: rgba(229, 242, 250, 0.86);
  background: rgba(4, 12, 20, 0.78);
  font-size: calc(10px * var(--fs, 1));
}
.survey-film {
  position: absolute;
  left: 10px;
  right: 10px;
  bottom: 10px;
  z-index: 6;
  display: flex;
  gap: 6px;
  overflow: auto;
}
.survey-film button, .survey-film img {
  height: 54px;
  border: 1px solid var(--line);
  background: #07131f;
  cursor: pointer;
}
.survey-film button.active, .survey-film img.active { border-color: var(--cyan); }
.survey-film button {
  min-width: 72px;
  color: var(--text);
  font-size: calc(11px * var(--fs, 1));
  padding: 0 8px;
}
.compare-stage {
  display: grid;
  grid-template-columns: minmax(210px, 27%) 1fr;
  gap: 8px;
  padding: 10px;
  overflow: hidden;
}
.compare-side, .compare-main {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 0;
}
.compare-side { min-width: 0; }
.compare-main { min-width: 0; }
.compare-hero { flex: 1.4; }
.compare-head {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-width: 0;
}
.compare-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.compare-chips button {
  padding: 5px 10px;
  color: var(--muted);
  border: 1px solid var(--line);
  background: transparent;
  cursor: pointer;
  font-size: calc(11px * var(--fs, 1));
}
.compare-chips button.active {
  color: #03101c;
  border-color: var(--cyan);
  background: var(--cyan);
}
.compare-meta b { display: block; margin-bottom: 4px; font-size: calc(14px * var(--fs, 1)); }
.compare-meta span { color: var(--muted); font-size: calc(11px * var(--fs, 1)); line-height: 1.55; }
.compare-kpis {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 6px;
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
}
.compare-kpis i { font-style: normal; }
.compare-shot {
  display: flex;
  flex-direction: column;
  min-height: 0;
  flex: 1;
  border: 1px solid var(--line);
  background: #061018;
}
.compare-shot img {
  flex: 1;
  min-height: 0;
  width: 100%;
  object-fit: contain;
  background: #e7eee8;
}
.compare-shot p {
  margin: 0;
  padding: 6px 8px 7px;
  color: var(--muted);
  font-size: calc(10px * var(--fs, 1));
  line-height: 1.45;
}
.compare-shot strong {
  display: block;
  padding: 7px 8px 0;
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
}
.rocfall-stage { display: flex; flex-direction: column; height: 100%; }
.rocfall-stage img.hero-shot {
  flex: 1;
  height: auto;
  min-height: 0;
  object-fit: contain;
  background: #040c14;
}
.equip-row { display: flex; justify-content: space-between; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--line); }
.equip-row.on b { color: var(--green); }
#construct.page.active {
  display: flex;
  flex-direction: column;
  gap: 0;
}
#construct .construct-workbar { flex: 0 0 32px; }
#construct .construct-board {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.construct-head {
  display: grid;
  grid-template-columns: 1.6fr repeat(4, 1fr);
  gap: 8px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  background: rgba(13, 30, 49, 0.72);
}
.construct-head .ch-main b {
  display: block;
  color: var(--text);
  font-size: calc(14px * var(--fs, 1));
}
.construct-head .ch-main span {
  display: block;
  margin-top: 4px;
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.construct-head .ch-kpi {
  padding: 4px 8px;
  border-left: 1px solid var(--line);
}
.construct-head .ch-kpi em {
  display: block;
  color: var(--dim);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.construct-head .ch-kpi b {
  display: block;
  margin-top: 4px;
  color: var(--cyan);
  font-size: calc(16px * var(--fs, 1));
}
.construct-grid {
  flex: 1;
  min-height: 0;
  display: grid;
  grid-template-columns: 0.78fr 1.22fr 0.88fr;
  gap: 12px;
}
#construct .construct-grid .panel {
  display: flex;
  flex-direction: column;
  min-height: 0;
}
#construct .construct-grid .scroll-pane {
  flex: 1;
  max-height: none;
}
.flow-phase { margin: 0 0 12px; }
.flow-phase > b {
  display: block;
  margin-bottom: 6px;
  color: var(--dim);
  font-size: calc(11px * var(--fs, 1));
}
.flow-node {
  position: relative;
  margin: 0 0 6px 10px;
  padding: 8px 10px 8px 14px;
  border: 1px solid var(--line);
  border-left: 2px solid rgba(87, 164, 219, 0.28);
  background: rgba(7, 18, 30, 0.55);
  cursor: pointer;
}
.flow-node::before {
  content: "";
  position: absolute;
  left: -6px;
  top: 14px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #5c758a;
}
.flow-node.done { border-left-color: rgba(43, 214, 162, 0.55); }
.flow-node.done::before { background: var(--green); }
.flow-node.doing {
  border-color: rgba(59, 200, 255, 0.55);
  border-left-color: var(--cyan);
  background: rgba(59, 200, 255, 0.08);
}
.flow-node.doing::before { background: var(--cyan); box-shadow: 0 0 0 3px rgba(59, 200, 255, 0.2); }
.flow-node.active { outline: 1px solid rgba(59, 200, 255, 0.45); }
.flow-node strong { display: block; color: var(--text); font-size: calc(13px * var(--fs, 1)); }
.flow-node em {
  display: block;
  margin-top: 3px;
  color: var(--muted);
  font-style: normal;
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.flow-node i {
  position: absolute;
  top: 8px;
  right: 8px;
  color: var(--dim);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.flow-node.doing i { color: var(--cyan); }
.flow-node.done i { color: var(--green); }
.construct-stage {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 10px 12px 6px;
}
.construct-stage-frame {
  position: relative;
  overflow: hidden;
  border: 1px solid var(--line);
  background: #061018;
}
.construct-stage-frame img {
  display: block;
  width: 100%;
  max-height: 280px;
  object-fit: contain;
  background: #061018;
}
.construct-stage-scan {
  display: none;
  position: absolute;
  left: 0;
  right: 0;
  height: 18%;
  background: linear-gradient(180deg, transparent, rgba(59, 200, 255, 0.18), transparent);
  pointer-events: none;
}
.construct-stage-frame.scanning .construct-stage-scan {
  display: block;
  animation: constructScan 2.2s linear infinite;
}
.construct-stage-hud {
  position: absolute;
  left: 8px;
  right: 8px;
  bottom: 8px;
  padding: 6px 8px;
  border: 1px solid rgba(59, 200, 255, 0.28);
  background: rgba(4, 12, 20, 0.78);
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.construct-stage-cap {
  margin: 6px 0 8px;
  color: var(--dim);
  font-size: calc(10px * var(--fs, 1));
}
.construct-stage-meta p {
  margin: 0 0 8px;
  color: var(--muted);
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.6;
}
.construct-kv {
  display: flex;
  gap: 16px;
  margin-bottom: 8px;
  color: var(--text);
  font-size: calc(12px * var(--fs, 1));
}
.construct-kv em {
  display: block;
  color: var(--dim);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.construct-checks {
  display: grid;
  gap: 4px;
  margin-bottom: 8px;
}
.construct-checks div {
  padding: 5px 8px;
  border: 1px solid var(--line);
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
}
.construct-checks div.on {
  color: var(--text);
  border-color: rgba(43, 214, 162, 0.4);
  background: rgba(43, 214, 162, 0.08);
}
.construct-mini-tasks {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 8px;
}
.construct-mini-tasks em {
  padding: 2px 7px;
  border: 1px solid var(--line);
  color: var(--muted);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.construct-mini-tasks em.done {
  color: var(--green);
  border-color: rgba(43, 214, 162, 0.35);
}
.construct-equip {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.construct-equip span {
  padding: 2px 7px;
  border: 1px solid var(--line);
  color: var(--dim);
  font-size: calc(10px * var(--fs, 1));
}
.construct-equip span.used {
  color: var(--cyan);
  border-color: rgba(59, 200, 255, 0.35);
}
.construct-actions {
  display: flex;
  gap: 8px;
  padding: 8px 12px 10px;
  border-top: 1px solid var(--line);
}
.construct-log .src-note { margin: 8px; }
@keyframes constructScan {
  0% { top: -18%; }
  100% { top: 100%; }
}
.task-row, .file-row, .log-row {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 6px 12px;
  padding: 8px 0;
  border-bottom: 1px solid var(--line);
}
.task-row b, .file-row b { color: var(--text); font-size: calc(12px * var(--fs, 1)); }
.task-row span, .file-row span, .log-row span { color: var(--muted); font-size: calc(11px * var(--fs, 1)); }
.task-row em, .file-row em {
  color: var(--dim);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.task-row.todo em { color: var(--cyan); }
.task-row.overdue em { color: var(--orange); }
.task-row.done em { color: var(--green); }
.log-row { grid-template-columns: 88px 1fr; }
.log-row time { color: var(--dim); font-size: calc(10px * var(--fs, 1)); }

.chat-layer {
  position: absolute;
  z-index: 40;
  left: 16px;
  right: auto;
  bottom: 16px;
  width: 420px;
  height: 560px;
  display: none;
  grid-template-rows: auto 1fr auto;
  border: 1px solid var(--line-strong);
  background: rgba(7, 20, 34, 0.98);
}
.chat-layer.open { display: grid; }
.chat-layer.docked.open {
  position: relative;
  inset: auto;
  left: auto;
  right: auto;
  bottom: auto;
  width: auto;
  height: 100%;
  min-height: 0;
  z-index: 8;
  background: #08141f;
}
.content.chat-docked {
  display: grid;
  grid-template-rows: 1fr;
  overflow: hidden;
}
.content.chat-docked > .page {
  display: none !important;
}
.chat-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  border-bottom: 1px solid var(--line);
}
.chat-head-actions { display: flex; align-items: center; gap: 8px; }
.chat-layer.docked .chat-log { padding: 18px 22px; }
.chat-layer.docked .bubble { max-width: 72%; font-size: calc(13px * var(--fs, 1)); }
.chat-log { overflow: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
.bubble { max-width: 92%; padding: 8px 10px; font-size: calc(12px * var(--fs, 1)); line-height: 1.55; }
.bubble.user { align-self: flex-end; background: rgba(59, 200, 255, 0.16); }
.bubble.bot { align-self: flex-start; background: rgba(20, 50, 76, 0.45); }
.chat-tools { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; }
.chat-tool {
  padding: 2px 6px;
  color: var(--cyan);
  border: 1px solid var(--line-strong);
  background: rgba(59, 200, 255, 0.08);
  font-size: calc(10px * var(--fs, 1));
}
.chat-figures { display: grid; gap: 6px; margin-bottom: 6px; }
.chat-figure { margin: 0; }
.chat-figure img { display: block; width: 100%; max-height: 140px; object-fit: cover; }
.chat-figure figcaption { margin-top: 4px; color: var(--muted); font-size: calc(10px * var(--fs, 1)); }
.chat-text { display: grid; gap: 6px; }
.chat-text h1, .chat-text h2, .chat-text h3, .chat-text h4, .chat-text h5, .chat-text h6 {
  margin: 2px 0 0;
  color: #d7ecff;
  font-weight: 650;
}
.chat-text h1 { font-size: calc(16px * var(--fs, 1)); }
.chat-text h2 { font-size: calc(15px * var(--fs, 1)); }
.chat-text h3 { font-size: calc(14px * var(--fs, 1)); }
.chat-text h4, .chat-text h5, .chat-text h6 { font-size: calc(13px * var(--fs, 1)); }
.chat-text hr {
  width: 100%;
  margin: 4px 0;
  border: 0;
  border-top: 1px solid var(--line);
}
.chat-text p, .chat-text ul, .chat-text ol, .chat-text blockquote { margin: 0; }
.chat-text ul, .chat-text ol { padding-left: 1.15em; }
.chat-text li + li { margin-top: 3px; }
.chat-text strong { color: #f2f8ff; }
.chat-text a { color: var(--cyan); }
.chat-text code {
  padding: 0 4px;
  color: #9ad8ff;
  background: rgba(7, 19, 31, 0.9);
}
.chat-text pre {
  margin: 0;
  padding: 8px;
  overflow: auto;
  border: 1px solid var(--line);
  background: #07131f;
}
.chat-text pre code { padding: 0; background: none; }
.chat-text table { width: 100%; border-collapse: collapse; font-size: calc(11px * var(--fs, 1)); }
.chat-text th, .chat-text td {
  padding: 4px 6px;
  border: 1px solid var(--line);
  text-align: left;
}
.chat-text th { color: #d7ecff; background: rgba(7, 19, 31, 0.8); }
.chat-text blockquote {
  padding-left: 8px;
  border-left: 2px solid var(--cyan);
  color: var(--muted);
}
.chat-text.live::after {
  content: "";
  display: inline-block;
  width: 6px;
  height: 12px;
  margin-left: 2px;
  background: var(--cyan);
  vertical-align: text-bottom;
  animation: chat-caret 0.8s step-end infinite;
}
@keyframes chat-caret {
  50% { opacity: 0; }
}
.chat-form { display: grid; grid-template-columns: 1fr auto; gap: 8px; padding: 10px; border-top: 1px solid var(--line); }
.chat-form input { padding: 8px 10px; color: var(--text); border: 1px solid var(--line); background: #07131f; }

.gate-ok { color: var(--green); }
.hidden { display: none !important; }

.news-item.active, .event-card.active {
  border-color: rgba(247, 201, 72, 0.7);
  background: rgba(247, 201, 72, 0.08);
}
.news-item a { color: var(--cyan); text-decoration: none; }
.news-point { cursor: pointer; }
.news-point circle:last-child { fill: var(--yellow); stroke: #07111f; stroke-width: 0.6; }
.news-point .pulse { fill: rgba(247, 201, 72, 0.35); }

.news-item {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}
.news-item .tag {
  display: block;
  margin-bottom: 0;
  line-height: 1.4;
}
.news-item b {
  margin-bottom: 0;
  line-height: 1.4;
  overflow-wrap: anywhere;
}
.news-item span {
  line-height: 1.5;
}

.project-rail {
  display: none;
  flex-direction: column;
  min-width: 0;
  border-right: 1px solid var(--line);
  background: rgba(5, 15, 27, 0.9);
}
.main.has-projects .project-rail { display: flex; }
.project-rail-head {
  padding: 12px 10px 8px;
  color: var(--dim);
  font-size: calc(10px * var(--fs, 1));
  letter-spacing: 2px;
}
.project-rail-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 0 8px 12px;
  overflow: auto;
}
.project-chip {
  width: 100%;
  padding: 8px 8px 9px;
  color: var(--muted);
  text-align: left;
  border: 1px solid transparent;
  border-radius: 6px;
  background: transparent;
  cursor: pointer;
}
.project-chip:hover,
.project-chip.active {
  color: var(--text);
  border-color: var(--line-strong);
  background: rgba(35, 119, 178, 0.16);
}
.project-chip small {
  display: block;
  color: var(--dim);
  font-size: calc(10px * var(--fs, 1));
  letter-spacing: 0;
}
.project-chip b {
  display: block;
  margin: 3px 0 2px;
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.35;
}
.project-chip em {
  color: var(--cyan);
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
}
.project-chip.red em { color: var(--red); }
.project-chip.orange em { color: var(--orange); }
.project-chip.yellow em { color: var(--yellow); }
.project-chip.ops-global-chip em { color: var(--cyan); }
.project-chip.ops-global-chip.active {
  border-color: rgba(59, 200, 255, 0.45);
  background: rgba(59, 200, 255, 0.1);
}

.ops-global {
  display: grid;
  grid-template-rows: auto auto minmax(0, 1fr) auto;
  gap: 12px;
  flex: 1;
  min-height: 0;
}
.ops-global-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 10px 14px;
  border: 1px solid var(--line);
  background:
    linear-gradient(90deg, rgba(40, 130, 192, 0.2), transparent 55%),
    var(--panel);
}
.ops-global-bar > div:first-child {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}
.ops-global-bar strong {
  margin-right: 2px;
  font-size: calc(15px * var(--fs, 1));
  letter-spacing: 1px;
}
.ops-global-bar span { color: var(--muted); font-size: calc(12px * var(--fs, 1)); }
.ops-global-meta { display: flex; align-items: center; gap: 10px; }
.ops-global-meta .ops-live {
  position: static;
  background: rgba(4, 12, 20, 0.55);
}
.ops-global-meta em {
  color: var(--green);
  font-style: normal;
  font-size: calc(11px * var(--fs, 1));
}
.ops-global-meta em::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-right: 5px;
  border-radius: 50%;
  background: var(--green);
  box-shadow: 0 0 0 3px rgba(43, 214, 162, 0.16);
}
.ops-kpi { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.ops-kpi-card {
  padding: 12px 14px 11px;
  border: 1px solid var(--line);
  background: var(--panel);
}
.ops-kpi-card em {
  display: block;
  color: var(--dim);
  font-style: normal;
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 0.6px;
}
.ops-kpi-card b {
  display: block;
  margin-top: 6px;
  color: var(--text);
  font-weight: 700;
  font-size: calc(26px * var(--fs, 1));
  line-height: 1;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
.ops-kpi-card small {
  display: block;
  margin-top: 4px;
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
}
.ops-kpi-card.warn b { color: var(--orange); }
.ops-kpi-card.danger b { color: var(--red); }
.ops-kpi-card.ok b { color: var(--green); }
.ops-wall {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 12px;
  min-height: 0;
}
.ops-sites {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
  min-height: 0;
}
.ops-cam-wall {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-template-rows: repeat(3, minmax(0, 1fr));
  gap: 8px;
  min-height: 0;
}
.ops-cam-tile {
  position: relative;
  overflow: hidden;
  min-height: 0;
  padding: 0;
  color: inherit;
  text-align: left;
  border: 1px solid var(--line);
  background: #071018;
  cursor: pointer;
}
.ops-cam-tile:hover { border-color: var(--line-strong); }
.ops-cam-media {
  position: absolute;
  inset: 0;
  overflow: hidden;
  background: #071018;
}
.ops-cam-media iframe,
.ops-cam-media video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  pointer-events: none;
  object-fit: cover;
}
.ops-cam-media video,
.ops-cam-media iframe.ys7-frame {
  inset: 0;
  width: 100%;
  height: 100%;
  transform: none;
  pointer-events: none;
}
.ops-cam-hit {
  position: absolute;
  inset: 0;
  z-index: 3;
}
.ops-cam-mask {
  position: fixed;
  inset: 0;
  z-index: 82;
  display: none;
  place-items: center;
  padding: 24px;
  background: rgba(4, 10, 18, 0.78);
}
.ops-cam-mask.open { display: grid; }
.ops-cam-mask[hidden] { display: none !important; }
.ops-cam-dialog {
  width: min(1120px, 94vw);
  display: flex;
  flex-direction: column;
  max-height: 92vh;
  overflow: hidden;
  border: 1px solid var(--line-strong);
  background: rgba(8, 22, 38, 0.98);
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
}
.ops-cam-dialog-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  padding: 14px 16px 10px;
}
.ops-cam-dialog-head em {
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
  letter-spacing: 0.4px;
}
.ops-cam-dialog-head h2 {
  margin: 4px 0 0;
  color: var(--text);
  font-size: calc(18px * var(--fs, 1));
}
.ops-cam-dialog-head p {
  margin: 4px 0 0;
  color: var(--muted);
  font-size: calc(12px * var(--fs, 1));
}
.ops-cam-dialog-stage {
  position: relative;
  overflow: hidden;
  aspect-ratio: 16 / 9;
  background: #000;
}
.ops-cam-dialog-stage iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  background: #000;
}
.ops-cam-dialog-foot {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 12px 16px 14px;
}
.ops-cam-meta {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 8px;
  padding: 18px 8px 7px;
  background: linear-gradient(transparent, rgba(4, 10, 18, 0.88));
  pointer-events: none;
}
.ops-cam-meta span {
  display: block;
  color: var(--dim);
  font-size: calc(10px * var(--fs, 1));
}
.ops-cam-meta b {
  display: block;
  color: var(--text);
  font-size: calc(12px * var(--fs, 1));
}
.ops-cam-meta em {
  color: #ff8a8a;
  font-style: normal;
  font-size: calc(10px * var(--fs, 1));
  letter-spacing: 0.6px;
}
.ops-cam-tile.is-loading::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    linear-gradient(110deg, transparent 30%, rgba(90, 170, 220, 0.08) 48%, transparent 66%),
    repeating-linear-gradient(0deg, rgba(255,255,255,0.02) 0 2px, transparent 2px 8px);
  animation: opsScan 1.6s linear infinite;
}
@keyframes opsScan {
  from { background-position: -40% 0, 0 0; }
  to { background-position: 140% 0, 0 0; }
}
.ops-cam-tile.is-offline::after {
  content: "信号中断 · 自动重试";
  position: absolute;
  inset: 0;
  z-index: 3;
  display: grid;
  place-items: center;
  color: var(--muted);
  background: rgba(7, 16, 24, 0.72);
  font-size: calc(12px * var(--fs, 1));
}
.ops-cam-empty {
  grid-column: 1 / -1;
  display: grid;
  place-items: center;
  color: var(--muted);
}
.ops-site {
  display: flex;
  flex-direction: column;
  min-width: 0;
  overflow: hidden;
  padding: 0;
  color: inherit;
  text-align: left;
  border: 1px solid var(--line);
  background: var(--panel);
  cursor: pointer;
}
.ops-site:hover { border-color: var(--line-strong); }
.ops-site-shot {
  position: relative;
  flex: 1;
  min-height: 220px;
  overflow: hidden;
  background: #071018;
}
.ops-site-shot img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: brightness(0.72) saturate(0.86) contrast(1.06);
}
.ops-site-shot::after {
  content: "";
  position: absolute;
  inset: auto 0 0;
  height: 56%;
  background: linear-gradient(transparent, rgba(4, 10, 18, 0.92));
}
.ops-site-shot span,
.ops-site-shot em {
  position: absolute;
  z-index: 1;
  padding: 2px 7px;
  font-size: calc(10px * var(--fs, 1));
  letter-spacing: 0.3px;
}
.ops-site-shot span {
  top: 8px;
  left: 8px;
  color: #e8f6ff;
  background: rgba(4, 12, 20, 0.72);
}
.ops-site-shot em {
  top: 8px;
  right: 8px;
  font-style: normal;
  color: var(--orange);
  border: 1px solid rgba(255, 138, 76, 0.35);
  background: rgba(7, 18, 30, 0.72);
}
.ops-site.red .ops-site-shot em { color: var(--red); border-color: rgba(255, 82, 99, 0.4); }
.ops-site.ok .ops-site-shot em { color: var(--green); border-color: rgba(43, 214, 162, 0.35); }
.ops-site-body {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1;
  padding: 12px 12px 13px;
}
.ops-site-body b { font-size: calc(15px * var(--fs, 1)); letter-spacing: 0.4px; }
.ops-site-body p {
  margin: 0;
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.ops-site-body small { color: var(--dim); font-size: calc(11px * var(--fs, 1)); }
.ops-site-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: auto;
  padding-top: 8px;
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
}
.ops-feed-panel { display: flex; flex-direction: column; min-height: 0; }
.ops-feed-panel .evolution-grid { padding: 10px 12px 12px; }
.ops-feed-panel .evolution-step {
  grid-template-columns: minmax(72px, max-content) 12px minmax(0, 1fr);
  padding-bottom: 10px;
}
.ops-feed-panel .evolution-step time {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: calc(10px * var(--fs, 1));
  white-space: nowrap;
}
.ops-feed-panel .evolution-step.is-watch time,
.ops-feed-panel .evolution-step.is-watch b { color: var(--yellow); }
.ops-feed-panel .evolution-step.is-alarm time,
.ops-feed-panel .evolution-step.is-alarm b { color: var(--orange); }
.ops-duty {
  display: flex;
  flex-wrap: wrap;
  gap: 18px;
  padding: 9px 14px;
  color: var(--muted);
  border: 1px solid var(--line);
  background: var(--panel);
  font-size: calc(12px * var(--fs, 1));
}
.ops-duty b { color: var(--text); font-weight: 600; }
.ops-duty em { color: var(--green); font-style: normal; }

.settings-mask {
  position: absolute;
  inset: 0;
  z-index: 70;
  display: none;
  place-items: center;
  background: rgba(4, 10, 18, 0.72);
}
.settings-mask.open { display: grid; }
.settings-card {
  width: min(860px, 92%);
  max-height: 82%;
  overflow: auto;
  padding: 22px 22px 18px;
  border: 1px solid var(--line-strong);
  background: rgba(8, 22, 38, 0.98);
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
}
.settings-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 14px;
}
.settings-head-actions {
  display: flex;
  align-items: center;
  gap: 8px;
}
.settings-head h2 { margin: 0; font-size: calc(18px * var(--fs, 1)); letter-spacing: 1px; }
.settings-pane.hidden { display: none; }
.settings-tabs {
  display: flex;
  gap: 0;
  margin: 0 0 14px;
  border-bottom: 1px solid var(--line);
}
.settings-tabs button {
  height: 36px;
  padding: 0 16px;
  border: 0;
  border-bottom: 2px solid transparent;
  background: transparent;
  color: var(--muted);
  font-size: calc(13px * var(--fs, 1));
  letter-spacing: 0.3px;
  cursor: pointer;
}
.settings-tabs button.active {
  color: var(--cyan);
  border-bottom-color: var(--cyan);
  background: rgba(59, 200, 255, 0.06);
}
.settings-tab-pane.hidden { display: none; }
.settings-form { margin-top: 4px; }
.settings-table { width: 100%; border-collapse: collapse; font-size: calc(12px * var(--fs, 1)); }
.settings-table th,
.settings-table td {
  padding: 8px 6px;
  border-bottom: 1px solid var(--line);
  text-align: left;
}
.settings-table th { color: var(--dim); font-weight: 500; }
.settings-form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 12px;
  margin-top: 16px;
}
.settings-form label { display: block; color: var(--dim); font-size: calc(11px * var(--fs, 1)); margin-bottom: 4px; }
.settings-form input,
.settings-form select,
.settings-form textarea {
  width: 100%;
  padding: 8px 10px;
  color: var(--text);
  border: 1px solid var(--line-strong);
  background: rgba(4, 12, 20, 0.8);
}
.settings-form textarea { min-height: 64px; grid-column: 1 / -1; resize: vertical; }
.settings-form .span-2 { grid-column: 1 / -1; }
.settings-actions { display: flex; gap: 8px; align-items: center; }
.settings-error { min-height: 18px; color: var(--red); font-size: calc(12px * var(--fs, 1)); }
.settings-llm {
  margin: 0;
  padding: 12px 12px 10px;
  border: 1px solid var(--line);
  background: rgba(4, 12, 20, 0.45);
}
.settings-llm h3 {
  margin: 0 0 6px;
  font-size: calc(14px * var(--fs, 1));
}
.settings-llm label {
  display: block;
  margin: 8px 0 4px;
  color: var(--dim);
  font-size: calc(11px * var(--fs, 1));
}
.settings-llm-row {
  display: flex;
  align-items: center;
  gap: 8px;
}
.settings-llm-row input {
  flex: 1;
  min-width: 0;
  padding: 8px 10px;
  color: var(--text);
  border: 1px solid var(--line-strong);
  background: rgba(4, 12, 20, 0.8);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: calc(12px * var(--fs, 1));
}
.settings-llm small {
  display: block;
  margin-top: 6px;
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
}

/* 设置 · 显示 · 文字大小五档选择 */
.fs-picker {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 10px 0 2px;
}
.fs-picker button {
  flex: 1 1 auto;
  min-width: 62px;
  padding: 7px 10px;
  color: var(--muted);
  border: 1px solid var(--line);
  background: rgba(20, 50, 76, 0.22);
  font-family: inherit;
  font-size: calc(12px * var(--fs, 1));
  letter-spacing: 0.5px;
  cursor: pointer;
  transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.fs-picker button:hover {
  color: var(--text);
  border-color: rgba(59, 200, 255, 0.45);
}
.fs-picker button.active {
  color: #fff;
  border-color: rgba(59, 200, 255, 0.7);
  background: rgba(59, 200, 255, 0.14);
}
.fs-picker button:focus-visible {
  outline: 1px solid var(--cyan);
  outline-offset: 1px;
}

.news-mask {
  position: absolute;
  inset: 0;
  z-index: 90;
  display: none;
  place-items: center;
  padding: 40px 24px;
  background: rgba(2, 8, 16, 0.78);
}
.news-mask.open { display: grid; }
.news-dialog {
  width: min(520px, 56%);
  min-height: 0;
  max-height: 56%;
  overflow: auto;
  padding: 18px 20px 16px;
  border: 1px solid var(--line-strong);
  background: rgba(8, 22, 38, 0.98);
  box-shadow: 0 28px 80px rgba(0, 0, 0, 0.45);
  scrollbar-width: none;
}
.news-dialog::-webkit-scrollbar { display: none; }
.news-dialog-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 10px;
}
.news-dialog-kicker {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 6px;
}
.news-dialog-head em {
  display: inline;
  margin: 0;
  color: var(--cyan);
  font-style: normal;
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 0.4px;
}
.news-dialog-head h2 {
  margin: 0;
  font-size: calc(16px * var(--fs, 1));
  line-height: 1.4;
  letter-spacing: 0.2px;
}
.news-dialog-x {
  flex: none;
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  padding: 0;
  color: var(--muted);
  border: 1px solid var(--line);
  background: rgba(4, 12, 20, 0.4);
  cursor: pointer;
}
.news-dialog-x:hover {
  color: var(--text);
  border-color: var(--line-strong);
}
.news-dialog-x svg {
  width: 12px;
  height: 12px;
  stroke: currentColor;
  stroke-width: 1.7;
  fill: none;
}
.intel-level {
  display: inline-flex;
  align-items: center;
  padding: 1px 8px;
  color: var(--cyan);
  border: 1px solid rgba(59, 200, 255, 0.42);
  background: rgba(59, 200, 255, 0.1);
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
  letter-spacing: 0.3px;
}
.intel-level.red {
  color: #ff8b96;
  border-color: rgba(255, 82, 99, 0.5);
  background: rgba(255, 82, 99, 0.12);
}
.intel-level.orange {
  color: #ffb086;
  border-color: rgba(255, 138, 76, 0.5);
  background: rgba(255, 138, 76, 0.12);
}
.intel-level.watch {
  color: var(--cyan);
}
.news-dialog.is-intel {
  width: min(560px, 62%);
  padding: 16px 16px 14px 18px;
  border-left: 3px solid var(--cyan);
  background:
    linear-gradient(180deg, rgba(59, 200, 255, 0.06), transparent 42px),
    rgba(8, 22, 38, 0.98);
}
.news-dialog.is-intel[data-level="red"] { border-left-color: var(--red); }
.news-dialog.is-intel[data-level="orange"] { border-left-color: var(--orange); }
.news-dialog-stats {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 8px;
  margin: 0 0 12px;
}
.intel-cell {
  min-width: 0;
  padding: 8px 10px 9px;
  border: 1px solid var(--line);
  background: rgba(4, 14, 24, 0.78);
}
.intel-cell.wide { grid-column: 1 / -1; }
.intel-cell em {
  display: block;
  margin-bottom: 5px;
  color: var(--dim);
  font-size: calc(10px * var(--fs, 1));
  font-style: normal;
  letter-spacing: 0.6px;
}
.intel-cell b {
  display: block;
  color: var(--text);
  font-size: calc(14px * var(--fs, 1));
  font-weight: 650;
  line-height: 1.4;
  letter-spacing: 0.15px;
}
.news-dialog-body {
  margin: 0 0 14px;
  max-height: 16em;
  overflow: auto;
  color: var(--text);
  font-size: calc(13px * var(--fs, 1));
  line-height: 1.65;
  white-space: pre-wrap;
}
.news-dialog.is-intel .news-dialog-body {
  margin: 0;
  max-height: none;
  color: var(--muted);
  font-size: calc(12px * var(--fs, 1));
}
.news-dialog-foot {
  display: flex;
  align-items: center;
  gap: 10px;
}
.news-dialog-foot[hidden] { display: none; }
.news-dialog-link {
  color: var(--cyan);
  text-decoration: none;
  border: 1px solid var(--line-strong);
  padding: 7px 12px;
  font-size: calc(12px * var(--fs, 1));
}
.news-brief {
  width: min(520px, 56%);
  min-height: 0;
  max-height: 56%;
  padding: 18px 20px 16px;
}
.news-brief.is-intel {
  width: min(560px, 62%);
}
.news-brief .news-dialog-head {
  margin-bottom: 12px;
  gap: 10px;
}
.news-brief .news-dialog-head em {
  margin-bottom: 0;
  font-size: calc(11px * var(--fs, 1));
}
.news-brief .news-dialog-head h2 {
  font-size: calc(17px * var(--fs, 1));
  line-height: 1.4;
}
.news-brief .news-dialog-body {
  margin: 0 0 14px;
  max-height: 16em;
  overflow: auto;
  font-size: calc(13px * var(--fs, 1));
  line-height: 1.65;
}
.news-brief.is-intel .news-dialog-body {
  margin: 0;
  max-height: none;
  font-size: calc(12px * var(--fs, 1));
}
.news-brief .news-dialog-foot {
  margin-top: 0;
}

.survey-steps {
  display: flex;
  flex-wrap: nowrap;
  gap: 6px;
  margin: 0;
  padding: 10px 12px 0;
  list-style: none;
}
.survey-steps li {
  display: flex;
  flex: 1 1 0;
  align-items: center;
  gap: 6px;
  min-width: 0;
  padding: 7px 8px;
  color: var(--dim);
  border: 1px solid var(--line);
  background: rgba(8, 22, 38, 0.55);
  font-size: calc(11px * var(--fs, 1));
}
.survey-steps li b {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  border: 1px solid currentColor;
  border-radius: 50%;
  text-align: center;
  line-height: 16px;
  font-size: calc(10px * var(--fs, 1));
}
.survey-steps li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.survey-steps li.current { color: var(--cyan); border-color: rgba(59, 200, 255, 0.55); }
.survey-steps li.review { color: var(--orange); border-color: rgba(255, 138, 76, 0.5); }
.survey-steps li.done { color: var(--green); border-color: rgba(43, 214, 162, 0.4); }

.survey-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 10px 12px;
  border-top: 1px solid var(--line);
}
.survey-bar .primary-btn[disabled],
.survey-bar .ghost-btn[disabled] {
  opacity: 0.4;
  cursor: not-allowed;
}

.survey-empty {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 12px;
  height: 100%;
  padding: 28px 32px;
  max-width: 560px;
}
.survey-empty b { font-size: calc(20px * var(--fs, 1)); }
.survey-empty p { margin: 0; color: var(--muted); font-size: calc(13px * var(--fs, 1)); line-height: 1.6; }
.survey-empty-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.survey-file { display: inline-flex; align-items: center; cursor: pointer; }
.survey-url { display: flex; gap: 8px; width: 100%; }
.survey-url input {
  flex: 1;
  min-width: 0;
  padding: 8px 10px;
  color: var(--text);
  border: 1px solid var(--line);
  background: rgba(8, 22, 38, 0.8);
}

.survey-osgb {
  position: relative;
  min-height: 0;
  height: 100%;
  overflow: hidden;
  background: #071018;
}
.survey-osgb-canvas {
  position: absolute;
  inset: 0;
}
.survey-osgb-canvas .survey-canvas {
  width: 100%;
  height: 100%;
  display: block;
}
.survey-osgb-title {
  position: absolute;
  left: 10px;
  top: 10px;
  z-index: 5;
  max-width: calc(100% - 20px);
  padding: 5px 8px;
  color: rgba(229, 242, 250, 0.86);
  background: rgba(4, 12, 20, 0.78);
  font-size: calc(11px * var(--fs, 1));
  pointer-events: none;
}
.survey-osgb-scan {
  position: absolute;
  left: 0;
  right: 0;
  z-index: 3;
  height: 72px;
  background: linear-gradient(180deg, transparent, rgba(59, 200, 255, 0.28), transparent);
  animation: surveySlopeScan 2.1s linear infinite;
  pointer-events: none;
}
.survey-osgb-hud {
  position: absolute;
  left: 12px;
  bottom: 14px;
  z-index: 5;
  min-width: 280px;
  max-width: min(420px, calc(100% - 24px));
  padding: 12px 14px;
  border: 1px solid var(--line-strong);
  background: rgba(6, 18, 30, 0.9);
}
.survey-osgb-aim {
  position: absolute;
  left: 50%;
  top: 42%;
  z-index: 4;
  width: 168px;
  height: 124px;
  margin: -62px 0 0 -84px;
  border: 2px solid rgba(255, 82, 99, 0.9);
  box-shadow: 0 0 0 1px rgba(255, 82, 99, 0.28), inset 0 0 36px rgba(255, 82, 99, 0.12);
  pointer-events: none;
  animation: surveyAimPulse 1.15s ease-in-out infinite;
}
.survey-osgb-aim::before,
.survey-osgb-aim::after {
  content: "";
  position: absolute;
  background: #ff5263;
}
.survey-osgb-aim::before {
  left: 50%;
  top: -10px;
  width: 1px;
  height: calc(100% + 20px);
}
.survey-osgb-aim::after {
  top: 50%;
  left: -10px;
  height: 1px;
  width: calc(100% + 20px);
}
@keyframes surveyAimPulse {
  0%, 100% { transform: scale(1); opacity: 0.95; }
  50% { transform: scale(1.06); opacity: 0.7; }
}
.survey-osgb-hud em {
  display: block;
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
}
.survey-osgb-hud b { display: block; margin: 4px 0; font-size: calc(16px * var(--fs, 1)); }
.survey-osgb-hud span { color: var(--muted); font-size: calc(12px * var(--fs, 1)); line-height: 1.5; }
.survey-slope-done {
  position: relative;
  height: 100%;
  min-height: 0;
  overflow: hidden;
  background: #071018;
}
.survey-slope-done .survey-frame svg { pointer-events: auto; }
@keyframes surveySlopeScan {
  from { top: -80px; }
  to { top: 100%; }
}
.survey-osgb-side {
  position: absolute;
  top: 10px;
  right: 10px;
  bottom: 10px;
  z-index: 4;
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: 220px;
  pointer-events: none;
}
.survey-osgb-side > * { pointer-events: auto; }
.survey-osgb-mini {
  height: 148px;
  flex: none;
  background: #071018;
}
.survey-osgb-mini text { fill: #e9f4ff; font-size: calc(22px * var(--fs, 1)); }
.survey-osgb-rocks {
  flex: 1;
  min-height: 0;
  overflow: auto;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.survey-osgb-rocks .survey-shot {
  grid-template-columns: 56px 1fr;
  background: rgba(7, 19, 31, 0.9);
}
.survey-osgb-rocks .survey-shot img {
  width: 56px;
  height: 42px;
}
.survey-boot-card {
  position: absolute;
  left: 16px;
  top: 16px;
  z-index: 4;
  width: min(400px, calc(100% - 32px));
  height: auto;
  max-height: calc(100% - 32px);
  overflow: auto;
  padding: 20px 22px;
  border: 1px solid var(--line-strong);
  background: rgba(7, 19, 31, 0.92);
  box-shadow: 0 12px 36px rgba(0, 0, 0, 0.35);
}

.survey-pano {
  position: relative;
  min-height: 0;
  height: 100%;
  overflow: hidden;
  background: #071018;
}
.survey-pano-canvas {
  position: absolute;
  inset: 0;
}
.survey-pano-canvas .survey-canvas {
  width: 100%;
  height: 100%;
  display: block;
}
.survey-pano-hud {
  position: absolute;
  inset: 0;
  z-index: 4;
  width: 100%;
  height: 100%;
  pointer-events: none;
}
.survey-pano-hud .survey-box { pointer-events: auto; }
.survey-pano.editing .survey-pano-hud { pointer-events: auto; }
.survey-pano-title {
  position: absolute;
  left: 10px;
  top: 10px;
  z-index: 5;
  max-width: calc(100% - 20px);
  padding: 5px 8px;
  color: rgba(229, 242, 250, 0.86);
  background: rgba(4, 12, 20, 0.78);
  font-size: calc(11px * var(--fs, 1));
  pointer-events: none;
}
.survey-split > .survey-pano { min-height: 280px; }

.survey-frame,
.survey-map {
  position: relative;
  min-height: 0;
  height: 100%;
  background: #071018;
}
.survey-rock-mask {
  position: absolute;
  inset: 0;
  z-index: 8;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: rgba(4, 10, 18, 0.62);
}
.survey-rock-pop {
  position: relative;
  width: min(420px, 92%);
  padding: 12px;
  border: 1px solid var(--line-strong);
  background: rgba(7, 19, 31, 0.96);
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.45);
}
.survey-rock-pop img {
  display: block;
  width: 100%;
  height: 260px;
  object-fit: cover;
  border: 1px solid var(--line);
  background: #061018;
}
.survey-rock-pop b { display: block; margin: 10px 0 4px; font-size: calc(14px * var(--fs, 1)); }
.survey-rock-pop i {
  display: block;
  margin-top: 4px;
  color: var(--muted);
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
}
.survey-rock-pop-close {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 1;
  padding: 4px 8px;
  color: var(--text);
  border: 1px solid var(--line-strong);
  background: rgba(4, 12, 20, 0.75);
  cursor: pointer;
}
.survey-frame img,
.survey-frame svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.survey-frame svg { pointer-events: none; }
.survey-frame.editing svg { pointer-events: auto; }
.survey-box { pointer-events: auto; cursor: pointer; }
.survey-box rect {
  fill: rgba(255, 82, 99, 0.12);
  stroke: #ff5263;
  stroke-width: 6;
}
.survey-box.on rect { fill: rgba(59, 200, 255, 0.16); stroke: #3bc8ff; }
.survey-box text {
  fill: #fff4ea;
  font-size: calc(28px * var(--fs, 1));
  font-weight: 700;
  paint-order: stroke;
  stroke: #03101c;
  stroke-width: 5px;
}

.survey-split {
  display: grid;
  grid-template-columns: 1fr minmax(240px, 32%);
  gap: 8px;
  height: 100%;
  padding: 10px;
}
.survey-table {
  width: 100%;
  border-collapse: collapse;
  font-size: calc(11px * var(--fs, 1));
}
.survey-table th,
.survey-table td {
  padding: 6px 4px;
  border-bottom: 1px solid var(--line);
  text-align: left;
}
.survey-table tr.on td { color: var(--cyan); }
.survey-table input {
  width: 100%;
  padding: 4px 6px;
  color: var(--text);
  border: 1px solid var(--line);
  background: rgba(4, 12, 20, 0.7);
}

.survey-log {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 8px 10px 12px 8px;
}
.survey-log-hit {
  margin-top: 8px;
}
.survey-log-hit .survey-shot {
  grid-template-columns: 96px minmax(0, 1fr);
}
.survey-log-hit .survey-shot.has-del {
  grid-template-columns: 96px minmax(0, 1fr) auto;
}
.survey-log-hit .survey-shot img {
  width: 96px;
  height: 64px;
  object-fit: cover;
}
.survey-log-hit.is-removed {
  opacity: 0.45;
}
.survey-log-hit.is-removed .survey-shot-del {
  display: none;
}
.survey-shots {
  display: flex;
  flex-direction: column;
  gap: 8px;
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 0 12px 12px;
}
.survey-shots[hidden] {
  display: none;
}
.survey-shot {
  display: grid;
  grid-template-columns: 96px 1fr;
  gap: 8px;
  width: 100%;
  padding: 6px;
  color: inherit;
  text-align: left;
  border: 1px solid var(--line);
  background: rgba(8, 22, 38, 0.75);
  cursor: pointer;
}
.survey-shot.has-del { grid-template-columns: 96px 1fr auto; }
.survey-shots .survey-shot { grid-template-columns: 1fr; }
.survey-shots .survey-shot.has-del { grid-template-columns: 1fr auto; }
.survey-shot.on { border-color: var(--cyan); }
.survey-conf {
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
}
.survey-shot-del {
  align-self: start;
  padding: 4px 8px;
  color: var(--red);
  border: 1px solid rgba(255, 82, 99, 0.45);
  background: transparent;
  cursor: pointer;
}
.survey-shot img {
  width: 96px;
  height: 64px;
  object-fit: cover;
  border: 1px solid var(--line);
}
.survey-shots .survey-shot img {
  width: 100%;
  height: 118px;
  object-fit: contain;
  background: #071018;
}
.survey-shot span { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.survey-shot b { font-size: calc(12px * var(--fs, 1)); }
.survey-shot i { color: var(--muted); font-size: calc(11px * var(--fs, 1)); font-style: normal; line-height: 1.4; }
.survey-detect-run,
.survey-detect-done {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 220px;
  gap: 8px;
  height: 100%;
  min-height: 0;
  padding: 8px;
}
.survey-detect-film {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 0;
  overflow: auto;
}
.survey-detect-film .survey-shot,
.survey-detect-film .survey-shot.has-del {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  padding-right: 8px;
}
.survey-detect-film .survey-shot img {
  width: 100%;
  height: 86px;
  object-fit: cover;
}
.survey-detect-film .survey-shot b,
.survey-detect-film .survey-shot em,
.survey-detect-film .survey-shot i {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.survey-detect-film .survey-shot-del {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 22px;
  height: 22px;
  padding: 0;
  line-height: 20px;
  text-align: center;
  border: 0;
  background: rgba(5, 17, 29, 0.72);
  font-size: calc(16px * var(--fs, 1));
}
.survey-detect-pano,
.survey-detect-main {
  position: relative;
  min-width: 0;
  min-height: 0;
  background: #071018;
  border: 1px solid var(--line);
}
.survey-detect-pano { display: flex; }
.survey-detect-progress {
  position: absolute;
  left: 10px;
  right: 10px;
  bottom: 74px;
  z-index: 9;
  padding: 8px 10px 9px;
  border: 1px solid var(--line-strong);
  background: rgba(4, 12, 20, 0.84);
  pointer-events: none;
}
.survey-detect-progress[hidden] { display: none; }
.survey-detect-progress-bar {
  height: 5px;
  overflow: hidden;
  background: rgba(59, 200, 255, 0.14);
}
.survey-detect-progress-bar i {
  display: block;
  height: 100%;
  width: 0;
  background: linear-gradient(90deg, #1a8fbf, var(--cyan));
  box-shadow: 0 0 10px rgba(59, 200, 255, 0.45);
}
.survey-detect-progress em {
  display: block;
  margin-top: 6px;
  color: var(--cyan);
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
  letter-spacing: 0.2px;
}
.survey-detect-pano .survey-pano {
  position: relative;
  flex: 1;
  height: auto;
}
.survey-detect-main img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #071018;
}
.survey-detect-cap {
  position: absolute;
  left: 10px;
  bottom: 10px;
  padding: 6px 10px;
  color: #fff;
  background: rgba(5, 17, 29, 0.78);
  font-size: calc(13px * var(--fs, 1));
}
.survey-pano.locked .survey-film { opacity: 1; }
.survey-detect-pano .survey-pano-lock { display: none; }
.survey-pano.locked .survey-film button.active {
  color: #041018;
  background: var(--cyan);
  border-color: var(--cyan);
}
.survey-pano-lock {
  position: absolute;
  left: 10px;
  right: 10px;
  top: 40px;
  z-index: 8;
  padding: 6px 8px;
  color: #9ce8ff;
  background: rgba(4, 12, 20, 0.78);
  font-size: calc(11px * var(--fs, 1));
  pointer-events: none;
}
.survey-pano.locked::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--cyan), transparent);
  animation: survey-scan 1.8s linear infinite;
  z-index: 7;
  pointer-events: none;
}
@keyframes survey-scan {
  from { top: 8%; }
  to { top: 88%; }
}
.survey-landing-ready {
  display: grid;
  grid-template-columns: 148px minmax(0, 1fr);
  gap: 8px;
  height: 100%;
  min-height: 0;
  padding: 10px;
}
.survey-landing-ready .survey-osgb {
  border: 1px solid var(--line);
}
.survey-landing {
  display: grid;
  grid-template-columns: 148px 1fr;
  gap: 8px;
  height: 100%;
  min-height: 0;
  padding: 10px;
}
.survey-landing-thumbs {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 0;
  overflow: auto;
}
.survey-landing-thumbs .survey-shot { grid-template-columns: 1fr; }
.survey-landing-thumbs .survey-shot img { width: 100%; height: 72px; }
.survey-landing-main {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(220px, 28%);
  gap: 8px;
  min-height: 0;
}
.survey-landing-view {
  display: grid;
  grid-template-rows: minmax(0, 1fr) 64px;
  min-height: 0;
  min-width: 0;
}
.survey-landing-view > img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #f7f8f6;
  border: 1px solid var(--line);
}
.survey-landing-film {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 6px;
  min-height: 0;
}
.survey-landing-film img {
  width: 100%;
  height: 58px;
  object-fit: cover;
  border: 1px solid var(--line);
  background: #f7f8f6;
  cursor: pointer;
}
.survey-landing-film img.on { border-color: var(--cyan); }

.diagnosis-grid.check-wide {
  grid-template-columns: 1fr;
}
.diagnosis-grid.check-wide .diagnosis-right {
  display: none;
}
.survey-check {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 10px;
  height: 100%;
  min-height: 0;
  padding: 10px;
}
.survey-check-media {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1.2fr 1fr;
  gap: 8px;
  min-height: 0;
}
.survey-reel-pano {
  grid-column: 1 / -1;
  cursor: default;
}
.survey-reel {
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
  border: 1px solid var(--line);
  background: #071018;
  cursor: pointer;
}
.survey-reel b {
  padding: 6px 8px 0;
  font-size: calc(12px * var(--fs, 1));
}
.survey-reel i {
  padding: 4px 8px 6px;
  color: var(--muted);
  font-size: calc(10px * var(--fs, 1));
  font-style: normal;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.survey-reel img {
  flex: 1;
  min-height: 0;
  width: 100%;
  object-fit: contain;
  background: #0a1620;
}
.survey-check-pano {
  position: relative;
  flex: 1;
  min-height: 0;
}
.survey-check-pano .survey-pano {
  position: absolute;
  inset: 0;
  height: auto;
}
.survey-check-pano .survey-pano-lock,
.survey-check-pano .survey-pano-hud { display: none; }
.survey-check-pano .survey-pano-title { font-size: calc(10px * var(--fs, 1)); max-width: calc(100% - 12px); }
.survey-check-pano .survey-film {
  left: 4px;
  right: 4px;
  bottom: 4px;
  gap: 3px;
}
.survey-check-pano .survey-film button { padding: 2px 5px; font-size: calc(9px * var(--fs, 1)); }
.survey-check-report {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border: 1px solid var(--line);
  background: rgba(7, 19, 31, 0.92);
}
.survey-check-report-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 10px;
  border-bottom: 1px solid var(--line);
}
.survey-check-report-bar b { display: block; font-size: calc(13px * var(--fs, 1)); }
.survey-check-report-bar small { color: var(--muted); font-size: calc(11px * var(--fs, 1)); }
.survey-check-report-bar .primary-btn { flex: none; }
.survey-report {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 22px 28px 36px;
  color: #2a2218;
  background:
    linear-gradient(180deg, rgba(255, 252, 246, 0.96), rgba(244, 236, 220, 0.96));
  box-shadow: inset 0 0 0 1px rgba(90, 60, 30, 0.08);
}
.survey-report.writing::after {
  content: "▍";
  color: #8a3b12;
  animation: survey-caret 0.8s step-end infinite;
}
@keyframes survey-caret {
  50% { opacity: 0; }
}
.survey-report-cover {
  margin: 0 0 22px;
  padding-bottom: 16px;
  border-bottom: 2px solid #8b2e1f;
}
.survey-report-cover em {
  display: block;
  color: #8b2e1f;
  font-size: calc(11px * var(--fs, 1));
  font-style: normal;
  letter-spacing: 0.18em;
}
.survey-report-cover h2 {
  margin: 8px 0 8px;
  color: #1d1610;
  font-size: calc(22px * var(--fs, 1));
  font-weight: 700;
  line-height: 1.35;
  text-align: center;
}
.survey-report-cover > p {
  color: #6a5846;
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.65;
  text-align: center;
}
.survey-report-cover dl {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
  margin-top: 14px;
  border: 1px solid #c9b89a;
  background: rgba(255, 250, 240, 0.7);
}
.survey-report-cover dl div {
  display: grid;
  grid-template-columns: 72px 1fr;
  border-bottom: 1px solid #e2d4b8;
  border-right: 1px solid #e2d4b8;
}
.survey-report-cover dt,
.survey-report-cover dd {
  padding: 6px 8px;
  font-size: calc(12px * var(--fs, 1));
}
.survey-report-cover dt {
  color: #6a5846;
  background: #f3ead6;
}
.survey-report-cover dd {
  margin: 0;
  color: #2a2218;
}
.survey-report h3 {
  margin: 22px 0 10px;
  padding-left: 10px;
  border-left: 3px solid #8b2e1f;
  color: #1d1610;
  font-size: calc(16px * var(--fs, 1));
}
.survey-report p {
  margin: 0 0 10px;
  font-size: calc(13px * var(--fs, 1));
  line-height: 1.85;
  text-align: justify;
}
.survey-report-table {
  width: 100%;
  margin: 8px 0 14px;
  border-collapse: collapse;
  font-size: calc(11px * var(--fs, 1));
}
.survey-report-table th,
.survey-report-table td {
  padding: 6px 5px;
  border: 1px solid #c9b89a;
  text-align: center;
}
.survey-report-table th {
  color: #5a4634;
  background: #f3ead6;
  font-weight: 600;
}
.survey-report-fig {
  margin: 10px 0 16px;
}
.survey-report-fig img {
  display: block;
  width: 100%;
  min-height: 120px;
  max-height: 220px;
  object-fit: contain;
  background: #ece6d8;
  border: 1px solid #c9b89a;
}
.survey-report-fig figcaption {
  margin-top: 6px;
  color: #6a5846;
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.5;
  text-align: center;
}
.survey-report-empty { color: #7a6d5d; }
.survey-log-line {
  display: grid;
  grid-template-columns: 5.6em minmax(0, 1fr);
  align-items: baseline;
  column-gap: 10px;
  row-gap: 0;
  position: relative;
  padding: 6px 2px 6px 14px;
  color: var(--muted);
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.55;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.construct-log .survey-log-line {
  grid-template-columns: 120px minmax(0, 1fr);
}
.survey-log-line::before {
  content: "";
  position: absolute;
  left: 0;
  top: calc(6px + 0.775em - 3px);
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--cyan);
  box-shadow: 0 0 0 3px rgba(59, 200, 255, 0.12);
}
.survey-log-line::after {
  content: "";
  position: absolute;
  left: 2px;
  top: calc(6px + 0.775em + 4px);
  bottom: -6px;
  width: 1px;
  background: rgba(59, 200, 255, 0.16);
}
.survey-log-line:last-child::after { display: none; }
.survey-log-line time {
  display: block;
  margin: 0;
  padding: 0;
  color: var(--dim);
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.55;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  letter-spacing: 0;
  white-space: nowrap;
}
.survey-log-line p {
  min-width: 0;
  margin: 0;
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.55;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.survey-log-line b {
  margin-right: 6px;
  color: var(--cyan);
  font-size: calc(12px * var(--fs, 1));
  font-weight: 600;
  line-height: inherit;
}
.survey-landing-img {
  display: block;
  width: 100%;
  max-height: 160px;
  object-fit: cover;
  border: 1px solid var(--line);
  margin-top: 4px;
}

#protection.page.active {
  display: flex;
  flex-direction: column;
  min-height: 0;
}
#protection .protection-layout {
  flex: 1;
  min-height: 0;
  grid-template-columns: minmax(0, 1.05fr) minmax(360px, 0.95fr);
}
#protection .design-sheet-tabs {
  display: flex;
  flex-wrap: nowrap;
  overflow-x: auto;
  gap: 6px;
  padding: 8px 10px;
  border-bottom: 1px solid var(--line);
  background: rgba(5, 17, 29, 0.92);
}
#protection .design-sheet-tabs button {
  flex: 0 0 auto;
}
#protection .ai-workbar.done span::after,
.ai-workbar.done span::after {
  content: none;
  animation: none;
}
.design-wait {
  padding: 14px 12px;
  color: var(--muted);
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.6;
}
.plan-side {
  overflow: hidden;
}
.design-scheme {
  position: relative;
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
  border: 1px solid var(--line);
  background: rgba(7, 19, 31, 0.92);
}
.module-pending {
  position: absolute;
  inset: 0;
  z-index: 8;
  display: grid;
  place-items: center;
  align-content: center;
  gap: 14px;
  background: #071018;
}
.module-pending.hidden { display: none; }
.module-pending i {
  width: 36px;
  height: 36px;
  border: 2px solid rgba(59, 200, 255, 0.18);
  border-top-color: var(--cyan);
  border-radius: 50%;
  animation: designSpin 0.75s linear infinite;
}
.module-pending b {
  color: var(--muted);
  font-size: calc(13px * var(--fs, 1));
  letter-spacing: 1px;
  font-weight: 500;
}
@keyframes designSpin { to { transform: rotate(360deg); } }
#acquire.page.active,
#diagnosis.page.active,
#construct.page.active,
#protection.page.active,
#opsProjectView {
  position: relative;
}
#diagnosis.page.active {
  display: flex;
  flex-direction: column;
  min-height: 0;
}
#diagnosis .diagnosis-grid { flex: 1; min-height: 0; }
.design-scheme-tabs {
  display: flex;
  justify-content: flex-start;
  flex-shrink: 0;
  border-bottom: 1px solid var(--line);
}
.design-scheme-tabs button {
  flex: 0 0 auto;
  height: 36px;
  padding: 0 16px;
  border: 0;
  border-bottom: 2px solid transparent;
  background: transparent;
  color: var(--muted);
  font-size: calc(13px * var(--fs, 1));
  letter-spacing: 0.3px;
  cursor: pointer;
}
.design-scheme-tabs button.active {
  color: var(--cyan);
  border-bottom-color: var(--cyan);
  background: rgba(59, 200, 255, 0.06);
}
.design-scheme-tabs button:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}
.design-scheme-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 10px;
  border-bottom: 1px solid var(--line);
}
.design-scheme-bar b { display: block; font-size: calc(13px * var(--fs, 1)); }
.design-scheme-bar small { color: var(--muted); font-size: calc(11px * var(--fs, 1)); }
.design-scheme-actions {
  display: flex;
  align-items: center;
  gap: 8px;
}
.design-layout-pane,
.design-brief {
  flex: 1;
  min-height: 0;
  margin: 0;
  border: none;
}
.design-layout-pane {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: #071018;
}
.design-layout-stage {
  position: relative;
  flex: 1;
  min-height: 0;
  background:
    linear-gradient(rgba(59, 200, 255, 0.03) 1px, transparent 1px),
    linear-gradient(90deg, rgba(59, 200, 255, 0.03) 1px, transparent 1px),
    #071018;
  background-size: 28px 28px, 28px 28px, auto;
}
.design-layout-stage > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  object-position: center bottom;
  filter: saturate(0.92) contrast(1.04);
}
.design-layout-hud {
  position: absolute;
  left: 10px;
  right: 10px;
  top: 10px;
  z-index: 5;
  display: block;
  max-width: min(520px, calc(100% - 20px));
  max-height: min(48%, 260px);
  padding: 8px 10px;
  color: #e8f6ff;
  background: rgba(4, 12, 20, 0.78);
  pointer-events: none;
}
.design-layout-log {
  display: flex;
  flex-direction: column;
  gap: 2px;
  max-height: 244px;
  overflow-y: auto;
  pointer-events: auto;
}
.design-layout-log-line {
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr);
  column-gap: 8px;
  align-items: start;
  color: #9ec4d8;
  font-size: calc(12px * var(--fs, 1));
  line-height: 1.55;
}
.design-layout-log-line.is-idle {
  grid-template-columns: 14px minmax(0, 1fr);
  align-items: center;
  color: #e8f6ff;
}
.design-layout-log-line time {
  color: #7ea3b6;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  white-space: nowrap;
}
.design-layout-log-line p {
  margin: 0;
  white-space: normal;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.design-layout-log-line.is-live {
  color: #e8f6ff;
}
.design-layout-log-line.is-live p,
.design-layout-log-line.is-idle p {
  display: flex;
  align-items: flex-start;
  gap: 6px;
}
.design-layout-hud .ai-pulse { margin: 4px 0 0; flex: 0 0 auto; }
.design-layout-step {
  display: grid;
  grid-template-columns: 6.2em minmax(0, 1fr);
  align-items: start;
  column-gap: 10px;
  padding: 8px 0;
  border-bottom: 1px dashed rgba(36, 28, 20, 0.12);
  color: #3a3026;
  font-size: calc(13px * var(--fs, 1));
  line-height: 1.6;
}
.design-layout-step time {
  color: #8a6a38;
  font-size: calc(13px * var(--fs, 1));
  line-height: 1.6;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  white-space: nowrap;
}
.design-layout-step p {
  margin: 0;
}
.design-layout-effects {
  margin-top: 8px;
}
.design-layout-map img {
  max-height: 460px;
  background: #fff;
}
.design-layout-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 12px;
  margin-top: 8px;
  color: #6a5846;
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.5;
}
.design-layout-hint {
  margin: 4px 0 12px;
}
.design-layout-map img {
  max-height: 460px;
  background: #fff;
}
.design-layout-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 12px;
  margin-top: 8px;
  color: #6a5846;
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.5;
}
.design-layout-hint {
  margin: 4px 0 12px;
}
.design-brief-fig {
  margin: 10px 0 14px;
}
.design-brief-fig img {
  display: block;
  width: 100%;
  max-height: 180px;
  object-fit: contain;
  background: #e8edf2;
  border: 1px solid rgba(36, 28, 20, 0.12);
}
.design-brief-fig figcaption {
  margin-top: 4px;
  color: #6a5c4c;
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.45;
}
.scheme-dialog {
  width: min(1080px, 92%);
  height: min(860px, 88%);
  min-height: 0;
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
  background: #f4efe4;
  color: #241c14;
}
.scheme-dialog .news-dialog-head {
  flex-shrink: 0;
  margin: 0;
  padding: 18px 24px 12px;
  border-bottom: 1px solid rgba(36, 28, 20, 0.1);
}
.scheme-dialog .news-dialog-head h2 {
  color: #241c14;
  font-size: calc(22px * var(--fs, 1));
}
.scheme-dialog .news-dialog-head em { color: #8a6a38; }
.scheme-dialog .ghost-mini {
  color: #5a4a38;
  border-color: rgba(36, 28, 20, 0.18);
}
.scheme-dialog-body {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 8px 28px 20px;
}
.scheme-dialog-body h3 {
  margin: 18px 0 8px;
  color: #241c14;
  font-size: calc(16px * var(--fs, 1));
}
.scheme-dialog-body p,
.scheme-dialog-body li {
  color: #3a3026;
  font-size: calc(13px * var(--fs, 1));
  line-height: 1.75;
}
.scheme-dialog-body ul {
  margin: 0 0 10px;
  padding-left: 1.2em;
}
.scheme-dialog-body strong { color: #241c14; }
.scheme-dialog-body .design-brief-fig img { max-height: 280px; }
.scheme-dialog-foot {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  flex-shrink: 0;
  padding: 12px 24px 16px;
  border-top: 1px solid rgba(36, 28, 20, 0.1);
}
.scheme-dialog-foot[hidden] {
  display: none;
}
.scheme-dialog-foot .ghost-btn {
  color: #5a4a38;
  border-color: rgba(36, 28, 20, 0.2);
}
.scheme-dialog-foot .ghost-btn:disabled { opacity: 0.4; }
.scheme-caret {
  display: inline-block;
  width: 7px;
  height: 15px;
  margin-left: 3px;
  background: #2a6d8f;
  vertical-align: text-bottom;
  animation: geoCaret 1s step-end infinite;
}

@media (max-width: 1600px) {
  :root {
    --nav-w: 76px;
    --rail-w: 152px;
    --side-left: minmax(220px, 260px);
    --side-right: minmax(230px, 280px);
    --page-pad: 12px;
  }
  .topbar { padding: 0 18px; }
  .construct-head {
    grid-template-columns: minmax(160px, 1.4fr) repeat(4, minmax(0, 1fr));
  }
  .acquire-grid {
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 1.35fr) minmax(0, 1.7fr);
  }
}

@media (max-width: 1440px) {
  :root {
    --nav-w: 68px;
    --rail-w: 140px;
    --topbar-h: 64px;
    --page-gap: 10px;
    --page-pad: 10px;
    --side-left: minmax(200px, 236px);
    --side-right: minmax(210px, 250px);
  }
  .brand-logo { width: 38px; height: 38px; }
  .brand strong { font-size: calc(16px * var(--fs, 1)); }
  .clock { min-width: 0; font-size: calc(12px * var(--fs, 1)); }
  .header-meta { gap: 10px; }
  .nav { padding: 10px 6px 8px; gap: 8px; }
  .nav-btn { min-height: 54px; }
  .nav-icon { font-size: calc(14px * var(--fs, 1)); margin-bottom: 3px; }
  .nav-label { font-size: calc(10px * var(--fs, 1)); }
  .metrics { gap: 6px; padding: 8px; }
  .metric .value { font-size: calc(17px * var(--fs, 1)); }
  .metric .name { font-size: calc(10px * var(--fs, 1)); }
  .three-col,
  .acquire-grid {
    gap: 10px;
    grid-template-columns: minmax(0, 1.05fr) minmax(0, 1.25fr) minmax(0, 1.55fr);
  }
  .protection-layout,
  #protection .protection-layout {
    grid-template-columns: minmax(0, 1fr) minmax(260px, 0.92fr);
  }
  .diagnosis-grid {
    grid-template-columns: minmax(0, 1fr) minmax(220px, 280px);
  }
  .construct-grid {
    grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr) minmax(0, 0.9fr);
  }
  .construct-head .ch-kpi b { font-size: calc(14px * var(--fs, 1)); }
  .monitor-left { grid-template-rows: minmax(0, 1fr) minmax(170px, 26%); }
  .monitor-right { grid-template-rows: minmax(0, 1fr) minmax(150px, 22%); }
  .chat-layer {
    width: min(380px, 36vw);
    height: min(520px, 62vh);
  }
}

@media (max-width: 1280px) {
  :root {
    --nav-w: 58px;
    --rail-w: 124px;
    --topbar-h: 58px;
    --page-pad: 8px;
    --side-left: minmax(176px, 208px);
    --side-right: minmax(190px, 228px);
  }
  .topbar { padding: 0 12px; }
  .brand span { display: none; }
  .header-meta { gap: 8px; }
  .ghost-mini { padding: 4px 8px; }
  .nav-btn { min-height: 48px; padding: 6px 2px; }
  .nav-icon { font-size: calc(12px * var(--fs, 1)); }
  .nav-label { font-size: calc(9px * var(--fs, 1)); }
  .construct-head {
    grid-template-columns: minmax(140px, 1.5fr) repeat(4, minmax(0, 1fr));
    gap: 6px;
    padding: 8px 10px;
  }
  #protection .protection-layout,
  .protection-layout {
    grid-template-columns: minmax(0, 1fr) minmax(240px, 0.88fr);
  }
  .diagnosis-grid {
    grid-template-columns: minmax(0, 1fr) minmax(200px, 250px);
  }
  .ops-kpi { gap: 8px; }
  .settings-card { width: min(760px, 94%); }
}

@media (max-width: 1100px) {
  :root {
    --rail-w: 112px;
    --side-left: minmax(160px, 190px);
    --side-right: minmax(176px, 210px);
  }
  .acquire-grid,
  .three-col {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  }
  .acquire-grid > .panel:last-child {
    grid-column: 1 / -1;
  }
  .construct-grid {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
  }
  .construct-grid > .panel:last-child {
    grid-column: 1 / -1;
  }
}

/* AI 勘察 · 灾害回顾（第一步）：大图逐张回顾 */
.survey-history {
  position: relative;
  height: 100%;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 14px 16px 14px;
  overflow: hidden;
}
.survey-history-head {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}
.survey-history-head b {
  position: relative;
  padding-left: 12px;
  color: var(--text);
  font-size: calc(17px * var(--fs, 1));
  letter-spacing: 0.5px;
}
.survey-history-head b::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 3px;
  height: 15px;
  border-radius: 2px;
  transform: translateY(-50%);
  background: var(--cyan);
  box-shadow: 0 0 10px rgba(59, 200, 255, 0.7);
}
.survey-history-stat {
  color: var(--muted);
  font-size: calc(12px * var(--fs, 1));
}
.survey-history-flag {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 12px;
  border: 1px solid rgba(255, 138, 76, 0.42);
  border-radius: 999px;
  background: rgba(255, 138, 76, 0.1);
  color: var(--orange);
  font-size: calc(11.5px * var(--fs, 1));
}
.survey-history-flag::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
  box-shadow: 0 0 8px currentColor;
}
.survey-history-flag.is-calm {
  border-color: rgba(43, 214, 162, 0.32);
  background: rgba(43, 214, 162, 0.08);
  color: var(--green);
}
/* 舞台：左图 6 + 右详情 4，比例固定、不随图片比例变化。
   用 3fr/2fr 而不是百分比：grid 会自己处理 gap，不会因为 gap 导致右栏被挤出去。 */
.survey-history-stage {
  flex: 1;
  min-height: 0;
  display: grid;
  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
  gap: 18px;
  padding: 16px;
  border: 1px solid rgba(58, 176, 255, 0.14);
  border-radius: 16px;
  background:
    radial-gradient(120% 120% at 0% 0%, rgba(26, 58, 82, 0.5) 0%, rgba(9, 20, 29, 0.94) 58%),
    linear-gradient(180deg, rgba(16, 30, 42, 0.9) 0%, rgba(8, 18, 26, 0.9) 100%);
}
.survey-history-stage.is-high { border-color: rgba(255, 138, 76, 0.42); }
.survey-history-big {
  margin: 0;
  display: flex;
  flex-direction: column;
  min-height: 0;
}
/* 固定尺寸的展示框：尺寸只跟舞台走，与图片比例无关。
   图片在框内按真实比例缩到最大并居中（absolute + inset + margin:auto，
   比 width/height:100% + object-fit 干净：后者会把框撑满，比例不符时留大片黑边）。
   框内有底色，竖图两侧 / 横图上下的留白看上去是相框内衬，而不是漏空。 */
.survey-history-shot-wrap {
  position: relative;
  flex: 1;
  min-height: 0;
  border: 1px solid rgba(58, 176, 255, 0.12);
  border-radius: 12px;
  background: rgba(4, 13, 20, 0.62);
}
.survey-history-big img {
  position: absolute;
  inset: 8px;
  margin: auto;
  width: auto;
  height: auto;
  max-width: calc(100% - 16px);
  max-height: calc(100% - 16px);
  border-radius: 8px;
  box-shadow: 0 14px 38px rgba(0, 0, 0, 0.6);
  animation: survey-history-in 0.3s ease-out;
}
@keyframes survey-history-in {
  from { opacity: 0; transform: translateY(6px); }
  to { opacity: 1; transform: none; }
}
/* 资料包里某条台账没配照片时的占位 */
.survey-history-nopic {
  position: absolute;
  inset: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px dashed rgba(120, 190, 240, 0.24);
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.02);
  color: var(--dim);
  font-size: calc(13px * var(--fs, 1));
  letter-spacing: 1px;
}
/* 翻页箭头：浮在图片两侧的玻璃圆钮，禁用时淡出 */
.survey-history-arrow {
  position: absolute;
  top: 50%;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border: 1px solid rgba(120, 190, 240, 0.3);
  border-radius: 50%;
  background: rgba(8, 22, 32, 0.76);
  backdrop-filter: blur(8px);
  color: #a8dcf7;
  cursor: pointer;
  transform: translateY(-50%);
  transition: background 0.18s, color 0.18s, border-color 0.18s;
}
.survey-history-arrow.is-prev { left: 12px; }
.survey-history-arrow.is-next { right: 12px; }
.survey-history-arrow:hover:not(:disabled) {
  border-color: var(--cyan);
  background: rgba(59, 200, 255, 0.22);
  color: #fff;
}
.survey-history-arrow:disabled {
  opacity: 0.26;
  cursor: default;
}
.survey-history-big figcaption {
  flex: none;
  margin-top: 10px;
  text-align: center;
  color: var(--dim);
  font-size: calc(11.5px * var(--fs, 1));
  letter-spacing: 0.5px;
}
.survey-history-detail {
  display: flex;
  flex-direction: column;
  min-height: 0;
  gap: 12px;
  padding-right: 2px;
}
/* 当前记录的关键事实，贴顶排布 */
.survey-history-body {
  flex: none;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.survey-history-seq {
  display: flex;
  align-items: baseline;
  gap: 7px;
  font-family: ui-monospace, monospace;
}
.survey-history-seq b {
  color: var(--cyan);
  font-family: inherit;
  font-size: calc(30px * var(--fs, 1));
  line-height: 1;
  letter-spacing: 1px;
  text-shadow: 0 0 18px rgba(59, 200, 255, 0.45);
}
.survey-history-seq > span {
  color: var(--dim);
  font-size: calc(13px * var(--fs, 1));
}
.survey-history-meta {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}
.survey-history-meta time {
  color: var(--text);
  font-family: ui-monospace, monospace;
  font-size: calc(26px * var(--fs, 1));
  letter-spacing: 1px;
}
.survey-history-meta em {
  color: var(--cyan);
  font-style: normal;
  font-size: calc(14px * var(--fs, 1));
  letter-spacing: 0.5px;
}
.survey-history-tag {
  padding: 3px 10px;
  border: 1px solid rgba(43, 214, 162, 0.35);
  border-radius: 999px;
  background: rgba(43, 214, 162, 0.12);
  color: var(--green);
  font-size: calc(11.5px * var(--fs, 1));
  white-space: nowrap;
}
.is-high .survey-history-tag {
  border-color: rgba(255, 138, 76, 0.42);
  background: rgba(255, 138, 76, 0.14);
  color: var(--orange);
}
.is-mid .survey-history-tag {
  border-color: rgba(255, 209, 102, 0.38);
  background: rgba(255, 209, 102, 0.12);
  color: #ffd166;
}
/* 台账原文按引文排版，左侧细线；不再 flex:1 撑满，避免右栏中部留下大片空白。
   固定预留三行高度（实测最长 36 字也只占 2 行）：换记录时下方"历次记录"的起始位置不跳。
   用 em 而不是 px —— font-size 本身已带 var(--fs)，em 会自动跟随字号档位。 */
.survey-history-sum {
  margin: 0;
  min-height: calc(1.85em * 3);
  padding-left: 12px;
  border-left: 2px solid rgba(120, 190, 240, 0.22);
  color: var(--text);
  font-size: calc(15px * var(--fs, 1));
  line-height: 1.85;
}
/* 历次记录索引：占满右栏剩余高度，滚动条按项目规矩隐藏但可滚 */
.survey-history-logs {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 9px 11px 10px;
  border: 1px solid rgba(58, 176, 255, 0.12);
  border-radius: 12px;
  background: rgba(6, 17, 25, 0.55);
}
.survey-history-logs-title {
  flex: none;
  color: var(--dim);
  font-size: calc(11px * var(--fs, 1));
  letter-spacing: 1.2px;
}
.survey-history-dots {
  flex: 1;
  min-height: 0;
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  overflow: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.survey-history-dots::-webkit-scrollbar { width: 0; height: 0; display: none; }
/* 索引多于可视高度时，底部渐隐暗示"还能往下翻"（滚动条按项目规矩是隐藏的） */
.survey-history-logs.is-clipped .survey-history-dots {
  mask-image: linear-gradient(180deg, #000 calc(100% - 16px), transparent 100%);
  -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 16px), transparent 100%);
}
.survey-history-dot {
  width: 100%;
  height: 38px;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 11px;
  border: 1px solid var(--line);
  border-left: 2px solid rgba(120, 190, 240, 0.28);
  border-radius: 8px;
  background: rgba(255, 255, 255, 0.03);
  color: var(--dim);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: border-color 0.16s, background 0.16s, color 0.16s;
}
.survey-history-dot b {
  flex: none;
  color: inherit;
  font-family: ui-monospace, monospace;
  font-size: calc(12px * var(--fs, 1));
  letter-spacing: 0.5px;
}
.survey-history-dot time {
  flex: none;
  font-family: ui-monospace, monospace;
  font-size: calc(12.5px * var(--fs, 1));
  letter-spacing: 0.3px;
}
.survey-history-dot > span {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  font-size: calc(12px * var(--fs, 1));
  text-overflow: ellipsis;
  white-space: nowrap;
}
.survey-history-dot:hover { border-color: rgba(59, 200, 255, 0.5); color: #bfe8ff; }
.survey-history-dot.high { border-left-color: rgba(255, 138, 76, 0.55); }
.survey-history-dot.mid { border-left-color: rgba(255, 209, 102, 0.55); }
.survey-history-dot.on {
  border-color: var(--cyan);
  border-left-color: var(--cyan);
  background: rgba(59, 200, 255, 0.14);
  color: #d8f2ff;
}
.survey-history-dot.high.on {
  border-color: var(--orange);
  border-left-color: var(--orange);
  background: rgba(255, 138, 76, 0.16);
  color: #ffd9bf;
}
.survey-history-dot.mid.on {
  border-color: #ffd166;
  border-left-color: #ffd166;
  background: rgba(255, 209, 102, 0.14);
  color: #ffeab5;
}
.survey-history-note {
  flex: none;
  margin: 0;
  color: var(--dim);
  font-size: calc(11px * var(--fs, 1));
  line-height: 1.7;
}
@media (max-width: 1180px) {
  .survey-history-stage { gap: 12px; padding: 13px; }
  .survey-history { padding: 12px 14px; gap: 10px; }
}
/* 舞台容器偏窄时（由 JS 按真实宽度打 is-compact）压缩密度，保证 6 条索引不被裁 */
.survey-history-stage.is-compact .survey-history-logs { padding: 9px 10px 10px; gap: 6px; }
.survey-history-stage.is-compact .survey-history-dots { gap: 5px; }
.survey-history-stage.is-compact .survey-history-dot { height: 30px; padding: 0 9px; gap: 8px; }
.survey-history-stage.is-compact .survey-history-dot b,
.survey-history-stage.is-compact .survey-history-dot time,
.survey-history-stage.is-compact .survey-history-dot > span { font-size: calc(11.5px * var(--fs, 1)); }
.survey-history-stage.is-compact .survey-history-meta time { font-size: calc(22px * var(--fs, 1)); }
.survey-history-stage.is-compact .survey-history-seq b { font-size: calc(26px * var(--fs, 1)); }
.survey-history-stage.is-compact .survey-history-sum { font-size: calc(14px * var(--fs, 1)); }
