/* ============================================================
   矿产资源智能辅助平台 — 样式系统
   ============================================================ */

:root {
  /* 主色：深青蓝（稳重、资源、国资感） */
  --c-primary-900: #0A2540;
  --c-primary-800: #0D3050;
  --c-primary-700: #124168;
  --c-primary-600: #1A5A8C;
  --c-primary-500: #2B7BB9;
  --c-primary-400: #4E9AD6;
  --c-primary-200: #B8D8F0;
  --c-primary-100: #E4F0FA;
  --c-primary-50:  #F3F8FC;

  /* 强调：矿石琥珀金 */
  --c-accent-600: #B8860B;
  --c-accent-500: #D4A017;
  --c-accent-400: #E8BC3E;
  --c-accent-100: #FDF6E3;

  /* 语义色（中国习惯：涨红跌绿） */
  --c-up: #D93025;
  --c-up-bg: #FDECEA;
  --c-down: #1E8E3E;
  --c-down-bg: #E8F5E9;
  --c-warn: #E37400;
  --c-warn-bg: #FFF4E5;
  --c-info: #1A73E8;
  --c-info-bg: #E8F0FE;

  /* 中性 */
  --c-ink-900: #101828;
  --c-ink-800: #1D2939;
  --c-ink-700: #344054;
  --c-ink-600: #475467;
  --c-ink-500: #667085;
  --c-ink-400: #98A2B3;
  --c-ink-300: #D0D5DD;
  --c-ink-200: #EAECF0;
  --c-ink-100: #F2F4F7;
  --c-ink-50:  #F9FAFB;
  --c-white: #FFFFFF;

  /* 交互统一量 */
  --ring: 0 0 0 3px rgba(43,123,185,.16);
  --ring-gold: 0 0 0 3px rgba(212,160,23,.18);
  --ctl-h: 34px;              /* 控件统一高度 */
  --radius-sm: 7px;
  --radius: 9px;
  --radius-lg: 13px;
  --radius-xl: 18px;

  --shadow-xs: 0 1px 2px rgba(16,24,40,.04);
  --shadow-sm: 0 1px 2px rgba(16,24,40,.05), 0 1px 3px rgba(16,24,40,.05);
  --shadow: 0 2px 4px rgba(16,24,40,.04), 0 6px 16px rgba(16,24,40,.07);
  --shadow-md: 0 8px 24px rgba(16,24,40,.10);
  --shadow-lg: 0 16px 40px rgba(16,24,40,.14);

  --sidebar-w: 236px;
  --header-h: 60px;
  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  --mono: "SF Mono", "JetBrains Mono", Consolas, "Courier New", monospace;

  /* 图表统一色板（与 CHART_COLORS 保持一致） */
  --chart-1: #2E7DB8; --chart-2: #E0A82E; --chart-3: #2FA37C;
  --chart-4: #7C6FD0; --chart-5: #E07A5F; --chart-6: #3FA7C4;
  --chart-7: #C084B8; --chart-8: #8A94A6;
}

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

html, body { height: 100%; }

body {
  font-family: var(--font);
  font-size: 14px;
  color: var(--c-ink-800);
  background: var(--c-ink-50);
  -webkit-font-smoothing: antialiased;
  overflow: hidden;
}

/* ============ 布局骨架 ============ */
.app { display: flex; height: 100vh; }

/* ---- 侧边栏 ---- */
.sidebar {
  width: var(--sidebar-w);
  flex: 0 0 var(--sidebar-w);
  background: linear-gradient(180deg, var(--c-primary-900) 0%, var(--c-primary-800) 100%);
  display: flex; flex-direction: column;
  color: #fff;
  position: relative;
  z-index: 20;
}

.brand {
  height: var(--header-h);
  display: flex; align-items: center; gap: 10px;
  padding: 0 18px;
  border-bottom: 1px solid rgba(255,255,255,.08);
  flex: 0 0 var(--header-h);
}
.brand-logo {
  width: 30px; height: 30px; flex: 0 0 30px;
  border-radius: 8px;
  background: linear-gradient(135deg, var(--c-accent-400), var(--c-accent-600));
  display: grid; place-items: center;
  font-size: 16px;
  box-shadow: 0 2px 8px rgba(212,160,23,.4);
}
.brand-text { line-height: 1.25; }
.brand-text b { font-size: 13.5px; font-weight: 700; letter-spacing: .2px; display: block; }
.brand-text span { font-size: 10px; color: rgba(255,255,255,.45); letter-spacing: .6px; }

.nav { flex: 1; overflow-y: auto; padding: 12px 10px; }
.nav::-webkit-scrollbar { width: 0; }

.nav-group-label {
  font-size: 10px; font-weight: 700; letter-spacing: 1px;
  color: rgba(255,255,255,.32);
  padding: 14px 10px 6px;
  text-transform: uppercase;
}

.nav-item {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 10px;
  border-radius: 8px;
  color: rgba(255,255,255,.72);
  cursor: pointer;
  font-size: 13px;
  transition: all .16s ease;
  margin-bottom: 2px;
  user-select: none;
  position: relative;
}
.nav-item:hover { background: rgba(255,255,255,.07); color: #fff; }
.nav-item.active {
  background: linear-gradient(90deg, rgba(43,123,185,.42), rgba(43,123,185,.16));
  color: #fff;
  font-weight: 600;
}
.nav-item.active::before {
  content: ''; position: absolute; left: -10px; top: 50%;
  transform: translateY(-50%);
  width: 3px; height: 18px;
  background: var(--c-accent-400);
  border-radius: 0 3px 3px 0;
  box-shadow: 0 0 8px rgba(232,188,62,.6);
}
.nav-item:active { transform: scale(.985); }
.nav-icon { width: 16px; text-align: center; font-size: 14px; opacity: .9; flex: 0 0 16px; }
.nav-badge {
  margin-left: auto;
  background: var(--c-accent-500);
  color: var(--c-primary-900);
  font-size: 10px; font-weight: 700;
  padding: 1px 6px; border-radius: 8px;
  min-width: 18px; text-align: center;
}

.sidebar-foot {
  padding: 12px 14px;
  border-top: 1px solid rgba(255,255,255,.08);
  font-size: 11px;
  color: rgba(255,255,255,.4);
  display: flex; align-items: center; gap: 8px;
}
.dot-live {
  width: 6px; height: 6px; border-radius: 50%;
  background: #4ADE80;
  box-shadow: 0 0 0 3px rgba(74,222,128,.2);
  animation: pulse 2s infinite;
}
/* 版本号：便于一眼判断客户端是否为最新发布版 */
.sb-ver {
  margin-left: auto; font-size: 10.5px; font-weight: 700;
  letter-spacing: .02em; color: rgba(255,255,255,.55);
  background: rgba(255,255,255,.08); border-radius: 5px;
  padding: 1px 6px; cursor: help;
}
@keyframes pulse { 0%,100%{opacity:1} 50%{opacity:.4} }

/* ---- 主区域 ---- */
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; }

.topbar {
  height: var(--header-h); flex: 0 0 var(--header-h);
  background: rgba(255,255,255,.86);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--c-ink-200);
  display: flex; align-items: center;
  padding: 0 22px;
  gap: 16px;
  z-index: 10;
}
.page-title { font-size: 16px; font-weight: 700; color: var(--c-ink-900); letter-spacing: -.2px; }
.page-sub { font-size: 12px; color: var(--c-ink-500); margin-top: 1px; }

.topbar-search {
  margin-left: auto;
  display: flex; align-items: center; gap: 8px;
  background: var(--c-ink-100);
  border: 1px solid transparent;
  border-radius: 10px;
  height: 34px;
  padding: 0 12px;
  width: 280px;
  transition: all .16s;
}
.topbar-search:focus-within { background: #fff; border-color: var(--c-primary-400); box-shadow: var(--ring); }
.topbar-search input { border: 0; background: transparent; outline: 0; font-size: 13px; width: 100%; font-family: var(--font); color: var(--c-ink-800); }
.topbar-search input::placeholder { color: var(--c-ink-400); }

.topbar-btn {
  width: 34px; height: 34px; border-radius: 8px;
  border: 1px solid var(--c-ink-200);
  background: #fff; cursor: pointer;
  display: grid; place-items: center;
  font-size: 14px; color: var(--c-ink-600);
  transition: all .16s;
  position: relative;
}
.topbar-btn:hover { background: var(--c-ink-50); border-color: var(--c-ink-300); }
.topbar-btn .dot {
  position: absolute; top: 6px; right: 6px;
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--c-up); border: 1.5px solid #fff;
}

.user-chip {
  display: flex; align-items: center; gap: 9px;
  padding: 4px 10px 4px 4px;
  border-radius: 20px;
  border: 1px solid var(--c-ink-200);
  cursor: pointer;
  transition: all .16s;
}
.user-chip:hover { background: var(--c-ink-50); }
.avatar {
  width: 26px; height: 26px; border-radius: 50%;
  background: linear-gradient(135deg, var(--c-primary-500), var(--c-primary-700));
  color: #fff; display: grid; place-items: center;
  font-size: 11px; font-weight: 700;
}
.user-chip span { font-size: 12.5px; font-weight: 500; color: var(--c-ink-700); }

.content { flex: 1; overflow-y: auto; padding: 20px 22px 32px; }
.content::-webkit-scrollbar { width: 9px; }
.content::-webkit-scrollbar-thumb { background: var(--c-ink-300); border-radius: 5px; border: 2px solid var(--c-ink-50); }
.content::-webkit-scrollbar-thumb:hover { background: var(--c-ink-400); }

/* ============ 页面切换 ============ */
.page { display: none; animation: fadeUp .28s ease; }
.page.active { display: block; }
@keyframes fadeUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* ============ 通用组件 ============ */
.card {
  background: #fff;
  border: 1px solid var(--c-ink-200);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xs);
  transition: box-shadow .18s ease, border-color .18s ease;
}
.card:hover { box-shadow: var(--shadow-sm); }
.card-head {
  display: flex; align-items: center; gap: 10px;
  padding: 13px 18px;
  border-bottom: 1px solid var(--c-ink-100);
}
.card-head h3 {
  font-size: 14px; font-weight: 650; color: var(--c-ink-900);
  display: flex; align-items: center; gap: 7px;
}
.card-head h3::before {
  content: ''; width: 3px; height: 14px; border-radius: 2px;
  background: var(--c-primary-500); flex: 0 0 3px;
}
.card-head.no-bar h3::before { display: none; }
.card-head .sub { font-size: 11.5px; color: var(--c-ink-500); font-weight: 400; }
.card-head .right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.card-body { padding: 18px; }
.card-body.tight { padding: 12px 14px; }

.grid { display: grid; gap: 16px; }
.g-2 { grid-template-columns: repeat(2, 1fr); }
.g-3 { grid-template-columns: repeat(3, 1fr); }
.g-4 { grid-template-columns: repeat(4, 1fr); }
.g-5 { grid-template-columns: repeat(5, 1fr); }
.g-2-1 { grid-template-columns: 2fr 1fr; }
.g-1-2 { grid-template-columns: 1fr 2fr; }
.g-3-2 { grid-template-columns: 3fr 2fr; }

/* 标签 */
.tag {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 11px; font-weight: 600;
  padding: 2px 8px; border-radius: 6px;
  white-space: nowrap;
}
.tag-blue { background: var(--c-primary-100); color: var(--c-primary-700); }
.tag-gold { background: var(--c-accent-100); color: var(--c-accent-600); }
.tag-green { background: var(--c-down-bg); color: var(--c-down); }
.tag-red { background: var(--c-up-bg); color: var(--c-up); }
.tag-orange { background: var(--c-warn-bg); color: var(--c-warn); }
.tag-gray { background: var(--c-ink-100); color: var(--c-ink-600); }
.tag-purple { background: #F3E8FD; color: #7E22CE; }

/* 按钮 */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  font-size: 13px; font-weight: 550;
  height: var(--ctl-h); padding: 0 14px;
  border-radius: var(--radius);
  border: 1px solid var(--c-ink-300);
  background: #fff; color: var(--c-ink-700);
  cursor: pointer;
  transition: background .16s, border-color .16s, box-shadow .16s, transform .1s;
  font-family: var(--font);
  white-space: nowrap;
}
.btn:hover { background: var(--c-ink-50); border-color: var(--c-ink-400); }
.btn:active { transform: translateY(1px); }
.btn:focus-visible { outline: 0; box-shadow: var(--ring); }
.btn-primary {
  background: var(--c-primary-600);
  border-color: var(--c-primary-700);
  color: #fff;
  box-shadow: 0 1px 2px rgba(13,48,80,.24);
}
.btn-primary:hover { background: var(--c-primary-500); border-color: var(--c-primary-600); }
.btn-gold {
  background: linear-gradient(180deg, var(--c-accent-400), var(--c-accent-500));
  border-color: var(--c-accent-600); color: #3D2B00; font-weight: 700;
  box-shadow: 0 1px 3px rgba(184,134,11,.3);
}
.btn-gold:hover { filter: brightness(1.05); }
.btn-ghost { border-color: transparent; background: transparent; color: var(--c-primary-600); }
.btn-ghost:hover { background: var(--c-primary-50); border-color: transparent; }
.btn-danger { background: var(--c-up); border-color: var(--c-up); color: #fff; }
.btn-danger:hover { background: #C22B20; }
.btn-sm { height: 28px; padding: 0 10px; font-size: 12px; border-radius: 7px; }
.btn-lg { height: 42px; padding: 0 22px; font-size: 14px; border-radius: 11px; }
.btn-block { width: 100%; }
.btn:disabled { opacity: .45; cursor: not-allowed; transform: none; }

/* 表格 */
.table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 13px; }
.table th {
  text-align: left; font-weight: 600; font-size: 11.5px;
  letter-spacing: .2px;
  color: var(--c-ink-500);
  padding: 10px 14px;
  border-bottom: 1px solid var(--c-ink-200);
  white-space: nowrap;
  background: var(--c-ink-50);
  position: sticky; top: 0; z-index: 2;
}
.table th:first-child { border-radius: 9px 0 0 0; }
.table th:last-child { border-radius: 0 9px 0 0; }
.table td {
  padding: 11px 14px;
  border-bottom: 1px solid var(--c-ink-100);
  color: var(--c-ink-700);
  vertical-align: middle;
}
.table tbody tr { transition: background .13s; cursor: pointer; }
.table tbody tr:hover { background: var(--c-primary-50); }
.table tbody tr:hover .strong { color: var(--c-primary-700); }
.table tbody tr:last-child td { border-bottom: 0; }
.table .num { font-family: var(--mono); font-variant-numeric: tabular-nums; text-align: right; }
.table .strong { font-weight: 650; color: var(--c-ink-900); transition: color .13s; }
.table .dim { color: var(--c-ink-400); font-size: 11.5px; }

/* 指标卡 */
.stat {
  background: #fff;
  border: 1px solid var(--c-ink-200);
  border-radius: var(--radius-lg);
  padding: 15px 18px 14px;
  position: relative;
  overflow: hidden;
  transition: box-shadow .18s ease, transform .18s ease, border-color .18s ease;
}
.stat:hover { box-shadow: var(--shadow); transform: translateY(-2px); border-color: var(--c-ink-300); }
.stat::before {
  content: ''; position: absolute; left: 0; top: 12px; bottom: 12px;
  width: 3px; border-radius: 0 3px 3px 0;
  background: var(--c-primary-500);
}
.stat.blue::before  { background: var(--c-primary-500); }
.stat.gold::before  { background: var(--c-accent-500); }
.stat.green::before { background: var(--c-down); }
.stat.violet::before{ background: #7C6FD0; }
.stat.red::before   { background: var(--c-up); }
.stat-ico {
  position: absolute; right: 14px; top: 14px;
  width: 34px; height: 34px; border-radius: 10px;
  display: grid; place-items: center;
  font-size: 16px;
  background: var(--c-primary-50); color: var(--c-primary-600);
}
.stat.gold .stat-ico  { background: var(--c-accent-100); color: var(--c-accent-600); }
.stat.green .stat-ico { background: var(--c-down-bg); color: var(--c-down); }
.stat.violet .stat-ico{ background: #F1EEFC; color: #6D5BC7; }
.stat.red .stat-ico   { background: var(--c-up-bg); color: var(--c-up); }
.stat-label { font-size: 12px; color: var(--c-ink-500); display: flex; align-items: center; gap: 6px; position: relative; z-index: 1; font-weight: 500; }
.stat-value {
  font-size: 27px; font-weight: 750; color: var(--c-ink-900);
  font-variant-numeric: tabular-nums;
  margin: 8px 0 5px; letter-spacing: -.6px;
  line-height: 1.1;
  position: relative; z-index: 1;
}
.stat-value .unit { font-size: 12.5px; font-weight: 500; color: var(--c-ink-500); margin-left: 4px; letter-spacing: 0; }
.stat-foot { font-size: 11.5px; color: var(--c-ink-500); display: flex; align-items: center; gap: 5px; position: relative; z-index: 1; }
.stat-foot b { color: var(--c-ink-700); font-weight: 650; }
.stat-foot .delta {
  font-weight: 650; display: inline-flex; align-items: center; gap: 2px;
  padding: 1px 6px; border-radius: 20px; font-size: 11px;
}
.delta.up { color: var(--c-up); background: var(--c-up-bg); }
.delta.down { color: var(--c-down); background: var(--c-down-bg); }
.delta.flat { color: var(--c-ink-600); background: var(--c-ink-100); }

/* 进度条 */
.progress { height: 6px; background: var(--c-ink-100); border-radius: 3px; overflow: hidden; }
.progress > i { display: block; height: 100%; border-radius: 3px; background: linear-gradient(90deg, var(--c-primary-500), var(--c-primary-400)); transition: width .5s ease; }
.progress.gold > i { background: linear-gradient(90deg, var(--c-accent-500), var(--c-accent-400)); }
.progress.green > i { background: linear-gradient(90deg, var(--c-down), #34C759); }
.progress.red > i { background: linear-gradient(90deg, var(--c-up), #F26B5E); }

/* 分割 */
.divider { height: 1px; background: var(--c-ink-100); margin: 14px 0; }

/* ============ 详情抽屉 ============ */
.drawer-mask {
  position: fixed; inset: 0;
  background: rgba(16,24,40,.42);
  backdrop-filter: blur(2px);
  opacity: 0; pointer-events: none;
  transition: opacity .22s;
  z-index: 100;
}
.drawer-mask.show { opacity: 1; pointer-events: auto; }
.drawer {
  position: fixed; top: 0; right: 0; bottom: 0;
  width: 620px; max-width: 92vw;
  background: var(--c-ink-50);
  box-shadow: var(--shadow-lg);
  transform: translateX(100%);
  transition: transform .3s cubic-bezier(.4,0,.2,1);
  z-index: 101;
  display: flex; flex-direction: column;
}
.drawer.show { transform: none; }
.drawer-head {
  padding: 16px 20px;
  background: #fff;
  border-bottom: 1px solid var(--c-ink-200);
  display: flex; align-items: flex-start; gap: 12px;
}
.drawer-head h2 { font-size: 17px; font-weight: 700; color: var(--c-ink-900); }
.drawer-head .meta { font-size: 12px; color: var(--c-ink-500); margin-top: 4px; display: flex; gap: 8px; flex-wrap: wrap; }
.drawer-close {
  margin-left: auto; width: 30px; height: 30px; flex: 0 0 30px;
  border-radius: 8px; border: 1px solid var(--c-ink-200);
  background: #fff; cursor: pointer; display: grid; place-items: center;
  font-size: 16px; color: var(--c-ink-500);
}
.drawer-close:hover { background: var(--c-ink-100); }
.drawer-body { flex: 1; overflow-y: auto; padding: 18px 20px 28px; }
.drawer-body::-webkit-scrollbar { width: 8px; }
.drawer-body::-webkit-scrollbar-thumb { background: var(--c-ink-300); border-radius: 4px; }

/* Tabs —— 分段式 */
.tabs {
  display: inline-flex; gap: 3px;
  background: var(--c-ink-100);
  border: 1px solid var(--c-ink-200);
  border-radius: 10px;
  padding: 3px;
  margin-bottom: 16px;
}
.tabs + .tabs { margin-left: 10px; }
.tab {
  padding: 6px 15px; font-size: 12.5px; font-weight: 550;
  color: var(--c-ink-600); cursor: pointer;
  border-radius: 8px;
  border-bottom: 0;
  transition: all .16s;
  white-space: nowrap;
}
.tab:hover { color: var(--c-ink-900); background: rgba(255,255,255,.7); }
.tab.active {
  color: var(--c-primary-700); background: #fff;
  box-shadow: var(--shadow-sm);
  font-weight: 650;
}

/* 键值行 */
.kv { display: flex; justify-content: space-between; align-items: center; padding: 9px 0; border-bottom: 1px dashed var(--c-ink-200); font-size: 13px; }
.kv:last-child { border-bottom: 0; }
.kv .k { color: var(--c-ink-500); }
.kv .v { font-weight: 600; color: var(--c-ink-900); font-variant-numeric: tabular-nums; }
/* 长文本值（如「拐点来源」公告标题）：标签不换行、不压缩，值右对齐换行 */
#m3BoundaryStats .kv { align-items: flex-start; }
#m3BoundaryStats .kv .k { flex: 0 0 auto; white-space: nowrap; padding-right: 12px; }
#m3BoundaryStats .kv .v { flex: 1 1 auto; text-align: right; word-break: break-word; }

/* 提示条 */
.alert {
  display: flex; gap: 10px;
  padding: 11px 13px;
  border-radius: var(--radius);
  font-size: 12.5px;
  line-height: 1.55;
  border: 1px solid;
}
.alert .ico { flex: 0 0 auto; font-size: 14px; line-height: 1.4; }
.alert-high { background: var(--c-up-bg); border-color: #FBC9C3; color: #8B1F16; }
.alert-medium { background: var(--c-warn-bg); border-color: #FFDFB0; color: #7A4400; }
.alert-low { background: var(--c-info-bg); border-color: #C6DBFB; color: #12408F; }
.alert b { font-weight: 650; }

/* 置信度条 */
.conf { display: flex; align-items: center; gap: 8px; }
.conf-bar { flex: 1; height: 5px; background: var(--c-ink-100); border-radius: 3px; overflow: hidden; min-width: 50px; }
.conf-bar > i { display: block; height: 100%; border-radius: 3px; }
.conf-val { font-size: 11.5px; font-weight: 650; font-variant-numeric: tabular-nums; color: var(--c-ink-600); min-width: 34px; text-align: right; }

/* 空状态 */
.empty { text-align: center; padding: 44px 20px; color: var(--c-ink-400); }
.empty .ico {
  width: 58px; height: 58px; margin: 0 auto 14px;
  border-radius: 16px; display: grid; place-items: center;
  font-size: 26px;
  background: var(--c-ink-100); color: var(--c-ink-400);
}
.empty p { font-size: 13px; line-height: 1.6; }
.empty b { color: var(--c-ink-600); }

/* 过滤器 */
.filters { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-bottom: 16px; }
.field { display: flex; flex-direction: column; gap: 5px; }
.field label { font-size: 11px; font-weight: 600; color: var(--c-ink-500); letter-spacing: .2px; }
.field select, .field input {
  font-size: 13px; font-family: var(--font);
  height: var(--ctl-h);
  padding: 0 11px;
  border: 1px solid var(--c-ink-300);
  border-radius: var(--radius);
  background: #fff; color: var(--c-ink-800);
  outline: 0;
  transition: border-color .16s, box-shadow .16s;
  min-width: 130px;
}
.field select { cursor: pointer; }
.field select:focus, .field input:focus { border-color: var(--c-primary-400); box-shadow: var(--ring); }
.field select:hover, .field input:hover { border-color: var(--c-ink-400); }

/* 矿种色点 */
.mineral-dot { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 6px; vertical-align: middle; }

/* 匹配度环 */
.match-ring { position: relative; width: 46px; height: 46px; flex: 0 0 46px; }
.match-ring svg { transform: rotate(-90deg); }
.match-ring .val {
  position: absolute; inset: 0; display: grid; place-items: center;
  font-size: 13px; font-weight: 700; color: var(--c-ink-900);
  font-variant-numeric: tabular-nums;
}

/* 步骤条 */
.steps { display: flex; align-items: center; gap: 0; margin: 4px 0 20px; }
.step { display: flex; align-items: center; gap: 8px; flex: 1; }
.step:last-child { flex: 0 0 auto; }
.step-num {
  width: 24px; height: 24px; flex: 0 0 24px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 11px; font-weight: 700;
  background: var(--c-ink-200); color: var(--c-ink-500);
}
.step.done .step-num { background: var(--c-primary-500); color: #fff; }
.step.active .step-num { background: var(--c-accent-400); color: var(--c-primary-900); box-shadow: 0 0 0 4px rgba(232,188,62,.25); }
.step-label { font-size: 12px; color: var(--c-ink-500); white-space: nowrap; }
.step.active .step-label { color: var(--c-ink-900); font-weight: 600; }
.step-line { flex: 1; height: 1.5px; background: var(--c-ink-200); margin: 0 10px; min-width: 20px; }
.step.done .step-line { background: var(--c-primary-400); }

/* 时间轴 */
.timeline { position: relative; padding-left: 24px; }
.timeline::before {
  content: ''; position: absolute; left: 6px; top: 6px; bottom: 6px;
  width: 1.5px; border-radius: 2px;
  background: linear-gradient(180deg, var(--c-ink-200), var(--c-ink-100));
}
.tl-item { position: relative; padding-bottom: 15px; }
.tl-item:last-child { padding-bottom: 0; }
.tl-dot {
  position: absolute; left: -21.5px; top: 3px;
  width: 11px; height: 11px; border-radius: 50%;
  background: #fff; border: 2.5px solid var(--c-primary-400);
  box-shadow: 0 0 0 3px rgba(43,123,185,.10);
  transition: transform .15s;
}
.tl-item:hover .tl-dot { transform: scale(1.25); }
.tl-item.gold .tl-dot { border-color: var(--c-accent-500); box-shadow: 0 0 0 3px rgba(212,160,23,.12); }
.tl-item.green .tl-dot { border-color: var(--c-down); box-shadow: 0 0 0 3px rgba(30,142,62,.10); }
.tl-item.red .tl-dot { border-color: var(--c-up); box-shadow: 0 0 0 3px rgba(217,48,37,.10); }
.tl-time { font-size: 11px; color: var(--c-ink-400); letter-spacing: .2px; }
.tl-text { font-size: 12.5px; color: var(--c-ink-700); margin-top: 2px; line-height: 1.55; }
.tl-text b { color: var(--c-ink-900); font-weight: 650; }

/* 热力矩阵 */
.heat-table { width: 100%; border-collapse: separate; border-spacing: 3px; font-size: 11.5px; }
.heat-table th { font-size: 10.5px; color: var(--c-ink-500); font-weight: 600; padding: 4px; text-align: center; }
.heat-table th.rowh { text-align: right; padding-right: 8px; white-space: nowrap; }
.heat-cell {
  text-align: center; padding: 7px 4px; border-radius: 6px;
  font-size: 11px; font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--c-ink-800);
  cursor: default;
  transition: transform .13s;
}
.heat-cell:hover { transform: scale(1.07); box-shadow: var(--shadow-sm); z-index: 2; position: relative; }

/* 评分条组 */
.score-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; }
.score-label { font-size: 12.5px; color: var(--c-ink-600); width: 76px; flex: 0 0 76px; }
.score-track { flex: 1; }
.score-num { font-size: 12.5px; font-weight: 700; font-variant-numeric: tabular-nums; width: 34px; text-align: right; color: var(--c-ink-900); }

/* 筛选 chips */
.chips { display: flex; gap: 7px; flex-wrap: wrap; }
.chip {
  padding: 5px 12px; border-radius: 16px;
  font-size: 12px; font-weight: 550;
  border: 1px solid var(--c-ink-300);
  background: #fff; color: var(--c-ink-600);
  cursor: pointer; transition: all .16s;
  user-select: none;
}
.chip:hover { border-color: var(--c-primary-400); color: var(--c-primary-600); }
.chip.active { background: var(--c-primary-600); border-color: var(--c-primary-600); color: #fff; }

/* 开关 */
.switch { width: 38px; height: 21px; border-radius: 11px; background: var(--c-ink-300); position: relative; cursor: pointer; transition: background .2s; flex: 0 0 38px; }
.switch.on { background: var(--c-primary-500); }
.switch::after { content: ''; position: absolute; top: 2.5px; left: 2.5px; width: 16px; height: 16px; border-radius: 50%; background: #fff; transition: transform .2s; box-shadow: 0 1px 3px rgba(0,0,0,.2); }
.switch.on::after { transform: translateX(17px); }

/* 加载骨架 */
.skeleton { background: linear-gradient(90deg, var(--c-ink-100) 25%, var(--c-ink-200) 50%, var(--c-ink-100) 75%); background-size: 200% 100%; animation: shimmer 1.4s infinite; border-radius: 6px; }
@keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }

/* AI 徽标 */
.ai-badge {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 10px; font-weight: 700;
  padding: 2px 7px; border-radius: 5px;
  background: linear-gradient(135deg, #7C3AED, #2563EB);
  color: #fff;
  letter-spacing: .3px;
}

/* 提示气泡 */
.tip { position: relative; cursor: help; border-bottom: 1px dashed var(--c-ink-400); }
.tip:hover::after {
  content: attr(data-tip);
  position: absolute; bottom: 130%; left: 50%; transform: translateX(-50%);
  background: var(--c-ink-900); color: #fff;
  font-size: 11px; line-height: 1.5;
  padding: 6px 10px; border-radius: 6px;
  white-space: pre-line; width: max-content; max-width: 260px;
  z-index: 50; box-shadow: var(--shadow-md);
  font-weight: 400;
}

/* 滚动条通用 */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--c-ink-300); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: var(--c-ink-400); }

/* toast */
.toast-wrap { position: fixed; top: 74px; right: 24px; z-index: 200; display: flex; flex-direction: column; gap: 9px; }
.toast {
  background: var(--c-ink-900); color: #fff;
  padding: 11px 16px; border-radius: var(--radius);
  font-size: 13px; box-shadow: var(--shadow-lg);
  display: flex; align-items: center; gap: 9px;
  animation: slideIn .25s ease;
  max-width: 380px;
}
.toast.gold { background: linear-gradient(135deg, var(--c-accent-500), var(--c-accent-600)); color: #3D2B00; }
.toast.green { background: linear-gradient(135deg, #16A34A, #15803D); }
@keyframes slideIn { from { opacity: 0; transform: translateX(24px); } to { opacity: 1; transform: none; } }

/* 响应式 */
@media (max-width: 1440px) {
  .g-5 { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 1200px) {
  .g-4 { grid-template-columns: repeat(2, 1fr); }
  .g-3 { grid-template-columns: repeat(2, 1fr); }
  .g-3-2, .g-2-1, .g-1-2 { grid-template-columns: 1fr; }
}
@media (max-width: 900px) {
  .sidebar { --sidebar-w: 64px; width: 64px; flex-basis: 64px; }
  .brand-text, .nav-item span:not(.nav-icon), .nav-group-label, .nav-badge, .sidebar-foot span, .sb-ver { display: none; }
  .nav-item { justify-content: center; }
  .g-2, .g-4, .g-5 { grid-template-columns: 1fr; }
}

/* ============================================================
   矿山选择条（储量 / 审批 / 尽调 多矿切换）
   ============================================================ */
.selbar {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 16px;
  margin-bottom: 16px;
  background: var(--c-white);
  border: 1px solid var(--c-ink-200);
  border-left: 3px solid var(--c-primary-500);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
}
.selbar-label {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--c-ink-600);
  flex: 0 0 auto;
}
.selbar-select {
  flex: 1 1 auto;
  max-width: 560px;
  height: 34px;
  padding: 0 10px;
  font-size: 13px;
  color: var(--c-ink-800);
  background: var(--c-white);
  border: 1px solid var(--c-ink-300);
  border-radius: var(--radius-sm);
  cursor: pointer;
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.selbar-select:hover { border-color: var(--c-primary-400); }
.selbar-select:focus {
  border-color: var(--c-primary-500);
  box-shadow: 0 0 0 3px rgba(43, 123, 185, .12);
}
/* 三维页矿山选择框：矿名含权人前缀可达 30+ 字，放宽宽度保证下拉完整显示 */
#m3MineSel {
  max-width: 860px;
  min-width: 320px;
}
.selbar-meta {
  margin-left: auto;
  font-size: 12px;
  color: var(--c-ink-500);
  flex: 0 0 auto;
  text-align: right;
}
@media (max-width: 900px) {
  .selbar { flex-wrap: wrap; }
  .selbar-select { max-width: 100%; }
  .selbar-meta { margin-left: 0; width: 100%; text-align: left; }
}

/* 数据来源徽标 */
.src-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 10.5px;
  padding: 2px 7px;
  border-radius: 10px;
  background: var(--c-primary-50);
  color: var(--c-primary-700);
  border: 1px solid var(--c-primary-100);
  white-space: nowrap;
}
.src-badge.real { background: #E8F5EC; color: #1E6B3A; border-color: #BEE3CB; }
.src-badge.est  { background: #FDF3E3; color: #8A5A00; border-color: #F2DDBA; }

/* ============================================================
   三维矿体模型
   ============================================================ */
.m3-stage {
  position: relative;
  width: 100%;
  height: 560px;
  background: radial-gradient(ellipse at 50% 32%, #1B2C3F 0%, #0C1723 58%, #060C14 100%);
  border-radius: 0 0 var(--radius) var(--radius);
  overflow: hidden;
  cursor: grab;
}
.m3-stage:active { cursor: grabbing; }
.m3-stage canvas { display: block; width: 100%; height: 100%; }
.m3-hint {
  position: absolute; left: 14px; bottom: 12px; z-index: 3;
  font-size: 11px; color: rgba(255,255,255,.45);
  letter-spacing: .4px; pointer-events: none;
}
.m3-legend {
  position: absolute; right: 14px; bottom: 12px; z-index: 3;
  display: flex; flex-wrap: wrap; gap: 12px; justify-content: flex-end;
  max-width: 62%; pointer-events: none;
}
.m3-legend span {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 10.5px; color: rgba(255,255,255,.6);
}
.m3-legend i { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
/* 大场景（浅色二维地图）：图例 / 提示 / 坐标轴文字改深色，避免白字不可见 */
.m3-stage-macro .m3-hint { color: rgba(29,41,57,.72); background: rgba(255,255,255,.8); border-radius: 6px; padding: 3px 8px; max-width: 46% }
.m3-stage-macro .m3-legend { background: rgba(255,255,255,.86); border-radius: 8px; padding: 5px 10px; max-width: 68% }
.m3-stage-macro .m3-legend span { color: rgba(29,41,57,.76) }
.m3-stage-macro .m3-legend i { box-shadow: 0 0 0 1px rgba(0,0,0,.14) }
.m3-stage-macro .m3-legend span[style], .m3-stage-macro .m3-legend b { color: rgba(29,41,57,.82) }
.m3-axis {
  position: absolute; left: 14px; top: 12px;
  font-size: 10.5px; color: rgba(255,255,255,.4);
  font-family: var(--mono); letter-spacing: .3px; pointer-events: none;
  line-height: 1.7;
}

.layer-list { display: flex; flex-direction: column; gap: 2px; }
.layer-item {
  display: flex; align-items: center; gap: 9px;
  padding: 8px 9px; border-radius: var(--radius-sm);
  font-size: 12.5px; color: var(--c-ink-700);
  cursor: pointer; transition: background .13s;
}
.layer-item:hover { background: var(--c-ink-50); }
.layer-item .sw {
  width: 11px; height: 11px; border-radius: 3px; flex: 0 0 11px;
  border: 1px solid rgba(0,0,0,.12);
}
.layer-item .cnt { margin-left: auto; font-size: 11px; color: var(--c-ink-400); font-family: var(--mono); }
.layer-item.off { opacity: .42; }
.layer-item.off .sw { background: var(--c-ink-300) !important; }

.mini-select {
  height: 28px; padding: 0 7px; font-size: 12px;
  border: 1px solid var(--c-ink-300); border-radius: var(--radius-sm);
  background: var(--c-white); color: var(--c-ink-800); cursor: pointer; outline: none;
}
.mini-range { width: 108px; vertical-align: middle; accent-color: var(--c-primary-500); }

.g-3-1 { grid-template-columns: 3fr 1fr; }
@media (max-width: 1300px) { .g-3-1 { grid-template-columns: 1fr; } }

/* ============================================================
   数据采集
   ============================================================ */
.dropzone {
  border: 1.5px dashed var(--c-ink-300);
  border-radius: var(--radius-lg);
  padding: 28px 20px;
  text-align: center;
  background: var(--c-primary-50);
  transition: border-color .15s, background .15s, box-shadow .15s;
  cursor: pointer;
}
.dropzone:hover, .dropzone.over {
  border-color: var(--c-primary-500);
  background: #EAF4FC;
}
.dropzone.over { box-shadow: inset 0 0 0 3px var(--c-primary-100); }
.dz-icon {
  width: 46px; height: 46px; margin: 0 auto 10px;
  border-radius: 13px; display: grid; place-items: center;
  font-size: 22px;
  background: #fff; color: var(--c-primary-500);
  box-shadow: var(--shadow-sm);
}
.dz-title { font-size: 13.5px; color: var(--c-ink-700); font-weight: 550; }
.dz-link { color: var(--c-primary-600); text-decoration: underline; text-underline-offset: 2px; }
.dz-sub {
  font-size: 11.5px; color: var(--c-ink-500); margin-top: 9px;
  max-width: 420px; margin-left: auto; margin-right: auto;
  line-height: 1.6;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dz-sub b { color: var(--c-ink-600); }

.cl-pane { animation: fadeIn .18s ease; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }

/* 预览表异常行 */
.table tr.row-error td { background: #FEF3F2; }
.table tr.row-error:hover td { background: #FCE7E5; }
.table tr.row-warn td { background: #FFF9EF; }
.table tr.row-warn:hover td { background: #FDF2E0; }
.row-msg { font-size: 11px; line-height: 1.55; }
.row-msg .e { color: var(--c-up); font-weight: 600; }
.row-msg .w { color: var(--c-warn); font-weight: 600; }

/* 表单 */
.form-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 13px 18px; }
.form-grid .full { grid-column: 1 / -1; }
.fitem { display: flex; flex-direction: column; gap: 5px; }
.fitem label {
  font-size: 11.5px; font-weight: 600; color: var(--c-ink-600);
  display: flex; align-items: center; gap: 5px;
}
.fitem label .req { color: var(--c-up); font-weight: 700; }
.fitem label .unit { color: var(--c-ink-400); font-weight: 400; font-size: 10.5px; }
.fitem input, .fitem select {
  height: 34px; padding: 0 10px; font-size: 13px;
  border: 1px solid var(--c-ink-300); border-radius: var(--radius-sm);
  color: var(--c-ink-800); background: var(--c-white); outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.fitem input:focus, .fitem select:focus {
  border-color: var(--c-primary-500);
  box-shadow: 0 0 0 3px var(--c-primary-100);
}
.fitem.err input, .fitem.err select { border-color: var(--c-up); box-shadow: 0 0 0 3px var(--c-up-bg); }
.fitem.warn input, .fitem.warn select { border-color: var(--c-warn); }
.fitem .fmsg { font-size: 11px; color: var(--c-up); display: none; }
.fitem.err .fmsg { display: block; }
.fitem .hint { font-size: 10.5px; color: var(--c-ink-400); }
@media (max-width: 900px) { .form-grid { grid-template-columns: 1fr; } }

.check-row {
  display: flex; align-items: flex-start; gap: 9px;
  padding: 9px 4px; border-bottom: 1px dashed var(--c-ink-200);
  font-size: 12.5px;
}
.check-row:last-child { border-bottom: 0; }
.check-row .ico { flex: 0 0 15px; font-weight: 700; font-size: 13px; }
.check-row .nm { flex: 1; color: var(--c-ink-700); }
.check-row .vl { font-family: var(--mono); font-size: 11.5px; color: var(--c-ink-500); }

.draft-item {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 13px; border: 1px solid var(--c-ink-200);
  border-radius: var(--radius); margin-bottom: 9px;
  transition: border-color .14s, box-shadow .14s; cursor: pointer;
}
.draft-item:hover { border-color: var(--c-primary-400); box-shadow: var(--shadow-xs); }
.draft-item .di-main { flex: 1; min-width: 0; }
.draft-item .di-name { font-size: 13px; font-weight: 620; color: var(--c-ink-900);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.draft-item .di-sub { font-size: 11px; color: var(--c-ink-500); margin-top: 4px; }

.prog-mini { width: 70px; height: 5px; background: var(--c-ink-100); border-radius: 3px; overflow: hidden; }
.prog-mini i { display: block; height: 100%; background: linear-gradient(90deg, var(--c-primary-400), var(--c-primary-600)); }

/* ============================================================
   数据采集 / 三维模型 —— 补充样式
   （与 collect.js / model3d-page.js 中的类名对齐）
   ============================================================ */

/* 图层项：开关式（.layer-item 已有基础样式） */
.layer-item .li-main { flex: 1; min-width: 0; }
.layer-item .li-name { font-size: 12.5px; font-weight: 600; color: var(--c-ink-800); }
.layer-item .li-desc { font-size: 10.5px; color: var(--c-ink-400); margin-top: 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.layer-item .switch { flex: 0 0 38px; }

/* 表单：校验态（collect.js 使用 .bad / .fmsg.bad） */
.fitem label .unit-hint { color: var(--c-ink-400); font-weight: 400; font-size: 10.5px; }
.finput.bad { border-color: var(--c-up) !important; box-shadow: 0 0 0 3px var(--c-up-bg) !important; }
.fmsg.bad { display: block; }
.fmsg { font-size: 11px; color: var(--c-ink-400); line-height: 1.5; }
/* collect.js 生成的 .fmsg 始终可见（用于展示字段规则提示），覆盖 .fitem .fmsg 的默认隐藏 */
#clForm .fitem .fmsg { display: block; }
#clForm .fitem .fmsg.bad { color: var(--c-up); }

/* 实时校验行（.check-row 已有基础样式） */
.check-row .ck-ico { flex: 0 0 15px; font-weight: 700; font-size: 13px; text-align: center; }
.check-row .ck-label { flex: 1; color: var(--c-ink-700); }
.check-row .ck-val { font-family: var(--mono); font-size: 11.5px; color: var(--c-ink-500);
  text-align: right; max-width: 45%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.check-row .ck-val i { color: var(--c-ink-300); font-style: normal; }
.check-row.ok .ck-ico { color: var(--c-down); }
.check-row.bad .ck-ico { color: var(--c-up); }
.check-row.idle { opacity: .72; }
.check-row.idle .ck-ico { color: var(--c-ink-300); }

/* 草稿项：进度 + 操作按钮 */
.draft-item .dr-main { flex: 1; min-width: 0; }
.draft-item .dr-name { font-size: 13px; font-weight: 620; color: var(--c-ink-900);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.draft-item .dr-meta { font-size: 11px; color: var(--c-ink-500); margin-top: 4px; }
.draft-item .dr-prog { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
.draft-item .dr-prog b { font-size: 11.5px; color: var(--c-ink-700); width: 30px; text-align: right; }

/* 进度条：collect.js 使用 span 作为填充 */
.prog-mini span { display: block; height: 100%;
  background: linear-gradient(90deg, var(--c-primary-400), var(--c-primary-600)); }

/* 采集批次流水 */
.batch-item {
  padding: 12px 13px; border: 1px solid var(--c-ink-200);
  border-radius: var(--radius); margin-bottom: 10px;
  transition: border-color .14s, box-shadow .14s;
}
.batch-item:hover { border-color: var(--c-primary-400); box-shadow: var(--shadow-xs); }
.batch-item .bi-head { display: flex; align-items: center; gap: 8px; }
.batch-item .bi-id { font-size: 11.5px; color: var(--c-ink-600); font-weight: 600; }
.batch-item .bi-time { margin-left: auto; font-size: 10.5px; color: var(--c-ink-400); }
.batch-item .bi-src { font-size: 12.5px; color: var(--c-ink-800); font-weight: 550; margin: 7px 0 8px; }
.batch-item .bi-foot { display: flex; align-items: center; gap: 10px; font-size: 11.5px; color: var(--c-ink-500); }
.batch-item .bi-foot .prog-mini { width: 84px; flex: 0 0 84px; }
.batch-item .bi-tpl { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--c-ink-400); }

/* 数字列 / 等宽 */
.table td.num, .table th.num { text-align: right; font-variant-numeric: tabular-nums; }
.table td.strong { font-weight: 600; color: var(--c-ink-900); }
.table td.mono { font-family: var(--mono); font-size: 11.5px; color: var(--c-ink-600); }

/* 拖动进入态 */
.dropzone.dz-over { border-color: var(--c-primary-500); background: #EAF4FC;
  box-shadow: inset 0 0 0 3px var(--c-primary-100); }

/* 三维视口在小屏下压缩高度 */
@media (max-width: 1300px) { .m3-stage { height: 440px; } }
@media (max-width: 900px)  { .m3-stage { height: 360px; } }

/* 矿区范围平面图 */
.m3-plan { position: relative; width: 100%; height: 330px; background: #FBFCFE;
  border-radius: 0 0 var(--radius) var(--radius); overflow: hidden; }
.m3-plan canvas { display: block; width: 100%; height: 100%; }
@media (max-width: 1300px) { .m3-plan { height: 280px; } }

/* ============================================================
   大场景地图：市州分布 / 矿种分组 / 图例
   ============================================================ */
.pref-row { display: flex; align-items: center; gap: 10px; padding: 7px 4px;
  cursor: pointer; border-bottom: 1px dashed #EDF0F4; border-radius: 6px; }
.pref-row:last-child { border-bottom: none; }
.pref-row:hover { background: rgba(212, 160, 23, .07); }
.pref-row .pr-name { width: 78px; flex: none; font-size: 12.5px; font-weight: 600; color: var(--c-ink-800); }
.pref-row .pr-bar { flex: 1; height: 9px; border-radius: 4px; background: #EEF1F5; overflow: hidden; }
.pref-row .pr-bar span { display: block; height: 100%; border-radius: 4px;
  background: linear-gradient(90deg, #3D5A73, #4E9AD6); }
.pref-row .pr-num { flex: none; width: 158px; text-align: right; font-size: 11.5px;
  color: var(--c-ink-500); font-variant-numeric: tabular-nums; }
.group-row { display: flex; align-items: center; gap: 10px; padding: 6.5px 4px; }
.group-row .sw { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.group-row .gr-name { width: 88px; flex: none; font-size: 12.5px; font-weight: 600; color: var(--c-ink-800); }
.group-row .gr-bar { flex: 1; height: 9px; border-radius: 4px; background: #EEF1F5; overflow: hidden; }
.group-row .gr-bar span { display: block; height: 100%; border-radius: 4px; }
.group-row .gr-num { flex: none; width: 158px; text-align: right; font-size: 11.5px;
  color: var(--c-ink-500); font-variant-numeric: tabular-nums; }
.macro-note { font-size: 11px; color: var(--c-ink-400); line-height: 1.75; margin-top: 4px; }
.m3-legend { flex-wrap: wrap; max-width: 74%; row-gap: 4px; }

/* 大场景：二维平面示意图（SVG） */
.m3-macro2d { position: absolute; inset: 0; background: #F6F8FB; overflow: hidden; z-index: 1;
  cursor: grab; touch-action: none; }
.m3-macro2d.m3m2-drag { cursor: grabbing; }
.m3-macro2d > svg { display: block; width: 100%; height: 100%; }
.m3-macro2d .m3m2-mine { cursor: pointer; }
.m3-macro2d .m3m2-mine:hover { stroke: #1F3A56; stroke-width: 2; }

/* 大场景二维地图：HTML 覆盖层（指北针 / 图名 / 动态比例尺 / 缩放控件） */
.m3-macro2d .m3m2-ui { position: absolute; inset: 0; pointer-events: none; }
.m3-macro2d .m3m2-ui > * { pointer-events: auto; }
.m3-macro2d .m3m2-compass { position: absolute; top: 12px; right: 14px; }
.m3-macro2d .m3m2-annot { position: absolute; left: 16px; bottom: 12px;
  display: flex; flex-direction: column; gap: 5px; }
.m3-macro2d .m3m2-title { font-size: 11.5px; font-weight: 600; color: #667085; }
.m3-macro2d .m3m2-scale { display: flex; align-items: center; gap: 7px;
  font-size: 10.5px; color: #344054; }
.m3-macro2d .m3m2-scale .bar { width: 96px; height: 7px; box-sizing: border-box;
  border-left: 2px solid #344054; border-right: 2px solid #344054; }
.m3-macro2d .m3m2-scale .bar i { display: block; height: 2px; background: #344054; margin-top: 2px; }
.m3-macro2d .m3m2-zoom { position: absolute; right: 14px; bottom: 14px;
  display: flex; flex-direction: column; align-items: center; gap: 6px; }
.m3-macro2d .m3m2-zoom button { width: 30px; height: 30px; border-radius: 8px;
  border: 1px solid #D5DEE7; background: rgba(255, 255, 255, .95); color: #2C4A66;
  font-size: 15px; line-height: 1; cursor: pointer; padding: 0;
  box-shadow: 0 2px 8px rgba(18, 65, 104, .12); }
.m3-macro2d .m3m2-zoom button:hover { background: #F0F5FA; border-color: #B9C8D8; }
.m3-macro2d .m3m2-zoom .zl { font-size: 10.5px; color: #667085;
  background: rgba(255, 255, 255, .88); padding: 1px 7px; border-radius: 7px; }
/* 地面分辨率读数（深度放大时提示已到影像原生分辨率） */
.m3-macro2d .m3m2-zoom .res { font-size: 10px; color: #7A8CA0; white-space: nowrap;
  background: rgba(255, 255, 255, .88); padding: 1px 7px; border-radius: 7px;
  font-variant-numeric: tabular-nums; }
.m3-macro2d .m3m2-zoom .res[data-native="1"] { color: #9A6B00; font-weight: 600;
  background: rgba(253, 246, 227, .95); }

/* 大场景：空间位置信息卡（画布右上浮层） */
.m3-macro-info { position: absolute; top: 14px; right: 14px; width: 316px;
  background: rgba(255, 255, 255, .96); border: 1px solid #E3E8EF; border-radius: 10px;
  box-shadow: 0 10px 28px rgba(16, 42, 67, .16); padding: 12px 14px 12px; z-index: 6; }
.m3-macro-info .mi-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.m3-macro-info .mi-head b { font-size: 13px; color: var(--c-ink-900); flex: 1;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.m3-macro-info .mi-head .tag { flex: none; color: #fff; }
.m3-macro-info .mi-close { flex: none; cursor: pointer; color: var(--c-ink-400);
  font-size: 16px; line-height: 1; padding: 2px 4px; border-radius: 4px; }
.m3-macro-info .mi-close:hover { background: #EEF1F5; color: var(--c-ink-700); }
.m3-macro-info .mi-actions { display: flex; gap: 8px; margin-top: 9px; }
.m3-macro-info .mi-actions .btn { flex: 1; }
.m3-macro-info .mi-actions .mi-drill { width: auto; margin-top: 0; }

/* 大场景：高德驾车路线导航面板（底部居中浮层） */
.m3-nav-panel { position: absolute; left: 50%; transform: translateX(-50%); bottom: 12px;
  width: 440px; max-width: calc(100% - 210px); background: rgba(255, 255, 255, .97);
  border: 1px solid #E3E8EF; border-radius: 10px; box-shadow: 0 10px 28px rgba(16, 42, 67, .16);
  padding: 10px 12px; z-index: 7; font-size: 12px; }
.m3-nav-panel .np-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }
.m3-nav-panel .np-head b { flex: 1; font-size: 12.5px; color: var(--c-ink-900); }
.m3-nav-panel .np-close { cursor: pointer; color: var(--c-ink-400); font-size: 16px;
  line-height: 1; padding: 2px 4px; border-radius: 4px; }
.m3-nav-panel .np-close:hover { background: #EEF1F5; color: var(--c-ink-700); }
.m3-nav-panel .np-row { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }
.m3-nav-panel .np-row label { color: var(--c-ink-500); flex: none; }
.m3-nav-panel .np-key { flex: 1; min-width: 0; border: 1px solid #D5DEE7; border-radius: 6px;
  padding: 4px 8px; font-size: 11.5px; }
.m3-nav-panel .np-key:focus { outline: none; border-color: #9DBAD6; }
.m3-nav-panel #m3NavDest { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; color: var(--c-ink-900); }
.m3-nav-panel .np-btns { gap: 8px; }
.m3-nav-panel .np-note { font-size: 10.5px; color: var(--c-ink-400); margin-left: auto; }
.m3-nav-panel .np-note a { color: #1E6FFF; text-decoration: none; }
.m3-nav-panel .np-result { font-size: 11.5px; color: var(--c-ink-700);
  background: #F4F7FA; border-radius: 6px; padding: 5px 8px; }
.m3-nav-panel .np-result.err { color: #C0392B; background: #FBEFED; }

/* 大场景：乡村标注导入面板（左下）与覆盖层按钮 */
.m3-vill-panel { position: absolute; left: 12px; bottom: 12px; width: 470px;
  max-width: calc(100% - 210px); background: rgba(255, 255, 255, .97);
  border: 1px solid #E3E8EF; border-radius: 10px; box-shadow: 0 10px 28px rgba(16, 42, 67, .16);
  padding: 10px 12px; z-index: 7; font-size: 12px; }
.m3-vill-panel .np-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }
.m3-vill-panel .np-head b { flex: 1; font-size: 12.5px; color: var(--c-ink-900); }
.m3-vill-panel .np-close { cursor: pointer; color: var(--c-ink-400); font-size: 16px;
  line-height: 1; padding: 2px 4px; border-radius: 4px; }
.m3-vill-panel .np-close:hover { background: #EEF1F5; color: var(--c-ink-700); }
.m3-vill-panel .np-row { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }
.m3-vill-panel .np-row label { color: var(--c-ink-500); flex: none; }
.m3-vill-panel .vp-text { flex: 1; width: 100%; border: 1px solid #D5DEE7; border-radius: 6px;
  padding: 5px 8px; font-size: 11px; font-family: Consolas, 'Courier New', monospace; resize: vertical; }
.m3-vill-panel .vp-text:focus { outline: none; border-color: #9DBAD6; }
.m3-vill-panel .np-btns { gap: 8px; }
.m3-vill-panel .np-note { font-size: 10.5px; color: var(--c-ink-400); margin-left: auto; }
.m3-vill-panel .np-result { font-size: 11.5px; color: var(--c-ink-700);
  background: #F4F7FA; border-radius: 6px; padding: 5px 8px; }
.m3-vill-panel .np-result.err { color: #C0392B; background: #FBEFED; }
.m3m2-villbtn { margin-top: 6px; background: rgba(255, 255, 255, .96); border: 1px solid #E3E8EF;
  border-radius: 6px; padding: 3px 8px; font-size: 11px; color: var(--c-ink-700); cursor: pointer;
  text-align: center; box-shadow: 0 2px 8px rgba(16, 42, 67, .10); user-select: none; }
.m3m2-villbtn:hover { border-color: #9DBAD6; color: var(--c-ink-900); }

/* 大场景：已保留红线（定位过的矿山不消失）—— 计数按钮 + 管理面板（v1.29.3） */
.m3m2-pinbtn { position: absolute; right: 78px; bottom: 14px; display: flex; align-items: center;
  justify-content: center; gap: 4px; z-index: 7; white-space: nowrap;
  background: rgba(255, 255, 255, .97); border: 1px solid #D5DEE7; border-radius: 6px; padding: 4px 9px;
  font-size: 11.5px; color: #344054; cursor: pointer; box-shadow: 0 2px 10px rgba(16, 42, 67, .16);
  user-select: none; }
.m3m2-pinbtn:hover { border-color: #9DBAD6; color: var(--c-ink-900); }
.m3m2-pinbtn.on { color: #B3261E; border-color: #E9B4AE; background: rgba(255, 247, 246, .97); }
.m3m2-pinbtn b { font-weight: 700; font-variant-numeric: tabular-nums; }
.m3m2-pinlist { display: none; position: absolute; right: 78px; bottom: 54px; width: 214px;
  max-height: 300px; overflow: auto;
  background: rgba(255, 255, 255, .98); border: 1px solid #E3E8EF; border-radius: 8px;
  box-shadow: 0 8px 26px rgba(16, 42, 67, .18); padding: 6px; z-index: 6; }
.m3m2-pinlist .m3p-head { display: flex; align-items: center; font-size: 11.5px; font-weight: 700;
  color: var(--c-ink-900); padding: 2px 4px 6px; border-bottom: 1px dashed #EDF1F6; }
.m3m2-pinlist .m3p-x { margin-left: auto; cursor: pointer; color: var(--c-ink-300); font-weight: 400; }
.m3m2-pinlist .m3p-x:hover { color: var(--c-ink-700); }
.m3m2-pinlist .m3p-row { display: flex; align-items: center; gap: 6px; padding: 4px 4px;
  font-size: 11.5px; color: var(--c-ink-700); border-radius: 5px; }
.m3m2-pinlist .m3p-row:hover { background: #F5F8FB; }
.m3m2-pinlist .m3p-row.cur { color: #B3261E; font-weight: 700; background: #FFF6F5; }
.m3m2-pinlist .m3p-row .nm { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  cursor: pointer; }
.m3m2-pinlist .m3p-row .del { flex: 0 0 auto; color: var(--c-ink-300); cursor: pointer; padding: 0 2px; }
.m3m2-pinlist .m3p-row .del:hover { color: #C0392B; }
.m3m2-pinlist .m3p-empty { font-size: 11px; color: var(--c-ink-400); padding: 8px 4px; line-height: 1.6; }
.m3m2-pinlist .m3p-foot { border-top: 1px dashed #EDF1F6; margin-top: 4px; padding: 6px 4px 2px;
  text-align: right; }
.m3m2-pinlist .m3p-foot .lk { font-size: 11px; color: #C0392B; cursor: pointer; }
.m3m2-pinlist .m3p-foot .lk:hover { text-decoration: underline; }
.m3-macro2d .m3m2-ui.m3m2-cn .m3m2-pinbtn { display: none; }

/* 大场景：天地图影像底图面板（左下浮层，与乡村标注面板同槽位，后开者在上） */
.m3-tdt-panel { position: absolute; left: 12px; bottom: 12px; width: 490px;
  max-width: calc(100% - 210px); background: rgba(255, 255, 255, .97);
  border: 1px solid #E3E8EF; border-radius: 10px; box-shadow: 0 10px 28px rgba(16, 42, 67, .16);
  padding: 10px 12px; z-index: 8; font-size: 12px; }
.m3-tdt-panel .np-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }
.m3-tdt-panel .np-head b { flex: 1; font-size: 12.5px; color: var(--c-ink-900); }
.m3-tdt-panel .np-close { cursor: pointer; color: var(--c-ink-400); font-size: 16px;
  line-height: 1; padding: 2px 4px; border-radius: 4px; }
.m3-tdt-panel .np-close:hover { background: #EEF1F5; color: var(--c-ink-700); }
.m3-tdt-panel .np-row { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }
.m3-tdt-panel .np-row label { color: var(--c-ink-500); flex: none; }
.m3-tdt-panel .np-cb { display: flex; align-items: center; gap: 4px; font-size: 11px;
  color: var(--c-ink-600); cursor: pointer; white-space: nowrap; }
.m3-tdt-panel .np-cb input { margin: 0; }
.m3-tdt-panel .np-note { margin-left: 0; line-height: 1.5; }
.m3-tdt-panel #m3TdtKey { flex: 1; min-width: 0; border: 1px solid #D5DEE7; border-radius: 6px;
  padding: 4px 8px; font-size: 11.5px; }
.m3-tdt-panel #m3TdtKey:focus { outline: none; border-color: #9DBAD6; }
.m3-tdt-panel .np-result { margin-top: 6px; }
.m3-macro2d .m3m2-scope { position: absolute; top: 12px; left: 16px; background: rgba(255, 255, 255, .96);
  border: 1px solid #E3E8EF; border-radius: 6px; padding: 4px 10px; font-size: 11.5px; font-weight: 600;
  color: var(--c-ink-700); cursor: pointer; box-shadow: 0 2px 8px rgba(16, 42, 67, .10); user-select: none; }
.m3-macro2d .m3m2-scope:hover { border-color: #9DBAD6; color: var(--c-ink-900); }
.m3-macro-info .mi-grid .kv { padding: 3.5px 0; }
.m3-macro-info .mi-grid .k { color: var(--c-ink-400); }
.m3-macro-info .mi-drill { width: 100%; margin-top: 9px; }

/* 大场景：矿山地理位置清单（69 宗全量） */
.m3-geo-bar { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.m3-geo-bar .geo-input { flex: 1 1 220px; min-width: 180px; height: 30px; padding: 0 10px;
  border: 1px solid #D8DFE8; border-radius: 7px; font-size: 12.5px; color: var(--c-ink-800);
  background: #fff; outline: none; }
.m3-geo-bar .geo-input:focus { border-color: var(--c-primary-500); box-shadow: 0 0 0 2px rgba(61, 139, 212, .13); }
.m3-geo-bar .geo-select { height: 30px; padding: 0 6px; border: 1px solid #D8DFE8;
  border-radius: 7px; font-size: 12.5px; color: var(--c-ink-800); background: #fff; outline: none; }
.m3-geo-list { max-height: 430px; overflow-y: auto; border-top: 1px solid #EEF1F5; }
.geo-row { display: flex; align-items: center; gap: 10px; padding: 7px 8px;
  border-bottom: 1px solid #F3F5F8; cursor: pointer; border-radius: 7px; }
.geo-row:hover { background: rgba(61, 139, 212, .06); }
.geo-row.active { background: rgba(242, 193, 78, .14); box-shadow: inset 0 0 0 1px #F2C14E; }
.geo-row .sw { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.geo-row .geo-main { flex: 1; min-width: 0; }
.geo-row .geo-name { font-size: 12.5px; font-weight: 600; color: var(--c-ink-900);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.geo-row .geo-sub { font-size: 11px; color: var(--c-ink-400); margin-top: 1px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.geo-row .geo-coord { flex: none; width: 168px; text-align: right; font-size: 11.5px;
  color: var(--c-ink-600); font-family: ui-monospace, Consolas, monospace;
  font-variant-numeric: tabular-nums; }
.geo-row .geo-ton { flex: none; width: 92px; text-align: right; font-size: 11.5px;
  color: var(--c-ink-500); font-variant-numeric: tabular-nums; }
.geo-row .geo-go { flex: none; font-size: 11px; color: var(--c-primary-600); font-weight: 600; }
.geo-empty { padding: 18px 8px; text-align: center; font-size: 12px; color: var(--c-ink-400); }

/* ============================================================
   UI 优化补充层（2026-10）— 统一观感 / 修复图表宽度 / 微交互
   ============================================================ */

/* 修复：canvas 默认 inline，rect.width 只量到 300px → 图表挤在卡片一角 */
canvas[id^="chart"], .card-body > canvas, canvas.chart-block {
  display: block; width: 100%;
}

/* 全局焦点可达性 */
:focus-visible { outline: 0; box-shadow: var(--ring); border-radius: var(--radius-sm); }

/* 文本选中色 */
::selection { background: rgba(43,123,185,.18); }

/* 细滚动条（全局统一） */
::-webkit-scrollbar { width: 9px; height: 9px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--c-ink-300); border-radius: 8px;
  border: 2px solid transparent; background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: var(--c-ink-400); background-clip: content-box; }

/* 时间线点位 hover 微反馈（配合上方 .tl-item） */

/* 键值行 hover 反馈 */
.kv { border-bottom: 1px dashed var(--c-ink-200); border-radius: 4px; transition: background .14s; }
.kv:hover { background: var(--c-ink-50); }

/* 抽屉与遮罩 */
.drawer-mask { background: rgba(10,24,40,.46); backdrop-filter: blur(3px); }

/* 卡片头部右侧标签统一垂直居中 */
.card-head .tag { flex: 0 0 auto; }

/* 警示卡：更柔和的底色与圆角 */
.alert { border-radius: 11px; padding: 12px 14px; }
.alert .ico { font-size: 15px; }

/* 步骤条（评估流程）更清晰 */
.step { display: flex; align-items: center; gap: 8px; }
.step-num {
  width: 22px; height: 22px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 11px; font-weight: 700;
}

/* 徽章统一 */
.tag { border-radius: 20px; padding: 2.5px 9px; letter-spacing: .2px; }

/* 表格容器横向滚动时不破圆角 */
.table-wrap { overflow-x: auto; border-radius: 0 0 var(--radius-lg) var(--radius-lg); }

/* 深色结果卡（评估结果）文字层次 */
.hero-card h2, .hero-card .hero-num { letter-spacing: -.5px; }

/* 数字统一等宽 */
.num, .kv .v, .stat-value, .conf-val { font-variant-numeric: tabular-nums; }

/* 减少动效偏好 */
@media (prefers-reduced-motion: reduce) {
  * { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* ============================================================
   大场景地图 · 渲染性能与影像清晰度（2026-10）
   ============================================================ */

/* 全国视图下隐藏「乡村标注」入口（该功能仅贵州视图可用）——
   改为常驻 DOM + class 切换，避免每次重绘重建按钮导致事件/焦点丢失 */
.m3-macro2d .m3m2-ui.m3m2-cn .m3m2-villbtn { display: none; }

/* 影像瓦片：保持插值平滑（深度放大时不出现硬块状锯齿） */
#m3Macro2d svg image.m3m2-tdt { image-rendering: auto; }

/* 图层组：非交互层不参与命中测试，减少指针事件开销 */
#m3Macro2d svg > g[id^="m3L-"] { pointer-events: none; }
#m3Macro2d svg > g#m3L-geo { pointer-events: auto; }
#m3Macro2d svg > g#m3L-mines { pointer-events: auto; }

/* 拖拽中：提示浏览器该区域内容会持续变化，便于提前准备合成 */
.m3-macro2d .m3m2-drag svg { will-change: contents; }
#m3Macro2d svg { text-rendering: optimizeSpeed; }

/* 缩放读数：等宽数字，避免百分比跳动时宽度抖动 */
.m3-macro2d .m3m2-zoom .zl { font-variant-numeric: tabular-nums; }

/* ============================================================
   买矿需求数据库（#page-demand）
   ============================================================ */
.dm-pane { animation: dmFade .22s ease; }
@keyframes dmFade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

/* 企业列表：分组标题 + 条目 */
.dm-grp {
  font-size: 10.5px; font-weight: 700; letter-spacing: .04em;
  color: var(--c-ink-500); text-transform: none;
  padding: 10px 8px 5px; position: sticky; top: 0;
  background: linear-gradient(var(--c-white) 70%, rgba(255,255,255,0));
  z-index: 2;
}
.dm-item {
  padding: 8px 9px; border-radius: 8px; cursor: pointer;
  border: 1px solid transparent; transition: all .14s;
}
.dm-item:hover { background: var(--c-primary-50); }
.dm-item.on { background: var(--c-primary-50); border-color: var(--c-primary-200); }
.dm-item .di-top { display: flex; align-items: center; gap: 6px; }
.dm-item .di-top b { font-size: 12.5px; color: var(--c-ink-800); font-weight: 620; }
.dm-item .di-top .tag { margin-left: auto; }
.dm-item .di-sub {
  font-size: 10.5px; color: var(--c-ink-400); margin-top: 3px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* 七维微型柱状分解 */
.dm-dims { display: flex; align-items: flex-end; gap: 3px; height: 30px; }
.dm-dim { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; width: 12px; }
.dm-dim i { display: block; width: 6px; border-radius: 2px; }
.dm-dim em { font-size: 8px; font-style: normal; color: var(--c-ink-300); margin-top: 2px; transform: scale(.9); }

/* 画像页雷达/仪表画布：确保块级占满 */
#dmRadar, #dmGauge, #dmFitGauge { display: block; }
#dmGauge, #dmFitGauge { flex: 0 0 auto; }

/* 四象限散点：允许 tooltip 溢出 */
#dmScatter svg { display: block; }
#dmScatter circle { cursor: pointer; transition: r .12s; }
#dmScatter circle:hover { r: 6; }

/* 热力表 */
#dmHeat .heat-table td { text-align: center; border-radius: 5px; padding: 5px 4px; transition: transform .12s; }
#dmHeat .heat-table td:hover { transform: scale(1.06); }

/* 需求库表格：矿种权重角标 */
#dmTableWrap .tag b { font-size: 9.5px; margin-left: 2px; }

/* 窄屏适配 */
@media (max-width: 1400px) {
  .dm-dims { display: none; }
}

/* ============================================================
   卖矿需求数据库（#page-sell）
   ============================================================ */
.sl-pane { animation: dmFade .22s ease; }

/* 采集页的二级 Tab：下划线式 */
.tabs.sub {
  display: flex; width: 100%;
  background: transparent; border: 0; border-bottom: 1px solid var(--c-ink-200);
  border-radius: 0; padding: 0; gap: 18px; margin-bottom: 16px;
}
.tabs.sub .tab {
  padding: 7px 2px; border-radius: 0; background: transparent !important;
  box-shadow: none !important; border-bottom: 2px solid transparent;
}
.tabs.sub .tab.active { color: var(--c-primary-700); border-bottom-color: var(--c-primary-500); }

/* 筛选行 */
.sl-filter-row { display: flex; gap: 12px 14px; align-items: flex-end; flex-wrap: wrap; }
.sl-filter-row .field label { font-size: 10.5px; margin-bottom: 3px; }
.sl-filter-row .selbar-select { min-width: 112px; }

/* 库内构成：四组条形 */
.sl-cgrid { display: grid; gap: 15px 26px; }
.sl-cgrid.g2 { grid-template-columns: repeat(2, 1fr); }
.sl-cbt { font-size: 11.5px; font-weight: 700; color: var(--c-ink-600); margin-bottom: 7px; }
.sl-crow { display: flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--c-ink-600); margin-bottom: 5px; }
.sl-ck { flex: 0 0 66px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sl-cbar { flex: 1; height: 7px; background: var(--c-ink-100); border-radius: 4px; overflow: hidden; }
.sl-cbar i { display: block; height: 100%; background: var(--c-primary-500); border-radius: 4px; transition: width .3s; }
.sl-crow b { flex: 0 0 22px; text-align: right; font-variant-numeric: tabular-nums; }

/* 环形图图例 */
.sl-legend { display: flex; flex-direction: column; gap: 6px; flex: 1; min-width: 150px; }
.sl-lg { display: flex; align-items: center; gap: 7px; font-size: 11.5px; color: var(--c-ink-600); }
.sl-lg i { width: 9px; height: 9px; border-radius: 3px; flex: 0 0 auto; }
.sl-lg b { margin-left: auto; color: var(--c-ink-900); font-variant-numeric: tabular-nums; }
.sl-lg em { font-style: normal; color: var(--c-ink-400); font-size: 10.5px; width: 34px; text-align: right; }

/* 来源与状态卡 */
.sl-scard { display: flex; flex-direction: column; gap: 9px; }
.sl-srow { display: flex; align-items: center; gap: 9px; font-size: 11.5px; color: var(--c-ink-600); }
.sl-sk { flex: 0 0 136px; }
.sl-sbar { flex: 1; height: 8px; background: var(--c-ink-100); border-radius: 4px; overflow: hidden; }
.sl-sbar i { display: block; height: 100%; border-radius: 4px; }
.sl-srow b { flex: 0 0 30px; text-align: right; font-variant-numeric: tabular-nums; }
.sl-kv { display: flex; justify-content: space-between; font-size: 12.5px; padding: 6px 0; border-bottom: 1px dashed var(--c-ink-200); }
.sl-kv:last-child { border-bottom: 0; }
.sl-kv b { color: var(--c-ink-900); font-variant-numeric: tabular-nums; }
.sl-note {
  font-size: 11.5px; color: var(--c-ink-500); line-height: 1.7;
  background: var(--c-ink-100); border-radius: 8px; padding: 9px 11px; margin: 10px 0;
}

/* 表格内进度条 */
.sl-mini { display: inline-block; width: 46px; height: 6px; background: var(--c-ink-200); border-radius: 3px; overflow: hidden; vertical-align: middle; }
.sl-mini i { display: block; height: 100%; background: var(--c-primary-500); border-radius: 3px; }
.sl-mini.good i { background: #1E8E3E; }
.sl-mini.bad i { background: #D93025; }
.sl-mini.big { display: block; width: 100%; height: 8px; margin-bottom: 4px; }
.sl-minitxt { font-size: 10.5px; color: var(--c-ink-500); margin-left: 6px; font-variant-numeric: tabular-nums; }
#slTableWrap .sub { font-size: 10.5px; color: var(--c-ink-400); font-weight: 400; }

/* 分页 */
.sl-pager { display: flex; align-items: center; gap: 10px; justify-content: flex-end; font-size: 12px; color: var(--c-ink-500); padding: 4px 2px; }

/* 导入：字段字典 */
.sl-fdict-g { margin-bottom: 15px; }
.sl-fdict-t { font-size: 11.5px; font-weight: 700; color: var(--c-ink-600); margin-bottom: 8px; }
.sl-fdict-items { display: grid; grid-template-columns: repeat(3, 1fr); gap: 9px 16px; }
.sl-fdict-i { font-size: 11px; color: var(--c-ink-500); border-left: 2px solid var(--c-primary-200); padding-left: 9px; line-height: 1.5; }
.sl-fdict-i b { color: var(--c-ink-800); font-size: 12px; margin-right: 4px; }
.sl-fdict-i em { font-style: normal; color: var(--c-primary-600); font-size: 10px; }
.sl-fdict-i span { display: block; color: var(--c-ink-400); margin-top: 2px; }
.sl-fdict-i i { display: block; font-style: normal; color: var(--c-ink-400); font-size: 10.5px; margin-top: 1px; }

/* 直接添加：分组表单 */
.sl-fgroup { margin-bottom: 18px; }
.sl-fgroup:last-child { margin-bottom: 4px; }
.sl-fgt {
  font-size: 11.5px; font-weight: 700; color: var(--c-ink-600);
  margin-bottom: 11px; display: flex; align-items: baseline; gap: 9px;
}
.sl-fgt span { font-weight: 400; color: var(--c-ink-400); font-size: 10.5px; }
#slForm .fitem .fmsg { display: block; color: var(--c-ink-400); }
#slForm .fitem .fmsg.bad { color: var(--c-up); }
#slForm .fitem .fmsg.warn { color: #8A6D1F; }
/* 买矿需求库 · 数据采集表单（#bcForm，与 #slForm 同规则） */
#bcForm .fitem .fmsg { display: block; color: var(--c-ink-400); }
#bcForm .fitem .fmsg.bad { color: var(--c-up); }
#bcForm .fitem .fmsg.warn { color: #8A6D1F; }
#bcPaste {
  min-height: 78px; padding: 9px 11px; line-height: 1.65; font-size: 12.5px;
  border: 1px solid var(--c-ink-300); border-radius: var(--radius-sm);
  color: var(--c-ink-800); background: var(--c-white); outline: none;
}
#bcPaste:focus { border-color: var(--c-primary-500); box-shadow: 0 0 0 3px var(--c-primary-100); }
.fmsg.warn { color: #8A6D1F; }
.finput.warn { border-color: #D9A94E !important; }
#slPaste {
  min-height: 78px; padding: 9px 11px; line-height: 1.65; font-size: 12.5px;
  border: 1px solid var(--c-ink-300); border-radius: var(--radius-sm);
  color: var(--c-ink-800); background: var(--c-white); outline: none;
}
#slPaste:focus { border-color: var(--c-primary-500); box-shadow: 0 0 0 3px var(--c-primary-100); }

/* 质量预览 */
.sl-qbox { background: var(--c-ink-100); border: 1px solid var(--c-ink-200); border-radius: 10px; padding: 12px 14px; }
.sl-qhead { display: flex; justify-content: space-between; align-items: baseline; font-size: 12px; color: var(--c-ink-500); margin-bottom: 8px; }
.sl-qhead b { font-size: 21px; color: var(--c-primary-700); font-variant-numeric: tabular-nums; }
.sl-qhead em { font-style: normal; font-size: 11px; color: var(--c-ink-400); }
.sl-qrow { display: flex; justify-content: space-between; font-size: 12px; color: var(--c-ink-500); padding: 5px 0; }
.sl-qrow b { color: var(--c-ink-800); }
.sl-qerr { margin-top: 9px; font-size: 11.5px; color: var(--c-up); background: var(--c-up-bg); padding: 7px 10px; border-radius: 7px; line-height: 1.6; }
.sl-qwarn { margin-top: 9px; font-size: 11.5px; color: #8A6D1F; background: #FFF7E6; padding: 7px 10px; border-radius: 7px; line-height: 1.6; }
.sl-empty-line { padding: 15px 6px; text-align: center; font-size: 12px; color: var(--c-ink-400); }

/* 撮合：买方行 */
.sl-mrow { display: flex; align-items: center; gap: 13px; padding: 10px 12px; border-bottom: 1px dashed var(--c-ink-200); }
.sl-mrow:last-child { border-bottom: 0; }
.sl-mrow:hover { background: var(--c-primary-50); }
.sl-mrank { flex: 0 0 20px; font-size: 11px; font-weight: 700; color: var(--c-ink-400); text-align: center; }
.sl-mmain { flex: 1; min-width: 0; }
.sl-mmain b { font-size: 13px; display: block; color: var(--c-ink-900); }
.sl-mmain > span { font-size: 11px; color: var(--c-ink-400); display: block; margin-top: 2px; }
.sl-mtags { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 5px; }
.sl-mtags em { font-style: normal; font-size: 10px; padding: 1px 6px; border-radius: 5px; background: var(--c-primary-50); color: var(--c-primary-700); }
.sl-mtags i { font-style: normal; font-size: 10px; padding: 1px 6px; border-radius: 5px; background: var(--c-ink-100); color: var(--c-ink-500); }
.sl-mscore { flex: 0 0 auto; font-size: 17px; font-weight: 700; color: var(--c-ink-700); font-variant-numeric: tabular-nums; }
.sl-mscore.hot { color: var(--c-up); }

/* 撮合：建议清单 */
.sl-advice { margin: 0; padding: 0; list-style: none; }
.sl-advice li {
  position: relative; padding: 7px 0 7px 15px; font-size: 12.5px; color: var(--c-ink-700);
  line-height: 1.65; border-bottom: 1px dashed var(--c-ink-200);
}
.sl-advice li:last-child { border-bottom: 0; }
.sl-advice li::before { content: '▸'; position: absolute; left: 0; top: 8px; color: var(--c-primary-500); font-size: 10px; }

/* 撮合：定价区间 */
.sl-priceline {
  display: flex; align-items: baseline; gap: 10px;
  background: linear-gradient(90deg, var(--c-primary-50), transparent);
  border-radius: 8px; padding: 11px 13px;
}
.sl-pl-lo, .sl-pl-hi { font-size: 18px; font-weight: 700; color: var(--c-primary-700); font-variant-numeric: tabular-nums; }
.sl-pl-mid { font-size: 11.5px; color: var(--c-ink-400); }

@media (max-width: 1400px) {
  .sl-cgrid.g2 { grid-template-columns: 1fr; }
  .sl-fdict-items { grid-template-columns: repeat(2, 1fr); }
}

/* ============================================================
   矿业权台账 · 分页
   ============================================================ */
.ledger-pager {
  display: flex; align-items: center; gap: 6px;
  justify-content: center; flex-wrap: wrap;
  padding: 12px 4px 4px;
  font-size: 12px; color: var(--c-ink-500);
}
.ledger-pager .pg-info { margin-left: 8px; font-variant-numeric: tabular-nums; }
.ledger-pager .pg-info b { color: var(--c-ink-800); font-weight: 700; }
@media (max-width: 640px) {
  .ledger-pager .pg-info { display: block; width: 100%; text-align: center; margin: 6px 0 0; }
}

/* ============================================================
   矿业权台账 · 编辑弹窗 / 已改标记 / 卖矿需求关联
   ============================================================ */
/* ---- 已修改标记 ---- */
.ml-badge {
  display: inline-block; margin-left: 6px; padding: 1px 6px;
  font-size: 10px; font-weight: 700; line-height: 16px; border-radius: 999px;
  color: var(--c-accent-600); background: var(--c-accent-100);
  border: 1px solid rgba(212, 160, 23, .35); vertical-align: middle;
  cursor: help;
}
tr.ml-edited > td { background: rgba(253, 246, 227, .55); }
tr.ml-edited:hover > td { background: rgba(253, 246, 227, .9); }

/* ---- 操作列 ---- */
#tblLedger td.ml-ops { white-space: nowrap; }
#tblLedger td.ml-ops .btn { margin-right: 4px; }
#tblLedger td.ml-ops .btn:last-child { margin-right: 0; }

/* ---- 卖矿需求关联 chip（台账行内） ---- */
.msl-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 8px; font-size: 11.5px; font-weight: 600;
  color: var(--c-primary-700); background: var(--c-primary-50);
  border: 1px solid var(--c-primary-200); border-radius: 999px;
  cursor: pointer; transition: all .15s;
}
.msl-chip:hover { background: var(--c-primary-100); border-color: var(--c-primary-400); }

/* ---- 卖矿需求关联卡片（详情抽屉内） ---- */
.msl-row {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 6px; border-bottom: 1px dashed var(--c-ink-200);
}
.msl-row:last-of-type { border-bottom: 0; }
.msl-main { flex: 1; min-width: 0; }
.msl-t {
  font-size: 12.5px; font-weight: 600; color: var(--c-ink-800);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.msl-s { font-size: 11px; color: var(--c-ink-500); margin-top: 2px; }
.msl-price {
  font-size: 12.5px; font-weight: 700; color: var(--c-ink-900);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.msl-price span { font-size: 10.5px; font-weight: 500; color: var(--c-ink-400); margin-left: 2px; }

/* ---- 编辑弹窗 ---- */
.ml-mask {
  position: fixed; inset: 0; background: rgba(16, 24, 40, .42);
  z-index: 1200; opacity: 0; pointer-events: none; transition: opacity .2s;
}
.ml-mask.show { opacity: 1; pointer-events: auto; }
.ml-modal {
  position: fixed; z-index: 1201; left: 50%; top: 50%;
  transform: translate(-50%, -48%) scale(.985);
  width: min(940px, calc(100vw - 48px)); max-height: calc(100vh - 72px);
  display: flex; flex-direction: column;
  background: var(--c-white); border: 1px solid var(--c-ink-200);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
  opacity: 0; pointer-events: none; transition: opacity .2s, transform .2s;
}
.ml-modal.show { opacity: 1; pointer-events: auto; transform: translate(-50%, -50%) scale(1); }
.ml-head {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 16px 20px; border-bottom: 1px solid var(--c-ink-200);
}
.ml-head h2 { font-size: 15.5px; font-weight: 700; color: var(--c-ink-900); margin: 0; }
.ml-sub { font-size: 11.5px; color: var(--c-ink-500); margin-top: 4px; }
.ml-x {
  flex: 0 0 auto; width: 28px; height: 28px; border: 0; border-radius: var(--radius-sm);
  background: transparent; color: var(--c-ink-500); font-size: 14px; cursor: pointer;
}
.ml-x:hover { background: var(--c-ink-100); color: var(--c-ink-800); }
.ml-body { padding: 16px 20px; overflow: auto; flex: 1; }
.ml-g { margin-bottom: 16px; }
.ml-g:last-child { margin-bottom: 4px; }
.ml-gt {
  font-size: 11.5px; font-weight: 700; color: var(--c-primary-700);
  letter-spacing: .3px; margin-bottom: 8px; padding-left: 8px;
  border-left: 3px solid var(--c-primary-400);
}
.ml-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px 14px; }
.ml-f { display: flex; flex-direction: column; gap: 4px; }
.ml-f.wide { grid-column: span 2; }
.ml-l { font-size: 11.5px; color: var(--c-ink-600); }
.ml-l i { font-style: normal; font-size: 10.5px; color: var(--c-ink-400); margin-left: 4px; }
.ml-in {
  height: var(--ctl-h); padding: 0 10px; font-size: 12.5px;
  color: var(--c-ink-900); background: var(--c-white);
  border: 1px solid var(--c-ink-300); border-radius: var(--radius-sm);
  font-family: inherit; width: 100%;
}
.ml-in:focus { outline: 0; border-color: var(--c-primary-500); box-shadow: var(--ring); }
.ml-foot {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 13px 20px; border-top: 1px solid var(--c-ink-200); background: var(--c-ink-50);
  border-radius: 0 0 var(--radius-lg) var(--radius-lg);
}
.ml-tip { flex: 1; font-size: 11.5px; color: var(--c-ink-500); min-width: 200px; }
.ml-tip b { color: var(--c-accent-600); }
.ml-btns { display: flex; gap: 8px; }
@media (max-width: 820px) {
  .ml-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ml-f.wide { grid-column: span 2; }
}
@media (max-width: 560px) {
  .ml-grid { grid-template-columns: 1fr; }
  .ml-f.wide { grid-column: span 1; }
  .msl-row { flex-wrap: wrap; }
}

/* ============================================================
   台账 ⇄ 卖矿需求 · 字段同步状态
   ============================================================ */
.msl-syncbar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 7px 10px; border-radius: var(--radius-sm);
  font-size: 11.5px; line-height: 1.45;
}
.msl-syncbar.ok   { background: var(--c-down-bg); border: 1px solid rgba(30, 142, 62, .22); color: #146C30; }
.msl-syncbar.warn { background: var(--c-warn-bg); border: 1px solid rgba(227, 116, 0, .26); color: #8A4700; }
.msl-syncbar .ic { font-weight: 700; font-size: 12px; }
.msl-syncbar .tx { flex: 1; min-width: 120px; }
.msl-syncbar .tx b { font-weight: 700; }
.msl-syncbar .sub { color: var(--c-ink-400); font-size: 10.5px; }
.msl-syncbar .btn { height: 24px; padding: 0 9px; font-size: 11px; }

/* 台账行 chip 的同步状态点 */
.msl-dot {
  display: inline-block; width: 6px; height: 6px; border-radius: 50%;
  margin-right: 5px; vertical-align: middle;
}
.msl-dot.ok   { background: var(--c-down); box-shadow: 0 0 0 2px rgba(30, 142, 62, .16); }
.msl-dot.warn { background: var(--c-warn); box-shadow: 0 0 0 2px rgba(227, 116, 0, .18); }

/* 台账行「＋ 建线索」 */
.msl-new {
  display: inline-flex; align-items: center; padding: 2px 8px;
  font-size: 11px; font-weight: 600; font-family: inherit;
  color: var(--c-ink-500); background: transparent;
  border: 1px dashed var(--c-ink-300); border-radius: 999px;
  cursor: pointer; transition: all .15s;
}
.msl-new:hover { color: var(--c-primary-700); border-color: var(--c-primary-400); background: var(--c-primary-50); }

/* 字段差异明细 */
.msl-diffs { margin-top: 8px; border-top: 1px dashed var(--c-ink-200); padding-top: 6px; }
.msl-diff {
  display: flex; align-items: center; gap: 8px;
  font-size: 11px; padding: 3px 0; color: var(--c-ink-600);
}
.msl-diff > span { flex: 0 0 118px; color: var(--c-ink-500); }
.msl-diff > s { color: var(--c-ink-400); }
.msl-diff > b { color: var(--c-down); font-weight: 700; }
.msl-diff.more { color: var(--c-ink-400); }
@media (max-width: 640px) {
  .msl-syncbar .sub { width: 100%; }
  .msl-diff > span { flex: 0 0 92px; }
}

.msl-hint { margin-left: 8px; font-size: 11px; color: var(--c-ink-400); }

/* ============================================================
   矿业权人 1 : N 矿权 · 名下矿权清单（公司级卖矿需求）
   ============================================================ */
.msl-chip.multi { color: var(--c-down); background: var(--c-down-bg); border-color: rgba(30, 142, 62, .3); }
.msl-chip.multi:hover { background: rgba(30, 142, 62, .14); }

.msl-subj {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 8px 10px; margin: 8px 0 10px;
  background: var(--c-primary-50); border: 1px solid var(--c-primary-100);
  border-radius: var(--radius-sm); font-size: 12.5px;
}
.msl-subj b { color: var(--c-ink-900); }
.msl-subj .sub { color: var(--c-ink-500); font-size: 11px; flex: 1 1 200px; }

.msl-mines { display: flex; flex-direction: column; gap: 8px; }
.msl-mine {
  border: 1px solid var(--c-ink-200); border-radius: var(--radius-sm);
  padding: 9px 11px; background: var(--c-white); transition: border-color .15s, box-shadow .15s;
}
.msl-mine.cur { border-color: var(--c-primary-400); background: var(--c-primary-50); box-shadow: 0 0 0 3px rgba(43, 123, 185, .08); }
.msl-mine-h { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 4px; }
.msl-mine-h .nm { font-size: 12.5px; font-weight: 600; color: var(--c-ink-800); }
.msl-mine-b {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(158px, 1fr));
  gap: 3px 12px; font-size: 11.5px; color: var(--c-ink-600);
}
.msl-mine-b .kv { display: flex; gap: 6px; min-width: 0; }
.msl-mine-b .kv .k { color: var(--c-ink-400); flex: 0 0 auto; }
.msl-mine-b .kv .v { color: var(--c-ink-700); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.msl-mine-b .mono { font-family: var(--mono); font-size: 11px; }
.msl-mine-p {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 7px; padding-top: 7px; border-top: 1px dashed var(--c-ink-200);
  font-size: 11.5px; color: var(--c-ink-600);
}
.msl-mine-p .k { color: var(--c-ink-400); }
.msl-mine-p b { color: var(--c-ink-900); font-size: 12.5px; font-variant-numeric: tabular-nums; }
.msl-mine-o { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
.msl-mine-o .btn { height: 24px; padding: 0 9px; font-size: 11px; }
.msl-oknote { font-size: 11px; color: #146C30; }
.msl-diffnote { font-size: 11px; color: #8A4700; }
.msl-diffnote b { color: var(--c-warn); }

.msl-total {
  margin-top: 10px; padding: 8px 11px; font-size: 11.5px; color: var(--c-ink-600);
  background: var(--c-ink-50); border: 1px dashed var(--c-ink-200); border-radius: var(--radius-sm);
}
.msl-total b { color: var(--c-ink-900); font-variant-numeric: tabular-nums; }

.sl-more {
  display: inline-block; margin-left: 5px; padding: 0 5px;
  font-size: 10px; font-weight: 600; color: var(--c-down);
  background: var(--c-down-bg); border-radius: 999px; vertical-align: 1px;
}

/* ============================================================
   地下矿体 · 地质勘查（scripts/geo-page.js）
   ============================================================ */
.gd-kpis{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:14px}
.gd-kpi{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;padding:14px 16px}
.gd-kpi-v{font-size:24px;font-weight:650;color:var(--c-primary-700);line-height:1.1;font-variant-numeric:tabular-nums}
.gd-kpi-v span{font-size:12px;font-weight:500;color:var(--c-ink-500);margin-left:4px}
.gd-kpi-k{font-size:12.5px;color:var(--c-ink-600);margin-top:6px}
.gd-kpi-s{font-size:11px;color:var(--c-ink-400);margin-top:3px;line-height:1.45}

.gd-bar{display:flex;align-items:center;gap:10px;background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);
  border-radius:10px;padding:10px 12px;margin-bottom:12px;flex-wrap:wrap}
.gd-bar select,.gd-bar input{height:32px;border:1px solid var(--c-ink-300,#D0D5DD);border-radius:7px;
  padding:0 10px;font-size:13px;color:var(--c-ink-800);background:#fff;outline:none}
.gd-bar input[type=search]{width:220px}
.gd-bar select:focus,.gd-bar input:focus{border-color:var(--c-primary-400)}
.gd-count{font-size:12.5px;color:var(--c-ink-500);margin-left:auto}
.gd-btn{height:32px;padding:0 14px;border:1px solid var(--c-primary-400);background:var(--c-primary-50);
  color:var(--c-primary-700);border-radius:7px;font-size:13px;cursor:pointer}
.gd-btn:hover{background:var(--c-primary-100)}

.gd-main{display:grid;grid-template-columns:330px minmax(0,1fr) 400px;gap:12px;align-items:start}
.gd-list{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;
  max-height:calc(100vh - 300px);overflow-y:auto}
.gd-row{display:flex;align-items:flex-start;gap:9px;padding:11px 12px;border-bottom:1px solid var(--c-ink-100,#F2F4F7);cursor:pointer}
.gd-row:hover{background:var(--c-primary-50)}
.gd-row.on{background:var(--c-primary-50);box-shadow:inset 3px 0 0 var(--c-primary-500)}
/* 地勘清单分页条（全台账 4700+ 宗，每页 100 条） */
.gd-pager{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;
  background:var(--c-ink-50,#F8FAFC);border-top:1px solid var(--c-ink-100,#F2F4F7);flex-wrap:wrap}
.gd-pg-info{font-size:12px;color:var(--c-ink-500)}
.gd-pg-btns{display:inline-flex;gap:4px;align-items:center}
.gd-pg{min-width:28px;height:26px;padding:0 8px;border:1px solid var(--c-ink-200,#E4E7EC);background:#fff;
  border-radius:6px;font-size:12px;color:var(--c-ink-700);cursor:pointer}
.gd-pg:hover:not(.dis){border-color:var(--c-primary-400);color:var(--c-primary-600)}
.gd-pg.on{background:var(--c-primary-500);border-color:var(--c-primary-500);color:#fff;font-weight:600}
.gd-pg.dis{opacity:.45;cursor:not-allowed}
.gd-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;flex:0 0 auto}
.gd-row-main{min-width:0;flex:1}
.gd-row-name{font-size:13px;font-weight:600;color:var(--c-ink-900);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.gd-row-meta{font-size:11px;color:var(--c-ink-500);margin-top:3px;line-height:1.5}
.gd-lv{font-size:10.5px;border:1px solid;border-radius:4px;padding:1px 5px;white-space:nowrap;flex:0 0 auto;line-height:1.5}

.gd-view{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;padding:8px;position:sticky;top:0}
#gdCanvas{display:block;width:100%;height:calc(100vh - 340px);min-height:420px;border-radius:7px;cursor:grab}
#gdCanvas:active{cursor:grabbing}
.gd-view-note{font-size:11px;color:var(--c-ink-400);padding:6px 4px 2px;text-align:center}

.gd-detail{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;padding:14px;
  max-height:calc(100vh - 300px);overflow-y:auto}
.gd-d-head{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;
  padding-bottom:11px;border-bottom:1px solid var(--c-ink-100,#F2F4F7)}
.gd-d-name{font-size:14.5px;font-weight:650;color:var(--c-ink-900);line-height:1.4}
.gd-d-sub{font-size:11.5px;color:var(--c-ink-500);margin-top:4px}
.gd-sec{margin-top:14px}
.gd-sec h4{font-size:12.5px;font-weight:600;color:var(--c-ink-700);margin:0 0 8px;
  display:flex;justify-content:space-between;align-items:baseline;gap:8px}
.gd-hint{font-size:10.5px;font-weight:400;color:var(--c-ink-400)}
/* 小节标题词条不参与压缩换行（长说明紧跟其后时可正常折行） */
.gd-h4-k{flex:0 0 auto;white-space:nowrap}
.gd-kv{display:grid;grid-template-columns:1fr 1fr;gap:7px 10px}
.gd-kv>div{display:flex;justify-content:space-between;font-size:12px;padding:5px 8px;
  background:var(--c-ink-50,#F9FAFB);border-radius:6px}
.gd-kv span{color:var(--c-ink-500)}
.gd-kv b{color:var(--c-ink-900);font-weight:600}
.gd-table-wrap{overflow-x:auto;border:1px solid var(--c-ink-100,#F2F4F7);border-radius:7px}
.gd-table{width:100%;border-collapse:collapse;font-size:11.5px;font-variant-numeric:tabular-nums}
.gd-table th{background:var(--c-ink-50,#F9FAFB);color:var(--c-ink-500);font-weight:500;
  text-align:left;padding:6px 7px;white-space:nowrap;border-bottom:1px solid var(--c-ink-100)}
.gd-table td{padding:6px 7px;border-bottom:1px solid var(--c-ink-100,#F2F4F7);color:var(--c-ink-800);white-space:nowrap}
.gd-table tr:last-child td{border-bottom:none}
.gd-archive{background:var(--c-primary-50);border:1px solid var(--c-primary-200);border-radius:8px;padding:11px}
.gd-arch-title{font-size:12.5px;color:var(--c-ink-900);line-height:1.5;font-weight:600}
.gd-arch-meta{font-size:11px;color:var(--c-ink-500);margin-top:5px}
.gd-arch-link{display:inline-block;margin-top:8px;font-size:12px;color:var(--c-primary-600);text-decoration:none}
.gd-arch-link:hover{text-decoration:underline}
.gd-arch-none{font-size:11.5px;color:var(--c-ink-500);line-height:1.6;background:var(--c-ink-50,#F9FAFB);
  border:1px dashed var(--c-ink-300);border-radius:8px;padding:11px}
.gd-empty{padding:28px 12px;text-align:center;color:var(--c-ink-400);font-size:13px}

@media (max-width:1500px){
  .gd-kpis{grid-template-columns:repeat(3,1fr)}
  .gd-main{grid-template-columns:280px minmax(0,1fr) 340px}
}
@media (max-width:1180px){
  .gd-main{grid-template-columns:1fr}
  .gd-list,.gd-detail{max-height:none}
}

/* ============================================================
   三维矿体 · 地勘 —— 页内视图切换（scripts/model3d-page.js）
   地勘视图内容样式见文件末尾 gd-* 段（scripts/geo-page.js）
   ============================================================ */
.m3-tabhead{display:flex;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.m3-tabhead .tabs{margin-bottom:0}
.m3-tab-note{font-size:11.5px;color:var(--c-ink-400);margin-left:auto;text-align:right;line-height:1.5}
.m3-tab-badge{display:inline-block;margin-left:7px;font-size:10px;font-weight:650;
  color:#15803D;background:#DCFCE7;border:1px solid #86EFAC;border-radius:4px;
  padding:0 5px;line-height:1.55;vertical-align:1px}
/* 单矿详情模式（地勘数据并入三维矿体页：#gdDetailRoot，无清单无筛选）
   画布与详情左右两列，高度固定在卡片内，不抢占整屏 */
#gdDetailRoot .gd-main-solo{grid-template-columns:minmax(0,1.3fr) minmax(0,1fr)}
#gdDetailRoot .gd-view{position:static}
#gdDetailRoot #gdCanvas{height:520px;min-height:380px}
#gdDetailRoot .gd-detail{max-height:520px}
@media (max-width:1500px){
  #gdDetailRoot .gd-main-solo{grid-template-columns:minmax(0,1.15fr) minmax(0,1fr)}
}
@media (max-width:1180px){
  #gdDetailRoot .gd-main-solo{grid-template-columns:1fr}
  #gdDetailRoot #gdCanvas{height:400px}
  #gdDetailRoot .gd-detail{max-height:none}
}

/* ============================================================
   权限管理（scripts/auth.js + scripts/admin-page.js）
   ============================================================ */
body.au-locked{overflow:hidden}
body.au-locked .sidebar,body.au-locked .main{visibility:hidden}

/* ---------- 登录页 ---------- */
.au-login{position:fixed;inset:0;z-index:9000;display:grid;grid-template-columns:1.05fr .95fr;
  background:#fff;animation:auFade .22s ease}
@keyframes auFade{from{opacity:0}to{opacity:1}}
.au-login-brand{position:relative;overflow:hidden;padding:64px 56px;color:#EAF3FA;
  background:linear-gradient(150deg,var(--c-primary-900,#0B2C47) 0%,var(--c-primary-700,#124168) 45%,var(--c-primary-600,#1A5A8C) 100%);
  transition:background .28s ease}
.au-login-brand::after{content:'';position:absolute;right:-140px;bottom:-160px;width:440px;height:440px;
  border-radius:50%;background:radial-gradient(circle,rgba(var(--primary-rgb,43,123,185),.55),transparent 68%)}
.au-brand-mark{font-size:42px;color:var(--c-primary-200,#7FC4F0);line-height:1}
.au-login-brand h1{font-size:30px;line-height:1.42;font-weight:650;margin:18px 0 12px;letter-spacing:.5px}
.au-brand-sub{font-size:13.5px;color:#A9CCE6;line-height:1.7}
.au-brand-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-top:44px;max-width:400px}
.au-brand-stats>div{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);
  border-radius:10px;padding:13px 16px}
.au-brand-stats b{display:block;font-size:23px;font-weight:650;color:#fff;font-variant-numeric:tabular-nums}
.au-brand-stats span{font-size:11.5px;color:#A9CCE6;margin-top:3px;display:block}
.au-brand-foot{position:absolute;left:56px;bottom:40px;font-size:11.5px;color:#89B4D4}

.au-login-form{padding:72px 76px;display:flex;flex-direction:column;justify-content:center;max-width:560px}
.au-login-form h2{font-size:24px;font-weight:650;color:var(--c-ink-900);margin:0 0 8px}
.au-login-tip{font-size:12.5px;color:var(--c-ink-500);line-height:1.7;margin:0 0 26px}
.au-field{display:block;margin-bottom:16px}
.au-field>span{display:block;font-size:12.5px;color:var(--c-ink-600);margin-bottom:7px;font-weight:550}
.au-field input{width:100%;height:42px;border:1px solid var(--c-ink-300,#D0D5DD);border-radius:9px;
  padding:0 13px;font-size:14px;color:var(--c-ink-900);outline:none;transition:border-color .15s,box-shadow .15s;background:#fff}
.au-field input:focus{border-color:var(--c-primary-500);box-shadow:0 0 0 3px rgba(43,123,185,.13)}
.au-err{font-size:12.5px;color:#DC2626;height:18px;opacity:0;transition:opacity .15s;margin-bottom:6px}
.au-btn{height:44px;border:0;border-radius:9px;background:var(--c-primary-600);color:#fff;
  font-size:14.5px;font-weight:600;letter-spacing:2px;cursor:pointer;transition:background .15s}
.au-btn:hover{background:var(--c-primary-700)}
.au-demo{margin-top:26px;border-top:1px solid var(--c-ink-100,#F2F4F7);padding-top:16px}
.au-demo-t{font-size:11.5px;color:var(--c-ink-400);margin-bottom:9px}
.au-demo-list{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.au-demo-list button{border:1px solid var(--c-ink-200,#E4E7EC);background:#fff;border-radius:8px;
  padding:8px 9px;cursor:pointer;text-align:left;transition:all .15s}
.au-demo-list button:hover{border-color:var(--c-primary-400);background:var(--c-primary-50)}
.au-demo-list b{display:block;font-size:12px;color:var(--c-ink-800);font-weight:600}
.au-demo-list span{display:block;font-size:10.5px;color:var(--c-ink-400);margin-top:2px;font-family:var(--mono)}
.au-note{margin-top:18px;font-size:10.5px;color:var(--c-ink-400);line-height:1.6}

/* ---------- 顶部用户区 ---------- */
.user-chip.au-chip{position:relative;display:flex;align-items:center;gap:9px;cursor:pointer;
  padding:5px 10px 5px 6px;border-radius:9px;transition:background .15s;user-select:none}
.user-chip.au-chip:hover{background:var(--c-ink-100,#F2F4F7)}
.au-chip-main{line-height:1.25}
.au-chip-name{font-size:12.5px;font-weight:600;color:var(--c-ink-900)}
.au-chip-role{font-size:10.5px;color:var(--c-ink-500)}
.au-chip-caret{font-size:10px;color:var(--c-ink-400);margin-left:2px}
.au-menu{display:none;position:absolute;right:0;top:calc(100% + 8px);min-width:186px;background:#fff;
  border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;box-shadow:0 12px 28px rgba(15,32,52,.14);
  padding:6px;z-index:500}
.user-chip.au-chip.open .au-menu{display:block}
.au-menu-head{font-size:11px;color:var(--c-ink-400);padding:7px 10px 8px;border-bottom:1px solid var(--c-ink-100,#F2F4F7);margin-bottom:4px}
.au-menu button{display:block;width:100%;text-align:left;border:0;background:none;padding:8px 10px;
  font-size:12.5px;color:var(--c-ink-800);border-radius:6px;cursor:pointer}
.au-menu button:hover{background:var(--c-primary-50);color:var(--c-primary-700)}

/* ---------- 权限生效：隐藏无权限内容 ---------- */
.nav-item.au-hide,.nav-group.au-hide{display:none!important}
[data-perm].au-denied{display:none!important}
body.au-no-ledger-edit .ledger-op-edit{display:none!important}

/* ---------- 系统管理 ---------- */
.au-kpis{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:16px}
.au-kpi{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;padding:14px 16px}
.au-kpi-v{font-size:24px;font-weight:650;color:var(--c-primary-700);line-height:1.1;font-variant-numeric:tabular-nums}
.au-kpi-v span{font-size:12px;font-weight:500;color:var(--c-ink-500);margin-left:3px}
.au-kpi-k{font-size:12.5px;color:var(--c-ink-700);margin-top:6px;font-weight:550}
.au-kpi-s{font-size:11px;color:var(--c-ink-400);margin-top:3px;line-height:1.45}
.au-tabs{margin-bottom:14px}
.au-tab-n{margin-left:6px;font-size:10.5px;color:var(--c-ink-400);background:var(--c-ink-100,#F2F4F7);
  border-radius:4px;padding:1px 5px;font-weight:500}
.tab.active .au-tab-n{background:var(--c-primary-100);color:var(--c-primary-700)}

.au-card{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;overflow:hidden}
.au-card-head{display:flex;align-items:baseline;gap:10px;padding:15px 18px;border-bottom:1px solid var(--c-ink-100,#F2F4F7)}
.au-card-head h3{font-size:14px;font-weight:600;color:var(--c-ink-900);margin:0}
.au-sub{font-size:11.5px;color:var(--c-ink-400)}
.au-card-head .au-btn{margin-left:auto;align-self:center}
.au-btn-sm{height:30px;padding:0 12px;font-size:12.5px;letter-spacing:0;border-radius:7px}
.au-btn2{height:32px;padding:0 13px;border:1px solid var(--c-ink-300,#D0D5DD);background:#fff;
  color:var(--c-ink-700);border-radius:7px;font-size:12.5px;cursor:pointer}
.au-btn2:hover{border-color:var(--c-primary-400);color:var(--c-primary-700)}
.au-btn-xs{height:26px;padding:0 9px;font-size:11.5px}
.au-btn[disabled],.au-btn2[disabled]{opacity:.45;cursor:not-allowed}

.au-table-wrap{overflow-x:auto}
.au-table{width:100%;border-collapse:collapse;font-size:12.5px}
.au-table th{background:var(--c-ink-50,#F9FAFB);color:var(--c-ink-500);font-weight:500;text-align:left;
  padding:9px 14px;border-bottom:1px solid var(--c-ink-100,#F2F4F7);white-space:nowrap}
.au-table td{padding:10px 14px;border-bottom:1px solid var(--c-ink-100,#F2F4F7);color:var(--c-ink-800)}
.au-table tr:last-child td{border-bottom:none}
.au-table tr:hover td{background:var(--c-primary-50)}
.au-mono{font-family:var(--mono);font-size:11.5px;color:var(--c-ink-500)}
.au-dim{color:var(--c-ink-500)}
.au-empty-cell{text-align:center;color:var(--c-ink-400);padding:26px 0!important}
.au-acts{white-space:nowrap}
.au-link{border:0;background:none;color:var(--c-primary-600);font-size:12px;cursor:pointer;padding:2px 6px;border-radius:5px}
.au-link:hover{background:var(--c-primary-50);text-decoration:underline}
.au-link-xs{font-size:11px;color:var(--c-ink-500)}
.au-danger{color:#DC2626}
.au-danger:hover{background:#FEF2F2;color:#B91C1C}
.au-tag{display:inline-block;font-size:10.5px;padding:1px 6px;border-radius:4px;border:1px solid;line-height:1.6;white-space:nowrap}
.au-tag-role{color:var(--c-primary-700);background:var(--c-primary-50);border-color:var(--c-primary-100)}
.au-tag-on{color:#15803D;background:#DCFCE7;border-color:#86EFAC}
.au-tag-off{color:#B91C1C;background:#FEF2F2;border-color:#FCA5A5}
.au-tag-me{color:#B45309;background:#FFFBEB;border-color:#FCD34D}
.au-tag-admin{color:#7C2D12;background:#FFF7ED;border-color:#FDBA74}
.au-tag-sys{color:var(--c-ink-500);background:var(--c-ink-50,#F9FAFB);border-color:var(--c-ink-200)}

/* 角色卡 */
.au-roles{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;padding:16px 18px}
.au-role{border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;padding:14px;background:#fff;transition:all .15s}
.au-role:hover{border-color:var(--c-primary-300);box-shadow:0 4px 14px rgba(20,60,100,.07)}
.au-role-admin{background:var(--c-primary-50);border-color:var(--c-primary-200)}
.au-role-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
.au-role-name{font-size:13.5px;font-weight:650;color:var(--c-ink-900);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.au-role-users{font-size:11px;color:var(--c-ink-400);white-space:nowrap}
.au-role-desc{font-size:11.5px;color:var(--c-ink-500);line-height:1.6;margin-top:8px;min-height:36px}
.au-role-metrics{display:flex;gap:14px;font-size:11.5px;color:var(--c-ink-500);margin-top:8px}
.au-role-metrics b{color:var(--c-primary-700);font-weight:650}
.au-role-acts{margin-top:10px;padding-top:9px;border-top:1px dashed var(--c-ink-200,#E4E7EC);display:flex;gap:4px}

/* 授权矩阵 */
.au-grant-layout{display:grid;grid-template-columns:232px minmax(0,1fr);gap:14px;align-items:start}
.au-grant-side{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;padding:12px}
.au-grant-side h4{font-size:12px;color:var(--c-ink-500);font-weight:550;margin:0 0 9px;padding-left:3px}
.au-role-pick{display:block;width:100%;text-align:left;border:1px solid transparent;background:none;
  border-radius:8px;padding:9px 10px;cursor:pointer;margin-bottom:5px;transition:all .14s}
.au-role-pick:hover{background:var(--c-ink-50,#F9FAFB)}
.au-role-pick.on{background:var(--c-primary-50);border-color:var(--c-primary-200)}
.au-role-pick-name{display:block;font-size:12.5px;font-weight:600;color:var(--c-ink-900)}
.au-role-pick.on .au-role-pick-name{color:var(--c-primary-700)}
.au-role-pick-meta{display:block;font-size:10.5px;color:var(--c-ink-400);margin-top:2px}
.au-grant-note{font-size:10.5px;color:var(--c-ink-400);line-height:1.6;margin-top:12px;
  padding-top:10px;border-top:1px solid var(--c-ink-100,#F2F4F7)}

.au-grant-main{background:#fff;border:1px solid var(--c-ink-200,#E4E7EC);border-radius:10px;overflow:hidden}
.au-grant-head{display:flex;align-items:center;gap:14px;padding:14px 18px;border-bottom:1px solid var(--c-ink-100,#F2F4F7);flex-wrap:wrap}
.au-grant-head h3{font-size:14px;font-weight:650;color:var(--c-ink-900);margin:0}
.au-grant-desc{font-size:11.5px;color:var(--c-ink-400);margin-top:3px}
.au-grant-stat{font-size:12px;color:var(--c-ink-600);margin-left:auto}
.au-grant-stat b{color:var(--c-primary-700);font-weight:650}
.au-grant-tools{display:flex;gap:6px}
.au-grant-banner{background:#FFFBEB;border-bottom:1px solid #FDE68A;color:#92400E;
  font-size:12px;padding:10px 18px;line-height:1.6}
.au-grant-matrix{max-height:calc(100vh - 340px);overflow-y:auto;padding:6px 4px 10px}

.au-perm-page{padding:6px 14px 4px;border-bottom:1px solid var(--c-ink-100,#F2F4F7)}
.au-perm-page:last-child{border-bottom:none}
.au-perm-head{display:flex;align-items:center;gap:8px;padding:7px 0}
.au-perm-page-t{display:flex;align-items:center;gap:8px;cursor:pointer;flex:1;min-width:0}
.au-perm-icon{width:20px;text-align:center;color:var(--c-primary-600);font-size:13px}
.au-perm-page-t b{font-size:12.5px;color:var(--c-ink-900);font-weight:600}
.au-perm-page-t em{font-size:10.5px;color:var(--c-ink-400);font-style:normal;margin-left:4px}
.au-perm-secs{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:2px 10px;
  padding:0 0 9px 28px}
.au-perm{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--c-ink-700);
  padding:3px 5px;border-radius:5px;cursor:pointer;line-height:1.5}
.au-perm:hover{background:var(--c-primary-50)}
.au-perm-off{opacity:.45}
.au-perm input,.au-perm-page-t input{width:14px;height:14px;accent-color:var(--c-primary-600);cursor:pointer;flex:0 0 auto}
.au-perm-page-off .au-perm-secs{opacity:.5}

/* 表单 / 弹窗 */
.au-form{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.au-form label{display:block}
.au-form label span{display:block;font-size:11.5px;color:var(--c-ink-600);margin-bottom:5px}
.au-form label span i{color:#DC2626;font-style:normal}
.au-form input,.au-form select,.au-form textarea{width:100%;height:36px;border:1px solid var(--c-ink-300,#D0D5DD);
  border-radius:7px;padding:0 10px;font-size:13px;color:var(--c-ink-900);outline:none;background:#fff;font-family:inherit}
.au-form textarea{height:auto;padding:8px 10px;resize:vertical;line-height:1.6}
.au-form input:focus,.au-form select:focus,.au-form textarea:focus{border-color:var(--c-primary-400);box-shadow:0 0 0 3px rgba(43,123,185,.1)}
.au-form input[readonly]{background:var(--c-ink-50,#F9FAFB);color:var(--c-ink-500)}
.au-form-tip{grid-column:1/-1;font-size:11px;color:var(--c-ink-400);line-height:1.6;
  background:var(--c-ink-50,#F9FAFB);border-radius:7px;padding:9px 11px;margin-top:2px}
.au-confirm{font-size:13px;color:var(--c-ink-800);line-height:1.8}
.au-modal-mask{position:fixed;inset:0;background:rgba(15,32,52,.34);z-index:9500;
  display:flex;align-items:center;justify-content:center;animation:auFade .16s ease}
.au-modal{background:#fff;border-radius:12px;width:min(560px,92vw);max-height:86vh;display:flex;flex-direction:column;
  box-shadow:0 24px 60px rgba(10,25,45,.26)}
.au-modal-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;
  border-bottom:1px solid var(--c-ink-100,#F2F4F7)}
.au-modal-head h3{font-size:14.5px;font-weight:650;color:var(--c-ink-900);margin:0}
.au-x{border:0;background:none;font-size:17px;color:var(--c-ink-400);cursor:pointer;line-height:1;padding:2px 4px}
.au-x:hover{color:var(--c-ink-800)}
.au-modal-body{padding:18px 20px;overflow-y:auto}
.au-modal-foot{display:flex;justify-content:flex-end;gap:8px;padding:13px 20px;border-top:1px solid var(--c-ink-100,#F2F4F7)}
.au-empty{padding:60px 20px;text-align:center;color:var(--c-ink-500)}
.au-empty-ico{font-size:38px;color:var(--c-ink-300);margin-bottom:10px}
.au-empty h3{font-size:15px;color:var(--c-ink-800);margin:0 0 8px}
.au-empty p{font-size:12.5px;color:var(--c-ink-500);line-height:1.7;margin:0}

@media (max-width:1500px){
  .au-kpis{grid-template-columns:repeat(3,1fr)}
  .au-grant-layout{grid-template-columns:200px minmax(0,1fr)}
}
@media (max-width:1180px){
  .au-login{grid-template-columns:1fr}
  .au-login-brand{display:none}
  .au-login-form{padding:48px 32px;max-width:none}
  .au-grant-layout{grid-template-columns:1fr}
  .au-form{grid-template-columns:1fr}
}

/* ============================================================
   主题系统（v1.18.0）— 按日期自动轮换色调 + 手动切换
   调色板只覆盖主色梯度与背景微调；语义色（涨红跌绿）不变。
   ============================================================ */
:root { --primary-rgb: 43,123,185; }

body[data-theme="ocean"] {
  --primary-rgb: 43,123,185;
  --c-primary-900:#0A2540; --c-primary-800:#0D3050; --c-primary-700:#124168;
  --c-primary-600:#1A5A8C; --c-primary-500:#2B7BB9; --c-primary-400:#4E9AD6;
  --c-primary-200:#B8D8F0; --c-primary-100:#E4F0FA; --c-primary-50:#F3F8FC;
}
body[data-theme="pine"] {
  --primary-rgb: 47,131,117;
  --c-primary-900:#12332B; --c-primary-800:#16413A; --c-primary-700:#1A5049;
  --c-primary-600:#22685C; --c-primary-500:#2F8375; --c-primary-400:#55A293;
  --c-primary-200:#BFE3DB; --c-primary-100:#E3F2EE; --c-primary-50:#F1F8F6;
}
body[data-theme="jade"] {
  --primary-rgb: 46,145,154;
  --c-primary-900:#123840; --c-primary-800:#164750; --c-primary-700:#1A5A62;
  --c-primary-600:#22737C; --c-primary-500:#2E919A; --c-primary-400:#57AEB5;
  --c-primary-200:#C4E5E8; --c-primary-100:#E2F3F4; --c-primary-50:#F0F9F9;
}
body[data-theme="dusk"] {
  --primary-rgb: 101,88,166;
  --c-primary-900:#251F3D; --c-primary-800:#2E2750; --c-primary-700:#3A3163;
  --c-primary-600:#4C4180; --c-primary-500:#6558A6; --c-primary-400:#8A7EC4;
  --c-primary-200:#DCD6F2; --c-primary-100:#EEEBFA; --c-primary-50:#F6F5FC;
}
body[data-theme="ochre"] {
  --primary-rgb: 150,104,61;
  --c-primary-900:#3A2415; --c-primary-800:#4A2F1B; --c-primary-700:#5C3C22;
  --c-primary-600:#75502E; --c-primary-500:#96683D; --c-primary-400:#B98A55;
  --c-primary-200:#EAD7BC; --c-primary-100:#F7EDDD; --c-primary-50:#FBF6EC;
}

/* 各主题页面底色微调（降低大面积纯白的视觉刺激） */
body[data-theme="pine"]  .content { background:#F4F8F6; }
body[data-theme="jade"]  .content { background:#F3F8F8; }
body[data-theme="dusk"]  .content { background:#F6F5FA; }
body[data-theme="ochre"] .content { background:#F9F5EE; }

/* 选中态随主题主色变化（覆盖写死的蓝色 rgba） */
.nav-item.active {
  background: linear-gradient(90deg, rgba(var(--primary-rgb), .40), rgba(var(--primary-rgb), .14));
}

/* ---------- 主题下拉菜单 ---------- */
.topbar { position: relative; }
.theme-menu {
  position: absolute; top: calc(var(--header-h) - 6px); right: 118px;
  width: 264px;
  background: var(--c-white);
  border: 1px solid var(--c-ink-200);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: 12px 12px 10px;
  display: none; z-index: 60;
}
.theme-menu.open { display: block; animation: tmIn .14s ease; }
@keyframes tmIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.tm-head { font-size: 13px; font-weight: 700; color: var(--c-ink-900); }
.tm-tip { font-size: 11px; color: var(--c-ink-400); margin: 3px 0 8px; }
.tm-row {
  display: flex; align-items: center; gap: 9px;
  padding: 7px 8px; border-radius: 8px; cursor: pointer;
}
.tm-row:hover { background: var(--c-ink-100); }
.tm-row.on { background: var(--c-primary-50); }
.tm-dot { width: 14px; height: 14px; border-radius: 5px; flex: 0 0 14px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.08); }
.tm-dot[data-dot="ocean"]  { background: linear-gradient(135deg,#2B7BB9,#0A2540); }
.tm-dot[data-dot="pine"]   { background: linear-gradient(135deg,#2F8375,#12332B); }
.tm-dot[data-dot="jade"]   { background: linear-gradient(135deg,#2E919A,#123840); }
.tm-dot[data-dot="dusk"]   { background: linear-gradient(135deg,#6558A6,#251F3D); }
.tm-dot[data-dot="ochre"]  { background: linear-gradient(135deg,#96683D,#3A2415); }
.tm-dot-auto {
  background: conic-gradient(#2B7BB9,#2F8375,#2E919A,#6558A6,#96683D,#2B7BB9);
  color: #fff; font-size: 8px; font-weight: 700; display: grid; place-items: center;
}
.tm-txt { line-height: 1.25; flex: 1; }
.tm-txt b { display: block; font-size: 12.5px; color: var(--c-ink-800); }
.tm-txt span { font-size: 10.5px; color: var(--c-ink-400); }
.tm-check { color: var(--c-primary-600); font-weight: 700; font-size: 12px; }
.tm-foot { font-size: 11px; color: var(--c-ink-500); border-top: 1px solid var(--c-ink-100); margin-top: 8px; padding-top: 8px; }

/* ============================================================
   v1.18.0 — 信息密度与视觉统一
   ============================================================ */
/* 表格紧凑化：行距/字号下调，同屏信息量 +40% 左右 */
.table { font-size: 12.6px; }
.table th { padding: 8px 12px; font-size: 11px; }
.table td { padding: 7px 12px; line-height: 1.42; }
.table .dim { font-size: 10.8px; }
.table .mono { font-size: 11px; }
.table tbody tr:hover td { background: transparent; }
.table tbody tr:hover { background: var(--c-primary-50); }

/* 长文本列防撑行：矿山名 / 主体名超长省略（title 悬停可见全文） */
.ellip { max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: inline-block; vertical-align: bottom; }

/* 导航统一：徽标缩小弱化、分组标签更轻 */
.nav-badge { font-size: 9px; padding: 1px 5px; border-radius: 7px; opacity: .92; }
.nav-group-label { color: rgba(255,255,255,.36); letter-spacing: 1.2px; }
.nav-item { padding: 8px 10px; }

/* 卡片阴影轻量化（降低视觉噪音） */
.card { box-shadow: var(--shadow-xs); }
.card:hover { box-shadow: var(--shadow-sm); }

/* ============================================================
   v1.18.1 — 主题着色强化 + 显示设置面板重做
   ============================================================ */

/* ---- 着色：页面底 / 卡片 / 表头 / 标题 / 指标卡 全链路随主题 ---- */
body[data-theme] .content { background: rgba(var(--primary-rgb), .038); }
body[data-theme] .card { border-color: rgba(var(--primary-rgb), .13); }
body[data-theme] .card-head {
  background: linear-gradient(180deg, rgba(var(--primary-rgb), .07), rgba(var(--primary-rgb), .015));
  border-bottom-color: rgba(var(--primary-rgb), .12);
}
body[data-theme] .card-head h3 { color: var(--c-primary-800); }
body[data-theme] .page-title { color: var(--c-primary-800); }
body[data-theme] .table th {
  background: rgba(var(--primary-rgb), .065);
  color: var(--c-primary-700);
  border-bottom-color: rgba(var(--primary-rgb), .14);
}
body[data-theme] .table tbody tr:hover { background: rgba(var(--primary-rgb), .055); }
body[data-theme] .table tbody tr:hover .strong { color: var(--c-primary-700); }
body[data-theme] .stat {
  background: linear-gradient(158deg, rgba(var(--primary-rgb), .075), #fff 62%);
  border-color: rgba(var(--primary-rgb), .13);
}
body[data-theme] .stat-label { color: var(--c-primary-700); }
body[data-theme] .topbar { border-bottom-color: rgba(var(--primary-rgb), .12); }
body[data-theme] .seg .seg-item.active,
body[data-theme] .tabs .tab.active { border-color: var(--c-primary-500); color: var(--c-primary-700); }

/* ---- 顶栏主题按钮 ---- */
.theme-btn { position: relative; }
.theme-glyph { font-size: 14px; line-height: 1; }
.theme-dot {
  position: absolute; right: 5px; bottom: 5px;
  width: 6px; height: 6px; border-radius: 50%;
  box-shadow: 0 0 0 2px #fff;
  transition: background .2s;
}

/* ---- 显示设置面板（固定定位，贴合按钮，300ms 内可连续对比） ---- */
.theme-menu {
  position: fixed; top: 68px; left: 0; right: auto;
  width: 318px; padding: 0;
  background: var(--c-white);
  border: 1px solid var(--c-ink-200);
  border-radius: 14px;
  box-shadow: 0 18px 44px rgba(16,24,40,.16), 0 2px 8px rgba(16,24,40,.06);
  display: none; z-index: 200; overflow: hidden;
}
.theme-menu.open { display: block; animation: tmIn2 .16s cubic-bezier(.2,.8,.3,1); }
@keyframes tmIn2 { from { opacity: 0; transform: translateY(-6px) scale(.985); } to { opacity: 1; transform: none; } }

.tm-head { display: flex; align-items: center; justify-content: space-between; padding: 13px 14px 0; }
.tm-head b { font-size: 13.5px; color: var(--c-ink-900); letter-spacing: .2px; }
.tm-x {
  width: 24px; height: 24px; border: 0; border-radius: 6px;
  background: transparent; color: var(--c-ink-400);
  font-size: 17px; line-height: 1; cursor: pointer;
}
.tm-x:hover { background: var(--c-ink-100); color: var(--c-ink-700); }
.tm-sub { padding: 3px 14px 10px; font-size: 11.5px; color: var(--c-ink-400); }

.tm-auto {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin: 0 12px 11px; padding: 9px 11px;
  background: var(--c-ink-50); border: 1px solid var(--c-ink-100);
  border-radius: 10px;
}
.tm-auto b { display: block; font-size: 12.5px; color: var(--c-ink-800); font-weight: 600; }
.tm-auto span { font-size: 10.5px; color: var(--c-ink-400); }
.tm-auto span i { font-style: normal; color: var(--c-primary-600); font-weight: 600; }
.tm-switch {
  flex: 0 0 36px; width: 36px; height: 20px; padding: 2px;
  border: 0; border-radius: 11px; background: var(--c-ink-300);
  cursor: pointer; transition: background .18s;
}
.tm-switch i {
  display: block; width: 16px; height: 16px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.22);
  transition: transform .18s;
}
.tm-switch.on { background: var(--c-primary-500); }
.tm-switch.on i { transform: translateX(16px); }

.tm-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 0 12px 12px; }
.tm-tile {
  position: relative; text-align: left; cursor: pointer;
  border: 1px solid var(--c-ink-200); background: #fff;
  border-radius: 10px; padding: 7px 8px 8px;
  display: flex; flex-direction: column; gap: 1px;
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.tm-tile:hover { border-color: var(--c-primary-200); box-shadow: var(--shadow-sm); transform: translateY(-1px); }
.tm-tile.cur { border-color: var(--c-primary-400); box-shadow: 0 0 0 2px rgba(var(--primary-rgb), .13); }
.tm-sw { display: block; height: 24px; border-radius: 6px; margin-bottom: 5px; }
.tm-tile b { font-size: 12px; color: var(--c-ink-800); font-weight: 600; }
.tm-tile em { font-style: normal; font-size: 10px; color: var(--c-ink-400); }
.tm-tick {
  position: absolute; right: 6px; top: 6px;
  width: 15px; height: 15px; border-radius: 50%;
  background: var(--c-primary-600); color: #fff;
  font-size: 9px; font-style: normal;
  display: none; place-items: center;
  box-shadow: 0 1px 3px rgba(0,0,0,.18);
}
.tm-tile.on .tm-tick { display: grid; }
.tm-foot {
  padding: 9px 14px; border-top: 1px solid var(--c-ink-100);
  background: var(--c-ink-50); font-size: 11px; color: var(--c-ink-500);
}
.tm-foot b { color: var(--c-primary-700); }

/* ============================================================
   v1.18.2 — 主题设置入口移入左侧主菜单 + 侧边抽屉
   ============================================================ */
.nav-sep { height: 1px; background: rgba(255,255,255,.09); margin: 10px 6px 8px; }
.nav-tool {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; margin-bottom: 2px;
  border-radius: 8px; cursor: pointer; user-select: none;
  color: rgba(255,255,255,.72); font-size: 13px;
  transition: all .16s ease; position: relative;
}
.nav-tool:hover { background: rgba(255,255,255,.07); color: #fff; }
.nav-tool.on { background: rgba(255,255,255,.10); color: #fff; font-weight: 600; }
.nav-tool:active { transform: scale(.985); }
.nav-tool-dot {
  margin-left: auto; width: 8px; height: 8px; border-radius: 50%;
  box-shadow: 0 0 0 2px rgba(255,255,255,.18);
  transition: background .2s;
}

/* 抽屉：不遮罩界面，右侧内容改色即时可见 */
.theme-drawer {
  position: fixed;
  left: calc(var(--sidebar-w) + 14px);
  top: 86px;
  width: 330px;
  background: var(--c-white);
  border: 1px solid var(--c-ink-200);
  border-radius: 14px;
  box-shadow: 0 22px 56px rgba(16,24,40,.18), 0 2px 8px rgba(16,24,40,.06);
  padding: 0; overflow: hidden; z-index: 200;
  opacity: 0; transform: translateX(-10px) scale(.99);
  pointer-events: none;
  transition: opacity .16s ease, transform .16s cubic-bezier(.2,.8,.3,1);
}
.theme-drawer.open { opacity: 1; transform: none; pointer-events: auto; }
.theme-drawer .tm-grid { grid-template-columns: 1fr 1fr; }
@media (max-width: 820px) {
  .theme-drawer { left: 12px; width: calc(100vw - 24px); top: 70px; }
}
@media (max-width: 900px) {
  .nav-tool span:not(.nav-icon), .nav-tool-dot { display: none; }
  .nav-tool { justify-content: center; }
  .theme-drawer { left: 76px; top: 70px; width: 300px; }
}

/* ============================================================
   v1.18.4 — 登录页接入主题系统
   ============================================================ */
/* 登录页底色/右侧表单区随主题轻微着色 */
body[data-theme] .au-login { background: linear-gradient(160deg,#fff 0%,rgba(var(--primary-rgb),.055) 100%); }
body[data-theme] .au-login-form h2 { color: var(--c-primary-900); }
body[data-theme] .au-field input:focus { border-color: var(--c-primary-500); box-shadow: 0 0 0 3px rgba(var(--primary-rgb),.16); }
body[data-theme] .au-btn { background: var(--c-primary-600); }
body[data-theme] .au-btn:hover { background: var(--c-primary-700); }
body[data-theme] .au-demo-list button:hover { border-color: var(--c-primary-400); background: rgba(var(--primary-rgb),.05); }

/* 登录页右上角「界面色调」快捷切换 */
.au-theme {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 0 0 26px; padding: 8px 10px;
  border: 1px solid rgba(var(--primary-rgb),.14);
  background: rgba(var(--primary-rgb),.035);
  border-radius: 10px;
}
.au-theme-lb { font-size: 11.5px; color: var(--c-ink-500); letter-spacing: .2px; }
.au-theme-ops { display: flex; align-items: center; gap: 6px; }
.au-th {
  width: 22px; height: 22px; padding: 0; border: 0; border-radius: 7px;
  background: transparent; cursor: pointer; display: grid; place-items: center;
  box-shadow: 0 0 0 1px rgba(16,24,40,.10); transition: transform .14s, box-shadow .14s;
}
.au-th i { display: block; width: 100%; height: 100%; border-radius: 6px; }
.au-th:hover { transform: translateY(-1px); }
.au-th.on { box-shadow: 0 0 0 2px rgba(var(--primary-rgb),.55), 0 0 0 4px rgba(var(--primary-rgb),.14); }
.au-th-auto {
  width: auto; height: 22px; padding: 0 8px; border-radius: 7px;
  font-size: 10.5px; color: var(--c-ink-500); background: #fff;
}
.au-th-auto.on { color: #fff; background: var(--c-primary-600); box-shadow: 0 0 0 2px rgba(var(--primary-rgb),.22); }
.au-theme-cur { margin-left: auto; font-size: 11px; color: var(--c-primary-700); font-weight: 600; }

/* ============================================================
   v1.18.6 供需智能匹配 · 统一分页条（一页 10 条）
   ============================================================ */
.dm-pager {
  display: flex; align-items: center; justify-content: center; flex-wrap: wrap;
  gap: 6px; padding: 12px 14px;
  border-top: 1px solid var(--c-line, #EDEFF3);
  background: #fff;
}
.dm-pager .btn { min-width: 34px; }
.dm-pager .btn[disabled] { opacity: .45; cursor: not-allowed; }
.dm-pg-info {
  margin-left: 8px; font-size: 12px; color: var(--c-ink-500);
  font-variant-numeric: tabular-nums;
}
.dm-pg-single {
  padding: 10px 14px; text-align: center; font-size: 12px;
  color: var(--c-ink-500); border-top: 1px solid var(--c-line, #EDEFF3);
}

/* v1.18.7 登录页安全策略提示 */
.au-note-sec {
  color: var(--c-primary-700);
  background: rgba(var(--primary-rgb), .06);
  border: 1px solid rgba(var(--primary-rgb), .18);
  border-radius: 8px;
  padding: 8px 10px;
  line-height: 1.75;
}

/* ============================================================
   v1.19.0 矿业智能体（AGENT）
   ============================================================ */
.ag-shell {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 340px;
  gap: 16px;
  align-items: start;
}
.ag-main {
  display: flex; flex-direction: column;
  min-height: calc(100vh - 190px);
  overflow: hidden;
}
.ag-head {
  display: flex; align-items: center; gap: 12px;
  padding: 13px 16px;
  border-bottom: 1px solid var(--c-line, #EDEFF3);
  background: linear-gradient(180deg, rgba(var(--primary-rgb), .05), transparent);
}
.ag-head-l { min-width: 0; }
.ag-title {
  display: flex; align-items: center; gap: 8px;
  font-size: 14.5px; font-weight: 700; color: var(--c-ink-900);
}
.ag-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--c-primary-500);
  box-shadow: 0 0 0 3px rgba(var(--primary-rgb), .16);
}
.ag-ver {
  font-size: 10.5px; font-weight: 500; color: var(--c-primary-700);
  background: rgba(var(--primary-rgb), .1);
  border: 1px solid rgba(var(--primary-rgb), .2);
  padding: 1px 6px; border-radius: 20px;
}
.ag-sub2 { font-size: 11.5px; color: var(--c-ink-500); margin-top: 4px; }
.ag-head-r { margin-left: auto; display: flex; gap: 8px; }

.ag-chat {
  flex: 1; min-height: 320px; max-height: calc(100vh - 380px);
  overflow-y: auto; padding: 16px 16px 6px;
  background: var(--c-bg, #F7F8FA);
}
.ag-msg { display: flex; gap: 10px; margin-bottom: 14px; }
.ag-msg-user { justify-content: flex-end; }
.ag-bubble {
  background: #fff; border: 1px solid var(--c-line, #EDEFF3);
  border-radius: 10px; padding: 12px 14px;
  font-size: 12.8px; line-height: 1.85; color: var(--c-ink-800);
  max-width: 100%;
}
.ag-bubble-user {
  background: rgba(var(--primary-rgb), .1);
  border-color: rgba(var(--primary-rgb), .22);
  color: var(--c-ink-900); max-width: 76%;
}
.ag-ava {
  width: 26px; height: 26px; flex: 0 0 26px; border-radius: 8px;
  background: var(--c-primary-600, #33416B); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 700;
}
.ag-body { min-width: 0; flex: 1; }
.ag-p { margin: 0 0 8px; }
.ag-p:last-child { margin-bottom: 0; }
.ag-sub {
  font-size: 11.5px; font-weight: 700; color: var(--c-ink-600);
  margin: 10px 0 6px;
}
.ag-kv {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1px; background: var(--c-line, #EDEFF3);
  border: 1px solid var(--c-line, #EDEFF3);
  border-radius: 8px; overflow: hidden; margin: 6px 0 8px;
}
.ag-kv-row {
  display: flex; align-items: baseline; gap: 8px;
  background: #fff; padding: 7px 10px; min-width: 0;
}
.ag-kv-row i {
  font-style: normal; font-size: 11px; color: var(--c-ink-500);
  flex: 0 0 auto; min-width: 62px;
}
.ag-kv-row b {
  font-size: 12px; color: var(--c-ink-900); font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ag-ul { margin: 4px 0 8px; padding-left: 18px; }
.ag-ul li { margin: 3px 0; }
.ag-tbwrap { overflow-x: auto; margin: 6px 0 8px; }
.ag-tb { width: 100%; border-collapse: collapse; font-size: 11.8px; }
.ag-tb th {
  text-align: left; font-weight: 600; color: var(--c-ink-600);
  background: rgba(var(--primary-rgb), .05);
  border-bottom: 1px solid var(--c-line, #EDEFF3);
  padding: 6px 8px; white-space: nowrap;
}
.ag-tb td {
  padding: 6px 8px; border-bottom: 1px solid var(--c-ink-100, #F3F4F7);
  color: var(--c-ink-800);
}
.ag-tb .ag-td-n { color: var(--c-ink-400); width: 30px; }
.ag-tb .ag-td-k {
  color: var(--c-ink-600); font-weight: 500; white-space: nowrap;
  min-width: 84px; padding-right: 14px;
}
.ag-tb tbody tr.ag-rowlink { cursor: pointer; }
.ag-tb tbody tr.ag-rowlink:hover { background: rgba(var(--primary-rgb), .06); }
.ag-note {
  font-size: 11.5px; line-height: 1.75; color: var(--c-ink-600);
  background: var(--c-bg, #F7F8FA);
  border-left: 3px solid rgba(var(--primary-rgb), .5);
  padding: 8px 10px; border-radius: 0 6px 6px 0; margin: 8px 0;
}
.ag-note-warn {
  color: #8A5A00; background: #FFF8E6; border-left-color: #E8A400;
}
.ag-cites {
  display: flex; flex-direction: column; gap: 3px;
  margin-top: 8px; padding-top: 8px;
  border-top: 1px dashed var(--c-line, #EDEFF3);
  font-size: 11px; color: var(--c-ink-500);
}
.ag-follow {
  margin-top: 8px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  font-size: 11px; color: var(--c-ink-400);
}
.ag-fchip, .ag-qchip {
  border: 1px solid var(--c-line, #E3E6EC);
  background: #fff; color: var(--c-ink-700);
  border-radius: 20px; padding: 4px 10px; font-size: 11px;
  cursor: pointer; transition: all .15s;
}
.ag-fchip:hover, .ag-qchip:hover {
  border-color: var(--c-primary-500);
  color: var(--c-primary-700);
  background: rgba(var(--primary-rgb), .06);
}
.ag-quick {
  display: flex; gap: 6px; flex-wrap: wrap;
  padding: 10px 16px; border-top: 1px solid var(--c-line, #EDEFF3);
  background: #fff;
}
.ag-inputbar {
  display: flex; gap: 10px; align-items: flex-end;
  padding: 10px 16px 14px; border-top: 1px solid var(--c-line, #EDEFF3);
  background: #fff;
}
.ag-inputbar textarea {
  flex: 1; resize: none; font-family: inherit; font-size: 12.8px;
  line-height: 1.7; padding: 9px 11px;
  border: 1px solid var(--c-line, #E3E6EC); border-radius: 8px;
  color: var(--c-ink-900); background: #fff; outline: none;
}
.ag-inputbar textarea:focus {
  border-color: var(--c-primary-500);
  box-shadow: 0 0 0 3px rgba(var(--primary-rgb), .1);
}
.ag-send { height: 38px; min-width: 76px; }

.ag-side { display: flex; flex-direction: column; gap: 12px; }
.ag-card .card-head { padding: 11px 13px; }
.ag-card .card-body { padding: 12px 13px; }
.ag-stat-grid {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px;
}
.ag-stat-grid > div {
  background: var(--c-bg, #F7F8FA); border-radius: 8px;
  padding: 9px 10px; display: flex; flex-direction: column; gap: 2px;
}
.ag-stat-grid b {
  font-size: 17px; color: var(--c-primary-700);
  font-variant-numeric: tabular-nums; line-height: 1.2;
}
.ag-stat-grid i { font-style: normal; font-size: 10.5px; color: var(--c-ink-500); }
.ag-stat-foot {
  margin-top: 9px; font-size: 10.5px; line-height: 1.7; color: var(--c-ink-500);
}
.ag-lead-item {
  padding: 9px 0; border-bottom: 1px dashed var(--c-line, #EDEFF3);
}
.ag-lead-item:last-child { border-bottom: 0; }
.ag-li-top { display: flex; align-items: center; gap: 6px; }
.ag-li-top b {
  font-size: 11.8px; color: var(--c-ink-900); font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ag-tag {
  font-size: 10px; color: var(--c-primary-700);
  background: rgba(var(--primary-rgb), .1);
  border-radius: 4px; padding: 1px 5px; flex: 0 0 auto;
}
.ag-tag-ok { color: #1E8E3E; background: #E9F6EC; }
.ag-li-mid { font-size: 11px; color: var(--c-ink-500); margin: 4px 0 6px; }
.ag-li-act { display: flex; gap: 6px; }
.ag-empty {
  font-size: 11px; color: var(--c-ink-400); line-height: 1.7; padding: 4px 0;
}
.ag-miss-item {
  display: flex; align-items: center; gap: 6px;
  padding: 7px 0; border-bottom: 1px dashed var(--c-line, #EDEFF3);
  font-size: 11.3px; color: var(--c-ink-700);
}
.ag-miss-item:last-child { border-bottom: 0; }
.ag-miss-item span {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ag-miss-item b { color: var(--c-ink-400); font-weight: 600; font-size: 10.5px; }
.ag-mini {
  border: 1px solid var(--c-line, #E3E6EC); background: #fff;
  border-radius: 4px; font-size: 10px; padding: 2px 6px;
  color: var(--c-ink-600); cursor: pointer;
}
.ag-mini:hover { border-color: var(--c-primary-500); color: var(--c-primary-700); }

.ag-patchbox { display: flex; flex-direction: column; gap: 8px; margin: 8px 0; }
.ag-patch {
  border: 1px solid rgba(var(--primary-rgb), .22);
  background: rgba(var(--primary-rgb), .04);
  border-radius: 8px; padding: 9px 11px;
}
.ag-patch-main { display: flex; align-items: baseline; gap: 8px; font-size: 12.2px; }
.ag-patch-v i { font-style: normal; color: var(--c-ink-400); margin: 0 3px; }
.ag-patch-sub { font-size: 10.8px; color: var(--c-ink-500); margin-top: 4px; line-height: 1.6; }
.ag-patch-act { margin-top: 7px; display: flex; gap: 6px; align-items: center; }
.ag-patch-act .ag-tag { align-self: center; }

/* 窄屏：侧栏下移 */
@media (max-width: 1180px) {
  .ag-shell { grid-template-columns: minmax(0, 1fr); }
  .ag-side { flex-direction: row; flex-wrap: wrap; }
  .ag-side > .card { flex: 1 1 300px; }
  .ag-chat { max-height: none; }
}

/* ============ v1.20.0 智能体多源检索（外部结果 / 数据源状态 / 配置弹窗） ============ */
.ag-web { display: flex; flex-direction: column; gap: 8px; margin: 9px 0 4px; }
.ag-web-item {
  display: flex; gap: 9px; padding: 9px 10px;
  border: 1px solid var(--c-line, #E6E9EF); border-radius: 8px;
  background: #fff;
}
.ag-web-idx {
  flex: 0 0 18px; height: 18px; line-height: 18px; text-align: center;
  border-radius: 5px; font-size: 10.5px; font-weight: 600;
  color: var(--c-primary-700); background: rgba(var(--primary-rgb), .1);
}
.ag-web-main { min-width: 0; flex: 1; }
.ag-web-t {
  display: block; font-size: 12.6px; font-weight: 600; line-height: 1.5;
  color: var(--c-ink-900); text-decoration: none;
  overflow: hidden; text-overflow: ellipsis; display: -webkit-box;
  -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.ag-web-t:hover { color: var(--c-primary-700); text-decoration: underline; }
.ag-web-s {
  font-size: 11.2px; line-height: 1.65; color: var(--c-ink-600); margin-top: 3px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.ag-web-m { display: flex; align-items: center; gap: 8px; margin-top: 6px; }
.ag-web-host {
  font-size: 10px; color: var(--c-ink-400); font-family: var(--mono);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 46%;
}
.ag-web-m .ag-mini { text-decoration: none; }

/* 数据源状态 */
.ag-src-row {
  display: flex; align-items: center; gap: 6px; padding: 6px 0;
  border-bottom: 1px dashed var(--c-line, #EDEFF3); font-size: 11.3px;
}
.ag-src-row:last-of-type { border-bottom: 0; }
.ag-src-dot {
  flex: 0 0 7px; width: 7px; height: 7px; border-radius: 50%; display: inline-block;
  background: var(--c-ink-300, #C9CED8);
}
.ag-src-ok { background: #1E8E3E; box-shadow: 0 0 0 2px rgba(30, 142, 62, .14); }
.ag-src-warn { background: #E6A23C; box-shadow: 0 0 0 2px rgba(230, 162, 60, .16); }
.ag-src-off { background: var(--c-ink-300, #C9CED8); }
.ag-src-idle { background: #7C8AA0; }
.ag-src-k { flex: 0 0 74px; color: var(--c-ink-500); }
.ag-src-v {
  flex: 1; min-width: 0; color: var(--c-ink-800); font-size: 11px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* 配置弹窗 */
.ag-modal-mask {
  position: fixed; inset: 0; background: rgba(15, 23, 42, .42);
  z-index: 1400; backdrop-filter: blur(1.5px);
}
.ag-modal {
  position: fixed; z-index: 1401; left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  width: min(680px, calc(100vw - 32px)); max-height: calc(100vh - 80px);
  display: flex; flex-direction: column;
  background: #fff; border-radius: 12px; overflow: hidden;
  box-shadow: 0 18px 48px rgba(15, 23, 42, .28);
}
.ag-modal-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px; border-bottom: 1px solid var(--c-line, #EDEFF3);
}
.ag-modal-head h3 { font-size: 14px; font-weight: 600; margin: 0; color: var(--c-ink-900); }
.ag-modal-x {
  border: 0; background: transparent; cursor: pointer; font-size: 15px;
  color: var(--c-ink-400); line-height: 1;
}
.ag-modal-x:hover { color: var(--c-ink-700); }
.ag-modal-body { padding: 14px 18px; overflow: auto; }
.ag-modal-foot {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 18px; border-top: 1px solid var(--c-line, #EDEFF3); background: #FBFCFE;
}
.ag-src-sec { margin-bottom: 14px; }
.ag-src-sec:last-child { margin-bottom: 0; }
.ag-src-sec-h {
  font-size: 11.5px; font-weight: 600; color: var(--c-primary-700);
  margin-bottom: 7px; padding-left: 7px; border-left: 3px solid var(--c-primary-500);
  line-height: 1.2;
}
.ag-src-line {
  display: flex; align-items: center; gap: 6px; font-size: 11.6px;
  color: var(--c-ink-700); margin-bottom: 8px; cursor: pointer;
}
.ag-src-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 9px 12px; }
.ag-src-grid label {
  display: flex; flex-direction: column; gap: 4px;
  font-size: 10.8px; color: var(--c-ink-500);
}
.ag-src-grid input, .ag-src-grid select {
  height: 30px; border: 1px solid var(--c-line, #E3E6EC); border-radius: 6px;
  padding: 0 8px; font-size: 11.6px; color: var(--c-ink-900); background: #fff;
  font-family: inherit;
}
.ag-src-grid input:focus, .ag-src-grid select:focus {
  outline: none; border-color: var(--c-primary-500);
  box-shadow: 0 0 0 2px rgba(var(--primary-rgb), .12);
}
.ag-src-msg {
  font-size: 11px; line-height: 1.65; color: var(--c-ink-600);
  background: #F6F8FB; border-radius: 6px; padding: 8px 10px; min-height: 0;
}
.ag-src-msg:empty { display: none; }
@media (max-width: 640px) {
  .ag-src-grid { grid-template-columns: 1fr; }
}

/* ============ v1.23.0 智能体语音：麦克风输入 + 自动播报 ============ */
.ag-mic {
  flex: 0 0 auto; width: 38px; height: 38px; border-radius: 50%;
  border: 1px solid var(--c-line, #E3E6EC); background: #fff; cursor: pointer;
  font-size: 17px; line-height: 1; padding: 0; transition: all .18s ease;
  display: inline-flex; align-items: center; justify-content: center;
}
.ag-mic:hover:not(:disabled) { border-color: var(--c-primary-500); box-shadow: 0 0 0 3px rgba(var(--primary-rgb), .1); }
.ag-mic:disabled { opacity: .45; cursor: not-allowed; }
.ag-mic.on {
  background: #FDEBEC; border-color: #E4574F; color: #C0322B;
  box-shadow: 0 0 0 4px rgba(228, 87, 79, .16); animation: agMicPulse 1.2s infinite;
}
@keyframes agMicPulse {
  0%, 100% { box-shadow: 0 0 0 4px rgba(228, 87, 79, .16); }
  50% { box-shadow: 0 0 0 9px rgba(228, 87, 79, .05); }
}
.ag-head-r .btn.on {
  border-color: var(--c-primary-500); color: var(--c-primary-600, #1a6fd4);
  background: rgba(var(--primary-rgb), .08);
}
@media (max-width: 640px) {
  .ag-mic { width: 34px; height: 34px; font-size: 15px; }
}

/* ============================================================
   v1.24.5 移动端自适应层（≤820px：侧边栏抽屉化 + 全组件窄屏适配）
   ============================================================ */

/* 汉堡按钮：桌面隐藏 */
.mnav-btn { display: none; }
.mnav-mask {
  position: fixed; inset: 0;
  background: rgba(10, 24, 40, .5);
  backdrop-filter: blur(2px);
  opacity: 0; pointer-events: none;
  transition: opacity .22s;
  z-index: 90;
}

@media (max-width: 820px) {
  html { -webkit-text-size-adjust: 100%; }

  /* ---- 汉堡按钮 ---- */
  .mnav-btn {
    display: grid; place-items: center;
    flex: 0 0 36px; width: 36px; height: 36px;
    font-size: 17px;
  }

  /* ---- 侧边栏 → 抽屉 ---- */
  .sidebar {
    position: fixed; top: 0; left: 0; bottom: 0;
    width: min(82vw, 300px); flex-basis: auto;
    transform: translateX(-104%);
    transition: transform .28s cubic-bezier(.4, 0, .2, 1);
    z-index: 100;
    box-shadow: none;
    will-change: transform;
  }
  /* 抽屉态恢复完整文字导航（覆盖 900px 的图标轨规则） */
  body.mnav-open .sidebar { transform: none; box-shadow: var(--shadow-lg); }
  body.mnav-open .mnav-mask { opacity: 1; pointer-events: auto; }
  .sidebar .brand-text, .sidebar .nav-item span:not(.nav-icon),
  .sidebar .nav-group-label, .sidebar .nav-badge,
  .sidebar .sidebar-foot span, .sidebar .sb-ver { display: revert; }
  .sidebar .nav-item { justify-content: flex-start; }
  .sidebar .brand-text { display: block; }
  .sidebar .sb-ver { display: inline-block; }
  .sidebar .sidebar-foot { display: flex; }

  /* ---- 主区 ---- */
  .main { width: 100%; min-width: 0; }
  .topbar {
    height: 54px; flex: 0 0 54px;
    padding: 0 12px; gap: 10px;
  }
  .page-sub { display: none; }
  .page-title { font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .topbar-search { width: auto; flex: 1 1 120px; min-width: 0; padding: 0 8px; }
  .topbar-search input { min-width: 0; }
  .user-chip span { display: none; }
  .user-chip { padding: 3px; }

  .content { padding: 12px 12px 40px; padding-bottom: calc(12px + env(safe-area-inset-bottom)); overflow-x: hidden; }

  /* ---- 通用防溢出 ---- */
  .card, .stat, .selbar, .kv { min-width: 0; max-width: 100%; }
  img, canvas, video, iframe { max-width: 100%; }

  /* 网格全部单列（覆盖既有 1200/900 规则） */
  .g-2, .g-3, .g-4, .g-5, .g-3-1, .g-3-2, .g-2-1, .g-1-2 { grid-template-columns: 1fr; }
  .form-grid { grid-template-columns: 1fr; }

  /* ---- 表格横向滑动（表头表体保持表格语义） ---- */
  .card-body { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .card-body > .table, .card-body > .heat-table { min-width: 480px; }
  .table th, .table td { padding: 8px 10px; }

  /* ---- 抽屉全屏化 ---- */
  .drawer { width: 100vw; max-width: 100vw; }

  /* ---- 弹窗/筛选/工具条 ---- */
  .modal, .modal-box { width: calc(100vw - 24px) !important; max-width: calc(100vw - 24px) !important; }
  .selbar { flex-wrap: wrap; }
  .selbar-select { max-width: 100%; }
  .selbar-meta { margin-left: 0; width: 100%; text-align: left; }
  .toast { left: 12px; right: 12px; max-width: none; }

  /* 页脚与滚动条优化 */
  ::-webkit-scrollbar { height: 4px; width: 4px; }
}

@media (max-width: 480px) {
  .topbar-search { display: none; }   /* 极窄屏收起全局搜索，保导航与用户区 */
  .content { padding: 10px 10px 40px; }
  .stat-value { font-size: 20px; }
}

/* v1.24.5 补充：步骤条窄屏换行 */
@media (max-width: 820px) {
  .steps { flex-wrap: wrap; row-gap: 6px; }
  .step { flex: 1 1 40%; }
  .step-label { white-space: normal; line-height: 1.3; }
  .step-line { min-width: 10px; }
}

/* ============================================================
   v1.24.6 手机端登录页极简版（一屏容纳，无滚动）
   ============================================================ */
@media (max-width: 820px) {
  .au-login {
    display: flex; flex-direction: column;
    justify-content: center; align-items: stretch;
    overflow-y: auto;
    padding: calc(env(safe-area-inset-top) + 10px) 0 calc(env(safe-area-inset-bottom) + 10px);
    background: linear-gradient(165deg, #fff 0%, rgba(var(--primary-rgb, 43, 123, 185), .07) 100%);
  }
  /* 品牌区：由左侧大图改为顶部紧凑标识 */
  .au-login-brand {
    display: block; position: static; overflow: visible;
    background: none !important;
    color: var(--c-primary-900);
    padding: 0 24px 18px; text-align: center;
  }
  .au-login-brand::after { display: none; }
  .au-brand-mark { font-size: 30px; color: var(--c-primary-600); }
  .au-login-brand h1 {
    font-size: 19px; line-height: 1.35; margin: 8px 0 0;
    letter-spacing: .3px; color: var(--c-primary-900);
  }
  .au-login-brand h1 br { display: none; }          /* 标题单行显示 */
  .au-brand-sub, .au-brand-stats, .au-brand-foot { display: none; }

  /* 表单区：紧凑、贴合拇指操作 */
  .au-login-form {
    padding: 0 24px; max-width: none;
    justify-content: flex-start;
  }
  .au-login-form h2, .au-login-tip { display: none; } /* 标题即品牌，去掉重复说明 */
  .au-field { margin-bottom: 12px; }
  .au-field > span { margin-bottom: 5px; font-size: 12px; }
  .au-field input { height: 46px; font-size: 16px; }  /* 16px 防止 iOS 聚焦自动放大 */
  .au-err { height: 16px; margin-bottom: 4px; }
  .au-btn { height: 48px; font-size: 15.5px; }
  .au-note { display: none; }                         /* 长段安全策略收起 */
  .au-login-form::after {
    content: '账号由管理员分配 · 登录后仅显示已授权功能';
    display: block; margin-top: 14px;
    font-size: 11px; line-height: 1.6;
    color: var(--c-ink-400); text-align: center;
  }
}

/* 矮屏（≤640px 高）进一步压缩，确保一屏放下 */
@media (max-width: 820px) and (max-height: 640px) {
  .au-brand-mark { font-size: 24px; }
  .au-login-brand { padding-bottom: 12px; }
  .au-login-brand h1 { font-size: 17px; }
  .au-field input { height: 42px; }
  .au-btn { height: 44px; }
  .au-login-form::after { margin-top: 10px; }
}

/* ============================================================
   v1.24.7 手机端登录页再收紧（真机地址栏占高后常剩 660~760px）
   + 垂直居中改用 auto margin：内容超高时从顶部开始可滚动，不被裁切
   ============================================================ */
@media (max-width: 820px) {
  .au-login { justify-content: flex-start; }
  .au-login-brand { margin-top: auto; }
  .au-login-form { margin-bottom: auto; }
}

@media (max-width: 820px) and (max-height: 760px) {
  .au-login-brand { padding: 0 24px 12px; }
  .au-brand-mark { font-size: 25px; }
  .au-login-brand h1 { font-size: 17px; margin-top: 6px; }
  .au-field { margin-bottom: 10px; }
  .au-field input { height: 44px; }
  .au-btn { height: 46px; }
  .au-login-form::after { margin-top: 10px; }
}

/* v1.24.7 手机登录页再精简：隐藏界面色调选择块；就绪横幅仅在登录页上下文隐藏 */
@media (max-width: 820px) {
  #auThemeRow { display: none !important; }
  body:has(.au-login) .toast { display: none !important; }
}

/* ===== v1.24.12 智能体计划任务卡 ===== */
.ag-sched-line{font-size:12px;color:var(--ink-2,#475569);margin:2px 0 8px}
.ag-sched-line b{color:var(--ink,#0f172a)}
.ag-sched-run{font-size:12px;color:#b45309;background:#fef3c7;border:1px solid #fde68a;border-radius:6px;padding:6px 10px;margin:6px 0}
.ag-sched-hist li{color:var(--ink-2,#475569);font-size:12px}

/* ===== v1.29.3 智能体资料包解析面板（agent-parse.js） ===== */
.ap-modal{width:min(940px,calc(100vw - 28px));max-height:calc(100vh - 64px)}
.ap-src{border:1px solid var(--c-line,#EDEFF3);border-radius:9px;padding:11px 12px;margin-bottom:12px;background:#FBFCFE}
.ap-src-row{display:flex;gap:10px;align-items:center;margin-bottom:8px}
.ap-src-row:last-child{margin-bottom:0}
.ap-file{position:relative;display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px dashed var(--c-primary-400,#7aa7c7);border-radius:7px;color:var(--c-primary-700);font-size:12.5px;cursor:pointer;background:#fff;white-space:nowrap}
.ap-file:hover{background:var(--c-primary-50,#F0F7FC)}
.ap-file input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ap-input{flex:1;min-width:120px;height:32px;padding:0 10px;border:1px solid var(--c-line,#DCE1E8);border-radius:7px;font-size:12.5px;color:var(--c-ink-800);background:#fff}
.ap-input:focus{outline:none;border-color:var(--c-primary-400,#7aa7c7);box-shadow:0 0 0 3px rgba(18,65,104,.08)}
.ap-ocr{margin:10px 0 2px;font-size:12px;color:var(--c-ink-600)}
.ap-ocr summary{cursor:pointer;color:var(--c-primary-700);font-weight:600}
.ap-ocr textarea{width:100%;margin-top:7px;padding:8px 10px;border:1px solid var(--c-line,#DCE1E8);border-radius:7px;font-size:12px;line-height:1.7;font-family:inherit;resize:vertical}
.ap-actions{display:flex;align-items:center;gap:10px;margin-top:10px;flex-wrap:wrap}
.ap-sub{font-size:11.5px;color:var(--c-ink-400);line-height:1.5}
.ap-msg{margin-bottom:10px;padding:8px 11px;border-radius:7px;background:var(--c-primary-50,#F0F7FC);border:1px solid rgba(18,65,104,.12);color:var(--c-primary-700);font-size:12.5px}
/* v1.32.0 大资料包分片上传进度 */
.ap-up{height:4px;border-radius:3px;background:var(--c-line,#E4E9EF);overflow:hidden;margin:-4px 0 10px}
.ap-up i{display:block;height:100%;background:linear-gradient(90deg,var(--c-primary-400,#4A90C2),var(--c-primary-600,#124168));transition:width .25s ease}
.ap-allrow{align-items:flex-start;flex-wrap:wrap}
.ap-all{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--c-ink-600);cursor:pointer;white-space:nowrap}
.ap-all input{margin:0;cursor:pointer}
.ap-steps{margin:0 0 12px;border-left:2px solid var(--c-line,#E4E9EF);padding-left:11px}
.ap-step{display:flex;gap:8px;font-size:12px;line-height:1.85;color:var(--c-ink-600)}
.ap-step i{flex:0 0 62px;color:var(--c-ink-400);font-style:normal;font-size:11px;text-transform:uppercase;letter-spacing:.3px;padding-top:1px}
.ap-step span{flex:1}
.ap-pkg{font-size:12px;color:var(--c-ink-600);background:#F7F9FC;border:1px solid var(--c-line,#EDEFF3);border-radius:8px;padding:8px 11px;margin-bottom:11px;line-height:1.7}
.ap-match{font-size:13px;padding:9px 12px;border-radius:8px;margin-bottom:12px;line-height:1.65}
.ap-match.ok{background:var(--c-down-bg,#E8F5E9);border:1px solid rgba(30,142,62,.22);color:#146C30}
.ap-match.warn{background:var(--c-warn-bg,#FFF4E5);border:1px solid rgba(227,116,0,.26);color:#8A4700}
.ap-match .ap-sub{display:block;color:inherit;opacity:.78;margin-top:2px}
.ap-group{border:1px solid var(--c-line,#EDEFF3);border-radius:9px;margin-bottom:11px;overflow:hidden}
.ap-g-head{display:flex;align-items:center;gap:8px;padding:9px 12px;background:#F7F9FC;cursor:pointer;font-size:12.5px}
.ap-g-head b{color:var(--c-ink-800)}
.ap-table{width:100%;border-collapse:collapse;font-size:12px}
.ap-table th{text-align:left;font-weight:600;color:var(--c-ink-400);font-size:11px;padding:6px 12px;border-bottom:1px solid var(--c-line,#EDEFF3);background:#fff}
.ap-table td{padding:7px 12px;border-bottom:1px solid #F4F6F9;color:var(--c-ink-700);vertical-align:top}
.ap-table tr:last-child td{border-bottom:0}
.ap-table .ap-cur{color:var(--c-ink-400)}
.ap-table .ap-new{color:var(--c-ink-900);font-weight:600}
.ap-unit{color:var(--c-ink-400);font-weight:400;font-size:11px}
.ap-badge{display:inline-block;padding:1px 7px;border-radius:9px;font-size:10.5px;line-height:16px;white-space:nowrap}
.ap-badge.safe{background:var(--c-down-bg,#E8F5E9);color:var(--c-down,#1E8E3E)}
.ap-badge.need{background:var(--c-warn-bg,#FFF4E5);color:var(--c-warn,#E37400)}
.ap-warn{margin:10px 0 0;font-size:11.5px;color:var(--c-ink-600)}
.ap-warn summary{cursor:pointer;color:var(--c-primary-700);padding:4px 0}
.ap-warn ul{margin:6px 0 0;padding-left:18px;line-height:1.8;color:var(--c-up,#D93025)}
.ap-ev{margin-top:6px;max-height:240px;overflow:auto;line-height:1.7}
.ap-ev>div{padding:3px 0;border-bottom:1px dashed #F0F2F6;color:var(--c-ink-600)}
.ap-ev b{color:var(--c-primary-700);font-weight:600}
.ap-ev .ap-sub{margin-left:6px}
.ap-ev i{display:block;color:var(--c-ink-400);font-style:normal;font-size:11px}

/* ===== v1.29.3 矿业智能体 · 技能中心（agent-skills.js） ===== */
.ask-modal{width:min(880px,calc(100vw - 28px));max-height:calc(100vh - 64px);display:none;flex-direction:column}
.ask-head{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid #EDF1F6}
.ask-title{font-size:14px;font-weight:700;color:var(--c-ink-900);display:flex;align-items:center;gap:8px}
.ask-ver{font-size:11px;font-weight:400;color:var(--c-ink-400)}
.ask-head .ag-x{margin-left:auto}
.ask-body{padding:12px 16px 6px;overflow:auto}
.ask-lead{font-size:12px;color:var(--c-ink-500);line-height:1.7;margin-bottom:10px}
.ask-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
@media (max-width:760px){.ask-grid{grid-template-columns:1fr}}
.ask-card{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid #E3E8EF;
  border-radius:9px;background:#fff;cursor:pointer;transition:border-color .15s,box-shadow .15s}
.ask-card:hover{border-color:#B9C8D8;box-shadow:0 4px 14px rgba(16,42,67,.08)}
.ask-ic{flex:0 0 auto;font-size:18px;line-height:1.2}
.ask-main{flex:1;min-width:0}
.ask-nm{font-size:12.5px;font-weight:700;color:var(--c-ink-900);display:flex;align-items:center;gap:6px;
  flex-wrap:wrap}
.ask-tag{font-size:10px;font-weight:500;padding:0 5px;border-radius:4px;line-height:1.6;flex:none}
.ask-tag.ok{color:#0F7B4F;background:#EAF7F0;border:1px solid #CBE9D9}
.ask-tag.go{color:#1D5C96;background:#EDF4FB;border:1px solid #D3E3F3}
.ask-desc{font-size:11.5px;color:var(--c-ink-500);line-height:1.65;margin-top:3px}
.ask-go{flex:none;align-self:center}
.ask-report{margin-top:12px;border:1px solid #E3E8EF;border-radius:9px;padding:10px 12px;background:#FBFCFE}
.ask-rhead{font-size:12.5px;font-weight:700;color:var(--c-ink-900);margin-bottom:8px}
.ask-rhead .sub{font-weight:400;font-size:11px;color:var(--c-ink-400);margin-left:6px}
.ask-hrow{display:grid;grid-template-columns:74px 1fr 96px 190px;align-items:center;gap:8px;
  padding:4px 0;font-size:11.5px;color:var(--c-ink-700)}
@media (max-width:760px){.ask-hrow{grid-template-columns:70px 1fr 84px;}.ask-hrow .fix{display:none}}
.ask-hrow .k{color:var(--c-ink-800);font-weight:600}
.ask-hrow .bar{height:7px;border-radius:4px;background:#EEF1F5;overflow:hidden}
.ask-hrow .bar i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#4E9AD6,#3D5A73)}
.ask-hrow .n{text-align:right;font-variant-numeric:tabular-nums;color:var(--c-ink-500)}
.ask-hrow .fix{font-size:11px;color:var(--c-ink-400)}
.ask-worst{margin-top:8px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.ask-worst .lbl{font-size:11.5px;color:var(--c-ink-500)}
.ask-wchip{font-size:11px;padding:1px 6px;border-radius:5px;background:#FFF6F5;border:1px solid #F0D6D2;
  color:#8C2B22;display:inline-flex;gap:4px;align-items:center}
.ask-wchip i{font-style:normal;color:#B3261E;font-weight:700}
.ask-rfoot{margin-top:8px;font-size:11px;color:var(--c-ink-400);line-height:1.6}
.ask-note{margin:12px 0 4px;font-size:11px;color:var(--c-ink-400);line-height:1.7}

/* ===== 技能中心 · 子面板（v1.30.0）：尽调报告 / 批量导入 / 到期预警 / 估值重算 ===== */
.ask-panel{display:flex;flex-direction:column;gap:10px}
.ask-ptitle{font-size:14px;font-weight:700;color:var(--c-ink-900)}
.ask-prow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ask-prow label{font-size:12px;color:var(--c-ink-500)}
.ask-prow .ap-input{height:30px;padding:0 8px;font-size:12px}
.ask-pnote{font-size:11.5px;color:var(--c-ink-400);line-height:1.7}
.ask-empty{padding:22px 12px;text-align:center;color:var(--c-ink-400);font-size:12px;
  border:1px dashed #D8DEE7;border-radius:9px;background:#FBFCFE}
.ask-err{padding:10px 12px;border-radius:8px;background:#FFF6F5;border:1px solid #F0D6D2;
  color:#8C2B22;font-size:12px}
.ask-ok{padding:10px 12px;border-radius:8px;background:#F2FBF5;border:1px solid #CBE7D4;
  color:#1C6B3A;font-size:12px;line-height:1.7}
.ask-scroll{max-height:340px;overflow:auto;border:1px solid #E3E8EF;border-radius:8px}
.ask-tbl{margin:0;border:none}
.ask-tbl th{position:sticky;top:0;background:#F7F9FC;z-index:1}
.ask-tbl td{font-size:12px;white-space:nowrap}
.ask-tbl tr.bad td{background:#FFF9F8}
.ask-tbl .ask-issue{white-space:normal;min-width:220px;color:var(--c-ink-500)}
.ask-tbl td.up{color:#B3261E;font-variant-numeric:tabular-nums}
.ask-tbl td.down{color:#1C6B3A;font-variant-numeric:tabular-nums}
.ask-ta{width:100%;height:110px;padding:8px 10px;font-size:12px;line-height:1.6;
  font-family:ui-monospace,Consolas,monospace;resize:vertical;box-sizing:border-box}
.ask-docframe{width:100%;height:min(56vh,520px);border:1px solid #E3E8EF;border-radius:8px;background:#fff}
.ask-kpis{display:flex;gap:10px;flex-wrap:wrap}
.ask-kpi{flex:1;min-width:124px;border:1px solid #E3E8EF;border-radius:8px;padding:8px 10px;background:#FBFCFE}
.ask-kpi .k{display:block;font-size:11.5px;color:var(--c-ink-400)}
.ask-kpi .v{display:block;font-size:16px;color:var(--c-ink-900);font-variant-numeric:tabular-nums}
.ask-kpi .s{display:block;font-size:11px;color:var(--c-ink-400)}
.ap-badge.warn{background:#FFF8E8;border-color:#EFDFB8;color:#8A6116}
.ask-modal.ask-wide{width:min(1120px,calc(100vw - 28px))}
@media (max-width:900px){.ask-modal.ask-wide{width:calc(100vw - 16px)}}

/* ===== v1.31.0 智能体问答：直接导入资料包 + 技能自动路由 ===== */
.ag-pkgbtn {
  flex: 0 0 auto; height: 38px; padding: 0 11px; border-radius: 8px;
  border: 1px solid var(--c-line, #E3E6EC); background: #fff; cursor: pointer;
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 14px; line-height: 1; color: var(--c-ink-700, #384252);
  transition: all .18s ease;
}
.ag-pkgbtn i { font-style: normal; font-size: 11.5px; letter-spacing: .2px; }
.ag-pkgbtn:hover {
  border-color: var(--c-primary-500); color: var(--c-primary-600, #1a6fd4);
  background: rgba(var(--primary-rgb), .06);
  box-shadow: 0 0 0 3px rgba(var(--primary-rgb), .1);
}
.ag-main.ag-drop { position: relative; }
.ag-main.ag-drop::after {
  content: '松开即导入资料包（.zip）→ 自动解析并比对台账';
  position: absolute; inset: 8px; z-index: 20; border-radius: 12px;
  border: 2px dashed var(--c-primary-500); background: rgba(var(--primary-rgb), .06);
  color: var(--c-primary-700, #1358ac); font-size: 13px; font-weight: 600;
  display: flex; align-items: center; justify-content: center; pointer-events: none;
}
@media (max-width: 640px) {
  .ag-pkgbtn { height: 34px; padding: 0 9px; }
  .ag-pkgbtn i { display: none; }
}
.ap-next {
  margin-top: 10px; padding: 12px 14px; border: 1px solid #E3E8EF; border-radius: 10px;
  background: #FBFCFE; display: flex; flex-direction: column; gap: 8px;
}
.ap-next > b { font-size: 12.5px; color: var(--c-ink-900); }
.ap-next .ap-newrow { display: flex; gap: 8px; flex-wrap: wrap; }

/* ===== v1.32.0 智能体问答：模型选择 + 技能包 + 大资料包分片上传 ===== */
.ag-optbar {
  display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  padding: 9px 16px 0; background: #fff;
}
.ag-optlbl { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--c-ink-400, #8A93A3); flex: 0 0 auto; }
.ag-sel {
  height: 28px; padding: 0 26px 0 9px; font-size: 12px; font-family: inherit;
  color: var(--c-ink-800, #2C3444); background: #F7F9FC;
  border: 1px solid var(--c-line, #E3E6EC); border-radius: 7px; cursor: pointer; outline: none;
  appearance: none; -webkit-appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, #8A93A3 50%), linear-gradient(135deg, #8A93A3 50%, transparent 50%);
  background-position: calc(100% - 13px) 12px, calc(100% - 8px) 12px;
  background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
}
.ag-sel:hover { border-color: var(--c-primary-400, #7AA7C7); }
.ag-sel:focus { border-color: var(--c-primary-500, #2E7DD1); box-shadow: 0 0 0 3px rgba(var(--primary-rgb), .1); }
.ag-skillbtn {
  flex: 0 0 auto;
  height: 28px; padding: 0 11px; font-size: 12px; font-family: inherit; cursor: pointer;
  color: var(--c-ink-700, #384252); background: #fff;
  border: 1px solid var(--c-line, #E3E6EC); border-radius: 7px;
  display: inline-flex; align-items: center; gap: 5px; transition: all .16s ease;
}
.ag-skillbtn:hover { border-color: var(--c-primary-400, #7AA7C7); color: var(--c-primary-600, #1A6FD4); background: rgba(var(--primary-rgb), .06); }
.ag-skillchip {
  flex: 0 0 auto; max-width: 46%;
  display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 7px 0 10px;
  font-size: 12px; border-radius: 7px; color: var(--c-primary-700, #1358AC);
  background: rgba(var(--primary-rgb), .1); border: 1px solid rgba(var(--primary-rgb), .22);
}
.ag-skillchip b { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ag-skillchip i {
  font-style: normal; cursor: pointer; width: 16px; height: 16px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center; font-size: 10px;
  background: rgba(var(--primary-rgb), .16); color: var(--c-primary-700, #1358AC);
}
.ag-skillchip i:hover { background: rgba(var(--primary-rgb), .3); }
.ag-opt-hint { font-size: 11.5px; color: var(--c-ink-400, #8A93A3); line-height: 1.5; flex: 1 1 200px; min-width: 0; }
.ag-main { position: relative; }
.ag-skillpop {
  position: absolute; left: 16px; right: 16px; bottom: 118px; z-index: 30;
  max-height: 46vh; overflow: auto; background: #fff;
  border: 1px solid var(--c-line, #E3E6EC); border-radius: 11px;
  box-shadow: 0 14px 34px rgba(16, 32, 56, .16);
}
.ag-sp-head { display: flex; align-items: baseline; gap: 8px; padding: 11px 13px 8px; font-size: 12.5px; font-weight: 600; color: var(--c-ink-900); position: sticky; top: 0; background: #fff; }
.ag-sp-head span { font-weight: 400; font-size: 11.5px; color: var(--c-ink-400, #8A93A3); }
.ag-sp-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; padding: 0 11px 10px; }
.ag-sp-item {
  display: grid; grid-template-columns: 20px 1fr; grid-template-rows: auto auto; gap: 2px 7px;
  text-align: left; padding: 8px 10px; border-radius: 8px; cursor: pointer; font-family: inherit;
  border: 1px solid var(--c-line, #EAEDF2); background: #FBFCFE; transition: all .14s ease;
}
.ag-sp-item:hover { border-color: var(--c-primary-400, #7AA7C7); background: rgba(var(--primary-rgb), .05); }
.ag-sp-item.on { border-color: var(--c-primary-500, #2E7DD1); background: rgba(var(--primary-rgb), .09); }
.ag-sp-item i { grid-row: 1 / span 2; font-style: normal; font-size: 15px; line-height: 1.3; }
.ag-sp-item b { font-size: 12.3px; font-weight: 600; color: var(--c-ink-900); }
.ag-sp-item em { font-style: normal; font-size: 11px; color: var(--c-ink-400, #8A93A3); line-height: 1.45; }
.ag-sp-foot { padding: 8px 11px 11px; border-top: 1px solid var(--c-line, #F1F3F7); }
.ag-sp-empty { padding: 16px; font-size: 12.5px; color: var(--c-ink-400, #8A93A3); }
@media (max-width: 860px) {
  .ag-sp-list { grid-template-columns: 1fr; }
  .ag-skillpop { bottom: 106px; left: 8px; right: 8px; }
  .ag-opt-hint { display: none; }
}
.ap-more {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 0 0 11px; padding: 9px 12px; border-radius: 8px;
  background: #F7F9FC; border: 1px dashed var(--c-line, #DFE4EC);
}
.ap-more .ap-sub { flex: 1 1 320px; }

/* ===== v1.33.0 资料包：对话内资料卡 + 上传解析进度卡 ===== */
.ag-msg-user { flex-direction: column; align-items: flex-end; }
.ag-attach {
  display: grid; grid-template-columns: 34px minmax(0, 1fr) auto auto;
  align-items: center; gap: 10px;
  max-width: 560px; width: 100%;
  padding: 10px 12px; margin-bottom: 7px;
  background: #fff; border: 1px solid var(--c-line, #E3E6EC);
  border-left: 3px solid var(--c-primary-500, #2E7DD1);
  border-radius: 10px; box-shadow: 0 1px 2px rgba(16, 32, 56, .05);
}
.ag-attach.done { border-left-color: #2FA36B; }
.ag-attach.error { border-left-color: #D64545; }
.ag-attach.dropped { opacity: .5; }
.ag-at-ico {
  width: 34px; height: 34px; border-radius: 8px; font-size: 17px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(var(--primary-rgb), .09);
}
.ag-at-main { min-width: 0; }
.ag-at-top { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.ag-at-top b {
  font-size: 12.8px; font-weight: 600; color: var(--c-ink-900);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 330px;
}
.ag-at-top span { font-size: 11.5px; color: var(--c-ink-400, #8A93A3); flex: 0 0 auto; }
.ag-at-loc {
  display: block; margin-top: 3px; font-family: ui-monospace, Menlo, Consolas, monospace;
  font-size: 11px; line-height: 1.5; color: var(--c-ink-500, #6B7484);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  background: #F7F9FC; border: 1px solid var(--c-line, #EDEFF3); border-radius: 5px;
  padding: 2px 6px;
}
.ag-at-loc.srv { color: var(--c-primary-700, #1358AC); }
.ag-at-target {
  margin-top: 4px; font-size: 11.5px; color: var(--c-ink-600, #59637A);
  display: flex; align-items: center; gap: 4px;
}
.ag-at-target b { color: var(--c-primary-700, #1358AC); font-weight: 600; }
.ag-at-st {
  font-size: 11.5px; font-weight: 600; padding: 3px 8px; border-radius: 20px; white-space: nowrap;
  color: var(--c-primary-700, #1358AC); background: rgba(var(--primary-rgb), .1);
}
.ag-attach.done .ag-at-st { color: #1E7A4E; background: rgba(47, 163, 107, .12); }
.ag-attach.error .ag-at-st { color: #B03434; background: rgba(214, 69, 69, .12); }
.ag-at-x {
  width: 20px; height: 20px; border: 0; border-radius: 50%; cursor: pointer; padding: 0;
  font-size: 11px; line-height: 20px; color: var(--c-ink-400, #8A93A3); background: #F1F3F7;
}
.ag-at-x:hover { background: #E6E9EF; color: var(--c-ink-700); }

.ag-live .ag-bubble { max-width: 560px; }
.ag-live-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; font-size: 12.5px; }
.ag-live-head b { font-weight: 600; color: var(--c-ink-900); }
.ag-live-head span { font-size: 11.5px; color: var(--c-primary-600, #1A6FD4); font-variant-numeric: tabular-nums; }
.ag-live-bar { height: 5px; margin: 8px 0 6px; border-radius: 4px; background: #EDF1F6; overflow: hidden; }
.ag-live-bar i { display: block; height: 100%; width: 0; border-radius: 4px;
  background: linear-gradient(90deg, var(--c-primary-400, #7AA7C7), var(--c-primary-600, #1A6FD4));
  transition: width .28s ease; }
.ag-live-bar.indet i { width: 36%; animation: agLiveSlide 1.15s ease-in-out infinite; }
@keyframes agLiveSlide { 0% { transform: translateX(-10%); } 100% { transform: translateX(290%); } }
.ag-live-note { font-size: 11.5px; color: var(--c-ink-500, #6B7484); line-height: 1.6; }

/* v1.34.0：任务自动执行链 —— 一句话多步执行，逐步回填结果 */
.ag-task {
  border: 1px solid var(--c-line, #E3E8EF); border-radius: 8px; background: #FBFCFE;
  padding: 10px 12px; margin: 6px 0;
}
.ag-task.is-done { background: #FAFCFB; border-color: rgba(47, 163, 107, .28); }
.ag-task-h {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  font-size: 12.5px; font-weight: 600; color: var(--c-ink-800, #2C3442); margin-bottom: 8px;
}
.ag-task-h > :first-child { flex: 1; min-width: 0; }
.ag-task-run { font-size: 11px; font-weight: 600; color: var(--c-primary-700, #1358AC); }
.ag-task-ok { font-size: 11px; font-weight: 600; color: #1E7A4E; background: rgba(47, 163, 107, .12);
  padding: 2px 8px; border-radius: 20px; white-space: nowrap; }
.ag-task-b { display: flex; flex-direction: column; gap: 5px; }
.ag-tstep { display: grid; grid-template-columns: 16px auto minmax(0, 1fr); align-items: baseline; gap: 7px;
  font-size: 12.5px; color: var(--c-ink-700, #455063); }
.ag-tstep i {
  width: 16px; height: 16px; border-radius: 50%; font-style: normal; font-size: 10px; line-height: 16px;
  text-align: center; background: #EEF2F7; color: var(--c-ink-400, #8A93A3);
}
.ag-tstep b { font-weight: 500; white-space: nowrap; }
.ag-tstep span { color: var(--c-ink-500, #6B7484); font-size: 11.5px; overflow: hidden; text-overflow: ellipsis; }
.ag-tstep.is-run i { background: rgba(var(--primary-rgb), .14); color: var(--c-primary-700, #1358AC); }
.ag-tstep.is-ok i { background: rgba(47, 163, 107, .14); color: #1E7A4E; }
.ag-tstep.is-fail i { background: rgba(214, 69, 69, .14); color: #B03434; }
.ag-tstep.is-skip i { background: #F0F0F0; color: #9AA2AF; }
.ag-tstep.is-wait { opacity: .72; }
.ag-task-dl { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 9px; padding-top: 8px;
  border-top: 1px dashed var(--c-line, #E3E8EF); }
.ag-tdl { font-weight: 600; color: var(--c-primary-700, #1358AC); background: rgba(var(--primary-rgb), .08); }
.ag-tdl:hover { background: rgba(var(--primary-rgb), .16); }

@media (max-width: 860px) {
  .ag-at-top b { max-width: 180px; }
  .ag-attach { grid-template-columns: 30px minmax(0, 1fr) auto; }
  .ag-at-x { display: none; }
}
