/* ============================================================================
 * MercerDesk · styles.css
 * 品牌 token（§7.10）+ CSS Grid 布局 + 定宽表格引擎样式 + 组件样式
 * 零外部资源：不引用 CDN / 外部字体 / 图标库；图标一律用 Unicode 字符或内联 SVG。
 * 关键约束：th 34px / td 38px / 行内编辑控件 26px（编辑时行高恒定不跳动）。
 * ==========================================================================*/

/* ---- 品牌 token（来自 §7.10，一字不改） ----------------------------------*/
:root{
  --brand:#1f3864; --accent:#2e75b6; --bg:#f4f6fa; --card:#ffffff;
  --text:#1e293b; --muted:#52627a; --muted2:#7e8ea4; --line:#eef2f7;
  --red:#dc2626; --orange:#f59e0b; --blue:#3b82f6; --green:#0d9488;
  --gray:#94a3b8; --gray2:#9ca3af;
  --sidebar-w:228px; --drawer-w:520px; --th-h:34px; --row-h:38px; --edit-h:26px;
  --radius:8px; --shadow:0 1px 3px rgba(15,23,42,.06);
  --font:"Microsoft YaHei UI","PingFang SC","Microsoft YaHei",sans-serif; --fs-base:14px; --fs-table:13px;

  --topbar-h:56px;
  --brand-2:#16294a;      /* 侧栏更深一档，做层次 */
  --sel-bg:#eef4fc;       /* 侧栏选中底色 */
}

/* ---- 基础重置 ------------------------------------------------------------*/
*{box-sizing:border-box;}
html,body{margin:0;height:100%;}
body{
  background:var(--bg); color:var(--text);
  font-family:var(--font); font-size:var(--fs-base);
  -webkit-font-smoothing:antialiased;
}
button{font-family:inherit;font-size:inherit;cursor:pointer;}
input,select,textarea{font-family:inherit;font-size:inherit;color:var(--text);}
a{color:var(--accent);text-decoration:none;}
::-webkit-scrollbar{width:10px;height:10px;}
::-webkit-scrollbar-thumb{background:#cfd8e3;border-radius:6px;border:2px solid var(--bg);}
::-webkit-scrollbar-thumb:hover{background:#b6c2d1;}
::-webkit-scrollbar-track{background:transparent;}

/* ---- 应用骨架：CSS Grid 228px 1fr ----------------------------------------*/
.app{
  display:grid;
  grid-template-columns:var(--sidebar-w) 1fr;
  height:100vh;
  overflow:hidden;
}

/* ---- 侧栏 ----------------------------------------------------------------*/
.sidebar{
  background:var(--brand);
  color:#e8eef7;
  display:flex; flex-direction:column;
  min-height:0;
}
.sidebar .logo{
  height:var(--topbar-h);
  display:flex; align-items:center; gap:9px;
  padding:0 18px;
  font-weight:700; letter-spacing:.5px; font-size:14px;
  color:#fff;
  border-bottom:1px solid rgba(255,255,255,.08);
  flex:0 0 auto;
  white-space:nowrap;
}
.sidebar .logo .badge{
  display:inline-flex;align-items:center;justify-content:center;
  width:22px;height:22px;border-radius:6px;
  background:var(--accent);color:#fff;font-size:13px;font-weight:700;
}
.sidebar .logo small{display:block;font-size:10px;font-weight:400;opacity:.7;letter-spacing:1.2px;}
.sidebar .nav{flex:1 1 auto;overflow:auto;padding:10px 0;}
.sidebar .nav-item{
  position:relative;
  display:flex;align-items:center;gap:10px;
  height:40px;padding:0 18px 0 15px;
  color:#cdd9ea;cursor:pointer;user-select:none;
  font-size:14px;white-space:nowrap;
  border-left:3px solid transparent;
}
.sidebar .nav-item .ico{width:18px;text-align:center;font-size:14px;}
.sidebar .nav-item:hover{background:rgba(255,255,255,.06);color:#fff;}
.sidebar .nav-item.active{
  background:var(--sel-bg);
  color:var(--brand);font-weight:600;
  border-left-color:var(--orange);
}
.sidebar .nav-item .cnt{
  margin-left:auto;font-size:12px;color:inherit;opacity:.7;
  font-variant-numeric:tabular-nums;
}
.sidebar .side-foot{
  flex:0 0 auto;padding:10px 12px;border-top:1px solid rgba(255,255,255,.08);
  display:flex;flex-direction:column;gap:6px;
}
.sidebar .side-btn{
  display:flex;align-items:center;gap:8px;
  height:32px;padding:0 10px;border-radius:6px;
  background:rgba(255,255,255,.06);color:#dbe5f2;border:none;
  font-size:13.5px;text-align:left;
}
.sidebar .side-btn:hover{background:rgba(255,255,255,.13);color:#fff;}

/* ---- 主列 + 顶栏 ---------------------------------------------------------*/
.main-col{display:flex;flex-direction:column;min-width:0;min-height:0;}
.topbar{
  height:var(--topbar-h);flex:0 0 auto;
  background:var(--card);
  border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:14px;
  padding:0 22px;
}
.topbar .tb-title{font-size:16px;font-weight:600;color:var(--brand);display:flex;align-items:center;gap:8px;}
.topbar .tb-spacer{flex:1 1 auto;}
.topbar .tb-search{
  position:relative;
}
.topbar .tb-search input{
  width:240px;height:32px;border:1px solid var(--line);border-radius:16px;
  padding:0 14px 0 32px;background:#f8fafc;outline:none;
}
.topbar .tb-search input:focus{border-color:var(--accent);background:#fff;}
.topbar .tb-search .mag{position:absolute;left:11px;top:7px;color:var(--muted2);font-size:14px;}
.topbar .tb-meta{color:var(--muted);font-size:13px;white-space:nowrap;}
.topbar .tb-icon{
  width:32px;height:32px;border-radius:8px;border:1px solid var(--line);
  background:#fff;color:var(--muted);display:inline-flex;align-items:center;justify-content:center;
  font-size:15px;
}
.topbar .tb-icon:hover{border-color:var(--accent);color:var(--accent);}

main#view{flex:1 1 auto;overflow:auto;padding:22px 26px 60px;min-height:0;}

/* ---- 卡片 / 标题 ---------------------------------------------------------*/
.card{
  background:var(--card);border-radius:var(--radius);
  box-shadow:var(--shadow);border:1px solid var(--line);
}
.view-head{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;}
.view-head h1{margin:0;font-size:17px;font-weight:600;color:var(--brand);}
.view-head .count{color:var(--muted);font-size:14px;font-weight:400;}
.view-head .sp{flex:1 1 auto;}

/* 按钮 */
.btn{
  height:32px;padding:0 14px;border-radius:6px;border:1px solid var(--line);
  background:#fff;color:var(--text);display:inline-flex;align-items:center;gap:6px;
  font-size:13.5px;white-space:nowrap;
}
.btn:hover{border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.btn.primary:hover{background:#2563a0;color:#fff;}
.btn.ghost{background:transparent;}
.btn.danger{color:var(--red);}
.btn.danger:hover{border-color:var(--red);color:var(--red);background:#fff5f5;}
.btn.sm{height:26px;padding:0 10px;font-size:13px;}

/* 已筛选态提示条 */
.filter-bar{
  display:none;align-items:center;gap:8px;
  margin:-6px 0 12px;padding:7px 12px;border-radius:6px;
  background:#fff7ed;border:1px solid #fde3bd;color:#9a5b06;font-size:13.5px;
}
.filter-bar.on{display:flex;}
.filter-bar .x{cursor:pointer;font-weight:700;}

/* ---- 表格容器 ------------------------------------------------------------*/
.table-card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--line);overflow:hidden;}
.table-toolbar{
  display:flex;align-items:center;gap:10px;
  padding:12px 16px;border-bottom:1px solid var(--line);
}
.table-toolbar .sp{flex:1 1 auto;}
.table-wrap{overflow:auto;max-height:calc(100vh - 250px);}
/* R7 金额汇总条：表格与页脚之间，随筛选联动 */
.money-sum{
  display:flex;align-items:center;gap:18px;flex-wrap:wrap;
  padding:8px 16px;border-top:1px solid var(--line);background:#f8fafd;
  font-size:13.5px;color:var(--muted);
}
.money-sum .ms-cap{color:var(--brand);font-weight:600;letter-spacing:.2px;}
.money-sum .ms-item{white-space:nowrap;}
.money-sum .ms-item b{font-weight:600;color:var(--brand);font-size:14px;font-variant-numeric:tabular-nums;}
.money-sum .ms-sep{color:#cbd5e1;margin:0 2px;}

/* 契约 30（R32）：金额表尾合计行 —— 与列共用 colgroup，天然对齐到对应金额列下方 */
table.grid-table tfoot.grid-foot td{
  position:sticky;bottom:0;z-index:3;
  background:#f2f7fe;border-top:2px solid #c7d7ee;
  font-weight:700;color:var(--brand);
  font-variant-numeric:tabular-nums;
}
/* 冻结列在表尾同样左吸附；层级要高于正文冻结格（z-index:2）与普通表尾格 */
table.grid-table tfoot.grid-foot td.col-frozen,
table.grid-table tfoot.grid-foot td.col-frozen-expander{z-index:6;background:#eaf2fd;}

/* 契约 30（R32）：拖选金额列求和浮窗（只读展示，不拦截鼠标） */
.sel-sum-pop{
  position:fixed;z-index:60;
  min-width:150px;max-width:320px;
  padding:8px 10px;border:1px solid #c7d7ee;border-radius:8px;
  background:#fff;box-shadow:0 6px 20px rgba(15,44,87,.18);
  font-size:13px;pointer-events:none;
}
.sel-sum-pop[hidden]{display:none;}
.sel-sum-pop .ssp-h{color:var(--muted);font-size:12.5px;margin-bottom:4px;}
.sel-sum-pop .ssp-h b{color:var(--brand);}
.sel-sum-pop .ssp-row{display:flex;align-items:baseline;gap:6px;line-height:1.6;}
.sel-sum-pop .ssp-k{color:var(--muted);flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sel-sum-pop .ssp-v{font-weight:700;color:var(--brand);font-variant-numeric:tabular-nums;}
.sel-sum-pop .ssp-u{color:var(--muted2);font-size:12px;}

.table-foot{
  display:flex;align-items:center;gap:14px;
  padding:9px 16px;border-top:1px solid var(--line);color:var(--muted);font-size:13px;
}

table.grid-table{
  border-collapse:separate;border-spacing:0;
  table-layout:fixed;
  width:100%;
  font-size:var(--fs-table);
}
table.grid-table th,table.grid-table td{
  border-bottom:1px solid var(--line);
  border-right:1px solid var(--line);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  vertical-align:middle;
}
table.grid-table th:last-child,table.grid-table td:last-child{border-right:none;}

/* 表头：深蓝底白字 34px，位置吸附 */
table.grid-table thead th{
  height:var(--th-h);
  background:var(--brand);color:#fff;font-weight:600;
  font-size:12.5px;   /* R30：表头是小标签，比数据行(13px)小半号，避免窄列截断 */
  padding:0 10px;position:sticky;top:0;z-index:3;
  user-select:none;
}
table.grid-table thead th .th-inner{display:flex;align-items:center;gap:6px;height:100%;}
table.grid-table thead th .th-label{
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;flex:1 1 auto;
}
table.grid-table thead th .th-sort{font-size:11px;opacity:.9;min-width:9px;}
table.grid-table thead th .th-filter{
  flex:0 0 auto;width:18px;height:18px;border-radius:4px;border:none;background:transparent;
  color:#cdd9ea;display:inline-flex;align-items:center;justify-content:center;font-size:11px;
}
table.grid-table thead th .th-filter:hover{background:rgba(255,255,255,.18);color:#fff;}
table.grid-table thead th.filtered{background:#0f2c57;}
table.grid-table thead th.filtered .th-filter{color:var(--orange);font-size:14px;}
/* 契约 07 §2.4：单击排序后列头高亮（▲/▼ 指示保留） */
table.grid-table thead th.sorted{background:#12406f;}
table.grid-table thead th.sorted .th-sort{color:var(--orange);opacity:1;font-weight:700;}
table.grid-table thead th.drag-over{outline:2px solid var(--orange);outline-offset:-2px;}
table.grid-table thead th.dragging{opacity:.5;}
table.grid-table thead th .col-resize{
  position:absolute;top:0;right:0;width:12px;height:100%;cursor:col-resize;z-index:4;
}
/* R40：把手 hover 竖线提示 —— 此前 8px 窄条无任何视觉反馈，用户按偏 1~2px 即误触排序 */
table.grid-table thead th .col-resize:hover{
  background:linear-gradient(90deg,transparent 0,transparent 4px,rgba(255,255,255,.9) 4px,rgba(255,255,255,.9) 6px,transparent 6px);
}
/* TM-15 ①：默认**锁定列宽**（列宽按字段类型默认值定型，首次打开就整齐）。
   未开启「允许拖拽列宽」时：把手不接鼠标、不改光标、不出 hover 竖线 —— 表头回归纯排序区。
   （把手元素本身仍留在 DOM 里：DOM 结构 / 契约计数零变化；开启态只加 body 类名。） */
body:not(.md-coldrag-on) table.grid-table thead th .col-resize{pointer-events:none;cursor:default;}
body:not(.md-coldrag-on) table.grid-table thead th .col-resize:hover{background:none;}
table.grid-table thead th{position:sticky;}

/* 行：高度随密度（--row-h：标准 36px / 紧凑 28px，TM-15 ①） */
table.grid-table tbody td{
  height:var(--row-h);max-height:var(--row-h);
  padding:0 10px;color:var(--text);
}
/* TM-15 ①：极淡斑马纹 —— 只给普通数据行（.row-alt 由 renderRow 按**数据行序号**打，
   不用 nth-of-type：展开行是独立 tr，会把后续行的奇偶整体错位）。
   必须写在 hover / row-flag / 到期分档 之前，让它们的既有优先级与顺序不变。 */
table.grid-table tbody tr.row-alt td{background:#fbfcfe;}
table.grid-table tbody tr:hover td{background:#f8fafc;}
table.grid-table tbody tr.row-flag td{background:#fef2f2;}
table.grid-table tbody tr.row-flag:hover td{background:#fde8e8;}
/* 全局搜索命中高亮 */
table.grid-table tbody tr.flash-row td{background:#fff7ed !important;box-shadow:inset 0 0 0 1px #fde3bd;}

/* 单元格内容包裹：截断 + 悬停 title */
table.grid-table td .cell{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;}
td.center{text-align:center;}

/* R40 视觉 A 档：表头与内容同轴 —— 此前 th 未设 text-align，UA 默认居中，与内容的左/右对齐打架；
   文本列一律左对齐，数字列（.num，金额/比例等可加总的量）保持右对齐。须置于 .num 规则之后以胜出。 */
table.grid-table thead th{text-align:left;}
table.grid-table thead th.num{text-align:right;}

/* R40 视觉 C 档：首数据列 = 行主角（实体名），加重字重建立视线锚点（数据列从第 2 个 td 起，第 1 个是展开列） */
table.grid-table tbody td.data-cell:nth-child(2){font-weight:600;}

/* R40 视觉 A 档：数字列空值显示淡色「—」（纯 CSS 伪元素，不进 DOM —— 复制/导出内容仍是空） */
table.grid-table tbody td.num .cell:empty::before{content:'—';color:#b9c4d4;}
/* TM-15 ①：空值统一呈现 —— 所有数据格都显示淡色「—」（原先只有数字列有）。
   同样是伪元素：DOM 里仍是空 span，复制 / 导出 / 求和一律不受影响。 */
table.grid-table tbody td.data-cell .cell:empty::before{content:'—';color:#b9c4d4;font-weight:400;}

/* 行首展开三角 */
td.row-expander,th.row-expander{width:30px;min-width:30px;max-width:30px;text-align:center;cursor:pointer;color:var(--muted);}
td.row-expander .tri{display:inline-block;transition:transform .12s;font-size:11px;}
tr.expanded td.row-expander .tri{transform:rotate(90deg);color:var(--accent);}

/* 行操作列 */
td.row-ops,th.row-ops{width:74px;min-width:74px;max-width:74px;text-align:center;}
td.row-ops .op{color:var(--muted2);cursor:pointer;padding:0 5px;font-size:14px;}
td.row-ops .op:hover{color:var(--accent);}
td.row-ops .op.del:hover{color:var(--red);}

/* 展开详情行 */
tr.expand-row > td{
  height:auto;max-height:none;white-space:normal;
  background:#f7fafd;padding:14px 18px;border-bottom:1px solid var(--line);
}
.expand-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));
  gap:8px 22px;margin-bottom:10px;
}
.expand-grid .pair{display:flex;gap:8px;font-size:13.5px;line-height:1.5;}
.expand-grid .pair .k{color:var(--muted);flex:0 0 auto;min-width:74px;}
.expand-grid .pair .v{color:var(--text);word-break:break-all;}
.expand-grid .pair.full{grid-column:1 / -1;}
.expand-grid .pair.full .v{white-space:pre-wrap;background:#fff;border:1px solid var(--line);border-radius:6px;padding:6px 9px;}
.expand-assoc{display:flex;gap:16px;flex-wrap:wrap;align-items:center;margin-top:4px;padding-top:10px;border-top:1px dashed var(--line);}
.expand-assoc .a{color:var(--muted);font-size:13.5px;}
.expand-assoc .a b{color:var(--accent);}
.expand-assoc .sp{flex:1 1 auto;}

/* ---- tag 标签 ------------------------------------------------------------*/
.tag{
  display:inline-block;padding:1px 8px;border-radius:10px;font-size:12.5px;line-height:17px;
  color:#fff;background:var(--gray);max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;
}
.tag.soft{background:#eef2f7;color:var(--muted);}
.muted{color:var(--muted);}
.dim{opacity:.6;}
.empty{color:var(--muted2);}

/* 公司名链接 */
.company-link{color:var(--accent);cursor:pointer;}
.company-link:hover{text-decoration:underline;}

/* ---- 行内编辑控件（恒定 26px，不撑行） -----------------------------------*/
td.editing{background:#eef6ff !important;padding:4px 6px;}
.cell-input{
  width:100%;height:var(--edit-h);border:1px solid var(--accent);border-radius:5px;
  padding:0 6px;outline:none;background:#fff;box-sizing:border-box;
}
select.cell-input{padding:0 2px;}
.cell-input.mini{font-size:12.5px;}

/* ---- 浮层（长文本编辑 / 筛选面板）挂 body，position:fixed ------------- */
.float-layer{position:fixed;z-index:2000;}
.float-textarea{
  background:#fff;border-radius:8px;box-shadow:0 10px 30px rgba(15,23,42,.22);
  border:1px solid var(--line);padding:12px;display:flex;flex-direction:column;gap:10px;
}
.float-textarea textarea{
  width:100%;min-height:150px;resize:both;border:1px solid var(--line);border-radius:6px;
  padding:8px 10px;outline:none;line-height:1.5;
}
.float-textarea textarea:focus{border-color:var(--accent);}
.float-textarea .fa-actions{display:flex;justify-content:flex-end;gap:8px;}
.float-textarea .fa-hint{font-size:12.5px;color:var(--muted2);}

/* ---- 筛选面板 ------------------------------------------------------------*/
.filter-panel{
  width:272px;max-height:440px;display:flex;flex-direction:column;
  background:#fff;border-radius:10px;box-shadow:0 12px 32px rgba(15,23,42,.20);
  border:1px solid var(--line);overflow:hidden;
}
.filter-panel .fp-head{display:flex;align-items:center;gap:8px;padding:10px 12px 0;}
.filter-panel .fp-head .fp-title{flex:1 1 auto;font-size:13.5px;font-weight:600;color:var(--brand);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.filter-panel .fp-head .fp-live{flex:0 0 auto;font-size:11.5px;color:#0d9488;background:#e6f5f1;
  border-radius:8px;padding:1px 7px;}
.filter-panel .fp-search{padding:8px 10px;border-bottom:1px solid var(--line);}
.filter-panel .fp-search input{
  width:100%;height:28px;border:1px solid var(--line);border-radius:6px;padding:0 8px;outline:none;
}
.filter-panel .fp-search input:focus{border-color:var(--accent);}
.filter-panel .fp-all{display:flex;align-items:center;gap:8px;padding:7px 12px;border-bottom:1px solid var(--line);font-size:13.5px;color:var(--muted);}
.filter-panel .fp-list{overflow:auto;flex:1 1 auto;padding:4px 0;min-height:60px;}
.filter-panel .fp-item{display:flex;align-items:center;gap:8px;padding:5px 12px;font-size:13.5px;cursor:pointer;}
.filter-panel .fp-item:hover{background:#f0f6fd;}
.filter-panel .fp-item input[type=checkbox]{accent-color:var(--accent);width:14px;height:14px;flex:0 0 auto;margin:0;}
.filter-panel .fp-item .fp-val{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.filter-panel .fp-item .fp-cnt{color:var(--muted2);font-size:12px;font-variant-numeric:tabular-nums;}
/* 契约 13 前置小修：声明值域里当前无数据的项（计数 0）置灰，仍可勾选 */
.filter-panel .fp-item.zero .fp-val,.filter-panel .fp-item.zero .fp-cnt{opacity:.45;}
.filter-panel .fp-range{padding:12px;display:flex;flex-direction:column;gap:10px;}
.filter-panel .fp-range .rr{display:flex;align-items:center;gap:8px;}
.filter-panel .fp-range input{width:100%;height:28px;border:1px solid var(--line);border-radius:6px;padding:0 8px;}
/* 契约 23 §2：选项直选（值域小基数的类别型数字列，如「签单年份」）—— 平铺按钮、多选、无勾选框 */
.filter-panel .fp-opts{display:flex;flex-wrap:wrap;gap:7px;padding:10px 12px;overflow:auto;flex:1 1 auto;
  min-height:56px;align-content:flex-start;}
.filter-panel .fp-opt{
  border:1px solid var(--line);background:#f8fafc;color:var(--text);border-radius:14px;
  padding:4px 13px;font-size:13.5px;line-height:1.5;font-variant-numeric:tabular-nums;
  transition:background .12s,border-color .12s,color .12s;
}
.filter-panel .fp-opt:hover{background:#eef4fc;border-color:#cfe0f5;}
.filter-panel .fp-opt.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600;}
.filter-panel .fp-actions{display:flex;justify-content:space-between;align-items:center;gap:8px;
  padding:8px 12px;border-top:1px solid var(--line);}
.filter-panel .fp-actions .fp-hint{font-size:12px;color:var(--muted2);}
.filter-panel .fp-empty{color:var(--muted2);font-size:13px;padding:14px 12px;text-align:center;}

/* ---- 遮罩 / 弹窗 / 抽屉 --------------------------------------------------*/
.scrim{position:fixed;inset:0;background:rgba(15,23,42,.34);z-index:1500;display:flex;}
.scrim.center{align-items:center;justify-content:center;}

.modal{
  background:#fff;border-radius:10px;box-shadow:0 20px 50px rgba(15,23,42,.3);
  width:min(880px,92vw);max-height:88vh;display:flex;flex-direction:column;overflow:hidden;
}
.modal.sm{width:min(460px,92vw);}
.modal-head{display:flex;align-items:center;gap:10px;padding:16px 20px;border-bottom:1px solid var(--line);}
.modal-head h2{margin:0;font-size:15px;color:var(--brand);font-weight:600;}
.modal-head .sp{flex:1 1 auto;}
.modal-head .x{cursor:pointer;color:var(--muted);font-size:18px;line-height:1;border:none;background:transparent;}
.modal-body{padding:18px 20px;overflow:auto;}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--line);background:#fbfcfe;}

.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 18px;}
.form-grid .fld{display:flex;flex-direction:column;gap:5px;min-width:0;}
.form-grid .fld.full{grid-column:1 / -1;}
.form-grid .fld label{font-size:13px;color:var(--muted);}
.form-grid .fld .req{color:var(--red);}
.form-grid .fld input,.form-grid .fld select{
  height:32px;border:1px solid var(--line);border-radius:6px;padding:0 10px;outline:none;background:#fff;
}
.form-grid .fld textarea{
  min-height:90px;border:1px solid var(--line);border-radius:6px;padding:8px 10px;outline:none;resize:vertical;line-height:1.5;
}
.form-grid .fld input:focus,.form-grid .fld select:focus,.form-grid .fld textarea:focus{border-color:var(--accent);}
.form-grid .fld.readonly input{background:#f4f6fa;color:var(--muted);}
.form-grid .fld .note{font-size:12px;color:var(--muted2);}
.form-sec{margin:6px 0 12px;font-size:13.5px;color:var(--brand);font-weight:600;border-left:3px solid var(--accent);padding-left:8px;}

/* ---- 抽屉（客户 360° / 调研定义 / KPI 明细） ------------------------------*/
/* R11 视觉分层：正文改用「浅灰画布 + 白色卡片区块」两级层次 ——
   头部（白底 + 品牌色下边线）/ 区块卡片（左色条标题）/ 行卡片（浅蓝灰）。
   区块之间靠 12px 间距 + 卡片阴影区隔，不再靠加粗标题硬分。 */
.drawer-scrim{position:fixed;inset:0;background:rgba(15,23,42,.22);z-index:1600;}
.drawer{
  position:fixed;top:0;right:0;height:100vh;width:var(--drawer-w);max-width:96vw;
  background:#f6f8fc;box-shadow:-10px 0 34px rgba(15,23,42,.22);z-index:1601;
  display:flex;flex-direction:column;
  animation:drawer-in .16s ease-out;
}
@keyframes drawer-in{from{transform:translateX(24px);opacity:.6;}to{transform:none;opacity:1;}}
.drawer-head{padding:16px 20px 14px;background:#fff;flex:0 0 auto;position:relative;z-index:1;
  border-bottom:1px solid var(--line);}
.drawer-head::after{content:"";position:absolute;left:0;bottom:-1px;height:2px;width:100%;
  background:linear-gradient(90deg,var(--brand),var(--accent) 42%,rgba(46,117,182,0) 88%);}
.drawer-head .dh-top{display:flex;align-items:flex-start;gap:10px;}
.drawer-head h2{margin:0;font-size:15.5px;color:var(--brand);font-weight:600;line-height:1.35;flex:1 1 auto;}
.drawer-head .x{cursor:pointer;color:var(--muted);font-size:19px;border:none;background:transparent;line-height:1;}
.drawer-head .dsub{color:var(--muted);font-size:13px;margin-top:6px;display:flex;gap:10px;flex-wrap:wrap;align-items:center;}
/* TM-31：抽屉头「顾问条」—— 归属/协作显性前置（用户 10-23 点名要的位置） */
.dadv{margin-top:9px;display:flex;gap:14px;flex-wrap:wrap;align-items:center;}
.dadv .dadv-i{display:inline-flex;gap:6px;align-items:center;font-size:13px;}
.dadv .lbl{color:var(--muted);}
.dadv .tag{max-width:180px;}
.dadv .empty{font-size:12.5px;}

.drawer-body{flex:1 1 auto;overflow:auto;padding:14px 16px 26px;}
/* 区块 = 白色卡片 */
.dsec{margin-top:12px;background:#fff;border:1px solid var(--line);border-radius:10px;
  padding:12px 14px 14px;box-shadow:0 1px 2px rgba(15,23,42,.045);}
.dsec:first-child{margin-top:0;}
.dsec .dsec-h{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--brand);
  font-weight:600;margin-bottom:10px;padding-bottom:8px;border-bottom:1px dashed var(--line);}
.dsec .dsec-h .dsec-t{display:inline-flex;align-items:center;gap:6px;position:relative;padding-left:10px;}
.dsec .dsec-h .dsec-t::before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);
  width:3px;height:13px;border-radius:2px;background:linear-gradient(180deg,var(--accent),var(--brand));}
.dsec .dsec-h .n{color:var(--muted);font-weight:400;}
.dsec .dsec-h .sp{flex:1 1 auto;}
/* 区块标题右侧「＋ 快速新增」（R11：抽屉内直接建子表记录） */
.dsec-add{flex:0 0 auto;width:20px;height:20px;line-height:1;border-radius:6px;cursor:pointer;
  border:1px solid #cfe0f5;background:#f2f7fe;color:var(--accent);font-size:14px;font-weight:700;
  display:inline-flex;align-items:center;justify-content:center;padding:0;
  transition:background .12s,border-color .12s,color .12s,transform .12s;}
.dsec-add:hover{background:var(--accent);border-color:var(--accent);color:#fff;transform:translateY(-1px);}
.dsec-add:active{transform:none;}
.dkv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px 14px;}
.dkv .pair{display:flex;gap:8px;font-size:13.5px;}
.dkv .pair .k{color:var(--muted);min-width:64px;}
.dkv .pair .v{word-break:break-all;}
/* TM-23：客户「协作顾问」chips —— 独立 wrap 容器，人多时换行而不撑破右侧抽屉两列 */
.dkv .pair-collab .v{display:flex;flex-wrap:wrap;gap:4px;min-width:0;}
.dkv .pair-collab .tag{max-width:100%;}
/* 行 = 卡片内的小条目 */
.drow{padding:8px 10px;border:1px solid #e7eef8;border-radius:8px;margin-bottom:7px;background:#f7fafd;}
.drow:last-child{margin-bottom:0;}
.drow .r1{display:flex;align-items:center;gap:8px;font-size:13.5px;}
.drow .r1 .sp{flex:1 1 auto;}
.drow .r2{color:var(--muted);font-size:12.5px;margin-top:3px;display:flex;gap:14px;flex-wrap:wrap;}
.dgroup-label{font-size:12px;color:var(--muted2);margin:6px 0 4px;letter-spacing:.4px;}
.d-empty{color:var(--muted2);font-size:13px;padding:8px 0;}

/* ---- R12：抽屉备注（点击即编辑）+ 沟通记录（就地记一笔） ------------------*/
.note-block{margin-top:10px;border:1px solid #e7eef8;border-radius:8px;background:#f7fafd;overflow:hidden;}
.note-view{position:relative;padding:8px 10px 8px 58px;font-size:13.5px;line-height:1.6;
  min-height:34px;cursor:text;transition:background .15s ease;}
.note-view:hover{background:#eff5fc;}
.note-view:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}
.note-label{position:absolute;left:10px;top:8px;color:var(--muted);font-size:12.5px;letter-spacing:.3px;}
.note-text{color:var(--text);word-break:break-word;}
.note-hint{color:var(--muted2);}
.note-edit{padding:8px;}
.note-input,.cform-text{width:100%;border:1px solid #dbe4f0;border-radius:6px;padding:7px 8px;
  font:inherit;font-size:13.5px;line-height:1.5;resize:vertical;background:#fff;color:var(--text);}
.note-input:focus,.cform-text:focus{outline:none;border-color:var(--accent);
  box-shadow:0 0 0 2px rgba(46,117,182,.15);}
.note-actions,.cform-actions{display:flex;align-items:center;gap:8px;margin-top:6px;}
.note-tip{color:var(--muted2);font-size:12px;margin-right:auto;}

/* 沟通记录：就地记录框（虚线框 = 可写区，与只读条目区分） */
.cform{border:1px dashed #c7d6ea;border-radius:8px;padding:8px;margin-bottom:10px;background:#f8fbff;}
.cform-top{display:flex;align-items:center;gap:8px;margin-bottom:6px;}
.cform-method{border:1px solid #dbe4f0;border-radius:6px;padding:3px 6px;font:inherit;font-size:13px;
  background:#fff;color:var(--text);cursor:pointer;}
.cform-method:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,117,182,.15);}
.cform-when{color:var(--muted2);font-size:12.5px;}
.cform-date{border:1px solid #dbe4f0;border-radius:6px;padding:3px 6px;font:inherit;font-size:13px;
  background:#fff;color:var(--text);font-variant-numeric:tabular-nums;}
.cform-date:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,117,182,.15);}
.drow .r1 .rel{color:var(--muted2);font-size:12px;font-weight:400;}

/* R15：客户画像（抽屉顶部第一块）——业务情况 + 摘要 + 决策链（含联系人备注） */
.dsec-profile{border-left:3px solid var(--accent);}
.pf-biz{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:10px;}
.pf-item{background:#f8fafc;border:1px solid var(--line);border-radius:6px;padding:7px 10px;}
.pf-k{display:block;font-size:12.5px;color:var(--muted2);margin-bottom:2px;}
.pf-v{font-size:14.5px;color:var(--text);font-weight:600;}
.pf-v.empty{color:var(--muted2);font-weight:400;}
.pf-sum{display:flex;flex-wrap:wrap;gap:5px 16px;font-size:13.5px;color:var(--muted);}
.pf-sum-i b{color:var(--brand);font-weight:600;}
/* R20：客户档案 —— 经营规模就近录入（数字输入 + 单位下拉）与档案属性小节 */
.pf-biz{grid-template-columns:1fr 1fr;}
.pf-edit-row{display:flex;align-items:center;gap:6px;}
.pf-num{
  flex:1 1 auto;min-width:0;height:27px;border:1px solid var(--line);border-radius:5px;padding:0 8px;
  font-size:14.5px;font-weight:600;color:var(--text);background:#fff;outline:none;
  font-variant-numeric:tabular-nums;
}
.pf-num::placeholder{font-weight:400;color:var(--muted2);}
.pf-num:focus{border-color:var(--accent);box-shadow:0 0 0 2px #dbeafe;}
.pf-unit{
  flex:0 0 auto;height:27px;border:1px solid var(--line);border-radius:5px;padding:0 2px;
  font-size:13px;color:var(--muted);background:#fff;outline:none;cursor:pointer;
}
.pf-unit:focus{border-color:var(--accent);}
.pf-sub{display:block;font-size:12px;color:var(--muted2);margin-top:3px;}
.pf-sub-h{
  font-size:12.5px;font-weight:600;color:var(--brand);margin:10px 0 6px;
  padding-top:9px;border-top:1px dashed var(--line);
}
.chain-h{display:flex;align-items:center;gap:6px;margin:12px 0 2px;border-top:1px dashed var(--line);padding-top:10px;}
.chain-h .n{color:var(--muted2);font-size:13px;}
.chain-g{display:flex;align-items:center;gap:8px;margin:9px 0 3px;}
.chain-role{font-size:12.5px;font-weight:600;color:#fff;background:var(--accent);border-radius:10px;padding:1px 9px;}
.chain-n{font-size:12.5px;color:var(--muted2);}
.chain-row{border-left:2px solid #e2e8f0;padding-left:9px;}
.chain-title{font-size:13px;color:var(--muted);margin-left:6px;}
.cnote{margin-top:5px;}
.cnote-view{display:block;font-size:13px;color:var(--muted);cursor:text;border-radius:4px;padding:2px 4px;}
.cnote-view:hover{background:#f1f6fc;}
.cnote-view:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}
.cnote-label{color:var(--muted2);font-size:12.5px;margin-right:6px;}
.cnote-hint{color:var(--muted2);font-style:italic;}
.cnote-text{color:var(--text);word-break:break-word;}
.cnote-edit{display:block;margin-top:3px;}
.cnote-view[hidden],.cnote-edit[hidden]{display:none;}   /* 修：显式 display 会压过 hidden 属性 */
.cnote-input{width:100%;box-sizing:border-box;border:1px solid #dbe4f0;border-radius:6px;padding:6px 8px;
  font:inherit;font-size:13.5px;line-height:1.5;resize:vertical;background:#fff;color:var(--text);}
.cnote-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,117,182,.15);}
.cnote-actions{display:flex;align-items:center;gap:8px;margin-top:5px;}

/* ---- R21：抽屉子列表「点一下跳到对应模块」+ 决策链联系人就地编辑 ------------*/
.drow.dlink{cursor:pointer;transition:border-color .12s,background .12s,box-shadow .12s;}
.drow.dlink:hover{border-color:var(--brand);background:#fff;box-shadow:0 1px 6px rgba(46,117,182,.10);}
.drow.dlink:hover .r1 b{color:var(--brand);}
.drow.dlink .go{color:var(--accent);font-size:12.5px;opacity:0;transition:opacity .12s;white-space:nowrap;}
.drow.dlink:hover .go,.drow.dlink:focus-within .go{opacity:1;}

.chain-row .cbtn{opacity:.45;transition:opacity .12s;border:1px solid transparent;background:transparent;
  color:var(--muted);cursor:pointer;font-size:12.5px;line-height:1;padding:3px 6px;border-radius:5px;white-space:nowrap;}
.chain-row:hover .cbtn,.chain-row:focus-within .cbtn{opacity:1;}
.chain-row .cbtn:hover{background:#eef4fc;border-color:#d6e3f5;color:var(--brand);}
.chain-row.editing{border-color:var(--accent);background:#fff;box-shadow:0 0 0 2px rgba(46,117,182,.12);}

.cedit{margin-top:6px;border-top:1px dashed var(--line);padding-top:7px;}
.cedit[hidden]{display:none;}   /* 成对写：显式 display 会压过 hidden 属性（R15 老教训） */
.cedit-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 12px;}
.cedit-grid .cf{display:flex;align-items:center;gap:6px;font-size:13px;}
.cedit-grid .cf-k{flex:0 0 70px;color:var(--muted2);font-size:12.5px;text-align:right;}
.cedit-grid .ci{flex:1 1 auto;min-width:0;box-sizing:border-box;border:1px solid #dbe4f0;border-radius:6px;
  padding:5px 7px;font:inherit;font-size:13.5px;background:#fff;color:var(--text);}
.cedit-grid .ci:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,117,182,.15);}
.cedit-actions{display:flex;align-items:center;gap:8px;margin-top:7px;justify-content:flex-end;}
.cedit-actions .note-tip{margin-right:auto;}

/* R13：沟通记录单条 —— 悬停显现 ✎/✕，双击整行就地进编辑 */
.drow .vtools{display:inline-flex;gap:2px;margin-left:6px;opacity:0;transition:opacity .12s;}
.drow.vrow:hover .vtools,.drow.vrow:focus-within .vtools{opacity:1;}
.drow.vrow{cursor:default;}
.vtool{border:1px solid transparent;background:transparent;color:var(--muted);cursor:pointer;
  font-size:13px;line-height:1;padding:3px 5px;border-radius:5px;}
.vtool:hover{background:#eef4fc;border-color:#d6e3f5;color:var(--brand);}
.vtool.danger:hover{background:#fdeaea;border-color:#f6cfcf;color:#c0392b;}
.drow.vrow.editing{border-color:var(--accent);background:#fff;box-shadow:0 0 0 2px rgba(46,117,182,.12);}
.drow .cform.vedit{margin:0;border-style:solid;border-color:#dbe4f0;background:#fff;padding:7px;}

/* ---- 仪表盘 --------------------------------------------------------------*/
/* 契约 09 §3.6（R7）：等高等宽（grid-auto-rows:1fr）；响应式列数见下方媒体查询。 */
.kpi-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:1fr;gap:14px;margin-bottom:18px;}
.kpi{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:15px 16px;min-height:92px;}
.kpi .k-label{color:var(--muted);font-size:13px;display:flex;align-items:center;gap:6px;}
.kpi .k-val{font-size:28px;font-weight:700;color:var(--text);margin-top:8px;font-variant-numeric:tabular-nums;line-height:1.1;}
.kpi .k-val small{font-size:13px;font-weight:500;color:var(--muted);margin-left:3px;}
.kpi .k-sub{color:var(--muted2);font-size:12px;margin-top:4px;}

.panel-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:18px;}
#wb-grid.panel-grid{grid-template-columns:repeat(2,minmax(0,1fr));}  /* 契约 21：工作台四区块 2×2 排布 */
.panel{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);display:flex;flex-direction:column;overflow:hidden;}
.panel .p-head{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--line);font-size:14px;font-weight:600;color:var(--brand);}
.panel .p-head .sp{flex:1 1 auto;}
.panel .p-head .n{color:var(--muted);font-weight:400;font-size:13px;}
.panel .p-body{padding:6px 0;overflow:auto;max-height:300px;}
.panel .p-row{display:flex;align-items:center;gap:10px;padding:7px 14px;font-size:13.5px;border-bottom:1px solid #f6f8fb;}
.panel .p-row:last-child{border-bottom:none;}
.panel .p-row .sp{flex:1 1 auto;}
.panel .p-row .sub{color:var(--muted2);font-size:12.5px;}
.panel .p-empty{padding:22px 14px;text-align:center;color:var(--muted2);font-size:13px;}

/* ---- 图表（自绘 SVG） ----------------------------------------------------*/
.chart-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;}
.chart-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px 16px;}
.chart-card h3{margin:0 0 8px;font-size:14px;color:var(--brand);font-weight:600;}
.chart-card svg{display:block;width:100%;height:190px;}
.chart-legend{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px;font-size:12.5px;color:var(--muted);}
.chart-empty{height:190px;display:flex;align-items:center;justify-content:center;color:var(--muted2);font-size:13px;}

/* ---- 契约 07 §2.5：统一图例样式（参调模块图例 §3.5 与 charts.js 图例共用同一套规则） ---- */
.legend-box{display:flex;flex-wrap:wrap;gap:14px;align-items:center;padding:8px 12px;font-size:13px;color:var(--muted);border:1px solid var(--line);border-radius:8px;background:var(--panel,#fff);}
.legend-item,.chart-legend .lg{display:inline-flex;align-items:center;gap:5px;}
.legend-dot,.chart-legend .dot{width:9px;height:9px;border-radius:2px;display:inline-block;flex:0 0 auto;}
.legend-sep{color:var(--muted2);}

/* ---- 列管理面板 ----------------------------------------------------------*/
.cols-table{width:100%;border-collapse:separate;border-spacing:0;font-size:13.5px;}
.cols-table th{text-align:left;color:var(--muted);font-weight:500;padding:6px 8px;border-bottom:1px solid var(--line);}
.cols-table td{padding:5px 8px;border-bottom:1px solid #f6f8fb;vertical-align:middle;}
.cols-table tr.dragging{opacity:.5;}
.cols-table tr.drag-over td{border-top:2px solid var(--accent);}
.cols-table .grip{cursor:grab;color:var(--muted2);}
.cols-table input[type=text]{height:26px;width:100%;border:1px solid var(--line);border-radius:5px;padding:0 7px;}
.cols-table input[type=text]:focus{border-color:var(--accent);outline:none;}
.cols-table .w{width:74px;}
.cols-table .w input{width:100%;}
.cols-table .lbl{width:190px;}
.cols-table .del{color:var(--muted2);cursor:pointer;}
.cols-table .del:hover{color:var(--red);}
.cols-table .del.disabled{opacity:.25;cursor:not-allowed;}
.prot-note{font-size:12.5px;color:var(--muted2);margin-top:8px;}

/* ---- toast ---------------------------------------------------------------*/
#toast-root{position:fixed;left:50%;bottom:32px;transform:translateX(-50%);z-index:3000;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;}
.toast{
  background:rgba(30,41,59,.94);color:#fff;padding:9px 18px;border-radius:20px;font-size:13.5px;
  box-shadow:0 8px 24px rgba(15,23,42,.28);animation:toast-in .15s ease-out;max-width:70vw;
}
.toast.ok{background:rgba(13,148,136,.95);}
.toast.err{background:rgba(220,38,38,.95);}
@keyframes toast-in{from{transform:translateY(8px);opacity:0;}to{transform:none;opacity:1;}}

/* ---- 错误边界 / 加载态 ---------------------------------------------------*/
.error-box{
  margin:22px;padding:18px 20px;border:1px solid #fecaca;background:#fef2f2;border-radius:8px;color:#7f1d1d;
}
.error-box h3{margin:0 0 8px;font-size:14px;}
.error-box pre{margin:8px 0 0;white-space:pre-wrap;font-size:13px;color:#991b1b;}
.loading{padding:60px;text-align:center;color:var(--muted);}
.spinner{
  width:26px;height:26px;border-radius:50%;border:3px solid var(--line);border-top-color:var(--accent);
  margin:0 auto 12px;animation:spin .8s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg);}}

/* ---- 空态 ----------------------------------------------------------------*/
.empty-state{text-align:center;padding:56px 20px;color:var(--muted);}
.empty-state .big{font-size:30px;margin-bottom:10px;opacity:.8;}
.empty-state .t{font-size:14px;color:var(--text);margin-bottom:6px;}

/* 设置页卡片 */
.settings-card{max-width:560px;padding:20px 22px;}
.settings-card h2{margin:0 0 4px;font-size:15px;color:var(--brand);}
.settings-card p{margin:0 0 14px;color:var(--muted);font-size:13.5px;}
.settings-card .row{display:flex;align-items:center;gap:12px;}
.settings-card input{height:34px;width:160px;border:1px solid var(--line);border-radius:6px;padding:0 10px;outline:none;}
.settings-card input:focus{border-color:var(--accent);}

/* ---- 导入预览对话框（契约 03 §3.1） -------------------------------------*/
.import-summary{
  background:#f4f8fc;border:1px solid #dbe7f5;border-radius:6px;
  padding:8px 12px;color:var(--text);font-size:13.5px;margin-bottom:12px;
}
.import-summary b{color:var(--brand);}
.import-blocking{
  background:#fef2f2;border:1px solid #fecaca;border-radius:6px;
  padding:10px 12px;color:#7f1d1d;font-size:13.5px;margin-bottom:10px;
}
.import-blocking b{display:block;margin-bottom:4px;}
.import-blocking ul,.import-warnings ul{margin:0;padding-left:18px;}
.import-blocking li,.import-warnings li{margin:2px 0;}
.import-warnings{
  background:#fff7ed;border:1px solid #fde3bd;border-radius:6px;
  padding:10px 12px;color:#9a5b06;font-size:13.5px;margin-bottom:10px;
}
.import-warnings b{display:block;margin-bottom:4px;}
.import-table{width:100%;border-collapse:collapse;font-size:13.5px;margin-bottom:10px;}
.import-table th{
  text-align:left;color:var(--muted);font-weight:500;padding:6px 8px;
  border-bottom:1px solid var(--line);white-space:nowrap;
}
.import-table td{padding:6px 8px;border-bottom:1px solid #f6f8fb;vertical-align:middle;}
.import-table td.num{font-variant-numeric:tabular-nums;white-space:nowrap;}
.imp-missing{color:var(--orange);}
.import-unmatched{font-size:13px;color:var(--muted);margin-bottom:10px;}
.mode-radios{display:flex;gap:20px;padding:10px 2px 2px;font-size:13.5px;flex-wrap:wrap;}
.mode-radios label{display:inline-flex;align-items:center;gap:6px;cursor:pointer;}
.mode-radios input[type=radio]{accent-color:var(--accent);}
/* 禁用态按钮：仅视觉弱化、不禁 pointer-events（点击仍触发 handler → 给阻断 toast） */
.btn.disabled{opacity:.45;cursor:not-allowed;}

/* ---- 客户关联选择框（契约 03 §3.3） --------------------------------------*/
.form-grid .fld input.cc-input{padding-right:8px;}
.cc-panel{
  position:fixed;z-index:2600;background:#fff;border:1px solid var(--line);
  border-radius:8px;box-shadow:0 10px 30px rgba(15,23,42,.22);
  max-height:300px;overflow:auto;padding:4px 0;
}
.cc-item{display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:13.5px;cursor:pointer;}
.cc-item:hover,.cc-item.active{background:#eef4fc;}
.cc-item .cc-name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cc-item .cc-sub{color:var(--muted2);font-size:12px;flex:0 0 auto;font-variant-numeric:tabular-nums;}
.cc-new{
  padding:7px 10px;font-size:13.5px;color:var(--accent);cursor:pointer;
  border-top:1px dashed var(--line);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.cc-new:hover,.cc-new.active{background:#eef4fc;}
.cc-empty{padding:10px 12px;color:var(--muted2);font-size:13px;}

/* ---- 调研筛选 chip 条（契约 04 §2.1；契约 33 §3.1b 视觉升级：分段容器 + 溢出折叠） ---- */
.survey-chips{
  display:flex;align-items:center;flex-wrap:wrap;gap:4px;
  margin:-4px 0 12px;padding:3px;background:#f4f6fa;border-radius:11px;
}
/* 容器用**独立类名 `chipseg`**（而非 `.seg`）：避免与阶段进度条通用类
   `.seg`（下方，height:20px 等）同名冲突 —— 故本容器无需再写高特异性覆盖块去对抗 `.seg`。 */
.survey-chips.chipseg{
  display:flex;align-items:center;flex-wrap:wrap;gap:4px;
  height:auto;border:0;background:#f4f6fa;border-radius:11px;
  padding:3px;font-size:13px;color:var(--muted);cursor:default;white-space:normal;
}
.survey-chips .sc-label{flex:0 0 auto;font-size:13px;color:var(--muted2);white-space:nowrap;padding-left:6px;}
.schip{
  flex:0 0 auto;display:inline-flex;align-items:center;
  height:26px;padding:0 12px;border-radius:13px;
  border:1px solid #e3e9f1;background:#fff;color:var(--muted2);
  font-size:13px;cursor:pointer;user-select:none;white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.schip:hover{border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.schip.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500;}
/* 契约 33 §3.1b：溢出折叠（display:none，保证 class="schip 计数不变）+「更多」入口 + 已选提示 */
.schip-hide{display:none;}
.schip-more{color:var(--accent);border-color:#cfe0f2;}
.schip-more:hover{background:#f5faff;}
.sc-hint{flex:0 0 auto;font-size:12px;color:var(--muted2);white-space:nowrap;padding-left:2px;}

/* ---- TM-14 ④：项目状态 chip 条（自建 .pjchip，与 .schip/.seg 零耦合） ---- */
.pj-chips.chipseg{
  display:flex;align-items:center;flex-wrap:wrap;gap:4px;
  height:auto;border:0;background:#f4f6fa;border-radius:11px;
  padding:3px;font-size:13px;color:var(--muted);cursor:default;white-space:normal;
}
.pj-chips .sc-label{flex:0 0 auto;font-size:13px;color:var(--muted2);white-space:nowrap;padding-left:6px;}
.pjchip{
  flex:0 0 auto;display:inline-flex;align-items:center;
  height:26px;padding:0 12px;border-radius:13px;
  border:1px solid #e3e9f1;background:#fff;color:var(--muted2);
  font-size:13px;cursor:pointer;user-select:none;white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.pjchip:hover{border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.pjchip.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500;}

/* ---- TM-14 ③：项目成员多选编辑器（表单内嵌 + 行内弹层共用） ---- */
.member-ed{display:flex;flex-direction:column;gap:8px;width:100%;}
.member-bar{
  display:flex;flex-wrap:wrap;gap:6px;align-items:center;
  padding:8px;border:1px solid #e3e9f1;border-radius:8px;background:#fafbfe;min-height:38px;
}
.member-opt{
  display:inline-flex;align-items:center;gap:5px;
  height:26px;padding:0 10px;border-radius:13px;
  border:1px solid #e3e9f1;background:#fff;color:var(--ink,#333);
  font-size:13px;cursor:pointer;user-select:none;white-space:nowrap;position:relative;
}
.member-opt:hover{border-color:var(--accent);color:var(--accent);}
.member-opt.on{background:var(--accent);border-color:var(--accent);color:#fff;}
.member-opt input[type="checkbox"]{margin:0;accent-color:var(--accent);cursor:pointer;}
.member-opt.ext i{
  font-style:normal;font-size:10px;line-height:1;padding:2px 3px;border-radius:3px;
  background:#fff4d6;color:#a16207;border:1px solid #f0d48a;cursor:pointer;
}
.member-opt.ext.on i{background:rgba(255,255,255,.85);color:#a16207;}
.member-opt.ext i:hover{background:#ffe1a6;}
.member-free-row{display:flex;align-items:center;gap:8px;}
.member-free{
  flex:1 1 auto;height:32px;padding:0 10px;border:1px solid #e3e9f1;border-radius:6px;
  font-size:13px;
}
.member-free:focus{outline:none;border-color:var(--accent);}
.member-hint{flex:0 0 auto;font-size:12px;color:var(--muted2);white-space:nowrap;}
.member-hint.warn{color:#a16207;}
.member-hint.ok{color:var(--accent);}
.member-pop{
  position:fixed;z-index:2300;width:330px;max-height:420px;overflow:auto;
  background:#fff;border:1px solid #dfe6ef;border-radius:10px;
  box-shadow:0 12px 34px rgba(15,32,60,.18);padding:10px;
}
.member-pop-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:8px;}

/* ---- TM-14 ⑥：待办分区（行内下拉 + 分区设置弹层） ---- */
.td-zone-sel{
  flex:0 0 auto;height:24px;font-size:12px;border:1px solid #e3e9f1;border-radius:6px;
  color:var(--muted2);background:#fff;cursor:pointer;max-width:96px;
}
.td-zone-sel:hover{border-color:var(--accent);color:var(--accent);}
.zone-mgr .zone-hint{font-size:12px;color:var(--muted2);margin:0 0 10px;}
.zone-mgr .zone-list{display:flex;flex-direction:column;gap:6px;}
.zone-mgr .zone-item{display:flex;align-items:center;gap:6px;}
.zone-mgr .zone-item input[type="text"]{
  flex:1 1 auto;height:32px;padding:0 10px;border:1px solid #e3e9f1;border-radius:6px;font-size:13px;
}
.zone-mgr .zone-item input[type="text"]:focus{outline:none;border-color:var(--accent);}
.zone-mgr .zone-add{display:flex;align-items:center;gap:8px;margin-top:12px;padding-top:12px;border-top:1px dashed #e3e9f1;}
.zone-mgr .zone-add input[type="text"]{
  flex:1 1 auto;height:32px;padding:0 10px;border:1px solid #e3e9f1;border-radius:6px;font-size:13px;
}
.zone-mgr .btn.danger{color:var(--red);border-color:#f3c8c8;}
.zone-mgr .btn.danger:hover{background:#fff5f5;}
/* 契约 33 §3.1d：调研定义表单「非参调价格」自动档金额框（只读置灰） */
.is-auto{background:#f4f6fa;color:var(--muted2);cursor:not-allowed;}

/* ---- 阶段进度条虚拟列（契约 04 §2.2） ------------------------------------ */
th.stage-th .th-plain{
  flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;
}
td.stage-progress{padding:0 8px;}
td.stage-progress .seg-bar{
  display:flex;align-items:center;gap:3px;height:36px;   /* < 37px 内容高（38px - 1px 边框），绝不撑破 38px 行 */
}
.seg{
  flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  height:20px;padding:0 6px;border-radius:4px;line-height:1;
  border:1px solid var(--line);background:#f8fafc;color:var(--muted);
  font-size:12px;cursor:pointer;user-select:none;white-space:nowrap;
}
.seg:hover{border-color:var(--accent);color:var(--accent);}
.seg.on{background:var(--accent);border-color:var(--accent);color:#fff;}
.seg.on:hover{background:#2563a0;}
.seg-count{
  flex:0 0 auto;margin-left:4px;font-size:12px;color:var(--muted);
  font-variant-numeric:tabular-nums;white-space:nowrap;
}

/* ---- R23：机会「阶段推进」虚拟列（单选推进；done/cur/off 三态） ---------- */
td.opp-stage{padding:0 8px;}
td.opp-stage .oseg-bar{
  display:flex;align-items:center;gap:3px;height:36px;   /* 与参调同：绝不撑破 38px 行高 */
}
.oseg{
  flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  height:20px;padding:0 7px;border-radius:4px;line-height:1;
  border:1px dashed #d7dee8;background:#fff;color:var(--muted2);
  font-size:12px;cursor:pointer;user-select:none;white-space:nowrap;
}
.oseg:hover{border-style:solid;border-color:var(--accent);color:var(--accent);background:#f5faff;}
.oseg.done{background:#eef6fd;border:1px solid #bcd9f2;color:#2e75b6;}
.oseg.done:hover{background:#e3effb;}
.oseg.cur{background:var(--accent);border:1px solid var(--accent);color:#fff;font-weight:500;}
.oseg.cur:hover{background:#2563a0;border-color:#2563a0;color:#fff;}
.oseg.cur.over{background:var(--orange);border-color:var(--orange);}      /* 停留超期：琥珀醒目 */
.oseg.cur.over:hover{background:#d97706;border-color:#d97706;}
.oseg.ro{pointer-events:none;}                                          /* 只读条（表单总览） */
.oseg-age{font-style:normal;font-size:11px;margin-left:3px;opacity:.9;font-variant-numeric:tabular-nums;}
.oseg-age.none{opacity:.55;}
.oseg-badge{
  flex:0 0 auto;display:inline-flex;align-items:center;height:20px;padding:0 6px;border-radius:4px;
  background:var(--red);color:#fff;font-size:11.5px;font-weight:500;white-space:nowrap;
}
.oseg-split{flex:0 0 auto;width:1px;height:15px;background:#dbe3ec;margin:0 4px;}

/* ---- R23：机会表单顶部双段总览 ----------------------------------------- */
.stage-ov{
  background:#f8fafc;border:1px solid var(--line);border-radius:8px;
  padding:10px 12px;margin-bottom:14px;
}
.stage-ov-row{display:flex;align-items:center;gap:8px;}
.stage-ov-row + .stage-ov-row{margin-top:3px;}
.stage-ov-row.locked{opacity:.5;}
.stage-ov-k{flex:0 0 auto;width:26px;font-size:12.5px;color:var(--muted);}
.stage-ov .oseg-bar{display:flex;align-items:center;gap:3px;flex-wrap:wrap;}
.stage-ov .oseg{height:21px;font-size:12.5px;}
.stage-ov-lock{font-size:12px;color:var(--muted2);margin-left:4px;}
.stage-ov-hint{margin-top:7px;font-size:12.5px;color:var(--muted2);}

/* ---- R23：阶段推进必填浮层 --------------------------------------------- */
.modal.sm.stage-adv{width:min(480px,92vw);}
.sa-flow{
  display:flex;align-items:center;flex-wrap:wrap;gap:2px;
  padding:9px 10px;background:#f8fafc;border:1px solid var(--line);border-radius:7px;margin-bottom:12px;
}
.sa-seg{
  display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:4px;
  background:#fff;border:1px dashed #d7dee8;color:var(--muted2);font-size:12px;white-space:nowrap;
}
.sa-seg.cur{background:#eef6fd;border:1px solid #bcd9f2;color:#2e75b6;}
.sa-seg.to{background:var(--accent);border:1px solid var(--accent);color:#fff;font-weight:500;}
.sa-ar{color:#cbd5e1;font-size:12px;padding:0 1px;}
.sa-note{font-size:13px;color:var(--muted);margin-bottom:12px;}
.sa-lab{display:block;font-size:13.5px;color:var(--text);margin-bottom:5px;}
.sa-lab .sa-req{
  font-style:normal;font-weight:400;font-size:12px;color:var(--red);
  border:1px solid #f5c2c2;background:#fef2f2;border-radius:3px;padding:0 4px;margin-left:2px;
}
.sa-ta{
  width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid #dbe3ec;border-radius:7px;
  resize:vertical;line-height:1.5;font-size:13.5px;margin-bottom:12px;
}
.sa-ta:focus,.sa-date:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(46,117,182,.12);}
.sa-date{width:100%;box-sizing:border-box;padding:7px 10px;border:1px solid #dbe3ec;border-radius:7px;font-size:13.5px;}

/* ---- 契约 07 §2.2：收藏复选框单元格 -------------------------------------- */
td.data-cell .fav-cell{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;}
.fav-check{
  width:16px;height:16px;margin:0;cursor:pointer;accent-color:var(--orange,#e8890c);
  vertical-align:middle;
}
.fav-check:hover{transform:scale(1.08);}

/* ---- 表单：阶段 checkbox 成组 + 联想输入（契约 04 §2.3） ------------------ */
.form-grid .fld .stage-ck-grid{display:flex;flex-wrap:wrap;gap:8px 18px;padding:2px 0;}
.form-grid .fld .ck{
  display:inline-flex;align-items:center;gap:6px;
  font-size:13.5px;color:var(--text);cursor:pointer;white-space:nowrap;
}
/* 覆盖 .fld input 的 32px 通用样式：checkbox 用原生尺寸 + 品牌色 */
.form-grid .fld .ck input[type=checkbox]{
  height:15px;width:15px;margin:0;padding:0;border:none;border-radius:3px;
  accent-color:var(--accent);cursor:pointer;
}
.form-grid .fld input.sq-input{padding-right:8px;}

/* ---- 契约 24：注册问卷 = 与「调研管理」联动的受控下拉 + 就地「＋ 新建」 ------ */
.form-grid .fld .sd-pick-wrap{display:flex;gap:6px;align-items:stretch;}
.form-grid .fld .sd-pick-wrap .sd-pick{flex:1 1 auto;min-width:0;}
.form-grid .fld .sd-pick-wrap .sd-new{flex:0 0 auto;white-space:nowrap;height:32px;padding:0 10px;}

/* ---- 契约 05：侧栏 logo 图标 / 注册表孤儿 chip / 价格 chip·popover / 金额输入组 -- */

/* §3 图标接线：侧栏 logo（30px 圆角 + 轻微阴影，替换原 badge 字母） */
.sidebar .logo .badge-logo{
  display:inline-block;width:30px;height:30px;border-radius:8px;
  box-shadow:0 1px 4px rgba(0,0,0,.25);flex:0 0 auto;
}

/* §1.5 调研 chip：未注册孤儿（数据有值但注册表无此代码）→ 虚线边框 */
.schip.orphan{
  border-style:dashed;border-color:var(--muted2);color:var(--muted);
  background:transparent;
}
.schip.orphan:hover{border-color:var(--accent);color:var(--accent);}
.schip.orphan.on{background:var(--accent);border-color:var(--accent);color:#fff;}

/* §2.4.2 模块价格 chip（工具条右上角）：有效汇率·税率；覆盖时带圆点 */
.price-chip{
  display:inline-flex;align-items:center;gap:5px;
  height:26px;padding:0 10px;border-radius:13px;
  border:1px solid var(--line);background:var(--card);color:var(--muted);
  font-size:13px;font-variant-numeric:tabular-nums;cursor:pointer;white-space:nowrap;
}
.price-chip:hover{border-color:var(--accent);color:var(--accent);}
.price-chip.dot::after{
  content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
  background:var(--orange);flex:0 0 auto;
}
.price-chip.dot{color:var(--text);border-color:var(--orange);}

/* §2.4.2 模块价格 popover（挂 body，脱离文档流） */
.price-pop{
  position:fixed;z-index:2300;
  background:var(--card);border:1px solid var(--line);border-radius:10px;
  box-shadow:0 10px 34px rgba(15,30,55,.18);
  padding:12px 14px;display:flex;flex-direction:column;gap:9px;
}
.price-pop .pp-title{font-size:14px;font-weight:600;color:var(--brand);}
.price-pop .pp-row{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--text);}
.price-pop .pp-k{flex:0 0 52px;color:var(--muted);}
.price-pop .pp-u{font-size:12px;color:var(--muted2);white-space:nowrap;}
.price-pop input[type=number]{
  height:28px;width:96px;border:1px solid var(--line);border-radius:6px;
  padding:0 8px;font-size:13.5px;font-variant-numeric:tabular-nums;
}
.price-pop input[type=number]:disabled{background:#f2f5f9;color:var(--muted2);}
.price-pop .pp-follow{cursor:pointer;user-select:none;}
.price-pop .pp-basis label{display:inline-flex;align-items:center;gap:4px;cursor:pointer;}
.price-pop .pp-note{
  font-size:12px;color:var(--muted2);background:#f6f9fc;border-radius:6px;padding:6px 8px;
}
.price-pop .pp-actions{display:flex;align-items:center;gap:8px;margin-top:2px;}
.price-pop .pp-actions .sp{flex:1 1 auto;}

/* §2.4.4 表单金额输入组：数字 + 币别 + 口径 + 实时 2×2 预览行 */
.form-grid .fld .money-group{display:flex;align-items:center;gap:6px;}
.form-grid .fld .money-group .mg-amt{flex:1 1 auto;min-width:80px;}
.form-grid .fld .money-group .mg-cur,
.form-grid .fld .money-group .mg-basis{
  flex:0 0 auto;height:32px;border:1px solid var(--line);border-radius:6px;
  background:var(--card);color:var(--text);font-size:13.5px;padding:0 6px;
}
.form-grid .fld .mg-preview{
  margin-top:4px;font-size:12.5px;color:var(--muted);
  font-variant-numeric:tabular-nums;min-height:15px;white-space:nowrap;
}

/* §1.5 联想面板「＋ 新建调研」行：复用既有 .cc-new（契约 03）样式，无新增 */

/* ============================================================================
 * 契约 06：① 调研定义并入参调（紧凑条 + 抽屉） ② 自定义分析（透视）
 * 零外部资源；一律复用品牌 token。
 * ==========================================================================*/

/* ---- §1.2 参调模块顶部紧凑定义条（单行，与 chip 条同风格） ---------------- */
.defs-bar{
  display:flex;align-items:center;gap:8px;
  margin:-4px 0 10px;padding:0 12px;height:30px;
  border:1px solid var(--line);border-radius:6px;background:#fbfcfe;
  font-size:13.5px;color:var(--muted);cursor:pointer;user-select:none;
}
.defs-bar:hover{border-color:var(--accent);background:#f7fbff;color:var(--accent);}
.defs-bar .defs-t{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;}
.defs-bar .sp{flex:1 1 auto;}
.defs-bar .defs-go{flex:0 0 auto;color:var(--accent);font-weight:600;}

/* ---- §1.2 抽屉内调研定义列表 / 内联表单 ---------------------------------- */
.sfd-row .sfd-ops{gap:6px;margin-top:6px;}
.sfd-row .sfd-ref{color:var(--accent);}
.sfd-form .sfd-form-h{font-size:14px;font-weight:600;color:var(--brand);margin:12px 0 10px;}
.sfd-form .form-grid{display:grid;grid-template-columns:1fr;gap:10px;}
.sfd-form-foot{display:flex;justify-content:flex-end;gap:8px;margin:16px 0 4px;}

/* ---- §1.2 R30：调研定义「复制现有」与「拖拽排序」 ------------------------ */
.sfd-row .drag-h{flex:0 0 auto;color:var(--muted2);cursor:grab;font-size:13px;letter-spacing:-1px;
  padding:0 2px;user-select:none;}
.sfd-row .drag-h:active{cursor:grabbing;}
.sfd-row.sfd-dragging{opacity:.45;}
.sfd-row.sfd-drop-before{box-shadow:0 -3px 0 -1px var(--accent);}
.sfd-row.sfd-drop-after{box-shadow:0 3px 0 -1px var(--accent);}
.sfd-copy-hint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:8px 0 10px;
  background:#fff8e6;border:1px solid #f0d9a0;border-radius:8px;padding:8px 10px;
  font-size:13px;line-height:1.55;color:#7a5b12;}
.sfd-copy-hint b{color:#5a4108;}
.sfd-copy-hint .btn{margin-left:auto;flex:0 0 auto;}
.sfd-pick-head{display:flex;align-items:center;gap:8px;margin-bottom:8px;}
.sfd-pick-head .sfd-pick-q{flex:1 1 auto;min-width:0;height:30px;padding:0 10px;border:1px solid #dbe4f0;
  border-radius:6px;font-size:13.5px;font-family:inherit;color:var(--text);background:#fff;}
.sfd-pick-head .sfd-pick-q:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,117,182,.12);}
.sfd-pick-head .sfd-pick-n{flex:0 0 auto;color:var(--muted2);font-size:12.5px;font-variant-numeric:tabular-nums;}
.sfd-pick-tip{color:var(--muted);font-size:12.5px;line-height:1.6;background:#f5f8fc;
  border-radius:8px;padding:8px 10px;margin-bottom:8px;}

/* ---- §2.1 分析模块：工具条 / 配置卡 -------------------------------------- */
.view-head #an-view{height:32px;border:1px solid var(--line);border-radius:6px;padding:0 8px;background:var(--card);max-width:240px;}
.an-config{display:flex;flex-direction:column;gap:10px;margin-bottom:14px;}
.an-config .an-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.an-config .an-k{flex:0 0 auto;color:var(--muted);font-size:13px;margin-left:2px;}
.an-config .an-k:first-child{margin-left:0;}
.an-config select.an-dim,
.an-config #an-source{
  height:30px;border:1px solid var(--line);border-radius:6px;background:var(--card);
  color:var(--text);font-size:13.5px;padding:0 6px;max-width:220px;
}
.an-mchks{display:flex;flex-wrap:wrap;gap:6px 14px;flex:1 1 auto;}
.an-mchk{display:inline-flex;align-items:center;gap:5px;font-size:13.5px;color:var(--text);cursor:pointer;white-space:nowrap;}
.an-mchk input[type=checkbox]{height:14px;width:14px;margin:0;accent-color:var(--accent);cursor:pointer;}
.an-filters{align-items:flex-start;}
.an-flt-list{display:flex;flex-direction:column;gap:6px;flex:1 1 auto;}
.an-flt-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.an-flt-row select{height:28px;border:1px solid var(--line);border-radius:6px;background:var(--card);font-size:13.5px;padding:0 6px;max-width:200px;}
.an-flt-row .an-v{height:28px;border:1px solid var(--line);border-radius:6px;padding:0 8px;font-size:13.5px;width:130px;}

/* ---- §2.2 透视结果表 ------------------------------------------------------ */
.an-result{margin-top:4px;}
.an-empty{padding:22px;text-align:center;color:var(--muted2);font-size:13.5px;}
.an-piv-wrap{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow);overflow:auto;max-height:calc(100vh - 320px);}
table.pivot{border-collapse:collapse;width:100%;font-size:13.5px;font-variant-numeric:tabular-nums;}
table.pivot th,table.pivot td{
  border-bottom:1px solid var(--line);padding:7px 12px;text-align:left;white-space:nowrap;
}
table.pivot thead th{
  position:sticky;top:0;z-index:1;background:#f7f9fc;color:var(--brand);font-weight:600;
  border-bottom:1px solid #e3e9f2;
}
table.pivot th.piv-m{cursor:pointer;text-align:right;}
table.pivot th.piv-m:hover{color:var(--accent);}
table.pivot th.piv-m.sorted::after{content:" ↕";color:var(--accent);font-size:11px;}
table.pivot td.piv-num{text-align:right;}
table.pivot tr.piv-data:hover td{background:#f7fbff;}
table.pivot tr.piv-sub td{background:#f1f5fb;font-weight:600;color:var(--brand);}
table.pivot tr.piv-total td{background:#e9eff8;font-weight:700;color:var(--brand);border-top:2px solid #d7e0ee;}

/* ---- §2.1 仪表盘「自定义分析」快捷卡片 ----------------------------------- */
.panel-grid.an-grid{grid-template-columns:repeat(3,minmax(0,1fr));}
.panel.analysis-card .an-card-row{cursor:pointer;}
.panel.analysis-card .an-card-row:hover{background:#f7fbff;}
.panel.analysis-card .p-row span:first-child{font-weight:600;color:var(--brand);}

/* ---- 契约 08 §3：订单「按订单 / 按客户」视图切换 + 客户×年份矩阵 ---------- */
/* 视图切换分段（观感对齐既有 .seg / 品牌 token）：点亮 = 强调色，非活动 = 弱化。 */
.seg-view{
  display:inline-flex;align-items:center;justify-content:center;
  height:26px;padding:0 12px;margin-left:6px;border-radius:6px;line-height:1;
  border:1px solid var(--line);background:var(--card);color:var(--muted);
  font-size:13.5px;cursor:pointer;user-select:none;white-space:nowrap;
}
.seg-view:hover{border-color:var(--accent);color:var(--accent);}
.seg-view.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600;}
.seg-view.on:hover{background:#2563a0;color:#fff;}

/* ---- R17：机会归档（行内按钮 / 原因标签 / 原因快选浮层） ------------------ */
/* 未归档：虚线小按钮，平时半透明（不抢戏），悬停行时显形；已归档：原因标签 + 「↩ 恢复」按钮。 */
td.data-cell .arc-cell{display:inline-flex;align-items:center;gap:4px;width:100%;}
.arc-btn{
  display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:11px;
  border:1px dashed var(--line);background:#fff;color:var(--muted);
  font-size:12.5px;line-height:1;cursor:pointer;user-select:none;white-space:nowrap;
  opacity:.5;transition:opacity .12s,border-color .12s,color .12s;
}
tr:hover .arc-btn{opacity:1;}
.arc-btn:hover{border-style:solid;border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.arc-cell.on .arc-tag{
  display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:10px;
  background:#eef2f7;color:var(--muted);font-size:12.5px;line-height:1;white-space:nowrap;
}
/* R18：「↩ 恢复」= 归档的逆向动作（取消归档 → 移回「进行中」）。带文字的按钮，不再是裸 ✕。 */
.arc-cell.on .arc-restore{
  display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:10px;
  border:1px solid var(--accent);background:#fff;color:var(--accent);
  font-size:12.5px;line-height:1;cursor:pointer;white-space:nowrap;
  opacity:0;transition:opacity .12s,color .12s,background .12s;
}
tr:hover .arc-cell.on .arc-restore,.arc-cell.on .arc-restore:focus{opacity:1;}
.arc-cell.on .arc-restore:hover{background:var(--accent);color:#fff;}
/* 原因快选浮层（皮肤/定位复用 .price-pop） */
.arc-pop .arc-opts{display:flex;flex-wrap:wrap;gap:6px;}
.arc-pop .arc-opt{
  height:26px;padding:0 10px;border-radius:13px;
  border:1px solid var(--line);background:#fff;color:var(--text);
  font-size:13px;line-height:1;cursor:pointer;white-space:nowrap;
}
.arc-pop .arc-opt:hover{border-color:var(--accent);color:var(--accent);background:#f7fbff;}

/* ---- R30：交付「状态」单元格（着色标签 + 结项 / 撤销） + 分区逾期徽标 ------ */
/* 观感与机会归档格（.arc-cell）同源：平时半透明不抢戏，悬停行时显形。 */
td.data-cell .st-cell{display:inline-flex;align-items:center;gap:4px;width:100%;}
.st-cell .st-tag{
  display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:10px;
  background:#eef2f7;color:var(--muted);font-size:12.5px;line-height:1;white-space:nowrap;
}
.st-cell .st-tag.empty{opacity:.55;}
.st-cell .st-btn{
  display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:11px;
  border:1px dashed var(--line);background:#fff;color:var(--muted);
  font-size:12.5px;line-height:1;cursor:pointer;user-select:none;white-space:nowrap;
  opacity:.5;transition:opacity .12s,border-color .12s,color .12s;
}
tr:hover .st-cell .st-btn{opacity:1;}
.st-cell .st-btn:hover{border-style:solid;border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.st-cell.on .st-restore{
  display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:10px;
  border:1px solid var(--accent);background:#fff;color:var(--accent);
  font-size:12.5px;line-height:1;cursor:pointer;white-space:nowrap;
  opacity:0;transition:opacity .12s,color .12s,background .12s;
}
tr:hover .st-cell.on .st-restore,.st-cell.on .st-restore:focus{opacity:1;}
.st-cell.on .st-restore:hover{background:var(--accent);color:#fff;}
/* 分区条旁的逾期徽标（仅「进行中」分区、有逾期时才出现） */
.seg-warn{
  display:inline-flex;align-items:center;height:26px;margin-left:10px;padding:0 10px;
  border-radius:6px;border:1px solid #f0d8a8;background:#fff7e6;color:#a16207;
  font-size:13px;line-height:1;white-space:nowrap;
}
/* R34：交付「到期分档」行色 —— 档位由后端 _due_tone 派生，阈值 = meta.delivery_due_tiers。
   深红 > 淡粉 > 淡琥珀；正常 / 无日期 / 已结项不染色（「没有颜色」=「没问题」）。
   行首 3px 红条只给 critical，颜色之外再加一个非颜色通道。 */
table.grid-table tbody tr.row-tone-critical td{background:#fee2e2;}
table.grid-table tbody tr.row-tone-critical:hover td{background:#fbd5d5;}
table.grid-table tbody tr.row-tone-critical td:first-child{box-shadow:inset 3px 0 0 var(--red);}
table.grid-table tbody tr.row-tone-overdue td{background:#fef2f2;}
table.grid-table tbody tr.row-tone-overdue:hover td{background:#fde8e8;}
table.grid-table tbody tr.row-tone-soon td{background:#fff7ed;}
table.grid-table tbody tr.row-tone-soon:hover td{background:#ffefd6;}
/* 分区条旁的行色图例（仅「进行中」分区显示） */
.seg-legend{
  display:inline-flex;align-items:center;gap:5px;margin-left:12px;
  font-size:12.5px;color:var(--muted);white-space:nowrap;
}
.seg-legend .lg{display:inline-block;width:13px;height:13px;border-radius:4px;border:1px solid rgba(15,23,42,.12);}
.seg-legend .lg-critical{background:#fee2e2;box-shadow:inset 3px 0 0 var(--red);}
.seg-legend .lg-overdue{background:#fef2f2;}
.seg-legend .lg-soon{background:#fff7ed;}
/* 结项浮层：「已取消」用中性色，和「已完成」拉开语义 */
.st-pop .arc-opt.st-cancel{color:var(--muted);}
.st-pop .arc-opt.st-cancel:hover{border-color:#94a3b8;color:#475569;background:#f8fafc;}

/* R43：客户「购买节奏」徽标 + 「⏱ 今年预计」标记（色值由 meta.rhythm_types 内联下发） */
.rhythm-tag{
  display:inline-block;padding:2px 9px;border-radius:999px;
  border:1px solid;background:rgba(148,163,184,.08);
  font-size:12.5px;line-height:1.5;white-space:nowrap;
}
.rhythm-fc{
  display:inline-block;margin-left:6px;padding:2px 7px;border-radius:999px;
  background:#ecfdf5;color:#047857;border:1px solid #a7f3d0;
  font-size:12px;line-height:1.5;white-space:nowrap;font-weight:600;
}
/* R43：表头「⏱ 今年预计」chip 选中态（复用 .seg-view，追加高亮色） */
.fc-chip.on{background:#ecfdf5;border-color:#6ee7b7;color:#047857;}
/* R43：仪表盘面板行可点击态 */
.panel .p-row.p-link:hover{background:#f7fbff;}

/* R46：节奏列「动作短句」chip —— 购买年（橙，要动手）/ 已签兑现（绿）/ 低置信（淡橙+?） */
.rhythm-chip{
  display:inline-block;margin-left:6px;padding:2px 7px;border-radius:999px;
  font-size:12px;line-height:1.5;white-space:nowrap;font-weight:600;
}
.rhythm-chip.buy{background:#fff7ed;color:#c2410c;border:1px solid #fdba74;}
.rhythm-chip.buy.low{background:#fffbf5;color:#b45309;border:1px dashed #fcd34d;}
.rhythm-chip.done{background:#f0fdf4;color:#15803d;border:1px solid #bbf7d0;}
/* R46：仪表盘 forecast 面板行的月份 chip */
.fc-month{
  display:inline-block;margin-right:6px;padding:1px 6px;border-radius:999px;
  background:#fff7ed;color:#c2410c;border:1px solid #fdba74;
  font-size:11px;line-height:1.5;white-space:nowrap;font-weight:600;
}

/* R47/R49：「历史订单 · 按客户」矩阵的「购买节奏」列（客户名右侧一列） */
.ym-table td.ym-rhythm{white-space:nowrap;text-align:left;overflow:hidden;text-overflow:ellipsis;padding:0 10px;}
.ym-table td.ym-rhythm .rhythm-tag{font-size:12px;padding:2px 8px;}
.ym-table td.ym-rhythm .rhythm-chip{font-size:11px;padding:1px 6px;margin-left:5px;}
/* R49/R50：节奏列与全表同底色（R49 曾给派生列加浅蓝底，与表格割裂，已撤）；
 *   表头「购买节奏」也回到品牌蓝。 */

/* R49：客户列 —— 定宽 240 + 长名省略号（悬停 title 给全名） */
.ym-table td.ym-client,.ym-table th.ym-client-h{padding-left:12px;}
.ym-table td.ym-client{color:#1e293b;font-weight:500;}
.ym-table td.ym-client .ym-client-link{
  display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;
}
.fc-month.low{background:#fffbf5;color:#b45309;border:1px dashed #fcd34d;}

/* R49：矩阵上方「购买节奏」筛选 chip 条（悬停 title 出该档位定义） */
.ym-segs{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:10px 14px;border-bottom:1px solid var(--line);background:#fbfcfe;
}
.ym-segs .ym-segs-title{font-size:12.5px;color:var(--muted);font-weight:600;letter-spacing:.02em;}
.ym-segs .sp{flex:1 1 auto;}
.ym-segs .ym-segs-hint{font-size:12px;color:var(--muted2);}
.ym-segs .ym-segs-hint b{color:var(--accent);font-variant-numeric:tabular-nums;}
.rseg{
  display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 11px;border-radius:999px;
  border:1px solid var(--line);background:#fff;color:var(--muted);
  font-size:13px;line-height:1;cursor:pointer;user-select:none;white-space:nowrap;
}
.rseg:hover{border-color:var(--accent);color:var(--accent);}
.rseg .dot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;}
.rseg .n{font-size:11.5px;font-weight:600;color:#94a3b8;font-variant-numeric:tabular-nums;}
.rseg.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600;}
.rseg.on:hover{background:#2563a0;color:#fff;}
.rseg.on .dot{background:#fff !important;}
.rseg.on .n{color:rgba(255,255,255,.85);}
/* R49：筛选后无客户 */
.ym-table td.ym-none{padding:22px 0;text-align:center;color:var(--muted2);font-size:13px;}
/* R49：年份格所在单元格 —— 内容居中、左右各留 6px（上下 0，行高恒定不撑高） */
.ym-table td.ym-c{text-align:center;padding:0 6px;}
/* R49：矩阵内的年份格填满单元格宽度 → 整列方块齐平，不再“内容一小块 + 旁边空白” */
.ym-table td.ym-c .ycell{display:flex;width:100%;}
/* R49：矩阵内「无订单」格弱化成淡「—」（填满整格后灰底会连成一片，喧宾夺主）；
 *   只作用矩阵，抽屉「历年购买」的灰格保持原卡壳观感。 */
.ym-table td.ym-c .ycell.off{background:transparent;border-color:transparent;color:#c3cedb;}

/* R46：客户展开区「购买历史时间轴」 */
.buy-timeline{
  margin:10px 0 12px;padding:10px 12px;border:1px solid var(--line,#e2e8f0);
  border-radius:8px;background:#fbfdff;
}
.buy-timeline .bt-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px;}
.buy-timeline .bt-title{font-weight:700;font-size:13px;color:#334155;}
.buy-timeline .bt-basis{font-size:12px;color:#64748b;}
.buy-timeline .bt-fc{font-size:12px;font-weight:600;color:#c2410c;}
.buy-timeline .bt-fc.done{color:#15803d;}
.buy-timeline .bt-items{display:flex;flex-wrap:wrap;gap:6px 10px;}
.buy-timeline .bt-item{
  display:inline-block;padding:3px 9px;border-radius:6px;background:#fff;
  border:1px solid var(--line,#e2e8f0);font-size:12px;color:#334155;white-space:nowrap;
}
.buy-timeline .bt-item b{color:#0f172a;}
.buy-timeline .bt-amt{font-variant-numeric:tabular-nums;color:#0f172a;font-weight:600;}
.buy-timeline .bt-empty{font-size:12px;color:#94a3b8;}

/* 年份矩阵表头：每年一列，居中、品牌色、等宽数字。 */
.yhead{
  text-align:center;color:var(--brand);font-weight:600;font-size:13px;
  white-space:nowrap;font-variant-numeric:tabular-nums;
}

/* 年份格：基础态（默认弱化，可读）。
 * R49：整体收一号（此前 13.5px 的「N 个订单」比四周 12~13px 的界面字明显偏大，
 *   一屏几百个格子里很吵）——主信息 12.5px / 金额 11px，与表格字级对齐。 */
.ycell{
  display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  min-width:66px;padding:3px 8px;border:1px solid var(--line);border-radius:6px;
  background:#f8fafc;color:var(--muted);font-size:12px;line-height:1.22;
  font-variant-numeric:tabular-nums;white-space:nowrap;text-align:center;
}
/* 点亮：该年有订单，可点击展开明细。 */
.ycell.on{
  background:var(--accent);border-color:var(--accent);color:#fff;cursor:pointer;
  box-shadow:0 1px 2px rgba(46,117,182,.28);
}
.ycell.on:hover{background:#2563a0;}
.ycell.on .y-n{font-weight:700;font-size:12.5px;}
.ycell.on .y-t{opacity:.92;font-size:11px;}
/* 灰色：该年无订单，弱化但可读、不可点。 */
.ycell.off{
  background:#f1f4f8;border-color:var(--line);color:var(--muted2);cursor:default;
}
.ycell .y-n{font-weight:600;}
.ycell .y-t{font-size:11px;}

/* 展开明细行（在该客户行下方）：产品 / 金额 / 月份 + 当年合计。 */
.ydetail{background:#f7f9fc;border-top:1px solid var(--line);}
.ydetail .yd-wrap{padding:8px 12px;display:flex;justify-content:flex-end;}
.ydetail table{border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums;}
.ydetail th,.ydetail td{padding:3px 14px;border-bottom:1px dashed var(--line);white-space:nowrap;text-align:left;}
.ydetail thead th{color:var(--brand);font-weight:600;border-bottom:1px solid var(--line);}
.ydetail td.num,.ydetail th.num{text-align:right;}
.ydetail tr.yd-total td{
  font-weight:700;color:var(--brand);border-bottom:none;border-top:1px solid var(--line);
}

/* ============================================================================
 * 契约 09 §2.6 —— 新增类（本层提供；DOM 由 views.js / charts.js 使用）
 * 分工：类名由视图层使用，类名的实现归本层（表格层）。
 * ==========================================================================*/

/* ---- 仪表盘三层区块（§3.1 / §3.9） -------------------------------------- */
.dash-layer{margin-bottom:18px;}
.dash-layer-h{
  display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:var(--brand);
  margin:2px 0 10px;border-left:3px solid var(--accent);padding-left:8px;
}
.dash-layer-h .sp{flex:1 1 auto;}
.dash-tools{display:flex;align-items:center;gap:10px;}

/* ---- 2026-10-22：仪表盘「范围」切换（老板专用） --------------------------- */
.dash-scope{display:flex;align-items:center;gap:8px;}
.dash-scope-l{font-size:12.5px;color:var(--muted);white-space:nowrap;}
.dash-scope-sel{
  height:30px;border:1px solid var(--line);border-radius:6px;background:var(--card);
  color:var(--text);font-size:13px;padding:0 8px;outline:none;cursor:pointer;
  max-width:230px;
}
.dash-scope-sel:hover{border-color:var(--accent);}
.dash-scope-sel:focus-visible{border-color:var(--accent);box-shadow:0 0 0 2px #dbe8f7;}
.dash-scope-h{font-size:12px;color:var(--muted2);white-space:nowrap;}
.dash-scope.on .dash-scope-l{color:var(--accent);font-weight:600;}
.dash-scope.on .dash-scope-sel{border-color:var(--accent);background:#f7fbff;font-weight:600;}
/* R55：个人范围下提醒「目标仍是团队口径」，避免把团队分母当个人达成率 */
.goal-scope-hint{margin-top:4px;font-size:11px;line-height:1.5;color:var(--orange);}

/* ---- 2026-10-22：团队进度（团队口径；成员不显示个人完成率） --------------- */
.tp-card{
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:16px 18px;
}
.tp-sub{font-size:12px;color:var(--muted);font-weight:400;}
.tp-head{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:12px;}
.tp-kpi span{display:block;font-size:12px;color:var(--muted);margin-bottom:3px;}
.tp-kpi b{font-size:20px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--text);}
.tp-kpi.alert b{color:var(--orange);}
.tp-bar{height:6px;background:#eef2f7;border-radius:3px;overflow:hidden;margin-bottom:14px;}
.tp-bar i{display:block;height:100%;background:var(--accent);border-radius:3px;transition:width .25s ease;}
.tp-thead,.tp-row{
  display:grid;grid-template-columns:minmax(84px,1.2fr) 64px 122px 88px 76px 92px;
  align-items:center;gap:8px;
}
.tp-thead{
  font-size:12px;color:var(--muted);padding:0 8px 6px;border-bottom:1px solid var(--line);
}
.tp-row{font-size:13px;padding:8px;border-bottom:1px solid var(--line);}
.tp-row:last-of-type{border-bottom:none;}
.tp-row:hover{background:#fafcff;}
.tp-name{font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tp-cell{font-variant-numeric:tabular-nums;color:var(--text);}
.tp-cell i{font-style:normal;font-size:12px;color:var(--muted2);}
.tp-cell.hot{color:var(--orange);font-weight:600;}
.tp-row.zero .tp-name{color:var(--muted);}
.tp-row.warn{box-shadow:inset 2px 0 0 var(--orange);}
.tp-foot{margin-top:10px;font-size:12.5px;color:var(--muted);line-height:1.6;}
.tp-empty{padding:16px 8px;color:var(--muted);font-size:13px;}

/* ---- TM-18：目标拆解 + 个人达成率 ----------------------------------------- */
.tp-rate{text-align:right;font-variant-numeric:tabular-nums;}
.tp-rate b{font-weight:600;color:var(--text);}
.tp-rate.dim i{font-style:normal;font-size:12px;color:var(--muted2);}
.tp-split{margin-top:4px;padding-top:8px;border-top:1px dashed var(--line);}
.tp-row[data-vact="scope-clients"]:hover{background:#f5f9ff;}
.goal-split{margin-top:6px;font-size:12.5px;color:var(--muted);font-variant-numeric:tabular-nums;}
.goal-split b{color:var(--text);font-weight:600;}
.goal-split.over{color:var(--orange);}
.goal-split.over b{color:var(--orange);}
.goal-scope-hint.ok{color:#0f766e;}
.goal-ro{font-size:11.5px;color:var(--muted2);border:1px solid var(--line);
  border-radius:10px;padding:1px 8px;margin-right:6px;}
/* 范围 chip（来自仪表盘下钻）：与列筛选 chip 区别开 —— 它是「看谁的」 */
.fchip-scope{display:inline-flex;align-items:center;gap:5px;margin-right:10px;
  background:#eef4ff;border:1px solid #c7dcff;color:#1e40af;border-radius:12px;
  padding:2px 9px;font-size:12px;}
.fchip-scope b{font-weight:600;}
.fchip-scope .x{cursor:pointer;opacity:.65;font-weight:700;}
.fchip-scope .x:hover{opacity:1;}

/* ---- 契约 13：六个「概览组」分块 + 拖拽排序 ------------------------------- */
.dash-group{margin-bottom:14px;}
.dash-group-h{
  display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:var(--brand);
  margin:2px 0 10px;border-left:3px solid var(--accent);padding-left:8px;
  cursor:grab;user-select:none;border-radius:4px 4px 0 0;
}
.dash-group-h .drag-grip{color:var(--muted2);font-size:13px;letter-spacing:-1px;}
.dash-group.dragging{opacity:.45;}
.dash-group.drag-over > .dash-group-h{
  border-left-color:#f59e0b;box-shadow:inset 0 -2px 0 #f59e0b;
}

/* ---- 目标卡（§3.2 第 1 层） --------------------------------------------- */
.goal-card{
  display:flex;gap:26px;align-items:center;background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius);box-shadow:var(--shadow);padding:20px 24px;flex-wrap:wrap;
}
.goal-ring{flex:0 0 auto;width:104px;height:104px;}
.goal-ring svg{display:block;}
.goal-bar-wrap{flex:1 1 auto;min-width:240px;}
.goal-year{font-size:14.5px;color:var(--text);font-weight:600;margin-bottom:10px;}
.goal-bar{position:relative;height:10px;border-radius:5px;background:#e2e8f0;}
.goal-bar .fill{position:absolute;left:0;top:0;height:100%;border-radius:5px;background:var(--accent);transition:width .3s;}
.goal-bar .mark{position:absolute;top:-3px;width:2px;height:16px;border-radius:1px;background:var(--orange);}
.goal-num{font-size:14.5px;color:var(--muted);margin-top:12px;font-variant-numeric:tabular-nums;}
.goal-num b{font-weight:600;color:var(--brand);font-size:16px;}
.goal-num[data-vact]{cursor:pointer;}
.goal-koujing{font-size:13px;color:var(--muted2);margin-top:6px;}
.goal-input{height:32px;width:170px;border:1px solid var(--accent);border-radius:6px;padding:0 10px;
  font-size:15px;outline:none;font-variant-numeric:tabular-nums;}
.goal-unit{font-size:14px;color:var(--muted);margin-left:7px;}
.goal-empty{color:var(--muted2);font-size:13.5px;padding:6px 0;}
.goal-hint{color:var(--muted2);font-size:13px;}

/* ---- R16：业绩折算（计入比例）提示行 + 折算明细弹层 ---------------------- */
.goal-adj{
  margin-top:7px;display:inline-block;font-size:12.5px;color:#92400e;
  background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:3px 9px;
  font-variant-numeric:tabular-nums;
}
.goal-adj b{color:#b45309;font-weight:600;}
.linkbtn{
  border:0;background:none;padding:0 2px;margin-left:2px;color:var(--accent);
  font-size:12.5px;text-decoration:underline;cursor:pointer;
}
.linkbtn:hover{color:var(--brand);}
.adj-table{width:100%;border-collapse:collapse;font-size:13px;margin-top:8px;}
.adj-table th{
  text-align:left;font-weight:600;color:var(--muted);white-space:nowrap;
  padding:5px 7px;border-bottom:1px solid #dbe3ec;
}
.adj-table td{padding:4px 7px;border-bottom:1px solid var(--line);vertical-align:top;}
.adj-table td.num,.adj-table th.num{text-align:right;font-variant-numeric:tabular-nums;}
.adj-table td.sub{color:var(--muted2);font-size:12.5px;}
.adj-table tbody tr:hover{background:#f8fafc;}
/* R28：未填比例的订单行（留空 = 不计入，故并入未全额计入表并醒目标注） */
.adj-table tr.adj-unfilled td{background:#fff7ed;}
.adj-table tr.adj-unfilled td.num b{color:#c2410c;}

/* ============================================================================
 * R28 —— 目标卡「已达成」悬停 → 逐单构成浮层（#md-goaltip）
 * 与矩阵浮层的差别：本浮层可点击（pointer-events 默认 auto），
 * 故定位贴在锚点下方而非跟随光标，并用延迟收起给光标移入留通道。
 * ==========================================================================*/
.goal-done-hit{
  border-bottom:1px dashed rgba(46,117,182,.55);cursor:help;padding-bottom:1px;
}
.goal-done-hit:hover{background:rgba(46,117,182,.09);border-radius:3px;}
.goal-unfilled{
  margin-top:6px;font-size:12.5px;color:#92400e;
  background:#fff7ed;border:1px solid #fed7aa;border-radius:6px;padding:3px 9px;
}
.goal-unfilled b{color:#c2410c;font-weight:600;}

.goal-tip{
  position:fixed;z-index:2900;width:540px;max-width:calc(100vw - 24px);max-height:64vh;overflow:auto;
  background:#ffffff;color:#1e293b;border:1px solid var(--line);border-radius:10px;
  padding:8px 10px;font-size:13px;line-height:1.45;font-variant-numeric:tabular-nums;
  box-shadow:0 12px 32px rgba(15,23,42,.22),0 2px 6px rgba(15,23,42,.12);
}
.goal-tip .gt-hd{font-size:13px;color:var(--muted);padding:2px 4px 6px;border-bottom:1px solid var(--line);}
.goal-tip .gt-hd b{color:var(--brand);font-weight:600;}
.goal-tip .gt-cols,
.goal-tip .gt-row{
  display:grid;grid-template-columns:14px minmax(0,1fr) 86px 46px 86px 12px;
  align-items:center;gap:8px;padding:4px;
}
.goal-tip .gt-cols{color:var(--muted2);font-size:12px;border-bottom:1px dashed var(--line);}
.goal-tip .gt-cols .gt-r{text-align:right;}
.goal-tip .gt-row{border-bottom:1px solid var(--line);cursor:pointer;}
.goal-tip .gt-row:last-child{border-bottom:0;}
.goal-tip .gt-row:hover{background:#f1f7fd;}
.goal-tip .gt-dot{width:7px;height:7px;border-radius:50%;background:var(--green);display:inline-block;}
.goal-tip .gt-main{min-width:0;display:flex;flex-direction:column;}
.goal-tip .gt-main b{font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.goal-tip .gt-sub{color:var(--muted2);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.goal-tip .gt-num,.goal-tip .gt-in,.goal-tip .gt-pct{text-align:right;white-space:nowrap;}
.goal-tip .gt-num{color:var(--muted);}
.goal-tip .gt-in{font-weight:600;color:var(--brand);}
.goal-tip .gt-pct{color:var(--muted);}
.goal-tip .gt-go{color:var(--muted2);text-align:right;}
.goal-tip .gt-row.gt-off{opacity:.6;}
.goal-tip .gt-row.gt-off .gt-dot{background:#cbd5e1;}
.goal-tip .gt-row.gt-off .gt-in{color:var(--muted2);font-weight:400;}
.goal-tip .gt-ft{
  display:flex;align-items:center;gap:10px;margin-top:6px;padding:6px 4px 2px;
  border-top:1px solid var(--line);color:var(--muted);font-size:12.5px;
}
.goal-tip .gt-ft b{color:var(--brand);}
.goal-tip .gt-ft-hint{margin-left:auto;color:var(--muted2);}
.goal-tip .gt-empty{padding:8px 4px;color:var(--muted2);}

/* ---- R14：目标粒度切换（年度 / Q1-Q4 分段控件，§3.2 第 1 层） ------------- */
.goal-grain{
  flex:1 0 100%;display:flex;gap:4px;align-items:center;margin:-4px 0 4px;
  padding-bottom:12px;border-bottom:1px dashed var(--line);
}
.goal-grain .gg-btn{
  position:relative;min-width:62px;height:28px;padding:0 12px;border:1px solid var(--line);
  background:#fff;color:var(--muted);font-size:13.5px;border-radius:14px;cursor:pointer;
  font-variant-numeric:tabular-nums;transition:background .15s,color .15s,border-color .15s;
}
.goal-grain .gg-btn:hover{border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.goal-grain .gg-btn.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600;}
.goal-grain .gg-dot{
  position:absolute;top:3px;right:6px;width:5px;height:5px;border-radius:50%;
  background:var(--orange);display:block;
}
.goal-grain .gg-btn.on .gg-dot{background:#fff;}
.goal-card-q{border-left:3px solid var(--accent);}
.goal-cd-lbl{display:block;font-size:13.5px;color:var(--muted);line-height:1.6;margin-bottom:8px;}
.goal-cd-input{
  height:34px;width:180px;border:1px solid var(--accent);border-radius:6px;padding:0 10px;
  font-size:14px;outline:none;font-variant-numeric:tabular-nums;
}

/* ---- 「今年」预设 chip（§4.5） ------------------------------------------ */
.chip{
  display:inline-flex;align-items:center;height:26px;padding:0 12px;border-radius:13px;
  border:1px solid var(--line);background:#fff;color:var(--muted);font-size:13px;
  cursor:pointer;user-select:none;white-space:nowrap;
}
.chip:hover{border-color:var(--accent);color:var(--accent);background:#f7fbff;}
.chip.on{background:var(--accent);border-color:var(--accent);color:#fff;}
.chip-date{font-variant-numeric:tabular-nums;}

/* ---- 导入预览「目标模块」下拉（§4.2） ----------------------------------- */
.imp-target{height:28px;border:1px solid var(--line);border-radius:6px;padding:0 6px;font-size:13.5px;background:#fff;}
.imp-target:focus{border-color:var(--accent);outline:none;}

/* ---- 契约 11 §3.2/§3.3：归属需确认行 + 关联字段匹配区块 ------------------ */
/* 归属是「表头猜的且源表列>1/3 不属于该模块」→ 琥珀色左框 + 淡底 */
.imp-row-needconf > td{background:#fff7ed;}
.imp-row-needconf > td:first-child{border-left:3px solid var(--orange);}
/* 行内警告小标（「（猜的）」/「未命中N个取值…」） */
.imp-warn-tag{color:#b45309;font-weight:700;font-size:12.5px;margin-left:4px;}
/* 关联字段匹配（只读提示）区块 */
.imp-relations{
  background:#f8fafc;border:1px solid var(--line);border-radius:6px;
  padding:8px 12px;font-size:13.5px;margin-bottom:10px;color:var(--text);
}
.imp-relations-title{font-weight:700;color:var(--brand);margin-bottom:5px;}
.imp-rel-item{margin:3px 0;line-height:1.7;}
.imp-rel-details{margin:3px 0 6px 4px;color:var(--muted);}
.imp-rel-details summary{cursor:pointer;color:var(--accent);font-size:13px;}
.imp-rel-detail-item{margin:2px 0 0 12px;font-size:13px;color:var(--muted);}

/* ---- TM-30：导入预览「格式体检」区块（值层规范化提示，不阻断导入） -------- */
.imp-values{
  background:var(--bg);border:1px solid var(--line);border-left:3px solid var(--orange);
  border-radius:6px;padding:8px 12px;font-size:13.5px;margin-bottom:10px;color:var(--text);
}
.imp-values-title{font-weight:700;color:var(--brand);margin-bottom:5px;line-height:1.6;}
.imp-values-title b{color:var(--green);}
.imp-values-title b.bad{color:var(--red);}
.imp-values-title .muted{font-weight:400;font-size:12.5px;margin-left:4px;}
.imp-val-tags{margin:2px 0 4px;}
.imp-val-tag{
  display:inline-block;background:var(--card);border:1px solid var(--line);border-radius:10px;
  padding:1px 8px;margin:2px 6px 2px 0;font-size:12px;color:var(--muted);
}
.imp-val-tag.bad{color:var(--red);border-color:#fecaca;}
.imp-val-details{margin:3px 0 2px;}
.imp-val-details summary{cursor:pointer;color:var(--accent);font-size:13px;}
.imp-val-item{margin:3px 0 0 8px;font-size:13px;color:var(--muted);line-height:1.65;}
.imp-val-hint{color:var(--muted2);margin-left:6px;}

/* ---- 契约 14 §3.1：按客户矩阵列宽（colgroup 固定布局 + 把手） ---------------
 * R49：`width:auto` 覆盖通用 `.grid-table{width:100%}` —— 否则列宽总和小于容器时，
 *   浏览器会把多余宽度按比例摊给各列，年份列被拉成巨宽（实测曾达 218px）。
 *   改 auto 后表宽 = 列宽总和（列宽由 orderMatrixHtml 动态算好），宽窄都由我们掌握。 */
/* R52：矩阵 = 「居中的报表卡」——卡片宽度由内容决定（views.js 内联 width，随拖列宽实时跟随），
   两侧露出页面底色当作页边距；表格本身内容定宽（width:auto），不再被容器拉伸 / 硬撑铺满。 */
.grid-table.ym-table.ym-fixed{table-layout:fixed;width:auto;}
.table-card.ym-panel{
  margin:14px auto 20px;max-width:100%;
  border-color:#e4eaf3;
  box-shadow:0 1px 2px rgba(15,23,42,.05),0 10px 28px rgba(31,56,100,.07);
}
.ym-table th.yhead{position:relative;overflow:visible;}
.ym-table th.yhead .col-resize{right:-3px;width:7px;z-index:5;}
.ym-table th.yhead .col-resize:hover{background:rgba(46,117,182,.22);}

/* ---- 契约 14 §3.5：导入引导（第一步选模块 + 预览分节） -------------------- */
.imp-pick-list{display:flex;flex-direction:column;gap:6px;}
.imp-pick-item{padding:9px 12px;border:1px solid var(--line);border-radius:8px;cursor:pointer;font-size:14px;background:#fff;display:flex;align-items:center;justify-content:space-between;gap:10px;}
.imp-pick-item:hover{border-color:var(--accent);background:#f7fbff;color:var(--accent);}
.imp-pick-tpl{flex:0 0 auto;font-size:13px;padding:3px 9px;line-height:1.4;}
.imp-pick-foot{margin-top:10px;display:flex;align-items:center;justify-content:space-between;gap:10px;}
.imp-sec{margin:12px 0 6px;color:var(--brand);font-size:13.5px;border-top:1px dashed var(--line);padding-top:8px;}
.imp-sec:first-child{border-top:none;padding-top:0;margin-top:0;}
.imp-sec b{font-weight:700;}

/* ---- 表单枚举「＋ 新增选项」行（§4.4） ---------------------------------- */
.enum-add{display:flex;align-items:center;gap:8px;margin-top:6px;font-size:13px;color:var(--accent);cursor:pointer;}

/* ---- KPI 卡统一规格（§3.6 / §3.8 R7） ----------------------------------- */
.kpi .k-val.dup{font-size:22px;}
.kpi .k-val.nil{color:#94a3b8;}
.kpi-unit{font-size:13px;font-weight:500;color:#94a3b8;margin-left:3px;}
.kpi-hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(15,23,42,.14);}
.kpi-tip{
  position:fixed;z-index:2800;max-width:420px;background:rgba(30,41,59,.96);color:#fff;
  border-radius:8px;padding:8px 12px;font-size:13px;line-height:1.5;
  box-shadow:0 10px 30px rgba(15,23,42,.3);pointer-events:none;
  word-break:break-all;white-space:normal;
}
.kpi-tip .kpi-bd{margin-top:4px;padding-top:4px;border-top:1px solid rgba(255,255,255,.18);color:#dbe4f0;}
.kpi-settings{width:540px;max-width:92vw;}
.kpi-settings-layer{margin-bottom:10px;}
.kpi-settings .kg{font-size:13px;color:var(--brand);font-weight:600;margin:8px 0 4px;}
.kpi-settings .kg-layer{color:var(--muted2);}
.kpi-settings .ki{display:inline-flex;align-items:center;gap:6px;margin:4px 16px 4px 0;font-size:13.5px;cursor:pointer;}
.kpi-settings .ki input{accent-color:var(--accent);}
.kpi-legend{flex:0 0 auto;}

/* 响应式列数（§3.6：≥1280 → 4 列；900–1280 → 3；<900 → 2；<640 → 1） */
@media (max-width:1279px){.kpi-grid{grid-template-columns:repeat(3,minmax(0,1fr));}}
@media (max-width:899px){.kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr));}}
@media (max-width:639px){.kpi-grid{grid-template-columns:minmax(0,1fr);}}

/* ---- R6：历史值 / 字段定义（§2.7） -------------------------------------- */
/* 值域外旧值：灰色 + 虚线 1px 下边框；覆盖 .tag 的行内彩色背景（非破坏性，仅视觉）。 */
.cell-hist{
  color:var(--muted2) !important;background:#f1f4f8 !important;
  border-bottom:1px dashed var(--muted2);border-radius:0;
}
/* R38 契约 32：调研定义「非参调价格(USD万)」自动计算态（不写库，实时 = 参调价 × 3） */
.cell-auto{color:#94a3b8;font-style:italic;}
.ftype-gear{color:var(--muted);cursor:pointer;font-size:14px;line-height:1;}
.ftype-gear:hover{color:var(--accent);}
.ftype-gear.disabled{opacity:.3;cursor:not-allowed;}
.ftype-gear.disabled:hover{color:var(--muted);}
.fdef-row{margin-bottom:12px;display:flex;flex-direction:column;gap:5px;}
.fdef-row label{font-size:13px;color:var(--muted);}
.fdef-row select,.fdef-row input[type=text]{
  height:32px;border:1px solid var(--line);border-radius:6px;padding:0 9px;outline:none;background:#fff;
}
.fdef-row select:focus,.fdef-row input[type=text]:focus{border-color:var(--accent);}
.fdef-opts{
  width:100%;min-height:88px;border:1px solid var(--line);border-radius:6px;padding:8px 10px;
  outline:none;resize:vertical;line-height:1.5;font-size:13.5px;
}
.fdef-opts:focus{border-color:var(--accent);}
.fdef-warn{background:#fff7ed;border:1px solid #fde3bd;border-radius:6px;padding:9px 12px;color:#9a5b06;font-size:13px;line-height:1.55;}
.fdef-warn b{color:#b45309;}
.fdef-note{font-size:12.5px;color:var(--muted2);}
/* R18：标签配色（色块列表 + 就近调色板）—— 立即生效，不随「保存」按钮 */
.cpal-list{display:flex;flex-wrap:wrap;gap:6px 14px;padding:2px 0 2px;}
.cpal-item{display:inline-flex;align-items:center;gap:6px;}
.cpal-sw{
  width:20px;height:20px;padding:0;border-radius:5px;flex:none;cursor:pointer;
  border:1px solid rgba(0,0,0,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.5);
  transition:transform .1s,box-shadow .1s;
}
.cpal-sw:hover{transform:scale(1.08);box-shadow:0 0 0 2px #dbeafe;}
.cpal-sw.auto{background:none;background-image:linear-gradient(135deg,#e2e8f0 0 25%,#fff 25% 50%,#e2e8f0 50% 75%,#fff 75%);}
.cpal-name{font-size:13px;color:var(--text);white-space:nowrap;}
.cpal-empty{font-size:13px;color:var(--muted2);}
/* z-index 铁律：色板挂在 body 上，但触发它的「字段定义」弹层是 .scrim(z=1500)，
   必须高过弹层遮罩才可点击（与 .cc-panel 同族）。低于 1500 会「看得见、点不到」。 */
.cpal-pop{
  position:fixed;z-index:2600;display:flex;flex-wrap:wrap;gap:6px;padding:8px;
  background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 8px 24px rgba(15,23,42,.16);
}
.cpal-dot{
  width:22px;height:22px;padding:0;border-radius:5px;border:1px solid rgba(0,0,0,.12);
  cursor:pointer;transition:transform .1s;
}
.cpal-dot:hover{transform:scale(1.12);}
.cpal-dot.on{box-shadow:0 0 0 2px var(--accent);}
.cpal-dot.cpal-reset{
  width:auto;min-width:44px;height:22px;padding:0 8px;background:#f1f5f9;color:var(--muted);
  font-size:12.5px;line-height:1;border-color:var(--line);
}
/* 受保护 / 派生字段：置灰 + 禁用光标（后端 PUT 亦 400，双保险） */
.fld-prot select,.fld-prot input,.fld-prot textarea{background:#f1f4f8;color:var(--muted2);cursor:not-allowed;}

/* ---- 筛选面板：历史值分组标题（§2.7） ----------------------------------- */
.filter-panel .fp-group{
  padding:6px 12px 2px;font-size:12px;color:var(--muted2);border-top:1px dashed var(--line);
  margin-top:4px;letter-spacing:.4px;
}

/* ======================================================================== */
/* 契约 10 §4：行右键菜单 + 草稿行样式                                       */
/* ======================================================================== */
.rowmenu { position: fixed; min-width: 132px; padding: 4px;
           background: #fff; border: 1px solid var(--line); border-radius: 8px;
           box-shadow: 0 10px 28px rgba(15,23,42,.18); font-size:14px; z-index: 2500; }
.rowmenu-item { display: flex; align-items: center; gap: 8px; padding: 7px 10px;
                border-radius: 6px; cursor: pointer; user-select: none; }
.rowmenu-item:hover, .rowmenu-item:focus { background: #eef2f7; outline: none; }
.rowmenu-item.danger { color: var(--red); }
.rowmenu-item.danger:hover { background: #fef2f2; }
.rowmenu-sep { height: 1px; margin: 4px 2px; background: var(--line); }

/* 草稿行（§3.5）：与数据行视觉可辨，但沿用既有网格样式 */
tr.draft-row { background: #fffdf3; outline: 1px dashed var(--line); }
tr.draft-row .draft-hint { color: var(--muted); font-size:13px; }
tr.draft-row .draft-cell { padding: 10px 14px; white-space: normal; }
tr.draft-row .draft-cell .form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 8px 14px; margin-top: 6px; }
tr.draft-row .draft-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 8px; }

/* toast 动作按钮（契约 10 §3.4「撤销」；toast(msg,type,action) 扩展） */
.toast-action { margin-left: 10px; border: 1px solid currentColor; background: transparent;
                color: inherit; border-radius: 6px; padding: 2px 8px; cursor: pointer; font: inherit; }
.toast-action:hover { background: rgba(255,255,255,.18); }

/* ======================================================================== */
/* 契约 14 §3.2：表上方「透视式筛选器」（维度 chip + ＋筛选维度）              */
/* ======================================================================== */
.fdim-bar{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:-2px 0 12px;}
.fchip{
  display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 6px 0 10px;
  border:1px solid var(--line);border-radius:13px;background:#fff;font-size:13.5px;
  color:var(--muted);cursor:pointer;user-select:none;transition:all .12s ease;
}
.fchip:hover{border-color:var(--accent);color:var(--accent);}
.fchip.on{background:#eef4fc;border-color:var(--accent);color:var(--accent);font-weight:600;}
.fchip .fchip-l{white-space:nowrap;}
.fchip .fchip-c{
  max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  background:rgba(46,117,182,.14);border-radius:9px;padding:0 7px;font-weight:500;font-size:12.5px;
}
.fchip .fchip-x{
  display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;
  border-radius:50%;color:var(--muted2);font-size:12px;line-height:1;
}
.fchip .fchip-x:hover{background:rgba(220,38,38,.14);color:var(--red);}
.fdim-add{flex:0 0 auto;}

/* 「＋筛选维度」浮层 */
.dim-panel{
  width:240px;max-height:320px;overflow:auto;background:#fff;border:1px solid var(--line);
  border-radius:8px;box-shadow:0 10px 28px rgba(15,23,42,.18);padding:6px;
}
.dim-panel .dp-head{font-size:13px;color:var(--muted2);padding:4px 8px 6px;border-bottom:1px solid var(--line);}
.dim-panel .dp-list{padding-top:4px;}
.dim-panel .dp-item{padding:6px 9px;border-radius:6px;font-size:13.5px;cursor:pointer;}
.dim-panel .dp-item:hover{background:#eef2f7;color:var(--accent);}
.dim-panel .dp-empty{color:var(--muted2);font-size:13px;padding:12px;text-align:center;}

/* ======================================================================== */
/* 契约 14 §3.4：概览组（带背景色容器卡 R5b + 呈现 R6 + 卡级拖拽 R5a）        */
/* ======================================================================== */
.dash-group{
  margin-bottom:16px;padding:12px 14px 14px;border-radius:12px;
  background:#f7f9fc;border:1px solid #e7edf5;   /* light 主题：浅底；组间留白靠 margin */
}
.dash-group-h{
  display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:var(--brand);
  margin:0 0 12px;border-left:3px solid var(--accent);padding:4px 0 4px 10px;   /* 组标题色条 */
  cursor:grab;user-select:none;background:transparent;border-radius:4px;
}
.dash-group-h .drag-grip{color:var(--muted2);font-size:13px;letter-spacing:-1px;}
.dash-group-h .dg-title{white-space:nowrap;}
.dash-group.dragging{opacity:.45;}
.dash-group.drag-over > .dash-group-h{
  border-left-color:#f59e0b;box-shadow:inset 0 -2px 0 #f59e0b;
}
.dash-pres,.dash-expand{flex:0 0 auto;cursor:pointer;}
.dash-pres{
  height:24px;border:1px solid var(--line);border-radius:6px;background:#fff;
  padding:0 6px;font-size:13px;color:var(--text);
}
.dash-expand{font-size:12.5px;padding:2px 8px;}
.dash-group-chart{
  background:#fff;border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin-bottom:12px;
}
/* 契约 14 §3.4 R6 修复：概览组图形随布局自适应 ——
   铺满卡片宽度 + 高度封顶。原实现 SVG 无任何尺寸约束，viewBox 等比放大后
   在宽屏（卡片 >1000px）会渲染成 ~500px 高的巨幅，与卡片布局不协调。 */
.dash-group-chart svg{display:block;width:100%;height:auto;max-height:230px;margin:0 auto;}
.dash-group-chart .chart-empty{height:120px;}
/* 图形呈现时，数值卡默认收起（§3.4 去重）；可手动展开 */
.kpi-grid.dg-collapsed{display:none;}
/* 组内卡级拖拽视觉（R5a）：拖动中半透明 + 落点指示 */
.kpi.card-dragging{opacity:.5;}
.kpi.card-drag-over{outline:2px dashed var(--accent);outline-offset:2px;}

/* 水平条（漏斗/阶段图，charts.js hBars 产出） */
.hbars{display:flex;flex-direction:column;gap:8px;}
.hb-row{display:flex;align-items:center;gap:10px;}
.hb-row .hb-l{
  flex:0 0 96px;max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:13px;color:var(--muted);
}
.hb-row .hb-track{flex:1 1 auto;height:16px;background:#eef2f7;border-radius:8px;overflow:hidden;}
.hb-row .hb-fill{display:block;height:100%;border-radius:8px;transition:width .2s ease;}
.hb-row .hb-v{flex:0 0 auto;font-size:13px;color:var(--brand);font-variant-numeric:tabular-nums;}

/* 契约 29：漏斗/阶段图右侧「等效金额」列（机会概览 = 各阶段 Σ 加权金额） */
.hbars .hb-head{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--muted2);padding:0 0 2px;}
.hbars .hb-head > span:first-child{flex:0 0 96px;max-width:96px;}
.hbars .hb-head > span:nth-child(2){flex:1 1 auto;}
.hbars .hb-head .hb-r{flex:0 0 auto;text-align:right;min-width:66px;}
.hbars .hb-amt{flex:0 0 auto;min-width:66px;text-align:right;font-size:13px;color:var(--accent);font-variant-numeric:tabular-nums;}
.hbars .hb-amt.nil{color:var(--muted2);}
.hbars.has-amt .hb-row{gap:8px;}

/* 契约 29：块卡副值（「N 个 · X 万」——数量旁的等效金额） */
.kpi .k-val .k-subv{font-size:13px;color:var(--muted);margin-left:6px;font-weight:500;font-variant-numeric:tabular-nums;}
.kpi .k-val .k-subv .kpi-unit{font-size:11px;}

/* 契约 29：「⚙ 设置目标」弹层（本年度 + Q1–Q4） */
.goal-setup .gs-year{margin-bottom:12px;}
.goal-setup .gs-row{display:flex;align-items:center;gap:10px;margin:6px 0;}
.goal-setup .gs-k{flex:0 0 92px;font-size:13.5px;color:var(--text);}
.goal-setup .gs-row input[type=number]{
  flex:1 1 auto;min-width:0;padding:6px 8px;border:1px solid var(--line);border-radius:6px;
  font-size:14px;font-variant-numeric:tabular-nums;
}
.goal-setup .gs-row input[type=number]:focus{outline:2px solid var(--accent);outline-offset:-1px;}
.goal-setup .gs-row input[type=number]:disabled{background:#f1f5f9;color:var(--muted);}
.goal-setup .gs-row.big .gs-k{font-weight:600;}
.goal-setup .gs-sum{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted);cursor:pointer;margin-top:4px;}
.goal-setup .gs-qs{border-top:1px dashed var(--line);padding-top:10px;}
.goal-setup .gs-title{font-size:13px;color:var(--brand);font-weight:600;margin-bottom:6px;}
.goal-setup .gs-row.now .gs-k{color:var(--brand);font-weight:600;}
.goal-setup .gs-dot{width:6px;height:6px;border-radius:50%;background:var(--accent);display:inline-block;vertical-align:middle;}

/* TM-18：按顾问拆分（顾问在前、管理者垫底） */
.goal-setup .gs-split{border-top:1px dashed var(--line);padding-top:10px;margin-top:12px;}
.goal-setup .gs-split .gs-title{display:block;}
.goal-setup .gs-tip{display:block;font-size:11.5px;color:var(--muted2);font-weight:400;margin-top:2px;line-height:1.5;}
.goal-setup .gs-sub{font-size:11.5px;color:var(--muted2);margin:8px 0 2px;letter-spacing:.2px;}
.goal-setup .gs-split-row{margin:4px 0;}
.goal-setup .gs-split-row .gs-k{flex:0 0 150px;display:flex;align-items:center;gap:6px;
  overflow:hidden;white-space:nowrap;}
.goal-setup .gs-split-row.owner .gs-k{color:var(--muted);}
.goal-setup .gs-tag{font-style:normal;font-size:10.5px;color:var(--muted2);
  background:#f1f5f9;border-radius:8px;padding:0 6px;flex:0 0 auto;}
.goal-setup .gs-split-sum{margin-top:10px;font-size:12.5px;color:var(--muted);
  font-variant-numeric:tabular-nums;line-height:1.6;}
.goal-setup .gs-split-sum b{color:var(--text);font-weight:600;}
.goal-setup .gs-split-sum.over,.goal-setup .gs-split-sum.over b{color:var(--orange);}
.goal-setup .gs-split-empty{font-size:12.5px;color:var(--muted2);padding:6px 0;}
.goal-setup .gs-bad{color:#b91c1c;}

/* 契约 29：仪表盘配置弹层 —— 组级开关行 + 提示 */
.kpi-settings .kg-all{display:flex;align-items:center;width:100%;margin:0 0 2px;font-weight:600;color:var(--brand);}
.kpi-settings .kg-hint{font-size:12px;color:var(--muted2);font-weight:400;margin-left:6px;}
.kpi-settings .modal-foot .btn.sm{align-self:center;}

/* 「指标设置」弹层：按概览组分组（含块卡小节） */
.kpi-settings-group{margin-bottom:12px;padding-bottom:8px;border-bottom:1px dashed var(--line);}
.kpi-settings-group:last-child{border-bottom:none;}
.kpi-settings .kg-sub{font-size:12.5px;color:var(--muted2);font-weight:500;margin:6px 0 2px;}

/* ============================================================================
 * 契约 15 §2：冻结列（首列默认冻结；表头右键菜单改列 / 取消）
 * - 冻结块 = 展开列(30px, col-frozen-expander) + 冻结数据列(col-frozen, col-frozen-edge)
 * - left 偏移由 JS 实测展开列宽度后以 inline style 写入（不在此硬编码 30px）
 * - 每个行状态背景必须不透明（否则滚动时行内容从冻结格底下透出）
 * ==========================================================================*/

/* 冻结列定位：展开列吸附 left:0，数据列吸附其右侧（left 由 JS 写 inline） */
table.grid-table td.col-frozen-expander,
table.grid-table th.col-frozen-expander{position:sticky;left:0;z-index:2;}
table.grid-table td.col-frozen{position:sticky;z-index:2;}

/* 冻结列表头必须高于同级表头（否则横向滚动时普通表头盖住冻结表头）；
   .col-resize 把手 z-index:4 在其 th 的层叠上下文内，仍可命中 */
table.grid-table thead th.col-frozen,
table.grid-table thead th.col-frozen-expander{z-index:5;}

/* ★ 不透明背景（常态）；hover / row-flag / flash-row 由既有更具体的规则覆盖（均不透明） */
table.grid-table tbody td.col-frozen,
table.grid-table tbody td.col-frozen-expander{background:var(--card);}

/* 冻结块右缘可见分隔（!important 以压过 flash-row 的 inset 阴影） */
table.grid-table td.col-frozen-edge,
table.grid-table th.col-frozen-edge{box-shadow:2px 0 0 0 rgba(15,44,87,.18) !important;}

/* 冻结列表头内的图钉标记 */
table.grid-table thead th .th-pin{flex:0 0 auto;font-size:12px;line-height:1;opacity:.95;}

/* 契约 15 §2.4：表头右键「冻结 / 取消冻结」菜单 */
.col-freeze-menu{
  position:fixed;z-index:2200;min-width:150px;
  background:var(--card);border:1px solid var(--line);border-radius:8px;
  box-shadow:0 6px 20px rgba(15,23,42,.16);padding:4px;
}
.col-freeze-menu .cfm-item{
  padding:7px 10px;border-radius:6px;cursor:pointer;color:var(--text);
  font-size:13.5px;white-space:nowrap;
}
.col-freeze-menu .cfm-item:hover{background:#eef4fc;color:var(--accent);}

/* ============================================================================
 * 契约 15 §3：历史订单工具栏（赢单自动转订单入口）
 * ==========================================================================*/
.table-toolbar .auto-order-wrap{
  display:inline-flex;align-items:center;gap:6px;
  font-size:13.5px;color:var(--text);cursor:pointer;user-select:none;
}
.table-toolbar .auto-order-wrap input{width:15px;height:15px;margin:0;cursor:pointer;}

/* ============================================================================
 * 无障碍：键盘焦点可见
 * 全库此前有 13 处 outline:none 且无任何 :focus-visible 兜底 —— 键盘用户
 * （Tab 导航）完全看不到焦点落在哪。以下规则只在「键盘交互」时显示焦点环，
 * 鼠标点击不显示；用 !important 覆盖既有更高特异度的 outline:none。
 * ==========================================================================*/
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
button:focus-visible,
a:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible,
[contenteditable="true"]:focus-visible{
  outline:2px solid var(--accent) !important;
  outline-offset:2px;
}
.seg:focus-visible,
.kpi:focus-visible,
.dash-pres:focus-visible,
.dash-expand:focus-visible,
.side-btn:focus-visible,
.btn:focus-visible,
.rowmenu-item:focus-visible{
  outline:2px solid var(--accent) !important;
  outline-offset:2px;
}
/* 表格单元格选区（契约 10 §3.4 扩展 · R4 Excel 手感）
 * - .cell-sel  ：选区填充（整块淡蓝）
 * - .cell-anchor：锚点格（Excel 里保持"空白"的那一格）→ 用主题色内描边标出
 * - 冻结列是 sticky 且自带背景，需再显式覆盖一次，否则看不出被选中
 */
.grid-table td.data-cell{cursor:cell;}
.grid-table td.data-cell.cell-sel{background:#eaf3ff;}
.grid-table td.data-cell.cell-sel .cell{font-weight:600;}
.grid-table td.data-cell.cell-anchor{background:#fff;box-shadow:inset 0 0 0 2px var(--accent);}
.grid-table td.data-cell.cell-anchor .cell{font-weight:600;}
.grid-table tbody td.col-frozen.cell-sel{background:#eaf3ff;}
.grid-table tbody td.col-frozen.cell-anchor{background:#fff;}
/* 框选拖拽中：锁掉文本选择，避免拖动时选中一堆行文字 */
.grid-table.dragging-cells,
.grid-table.dragging-cells *{user-select:none;-webkit-user-select:none;}

/* 表格内编辑控件：焦点环向内收，避免撑破行高造成布局跳动 */
.grid-table input:focus-visible,
.grid-table select:focus-visible,
.grid-table textarea:focus-visible{
  outline-offset:-1px;
}

/* ============================================================================
 * 契约 17 §2.4 —— 矩阵绿格 hover 明细浮层（#md-ymtip）
 * 浅色底 + 深色字；圆角 + 分层阴影；最大宽度约 420px，内容超长内部滚动。
 * 定位（left/top）由 views.js 内联写入，此处仅保持 position:fixed + pointer-events:none。
 * z-index 高于抽屉（drawer-scrim 1600 / panel 1601）。
 * ==========================================================================*/
.ym-tip{
  position:fixed;z-index:2900;max-width:420px;max-height:70vh;overflow:auto;
  background:#ffffff;color:#1e293b;border:1px solid var(--line);border-radius:10px;
  padding:8px 10px;font-size:13px;line-height:1.5;font-variant-numeric:tabular-nums;
  box-shadow:0 12px 32px rgba(15,23,42,.22),0 2px 6px rgba(15,23,42,.12);
  pointer-events:none;
}
/* 复用 .ydetail 内容：去掉浮层内的底色/分隔线上填充，改为紧凑左对齐 */
.ym-tip .ydetail{background:transparent;border-top:none;}
.ym-tip .ydetail .yd-wrap{padding:0;justify-content:flex-start;}
.ym-tip .ydetail th,.ym-tip .ydetail td{padding:3px 12px 3px 0;}
.ym-tip .ydetail thead th{color:var(--brand);}
.ym-tip .ydetail td.num,.ym-tip .ydetail th.num{text-align:right;}
/* 契约 17 裁决②：截断提示行（还有 N 条…）弱化呈现 */
.ym-tip .ydetail tr.yd-more td{color:var(--muted);font-style:italic;border-bottom:none;padding-top:4px;}
/* 契约 20：表头整格可点排序（原仅 .th-label 36px 热区），光标提示 */
table.grid-table thead th.col-th{cursor:pointer;}
table.grid-table thead th.col-th .th-filter{cursor:default;}

/* ============================================================================
 * R26：工作台「一句话记录 → 待办」组件
 * 依赖既有 token（--card/--line/--accent/--muted/--muted2/--red/--green）。
 * 注意：自定义 display 值会覆盖 hidden 属性（历史教训），故此处不用 [hidden]。
 * ==========================================================================*/

/* ---- 一句话记录框 ---- */
.wb-quick{margin-bottom:16px;}
.wq-bar{display:flex;align-items:center;gap:10px;background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius);box-shadow:var(--shadow);padding:10px 12px;}
.wq-bar:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px rgba(46,117,182,.12);}
.wq-ico{color:var(--accent);display:inline-flex;flex:none;}
.wq-bar input{flex:1 1 auto;border:none;outline:none;background:transparent;font-size:14px;height:26px;}
.wq-bar input::placeholder{color:var(--muted2);}
.wq-btn{flex:none;}
.wq-prev{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:10px 2px 0;}
.wq-hint{color:var(--muted2);font-size:13px;line-height:1.6;}
.wq-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--card);
  border-radius:6px;padding:4px 9px;font-size:13px;color:var(--text);}
.wq-chip b{font-weight:400;color:var(--muted2);font-size:12px;}
.wq-chip.on{border-color:#cfe3f7;background:#f4f9ff;}
.wq-chip.warn{border-color:#f8d7c4;background:#fff7f2;color:#8a4b1f;}

/* ---- 我的待办面板 ---- */
.wb-todo-panel .p-body{max-height:none;padding:0;}
.td-sec{border-bottom:1px solid var(--line);}
.td-sec:last-child{border-bottom:none;}
.td-sec-h{display:flex;align-items:center;gap:8px;padding:8px 14px;background:#fafbfe;font-size:13px;
  font-weight:600;color:var(--muted);}
.td-sec-h .n{color:var(--muted2);font-weight:400;}
.td-sec-h.over{color:var(--red);background:#fff7f7;}
.td-sec-h.now{color:#b45309;background:#fffaf0;}
.td-sec-h.done{color:var(--muted2);}
.td-row{display:flex;align-items:center;gap:10px;padding:8px 14px;border-bottom:1px solid #f6f8fb;font-size:13.5px;}
.td-row:last-child{border-bottom:none;}
.td-row:hover{background:#f9fbff;}
.td-row .sp{flex:1 1 auto;}

.td-check{width:16px;height:16px;flex:none;border-radius:50%;border:1.5px solid #cbd5e1;background:#fff;
  cursor:pointer;padding:0;position:relative;transition:border-color .12s,background .12s;}
.td-check:hover{border-color:var(--accent);}
.td-check:focus-visible{outline:none;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--accent);}
.td-check.on{background:var(--green);border-color:var(--green);}
.td-check.on::after{content:"";position:absolute;left:5px;top:2px;width:3px;height:7px;
  border:solid #fff;border-width:0 1.6px 1.6px 0;transform:rotate(45deg);}

.td-content{color:var(--text);}
.td-row.done .td-content{color:var(--muted2);text-decoration:line-through;}
.td-tag{flex:none;font-size:12px;border-radius:4px;padding:1px 6px;background:#eef2f7;color:var(--muted);}
.td-tag.client{background:#eef4fc;color:var(--accent);cursor:pointer;}
.td-tag.client:hover{background:#e0edfb;text-decoration:underline;}
.td-tag.pri-高{background:#fdecec;color:var(--red);}
.td-tag.pri-中{background:#fff5e6;color:#b45309;}
.td-tag.pri-低{background:#eef2f7;color:var(--muted2);}
.td-due{flex:none;font-size:12.5px;color:var(--muted);}
.td-due.red{color:var(--red);font-weight:600;}
.td-due.orange{color:var(--orange);font-weight:600;}
.td-due.muted{color:var(--muted2);}
/* 客户全名可能很长（如"某科技集团股份有限公司（特殊普通合伙）"）→ 截断，悬停看全名 */
.td-tag.client{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* ---- TM-32：待办「我的 | 团队」两态切换 + 只读团队视图 ---- */
/* 开关只有老板会看到（能力位 can_view_team_todos）；默认态「我的」视觉零变化。 */
.td-scope{display:inline-flex;align-items:stretch;flex:none;margin-right:8px;
  border:1px solid var(--line);border-radius:999px;overflow:hidden;background:#fff;}
.td-scope button{border:none;background:transparent;color:var(--muted);cursor:pointer;
  font-size:12.5px;line-height:1.6;padding:2px 12px;font-family:inherit;}
.td-scope button + button{border-left:1px solid var(--line);}
.td-scope button:hover{color:var(--accent);}
.td-scope button.on{background:var(--accent);color:#fff;}
.td-scope button:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--accent);}
.td-ro{flex:none;margin-left:6px;padding:1px 7px;border-radius:4px;font-size:12px;
  background:#eef2f7;color:var(--muted2);}
.td-row.ro{background:#fcfdff;}
.td-row.ro:hover{background:#f7faff;}
/* 只读行的客户名不是跳转入口（无 data-td-client）→ 不给手型、不给下划线 */
.td-tag.client.ro{cursor:default;}
.td-tag.client.ro:hover{background:#eef4fc;text-decoration:none;}
/* 「负责人」标签：团队视图里唯一新增的元素（不写清是谁的，团队视图没有意义） */
.td-owner{flex:none;max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  padding:1px 7px;border-radius:4px;font-size:12px;background:#f1f5fb;color:var(--muted);}

/* ---- 待归类收件箱 ---- */
.wb-inbox-panel .p-body{max-height:none;padding:0;}
.td-inbox-hint{padding:10px 14px;color:var(--muted2);font-size:13px;background:#fffdf7;
  border-bottom:1px solid var(--line);line-height:1.6;}
.td-row.inbox{gap:8px;}
.td-row.inbox .td-content{flex:1 1 auto;min-width:160px;}
.td-in-client,.td-in-due{height:28px;border:1px solid var(--line);border-radius:6px;padding:0 8px;
  font-size:13px;background:#fff;flex:none;}
.td-in-client{width:220px;}
.td-in-due{width:150px;}
.td-in-client:focus,.td-in-due:focus{outline:none;border-color:var(--accent);}
.btn.sm{height:26px;padding:0 10px;font-size:13px;}

/* ---- 窄屏：收件箱行自动折行 ---- */
@media (max-width:900px){
  .td-row.inbox{flex-wrap:wrap;}
  .td-row.inbox .td-content{flex-basis:100%;}
  .td-in-client{width:100%;}
  .td-in-due{width:auto;flex:1 1 120px;}
}

/* ============================================================================
 * R27：全局「一句话记录」弹窗 + 意图回显
 * 复用 R26 的 .wq-prev / .wq-chip（预览 chips 与工作台记录框同源）。
 * ==========================================================================*/

.qc-modal{width:640px;max-width:calc(100vw - 40px);}
.qc-input{width:100%;height:36px;border:1px solid var(--line);border-radius:8px;padding:0 12px;
  font-size:14px;box-sizing:border-box;}
.qc-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(46,117,182,.12);}
.qc-tip{color:var(--muted2);font-size:13px;margin-right:auto;}

/* 由一句话记录打开的表单：顶部回显原句（知道自己说过的原话，便于纠错） */
.qc-note{margin:0 0 12px;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;
  background:#f8fafc;color:var(--muted);font-size:13.5px;line-height:1.6;}
.qc-note b{color:var(--text);font-weight:600;}

/* 顶栏 ＋ 按钮：与刷新按钮同形，但给一点主色调提示「这里能记东西」 */
#btn-quick{color:var(--accent);font-weight:600;}

/* ============================================================================
 * 团队版 §6：登录页 / 改密 / 顶栏用户区
 * 独立类名前缀 auth- / tb-user-，不与既有 .seg / .schip 等通用类冲突。
 * 深浅色均按「浅色主题」（本项目唯一主题）取值，颜色一律走 :root token。
 * ==========================================================================*/

.auth-screen{
  position:fixed; inset:0; z-index:9000;
  display:flex; align-items:center; justify-content:center;
  background:linear-gradient(160deg,#eef3fb 0%,#f7f9fc 55%,#eaf0f9 100%);
  padding:24px; overflow:auto;
}
/* 顶栏「改密」弹的版本：叠在既有 overlay 之上，背景半透明 */
.auth-screen-inline{z-index:9500;background:rgba(15,23,42,.38);}

.auth-card{
  width:100%; max-width:380px; background:var(--card);
  border:1px solid var(--line); border-radius:14px;
  box-shadow:0 18px 44px rgba(15,23,42,.14);
  padding:30px 28px 24px; text-align:center;
}
.auth-logo img{width:56px;height:56px;display:block;margin:0 auto 12px;}
.auth-title{margin:0 0 6px;font-size:19px;font-weight:600;color:var(--brand);letter-spacing:.4px;}
.auth-sub{margin:0 0 20px;font-size:13px;color:var(--muted);}

.auth-form{text-align:left;}
.auth-field{margin-bottom:14px;}
.auth-field label{
  display:block; margin-bottom:6px;
  font-size:12.5px; color:var(--muted); font-weight:600;
}
.auth-field input{
  width:100%; height:38px; padding:0 12px;
  border:1px solid #d8e0ea; border-radius:var(--radius);
  background:#fbfcfe; outline:none; transition:border-color .15s, box-shadow .15s;
}
.auth-field input:focus{
  border-color:var(--accent); background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);
}

.auth-submit{
  width:100%; height:40px; margin-top:6px;
  border:0; border-radius:var(--radius);
  background:var(--accent); color:#fff;
  font-weight:600; letter-spacing:1px;
  transition:background .15s, opacity .15s;
}
.auth-submit:hover{background:#2867a3;}
.auth-submit:disabled{opacity:.6;cursor:default;}

.auth-cancel{
  width:100%; height:34px; margin-top:10px;
  border:1px solid #d8e0ea; border-radius:var(--radius);
  background:#fff; color:var(--muted);
}
.auth-cancel:hover{background:#f6f8fb;}

.auth-msg{
  min-height:18px; margin-top:10px;
  font-size:12.5px; color:var(--muted); text-align:center;
}
.auth-msg.err{color:var(--red);}
.auth-msg.ok{color:var(--green);}

.auth-foot{
  margin-top:16px; padding-top:14px;
  border-top:1px solid var(--line);
  font-size:12px; color:var(--muted2);
}

/* ---- 顶栏用户区（单机模式不渲染） ----------------------------------------*/
/* TM-07 菜单化后右侧只剩「管理 ▾ + 用户菜单」，间距从 6px 放宽到 10px */
.tb-user{
  display:flex; align-items:center; gap:10px;
  margin-left:12px; padding-left:14px;
  border-left:1px solid var(--line);
  white-space:nowrap;
}
.tb-user-name{
  font-size:12.5px; color:var(--muted);
  max-width:180px; overflow:hidden; text-overflow:ellipsis;
}
.tb-user-btn{
  height:30px; padding:0 12px;
  border:1px solid #d8e0ea; border-radius:6px;
  background:#fff; color:var(--muted);
  font-size:12.5px; line-height:1;
}
.tb-user-btn:hover{border-color:var(--accent);color:var(--accent);background:#f7fafd;}

/* ============================================================================
 * TM-07（2026-10-17）：顶栏菜单化
 * admin 的 4 个管理入口收进「管理 ▾」下拉；改密/登出收进用户头像菜单。
 * 目标：顶栏右侧只剩 2~3 个元素，解决「账号信息一多就拥挤」。
 * 类名一律 `tb-menu-*` / `tb-avatar` 独立前缀（防全局类覆盖，项目铁律）。
 * ==========================================================================*/
.tb-menu-wrap{position:relative;display:inline-flex;}
.tb-menu-btn .tb-caret{font-size:10px;margin-left:5px;color:var(--muted2);}
.tb-menu-wrap.open .tb-menu-btn{
  border-color:var(--accent);color:var(--accent);background:#f7fafd;
}
.tb-menu-panel{
  position:absolute;top:calc(100% + 8px);right:0;z-index:80;
  min-width:184px;padding:6px;display:none;
  background:var(--card);border:1px solid var(--line);border-radius:10px;
  box-shadow:0 12px 30px rgba(15,40,80,.16);
}
.tb-menu-panel-user{min-width:160px;}
.tb-menu-wrap.open .tb-menu-panel{display:block;}
.tb-menu-item{
  width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;
  height:36px;padding:0 12px;
  border:0;border-radius:7px;background:transparent;
  color:var(--text);font-size:13px;text-align:left;
}
.tb-menu-item:hover{background:#f2f7fc;color:var(--accent);}
.tb-menu-note{
  padding:5px 12px 7px;
  font-size:12px;color:var(--muted2);line-height:1.5;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.tb-menu-sep{height:1px;background:var(--line);margin:4px 6px;}
.tb-user-chip{
  display:inline-flex;align-items:center;gap:8px;
  height:34px;padding:0 12px 0 5px;
  border:1px solid transparent;border-radius:17px;background:transparent;
  font-size:inherit;
}
.tb-user-chip:hover{background:#f2f7fc;border-color:var(--line);}
.tb-user-chip:hover .tb-user-name{color:var(--accent);}
.tb-avatar{
  width:25px;height:25px;border-radius:50%;flex:none;
  background:var(--brand);color:#fff;
  font-size:12.5px;font-weight:600;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;
}
/* 待处理菜单项：复用原 .tb-pending（inline-flex+gap4），角标跟在文字后 */
.tb-menu-item.tb-pending{gap:8px;}
.tb-menu-item .tb-pending-badge{position:static;}

/* ============================================================================
 * 团队版 §6：冲突角标 + 待处理区 + 乐观锁对话框（TM-01）
 * 类名一律 `cf-` 前缀 —— 项目笔记教训：复用全局类（如 .seg）会被既有样式
 * 以更高特异性覆盖（垂直尺寸冲突）。独立前缀是唯一稳妥做法。
 * ==========================================================================*/

/* ---- 顶栏「待处理」按钮 + 角标 ---- */
.tb-pending{position:relative;display:inline-flex;align-items:center;gap:4px;}
.tb-pending-badge{
  display:inline-block;min-width:16px;height:16px;padding:0 4px;
  border-radius:8px;background:var(--orange);color:#fff;
  font-size:11px;line-height:16px;text-align:center;font-weight:600;
}

/* ---- 表格行冲突角标 ---- */
tr.cf-row-conflict > td:first-child{
  box-shadow:inset 3px 0 0 var(--orange);
}
tr.cf-row-conflict{background:#fffbf2;}

/* ---- 通用遮罩与卡片 ---- */
.cf-mask{
  position:fixed;inset:0;z-index:1200;
  background:rgba(15,23,42,.34);
  display:flex;align-items:center;justify-content:center;
  padding:24px;
}
.cf-card{
  background:var(--card);border-radius:var(--radius);
  box-shadow:0 12px 40px rgba(15,23,42,.22);
  width:min(560px,100%);max-height:82vh;overflow:auto;
  padding:20px 22px;
}
.cf-card-wide{width:min(820px,100%);}
.cf-title{font-size:16px;font-weight:600;color:var(--text);margin-bottom:6px;}
.cf-sub{font-size:12.5px;color:var(--muted);margin-bottom:14px;line-height:1.6;}

/* ---- 差异表 ---- */
.cf-diff{width:100%;border-collapse:collapse;margin:8px 0 14px;font-size:13px;}
.cf-diff th{
  text-align:left;font-weight:600;color:var(--muted);
  background:#f7f9fc;padding:7px 10px;border-bottom:1px solid var(--line);
}
.cf-diff td{padding:7px 10px;border-bottom:1px solid var(--line);vertical-align:top;
  word-break:break-all;}
.cf-diff td.cf-f{color:var(--muted);width:26%;}
.cf-diff td.cf-mine{color:#b45309;background:#fffbeb;}
.cf-diff td.cf-theirs{color:#0f5132;background:#f0fdf4;}

/* ---- 按钮区 ---- */
.cf-actions{display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap;margin-top:12px;}
.cf-actions-inline{justify-content:flex-start;margin-top:8px;}
.cf-btn{
  padding:7px 14px;border:1px solid #d8e0ea;border-radius:6px;
  background:#fff;color:var(--muted);font-size:12.5px;line-height:1;
}
.cf-btn:hover{border-color:var(--accent);color:var(--accent);background:#f7fafd;}
.cf-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.cf-btn-primary:hover{background:#2765a0;color:#fff;}
.cf-btn[disabled]{opacity:.55;cursor:default;}

/* ---- 提示与错误 ---- */
.cf-msg{font-size:12.5px;color:var(--muted);min-height:16px;}
.cf-msg-err{color:var(--red);}
.cf-empty{padding:22px;text-align:center;color:var(--muted2);font-size:13px;}
.cf-full{
  max-height:240px;overflow:auto;background:#f7f9fc;border:1px solid var(--line);
  border-radius:6px;padding:10px;font-size:12px;line-height:1.5;
  white-space:pre-wrap;word-break:break-all;margin:8px 0;
}

/* ---- 待处理列表 ---- */
.cf-list{max-height:56vh;overflow:auto;}
.cf-item{
  border:1px solid var(--line);border-radius:var(--radius);
  padding:12px 14px;margin-bottom:10px;background:#fcfdff;
}
.cf-item-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.cf-item-kind{
  font-size:11px;padding:2px 7px;border-radius:9px;
  background:#fff3e0;color:#b45309;font-weight:600;
}
.cf-item-label{font-weight:600;color:var(--text);font-size:13.5px;}
.cf-item-meta{font-size:11.5px;color:var(--muted2);margin-left:auto;}
.cf-item-sub{font-size:11.5px;color:var(--muted);margin:6px 0 4px;}

/* ==========================================================================
   T12 方案 β：离线横幅 + 网关模式小标（FE7）
   类名一律 of- 前缀（项目教训：复用全局类如 .seg 会被高特异性规则覆盖）。
   横幅挂在 .main-col 内、#view 之前 —— 不参与 renderActive 的整视图重建。
   ========================================================================== */

.of-bar{
  display:flex;align-items:center;gap:8px;
  padding:7px 14px;font-size:13px;line-height:1.4;
  background:#fff4d6;color:#8a5a00;
  border-bottom:1px solid #f0d18a;
  flex:none;
}
.of-bar .of-icon{font-size:14px;flex:none;}
.of-bar .of-text{flex:0 1 auto;min-width:0;}
.of-bar .of-spacer{flex:1 1 auto;}
.of-bar .of-btn{
  flex:none;border:1px solid #e0b657;background:#fff;color:#8a5a00;
  border-radius:6px;padding:3px 10px;font-size:12px;cursor:pointer;
}
.of-bar .of-btn:hover:not(:disabled){background:#fffaf0;border-color:#c99a2e;}
.of-bar .of-btn:disabled{opacity:.6;cursor:default;}

/* 顶栏「在线 / 离线」小标（独立 id=#mode-chip） */
.of-chip{
  display:inline-flex;align-items:center;flex:none;
  border-radius:10px;padding:2px 9px;font-size:11.5px;font-weight:600;
  margin-left:8px;white-space:nowrap;
}
.of-chip-online{background:#e8f5e9;color:#2e7d32;border:1px solid #b7dfb9;}
.of-chip-offline{background:#fff4d6;color:#8a5a00;border:1px solid #f0d18a;}

/* --- A4：数据新鲜度分级（docs/42 §9.2 M28 / M34） --------------------------
   7 天转橙、14 天加重（加粗 + 更沉的底色）。
   ★ 分级**只改颜色**，绝不隐藏按钮、绝不强制只读 —— 离线仍要能录入。
   注意：`.of-bar.of-stale-*` 用双类提高特异性，避免被上面的 `.of-bar` 覆盖。 */
.of-bar.of-stale-warn{
  background:#fff0d9;color:#8a4b00;border-bottom-color:#e8ad55;
}
.of-bar.of-stale-hot{
  background:#ffe3d6;color:#8a2b00;border-bottom-color:#e08a5a;
  font-weight:600;
}

/* --- A4：仪表盘顶部的「数据范围」标注（offline.js/sync.js 的 of-scope-note） ---
   只在离线时由 Sync.scopeNote() 插入；单机/在线不渲染该元素。 */
.of-scope-note{
  margin:0 0 10px;padding:6px 12px;
  font-size:12.5px;line-height:1.5;color:#8a5a00;
  background:#fffaf0;border:1px solid #f0d18a;border-radius:6px;
}

/* ============================================================================
 * 团队版 T13：主库管理面板（快照导出 / 升格 / 降级）（TM-03）
 * 类名一律 `host-` 前缀 —— 项目笔记教训：复用全局类会被既有样式以更高
 * 特异性覆盖。`.host-card` 只覆盖 `.auth-card` 的宽度与对齐，不改动它本身。
 * ==========================================================================*/
.host-card{
  max-width:560px;
  text-align:left;
  padding:22px 24px 18px;
  max-height:86vh;
  overflow:auto;
}

/* ---- 头部 ---- */
.host-head{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.host-head-icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;border-radius:6px;
  background:var(--brand);color:#fff;flex:none;
}
.host-title{margin:0;font-size:16px;font-weight:600;color:var(--brand);flex:1 1 auto;}
.host-close{
  flex:none;width:26px;height:26px;line-height:1;
  border:1px solid #d8e0ea;border-radius:6px;background:#fff;
  color:var(--muted);font-size:16px;
}
.host-close:hover{border-color:var(--accent);color:var(--accent);}
.host-sub{margin:0 0 14px;font-size:12.5px;color:var(--muted);line-height:1.6;}

/* ---- 身份卡 ---- */
.host-ident{
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fbfcfe;padding:12px 14px;margin-bottom:16px;
}
.host-ident-line{display:flex;align-items:center;gap:8px;margin-bottom:10px;}
.host-chip{
  display:inline-flex;align-items:center;flex:none;
  border-radius:10px;padding:2px 9px;font-size:11.5px;font-weight:600;
}
.host-chip-on{background:#e8f5e9;color:#2e7d32;border:1px solid #b7dfb9;}
.host-chip-off{background:#f1f5f9;color:#64748b;border:1px solid #dbe3ec;}
.host-ident-name{font-size:13px;font-weight:600;color:var(--text);}
.host-dl{
  display:grid;grid-template-columns:76px 1fr;
  gap:4px 10px;margin:0;font-size:12.5px;
}
.host-dl dt{color:var(--muted2);}
.host-dl dd{
  margin:0;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.host-warn{
  margin:10px 0 0;padding:7px 10px;border-radius:6px;
  background:#fff4d6;color:#8a5a00;font-size:12px;line-height:1.5;
}

/* ---- 分区 ---- */
.host-sec{
  border-top:1px solid var(--line);
  padding:14px 0 4px;
}
.host-sec-title{margin:0 0 5px;font-size:13.5px;font-weight:600;color:var(--text);}
.host-sec-desc{margin:0 0 10px;font-size:12.5px;color:var(--muted);line-height:1.6;}
.host-sec-danger .host-sec-title{color:#b45309;}

.host-btn{
  height:32px;padding:0 14px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fff;color:var(--muted);font-size:12.5px;
}
.host-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:#f7fafd;}
.host-btn:disabled{opacity:.6;cursor:default;}
.host-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.host-btn-primary:hover:not(:disabled){background:#2867a3;border-color:#2867a3;color:#fff;}
.host-btn-warn{background:#f59e0b;border-color:#f59e0b;color:#fff;}
.host-btn-warn:hover:not(:disabled){background:#d97f06;border-color:#d97f06;color:#fff;}
.host-btn-danger{background:#dc2626;border-color:#dc2626;color:#fff;}
.host-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c;color:#fff;}
.host-btn-row{display:flex;gap:8px;align-items:center;}

.host-input{
  width:100%;height:34px;padding:0 11px;margin-bottom:9px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;
}
.host-input:focus{border-color:var(--accent);background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);}

.host-out:empty{display:none;}
.host-out{
  margin-top:10px;padding:9px 11px;border-radius:6px;
  font-size:12.5px;line-height:1.7;word-break:break-all;
}
.host-out code{
  background:rgba(15,23,42,.06);border-radius:4px;
  padding:1px 5px;font-size:12px;
}
.host-out-ok{background:#e8f5e9;color:#1b5e20;border:1px solid #b7dfb9;}
.host-out-err{background:#fdecea;color:#a02020;border:1px solid #f5c2c0;}
.host-out-info{background:#eef4fc;color:#28527a;border:1px solid #cfe0f3;}
.host-steps{margin:6px 0 0;padding-left:18px;}
.host-steps li{margin:2px 0;}
.host-force{margin-top:9px;}

.host-note{
  margin:10px 0 0;padding:8px 10px;border-radius:6px;
  background:#f8fafc;color:var(--muted2);font-size:12px;line-height:1.6;
}
.host-foot{
  display:flex;justify-content:flex-end;
  margin-top:14px;padding-top:12px;border-top:1px solid var(--line);
}
.host-foot .auth-cancel{width:auto;padding:0 16px;margin-top:0;}

/* 顶栏「主库」按钮（仅管理员） */
.tb-host{font-weight:600;}
.tb-host:hover{border-color:var(--brand);color:var(--brand);}

/* ============================================================================
 * 团队版 T14：备份与容灾面板（TM-04）
 * 类名一律 `bk-` 前缀（独立于 host-* 与所有全局类）。
 * 骨架复用 `.auth-screen/.auth-card`，此段只加内部结构样式。
 * ==========================================================================*/
.bk-card{
  max-width:620px;
  text-align:left;
  padding:22px 24px 18px;
  max-height:86vh;
  overflow:auto;
}

/* ---- 现状条 ---- */
.bk-status{
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fbfcfe;padding:12px 14px;margin-bottom:16px;
}
.bk-loading{font-size:12.5px;color:var(--muted);}
.bk-path-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;}
.bk-k{flex:none;font-size:12px;color:var(--muted2);min-width:60px;}
.bk-v{font-size:12.5px;color:var(--text);}
.bk-chip{
  display:inline-flex;align-items:center;flex:none;
  border-radius:10px;padding:2px 9px;font-size:11.5px;font-weight:600;
}
.bk-chip-on{background:#e8f5e9;color:#2e7d32;border:1px solid #b7dfb9;}
.bk-chip-off{background:#fff4d6;color:#8a5a00;border:1px solid #f0d18a;}
.bk-path{
  font-family:var(--mono,ui-monospace,Consolas,monospace);
  font-size:12px;color:var(--text);word-break:break-all;
  background:#fff;border:1px solid var(--line);border-radius:5px;
  padding:5px 8px;margin-bottom:8px;
}
.bk-meta-row{display:flex;align-items:baseline;gap:8px;margin-top:5px;}
.bk-advice{
  margin-top:9px;padding:7px 10px;border-radius:6px;
  background:#fff4d6;color:#8a5a00;font-size:12px;line-height:1.55;
}

/* ---- 清单 ---- */
.bk-list{
  border:1px solid var(--line);border-radius:var(--radius);
  overflow:hidden;margin:4px 0 8px;
}
.bk-item{
  display:flex;align-items:center;gap:10px;
  padding:7px 11px;border-bottom:1px solid var(--line);
  background:#fff;
}
.bk-item:last-child{border-bottom:none;}
.bk-item-main{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px;}
.bk-item-name{
  font-size:12.5px;color:var(--text);
  font-family:var(--mono,ui-monospace,Consolas,monospace);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.bk-item-tags{display:inline-flex;align-items:center;gap:5px;flex:none;}
.bk-tag{
  border-radius:9px;padding:1px 7px;font-size:11px;font-weight:600;
}
.bk-tag-daily{background:#e8f1fd;color:#1a5fb4;border:1px solid #c3daf7;}
.bk-tag-monthly{background:#f0e9fb;color:#6b3fa0;border:1px solid #d9c9f2;}
.bk-tag-migration{background:#fdeee8;color:#b3502a;border:1px solid #f6d3c4;}
.bk-tag-other{background:#f1f5f9;color:#64748b;border:1px solid #dbe3ec;}
.bk-item-date{font-size:11.5px;color:var(--muted2);}
.bk-item-side{display:flex;align-items:center;gap:9px;flex:none;}
.bk-item-size{font-size:11.5px;color:var(--muted2);min-width:56px;text-align:right;}
.bk-item-time{font-size:11.5px;color:var(--muted2);min-width:76px;text-align:right;}
.bk-restore{
  border:1px solid #d8e0ea;border-radius:5px;background:#fff;
  color:var(--muted);font-size:11.5px;padding:2px 9px;
}
.bk-restore:hover{border-color:var(--accent);color:var(--accent);}
.bk-more{
  display:block;width:100%;margin:0 0 8px;
  border:1px dashed var(--line);border-radius:6px;background:#fff;
  color:var(--muted);font-size:12px;padding:6px 0;
}
.bk-more:hover{border-color:var(--accent);color:var(--accent);}

/* 顶栏「备份」按钮（仅管理员） */
.tb-backup{font-weight:600;}
.tb-backup:hover{border-color:var(--brand);color:var(--brand);}

/* T14 补充：备份面板动作按钮不换行（「保存位置」被挤两行的事故） */
.bk-card .host-btn{white-space:nowrap;flex:none;}
.bk-card .host-btn-row{flex-wrap:wrap;}

/* ============================================================================
 * 团队版 T15：归属健康检查面板（TM-05）
 * 类名一律 `ag-` 前缀（独立于 host-* / bk-* 与所有全局类）。
 * 骨架复用 `.auth-screen/.auth-card`，此段只加内部结构样式。
 * ==========================================================================*/
.ag-card{
  max-width:640px;
  text-align:left;
  padding:22px 24px 18px;
  max-height:86vh;
  overflow:auto;
}

/* ---- 结论条 ---- */
.ag-summary{
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fbfcfe;padding:12px 14px;margin-bottom:14px;
}
.ag-summary-line{display:flex;align-items:center;gap:9px;}
.ag-summary-main{font-size:13px;font-weight:600;color:var(--text);}
.ag-summary-sub{margin-top:6px;font-size:12px;color:var(--muted);line-height:1.55;}
.ag-chip{
  display:inline-flex;align-items:center;flex:none;
  border-radius:10px;padding:2px 9px;font-size:11.5px;font-weight:600;
}
.ag-chip-ok{background:#e8f5e9;color:#2e7d32;border:1px solid #b7dfb9;}
.ag-chip-warn{background:#fff4d6;color:#8a5a00;border:1px solid #f0d18a;}
.ag-alldone{
  padding:10px 12px;border-radius:6px;background:#e8f5e9;color:#2e7d32;
  font-size:12.5px;border:1px solid #b7dfb9;
}

/* ---- 归属分布 ---- */
.ag-stats{
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fff;padding:6px 10px;margin:4px 0 8px;
}
.ag-stat{
  display:flex;align-items:center;gap:8px;
  padding:4px 2px;border-bottom:1px solid #f1f5f9;font-size:12.5px;
}
.ag-stat:last-child{border-bottom:none;}
.ag-stat-name{flex:1 1 auto;color:var(--text);}
.ag-stat-name.ag-stat-unknown{color:#b3502a;}
.ag-stat-count{flex:none;color:var(--muted2);font-size:11.5px;}
.ag-stat-tag{
  flex:none;border-radius:9px;padding:1px 7px;font-size:11px;
  background:#fdeee8;color:#b3502a;border:1px solid #f6d3c4;
}

/* ---- 无归属清单 ---- */
.ag-list{
  border:1px solid var(--line);border-radius:var(--radius);
  overflow:hidden;margin:4px 0 8px;
}
.ag-row{
  display:flex;align-items:center;gap:8px;
  padding:6px 10px;border-bottom:1px solid var(--line);background:#fff;
}
.ag-row:last-child{border-bottom:none;}
.ag-row-name{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:7px;}
.ag-row-company{
  font-size:12.5px;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.ag-row-id{flex:none;font-size:11px;color:var(--muted2);}
.ag-row-sel{
  flex:none;max-width:150px;height:26px;
  border:1px solid #d8e0ea;border-radius:5px;background:#fff;
  color:var(--text);font-size:12px;padding:0 4px;
}
.ag-row-sel:focus{border-color:var(--accent);outline:none;}
.ag-row-save{
  flex:none;height:26px;padding:0 11px;white-space:nowrap;
  border:1px solid #d8e0ea;border-radius:5px;background:#fff;
  color:var(--muted);font-size:12px;
}
.ag-row-save:not(:disabled):hover{border-color:var(--brand);color:var(--brand);}
.ag-row-save:disabled{opacity:.45;cursor:default;}

/* 顶栏「归属」按钮（仅管理员） */
.tb-assign{font-weight:600;}
.tb-assign:hover{border-color:var(--brand);color:var(--brand);}

/* ============================================================================
 * A5 / C3：客户端开通（批量预开通）面板（TM-10）
 * 类名一律 `pv-` 前缀 —— 与 host- / backup- 同一约定：**不复用** `.seg` 等
 * 全局类（既有规则特异性更高，复用只能靠堆选择器对抗，越写越脆）。
 * `.pv-card` 只覆盖 `.auth-card` 的宽度/对齐，不改动它本身。
 * ==========================================================================*/
.pv-card{
  max-width:620px;
  text-align:left;
  padding:22px 24px 18px;
  max-height:88vh;
  overflow:auto;
}

/* ---- 头部 ---- */
.pv-head{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.pv-head-icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;border-radius:6px;
  background:var(--brand);color:#fff;flex:none;
}
.pv-title{margin:0;font-size:16px;font-weight:600;color:var(--brand);flex:1 1 auto;}
.pv-close{
  flex:none;width:26px;height:26px;line-height:1;
  border:1px solid #d8e0ea;border-radius:6px;background:#fff;
  color:var(--muted);font-size:16px;
}
.pv-close:hover{border-color:var(--accent);color:var(--accent);}
.pv-sub{margin:0 0 14px;font-size:12.5px;color:var(--muted);line-height:1.6;}

/* ---- 分区 ---- */
.pv-sec{border-top:1px solid var(--line);padding:14px 0 4px;}
.pv-sec-head{display:flex;align-items:center;gap:8px;}
.pv-sec-title{margin:0 0 5px;font-size:13.5px;font-weight:600;color:var(--text);flex:1 1 auto;}
.pv-sec-tools{display:flex;gap:10px;align-items:center;margin-bottom:5px;}
.pv-sec-run{padding-bottom:8px;}

.pv-field{margin-bottom:10px;}
.pv-field-inline{display:flex;align-items:center;gap:9px;}
.pv-label{display:block;margin-bottom:5px;font-size:12px;color:var(--muted2);}
.pv-field-inline .pv-label{margin-bottom:0;}
.pv-input{
  width:100%;height:34px;padding:0 11px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;color:var(--text);
}
.pv-input:focus{border-color:var(--accent);background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);}
.pv-input-num{width:78px;flex:none;}
.pv-hint{margin:0;font-size:11.5px;color:var(--muted2);line-height:1.6;}

/* ---- 账号多选 ---- */
.pv-list{
  max-height:230px;overflow:auto;
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fff;padding:4px;
}
.pv-row{
  display:flex;align-items:center;gap:9px;
  padding:6px 8px;border-radius:5px;cursor:pointer;
}
.pv-row:hover{background:#f5f9fd;}
.pv-row-off{opacity:.62;cursor:default;}
.pv-check{flex:none;width:14px;height:14px;margin:0;accent-color:var(--accent);}
.pv-who{display:flex;align-items:baseline;gap:8px;min-width:0;flex:1 1 auto;}
.pv-who-name{font-size:12.5px;color:var(--text);font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pv-who-acc{font-size:11.5px;color:var(--muted2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pv-badge{
  flex:none;border-radius:9px;padding:1px 8px;
  font-size:11px;font-weight:600;
  background:#f1f5f9;color:#64748b;border:1px solid #dbe3ec;
}
.pv-badge-off{background:#fdecea;color:#a02020;border-color:#f5c2c0;}
.pv-empty{margin:6px;font-size:12.5px;color:var(--muted2);line-height:1.6;}

/* ---- 按钮 ---- */
.pv-btn-row{display:flex;gap:10px;align-items:center;}
.pv-btn{
  height:32px;padding:0 14px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fff;color:var(--muted);font-size:12.5px;
}
.pv-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:#f7fafd;}
.pv-btn:disabled{opacity:.55;cursor:default;}
.pv-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.pv-btn-primary:hover:not(:disabled){background:#2867a3;border-color:#2867a3;color:#fff;}
.pv-link{
  border:none;background:none;padding:0;
  color:var(--accent);font-size:12px;cursor:pointer;
}
.pv-link:hover{text-decoration:underline;}
.pv-picked{font-size:12px;color:var(--muted2);}

/* ---- 结果 ---- */
.pv-out:empty{display:none;}
.pv-out{
  margin-top:12px;padding:11px 12px;border-radius:6px;
  border:1px solid var(--line);background:#fbfcfe;
  font-size:12.5px;line-height:1.7;
}
.pv-out-err{background:#fdecea;color:#a02020;border-color:#f5c2c0;word-break:break-all;}
.pv-res-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:8px;}
.pv-res-title{font-size:12.5px;color:var(--text);}
.pv-res-dir{
  font-size:11.5px;color:var(--muted2);
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.pv-res-table{border:1px solid var(--line);border-radius:5px;background:#fff;overflow:hidden;}
.pv-res-row{
  display:grid;grid-template-columns:1.1fr .6fr 1.9fr .8fr;
  gap:8px;padding:6px 9px;border-top:1px solid var(--line);
  align-items:center;
}
.pv-res-row:first-child{border-top:none;}
.pv-res-row-head{
  background:#f4f7fb;color:var(--muted2);font-size:11.5px;font-weight:600;
}
.pv-res-c1{font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pv-res-c2{color:var(--text);white-space:nowrap;}
.pv-res-c3{color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pv-res-c4{color:var(--muted2);white-space:nowrap;}

/* 异常项：必须比成功项更显眼（R15：漏看一条 = 同事机器上一片空白） */
.pv-res-bad{
  margin-top:11px;padding:9px 11px;border-radius:6px;
  background:#fdecea;border:1px solid #f5c2c0;
}
.pv-res-bad-title{font-size:12.5px;font-weight:600;color:#a02020;margin-bottom:6px;}
.pv-res-bad-row{display:flex;gap:8px;align-items:flex-start;padding:3px 0;}
.pv-res-bad-who{flex:none;max-width:38%;font-size:12px;font-weight:600;color:#7f1d1d;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pv-res-bad-why{flex:1 1 auto;font-size:12px;color:#a02020;line-height:1.55;}
.pv-res-hint{margin:10px 0 0;padding:7px 10px;border-radius:5px;
  background:#eef4fc;color:#28527a;font-size:11.5px;line-height:1.6;}

/* ---- 页脚 ---- */
.pv-note{
  margin:12px 0 0;padding:8px 10px;border-radius:6px;
  background:#f8fafc;color:var(--muted2);font-size:12px;line-height:1.6;
}
.pv-foot{
  display:flex;justify-content:flex-end;
  margin-top:12px;padding-top:12px;border-top:1px solid var(--line);
}

/* ==========================================================================
 * TM-11：账号管理面板（`#tb-menu-accounts` → `window.Accounts`）
 *
 * 独立前缀 `ac-`，**不复用** `.seg` / `.pv-*` / `.ag-*` 等既有类。
 * 理由见 app/accounts.js 头部：复用全局类会被更高特异性规则覆盖，
 * 之后每修一次都要加一层特异性，最后没人敢动。
 * `.ac-card` 只覆盖 `.auth-card` 的宽/对齐，不改动它本身。
 * ==========================================================================*/
.ac-card{
  max-width:760px;
  text-align:left;
  padding:22px 24px 18px;
  max-height:88vh;
  overflow:auto;
}

/* ---- 头部 ---- */
.ac-head{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.ac-head-icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;border-radius:6px;
  background:var(--brand);color:#fff;flex:none;
}
.ac-title{margin:0;font-size:16px;font-weight:600;color:var(--brand);flex:1 1 auto;}
.ac-close{
  flex:none;width:26px;height:26px;line-height:1;
  border:1px solid #d8e0ea;border-radius:6px;background:#fff;
  color:var(--muted);font-size:16px;
}
.ac-close:hover{border-color:var(--accent);color:var(--accent);}
.ac-sub{margin:0 0 13px;font-size:12.5px;color:var(--muted);line-height:1.65;}

/* ---- 顶部提示条 / 错误块 ---- */
.ac-flash{
  display:flex;align-items:center;gap:8px;
  margin:0 0 12px;padding:9px 12px;border-radius:6px;
  background:#e9f7ef;border:1px solid #b7e2c6;color:#186b3a;
  font-size:12.5px;line-height:1.55;
}
.ac-flash-ico{
  flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:50%;
  background:#2f9e5f;color:#fff;font-size:11px;font-weight:700;
}
.ac-out{
  margin:0 0 12px;padding:10px 12px;border-radius:6px;
  border:1px solid var(--line);background:#fbfcfe;
  font-size:12.5px;line-height:1.65;
}
.ac-out-err{background:#fdecea;color:#a02020;border-color:#f5c2c0;word-break:break-all;}

/* ---- 分区 ---- */
.ac-sec{border-top:1px solid var(--line);padding:14px 0 4px;}
.ac-sec-head{display:flex;align-items:baseline;gap:9px;margin-bottom:6px;}
.ac-sec-title{margin:0;font-size:13.5px;font-weight:600;color:var(--text);}
.ac-count{margin-left:auto;font-size:11.5px;color:var(--muted2);}

/* ---- 账号列表 ---- */
.ac-list{
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fff;overflow:hidden;
}
.ac-row{
  display:grid;
  grid-template-columns:1.15fr .95fr .55fr .62fr .58fr 1fr 1.45fr;
  gap:8px;align-items:center;padding:7px 10px;
}
.ac-row-head{
  background:#f4f7fb;color:var(--muted2);
  font-size:11.5px;font-weight:600;border-bottom:1px solid var(--line);
}
.ac-row-body{border-top:1px solid var(--line);font-size:12.5px;}
.ac-row-body:first-of-type{border-top:none;}
.ac-row-body:hover{background:#f8fbfe;}
.ac-row-off{opacity:.66;}
.ac-c1{font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ac-c2{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ac-c3,.ac-c4,.ac-c5{color:var(--muted);white-space:nowrap;}
.ac-c6{color:var(--muted2);white-space:nowrap;font-size:11.5px;}
.ac-item{display:block;}
.ac-tag{
  margin-left:6px;padding:0 5px;border-radius:8px;
  background:#eef4fc;color:#28527a;font-size:10.5px;font-weight:600;
}
.ac-badge{
  display:inline-block;border-radius:9px;padding:1px 8px;
  font-size:11px;font-weight:600;
  background:#f1f5f9;color:#64748b;border:1px solid #dbe3ec;
}
.ac-badge-on{background:#e9f7ef;color:#186b3a;border-color:#b7e2c6;}
.ac-badge-off{background:#fdecea;color:#a02020;border-color:#f5c2c0;}
.ac-badge-warn{background:#fff7e6;color:#8a5a00;border-color:#f3d9a4;}
.ac-dash{color:#b8c2cc;}
.ac-ops{display:flex;gap:10px;align-items:center;justify-content:flex-end;}
.ac-link{
  border:none;background:none;padding:0;cursor:pointer;
  color:var(--accent);font-size:12px;
}
.ac-link:hover:not(:disabled){text-decoration:underline;}
.ac-link:disabled{color:#b8c2cc;cursor:default;}
.ac-link-warn{color:#a05a00;}
.ac-link-ok{color:#186b3a;}
.ac-link-danger{color:#a02020;font-weight:600;}
.ac-empty{margin:10px 12px;font-size:12.5px;color:var(--muted2);line-height:1.6;}
.ac-hint{margin:7px 0 0;font-size:11.5px;color:var(--muted2);line-height:1.6;}

/* ---- 行内操作条（重置密码 / 二次确认）---- */
.ac-inline{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:8px 12px 9px;background:#f7fafd;
  border-top:1px dashed var(--line);
}
.ac-inline-warn{background:#fffaf2;border-top:1px dashed #f3d9a4;}
.ac-inline-label{font-size:11.5px;color:var(--muted2);flex:none;}
.ac-inline-text{font-size:12px;color:#8a5a00;line-height:1.55;flex:1 1 100%;}
.ac-inline-err{font-size:12px;color:#a02020;flex:1 1 100%;}
.ac-inline-hint{font-size:11.5px;color:var(--muted2);}

/* ---- 新建账号表单 ---- */
.ac-form{display:block;}
.ac-field{margin-bottom:10px;}
.ac-field-check{display:flex;align-items:center;gap:8px;}
.ac-label{display:block;margin-bottom:5px;font-size:12px;color:var(--muted2);}
.ac-input{
  width:100%;height:34px;padding:0 11px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;color:var(--text);
}
.ac-input:focus{border-color:var(--accent);background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);}
.ac-input-pwd{width:200px;flex:none;}
.ac-select{cursor:pointer;}
.ac-check{width:14px;height:14px;margin:0;accent-color:var(--accent);}
.ac-check-label{font-size:12.5px;color:var(--text);cursor:pointer;}

/* 黄字软校验：姓名不在归属候选里 → 只是提醒，不阻断提交 */
.ac-warn{
  margin:2px 0 10px;padding:8px 11px;border-radius:6px;
  font-size:12px;line-height:1.6;border:1px solid transparent;
}
.ac-warn-quiet{background:#f8fafc;color:var(--muted2);border-color:var(--line);}
.ac-warn-ok{background:#e9f7ef;color:#186b3a;border-color:#b7e2c6;}
.ac-warn-hot{background:#fff8e1;color:#8a5a00;border-color:#f3d9a4;}

/* ---- 按钮 ---- */
.ac-btn{
  height:32px;padding:0 14px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fff;color:var(--muted);font-size:12.5px;cursor:pointer;
}
.ac-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:#f7fafd;}
.ac-btn:disabled{opacity:.55;cursor:default;}
.ac-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.ac-btn-primary:hover:not(:disabled){background:#2867a3;border-color:#2867a3;color:#fff;}
.ac-btn-danger{background:#c0392b;border-color:#c0392b;color:#fff;}
.ac-btn-danger:hover:not(:disabled){background:#a5301f;border-color:#a5301f;color:#fff;}
.ac-submit{width:100%;height:36px;font-size:13px;}

/* ---- 页脚 ---- */
.ac-foot{
  display:flex;justify-content:flex-end;
  margin-top:12px;padding-top:12px;border-top:1px solid var(--line);
}

/* ==========================================================================
 * TM-12：团队管理面板（`#tb-menu-roster` → `window.Roster`）
 *
 * 独立前缀 `rc-`（先 grep 查重：全库无冲突），样式口径照抄 `.ac-*`
 * （同一家族的卡片/列表/表单观感，避免用户在两个面板间感到割裂）。
 * 另含客户界面的归属控件样式：`.rc-owner-lock` / `.rc-owner-pick`。
 * ==========================================================================*/
.rc-card{
  max-width:720px;
  text-align:left;
  padding:22px 24px 18px;
  max-height:88vh;
  overflow:auto;
}

/* ---- 头部 ---- */
.rc-head{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.rc-head-icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;border-radius:6px;
  background:var(--brand);color:#fff;flex:none;
}
.rc-title{margin:0;font-size:16px;font-weight:600;color:var(--brand);flex:1 1 auto;}
.rc-close{
  flex:none;width:26px;height:26px;line-height:1;
  border:1px solid #d8e0ea;border-radius:6px;background:#fff;
  color:var(--muted);font-size:16px;
}
.rc-close:hover{border-color:var(--accent);color:var(--accent);}
.rc-sub{margin:0 0 13px;font-size:12.5px;color:var(--muted);line-height:1.65;}
.rc-note{
  margin:0 0 12px;padding:8px 12px;border-radius:6px;
  background:#f8fafc;border:1px solid var(--line);
  color:var(--muted2);font-size:12px;line-height:1.6;
}

/* ---- 顶部提示条 / 错误块 ---- */
.rc-flash{
  display:flex;align-items:center;gap:8px;
  margin:0 0 12px;padding:9px 12px;border-radius:6px;
  background:#e9f7ef;border:1px solid #b7e2c6;color:#186b3a;
  font-size:12.5px;line-height:1.55;
}
.rc-flash-ico{
  flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:50%;
  background:#2f9e5f;color:#fff;font-size:11px;font-weight:700;
}
.rc-out{
  margin:0 0 12px;padding:10px 12px;border-radius:6px;
  border:1px solid var(--line);background:#fbfcfe;
  font-size:12.5px;line-height:1.65;
}
.rc-out-err{background:#fdecea;color:#a02020;border-color:#f5c2c0;word-break:break-all;}

/* ---- 分区 ---- */
.rc-sec{border-top:1px solid var(--line);padding:14px 0 4px;}
.rc-sec-head{display:flex;align-items:baseline;gap:9px;margin-bottom:6px;}
.rc-sec-title{margin:0 0 6px;font-size:13.5px;font-weight:600;color:var(--text);}
.rc-count{margin-left:auto;font-size:11.5px;color:var(--muted2);}

/* ---- 名册列表 ---- */
.rc-list{
  border:1px solid var(--line);border-radius:var(--radius);
  background:#fff;overflow:hidden;
}
.rc-row{
  display:grid;
  grid-template-columns:1.2fr .7fr 1fr .8fr .7fr;
  gap:8px;align-items:center;padding:7px 10px;
}
.rc-row-head{
  background:#f4f7fb;color:var(--muted2);
  font-size:11.5px;font-weight:600;border-bottom:1px solid var(--line);
}
.rc-row-body{border-top:1px solid var(--line);font-size:12.5px;}
.rc-row-body:first-of-type{border-top:none;}
.rc-row-body:hover{background:#f8fbfe;}
.rc-c1{font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rc-c2{color:var(--text);white-space:nowrap;}
.rc-c3,.rc-c4{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.rc-dash{color:#b8c2cc;}
.rc-badge{
  display:inline-block;border-radius:9px;padding:1px 8px;
  font-size:11px;font-weight:600;
  background:#f1f5f9;color:#64748b;border:1px solid #dbe3ec;
}
.rc-badge-owner{background:#eef4fc;color:#28527a;border-color:#c4dbf1;}
.rc-badge-cons{background:#f1f5f9;color:#64748b;border-color:#dbe3ec;}
.rc-badge-num{background:#e9f7ef;color:#186b3a;border-color:#b7e2c6;}
.rc-badge-zero{background:#f8fafc;color:#b8c2cc;border-color:#e5ebf2;}
.rc-empty{margin:10px 12px;font-size:12.5px;color:var(--muted2);line-height:1.6;}
.rc-hint{margin:7px 0 0;font-size:11.5px;color:var(--muted2);line-height:1.6;}

/* ---- 行内二次确认（移除成员）---- */
.rc-inline{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:8px 12px 9px;background:#f7fafd;
  border-top:1px dashed var(--line);
}
.rc-inline-warn{background:#fffaf2;border-top:1px dashed #f3d9a4;}
.rc-inline-text{font-size:12px;color:#8a5a00;line-height:1.55;flex:1 1 100%;}

/* ---- 添加成员表单 ---- */
.rc-form{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;}
.rc-field{margin-bottom:2px;}
.rc-field-name{flex:2 1 220px;}
.rc-field-role{flex:1 1 120px;}
.rc-label{display:block;margin-bottom:5px;font-size:12px;color:var(--muted2);}
.rc-input{
  width:100%;height:34px;padding:0 11px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;color:var(--text);
}
.rc-input:focus{border-color:var(--accent);background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);}
.rc-select{cursor:pointer;}

/* ---- 按钮 ---- */
.rc-btn{
  height:32px;padding:0 14px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fff;color:var(--muted);font-size:12.5px;cursor:pointer;
}
.rc-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:#f7fafd;}
.rc-btn:disabled{opacity:.55;cursor:default;}
.rc-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.rc-btn-primary:hover:not(:disabled){background:#2867a3;border-color:#2867a3;color:#fff;}
.rc-btn-danger{background:#c0392b;border-color:#c0392b;color:#fff;}
.rc-btn-danger:hover:not(:disabled){background:#a5301f;border-color:#a5301f;color:#fff;}
.rc-submit{height:34px;padding:0 18px;}

/* ---- 页脚 ---- */
.rc-foot{
  display:flex;justify-content:flex-end;
  margin-top:12px;padding-top:12px;border-top:1px solid var(--line);
}

/* ---- 客户界面：归属控件（views.js ownerFieldHtml / table.js startEdit）---- */
/* 顾问视角：只读文本 + 锁图标（不可点击、不可聚焦，杜绝"看起来能改"的错觉） */
.rc-owner-lock{
  display:inline-flex;align-items:center;gap:5px;
  padding:5px 10px;border-radius:var(--radius);
  background:#f4f7fb;border:1px solid var(--line);
  color:var(--text);font-size:12.5px;line-height:1.4;
  user-select:none;
}
/* admin 视角：受控下拉（候选 = 名册姓名），观感与普通输入一致 */
.rc-owner-pick{
  width:100%;height:34px;padding:0 8px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;color:var(--text);
  cursor:pointer;
}
.rc-owner-pick:focus{border-color:var(--accent);background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);}
/* 行内编辑用的紧凑版（单元格高度内） */
.cell-input.rc-owner-pick{
  width:100%;height:26px;padding:0 6px;
  box-shadow:none;font-size:12px;
}

/* ==========================================================================
 * TM-13：客户转移审批流（transfer.js）+ 批量勾选（table.js）+ 展开箭头开关
 *
 * 三个前缀互不重名（先 grep 确认）：
 *   `tf-`   转移选择弹层 / 待处理面板里的转移申请区块
 *   `tfb-`  批量转移浮出操作条（table.js 的勾选条）
 *   `.rowpick` 行首展开格内的勾选框（不加新列 —— dist/ 契约冻结结构）
 * ==========================================================================*/

/* ---- 转移选择弹层（复用 auth-card 骨架，只调宽度）---- */
.tf-card{max-width:430px;text-align:left;padding:22px 24px 18px;}
.tf-head{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.tf-title{margin:0;font-size:16px;font-weight:600;color:var(--brand);flex:1 1 auto;}
.tf-close{
  flex:none;width:26px;height:26px;line-height:1;
  border:1px solid #d8e0ea;border-radius:6px;background:#fff;
  color:var(--muted);font-size:16px;cursor:pointer;
}
.tf-close:hover{border-color:var(--accent);color:var(--accent);}
.tf-sub{margin:0 0 13px;font-size:12.5px;color:var(--muted);line-height:1.65;}
.tf-form{display:block;}
.tf-label{display:block;margin-bottom:5px;font-size:12px;color:var(--muted2);}
.tf-select{
  width:100%;height:34px;padding:0 8px;margin-bottom:10px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;color:var(--text);cursor:pointer;
}
.tf-select:focus{border-color:var(--accent);background:#fff;
  box-shadow:0 0 0 3px rgba(46,117,182,.14);}
.tf-err{
  margin:0 0 10px;padding:8px 11px;border-radius:6px;
  background:#fdecea;color:#a02020;border:1px solid #f5c2c0;
  font-size:12px;line-height:1.55;
}
.tf-actions{display:flex;justify-content:flex-end;gap:9px;}
.tf-btn{
  height:32px;padding:0 14px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fff;color:var(--muted);font-size:12.5px;cursor:pointer;
}
.tf-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:#f7fafd;}
.tf-btn:disabled{opacity:.55;cursor:default;}
.tf-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;}
.tf-btn-primary:hover:not(:disabled){background:#2867a3;border-color:#2867a3;color:#fff;}
.tf-btn-sm{height:26px;padding:0 10px;font-size:12px;}

/* ---- 待处理面板顶部的转移申请区块 ---- */
.tf-pending{
  margin:0 0 12px;padding:10px 12px;border-radius:6px;
  background:#f7fafd;border:1px solid var(--line);
}
.tf-pending-head{margin-bottom:6px;}
.tf-pending-title{font-size:12.5px;font-weight:600;color:var(--text);}
.tf-pending-err{font-size:12px;color:#a02020;}
.tf-item{
  display:flex;align-items:center;gap:8px;
  padding:5px 0;border-top:1px dashed var(--line);font-size:12.5px;
}
.tf-item:first-of-type{border-top:none;}
.tf-item-company{font-weight:600;color:var(--text);flex:1 1 auto;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tf-item-route{color:var(--muted);white-space:nowrap;}
.tf-item-ops{display:flex;gap:6px;flex:none;}

/* ---- 批量转移浮出操作条（table.js 勾选后出现，挂 body）---- */
#tf-batch-bar{
  position:fixed;left:50%;transform:translateX(-50%);
  bottom:18px;z-index:2400;
  display:flex;align-items:center;gap:10px;
  padding:9px 14px;border-radius:8px;
  background:#fff;border:1px solid #c4dbf1;
  box-shadow:0 6px 22px rgba(40,83,122,.16);
  font-size:12.5px;color:var(--text);
}
#tf-batch-bar .tfb-count{font-weight:600;color:var(--brand);white-space:nowrap;}
#tf-batch-bar .tfb-to{display:flex;align-items:center;gap:6px;color:var(--muted2);}
#tf-batch-bar input[type="text"]{
  width:180px;height:30px;padding:0 9px;
  border:1px solid #d8e0ea;border-radius:var(--radius);
  background:#fbfcfe;outline:none;font-size:12.5px;color:var(--text);
}
#tf-batch-bar input[type="text"]:focus{border-color:var(--accent);background:#fff;}

/* ---- 行首展开格内的勾选框（与 ▶ 同格；点击不触发展开）---- */
td.row-expander .rowpick{
  display:inline-flex;align-items:center;justify-content:center;
  width:13px;margin-right:2px;vertical-align:middle;cursor:pointer;
}
td.row-expander .rowpick input{width:12px;height:12px;margin:0;cursor:pointer;
  accent-color:var(--accent);}

/* ---- 设置页「界面偏好」---- */
.pref-row{
  display:flex;align-items:center;gap:8px;
  font-size:13px;color:var(--text);cursor:pointer;user-select:none;
}
.pref-row input{width:14px;height:14px;margin:0;accent-color:var(--accent);}

/* ---- 行首展开箭头：开关关闭（默认）时整列隐藏 --------------------------
 * 只隐藏、不删结构：td/th 全部保留在 DOM 里（dist/ 契约冻结 td 计数）。
 * 冻结块 left 由 applyFrozenLayout 在此类存在时写 0（不落 30px 兜底）。
 * .foot-expander = 表尾合计行的同位格（table.js 375-376）。
 *=========================================================================*/
body.md-expander-hidden th.row-expander,
body.md-expander-hidden td.row-expander,
body.md-expander-hidden .foot-expander{
  display:none;
}

/* ==========================================================================
 * TM-15 ①：表格呈现定型（行密度 / 页脚呈现控件 / 视觉打磨）
 * 全部是呈现层改动 —— 不改任何既有 id/class 字面量，只**新增**类名与规则。
 * ==========================================================================*/

/* 行密度：标准 36px / 紧凑 28px（表头同步收 4px）。偏好存 localStorage，body 类名是唯一开关。 */
body.md-density-standard{--row-h:36px;}
body.md-density-compact{--row-h:28px;--th-h:30px;--fs-table:12.5px;}
/* 紧凑态下单元格左右留白也收一点，避免「行矮了但还是挤」 */
body.md-density-compact table.grid-table tbody td{padding:0 8px;}
body.md-density-compact table.grid-table thead th{padding:0 8px;}

/* 页脚呈现控件（列管理 / 恢复默认列 之后、行数统计之前） */
.tf-prefs{display:inline-flex;align-items:center;gap:12px;margin-left:6px;}
.tf-dens{display:inline-flex;align-items:center;gap:0;border:1px solid var(--line);border-radius:6px;overflow:hidden;}
.tf-dens-btn{border:none;border-radius:0;background:#fff;color:var(--muted);padding:3px 10px;font-size:12.5px;}
.tf-dens-btn + .tf-dens-btn{border-left:1px solid var(--line);}
.tf-dens-btn.on{background:var(--accent);color:#fff;font-weight:600;}
.tf-dens-btn.on:hover{background:var(--accent);color:#fff;}
.tf-coldrag-lbl{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted);
  white-space:nowrap;user-select:none;cursor:pointer;}
.tf-coldrag-lbl input{width:13px;height:13px;margin:0;accent-color:var(--accent);cursor:pointer;}

/* ==========================================================================
 * TM-15 ③：机会 ↔ 项目 反查块（展开区里的「来源机会 / 关联项目」）
 * ==========================================================================*/
.expand-rel{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px;
  margin:10px 0 0;padding:8px 10px;border-radius:8px;
  background:#f6f9fe;border:1px solid #e2ebf7;
}
.expand-rel .rel-k{flex:0 0 auto;font-size:12.5px;color:var(--muted);font-weight:600;}
.rel-chip{
  display:inline-flex;align-items:center;gap:4px;
  height:24px;padding:0 10px;border-radius:12px;
  background:#fff;border:1px solid #cfe0f5;color:var(--brand);
  font-size:12.5px;cursor:pointer;white-space:nowrap;max-width:280px;
  overflow:hidden;text-overflow:ellipsis;
}
.rel-chip:hover{background:#eaf3ff;border-color:var(--accent);color:var(--accent);}
.rel-chip.dangling{background:#fffaf0;border-color:#fde3bd;color:#9a5b06;cursor:default;}
.rel-warn{color:#b45309;font-size:12.5px;white-space:nowrap;}

/* ==========================================================================
 * TM-15 ④：客户抽屉「记一笔」里的联系人下拉
 * ==========================================================================*/
.cform-contact{border:1px solid #dbe4f0;border-radius:6px;padding:3px 6px;font:inherit;font-size:13px;
  background:#fff;color:var(--text);cursor:pointer;max-width:150px;}
.cform-contact:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,117,182,.15);}

/* ==========================================================================
 * TM-15 ⑤：工作台「已完成」折叠（默认收起成一行）
 * ==========================================================================*/
.td-sec-h.td-done-toggle{cursor:pointer;user-select:none;}
.td-sec-h.td-done-toggle:hover{background:#f2f6fd;color:var(--text);}
.td-sec-h.td-done-toggle:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--accent);}
.td-sec-h .tri{font-size:11px;color:var(--muted2);margin-left:2px;transition:transform .12s;}
.td-sec-done.open .td-sec-h .tri{transform:rotate(0deg);}


/* ==========================================================================
 * TM-24：疑似重复客户（检测 + 合并）弹层
 * 独立前缀 dp-，不复用全局类（.seg 事故教训）
 * ==========================================================================*/
.dp-card{width:min(760px,94vw);}
.dp-summary{background:var(--bg);border:1px solid var(--line);border-radius:8px;
  padding:9px 12px;margin-bottom:12px;}
.dp-summary-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.dp-summary-main{font-weight:600;}
.dp-summary-sub{color:var(--muted);font-size:12.5px;margin-top:4px;line-height:1.6;}
.dp-chip{display:inline-block;padding:1px 9px;border-radius:10px;font-size:12px;line-height:18px;}
.dp-chip-warn{background:#fff4e5;color:#b45309;border:1px solid #fcd9a8;}
.dp-chip-ok{background:#e8f7ee;color:#15803d;border:1px solid #bbe7cb;}
.dp-loading{padding:18px 4px;color:var(--muted);font-size:13.5px;}
.dp-alldone{padding:8px 0;color:#15803d;font-size:13.5px;}
.dp-group{border:1px solid var(--line);border-radius:10px;background:#fbfdff;
  margin-bottom:10px;overflow:hidden;}
.dp-g-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:8px 12px;background:#f2f7fd;border-bottom:1px solid var(--line);}
.dp-g-reason{font-size:12px;background:#e8f0fb;color:var(--accent);
  border-radius:9px;padding:1px 8px;line-height:17px;}
.dp-g-count{font-size:12px;color:var(--muted);}
.dp-g-norm{font-size:12px;color:var(--muted2);margin-left:auto;
  max-width:52%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dp-row{display:flex;align-items:flex-start;gap:9px;padding:8px 12px;
  border-bottom:1px dashed #e6eef8;cursor:pointer;}
.dp-row:hover{background:#f7fbff;}
.dp-row:last-of-type{border-bottom:none;}
.dp-radio{margin-top:3px;accent-color:var(--accent);cursor:pointer;}
.dp-row-body{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;flex:1 1 auto;}
.dp-row-company{font-weight:600;font-size:13.5px;word-break:break-all;}
.dp-row-id,.dp-row-alias,.dp-row-owner,.dp-row-date{font-size:12px;color:var(--muted);}
.dp-row-id{font-variant-numeric:tabular-nums;color:var(--muted2);}
.dp-g-foot{display:flex;align-items:center;gap:10px;padding:8px 12px;
  background:#fcfdff;border-top:1px solid var(--line);}
.dp-g-hint{font-size:12.5px;color:var(--muted);flex:1 1 auto;min-width:0;}
.dp-g-merge{flex:0 0 auto;white-space:nowrap;background:var(--accent);color:#fff;border:none;
  border-radius:7px;padding:5px 12px;font-size:13px;cursor:pointer;}
.dp-g-merge:disabled{opacity:.55;cursor:default;}
.dp-confirm{margin:0 12px 10px;border:1px solid #f6c98a;background:#fffaf2;
  border-radius:8px;padding:9px 11px;}
.dp-confirm-text{font-size:12.5px;line-height:1.7;color:#7c4a03;}
.dp-confirm-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px;}
.dp-confirm-yes{background:#c2410c;color:#fff;border:none;border-radius:7px;
  padding:5px 12px;font-size:13px;cursor:pointer;}
.dp-confirm-no{background:#fff;border:1px solid var(--line);border-radius:7px;
  padding:5px 12px;font-size:13px;cursor:pointer;}
