/* ============================================================
   modules.css — 业务模块专有样式
   紧急任务榜 / 营收日报 / 钻探抽屉
   ============================================================ */

/* ---------- 紧急任务区 ---------- */
.urgent-section {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-left: 4px solid var(--red);
  border-radius: var(--radius);
  padding: 16px 20px;
}

.urgent-section h3 {
  font-size: 14px; font-weight: 600; margin-bottom: 12px;
  display: flex; align-items: center; gap: 8px;
}

.urgent-section h3::before {
  content: ''; width: 8px; height: 8px; background: var(--red); border-radius: 50%;
  box-shadow: 0 0 8px var(--red);
  animation: pulse 1.2s infinite;
}

.urgent-section h3 .cnt { color: var(--red); }
.urgent-list { display: flex; flex-direction: column; gap: 8px; }

.urgent-row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 10px 14px;
  background: var(--red-bg);
  border-radius: var(--radius-sm);
  font-size: 13px;
}

.urgent-row .name { flex: 1; font-weight: 500; }
.urgent-row .meta { display: flex; gap: 14px; color: var(--text-secondary); font-size: 12px; }
.urgent-row .amount { color: var(--red); font-weight: 600; font-family: var(--font-mono); }

.urgent-row .module-tag {
  padding: 2px 8px; border-radius: 4px;
  font-size: 11px; background: var(--blue-bg-alt); color: var(--blue);
}

.urgent-empty {
  color: var(--text-tertiary); font-size: 12px;
  text-align: center; padding: 12px;
}

/* ---------- 营收日报 ---------- */
.rev-section {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-left: 4px solid var(--green);
  border-radius: var(--radius);
  padding: 16px 20px;
}

.rev-section h3 {
  font-size: 14px; font-weight: 600; margin-bottom: 12px;
  display: flex; align-items: center; gap: 8px;
}

.rev-section h3 .sub { font-size: 11px; color: var(--text-tertiary); font-weight: 400; }

/* 头部：标题左、数据源链接右 */
.rev-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-bottom: 12px;
}
.rev-head h3 { margin-bottom: 0; }

.rev-kpis {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;
  margin-bottom: var(--gap);
}

.rev-kpi {
  background: var(--bg-card-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 10px 14px;
}

.rev-kpi .label { font-size: 11px; color: var(--text-secondary); }

.rev-kpi .value {
  font-family: var(--font-mono);
  font-size: 20px; font-weight: 700; margin-top: 4px; color: var(--text-primary);
}

.rev-kpi .value .unit { font-size: 12px; font-weight: 400; color: var(--text-secondary); margin-left: 2px; }
.rev-kpi .delta { font-size: 11px; margin-top: 2px; }
.rev-kpi .delta.up { color: var(--green); }
.rev-kpi .delta.down { color: var(--red); }

.rev-kpi.clickable { cursor: pointer; transition: border-color .15s ease, transform .15s ease; }
.rev-kpi.clickable:hover { border-color: var(--green-border); transform: translateY(-2px); }

.rev-charts {
  display: grid; grid-template-columns: 2fr 1fr; gap: var(--gap);
  margin-bottom: var(--gap);
}

.rev-chart-card {
  background: var(--bg-card-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 12px 14px;
}

.rev-chart-card .ttl { font-size: 12px; color: var(--text-secondary); margin-bottom: 8px; }
.rev-chart-card canvas { max-height: 200px; cursor: pointer; }

.rev-channels { display: grid; grid-template-columns: repeat(auto-fill, minmax(92px, 1fr)); gap: 8px; }

.rev-channel {
  background: var(--bg-card-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 8px 10px;
  text-align: center;
}

.rev-channel .dot { width: 8px; height: 8px; border-radius: 50%; margin: 0 auto 4px; }

.rev-channel .name {
  font-size: 11px; color: var(--text-secondary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.rev-channel .amt {
  font-family: var(--font-mono);
  font-size: 13px; font-weight: 600; margin-top: 2px; color: var(--text-primary);
}

.rev-channel .pct { font-size: 10px; color: var(--text-tertiary); margin-top: 1px; }

.rev-channel.clickable {
  cursor: pointer;
  transition: background .15s ease, transform .15s ease;
  border-radius: var(--radius-sm); padding: 4px 6px;
}

.rev-channel.clickable:hover { background: var(--green-bg); transform: translateX(2px); }

.rev-channel.active {
  background: var(--green-bg-alt);
  box-shadow: inset 0 0 0 1px var(--green-border);
}
/* 由动态列升级为渠道的卡片：用其渠道色做顶边标记，区分已知渠道 */
.rev-channel.rev-channel-promoted {
  box-shadow: inset 0 2px 0 var(--ch-color, var(--green-border));
}

.rev-note {
  margin-top: 10px; font-size: 11px; color: var(--amber);
  display: flex; align-items: center; gap: 6px;
}

.rev-note::before { content: ''; width: 6px; height: 6px; background: var(--amber); border-radius: 50%; }

/* 渠道占比口径提示（渠道合计口径） */
.rev-channels-note { margin: 8px 0 0; font-size: 11px; color: var(--text-tertiary); }

.fund-approval-label { margin: 10px 0 8px; font-size: 12px; color: var(--text-primary); }
.fund-approval-label span { margin-left: 10px; color: var(--text-tertiary); }
.fund-approvals { flex-wrap: wrap; }
.fund-approvals .fm-chip span { margin-left: 5px; opacity: .7; font-size: 11px; }

.rev-detail { margin-top: 24px; color: var(--text-primary); }
.rev-detail-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 12px; margin-bottom: 12px; }
.rev-detail-head h3 { margin: 0; }
.rev-detail-head span { color: var(--text-tertiary); font-size: 12px; }
.rev-detail-scroll { overflow: auto; max-height: 580px; border: 1px solid var(--border); border-radius: 8px; }
/* 自适应：固定布局 + 100% 宽，列宽由 colgroup 百分比分配，不强制最小宽、不产生横向滚动 */
.rev-detail-table { table-layout: fixed; width: 100%; border-collapse: separate; border-spacing: 0; font-size: 12px; }
.rev-detail-table th, .rev-detail-table td { padding: 6px 7px; border-bottom: 1px solid var(--border); vertical-align: top; }
.rev-detail-table th { text-align: left; }
/* 表头中文允许折行（长渠道名不撑破列），数字数据单元格保持完整不折行 */
.rev-detail-table thead th { position: sticky; top: 0; z-index: 2; background: var(--bg-card); white-space: normal; overflow-wrap: anywhere; line-height: 1.3; }
.rev-detail-table .rev-number { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; font-size: 10px; }
.rev-detail-table thead th.rev-number { white-space: normal; }
.rev-detail-table .rev-date { position: sticky; left: 0; z-index: 1; background: var(--bg-card); white-space: nowrap; }
.rev-detail-table thead .rev-date { z-index: 3; }
.rev-detail-table a { color: var(--text-primary); text-decoration: underline; text-underline-offset: 3px; }
.rev-detail-table .rev-total, .rev-detail-table tfoot { font-weight: 700; }
.rev-detail-table tfoot { background: var(--bg-card); }
/* 备注受控换行（不隐藏数据，长备注 wrap 到列宽内） */
.rev-detail-note { white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; line-height: 1.6; }
/* 动态明细列：只读、不计入合计，视觉上弱化处理（灰字斜体），不冒充 known 渠道金额 */
.rev-detail-table .rev-extra { color: var(--text-secondary); font-style: italic; }
.rev-detail-table thead th.rev-extra { font-style: normal; }
.rev-detail-caption { text-align: left; padding: 10px 14px; color: var(--text-tertiary); }

/* ---------- 钻探抽屉 ---------- */
.drill-mask {
  position: fixed; inset: 0; background: var(--mask-bg);
  backdrop-filter: blur(2px); z-index: 800; opacity: 0; pointer-events: none;
  transition: opacity .22s ease;
}

.drill-mask.open { opacity: 1; pointer-events: auto; }

.drill-panel {
  position: fixed; top: 0; right: 0; height: 100vh; width: 400px; max-width: 92vw;
  background: var(--bg-card); border-left: 1px solid var(--border); z-index: 801;
  transform: translateX(100%); transition: transform .25s cubic-bezier(.4, 0, .2, 1);
  display: flex; flex-direction: column; box-shadow: var(--mask-shadow);
}

.drill-panel.open { transform: translateX(0); }

.drill-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 20px 12px; border-bottom: 1px solid var(--border);
}

.drill-title { font-size: 15px; font-weight: 600; }

.drill-close {
  background: transparent; border: 1px solid var(--border); color: var(--text-secondary);
  width: 28px; height: 28px; border-radius: var(--radius-sm); cursor: pointer; font-size: 13px;
}

.drill-close:hover { color: var(--red); border-color: var(--red); }
/* pre-line：副标题可能带 \n 组成「指标口径 / 回款口径」两行 */
.drill-sub {
  padding: 10px 20px;
  font-size: 11px;
  line-height: 1.6;
  color: var(--text-tertiary);
  white-space: pre-line;
}
.drill-list { flex: 1; overflow-y: auto; padding: 0 20px 24px; }

.drill-row {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 11px 10px; border-radius: var(--radius-sm); cursor: pointer;
  border-bottom: 1px solid var(--border-soft); transition: background .12s ease;
}

.drill-row:hover { background: var(--green-bg-alt); }
.drill-row .d-date { font-size: 12px; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.drill-row .d-amt { font-size: 14px; font-weight: 600; font-variant-numeric: tabular-nums; flex: 1; text-align: right; }

.drill-row .d-tag {
  font-size: 10px; color: var(--amber);
  max-width: 110px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.drill-row .d-go { color: var(--green); font-size: 12px; opacity: .5; }
.drill-row:hover .d-go { opacity: 1; }

.drill-empty { padding: 30px 0; text-align: center; color: var(--text-tertiary); font-size: 12px; }

/* 历史流水被分页截断时的提示（接口 hasMore=true） */
.sv-hist-more {
  margin-top: 10px; padding-top: 9px;
  border-top: 1px dashed var(--border-soft);
  font-size: 11px; color: var(--text-tertiary);
}

.drill-hero {
  background: var(--green-bg-alt);
  box-shadow: inset 0 0 0 1px var(--green-border);
  margin-bottom: 8px; border-bottom: none;
}

.drill-hero .d-date { color: var(--green); font-weight: 600; }

/* ---------- 响应式 ---------- */
@media (max-width: 1100px) {
  .rev-kpis { grid-template-columns: repeat(2, 1fr); }
  .rev-charts { grid-template-columns: 1fr; }
  .rev-channels { grid-template-columns: repeat(4, 1fr); }
}

@media (max-width: 640px) {
  .rev-channels { grid-template-columns: repeat(2, 1fr); }
}

/* ============================================================
   停车场经营分析
   ============================================================ */
.block-header {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 16px;
}
.block-header h2 { font-size: 18px; font-weight: 700; }
.block-actions { display: flex; align-items: center; gap: 12px; }
.block-meta { font-size: 11px; color: var(--text-tertiary); }
.link-btn {
  font-size: 12px; font-weight: 600; color: var(--blue);
  text-decoration: none; padding: 4px 10px; border-radius: 14px;
  background: var(--blue-bg); border: 1px solid var(--blue-border);
}
.link-btn:hover { background: var(--bg-card-2); }

/* 模块顶部右上角的数据源直链（无字段头的模块用它把入口提到最上方） */
.module-srcbar { display: flex; justify-content: flex-end; margin-bottom: 8px; }

.kpi-row {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;
  margin-bottom: 16px;
}
.kpi-card {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 14px 16px;
}
.kpi-card.highlight { border-left: 3px solid var(--blue); }
.kpi-label { font-size: 11px; color: var(--text-tertiary); margin-bottom: 4px; }
.kpi-value { font-size: 22px; font-weight: 700; color: var(--text-primary); }
.kpi-sub { font-size: 11px; color: var(--text-secondary); margin-top: 2px; }

.panel {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); margin-bottom: 16px;
}
.panel-head {
  display: flex; justify-content: space-between; align-items: center;
  padding: 10px 16px; border-bottom: 1px solid var(--border-soft);
}
.panel-head h3 { font-size: 13px; font-weight: 600; }
.panel-meta { font-size: 11px; color: var(--text-tertiary); }
.panel-body { padding: 14px 16px; }

.three-col { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-bottom: 16px; }

.monthly-bars {
  display: grid; grid-template-columns: repeat(12, 1fr); gap: 6px;
}
.month-bar-col {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
}
.mini-bar {
  width: 100%; height: 28px; background: var(--bg-card-2);
  border-radius: 3px; overflow: hidden;
}
.mini-bar-fill { height: 100%; border-radius: 3px; transition: width .3s; }
.month-bar-val { font-size: 10px; color: var(--text-secondary); font-weight: 600; }
.month-bar-label { font-size: 10px; color: var(--text-tertiary); }
.monthly-legend { text-align: center; margin-top: 8px; font-size: 11px; color: var(--text-tertiary); }

.stat-list { display: flex; flex-direction: column; gap: 6px; }
.stat-row {
  display: grid; grid-template-columns: 70px 1fr 60px 40px; gap: 8px;
  align-items: center; font-size: 12px;
}
.stat-key { color: var(--text-primary); font-weight: 500; }
.stat-val { color: var(--text-primary); font-weight: 600; text-align: right; }
.stat-sub { color: var(--text-tertiary); font-size: 10px; text-align: right; }
.empty-line { text-align: center; color: var(--text-tertiary); padding: 20px 0; font-size: 12px; }

.top-list { display: flex; flex-direction: column; gap: 4px; }
.top-row {
  display: grid; grid-template-columns: 28px 1fr auto 120px 70px; gap: 8px;
  align-items: center; padding: 8px 10px; border-radius: 5px;
  cursor: pointer; transition: background .15s;
}
.top-row:hover { background: var(--bg-card-2); }
.top-rank {
  font-size: 12px; font-weight: 700; color: var(--text-tertiary);
  text-align: center; width: 22px; height: 22px; line-height: 22px;
  border-radius: 50%; background: var(--bg-card-2);
}
.top-rank.rank-1 { background: var(--orange); color: #fff; }
.top-rank.rank-2 { background: #7c8ca8; color: #fff; }
.top-rank.rank-3 { background: #a97553; color: #fff; }
.top-name { font-size: 12px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.top-meta { font-size: 10px; color: var(--text-tertiary); }
.top-bar-wrap { width: 100%; }
.top-val { font-size: 12px; font-weight: 700; color: var(--text-primary); text-align: right; }

.data-table {
  width: 100%; border-collapse: collapse; font-size: 11.5px;
}
.data-table th, .data-table td {
  padding: 6px 8px; text-align: left;
  border-bottom: 1px solid var(--border-soft);
  white-space: nowrap;
}
.data-table th {
  font-size: 10px; font-weight: 600; color: var(--text-tertiary);
  text-transform: uppercase; letter-spacing: .5px;
}
.data-table td.num-pos { color: var(--blue); font-weight: 500; text-align: right; }
.data-table th:nth-child(n+5), .data-table td:nth-child(n+5) { text-align: right; }
.data-table a { color: var(--blue); text-decoration: none; }
.data-table a:hover { text-decoration: underline; }

/* ---- 可排序表头（2026-09-18 工程计划管理明细）----
   箭头槽固定 10px：没排序时也占位，否则点一下表头整行会左右跳一下。
   排序状态只改颜色，不改字重 —— 变粗同样会把表头挤动。 */
.data-table th.th-sort { cursor: pointer; user-select: none; }
.data-table th.th-sort:hover { color: var(--text-secondary); }
.th-sort .th-sort-label { vertical-align: middle; }
.th-sort .sort-arrow {
  display: inline-block; width: 10px; margin-left: 3px;
  font-size: 8px; font-style: normal; line-height: 1;
  color: var(--text-tertiary); vertical-align: middle; text-align: left;
}
.data-table th.th-sort.is-sorted { color: var(--blue); }
.data-table th.th-sort.is-sorted .sort-arrow { color: var(--blue); }
.data-table th.th-sort:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

/* ---- 状态标签 ---- */
.status-tag {
  display: inline-block; padding: 2px 8px; border-radius: 10px;
  font-size: 11px; font-weight: 600; line-height: 1.4;
}
.status-tag.tag-ok { background: rgba(82,196,26,.15); color: var(--green); }
.status-tag.tag-info { background: rgba(24,144,255,.15); color: var(--blue); }
.status-tag.tag-warn { background: rgba(250,140,22,.15); color: var(--orange); }
.status-tag.tag-dim { background: var(--bg-card-2); color: var(--text-tertiary); }

/* ---- 进度条（数科工作计划） ---- */
.prog-cell { display: flex; align-items: center; gap: 8px; min-width: 120px; }
.prog-bar { flex: 1; height: 6px; background: var(--bg-card-2); border-radius: 3px; overflow: hidden; min-width: 60px; }
.prog-fill { height: 100%; border-radius: 3px; transition: width .3s; }
.prog-num { font-size: 11px; color: var(--text-secondary); font-weight: 600; min-width: 36px; text-align: right; }

/* ---- 数科工作计划 · 任务层级（飞书「父记录」，2026-09-18）----
   缩进由 JS 按 level 写 inline padding-left（层级是数据决定的，类名到不了第 3 层）；
   这里只负责连接线和子任务徽标。 */
.zd-task { display: flex; align-items: center; gap: 6px; min-width: 0; }
.zd-task .zd-task-name, .zd-task .zd-task-link { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.zd-task .zd-task-link { color: var(--blue); text-decoration: none; }
.zd-task .zd-task-link:hover { text-decoration: underline; }
.zd-task[data-level="1"]::before,
.zd-task[data-level="2"]::before {
  content: ''; flex: 0 0 auto; width: 9px; height: 9px; margin-right: 1px;
  border-left: 1px solid var(--border); border-bottom: 1px solid var(--border);
  border-bottom-left-radius: 4px; transform: translateY(-3px);
}
.zd-child-count {
  flex: 0 0 auto; padding: 1px 6px; border-radius: 8px;
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-tertiary); font-size: 10px; font-weight: 600; white-space: nowrap;
}
/* 子行整行压一档底色，扫一眼就能看出「这几条是挂在上面那条下面的」 */
.data-table tr.zd-row-child > td { background: color-mix(in srgb, var(--blue) 4%, transparent); }

/* ---- 资金状态 chips ---- */
.stat-chips {
  display: flex; flex-wrap: wrap; gap: 8px;
}
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 16px;
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
}
.chip-warn { border-color: var(--orange); background: rgba(250,140,22,.08); }
.chip-label { font-size: 12px; color: var(--text-secondary); }
.chip-val { font-size: 13px; font-weight: 700; color: var(--text-primary); }
.chip-warn .chip-val { color: var(--orange); }
.chip-sub { font-size: 11px; color: var(--text-tertiary); margin-left: 4px; }

/* ---- 明细表 note / meta ---- */
.data-table td.note { max-width: 240px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text-tertiary); }
.data-table td.report-note { min-width: 210px; text-align: left; }
.report-note-content { display: flex; align-items: center; gap: 8px; }
.report-note-content .cell-hist { flex: 0 0 auto; white-space: nowrap; }
.report-note-content .legal-report-btn { display: inline-flex; align-items: center; gap: 5px; color: var(--green); background: var(--green-bg); border: 1px solid var(--green-border); font-weight: 600; }
.report-note-content .legal-report-btn:hover { background: var(--green-bg-alt); border-color: var(--green); }
.report-note-content .legal-report-btn svg { flex: 0 0 auto; }
/* 百分比进度滑块已随源表字段一起下线（2026-09-18），样式一并删除，
   不要再按「进度」把它加回来 —— 案件明细和弹层都不再有这一列/这个控件。 */
.legal-report-btn:focus-visible { outline: 2px solid var(--green); outline-offset: 3px; }
.report-note-text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.data-table td.meta-cell { font-size: 11px; color: var(--text-tertiary); line-height: 1.5; }

/* ---- 诉讼事项 · 汇报进展 / 当前进展（2026-09-18） ----
   汇报进展单独立一列，格子里只有写回按钮；当前进展列只放「小图标 + 最新进展」
   触发器，真正的合并内容在悬停/点击弹出的 DIY 提示里。 */
.data-table td.legal-report-cell { min-width: 116px; }
.legal-report-cell .legal-report-btn { display: inline-flex; align-items: center; gap: 5px; }
.data-table td.legal-latest-cell { min-width: 122px; }
.legal-latest-btn {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 10px; border: 1px solid var(--border); border-radius: 999px;
  background: var(--blue-bg); color: var(--blue);
  font-family: inherit; font-size: 12px; font-weight: 600; line-height: 1.4;
  cursor: pointer; white-space: nowrap;
}
.legal-latest-btn:hover { background: var(--blue-bg-hover); border-color: var(--blue-border-hover); }
.legal-latest-btn:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
.legal-latest-btn svg { flex: 0 0 auto; }
.legal-latest-count {
  min-width: 16px; padding: 0 4px; border-radius: 999px;
  background: var(--blue); color: var(--bg-card);
  font-size: 10px; font-weight: 700; text-align: center; font-variant-numeric: tabular-nums;
}
.legal-latest-empty { color: var(--text-tertiary); font-size: 12px; }

/* DIY 提示：挂在 body 上、position:fixed —— 明细表外层是 overflow-x:auto，
   放格子里会被横向裁掉 */
.legal-latest-tip {
  position: fixed; z-index: 780; left: 0; top: 0;
  /* 判决原文动辄二三百字，440px 里必然出滚动条；放宽到 640px 后
     大多数案件能整段看完，滚动条只在极长的判决书上出现。
     scrollbar-gutter 常驻占位，免得出现滚动条时正文横向跳一下。 */
  width: min(640px, calc(100vw - 24px));
  max-height: min(70vh, 560px); overflow: auto;
  padding: 12px 16px;
  scrollbar-gutter: stable;
  overscroll-behavior: contain;
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: var(--mask-shadow);
}
.legal-latest-tip[hidden] { display: none; }
.legal-tip-seg { display: flex; gap: 10px; align-items: flex-start; padding: 7px 0; border-top: 1px solid var(--border-soft); }
.legal-tip-seg:first-child { border-top: 0; padding-top: 0; }
.legal-tip-tag {
  /* 定宽是为了让右侧正文竖着对齐；98px 是按最长标签「判决/调解情况」量的，
     比它窄会把标签折成两行。 */
  flex: 0 0 auto; width: 98px; padding: 2px 8px; white-space: nowrap;
  border: 1px solid var(--blue-border); border-radius: 999px;
  background: var(--blue-bg); color: var(--blue);
  font-size: 11px; font-weight: 600; line-height: 1.6; text-align: center;
}
.legal-tip-val { flex: 1 1 auto; min-width: 0; color: var(--text-primary); font-size: 12px; line-height: 1.75; white-space: pre-wrap; word-break: break-word; }
.legal-tip-empty { color: var(--text-tertiary); font-size: 12px; line-height: 1.7; }

/* ---- 工抵去化 · 切片筛选器 ---- */
.equity-filters {
  display: flex; flex-direction: column; gap: 10px;
  margin-bottom: 16px;
}
.filter-group {
  display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
}
.filter-dim {
  font-size: 12px; font-weight: 600; color: var(--text-secondary);
  min-width: 64px;
}
.filter-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 4px 12px; border-radius: 14px;
  font-size: 12px; cursor: pointer;
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-secondary);
  transition: all .15s;
}
.filter-chip small { color: var(--text-tertiary); font-size: 11px; }
.filter-chip:hover { border-color: var(--blue); color: var(--blue); }
.filter-chip.active {
  background: var(--blue); border-color: var(--blue);
  color: #fff;
}
.filter-chip.active small { color: rgba(255,255,255,.8); }

/* 工程计划日历（月历视图） */
.cal-nav {
  background: var(--bg-card-2);
  border: 1px solid var(--border);
  color: var(--text-primary);
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;
  line-height: 1;
  padding: 2px 10px;
}
.cal-nav:hover { background: var(--bg-hover); }

.cal-weekday {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 1px;
  background: var(--border);
  border: 1px solid var(--border);
  border-bottom: none;
}
.cal-weekday span {
  text-align: center;
  font-size: 12px;
  color: var(--text-secondary);
  padding: 6px 0;
  background: var(--bg-card-2);
  font-weight: 600;
}

.cal-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  grid-auto-rows: minmax(80px, auto);
  gap: 1px;
  background: var(--border);
  border: 1px solid var(--border);
}
.cal-cell {
  background: var(--bg-card);
  padding: 4px 6px;
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.cal-cell.out { background: var(--bg-card-2); opacity: 0.4; }
.cal-cell.today { background: rgba(0, 212, 255, 0.08); }
.cal-daynum {
  font-size: 12px;
  color: var(--text-secondary);
  font-weight: 600;
  flex-shrink: 0;
}
.cal-cell.today .cal-daynum {
  color: #fff;
  background: var(--blue);
  width: 20px; height: 20px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
}
.cal-items {
  margin-top: 2px;
  overflow-y: auto;
  flex: 1;
}
.cal-item {
  background: var(--bg-card-2);
  border-radius: 3px;
  font-size: 11px;
  padding: 1px 6px;
  color: var(--text-primary);
  cursor: pointer;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  margin-bottom: 2px;
  line-height: 16px;
}
.cal-item:hover { background: var(--bg-hover); }
.cal-item a { color: inherit; text-decoration: none; }
/* 拖拽中：抓住的副本半透明 + 抓取光标，提示「正在平移」 */
.cal-item.cal-dragging {
  opacity: 0.55;
  cursor: grabbing;
  box-shadow: 0 0 0 2px var(--blue, #00D4FF);
  background: var(--bg-hover);
}
/* 落点预览：高亮目标日期格 */
.cal-cell.cal-drop-target {
  outline: 2px dashed var(--blue, #00D4FF);
  outline-offset: -2px;
  background: rgba(0, 212, 255, 0.10);
}
/* 保存反馈状态条 */
.cal-status {
  margin-top: 10px;
  min-height: 18px;
  font-size: 12px;
  color: var(--text-secondary);
  line-height: 1.5;
}
.cal-status-busy { color: var(--text-secondary); }
.cal-status-ok { color: #00E5A0; font-weight: 600; }
.cal-status-warn { color: #FFA63D; }
.cal-status-err { color: #FF4D6D; font-weight: 600; }
/* 平移前确认弹层（内嵌在日历面板） */
.cal-confirm {
  margin-top: 10px;
  border: 1px solid var(--border);
  border-left: 3px solid var(--blue, #00D4FF);
  background: var(--bg-card-2);
  border-radius: 6px;
  padding: 12px 14px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
.cal-confirm-text { font-size: 13px; color: var(--text-primary); }
.cal-confirm-title { font-weight: 600; margin-bottom: 4px; }
.cal-confirm-range { font-size: 12px; color: var(--text-secondary); display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.cal-confirm-range .old b { color: var(--text-tertiary); }
.cal-confirm-range .new b { color: #00E5A0; }
.cal-confirm-range .arrow { color: var(--blue, #00D4FF); font-weight: 700; }
.cal-confirm-actions { display: flex; gap: 8px; flex-shrink: 0; }

/* ============================================================
 * 绿电成本分析（gd-cost）
 * 版式参照原帆软报表：行 = 科目大类/科目，列 = 月份（金额 + 占当月比）
 * ============================================================ */
.gc-filters { margin-bottom: 14px; }

/* ---- 当月科目构成（横条排行） ---- */
.gc-rank { display: flex; flex-direction: column; gap: 5px; }
.gc-rank-row {
  display: grid; grid-template-columns: minmax(96px, 168px) 1fr 84px 52px;
  align-items: center; gap: 8px; padding: 3px 6px;
  border-radius: 5px; cursor: pointer; transition: background .12s;
}
.gc-rank-row:hover { background: var(--bg-hover); }
.gc-rank-name {
  font-size: 12px; color: var(--text-secondary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.gc-rank-bar { height: 13px; border-radius: 3px; background: var(--bg-card-2); overflow: hidden; }
.gc-rank-bar i { display: block; height: 100%; border-radius: 3px; }
.gc-rank-amt {
  font-size: 12px; text-align: right; color: var(--text-primary);
  font-variant-numeric: tabular-nums;
}
.gc-rank-pct {
  font-size: 11.5px; text-align: right; color: var(--text-tertiary);
  font-variant-numeric: tabular-nums;
}

/* ---- 交叉表：科目大类 → 科目 × 12 个月 ---- */
.gc-cross-wrap { overflow: auto; max-height: 640px; }
.gc-cross {
  border-collapse: separate; border-spacing: 0;
  font-size: 11.5px; font-variant-numeric: tabular-nums;
}
.gc-cross th, .gc-cross td {
  padding: 5px 9px; white-space: nowrap;
  border-bottom: 1px solid var(--border-soft);
}
.gc-cross thead th {
  position: sticky; top: 0; z-index: 2;
  background: var(--bg-card); color: var(--text-tertiary);
  font-size: 10.5px; font-weight: 600; text-align: right;
}
.gc-cross thead tr:nth-child(2) th { top: 27px; }
.gc-cross .gc-l1, .gc-cross .gc-l2 { text-align: left; }
.gc-cross .gc-l2 { color: var(--text-primary); }

/* 科目列吸在左边：横向滚到后面时，仍知道自己在看哪个科目 */
.gc-cross .gc-stick {
  position: sticky; left: 0; z-index: 3;
  background: var(--bg-card);
  min-width: 168px; max-width: 168px;
  box-shadow: 1px 0 0 var(--border-soft);
}
.gc-cross thead .gc-stick { z-index: 4; }

.gc-cross .gc-cblx {
  font-weight: 600; color: var(--text-secondary);
  vertical-align: top; white-space: normal; max-width: 92px;
}
.gc-cross .gc-kemu { cursor: pointer; }
.gc-cross .gc-kemu:hover { color: var(--blue); text-decoration: underline; }
.gc-cross .gc-cell { text-align: right; cursor: pointer; }
.gc-cross .gc-share { color: var(--text-tertiary); font-size: 11px; }
.gc-cross .gc-cell:not(.gc-zero):hover { background: rgba(0, 212, 255, .1); }
.gc-cross td.gc-zero { color: var(--text-tertiary); opacity: .38; }
.gc-cross td.gc-neg { color: var(--green); }

.gc-cross tr.gc-total td {
  font-weight: 700; color: var(--text-primary);
  background: var(--bg-card-2);
  border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
}
.gc-cross tr.gc-total .gc-stick { background: var(--bg-card-2); }
.gc-cross tr.gc-sub td { font-weight: 600; color: var(--text-secondary); background: var(--bg-card-2); }
.gc-cross tr.gc-sub .gc-stick { background: var(--bg-card-2); }
.gc-cross tr.gc-item:hover td { background: rgba(0, 212, 255, .04); }

/* ============================================================
 * 付款流程明细（截图下半张「成本分摊-涉及付款流程信息」）
 * 一行 = 付款流程 × 分摊科目 × 分摊项目；同一张单的多行合并（多对一）
 * ============================================================ */
.gc-detail-bar {
  padding: 10px 16px; border-bottom: 1px solid var(--border-soft);
  display: flex; flex-direction: column; gap: 7px;
}
.gc-detail-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.gc-detail-row .filter-dim { min-width: 62px; }
.gc-detail-tag {
  font-size: 11px; color: var(--text-tertiary);
  background: var(--bg-card-2); border-radius: 4px; padding: 3px 8px;
}
.gc-detail-pin {
  color: var(--blue); border: 1px dashed var(--blue);
  background: rgba(0, 212, 255, .08);
}
.gc-detail-pin i { font-style: normal; cursor: pointer; margin-left: 4px; font-weight: 700; }
.gc-detail-pin i:hover { color: var(--palette-7, #FF4D6D); }
.gc-detail-kw {
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-primary); border-radius: 6px; padding: 4px 10px;
  font-size: 12px; min-width: 260px;
}
.gc-detail-kw:focus { outline: none; border-color: var(--blue); }

/* 明细表：10 列，横向可滚；表头吸顶 + 序号/单号两列吸左。
   必须用 table-layout:fixed —— 默认 auto 布局下浏览器会把长文本列
   压到「一个字符宽」，中文就竖着排下来了（科目列尤其明显）。
   fixed 布局按 th 宽度分配，再配合保底宽度，容器不够宽时整体横向滚。 */
.gc-detail-wrap { overflow: auto; max-height: 620px; }
.gc-detail {
  border-collapse: separate; border-spacing: 0;
  table-layout: fixed;
  width: 100%; min-width: 1340px;
  font-size: 11.5px; font-variant-numeric: tabular-nums;
}
.gc-detail th, .gc-detail td {
  padding: 6px 9px;
  border-bottom: 1px solid var(--border-soft);
  vertical-align: top;
  overflow-wrap: anywhere; word-break: break-word;
}
.gc-detail thead th {
  position: sticky; top: 0; z-index: 3;
  background: var(--bg-card); color: var(--text-tertiary);
  font-size: 10.5px; font-weight: 600; text-align: left;
  white-space: nowrap; border-bottom: 1px solid var(--border);
}
.gc-detail tbody td { background: transparent; }
.gc-detail .gc-dt-num { text-align: right; white-space: nowrap; }
.gc-detail .gc-dt-idx { text-align: center; color: var(--text-tertiary); }
.gc-detail .gc-dt-voucher {
  cursor: pointer; color: var(--blue); white-space: nowrap; font-weight: 600;
}
.gc-detail .gc-dt-voucher:hover { text-decoration: underline; }
.gc-detail .gc-dt-alloc { font-weight: 700; color: var(--text-primary); }

/* 前两列（序号 / 付款流程）吸左。背景必须不透明，否则横滚时下层文字会透出来。
   注意：一张单的多行分摊里，只有组首那行才有 idx/voucher 格，
   所以必须按**类名**定位，不能用 nth-child（第 2 行起第一个格是「科目」）。
   表头同理：只取第一行表头，第二行表头第 1 格是「金额」。 */
.gc-detail thead tr:first-child th:nth-child(1),
.gc-detail thead tr:first-child th:nth-child(2) { z-index: 4; }
.gc-detail tr.gc-dt-row td.gc-dt-idx {
  position: sticky; left: 0; background: var(--bg-card);
}
.gc-detail tr.gc-dt-row td.gc-dt-voucher {
  position: sticky; left: 44px; background: var(--bg-card);
  box-shadow: 1px 0 0 var(--border-soft);
}
.gc-detail tr.gc-dt-row:hover td.gc-dt-idx,
.gc-detail tr.gc-dt-row:hover td.gc-dt-voucher { background: var(--bg-card-2); }

/* 长文本列定高换行：宽度由 th 决定，这里只负责换行与行高 */
.gc-detail .gc-dt-subject,
.gc-detail .gc-dt-kemu,
.gc-detail .gc-dt-proj { white-space: normal; line-height: 1.5; }
.gc-detail .gc-dt-note {
  white-space: normal; line-height: 1.5; color: var(--text-secondary);
}

/* 组与组之间加一道分隔，让「一张单管几行分摊」一眼可数 */
.gc-detail tr.gc-dt-row td { border-top: 1px solid transparent; }
.gc-detail tr.gc-dt-row:first-child td { border-top: none; }

.gc-detail tr.gc-dt-total td {
  font-weight: 700; color: var(--text-primary);
  background: var(--bg-card-2);
  border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
}
.gc-detail .gc-dt-total-label { font-weight: 600; color: var(--text-secondary); }
.gc-detail .gc-dt-total-sub { font-weight: 500; color: var(--text-tertiary); white-space: nowrap; }

.gc-detail-foot {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 10px 16px; border-top: 1px solid var(--border-soft);
  font-size: 11.5px; color: var(--text-secondary);
}
.gc-detail-foot-left { display: flex; gap: 4px; flex-wrap: wrap; }
.gc-detail-foot-right { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.gc-detail-page { font-variant-numeric: tabular-nums; color: var(--text-tertiary); }
.gc-detail-sel {
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-secondary); border-radius: 6px; padding: 3px 6px; font-size: 11.5px;
}
.gc-detail-foot .filter-chip[disabled] { opacity: .35; cursor: default; }
.gc-detail-hint {
  padding: 34px 16px; text-align: center; color: var(--text-tertiary); font-size: 12.5px;
}
.gc-detail-err { color: var(--palette-7, #FF4D6D); }

/* ---------- 成本明细弹层（付款流程明细） ----------
   明细是「点开才看」的东西：1480 行、10 列，塞在页面下方会把汇总层挤成
   一条缝，而且看到一半会忘了自己在看哪个筛选条件。
   改成弹层后：全屏遮罩、独立滚动、可最大化，关掉即回到原处。
   层级 700 / 701 —— **刻意低于钻探抽屉**（800/801），
   这样在弹层里点单号看该单全部分摊时，抽屉能盖在它上面。 */
.gc-open-btn {
  cursor: pointer; font-weight: 600;
  background: var(--blue); color: #fff; border-color: transparent;
}
.gc-open-btn:hover { filter: brightness(1.08); }

.gc-modal { position: fixed; inset: 0; z-index: 700; visibility: hidden; }
.gc-modal.open { visibility: visible; }

.gc-modal-mask {
  position: fixed; inset: 0;
  background: var(--mask-bg); backdrop-filter: blur(2px);
  opacity: 0; transition: opacity .2s ease;
}
.gc-modal.open .gc-modal-mask { opacity: 1; }

/* 居中用 inset:0 + margin:auto，而不是 left:50% + translate(-50%) ——
   后者在「最大化 = 100vw」时会因为 100vw 含垂直滚动条宽度而偏掉 7~8px
   （视口内容宽 1265 的 50% 减去 1280 的一半 = -7.5）。 */
.gc-modal-box {
  position: fixed; inset: 0; margin: auto; z-index: 1;
  width: min(1560px, 97vw); height: min(88vh, 940px);
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); box-shadow: var(--mask-shadow);
  display: flex; flex-direction: column; overflow: hidden;
  opacity: 0; transform: translateY(-8px);
  transition: opacity .18s ease, transform .22s cubic-bezier(.4, 0, .2, 1);
}
.gc-modal.open .gc-modal-box { opacity: 1; transform: none; }
/* 最大化：10 列宽表在 1280 屏上仍会横向滚，给一个「铺满」的出口 */
.gc-modal.open .gc-modal-box.max {
  width: 100%; height: 100%; border-radius: 0; border: none;
}

.gc-modal-head {
  display: flex; align-items: center; gap: 12px; flex: 0 0 auto;
  padding: 12px 16px; border-bottom: 1px solid var(--border);
}
.gc-modal-head h3 { font-size: 13.5px; font-weight: 600; }
.gc-modal-meta { font-size: 11px; color: var(--text-tertiary); }
.gc-modal-sorts { display: flex; gap: 6px; margin-left: 6px; }
.gc-modal-tools { margin-left: auto; display: flex; gap: 6px; }

.gc-modal-icon {
  background: transparent; border: 1px solid var(--border); color: var(--text-secondary);
  width: 28px; height: 28px; border-radius: var(--radius-sm);
  cursor: pointer; font-size: 12px; line-height: 1;
}
.gc-modal-icon:hover { color: var(--blue); border-color: var(--blue); }

/* 弹层内部：筛选条与页脚固定，只有表体滚 —— 表头吸顶与吸左列才成立 */
.gc-modal .gc-detail-bar { flex: 0 0 auto; }
.gc-modal .gc-detail-foot { flex: 0 0 auto; }
.gc-modal .gc-detail-wrap {
  flex: 1 1 auto; min-height: 0; max-height: none;
  overscroll-behavior: contain;
}

/* ============================================================
 * 绿电 · 投资回报分析（gd-project-ops）
 * 三段：核心指标·回本 / 总成本构成 / 消费数据
 * 样式沿用全站变量（--bg-card / --border / --radius / --palette-*）。
 * ============================================================ */

/* ---- 外壳 + 头部 ---- */
.pjg-shell { margin-bottom: 16px; }
.pjg-head {
  display: flex; justify-content: space-between; align-items: baseline;
  flex-wrap: wrap; gap: 8px; margin-bottom: 14px;
}
.pjg-title { font-size: 15px; font-weight: 700; color: var(--text-primary); }
.pjg-sub { font-size: 11px; color: var(--text-tertiary); }
.pjg-sub b { color: var(--text-secondary); font-weight: 600; }

/* ---- 筛选栏 ---- */
.pjg-filter {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 14px;
  margin-bottom: 14px;
}
.pjg-field { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.pjg-field > label {
  font-size: 11px; font-weight: 600; color: var(--text-secondary);
}
.pjg-field-grow { flex: 1 1 220px; }
.pjg-field-reset { justify-content: flex-end; }

.pjg-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.pjg-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 5px 12px; border-radius: 14px;
  font-size: 12px; cursor: pointer; white-space: nowrap;
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-secondary); transition: all .15s ease;
}
.pjg-chip small { color: var(--text-tertiary); font-size: 11px; }
.pjg-chip:hover { border-color: var(--blue); color: var(--blue); }
.pjg-chip.active {
  background: var(--blue); border-color: var(--blue); color: #fff;
}
.pjg-chip.active small { color: rgba(255, 255, 255, .8); }

.pjg-select, .pjg-input {
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-primary); border-radius: 6px; padding: 6px 10px;
  font-size: 12px; min-width: 180px;
}
.pjg-input { min-width: 220px; }
.pjg-select:focus, .pjg-input:focus { outline: none; border-color: var(--blue); }

.pjg-reset {
  cursor: pointer; font-weight: 600; font-size: 12px;
  background: var(--blue); color: #fff; border: 1px solid transparent;
  border-radius: 6px; padding: 7px 16px; transition: filter .15s ease;
}
.pjg-reset:hover { filter: brightness(1.08); }

/* ---- 板块切换器（segmented） ---- */
.pjg-seg {
  display: inline-flex; flex-wrap: wrap; gap: 2px;
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  border-radius: 10px; padding: 3px; margin-bottom: 14px;
}
.pjg-seg-btn {
  border: none; background: transparent; color: var(--text-secondary);
  font-size: 12px; font-weight: 600; padding: 7px 14px;
  border-radius: 8px; cursor: pointer; transition: all .15s ease; white-space: nowrap;
}
.pjg-seg-btn:hover { color: var(--text-primary); }
.pjg-seg-btn.active {
  background: var(--blue); color: #fff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .18);
}

.pjg-result { font-size: 11px; color: var(--text-tertiary); margin-bottom: 10px; }
.pjg-result b { color: var(--text-secondary); }

/* ---- 口径提示条 ---- */
.pjg-note {
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  border-left: 3px solid var(--blue); border-radius: var(--radius-sm);
  padding: 10px 14px; font-size: 11.5px; line-height: 1.65;
  color: var(--text-secondary); margin-bottom: 16px;
}
.pjg-note b { color: var(--text-primary); }
.pjg-formula {
  cursor: help; color: var(--text-tertiary); margin-left: 4px;
  font-size: 11px; border-bottom: 1px dotted var(--text-tertiary);
}
.pjg-formula:hover { color: var(--blue); border-color: var(--blue); }

/* ---- 小标题 / 双列 ---- */
.pjg-subhead {
  font-size: 13px; font-weight: 700; color: var(--text-primary);
  padding-left: 10px; border-left: 3px solid var(--blue);
  margin: 4px 0 12px;
}
.pjg-two-col {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px;
}

/* ---- 表 ---- */
.pjg-table-wrap { overflow-x: auto; }
.pjg-table th.pjg-th {
  cursor: pointer; user-select: none; white-space: nowrap;
}
.pjg-table th.pjg-th:hover { color: var(--blue); }
.pjg-table tr.pjg-unrecovered td { color: var(--text-secondary); }
.pjg-table tr.pjg-unrecovered { background: rgba(255, 77, 109, .045); }
.pjg-table tr.pjg-unrecovered:hover { background: rgba(255, 77, 109, .09); }

/* ---- 回本排行（自绘进度条） ---- */
.pjg-rank-list { display: flex; flex-direction: column; gap: 5px; }
.pjg-rank-row {
  display: grid; grid-template-columns: minmax(140px, 1.5fr) 1fr 52px auto;
  align-items: center; gap: 10px; padding: 5px 8px;
  border-radius: 5px; font-size: 12px; transition: background .12s ease;
}
.pjg-rank-row:hover { background: var(--bg-card-2); }
.pjg-rank-name {
  font-weight: 500; color: var(--text-primary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pjg-rank-meta { font-size: 10px; color: var(--text-tertiary); margin-left: 6px; font-weight: 400; }
.pjg-rank-bar { height: 8px; border-radius: 4px; background: var(--bg-card-2); overflow: hidden; }
.pjg-rank-bar span { display: block; height: 100%; border-radius: 4px; transition: width .3s ease; }
.pjg-rank-num { font-weight: 700; font-variant-numeric: tabular-nums; text-align: right; }
.pjg-rank-val { text-align: right; }

.pjg-tag {
  display: inline-block; padding: 2px 8px; border-radius: 10px;
  font-size: 11px; font-weight: 600; line-height: 1.5; white-space: nowrap;
}
.pjg-tag.ok { background: rgba(82, 196, 26, .15); color: var(--green); }
.pjg-tag.warn { background: rgba(250, 140, 22, .15); color: var(--orange); }

/* ---- 整体回本大进度条 ---- */
.pjg-progress-big { padding: 4px 2px; }
.pjg-progress-track {
  height: 14px; background: var(--bg-card-2);
  border-radius: 7px; overflow: hidden;
}
.pjg-progress-track span {
  display: block; height: 100%; border-radius: 7px; transition: width .35s ease;
}
.pjg-progress-meta {
  display: flex; flex-wrap: wrap; gap: 16px;
  margin-top: 8px; font-size: 12px; color: var(--text-secondary);
}
.pjg-progress-meta b { color: var(--text-primary); font-weight: 700; }

/* ---- 成本构成小圆点 ---- */
.pjg-dot {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-right: 6px; vertical-align: middle; flex: 0 0 auto;
}

@media (max-width: 1200px) {
  .kpi-row { grid-template-columns: repeat(2, 1fr); }
  .three-col { grid-template-columns: 1fr; }
  .stat-row { grid-template-columns: 80px 1fr 60px 40px; }
  .pjg-two-col { grid-template-columns: 1fr; }
  .pjg-rank-row { grid-template-columns: minmax(120px, 1.4fr) 1fr 48px; }
  .pjg-rank-val { display: none; }
}
@media (max-width: 640px) {
  .kpi-row { grid-template-columns: 1fr; }
  .monthly-bars { grid-template-columns: repeat(6, 1fr); }
  .pjg-filter { flex-direction: column; align-items: stretch; }
  .pjg-field-grow { flex-basis: auto; }
}

/* ============================================================
 * 督办工作管理（sv-manage）
 * ============================================================ */
.sv-wrap { padding: 4px 2px; }

.sv-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 4px; }
.sv-src { margin-left: auto; }
.sv-seg { display: inline-flex; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
.sv-seg button { background: transparent; border: none; color: var(--text-secondary); padding: 6px 12px; cursor: pointer; font-size: 13px; }
.sv-seg button + button { border-left: 1px solid var(--border); }
.sv-seg button.active { background: var(--blue); color: #fff; }

.sv-btn { background: var(--bg-card); border: 1px solid var(--border); color: var(--text-primary); padding: 7px 14px; border-radius: 8px; cursor: pointer; font-size: 13px; }
.sv-btn:hover { border-color: var(--blue); }
.sv-btn-primary { background: var(--blue); border-color: var(--blue); color: #fff; }
.sv-btn-primary:disabled { opacity: .6; cursor: default; }

.sv-input, .sv-select { background: var(--bg-card); border: 1px solid var(--border); color: var(--text-primary); border-radius: 8px; padding: 7px 10px; font-size: 13px; font-family: inherit; }
.sv-input:focus, .sv-select:focus { outline: none; border-color: var(--blue); }
.sv-input[type="search"] { min-width: 200px; }

.sv-mini { background: transparent; border: 1px solid var(--border); color: var(--text-secondary); padding: 3px 9px; border-radius: 6px; cursor: pointer; font-size: 12px; margin-right: 4px; }
.sv-mini:hover { border-color: var(--blue); color: var(--blue); }

/* 统计卡 */
.sv-stats { display: flex; gap: 12px; flex-wrap: wrap; margin: 14px 0; }
.sv-stat { min-width: 96px; padding: 10px 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-card); }
.sv-stat-n { font-size: 22px; font-weight: 700; }
.sv-stat-l { font-size: 12px; color: var(--text-secondary); margin-top: 2px; }
.sv-stat-done .sv-stat-n { color: var(--green); }
.sv-stat-doing .sv-stat-n { color: var(--blue); }
.sv-stat-blocked .sv-stat-n { color: var(--red); }
.sv-stat-none .sv-stat-n { color: var(--text-secondary); }

/* 表格 */
.sv-tablewrap { overflow: auto; border: 1px solid var(--border); border-radius: 10px; }
.sv-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.sv-table th, .sv-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
.sv-table th { position: sticky; top: 0; background: var(--bg-card); font-weight: 600; color: var(--text-secondary); white-space: nowrap; }
.sv-table tr:hover td { background: color-mix(in srgb, var(--blue) 6%, transparent); }
/* 可排序列表头 */
.sv-table th.sv-c-sort { cursor: pointer; user-select: none; }
.sv-table th.sv-c-sort:hover { color: var(--text-primary); }
.sv-sort { font-size: 11px; color: var(--blue); margin-left: 2px; }
/* 事项 / 跟进进展加宽 */
.sv-c-name { min-width: 280px; }
.sv-c-follow { min-width: 320px; max-width: 460px; }
.sv-c-ops { white-space: nowrap; }
.sv-link { color: var(--blue); text-decoration: none; }
.sv-link:hover { text-decoration: underline; }
/* 事项点击：去掉外链，改为可点开居中弹窗 */
.sv-name-link { color: var(--blue); cursor: pointer; }
.sv-name-link:hover { text-decoration: underline; }
/* 跟进进展：单行 ellipsis，可点开看完整进展 + 历史 */
.sv-follow { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 440px; line-height: 1.5; font-size: 12px; color: var(--text-secondary); cursor: pointer; }
.sv-follow:hover { color: var(--blue); }
.sv-follow .sv-muted { cursor: default; }
.sv-date { white-space: nowrap; color: var(--text-secondary); }
.sv-muted { color: var(--text-secondary); opacity: .6; }
.sv-empty-inline { text-align: center; color: var(--text-secondary); padding: 24px; }

/* 标签（进度 / 类别） */
.sv-tag { display: inline-block; padding: 2px 9px; border-radius: 999px; font-size: 11px; line-height: 1.6; border: 1px solid transparent; white-space: nowrap; }
.sv-tag-done { color: var(--green); background: color-mix(in srgb, var(--green) 15%, transparent); border-color: color-mix(in srgb, var(--green) 35%, transparent); }
.sv-tag-doing { color: var(--blue); background: color-mix(in srgb, var(--blue) 15%, transparent); border-color: color-mix(in srgb, var(--blue) 35%, transparent); }
.sv-tag-blocked { color: var(--red); background: color-mix(in srgb, var(--red) 15%, transparent); border-color: color-mix(in srgb, var(--red) 35%, transparent); }
.sv-tag-none { color: var(--text-secondary); background: color-mix(in srgb, var(--text-secondary) 12%, transparent); border-color: color-mix(in srgb, var(--text-secondary) 25%, transparent); }
.sv-tag-group { color: var(--blue); background: color-mix(in srgb, var(--blue) 15%, transparent); border-color: color-mix(in srgb, var(--blue) 35%, transparent); }
.sv-tag-reverse { color: var(--amber); background: color-mix(in srgb, var(--amber) 18%, transparent); border-color: color-mix(in srgb, var(--amber) 40%, transparent); }

/* 弹层：遮罩 z-index 低于钻探抽屉(800/801) */
.sv-mask { position: fixed; inset: 0; background: var(--mask-bg); backdrop-filter: blur(2px); z-index: 790; display: flex; align-items: center; justify-content: center; opacity: 0; pointer-events: none; transition: opacity .2s ease; }
.sv-mask.open { opacity: 1; pointer-events: auto; }
.sv-modal { width: min(560px, 92vw); max-height: 86vh; overflow: auto; background: var(--bg-card); border: 1px solid var(--border); border-radius: 14px; box-shadow: var(--mask-shadow); transform: translateY(8px); transition: transform .2s ease; }
.sv-mask.open .sv-modal { transform: translateY(0); }
/* 宽档弹层：给含多列表格的场景（如「预计本季度回款」明细）用，560px 会挤爆 */
.sv-modal.sv-modal-wide { width: min(880px, 94vw); }
/* 员工任务明细专用更宽档：8 列表格塞进 880px 一定要横向滚动 */
.sv-modal.sv-modal-epwide { width: min(1400px, 96vw); }

/* .sv-detail / .sv-detail-actions 系列（旧的只读详情网格 + 内联回复区）
   已随 detailIntro() 一起删除：2026-09-18 全库确认零引用，
   现役版面是下面的 .sv-report-*。 */
.sv-hist-body { border-top: 1px solid var(--border); padding-top: 12px; }
.sv-field-inline { flex: 0 0 auto; min-width: 180px; }

/* ============================================================
   员工维度（p-employee）
   ------------------------------------------------------------
   三条版式约定（2026-09-15 老向定，别改回去）：
   ① 切片一律是「一行可点的标签」，不是下拉框；
   ② KPI 卡必须有色调（--tone / --tone-bg / --tone-border 三件套，
      三套主题都定义了语义色对，所以直接引用即可，不要写死色值）；
   ③ 任务日期平铺成独立列 —— 单行 + nowrap，行高就不会被顶起来。
   ============================================================ */
.ep-block { padding:14px 24px 24px; border:1px solid var(--border); border-radius:14px; background:var(--bg-card); color:var(--text-primary); }
.ep-head { display:flex; justify-content:space-between; align-items:center; gap:20px; margin-bottom:20px; }
.ep-eyebrow,.ep-head p,.ep-foot { color:var(--text-tertiary); font-size:12px; line-height:1.8; }
.ep-head h2 { font-size:24px; margin:7px 0; }

/* —— 切片 —— */
.ep-slices { display:grid; gap:10px; margin-bottom:14px; }
.ep-slice { display:grid; grid-template-columns:104px 1fr; gap:12px; align-items:start; }
.ep-slice-label { font-size:12px; color:var(--text-secondary); padding-top:8px; display:flex; gap:6px; align-items:center; }
.ep-slice-label small { font-size:10px; color:var(--blue); }
.ep-chips { display:flex; flex-wrap:wrap; gap:8px; }
.ep-chip { display:inline-flex; align-items:center; gap:6px; padding:6px 12px; border:1px solid var(--border);
  border-radius:999px; background:var(--bg-panel); color:var(--text-secondary); font:inherit; font-size:12px;
  cursor:pointer; transition:border-color .15s ease, background .15s ease, color .15s ease; }
.ep-chip:hover { border-color:var(--blue-border); color:var(--text-primary); }
.ep-chip i { font-style:normal; font-size:11px; color:var(--text-tertiary); font-variant-numeric:tabular-nums; }
.ep-chip.is-active { border-color:var(--blue-border); background:var(--blue-bg); color:var(--text-primary); font-weight:600; }
.ep-chip.is-active i { color:var(--blue); }
.ep-chip-ok.is-active { border-color:var(--green-border); background:var(--green-bg); }
.ep-chip-ok.is-active i { color:var(--green); }
.ep-chip-warn.is-active { border-color:var(--orange-border); background:var(--orange-bg); }
.ep-chip-warn.is-active i { color:var(--orange); }
.ep-chip-danger.is-active { border-color:var(--red-border); background:var(--red-bg); }
.ep-chip-danger.is-active i { color:var(--red); }

/* 关键词那一条常驻（不随 paint 重建），重建会打断输入法 */
.ep-kwbar { display:flex; flex-wrap:wrap; align-items:center; gap:10px; margin-bottom:18px; }
.ep-kwbar .ep-slice-label { padding-top:0; }
.ep-search { flex:0 0 250px; box-sizing:border-box; padding:8px 12px; border:1px solid var(--border);
  border-radius:8px; background:var(--bg-panel); color:var(--text-primary); font:inherit; font-size:12px; }
.ep-search:focus { outline:none; border-color:var(--blue-border); }
.ep-kwbar-hint { font-size:11px; color:var(--text-tertiary); }

/* —— 彩色 KPI 卡：2026-09-15 整组取消（与「员工汇总分析表」重复），
   对应样式连同 .ep-tone-* 一起删掉，避免日后照抄回来。弹层内的
   .ep-modal-sum / .ep-modal-kpi 是独立的一套，保留在下面。 —— */

.ep-section-title { display:flex; align-items:center; justify-content:space-between; gap:12px; margin:24px 0 12px; }
.ep-section-title h3 { font-size:15px; margin:0; }
.ep-section-title>span { font-size:11px; color:var(--text-tertiary); }
.ep-count { color:var(--text-tertiary); font-size:11px; }
.ep-scroll { overflow:auto; border:1px solid var(--border); border-radius:9px; max-height:62vh; }
.ep-scroll-modal { max-height:58vh; }
.ep-loading { padding:34px; text-align:center; color:var(--text-tertiary); font-size:12px; }
.ep-empty { text-align:center !important; color:var(--text-tertiary); padding:26px !important; }

.ep-table { width:100%; border-collapse:separate; border-spacing:0; font-size:12px; }
.ep-table th,.ep-table td { padding:11px 12px; text-align:right; border-bottom:1px solid var(--border); line-height:1.6; }
.ep-table th { position:sticky; top:0; background:var(--bg-card); z-index:1; white-space:nowrap; font-weight:500; color:var(--text-secondary); }
.ep-table tbody tr:last-child td { border-bottom:0; }
.ep-table .ep-person { text-align:left; min-width:95px; }
.ep-table button { color:var(--blue); font:inherit; border:0; background:none; cursor:pointer; padding:0; }
.ep-table tbody tr:hover { background:var(--bg-panel); }
.ep-table .ep-risk { color:var(--red); font-weight:600; }

/* —— 任务明细：8 列平铺，日期各占一列且不换行 —— */
.ep-task-table { table-layout:fixed; }
.ep-task-table th,.ep-task-table td { text-align:left; vertical-align:top; white-space:normal; overflow-wrap:anywhere; }
.ep-task-table th { white-space:nowrap; }
/* 窄窗口仍可能横向滚动，把任务描述吸在左边，横滑时不丢上下文。
   只能用 :first-child / 类名选择器 —— 组首行才有的格用 nth-child 会错位。 */
.ep-task-table th:first-child,.ep-task-table td:first-child { position:sticky; left:0; z-index:2;
  background:var(--bg-card); box-shadow:1px 0 0 var(--border); }
.ep-task-table thead th:first-child { z-index:3; }
.ep-task-table tbody tr:hover td:first-child { background:var(--bg-panel); }
.ep-task-table a { color:var(--blue); text-decoration:none; }
.ep-task-table a:hover { text-decoration:underline; }
.ep-td-name { font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ep-td-name a { display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ep-date { white-space:nowrap !important; color:var(--text-secondary); font-variant-numeric:tabular-nums; }
.ep-date-danger { color:var(--red); font-weight:600; }
/* 最新进展：单行省略（点开才是完整内容 ＋ 变更流水）。
   必须用 `.ep-table .ep-note-btn` 双类选择器 —— 否则会被上面的
   `.ep-table button`（0,1,1 起）压过去，进展文字又变成链接蓝。 */
.ep-table .ep-note-btn { display:block; flex:1; min-width:0; overflow:hidden; white-space:nowrap;
  text-overflow:ellipsis; text-align:left; color:var(--text-secondary); font:inherit; font-size:12px;
  line-height:1.6; }
.ep-table .ep-note-btn.is-clamped { border-bottom:1px dashed var(--blue-border); }
.ep-table .ep-note-btn:hover { color:var(--text-primary); }
/* 最新进展单元格：横向 flex —— 前置「汇报」按钮，后接单行省略文本 */
.ep-note-row { display:flex; align-items:center; gap:8px; }
/* 行内「汇报」按钮：与最新进展并列，打开居中编辑弹窗 */
.ep-edit-btn { display:inline-flex; flex:0 0 auto; margin:0; padding:3px 10px; font-size:12px; color:var(--blue);
  background:color-mix(in srgb, var(--blue) 10%, transparent); border:1px solid var(--blue-border);
  border-radius:6px; cursor:pointer; white-space:nowrap; }
.ep-edit-btn:hover { background:color-mix(in srgb, var(--blue) 18%, transparent); }
.ep-edit-err { margin-top:10px; font-size:12px; color:var(--red); min-height:14px; }
/* 编辑弹窗的身份说明：写回用的是登录者本人身份，事前讲清楚，避免事后怀疑代写 */
.ep-edit-hint { margin-top:10px; font-size:11.5px; line-height:1.6; color:var(--text-tertiary); }
/* 编辑弹窗的身份状态行（本人 / 暂不能写回 / 写回成功） */
.ep-edit-identity { margin-top:8px; font-size:11.5px; line-height:1.6; color:var(--text-tertiary); }
/* 编辑弹窗内嵌的「全部字段修改历史」 */
.ep-edit-history { margin-top:14px; padding-top:12px; border-top:1px solid var(--border); }
.ep-edit-history h4 { margin:0 0 8px; font-size:12px; color:var(--text-secondary); }
.ep-history-list { max-height:240px; overflow:auto; }
.ep-history-status { margin-top:8px; font-size:11.5px; color:var(--text-tertiary); }
/* 最新进展字段标题旁的安全评论链接（复用 zt-receivable.buildReceivableCommentLink） */
.ep-note-heading { display:flex; align-items:center; justify-content:space-between; gap:10px; }
.ep-note-heading label { font-size:12px; color:var(--text-secondary); }
.ep-mute { color:var(--text-tertiary); }
.ep-hot { color:var(--blue); font-weight:600; }
.ep-hot::after { content:'•'; margin-left:4px; font-size:14px; line-height:0; }
.ep-status { display:inline-block; padding:2px 8px; border-radius:5px; border:1px solid var(--border);
  background:var(--bg-panel); color:var(--text-secondary); white-space:nowrap; }
.ep-status-ok { border-color:var(--green-border); background:var(--green-bg); color:var(--green); }
.ep-status-danger { border-color:var(--red-border); background:var(--red-bg); color:var(--red); }
.ep-status-warn { border-color:var(--orange-border); background:var(--orange-bg); color:var(--orange); }
.ep-status-doing { border-color:var(--blue-border); background:var(--blue-bg); color:var(--blue); }
.ep-badge { display:inline-block; margin-top:5px; margin-right:5px; padding:1px 7px; border-radius:5px; font-size:11px; white-space:nowrap; }
.ep-badge-danger { background:var(--red-bg); color:var(--red); border:1px solid var(--red-border); }
.ep-badge-warn { background:var(--orange-bg); color:var(--orange); border:1px solid var(--orange-border); }
.ep-badge-mute { background:var(--bg-panel); color:var(--text-tertiary); border:1px solid var(--border); }
.ep-td-note { color:var(--text-secondary); }
.ep-name { color:var(--blue); }
.ep-name:hover { text-decoration:underline; }
/* 汇总表的「任务总数」＝该员工任务明细入口，用虚下划线把可点性说出来 */
.ep-count-link { color:var(--blue); font-weight:600; font-variant-numeric:tabular-nums;
  text-decoration:underline; text-decoration-style:dotted; text-underline-offset:3px; }
.ep-count-link:hover { text-decoration-style:solid; }
.ep-note { white-space:pre-wrap; color:var(--text-secondary); margin-bottom:8px; }
/* 变更弹层里的「最新进展（完整内容）」：不再截断，保留换行 */
.ep-note-full { white-space:pre-wrap; color:var(--text-primary); font-size:12px; line-height:1.7;
  padding:9px 11px; border:1px solid var(--border); border-radius:7px; background:var(--bg-panel); }
.ep-foot { margin:18px 0 0; }

/* —— 员工明细弹层 —— */
.ep-modal-sum { display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); gap:10px; }
.ep-modal-kpi { border:1px solid var(--border); border-radius:10px; padding:11px 13px; background:var(--bg-panel); }
.ep-modal-kpi span { display:block; font-size:11px; color:var(--text-tertiary); }
.ep-modal-kpi strong { display:block; margin-top:6px; font-size:20px; color:var(--text-primary); font-variant-numeric:tabular-nums; }
.ep-modal-kpi.is-danger strong { color:var(--red); }
.ep-modal-note { margin:10px 0 12px; font-size:11px; color:var(--text-tertiary); }
.ep-modal-intro { margin-bottom:14px; }
.ep-modal-intro h4 { margin:10px 0 6px; font-size:12px; color:var(--text-secondary); }
.ep-modal-meta { display:flex; flex-wrap:wrap; align-items:center; gap:8px; font-size:11px; color:var(--text-secondary); }
.ep-modal-meta>span { padding:2px 9px; border:1px solid var(--border); border-radius:5px; background:var(--bg-panel); }
.ep-modal-meta .ep-badge { margin:0; }

@media(max-width:1100px) {
  .ep-modal-sum { grid-template-columns:repeat(3,minmax(0,1fr)); }
  .ep-slice { grid-template-columns:1fr; gap:6px; }
  .ep-slice-label { padding-top:0; }
  .ep-block { padding:12px 16px 16px; }
}

/* 财务主题分析：独立分段导航，适配全站主题，不使用浏览器默认按钮。 */
.gdf-bar { margin:0 0 20px; padding:7px; border:1px solid var(--border); border-radius:16px; background:var(--bg-card); }
.fc2 { --fc-accent:var(--blue); color:var(--text-primary); }
.fc2[data-stage="1"] { --fc-accent:#7756bc; } .fc2[data-stage="2"] { --fc-accent:#087d82; } .fc2[data-stage="3"] { --fc-accent:#267f47; } .fc2[data-stage="4"] { --fc-accent:#b66b18; } .fc2[data-stage="5"] { --fc-accent:#b44e65; } .fc2[data-stage="6"] { --fc-accent:#526db8; }
.fc2-head,.fc2-actions,.fc2-foot { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:10px; }
.fc2-head h2 { margin:5px 0 12px; font-size:21px; } .fc2-head small,.fc2 p,.fc2 small { color:var(--text-secondary); }
.fc2-tabs { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:6px; margin:12px 0; }
.fc2 button,.fc2 input,.fc2 select { font:inherit; font-size:12px; border:1px solid var(--border); border-radius:6px; padding:6px 9px; background:var(--bg-panel); color:var(--text-primary); }
.fc2 button { cursor:pointer; } .fc2 button:disabled { opacity:.5; cursor:default; } .fc2 button:focus-visible { outline:2px solid var(--fc-accent); }
.fc2-tabs button { text-align:left; padding:10px; } .fc2-tabs b { display:block; font-size:11px; margin-bottom:5px; opacity:.7; }
.fc2-tabs button[aria-current="step"],.fc2 .fc2-primary { background:var(--fc-accent); color:#fff; border-color:var(--fc-accent); }
.fc2-scope { padding:10px 12px; border-left:3px solid var(--fc-accent); background:var(--bg-panel); font-size:12px; line-height:1.6; }
.fc2-card { padding:14px 16px; margin:12px 0; border:1px solid var(--border); border-top:3px solid var(--fc-accent); border-radius:9px; background:var(--bg-panel); }
.fc2-card h3 { font-size:14px; margin:0 0 12px; } .fc2 p { font-size:12px; line-height:1.7; } .fc2-fields { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px 16px; }
.fc2-fields label { font-size:12px; display:grid; grid-template-columns:1fr auto; gap:5px; } .fc2-fields small { font-size:10px; } .fc2-fields input,.fc2-fields select { width:100%; min-width:0; box-sizing:border-box; grid-column:1/-1; height:31px; }
.fc2-actions { justify-content:flex-start; } .fc2-actions label { font-size:12px; display:flex; align-items:center; gap:8px; } .fc2-actions input[type="number"] { width:65px; }
.fc2-scroll { overflow:auto; } .fc2 table { width:100%; border-collapse:collapse; font-size:12px; white-space:nowrap; } .fc2 th,.fc2 td { text-align:right; padding:8px 10px; border-bottom:1px solid var(--border); } .fc2 th:first-child,.fc2 td:first-child { text-align:left; } .fc2 th { color:var(--text-secondary); font-weight:500; }
.fc2-kpis { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; margin-top:12px; } .fc2-kpis article { padding:14px; border:1px solid var(--border); border-top:3px solid var(--fc-accent); border-radius:9px; background:var(--bg-panel); } .fc2-kpis strong { display:block; font-size:22px; margin:8px 0; } .fc2-kpis span { font-size:11px; color:var(--text-secondary); }
.fc2-columns { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; } .fc2-foot { border-top:1px solid var(--border); margin-top:16px; padding:12px 0; font-size:12px; } .fc2-error { color:var(--red); } .fc2 [data-status] { overflow-wrap:anywhere; }
@media(max-width:1000px) { .fc2-fields { grid-template-columns:repeat(3,minmax(0,1fr)); } .fc2-tabs { grid-template-columns:repeat(4,minmax(0,1fr)); } }
@media(max-width:650px) { .fc2-fields,.fc2-kpis { grid-template-columns:repeat(2,minmax(0,1fr)); } .fc2-columns { grid-template-columns:1fr; } }

.parking-tabs { display:flex; gap:8px; padding:6px; margin-bottom:16px; border:1px solid var(--border); border-radius:12px; background:var(--bg-panel); }
.parking-tabs button { flex:1; padding:12px 16px; border:1px solid transparent; border-radius:8px; background:transparent; color:var(--text-secondary); font:inherit; cursor:pointer; }
.parking-tabs button[aria-selected="true"] { background:var(--blue-bg); border-color:var(--blue-border); color:var(--blue); font-weight:650; }
.parking-tabs button:focus-visible { outline:2px solid var(--blue); outline-offset:2px; }
.parking-workspace [role="tabpanel"][hidden] { display:none; }
.parking-embed-tools { display:flex; justify-content:space-between; align-items:center; gap:16px; flex-wrap:wrap; padding:14px 18px; border:1px solid var(--border); border-radius:12px 12px 0 0; background:var(--bg-panel); color:var(--text-primary); }
.parking-embed-tools p { margin:6px 0 0; font-size:12px; color:var(--text-secondary); }
.parking-embed-tools > div:last-child { display:flex; gap:12px; align-items:center; flex-wrap:wrap; }
.parking-ops-frame { display:block; width:100%; height:calc(100vh - 270px); min-height:560px; border:1px solid var(--border); border-top:0; border-radius:0 0 12px 12px; background:var(--bg-panel); }
@media(max-width:800px) { .parking-tabs button { padding:10px 6px; font-size:13px; } .parking-ops-frame { min-height:480px; } }

.gdf-subtabs { display:flex; align-items:center; gap:6px; overflow-x:auto; scrollbar-width:thin; padding:2px; }
.gdf-subtabs .gdf-subtab { appearance:none; flex:1 0 auto; display:flex; align-items:center; justify-content:center; gap:9px; min-height:46px; padding:12px 22px; border:1px solid transparent; border-radius:11px; background:transparent; color:var(--text-secondary); font-family:inherit; font-size:14px; font-weight:500; line-height:1.4; white-space:nowrap; cursor:pointer; transition:background .18s,color .18s,border-color .18s,box-shadow .18s; }
.gdf-subtabs .gdf-subtab:hover { background:var(--bg-panel); color:var(--text-primary); }
.gdf-subtabs .gdf-subtab.active { background:var(--blue-bg); border-color:var(--blue-border); color:var(--blue); font-weight:650; box-shadow:0 2px 7px color-mix(in srgb,var(--blue) 12%,transparent); }
.gdf-subtabs .gdf-subtab::before { content:''; width:6px; height:6px; border-radius:50%; background:currentColor; opacity:.3; flex:none; }
.gdf-subtabs .gdf-subtab.active::before { opacity:1; box-shadow:0 0 0 3px color-mix(in srgb,var(--blue) 12%,transparent); }
.gdf-subtabs .gdf-subtab:focus-visible { outline:2px solid var(--blue); outline-offset:1px; }
.gdf-meta:empty { display:none; }
@media(max-width:800px) { .gdf-bar { border-radius:13px; padding:5px; margin-bottom:16px; } .gdf-subtabs .gdf-subtab { flex:0 0 auto; min-height:44px; padding:11px 16px; font-size:13px; } }

.sv-modal-payable { position:fixed; inset:0; margin:auto; width:min(1500px,96vw); max-width:96vw; height:fit-content; max-height:92vh; }
.sv-modal-payable .sv-modal-body { min-height:0; overflow:auto; }
.pay-detail-intro { color:var(--text-secondary); font-size:12px; line-height:1.8; }
.pay-detail-total { padding:16px; background:var(--bg-card); border:1px solid var(--border); border-radius:10px; font-weight:600; line-height:1.9; }
.pay-detail-search { display:flex; align-items:center; gap:14px; }
.pay-detail-search input { width:min(480px,70%); padding:10px 14px; border:1px solid var(--border); border-radius:8px; background:var(--bg-card); color:var(--text-primary); }
.pay-detail-count { color:var(--text-secondary); font-size:12px; line-height:1.8; }
.pay-detail-scroll { overflow:auto; max-height:55vh; border:1px solid var(--border); border-radius:8px; }
.pay-detail-table { border-collapse:separate; border-spacing:0; width:100%; min-width:1120px; font-size:12px; }
.pay-detail-table th { position:sticky; top:0; z-index:1; background:var(--bg-card); text-align:left; white-space:normal; }
.pay-detail-table td,.pay-detail-table th { padding:8px 5px; border-bottom:1px solid var(--border); color:var(--text-primary); vertical-align:top; }
.pay-detail-table td { max-width:160px; overflow-wrap:anywhere; }
.pay-detail-table td:nth-child(2) { min-width:110px; }
.pay-detail-table .pay-detail-money { white-space:nowrap; text-align:right; font-variant-numeric:tabular-nums; }
.pay-detail-table td:last-child { min-width:58px; white-space:nowrap; }

/* 应收明细专属版式：不复用客户榜 nowrap 单元格，长合同名必须在列内换行。 */
.sv-modal.ar-detail-modal { width: min(1480px, calc(100vw - 48px)); max-width: none; max-height: 92vh; border-radius: 16px; }
.ar-detail-modal .sv-modal-head { padding: 20px 24px; gap: 20px; }
.ar-detail-modal .sv-modal-head h3 { min-width: 0; overflow-wrap: anywhere; line-height: 1.5; }
.ar-detail-modal .sv-modal-close { flex-shrink: 0; }
.ar-detail-modal .sv-modal-body { padding: 22px 24px 14px; }
.ar-detail-summary { display: flex; justify-content: space-between; align-items: center; gap: 24px; padding: 20px 24px; margin-bottom: 22px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg-secondary, var(--bg-card)); }
.ar-detail-eyebrow { display: block; font-size: 12px; color: var(--text-secondary); margin-bottom: 8px; }
.ar-detail-summary strong { display: block; font-size: 28px; color: var(--blue); font-variant-numeric: tabular-nums; letter-spacing: -.6px; }
.ar-detail-summary strong small { margin-left: 8px; font-size: 12px; font-weight: 400; color: var(--text-tertiary); }
.ar-detail-scope { display: grid; gap: 8px; text-align: right; color: var(--text-secondary); font-size: 12px; overflow-wrap: anywhere; }
.ar-detail-scope i { padding: 0 8px; font-style: normal; color: var(--text-tertiary); }
.ar-detail-scroll { overflow: auto; max-height: 57vh; border: 1px solid var(--border); border-radius: 10px; scrollbar-gutter: stable; }
.ar-detail-table { width: 100%; min-width: 1120px; table-layout: fixed; border-collapse: separate; border-spacing: 0; font-size: 12px; color: var(--text-primary); }
.ar-detail-table th, .ar-detail-table td { box-sizing: border-box; padding: 17px 14px; text-align: left; vertical-align: top; white-space: normal; overflow-wrap: anywhere; line-height: 1.75; border-bottom: 1px solid var(--border); }
.ar-detail-table th { position: sticky; top: 0; z-index: 1; background: var(--bg-card); color: var(--text-secondary); font-size: 11px; font-weight: 600; padding-top: 13px; padding-bottom: 13px; }
.ar-detail-table tbody tr:last-child td { border-bottom: 0; }
.ar-detail-table tbody tr:hover td { background: var(--bg-secondary, var(--bg-card)); }
.ar-detail-customer { font-weight: 600; margin-bottom: 7px; }
.ar-detail-contract { color: var(--text-secondary); }
.ar-detail-table .ar-detail-num { text-align: right; white-space: nowrap; overflow-wrap: normal; font-variant-numeric: tabular-nums; }
.ar-detail-table .ar-detail-amount { color: var(--blue); font-weight: 700; font-size: 13px; }
.ar-detail-secondary { color: var(--text-tertiary); margin-top: 6px; }
.ar-detail-tag { display: inline-block; padding: 3px 9px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg-secondary, var(--bg-card)); font-size: 11px; }
.ar-detail-note { white-space: pre-wrap; overflow-wrap: anywhere; padding: 10px 12px; border-radius: 8px; background: var(--bg-secondary, var(--bg-card)); border: 1px solid var(--border); }
.ar-detail-note.is-empty { color: var(--text-tertiary); }
.ar-detail-table .ar-detail-note { display: block; width: 100%; text-align: left; font: inherit; color: var(--text-primary); cursor: pointer; }
.ar-detail-table .ar-detail-note.is-empty { color: var(--text-tertiary); }
.ar-detail-table .ar-detail-note:hover:not(:disabled), .ar-detail-table .ar-detail-note:focus-visible { border-color: var(--blue); outline: 2px solid var(--blue); outline-offset: 2px; }
.ar-detail-table .ar-detail-note:disabled { cursor: default; opacity: .65; }
.ar-note-form textarea { width: 100%; box-sizing: border-box; resize: vertical; min-height: 150px; line-height: 1.7; }
.ar-note-identity { color: var(--text-secondary); font-size: 12px; line-height: 1.7; }
.ar-note-error { color: var(--red); font-size: 12px; line-height: 1.7; }
.ar-note-error:empty { display: none; }
.ar-edit-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 18px; }
.ar-edit-fields .sv-input, .ar-edit-fields .sv-select { min-width: 0; width: 100%; box-sizing: border-box; }
.ar-edit-full { grid-column: 1 / -1; }
.ar-note-heading { display: flex; align-items: center; gap: 14px; color: var(--text-secondary); }
/* 百分比字段（数科「完成进度」）：滑块 + 数字框同步，飞书里存 0～1。
   颜色一律走主题变量，别写死色值（浅色主题会变黑块）。 */
.ar-percent { display: flex; align-items: center; gap: 12px; }
.ar-percent-range { flex: 1 1 auto; min-width: 0; height: 22px; accent-color: var(--green); cursor: pointer; }
.ar-percent-input { position: relative; flex: 0 0 auto; display: inline-flex; align-items: center; }
.ar-percent-input .sv-input { width: 92px; padding-right: 26px; text-align: right; font-variant-numeric: tabular-nums; }
.ar-percent-input i { position: absolute; right: 9px; font-style: normal; color: var(--text-tertiary); font-size: 12px; pointer-events: none; }
.ar-percent + small { color: var(--text-tertiary); font-size: 11px; }
.ar-edit-fields small { color: var(--text-tertiary); font-size: 11px; line-height: 1.5; }
.ar-comment-link { display: inline-flex; align-items: center; gap: 4px; color: var(--blue); font-size: 12px; text-decoration: none; white-space: nowrap; }
.ar-comment-link:hover { text-decoration: underline; }
.ar-comment-link:focus-visible { outline: 2px solid var(--blue); outline-offset: 3px; }
.ar-edit-history { margin-top: 24px; padding-top: 18px; border-top: 1px solid var(--border); }
.ar-edit-history h4 { margin: 0 0 14px; color: var(--text-primary); }
.ar-history-status { color: var(--text-secondary); font-size: 12px; margin: 12px 0; }
.ar-note-success { color: var(--blue); font-size: 12px; }
.ar-note-success:empty { display: none; }
@media (max-width: 600px) { .ar-edit-fields { grid-template-columns: minmax(0, 1fr); } }
.ar-detail-updated { margin-top: 9px; color: var(--text-tertiary); font-size: 10px; }
.ar-detail-history { border: 0; background: transparent; color: var(--blue); padding: 4px 0; font: inherit; cursor: pointer; text-underline-offset: 4px; }
.ar-detail-history:hover { text-decoration: underline; }
.ar-detail-history:focus-visible { outline: 2px solid var(--blue); outline-offset: 3px; }
.ar-detail-foot { margin: 14px 0 0; color: var(--text-tertiary); font-size: 11px; line-height: 1.7; }
@media (max-width: 760px) {
  .sv-modal.ar-detail-modal { width: calc(100vw - 20px); max-height: 95vh; }
  .ar-detail-modal .sv-modal-head, .ar-detail-modal .sv-modal-body { padding: 14px; }
  .ar-detail-summary { padding: 14px; gap: 12px; align-items: flex-start; flex-direction: column; }
  .ar-detail-summary strong { font-size: 24px; }
  .ar-detail-scope { text-align: left; }
}
.sv-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px; border-bottom: 1px solid var(--border); position: sticky; top: 0; background: var(--bg-card); }
.sv-modal-head h3 { margin: 0; font-size: 15px; }
.sv-modal-close { background: transparent; border: 1px solid var(--border); color: var(--text-secondary); width: 28px; height: 28px; border-radius: 8px; cursor: pointer; }
.sv-modal-close:hover { color: var(--red); border-color: var(--red); }
.sv-modal-body { padding: 18px; }

/* 表单 */
.sv-form { display: flex; flex-direction: column; gap: 14px; }
.sv-field { display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
.sv-field > span { color: var(--text-secondary); }
.sv-field i { color: var(--red); font-style: normal; }
.sv-form-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 4px; }

/* ============================================================
   员工维度 · 新增任务弹层（schema 驱动表单）
   全部复用上面的 sv-* 语义令牌，颜色走主题变量，禁止写死色值
   ============================================================ */
/* 标题行：标题与「新增任务」主按钮并排 */
.ep-title-row { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.fc-invest{max-width:1480px;margin:auto;color:var(--text-primary);padding:14px 0 40px}.fc-invest *{box-sizing:border-box}.fc-invest header,.fc-actions{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}.fc-invest h2{font-size:26px;margin:8px 0}.fc-invest h3{font-size:16px;margin:0 0 18px}.fc-invest p,.fc-invest li{font-size:12px;line-height:1.9;color:var(--text-secondary)}.fc-eyebrow,.fc-badge{font-size:12px;color:var(--text-secondary)}.fc-notice{padding:16px 20px;background:var(--bg-card-2);border-left:3px solid var(--primary);font-size:12px;line-height:1.9;margin:16px 0}.fc-card{border:1px solid var(--border-soft);border-radius:12px;padding:22px;background:var(--bg-card);margin:18px 0}.fc-fields{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px;padding:20px 0}.fc-invest label{display:flex;flex-direction:column;gap:7px;font-size:12px;color:var(--text-secondary)}.fc-invest input,.fc-invest button{font:inherit;color:var(--text-primary);background:var(--bg-card);border:1px solid var(--border-soft);border-radius:7px;padding:10px;min-width:0}.fc-invest button{cursor:pointer}.fc-invest button:disabled{opacity:.5;cursor:wait}.fc-invest .fc-primary{background:var(--blue);color:#fff}.fc-group{border-top:1px solid var(--border-soft);padding:16px 0}.fc-group summary{cursor:pointer;font-size:14px;font-weight:600}.fc-group summary span{margin-left:15px;font-weight:400;color:var(--text-secondary);font-size:12px}.fc-actions{justify-content:flex-start;margin:12px 0}.fc-doc-input{flex:1;min-width:240px!important}.fc-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}.fc-kpis>div{background:var(--bg-card);border:1px solid var(--border-soft);border-top:3px solid var(--blue);padding:20px;border-radius:10px}.fc-kpis small,.fc-kpis span{display:block;color:var(--text-secondary);font-size:12px}.fc-kpis strong{display:block;font-size:30px;margin:12px 0}.fc-two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.fc-two>.fc-card{margin-top:0}.fc-scroll{overflow:auto}.fc-invest table{border-collapse:collapse;width:100%;font-size:12px}.fc-invest td,.fc-invest th{padding:11px 9px;border-bottom:1px solid var(--border-soft);text-align:right;white-space:nowrap}.fc-invest td:first-child,.fc-invest th:first-child{text-align:left}.fc-invest th{color:var(--text-secondary);background:var(--bg-card-2);font-weight:500}.fc-warnings{border-left:3px solid var(--primary)}@media(max-width:1000px){.fc-fields,.fc-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.fc-two{grid-template-columns:minmax(0,1fr)}}@media(max-width:600px){.fc-fields,.fc-kpis{grid-template-columns:minmax(0,1fr)}}
.ep-create-btn { white-space: nowrap; }
.ep-create-fields:not([hidden]) { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 20px; }
.ep-create-fields .sv-field { min-width: 0; }
.ep-create-fields textarea { min-height: 80px; resize: vertical; }
@media (max-width: 640px) { .ep-create-fields:not([hidden]) { grid-template-columns: minmax(0, 1fr); } }

/* 加载 / 错误 / 提示 三态 */
.ep-create-loading { color: var(--text-tertiary); font-size: 13px; padding: 6px 0; }
.ep-create-loading:empty { display: none; }
.ep-create-err { color: var(--red); font-size: 12.5px; line-height: 1.6; margin: 4px 0 2px; overflow-wrap: anywhere; }
.ep-create-err:empty { display: none; }

/* 默认提示（原表未公开默认值明确提示） */
.ep-create-hint {
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-card-2); color: var(--text-secondary);
  padding: 9px 12px; font-size: 12px; line-height: 1.7; margin-bottom: 2px;
}

/* 不支持字段说明 */
.ep-create-unsupported {
  border: 1px solid var(--orange-border); border-radius: var(--radius-sm);
  background: var(--orange-bg); padding: 10px 14px; margin-top: 4px;
}
.ep-create-unsupported h4 { margin: 0 0 6px; font-size: 12.5px; color: var(--text-primary); font-weight: 600; }
.ep-create-unsupported ul { margin: 0; padding-left: 18px; }
.ep-create-unsupported li { font-size: 12px; color: var(--text-secondary); line-height: 1.7; }
.ep-create-unsupported b { color: var(--text-primary); }

/* 多选 check 组（multiselect / 多人员） */
.ep-checks { display: flex; flex-wrap: wrap; gap: 8px 14px; padding: 4px 0; }
.ep-check { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--text-primary); cursor: pointer; }
.ep-check input { accent-color: var(--blue); width: 15px; height: 15px; }
/* 单 checkbox（布尔字段） */
.sv-check { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-primary); cursor: pointer; }
.sv-check input { accent-color: var(--blue); width: 16px; height: 16px; }

.ep-create-retry { margin-top: 6px; }

@media (max-width: 760px) {
  .ep-title-row { gap: 10px; }
  .ep-checks { gap: 6px 12px; }
}

/* 弹层标题：长记录名下沉成副标题，别把弹层头撑成两行 */
.sv-modal-titles { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.sv-modal-sub {
  margin: 0; max-width: 62ch;
  color: var(--text-secondary); font-size: 12px; line-height: 1.5;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ---- 督办「汇报进展」弹层（2026-09-18 精修） ---- */
/* 顶部事项卡：事项原文只在这里出现一次（弹层头不再重复） */
.sv-report-hero {
  padding: 13px 15px;
  border: 1px solid var(--border-soft); border-radius: var(--radius);
  background: var(--bg-card-2);
  margin-bottom: 16px;
}
.sv-report-hero-name {
  margin: 0; color: var(--text-primary);
  font-size: 14px; font-weight: 600; line-height: 1.7;
  overflow-wrap: anywhere;
}
.sv-report-hero-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px;
  margin-top: 9px; color: var(--text-tertiary); font-size: 12px;
}
.sv-report-hero-link { color: var(--blue); text-decoration: none; font-size: 12px; }
.sv-report-hero-link:hover { text-decoration: underline; }

/* 可编辑字段：三列等宽（原先两列只填一格，右边空一块） */
.sv-report-fields {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px; margin-bottom: 14px;
}
.sv-report-follow { margin-bottom: 16px; }
.sv-report-follow .sv-input { min-height: 92px; resize: vertical; line-height: 1.7; }

/* 动作区：完成进度靠左、按钮靠右，错误提示独占一行 */
.sv-report-actions {
  padding: 13px 15px; margin-bottom: 18px;
  border: 1px solid var(--border-soft); border-radius: var(--radius);
  background: var(--bg-card-2);
}
.sv-report-actions-row { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.sv-report-actions-row .sv-field-inline { min-width: 220px; }
.sv-report-actions-btns { display: flex; align-items: center; gap: 10px; }
.sv-report-err { color: var(--red); font-size: 12px; line-height: 1.6; margin-top: 8px; overflow-wrap: anywhere; }
.sv-report-err:empty { display: none; }

/* 更新记录区 */
.sv-report-hist { border-top: 1px solid var(--border-soft); padding-top: 14px; }
.sv-report-hist-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.sv-report-hist-head h4 { margin: 0; font-size: 13px; font-weight: 600; color: var(--text-primary); }
.sv-report-hist-hint { color: var(--text-tertiary); font-size: 11px; }
/* 外层已经有分隔线，这里不要再画一次（openHistoryModal 的 intro 版仍需自带） */
.sv-hist-body-plain { border-top: 0; padding-top: 0; }

/* 列表「跟进进展」列：按钮浮在文本左侧，文本溢出不换行 */
.sv-table .sv-c-follow > .sv-mini { float: left; margin: 0 10px 0 0; }
.sv-table .sv-c-follow > .sv-follow { display: block; overflow: hidden; }

@media (max-width: 760px) {
  .sv-report-fields { grid-template-columns: minmax(0, 1fr); }
}

/* ---- 飞书变更时间线（通用，多个弹层共用） ---- */
.sv-hist-loading, .sv-hist-empty { color: var(--text-secondary); padding: 10px 0; text-align: center; }
.sv-hist-list { list-style: none; margin: 0; padding: 0; }
/* 竖线靠 padding 留白 + 伪元素画，别用 border-left —— 圆点要压在线上 */
.sv-hist-item { position: relative; padding: 0 0 16px 22px; }
.sv-hist-item:last-child { padding-bottom: 2px; }
.sv-hist-item::before {
  content: ''; position: absolute; left: 4px; top: 16px; bottom: 0;
  width: 1px; background: var(--border);
}
.sv-hist-item:last-child::before { display: none; }
.sv-hist-dot {
  position: absolute; left: 0; top: 5px;
  width: 9px; height: 9px; border-radius: 50%;
  background: var(--bg-card); border: 2px solid var(--border);
}
/* 最新一条点高亮，一眼看出「最近一次改了什么」 */
.sv-hist-item:first-child .sv-hist-dot { border-color: var(--blue); }
.sv-hist-meta { display: flex; align-items: center; gap: 10px; margin-bottom: 5px; }
.sv-hist-op { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--text-primary); }
.sv-hist-avatar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; border-radius: 50%;
  background: var(--blue-bg); color: var(--blue);
  font-size: 11px; font-weight: 700; font-style: normal; line-height: 1;
}
.sv-hist-time { margin-left: auto; color: var(--text-tertiary); font-size: 11px; font-variant-numeric: tabular-nums; }
.sv-hist-changes { display: flex; flex-direction: column; gap: 4px; }
.sv-hist-change { display: flex; align-items: flex-start; gap: 8px; font-size: 12px; line-height: 1.75; }
.sv-hist-field {
  flex: 0 0 auto; padding: 0 8px; border-radius: 999px;
  background: var(--bg-card-2); border: 1px solid var(--border-soft);
  color: var(--text-secondary); font-size: 11px; line-height: 1.9; white-space: nowrap;
}
.sv-hist-flow { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.sv-hist-val { color: var(--text-primary); }
.sv-hist-from { color: var(--text-tertiary); }
.sv-hist-arrow { color: var(--blue); margin: 0 6px; }
.sv-hist-to { font-weight: 500; }
.sv-hist-nochange { color: var(--text-tertiary); font-size: 12px; }

/* toast */
.sv-toast { position: fixed; left: 50%; bottom: 32px; transform: translateX(-50%) translateY(20px); background: var(--bg-card); border: 1px solid var(--border); color: var(--text-primary); padding: 10px 18px; border-radius: 10px; box-shadow: var(--mask-shadow); z-index: 950; opacity: 0; pointer-events: none; transition: all .25s ease; font-size: 13px; }
.sv-toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
.sv-toast.err { border-color: var(--red); color: var(--red); }

@media (max-width: 1200px) {
  .sv-c-name { min-width: 160px; }
  .sv-c-follow { max-width: 260px; }
}
@media (max-width: 640px) {
  .sv-toolbar { flex-direction: column; align-items: stretch; }
  .sv-seg { width: 100%; }
  .sv-input[type="search"] { min-width: 0; width: 100%; }
  .sv-table th, .sv-table td { padding: 8px; }
}

/* ============================================================
   核心经营指标 · 上双周回款 KPI + 「预计本季度回款」钻探弹层
   （弹层复用 .sv-mask/.sv-modal，控件复用 .sv-seg/.sv-select）
   ============================================================ */

/* ---------- 上双周回款（KPI + 明细表） ---------- */
.bw-wrap {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 14px 18px 16px;
}

.bw-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
  margin-bottom: 10px;
}
.bw-head h3 {
  margin: 0;
  font-size: 14px;
  font-weight: 600;
  color: var(--text-primary);
  display: flex;
  align-items: baseline;
  gap: 8px;
  flex-wrap: wrap;
}
.bw-head h3 .sub {
  font-size: 11px;
  font-weight: 400;
  color: var(--text-tertiary);
  font-family: var(--font-mono);
}
.bw-kpi { display: flex; align-items: baseline; gap: 10px; }
.bw-value {
  font-size: 28px;
  font-weight: 700;
  color: var(--text-primary);
  font-family: var(--font-mono);
  line-height: 1;
}
.bw-unit { font-size: 13px; font-weight: 400; color: var(--text-tertiary); margin-left: 5px; }
.bw-count { font-size: 11px; color: var(--text-tertiary); }

.bw-cats {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.bw-cat {
  font-size: 11px;
  color: var(--text-secondary);
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-radius: 999px;
  padding: 3px 10px;
}
.bw-cat b { color: var(--text-primary); font-weight: 600; }

.bw-table-wrap {
  overflow: auto;
  max-height: 360px;
  border: 1px solid var(--border-soft);
  border-radius: 8px;
}
.bw-table {
  width: 100%;
  min-width: 760px;
  border-collapse: collapse;
  font-size: 12px;
  table-layout: fixed;
}
.bw-table th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--bg-card-2);
  color: var(--text-tertiary);
  font-weight: 500;
  font-size: 11px;
  text-align: left;
  padding: 8px 10px;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}
.bw-table td {
  padding: 7px 10px;
  color: var(--text-secondary);
  border-bottom: 1px solid var(--border-soft);
  vertical-align: middle;
}
.bw-table tbody tr:hover td { background: var(--bg-card-2); }
.bw-table .num { text-align: right; font-family: var(--font-mono); color: var(--text-primary); }
.bw-table th.num { text-align: right; }
.bw-d { font-family: var(--font-mono); color: var(--text-tertiary); white-space: nowrap; }
.bw-name { color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bw-ct { color: var(--text-tertiary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bw-op { color: var(--text-tertiary); font-family: var(--font-mono); white-space: nowrap; }
.bw-src { color: var(--text-tertiary); white-space: nowrap; }
.bw-tag {
  font-size: 11px;
  color: var(--text-secondary);
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-radius: 4px;
  padding: 1px 6px;
  white-space: nowrap;
}
.bw-st { font-size: 11px; padding: 2px 6px; border-radius: 4px; border: 1px solid transparent; white-space: nowrap; }
.bw-st.good { color: var(--green); border-color: var(--green); }
.bw-st.mid { color: var(--orange); border-color: var(--orange); }
.bw-st.warn { color: var(--red); border-color: var(--red); }
.bw-st.none { color: var(--text-tertiary); }

.bw-table tfoot td {
  font-weight: 600;
  color: var(--text-primary);
  border-top: 1px solid var(--border);
  border-bottom: none;
}
.bw-table tfoot td:first-child { font-weight: 500; color: var(--text-tertiary); }
.bw-empty {
  padding: 26px 0;
  text-align: center;
  color: var(--text-tertiary);
  font-size: 12px;
}

/* ---------- 「预计本季度回款」弹层 ---------- */
.exp-scope { font-size: 11px; color: var(--text-tertiary); margin-top: -6px; }
.exp-wrap { display: flex; flex-direction: column; gap: 14px; }

/* 口径说明：把「预计本季度回款 = 本季度待回款合计（不含已回款）」写在明面上，
   省得看明细时把已回款那几十笔也当成算进去了 */
.exp-formula {
  font-size: 11px;
  color: var(--text-tertiary);
  background: var(--bg-card-2);
  border-left: 2px solid var(--blue);
  border-radius: 4px;
  padding: 7px 10px;
}

/* 回款可能性：可多选 chips（不是下拉）。不选 = 不限 */
.exp-poss { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.exp-poss-lbl { font-size: 11px; color: var(--text-tertiary); white-space: nowrap; }
.exp-poss-lbl i { font-style: normal; opacity: .65; }
.exp-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.exp-chip {
  font-family: inherit;
  font-size: 11px;
  color: var(--text-secondary);
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-radius: 999px;
  padding: 3px 11px;
  cursor: pointer;
  white-space: nowrap;
  transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.exp-chip:hover { border-color: var(--blue); color: var(--text-primary); }
.exp-chip.active { border-color: var(--blue); color: var(--blue); background: var(--blue-bg); font-weight: 600; }
/* 选中态按可能性色调区分，扫一眼就知道筛的是哪档 */
.exp-chip.high.active { border-color: var(--green); color: var(--green); }
.exp-chip.mid.active { border-color: var(--orange); color: var(--orange); }
.exp-chip.low.active { border-color: var(--red); color: var(--red); }
.exp-chip.all.active { border-color: var(--text-tertiary); color: var(--text-primary); background: var(--bg-card-2); }
.exp-sum { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.exp-sum-item {
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-radius: 8px;
  padding: 10px 12px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.exp-sum-item b { font-size: 11px; color: var(--text-tertiary); font-weight: 500; }
.exp-sum-item span { font-size: 18px; font-family: var(--font-mono); color: var(--text-primary); }
.exp-sum-item.hl { border-color: var(--blue); }
.exp-sum-item.hl span { color: var(--blue); }

.exp-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
}
.exp-list {
  max-height: 46vh;
  overflow: auto;
  border: 1px solid var(--border-soft);
  border-radius: 8px;
}
.exp-empty { padding: 24px 0; text-align: center; color: var(--text-tertiary); font-size: 12px; }

.exp-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.exp-table th {
  position: sticky;
  top: 0;
  background: var(--bg-card-2);
  color: var(--text-tertiary);
  font-weight: 500;
  font-size: 11px;
  text-align: right;
  padding: 8px 10px;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}
.exp-table th:first-child { text-align: left; }
/* 日期与金额列钉死宽度：否则「2026-07-31」会被挤成两行、表头「可能性」也会断字 */
.exp-table th.exp-date { width: 94px; }
.exp-table th.exp-num { width: 92px; }
.exp-table td {
  padding: 7px 10px;
  text-align: right;
  color: var(--text-secondary);
  border-bottom: 1px solid var(--border-soft);
}
.exp-table td.exp-c-name { text-align: left; color: var(--text-primary); white-space: normal; }
/* 弹层是多作用域共用的（全部 / 组织 / 部门），所以每行都要标出归属事业部 */
.exp-table th.exp-c-dept,
.exp-table td.exp-c-dept { text-align: left; color: var(--text-tertiary); white-space: nowrap; }
.exp-table th.exp-c-dept { font-size: 11px; }
.exp-table tfoot td {
  font-weight: 600;
  color: var(--text-primary);
  border-top: 1px solid var(--border);
  border-bottom: none;
}
.exp-table tfoot td:first-child { text-align: left; font-weight: 500; color: var(--text-tertiary); }
.exp-num { font-family: var(--font-mono); }
.exp-date { font-family: var(--font-mono); color: var(--text-tertiary); white-space: nowrap; }

.exp-tag { font-size: 11px; padding: 2px 6px; border-radius: 4px; border: 1px solid transparent; white-space: nowrap; }
.exp-tag.done { color: var(--green); border-color: var(--green); }
.exp-tag.pending { color: var(--orange); border-color: var(--orange); }

.exp-poss { font-size: 11px; font-weight: 600; white-space: nowrap; }
.exp-poss.high { color: var(--green); }
.exp-poss.mid { color: var(--orange); }
.exp-poss.low { color: var(--red); }
.exp-poss.none { color: var(--text-tertiary); }

/* ---------- 跟进列 / 跟进记录弹层 ---------- */
.exp-table th.exp-c-act,
.exp-table td.exp-c-act { text-align: center; width: 78px; white-space: nowrap; }
.exp-follow { display: inline-block; }

/* 跟进弹层顶部：当前进展。进展说明字段本身是带日期的多行流水，所以必须保留换行 */
.fu-meta { font-size: 11px; color: var(--text-tertiary); margin-bottom: 10px; }
.fu-lbl { font-size: 11px; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; }
.fu-lbl-hist { margin-top: 4px; }
.fu-note {
  font-size: 12px;
  line-height: 1.7;
  color: var(--text-primary);
  white-space: pre-wrap;
  word-break: break-word;
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-left: 2px solid var(--blue);
  border-radius: 6px;
  padding: 10px 12px;
  margin-bottom: 14px;
}

@media (max-width: 760px) {
  .exp-sum { grid-template-columns: repeat(2, 1fr); }
  .exp-poss { align-items: flex-start; flex-direction: column; gap: 6px; }
}

@media (max-width: 520px) {
  .exp-sum { grid-template-columns: 1fr; }
}

/* ============================================================
 * 绿电财报分析（gd-report）· 成本控制管理「预结算数据分析」（gfr- / gps-）
 * ============================================================
 * 全部走主题变量，不写死深色 —— 浅色主题下写死深色会变成黑底块。
 * 表格用 table-layout:auto + 外层横向滚动，宽表不挤压列宽。
 */

/* ---------- gd-report：页头与容器 ---------- */
.gfr-wrap { padding: 14px 18px 28px; }

.gfr-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 14px;
}
.gfr-head-main { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.gfr-title { font-size: 16px; font-weight: 700; color: var(--text-primary); }
.gfr-sub { font-size: 12px; color: var(--text-tertiary); }
.gfr-head-meta { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }

.gfr-chip {
  font-size: 11px;
  padding: 3px 9px;
  border-radius: 999px;
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  color: var(--text-secondary);
  white-space: nowrap;
}
.gfr-chip-ok { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
.gfr-chip-warn { color: var(--amber); border-color: var(--orange-border); background: var(--amber-bg); }

/* ---------- KPI 卡 ---------- */
.gfr-kpis {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(148px, 1fr));
  gap: 10px;
  margin-bottom: 16px;
}
.gfr-kpi {
  background: var(--bg-card);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius);
  padding: 11px 13px;
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.gfr-kpi-label { font-size: 12px; color: var(--text-secondary); }
.gfr-kpi-value {
  font-size: 20px;
  font-weight: 700;
  color: var(--text-primary);
  font-family: var(--font-mono);
  line-height: 1.2;
}
.gfr-kpi-unit { font-size: 11px; font-weight: 500; color: var(--text-tertiary); margin-left: 3px; }
.gfr-kpi-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 11px;
  color: var(--text-tertiary);
}
.gfr-up { color: var(--red); }
.gfr-down { color: var(--green); }
.gfr-flat { color: var(--text-tertiary); }

/* ---------- 卡片 ---------- */
.gfr-card {
  background: var(--bg-card);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius);
  padding: 14px 16px 16px;
  margin-bottom: 16px;
}
.gfr-card-head {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.gfr-card-title { font-size: 14px; font-weight: 700; color: var(--text-primary); }
.gfr-card-sub { font-size: 11px; color: var(--text-tertiary); }

/* ---------- 走势图：一个主题一张图（各自独立纵轴） ----------
 * 多序列图整行铺开（9 个月 × 4 序列，窄了柱子就糊）；
 * 单序列图（偿债能力 / 资金余额）两两并排，省半屏高度。
 * 每张图仍是自己的 canvas 与自己的纵轴，视觉上并排不等于共轴。 */
.gfr-charts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.gfr-chart-item.is-wide { grid-column: 1 / -1; }
.gfr-chart-item {
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm);
  padding: 10px 12px 12px;
  background: var(--bg-card-2);
}
.gfr-chart-head {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 8px;
}
.gfr-chart-title { font-size: 13px; font-weight: 700; color: var(--text-primary); }
.gfr-chart-desc { font-size: 11px; color: var(--text-tertiary); }
.gfr-chart-box { position: relative; height: 240px; }
/* 空态：替换掉 canvas，靠 min-height 撑住版式，避免卡片塌成一条线 */
.gfr-chart-box.is-empty { display: flex; align-items: center; justify-content: center; min-height: 90px; }
.gfr-chart-note { font-size: 11px; color: var(--text-tertiary); margin-top: 8px; }

/* ---------- 分段控件 / 下拉 ---------- */
.gfr-seg {
  display: inline-flex;
  gap: 2px;
  padding: 2px;
  border-radius: var(--radius-sm);
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
}
.gfr-seg-btn {
  border: 0;
  background: transparent;
  color: var(--text-secondary);
  font-size: 12px;
  padding: 4px 11px;
  border-radius: var(--radius-sm);
  cursor: pointer;
  font-family: inherit;
}
.gfr-seg-btn:hover { background: var(--blue-bg-hover); color: var(--text-primary); }
.gfr-seg-btn.is-on { background: var(--blue-bg); color: var(--blue); font-weight: 600; }

.gfr-select {
  margin-left: auto;
  font-family: inherit;
  font-size: 12px;
  padding: 4px 8px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--bg-panel);
  color: var(--text-primary);
}

/* ---------- 表格 ---------- */
.gfr-table-scroll { overflow-x: auto; }
.gfr-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.gfr-table th,
.gfr-table td {
  padding: 6px 9px;
  border-bottom: 1px solid var(--border-soft);
  text-align: left;
  white-space: nowrap;
}
.gfr-table thead th {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--bg-card-2);
  color: var(--text-secondary);
  font-weight: 600;
}
.gfr-table td.num,
.gfr-table th.num { text-align: right; font-family: var(--font-mono); }

.gfr-table-matrix .gfr-sticky-col {
  position: sticky;
  left: 0;
  z-index: 1;
  background: var(--bg-card);
  font-weight: 600;
  color: var(--text-primary);
}
.gfr-table-matrix thead .gfr-sticky-col { z-index: 3; background: var(--bg-card-2); }

.gfr-dim { color: var(--text-tertiary); font-size: 11px; }
.gfr-dash { color: var(--text-tertiary); }
.gfr-empty { padding: 24px; text-align: center; color: var(--text-tertiary); font-size: 13px; }

.gfr-table-stmt .gfr-item { white-space: normal; min-width: 190px; }
.gfr-table-stmt .gfr-rowno { color: var(--text-tertiary); font-size: 11px; width: 48px; }
.gfr-split { border-left: 2px solid var(--border); }

.gfr-tieout {
  margin-top: 10px;
  font-size: 12px;
  padding: 8px 11px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-soft);
  background: var(--bg-card-2);
}
.gfr-tieout.is-ok { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
.gfr-tieout.is-bad { color: var(--amber); border-color: var(--orange-border); background: var(--amber-bg); }

.gfr-footer-note {
  font-size: 11.5px;
  line-height: 1.8;
  color: var(--text-tertiary);
  border-top: 1px dashed var(--border-soft);
  padding-top: 10px;
}
.gfr-hint { margin-top: 10px; font-size: 12px; line-height: 1.9; color: var(--text-tertiary); }
.gfr-hint code {
  font-family: var(--font-mono);
  background: var(--bg-card-2);
  padding: 1px 5px;
  border-radius: 4px;
}

@media (max-width: 980px) {
  .gfr-charts { grid-template-columns: minmax(0, 1fr); }
  .gfr-chart-item.is-wide { grid-column: auto; }
}

@media (max-width: 760px) {
  .gfr-kpis { grid-template-columns: repeat(2, 1fr); }
  .gfr-chart-box { height: 210px; }
}

/* ---------- 成本控制管理 · 预结算数据分析（gps-） ---------- */
.gps-filters {
  display: flex;
  flex-direction: column;
  gap: 7px;
  margin-bottom: 12px;
  padding-bottom: 12px;
  border-bottom: 1px dashed var(--border-soft);
}
.gps-fgroup { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.gps-fdim {
  font-size: 11px;
  color: var(--text-tertiary);
  min-width: 52px;
  flex: 0 0 auto;
}
.gps-chip {
  font-size: 11.5px;
  padding: 3px 10px;
  border-radius: 11px;
  cursor: pointer;
  color: var(--text-secondary);
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  white-space: nowrap;
}
.gps-chip:hover { color: var(--text-primary); border-color: var(--blue-border); }
.gps-chip.is-on { background: var(--blue-bg); color: var(--blue); border-color: var(--blue-border); font-weight: 600; }
.gps-chip-reset { color: var(--amber); border-color: var(--orange-border); background: var(--amber-bg); }
.gps-input {
  font-family: inherit;
  font-size: 12px;
  padding: 4px 9px;
  border-radius: 6px;
  border: 1px solid var(--border);
  background: var(--bg-panel);
  color: var(--text-primary);
  min-width: 200px;
}

.gps-kpis {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(136px, 1fr));
  gap: 9px;
  margin-bottom: 14px;
}
.gps-kpi {
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm);
  padding: 9px 11px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.gps-kpi-label { font-size: 11.5px; color: var(--text-secondary); }
.gps-kpi-value {
  font-size: 17px;
  font-weight: 700;
  color: var(--text-primary);
  font-family: var(--font-mono);
  line-height: 1.25;
}
.gps-kpi-unit { font-size: 10.5px; font-weight: 500; color: var(--text-tertiary); margin-left: 3px; }
.gps-kpi-foot { font-size: 10.5px; color: var(--text-tertiary); }

.gps-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 14px;
  margin-bottom: 14px;
}
.gps-box {
  background: var(--bg-card-2);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm);
  padding: 11px 13px 13px;
}
.gps-box-head {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 9px;
}
.gps-box-title { font-size: 12.5px; font-weight: 700; color: var(--text-primary); }
.gps-box-sub { font-size: 10.5px; color: var(--text-tertiary); }
.gps-canvas { position: relative; height: 250px; }
.gps-canvas-sm { height: 200px; }

.gps-table-wrap { overflow-x: auto; max-height: 460px; overflow-y: auto; }
.gps-table { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.gps-table th,
.gps-table td {
  padding: 5px 8px;
  border-bottom: 1px solid var(--border-soft);
  text-align: left;
  white-space: nowrap;
}
.gps-table thead th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--bg-card);
  color: var(--text-secondary);
  font-weight: 600;
}
.gps-table td.num,
.gps-table th.num { text-align: right; font-family: var(--font-mono); }
.gps-table tbody tr:hover td { background: var(--blue-bg-hover); }
.gps-code { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); }
.gps-proj { max-width: 260px; overflow: hidden; text-overflow: ellipsis; }
.gps-dash { color: var(--text-tertiary); }
.gps-dev { font-family: var(--font-mono); }
.gps-over { color: var(--red); }
.gps-under { color: var(--green); }
.gps-flat { color: var(--text-tertiary); }
.gps-sort { display: flex; gap: 5px; flex-wrap: wrap; margin-left: auto; }

/**
 * 单据编号：flowUrl 有值才是链接（与明细弹层 .gc-dt-voucher 同一套语感：
 * 蓝色 + 可点 + hover 下划线）。未配置流程地址时渲染 .gps-code-off ——
 * 既是文字色又是光标，都在明说「这个编号点不动」，别让人白点一下。
 */
.gps-code-link {
  cursor: pointer;
  color: var(--blue);
  font-weight: 600;
  text-decoration: none;
}
.gps-code-link:hover { text-decoration: underline; }
.gps-code-off {
  cursor: default;
  color: var(--text-secondary);
  border-bottom: 1px dotted var(--border-strong, var(--border));
}

/* 可排序表头：箭头只出现在当前排序列上，避免满屏箭头分不清谁在生效 */
.gps-table thead th[data-gps-sortkey] { cursor: pointer; user-select: none; }
.gps-table thead th[data-gps-sortkey]:hover { color: var(--blue); }
.gps-table thead th.gps-th-on { color: var(--blue); }
.gps-sort-arrow { font-style: normal; margin-left: 2px; font-size: 10px; }

/* 分页条：明细表 20 条一页，总数与页码常驻，翻页纯前端 */
.gps-pager {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  padding: 8px 2px 2px;
  border-top: 1px solid var(--border-soft);
  margin-top: 6px;
  font-size: 11px;
  color: var(--text-tertiary);
}
.gps-pager-info b { color: var(--text-primary); font-size: 12px; }
.gps-pager-btns { display: flex; align-items: center; gap: 4px; margin-left: auto; }
.gps-pager-gap { color: var(--text-tertiary); padding: 0 2px; }
.gps-chip.gps-page { padding: 2px 9px; line-height: 1.6; }
.gps-chip.gps-page.is-disabled { opacity: 0.4; pointer-events: none; }

/**
 * Top 10 紧凑表：只占半幅宽，7 列按内容撑会把最右边的「偏差率」挤出可视区。
 * 固定列宽 + 项目名省略号，保证偏差率永远可见（它才是这张表要看的数）。
 */
.gps-table-compact { table-layout: fixed; }
.gps-table-compact td { overflow: hidden; text-overflow: ellipsis; }
.gps-table-compact .gps-proj { max-width: none; }
.gps-table-compact .gps-code { font-size: 10.5px; }
.gps-table-compact th:nth-child(1), .gps-table-compact td:nth-child(1) { width: 140px; }
.gps-table-compact th:nth-child(3), .gps-table-compact td:nth-child(3) { width: 54px; }
.gps-table-compact th:nth-child(4), .gps-table-compact td:nth-child(4) { width: 50px; }
.gps-table-compact th:nth-child(5), .gps-table-compact td:nth-child(5) { width: 58px; }
.gps-table-compact th:nth-child(6), .gps-table-compact td:nth-child(6) { width: 58px; }
.gps-table-compact th:nth-child(7), .gps-table-compact td:nth-child(7) { width: 70px; }

.gps-empty {
  padding: 22px;
  text-align: center;
  color: var(--text-tertiary);
  font-size: 12.5px;
  line-height: 1.9;
}
.gps-empty code {
  font-family: var(--font-mono);
  background: var(--bg-card-2);
  padding: 1px 5px;
  border-radius: 4px;
}

@media (max-width: 900px) {
  .gps-grid { grid-template-columns: 1fr; }
}

/* ================================================================
 * AI 工作区（多用户）
 * 仅用主题变量，浅色/深色/暖色三套主题自动适配；无 emoji。
 * 通用排版尽量复用 .data-table / .kpi-card / .link-btn / .empty-state。
 * ================================================================ */

.ai-wrap { padding: 6px 2px 24px; display: flex; flex-direction: column; gap: 14px; max-width: 1180px; }
.ai-head {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; justify-content: space-between;
  background: var(--bg-card); border: 1px solid var(--border-soft); border-radius: var(--radius); padding: 12px 16px;
}
.ai-head h3 { margin: 0; font-size: 15px; color: var(--text-primary); }
.ai-head .ai-sub { font-size: 12px; color: var(--text-tertiary); margin-top: 3px; }
.ai-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--text-tertiary); flex: 0 0 auto; }
.ai-dot.on { background: var(--green); box-shadow: 0 0 0 3px var(--green-bg); }
.ai-dot.warn { background: var(--amber); box-shadow: 0 0 0 3px var(--bg-card-2); }
.ai-dot.err { background: var(--red); box-shadow: 0 0 0 3px var(--red-bg); }

.ai-card { background: var(--bg-card); border: 1px solid var(--border-soft); border-radius: var(--radius); padding: 14px 16px; }
.ai-card h4 { margin: 0 0 4px; font-size: 13.5px; color: var(--text-primary); display: flex; align-items: center; gap: 8px; }
.ai-card .ai-hint { font-size: 11.5px; color: var(--text-tertiary); line-height: 1.6; margin: 0 0 12px; }
.ai-card .ai-hint b { color: var(--text-secondary); font-weight: 600; }
.ai-step { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: 50%;
  background: var(--blue-bg); color: var(--blue); font-size: 11.5px; font-weight: 600; flex: 0 0 auto; }

.ai-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
.ai-field { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.ai-field > label { font-size: 12px; color: var(--text-secondary); display: flex; align-items: center; gap: 6px; }
.ai-field .ai-tip { font-size: 11px; color: var(--text-tertiary); line-height: 1.5; }
.ai-input, .ai-select, .ai-textarea {
  width: 100%; box-sizing: border-box; background: var(--bg-card); color: var(--text-primary);
  border: 1px solid var(--border); border-radius: 7px; padding: 8px 10px; font-size: 13px; font-family: inherit;
}
.ai-input:focus, .ai-select:focus, .ai-textarea:focus { outline: none; border-color: var(--blue-border); box-shadow: 0 0 0 2px var(--blue-bg); }
.ai-input:disabled, .ai-select:disabled { background: var(--bg-card-2); color: var(--text-tertiary); }
.ai-textarea { min-height: 86px; resize: vertical; line-height: 1.65; }
.ai-input.mono { font-family: var(--font-mono); font-size: 12.5px; }
.ai-inline { display: flex; gap: 8px; align-items: center; }
.ai-inline > .ai-input { flex: 1 1 auto; min-width: 0; }

.ai-btn {
  padding: 7px 14px; border-radius: 7px; border: 1px solid var(--border); background: var(--bg-card-2);
  color: var(--text-primary); cursor: pointer; font-family: inherit; font-size: 12.5px; white-space: nowrap;
}
.ai-btn:hover:not(:disabled) { border-color: var(--blue-border); color: var(--blue); }
.ai-btn:disabled { opacity: .5; cursor: not-allowed; }
.ai-btn.primary { background: var(--blue-bg); border-color: var(--blue-border); color: var(--blue); font-weight: 600; }
.ai-btn.danger { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }
.ai-btn.ghost { background: transparent; border-color: transparent; color: var(--text-tertiary); padding: 5px 8px; }
.ai-btn.ghost:hover { color: var(--blue); }
.ai-btn.sm { padding: 4px 10px; font-size: 11.5px; }
.ai-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }

.ai-status { font-size: 12.5px; line-height: 1.7; border-radius: 8px; padding: 10px 12px; border: 1px solid var(--border-soft);
  white-space: pre-wrap; word-break: break-word; background: var(--bg-card-2); color: var(--text-secondary); }
.ai-status.ok { border-color: var(--green-border); color: var(--green); }
.ai-status.warn { border-color: var(--border); color: var(--amber); }
.ai-status.err { border-color: var(--red-border); color: var(--red); }
.ai-status.info { border-color: var(--blue-border); color: var(--text-secondary); }
.ai-status b { font-weight: 600; }
.ai-status .ai-raw { display: block; margin-top: 6px; color: var(--text-tertiary); font-family: var(--font-mono); font-size: 11px; }

.ai-sec-title { font-size: 12px; color: var(--text-tertiary); margin: 12px 0 6px; letter-spacing: .02em; }

/* 模型 / 资产列表 */
.ai-list { display: flex; flex-direction: column; gap: 8px; }
.ai-row { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border: 1px solid var(--border-soft);
  border-radius: 9px; background: var(--bg-card); cursor: pointer; }
.ai-row:hover { border-color: var(--blue-border); }
.ai-row.on { border-color: var(--blue-border); background: var(--blue-bg); }
.ai-row .ai-row-main { flex: 1 1 auto; min-width: 0; }
.ai-row .ai-row-name { font-size: 13px; color: var(--text-primary); font-weight: 600; display: flex; align-items: center; gap: 6px; }
.ai-row .ai-row-meta { font-size: 11px; color: var(--text-tertiary); margin-top: 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ai-badge { font-size: 10px; padding: 1px 7px; border-radius: 9px; background: var(--bg-card-2); color: var(--text-tertiary); border: 1px solid var(--border-soft); }
.ai-badge.public { color: var(--blue); border-color: var(--blue-border); background: var(--blue-bg); }
.ai-badge.private { color: var(--text-secondary); }
.ai-badge.off { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }

/* 数据范围选择 */
.ai-scope-group { border: 1px solid var(--border-soft); border-radius: 9px; margin-bottom: 8px; overflow: hidden; }
.ai-scope-grouphead { background: var(--bg-card-2); padding: 7px 12px; font-size: 12px; color: var(--text-secondary);
  cursor: pointer; display: flex; align-items: center; gap: 8px; user-select: none; }
.ai-scope-company { padding: 8px 12px 2px; font-size: 11.5px; color: var(--text-tertiary); }
.ai-scope-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 2px 12px; padding: 2px 12px 10px; }
.ai-scope-item { display: flex; align-items: flex-start; gap: 8px; padding: 5px 6px; border-radius: 6px; cursor: pointer;
  font-size: 12.5px; color: var(--text-primary); }
.ai-scope-item:hover { background: var(--bg-card-2); }
.ai-scope-item input { margin: 2px 0 0; flex: 0 0 auto; accent-color: var(--blue); }
.ai-scope-item .ai-scope-name { line-height: 1.4; }
.ai-scope-item .ai-scope-src { display: block; font-size: 10.5px; color: var(--text-tertiary); margin-top: 1px; }
.ai-scope-item.on .ai-scope-name { color: var(--blue); font-weight: 600; }

/* 模板 */
.ai-tpl-row { display: flex; gap: 10px; flex-wrap: wrap; }
.ai-tpl { border: 1px solid var(--border); border-radius: 9px; padding: 10px 12px; min-width: 170px; cursor: pointer;
  background: var(--bg-card); display: flex; flex-direction: column; gap: 7px; }
.ai-tpl:hover { border-color: var(--blue-border); }
.ai-tpl.on { border-color: var(--blue-border); background: var(--blue-bg); }
.ai-tpl .ai-tpl-name { font-size: 12.5px; color: var(--text-primary); font-weight: 600; display: flex; align-items: center; gap: 6px; }
.ai-tpl .ai-tpl-meta { font-size: 10.5px; color: var(--text-tertiary); }
.ai-swatches { display: flex; gap: 4px; }
.ai-swatches i { width: 16px; height: 16px; border-radius: 4px; display: block; border: 1px solid var(--border-soft); }

/* 大纲预览 */
.ai-outline { display: flex; flex-direction: column; gap: 8px; max-height: 420px; overflow: auto; padding-right: 4px; }
.ai-slide { border: 1px solid var(--border-soft); border-radius: 8px; padding: 9px 12px; background: var(--bg-card-2); }
.ai-slide .ai-slide-head { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--text-primary); font-weight: 600; }
.ai-slide .ai-slide-no { color: var(--text-tertiary); font-family: var(--font-mono); font-size: 11px; }
.ai-slide .ai-slide-layout { font-size: 10px; padding: 1px 7px; border-radius: 9px; background: var(--blue-bg); color: var(--blue); }
.ai-slide ul { margin: 6px 0 0; padding-left: 18px; color: var(--text-secondary); font-size: 12px; line-height: 1.65; }
.ai-slide .ai-slide-note { margin-top: 5px; font-size: 10.5px; color: var(--text-tertiary); }
.ai-metrics { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 6px; }
.ai-metric { background: var(--bg-card); border: 1px solid var(--border-soft); border-radius: 7px; padding: 6px 10px; min-width: 96px; }
.ai-metric .m-lab { font-size: 10.5px; color: var(--text-tertiary); }
.ai-metric .m-val { font-size: 15px; font-weight: 600; color: var(--text-primary); }
.ai-metric .m-note { font-size: 10px; color: var(--text-tertiary); }

/* 事件日志（真实阶段文本，无假百分比） */
.ai-eventlog { display: flex; flex-direction: column; gap: 4px; max-height: 220px; overflow: auto; margin-top: 6px;
  font-size: 12px; color: var(--text-secondary); }
.ai-eventlog .ai-ev { display: flex; gap: 8px; padding: 3px 0; border-bottom: 1px dashed var(--border-soft); }
.ai-eventlog .ai-ev .ai-ev-phase { flex: 0 0 auto; font-family: var(--font-mono); font-size: 10.5px; color: var(--blue); min-width: 78px; }
.ai-eventlog .ai-ev .ai-ev-text { flex: 1 1 auto; }
.ai-eventlog .ai-ev .ai-ev-ts { flex: 0 0 auto; color: var(--text-tertiary); font-size: 10px; }

/* 配额 / 用量小卡 */
.ai-kv { display: grid; grid-template-columns: auto 1fr; gap: 4px 14px; font-size: 12px; color: var(--text-secondary); }
.ai-kv b { font-weight: 500; color: var(--text-tertiary); }
.ai-empty { padding: 16px; text-align: center; color: var(--text-tertiary); font-size: 12.5px; line-height: 1.8; }
.ai-spin { display: inline-block; width: 12px; height: 12px; border: 2px solid var(--blue-border); border-top-color: var(--blue);
  border-radius: 50%; animation: aiSpin .7s linear infinite; vertical-align: -1px; margin-right: 6px; }
@keyframes aiSpin { to { transform: rotate(360deg); } }

/* 弹层（模板 / 制作要求编辑） */
.ai-mask { position: fixed; inset: 0; background: var(--mask-bg, rgba(4, 7, 16, .5)); display: flex; align-items: center;
  justify-content: center; z-index: 1000; }
.ai-modal { width: min(94vw, 640px); max-height: 88vh; overflow: auto; background: var(--bg-card); color: var(--text-primary);
  border: 1px solid var(--border); border-radius: 14px; padding: 20px 22px; box-shadow: 0 18px 48px rgba(0, 0, 0, .28); }
.ai-modal h3 { margin: 0 0 4px; font-size: 15px; }
.ai-modal .ai-modal-sub { font-size: 11.5px; color: var(--text-tertiary); margin-bottom: 14px; }
.ai-modal .ai-modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }
/* 上传 PPTX 后「已提取」区块：色块列表 + 字体 + 页面尺寸。
   用户第一眼要能看见「提取到了什么」，而不是一张空壳卡片。 */
.ai-extract {
  margin-top: 10px;
  padding: 10px 12px;
  border: 1px solid var(--blue-border);
  background: var(--blue-bg);
  border-radius: 9px;
}
.ai-extract-head { font-size: 12px; font-weight: 600; color: var(--blue); }
.ai-extract-sw { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.ai-swatch {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 7px 2px 3px;
  border: 1px solid var(--border-soft);
  border-radius: 20px;
  background: var(--bg-card);
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-secondary);
}
.ai-swatch:hover { border-color: var(--blue-border); color: var(--text-primary); }
.ai-swatch i {
  width: 14px; height: 14px; border-radius: 50%; display: block;
  border: 1px solid var(--border-soft);
}
.ai-swatch b { font-weight: 600; }
.ai-extract-foot { margin-top: 7px; font-size: 11px; color: var(--text-tertiary); line-height: 1.6; }

.ai-color { display: flex; align-items: center; gap: 8px; }
.ai-color input[type=color] { width: 34px; height: 30px; padding: 0; border: 1px solid var(--border); border-radius: 6px; background: var(--bg-card); }
.ai-color input[type=text] { width: 96px; font-family: var(--font-mono); font-size: 12px; }
.ai-note-box { font-size: 11px; color: var(--amber); background: var(--bg-card-2); border: 1px solid var(--border-soft);
  border-radius: 7px; padding: 8px 10px; line-height: 1.6; }

/* ============ AI 系统设置（ai-admin） ============ */
.ai-title { margin: 0; font-size: 17px; font-weight: 650; color: var(--text-primary); }
.ai-sub { font-size: 12px; color: var(--text-tertiary); margin: 0; line-height: 1.6; }
.ai-card-title { margin: 0 0 12px; font-size: 14.5px; font-weight: 600; color: var(--text-primary);
  display: flex; align-items: center; gap: 8px; }
.ai-grid.ai-filters { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); margin-bottom: 14px; }
.ai-num { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--font-mono, monospace); }
.ai-input.ai-num { width: 92px; text-align: right; }

/* 表格（授权 / 用量）通用 */
.ai-table { width: 100%; border-collapse: collapse; font-size: 12.5px; color: var(--text-secondary); }
.ai-table th, .ai-table td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--border-soft); }
.ai-table th { font-size: 11.5px; color: var(--text-tertiary); font-weight: 600; background: var(--bg-card-2); position: sticky; top: 0; }
.ai-table tbody tr:hover { background: var(--bg-card-2); }

/* 授权块：每个公开模型一块 */
.ai-grant-model { border: 1px solid var(--border-soft); border-radius: var(--radius); margin-bottom: 12px; overflow: hidden; }
.ai-grant-head { display: flex; align-items: center; gap: 10px; padding: 10px 12px; background: var(--bg-card-2);
  border-bottom: 1px solid var(--border-soft); flex-wrap: wrap; }
.ai-grant-head .ai-model-name { font-weight: 600; color: var(--text-primary); }
.ai-grant-table th, .ai-grant-table td { padding: 7px 10px; }

/* 开关（授权 checkbox 视觉化） */
.ai-switch { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; user-select: none; }
.ai-switch input { width: 15px; height: 15px; accent-color: var(--blue); cursor: pointer; }
.ai-switch span { font-size: 11.5px; color: var(--text-tertiary); }

/* 用量合计行 */
.ai-usage-table .ai-usage-total td { font-weight: 600; color: var(--text-primary); background: var(--bg-card-2);
  border-top: 2px solid var(--border); }


/* ============================================================
 * 组织管理（组织架构 / 员工岗位说明，独立业务数据）
 * 颜色全部走主题变量；.og-* = 通用（两页共用表单/弹层），.op-* = 岗位列表专属。
 * ============================================================ */

/* 容器与工具条 */
.og-wrap, .op-wrap { padding: 12px 6px; display: flex; flex-direction: column; gap: 12px; }
.og-bar, .op-bar { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.og-stat, .op-stat { font-size: 12px; color: var(--text-secondary); }
.og-stat b, .op-stat b { color: var(--text-primary); font-size: 14px; }
.og-hint, .op-hint { font-size: 11.5px; color: var(--text-tertiary); }
.og-loading, .og-error, .og-empty, .op-loading, .op-error, .op-empty { color: var(--text-tertiary); font-size: 13px; line-height: 1.8; }
.og-error, .op-error { color: var(--red); }

/* 部门树 */
.og-root > .og-node > .og-card { background: var(--bg-card-2); }
.og-node { display: flex; flex-direction: column; gap: 8px; }
.og-children { display: flex; flex-direction: column; gap: 8px; margin-left: 16px; padding-left: 12px; border-left: 1px dashed var(--border-soft); }
.og-card { background: var(--bg-card); border: 1px solid var(--border-soft); border-radius: 8px; padding: 10px 12px;
  display: flex; align-items: flex-start; gap: 8px; min-width: 240px; max-width: 460px; box-shadow: 0 1px 2px rgba(0,0,0,.04); }
.og-toggle, .og-toggle-spacer { flex: 0 0 auto; width: 18px; text-align: center; color: var(--text-secondary); cursor: pointer;
  background: transparent; border: none; font-size: 12px; line-height: 1.6; padding-top: 2px; }
.og-toggle:hover { color: var(--blue); }
.og-main { flex: 1 1 auto; min-width: 0; }
.og-name { font-size: 13px; font-weight: 600; color: var(--text-primary); margin-bottom: 6px; word-break: break-word; }
.og-meta { display: flex; gap: 8px; margin-bottom: 6px; flex-wrap: wrap; }
.og-tag { font-size: 11px; color: var(--text-secondary); background: var(--bg-card-2); border-radius: 4px; padding: 2px 6px; }
.og-tag b { color: var(--text-primary); font-weight: 700; }
.og-desc { font-size: 12px; color: var(--text-secondary); white-space: pre-wrap; word-break: break-word; }
.og-actions { display: flex; flex-direction: column; gap: 4px; flex: 0 0 auto; }

/* 按钮（与全站 .sp-btn 风格一致，主题变量化） */
.og-btn, .op-btn { border: 1px solid var(--border); background: var(--bg-card-2); color: var(--text-primary);
  padding: 5px 11px; border-radius: 7px; cursor: pointer; font-size: 12px; font-family: inherit; white-space: nowrap; }
.og-btn:hover, .op-btn:hover { border-color: var(--blue-border); color: var(--blue); }
.og-btn.primary, .op-btn.primary { background: var(--blue); border-color: var(--blue); color: #fff; }
.og-btn.primary:hover, .op-btn.primary:hover { color: #fff; filter: brightness(1.06); }
.og-btn:disabled, .op-btn:disabled { opacity: .5; cursor: default; }

/* 表单（弹层内，复用 .og- 前缀） */
.og-form { display: flex; flex-direction: column; gap: 12px; }
.og-row { display: flex; align-items: flex-start; gap: 10px; }
.og-label { width: 64px; flex: 0 0 auto; color: var(--text-secondary); font-size: 13px; padding-top: 7px; text-align: right; }
.og-input { flex: 1 1 auto; width: 100%; box-sizing: border-box; background: var(--bg-card); color: var(--text-primary);
  border: 1px solid var(--border); border-radius: 7px; padding: 8px 10px; font-size: 13px; font-family: inherit; resize: vertical; }
.og-input:focus { outline: none; border-color: var(--blue-border); box-shadow: 0 0 0 2px var(--blue-bg); }
.og-form-err { color: var(--red); font-size: 12px; min-height: 16px; }
.og-form-actions { display: flex; justify-content: flex-end; gap: 8px; }
.og-conflict { font-size: 13px; color: var(--text-secondary); line-height: 1.8; }
.og-conflict-sub { color: var(--text-tertiary); font-size: 12px; }

/* 岗位说明列表 */
.op-filter { font-size: 12px; color: var(--text-secondary); display: inline-flex; align-items: center; gap: 6px; }
.op-select { background: var(--bg-card); color: var(--text-primary); border: 1px solid var(--border); border-radius: 7px;
  padding: 5px 8px; font-size: 12px; font-family: inherit; }
.op-list { display: flex; flex-direction: column; gap: 10px; }
.op-item { background: var(--bg-card); border: 1px solid var(--border-soft); border-radius: 10px; padding: 12px 14px; }
.op-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.op-name { font-size: 14px; font-weight: 600; color: var(--text-primary); }
.op-dept { font-size: 11px; color: var(--text-secondary); background: var(--bg-card-2); border: 1px solid var(--border); border-radius: 12px; padding: 2px 9px; }
.op-actions { margin-left: auto; display: flex; gap: 6px; }
.op-fields { display: flex; flex-direction: column; gap: 6px; }
.op-field { display: flex; gap: 10px; font-size: 12.5px; }
.op-k { flex: 0 0 64px; color: var(--text-tertiary); }
.op-v { flex: 1 1 auto; color: var(--text-secondary); white-space: pre-wrap; word-break: break-word; }

/* ===== 数科工作计划 · 任务层级折叠（仅数科模块使用） ===== */
/* 非最末级（分支 / 父行）节点：隐藏「完成进度 / 状态 / 进展说明 / 汇报按钮」，
   仅保留工作事项、责任人、计划完成时间、跟进人 / 更新；末级叶子照常展示。
   用 visibility 而非 display，是为了保留列宽，让分支行与叶子行的列对齐不抖动。 */
.zd-row-branch .zd-col-prog,
.zd-row-branch .zd-col-status,
.zd-row-branch .zd-col-note { visibility: hidden; }

/* 「N 个子任务」折叠 / 展开按钮：替代原静态徽标，点击切换该节点子树的收起态 */
.zd-toggle {
  margin-left: 8px;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  border: 1px solid var(--border, #2a3354);
  background: var(--bg-card-2, rgba(255, 255, 255, 0.04));
  color: var(--text-secondary, #9aa6c8);
  border-radius: 999px;
  padding: 1px 9px;
  font-size: 11px;
  line-height: 1.7;
  cursor: pointer;
  font-family: inherit;
  white-space: nowrap;
  user-select: none;
  transition: color .15s ease, border-color .15s ease;
}
.zd-toggle:hover { border-color: var(--blue-border, #2f81f7); color: var(--blue, #4da3ff); }
.zd-toggle:focus-visible { outline: 2px solid var(--blue-border, #2f81f7); outline-offset: 1px; }

