/* ==========================================================================
 * ★★ 批次 709（Randy 2026-10-13）：「选择个性化颜色的时候，能否把选择的颜色**把之前的颜色都替代**，
 *   除了顶部导航的颜色 —— 就是在系统里使用个性化颜色的地方都替换，这样整体颜色更统一」。
 * --------------------------------------------------------------------------
 * 做法：把"品牌青绿"这一族颜色**抽成 CSS 变量**（下面这批默认值 = 品牌原值，所以不选个性化时
 *   渲染结果与以前**逐像素一致**）；用户选了某套配色后，由 `App._applyAppearance()` 把
 *   `--accent*` 全部按他选的强调色重算（含下面的透明度变体与 rgb 分量），于是按钮 / 选中态 /
 *   链接 / 标签 / 图标 / 图表文字……**整个系统一起变**（顶栏渐变仍按配色自带的两个色值走）。
 *   语义色（成功绿 #1D9E75、警告橙 #BA7517、危险红 #A32D2D、用户名蓝 #5E89EC）**不参与**替换。
 * ========================================================================== */
:root {
  --accent: #147178;            /* 主强调色（品牌青绿） */
  --accent-2: #089098;          /* 亮一档（顶栏渐变默认起点 / 高亮） */
  --accent-3: #0A9CA3;          /* 再亮一档（顶栏渐变默认终点） */
  --accent-ink: #184042;        /* 深一档（标题 / 重文字） */
  --accent-rgb: 20,113,120;     /* 供 rgba(var(--accent-rgb), .1) 使用 */
  /* ★ 批次 710（Randy：「这个色块（首页个人卡）应该也要跟着一起变吧」）：
     系统里**本来就在用的同族装饰色**也一并主题化 —— 下面每一档的默认值就是它原来的字面量，
     所以不选个性化时**颜色一字不变**；选了配色后由 App._themeVars() 按同样的偏移重算。 */
  --accent-bright: #2DC2CD;     /* 聚焦 / 悬停边框（最亮一档） */
  --accent-light: #75DFE7;      /* 更亮的浅档（accent 按钮 hover） */
  --accent-focus: #269198;      /* 激活态 / 聚焦边框（中亮） */
  --accent-hover: #1C464A;      /* 主按钮 hover 的深档 */
  --accent-deep: #106B71;       /* 深一档（浅底上的重色 / 描边） */
  --accent-deep-2: #24686C;     /* 深一档的柔化版（弱化文字 / 小图标 hover） */
  --accent-card-1: #00A2AE;     /* 首页个人卡渐变起点 */
  --accent-card-2: #088690;     /* 首页个人卡渐变终点 */
  --accent-card-rgb: 8,134,144; /* 个人卡阴影用的 rgb 分量 */
  --accent-t10: #14717810;
  --accent-t12: #14717812;
  --accent-t14: #14717814;
  --accent-t15: #14717815;
  --accent-t18: #14717818;
  --accent-t20: #14717820;
  --accent-t33: #14717833;
  --accent-t40: #14717840;
  --accent-t55: #14717855;
  --accent-t66: #14717866;
  --accent-t0d: #1471780d;
  --accent-t1a: #1471781a;
  --accent-t0a: #1471780a;
  --accent-t08: #14717808;
  --accent-t0f: #1471780f;
  --accent-t04: #14717804;
  --accent-t1f: #1471781f;
  --accent-t1c: #1471781c;
}

/* ========== 全局重置 ========== */
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; }
body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
  font-size: 13px;
  color: #1a1a1a;
  background: #f5f5f4;
  line-height: 1.5;
}
button { font-family: inherit; cursor: pointer; }
input, textarea, select { font-family: inherit; }
a { color: inherit; text-decoration: none; }

/* ========== 布局 ========== */
.app { display: flex; flex-direction: column; height: 100vh; overflow: hidden; }
.workspace { display: flex; flex: 1; overflow: hidden; }

/* ========== 顶部一级导航（品牌青绿 CPS VI var(--accent-2)） ========== */
/**
 * ★ 批次 490（Randy：「把这个高度稍微收窄一点，可以给页面留出一些空间，参考谷露」）：
 *   顶栏原来 64px，比谷露那条明显厚。整条按比例收一档：64 → **52px**，
 *   logo 32 → 26px、导航项内边距 7/14 → 5/12、字号 13 → 12.5、加号按钮 30 → 26、
 *   头像 36 → 30。**只收高度、不动功能**，省出来的 12px 全给页面内容。
 */
.topbar {
  height: 52px;
  background: linear-gradient(90deg, var(--accent-2) 0%, var(--accent-3) 100%);
  border-bottom: 1px solid rgba(0,0,0,0.10);
  display: flex;
  align-items: center;
  padding: 0 16px 0 20px;
  gap: 12px;
  flex-shrink: 0;
}
.topbar-brand {
  display: flex; align-items: center; gap: 8px;
  margin-right: 24px;
  flex-shrink: 0;
}
/* 反白 logo：横向图，定高自适应宽，避免被压成方块 */
/**
 * ★ 批次 491（Randy：「收窄后 logo 不要收窄，把 logo 回到之前的大小，放得下的」）：
 *   顶栏收到 52px 是对的，但 logo 不该跟着缩 —— 52px 的条放 32px 的 logo 完全放得下。
 *   这里把 logo 恢复成原来的 32px（上限 40px），只留导航/按钮那几处跟着收。
 */
.topbar-logo-img { height: 32px; width: auto; max-width: 180px; max-height: 40px; object-fit: contain; display: block; }
.topbar-logo-text { font-size: 14px; font-weight: 600; color: #fff; letter-spacing: 0.02em; }
.topbar-nav {
  display: flex; align-items: center; gap: 4px;
  flex: 1;
}
.topnav-item {
  padding: 5px 12px;
  border-radius: 8px;
  font-size: 12.5px;
  color: rgba(255,255,255,0.82);
  cursor: pointer;
  transition: all 0.15s;
  white-space: nowrap;
}
.topnav-item:hover { background: rgba(255,255,255,0.16); color: #fff; }
.topnav-item.active { background: #fff; color: var(--accent-2); font-weight: 600; }
/**
 * 顶栏右侧动作区（批次 165 视觉修）：
 * 「公司 → BD 线索」这一页顶栏有两个按钮（🎯 擅长领域 / 🔍 抓取线索）。
 * 左边一级目录 `flex: 1` 会把这块挤到只剩几十像素 → 中文按钮被压成"竖排"、还压到用户头像上
 * （真机截图里就是两个竖着的窄条）。这里禁止收缩 + 禁止折行，按钮永远按内容宽度排开。
 */
.topbar-actions { display: flex; align-items: center; gap: 8px; margin-left: auto; flex: 0 0 auto; white-space: nowrap; }
.topbar-actions button { white-space: nowrap; flex: 0 0 auto; }

/* 右上角：＋新增菜单、人才地图入口、用户名 */
.topbar-right { display: flex; align-items: center; gap: 14px; margin-left: 16px; }
.topbar-add-btn {
  width: 26px; height: 26px; border-radius: 7px;
  /**
   * ★★ 批次 792（Randy 2026-10-16 截图）：
   *   > "把中间这个加号还是就做成 +，**不要有背景色**，然后 + 的尺寸和旁边的图形尺寸拉到一致对齐"
   *   这一颗于是**跟铃铛 / 放大镜同一套**：透明底 + 白色线条图标，26×26 只是点击热区（不画方块）。
   *   图标本体是 `<svg 16×16 stroke-width=2 stroke=currentColor>` —— 与放大镜**同尺寸同线宽**，
   *   三个图标在光学上一样大（批次 778 那版"实心白方块 + 15px 加号"已按他这次的要求撤掉）。
   */
  border: none; background: transparent; color: #fff; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: all 0.15s;
}
.topbar-add-btn:hover { background: rgba(255,255,255,0.18); color: #fff; }
/* ★ 批次 767（Randy：「＋号左右增加一个铃铛，作为通知的提示入口」）：
   铃铛沿用 ＋ / 🔍 那两颗按钮的观感（26×26、圆角 7、半透明白描边），右上角一枚未读徽标。 */
.notif-wrap { position: relative; }
.topbar-bell-btn {
  position: relative;
  width: 26px; height: 26px; border-radius: 7px;
  border: none; background: transparent; color: #fff;      /* ★ 批次 776：去掉外面的白框（同上） */
  cursor: pointer; display: flex; align-items: center; justify-content: center;
  transition: all 0.15s;
}
.topbar-bell-btn:hover { background: rgba(255,255,255,0.18); color: #fff; }
.notif-badge {
  position: absolute; top: -5px; right: -5px; min-width: 15px; height: 15px; padding: 0 4px;
  border-radius: 8px; background: #D8453A; color: #fff; font-size: 10px; line-height: 15px;
  text-align: center; font-weight: 600; box-shadow: 0 1px 3px rgba(0,0,0,.25);
}
/**
 * ★★ 批次 786（Randy 2026-10-16 截图）：「这个排版优化一下，可以把整个通知做的长一些、宽一些，
 *   这样操作空间会多一些」。
 *
 * 尺寸：宽 380 → **560**（窄屏用 `calc(100vw - 24px)` 兜住，不会顶出屏幕）；
 *       高度不再只靠列表自己的 420px，而是"面板整体最高 82vh、列表占满剩下的空间、自己滚"，
 *       于是条目多的时候一屏能看更多，页脚说明也始终留在面板里。
 */
.notif-panel {
  position: absolute; top: calc(100% + 8px); right: 0; width: 560px; max-width: calc(100vw - 24px);
  display: flex; flex-direction: column; max-height: min(82vh, 780px);
  background: #fff; border: 1px solid #e5e5e4; border-radius: 12px;
  /**
   * ★ 批次 770：同一个坑的第二处 —— 铃铛面板原来写 2100，而备注浮窗/候选人详情那层是
   *   `#noteModalOverlay` 的 **100001**（index.html 内联）、发票浮层 100020。
   *   也就是说"开着候选人详情时点铃铛，面板被挡在下面"。这里一并抬到 modal 层之上
   *   （`.topbar` 没有 transform/z-index，不构成层叠上下文，所以子元素能直接参与根层级比较）。
   */
  box-shadow: 0 12px 30px rgba(0,0,0,0.16); z-index: 100400; overflow: hidden;
}
.notif-head { flex: 0 0 auto; display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid #f1efe8; }
.notif-foot { flex: 0 0 auto; padding: 8px 14px; font-size: 11.5px; color: #9A9A93; line-height: 1.65; background: #FAFAF8; border-top: 1px solid #F1EFE8; }
.notif-head .notif-title { font-size: 13px; font-weight: 600; color: #1F1E1B; }
/**
 * 列表：占满面板剩余高度、自己滚（`min-height: 0` 是"flex 子项能比内容矮"的前提，否则滚不动）；
 * 至少留 200px，面板不会因为只有一两条通知就缩成一条缝。
 */
.notif-list { flex: 1 1 auto; min-height: 0; max-height: min(72vh, 640px); overflow-y: auto; }
.notif-item { display: flex; gap: 9px; padding: 10px 12px; border-bottom: 1px solid #F7F6F2; cursor: pointer; }
.notif-item:hover { background: #FAFAF8; }
.notif-item.unread { background: var(--accent-t10); }
.notif-item.unread:hover { background: var(--accent-t1a); }
.notif-ico { flex-shrink: 0; width: 22px; height: 22px; border-radius: 6px; display: flex; align-items: center; justify-content: center; font-size: 12px; }
.notif-main { min-width: 0; flex: 1; }
.notif-t { font-size: 12.5px; color: #1F1E1B; line-height: 1.5; }
.notif-b { font-size: 12px; color: #5b5a55; line-height: 1.6; margin-top: 2px; word-break: break-word; }
.notif-meta { font-size: 11px; color: #9A9A93; margin-top: 3px; }
.notif-empty { padding: 26px 12px; text-align: center; color: #8a8a82; font-size: 12.5px; }
/**
 * ★★ 批次 775（Randy）：「@通知处做快捷回复、回复处出现小输入框；入职通知处出现'添加 CF'入口；
 *   通知右侧都做单独点击'已读'」——下面这些就是那三样东西的样式。
 */
.notif-row { display: flex; gap: 9px; align-items: flex-start; cursor: pointer; }
/**
 * ★★ 批次 786 的真因（真机上量出来的）：
 *   铃铛面板里这一条本来是 `display: block`，可**文件后段"待办提醒"那块**（给首页待办小挂件用的
 *   `.notif-item { display: flex; padding: 8px 0; }`）在后面出现、同权重同选择器 → **把它覆盖掉了**。
 *   后果：整个通知条目变成 flex 行，`.notif-acts`（添加 CF / 已填 CF / 收到 / 回复）被挤成
 *   84px 宽的一个右栏，按钮竖着叠、还被拉成 50~88px 高的大方块 —— 就是 Randy 截图里那个样子。
 * 修法：把铃铛面板这一条**限定在 `.notif-panel` 下**（权重更高），不再和首页待办小挂件抢同一个类；
 *   首页那块保持原样，两边互不影响（那块的 `.notif-dot / .notif-text / .notif-time` 一个字没动）。
 */
.notif-panel .notif-item { display: block; padding: 12px 14px; gap: 0; }
.notif-panel .notif-item:last-child { border-bottom: none; }
.notif-read { flex-shrink: 0; align-self: flex-start; font-size: 11.5px; color: var(--accent);
  border: 1px solid var(--accent-t1a); background: #fff; border-radius: 999px; padding: 1px 8px; cursor: pointer; }
.notif-read:hover { background: var(--accent-t10); }
.notif-read.done { color: #B4B2A9; border-color: #EFEDE6; cursor: default; }
.notif-acts { display: flex; gap: 8px; flex-wrap: wrap; align-items: flex-start; margin: 8px 0 0 31px; }
.notif-act { font-size: 11.5px; color: #5b5a55; border: 1px solid #E7E5DC; background: #fff;
  border-radius: 7px; padding: 2px 9px; cursor: pointer; align-self: flex-start; white-space: nowrap; line-height: 1.7; }
.notif-act:hover { border-color: var(--accent); color: var(--accent); }
.notif-act.primary { color: #fff; background: var(--accent); border-color: var(--accent); }
.notif-act.primary:hover { background: var(--accent-deep-2); color: #fff; }
.notif-act.done { color: #1D9E75; border-color: #1D9E7533; background: #1D9E750F; cursor: default; }
.notif-act.disabled { color: #B4B2A9; cursor: not-allowed; }
.notif-reply-box { display: flex; gap: 6px; align-items: center; margin: 6px 0 0 31px; }
.notif-reply-input { flex: 1; min-width: 0; font-size: 12.5px; padding: 4px 8px;
  border: 1px solid #E0E0E0; border-radius: 7px; outline: none; }
.notif-reply-input:focus { border-color: var(--accent); }
.notif-reply { margin: 5px 0 0 31px; font-size: 12px; color: #33322e; background: #F7F6F2;
  border-radius: 7px; padding: 4px 8px; line-height: 1.6; word-break: break-word; }
.notif-reply-who { color: var(--accent); font-weight: 600; }
.notif-reply-at { color: #9A9A93; margin-left: 6px; font-size: 11px; }
/** ★ 批次 777：「API 安全检查」的体检结论块（等级色 + 说明 + 建议） */
.api-finding { border: 1px solid #EFEDE6; border-radius: 9px; padding: 9px 11px; margin-bottom: 8px; }
/**
 * ★ 批次 768（Randy）：「在备注里面输入 @ 的时候，输入用户名字可以联想输入公司系统中的用户」。
 *   联想菜单挂在 body 上（`position:fixed`），所以不会被弹窗的 overflow 裁掉；
 *   层级高于普通弹窗（2100 起）但低于通知面板（2100）——两者不会同时出现。
 */
.mention-menu {
  /**
   * ★ 批次 770（Randy：「输入 @daniel 没有弹出同事列表」）——层级必须**高过全站所有浮层**：
   *   备注浮窗就挂在 `#noteModalOverlay` 上，而那个容器的 z-index 是 **100001**
   *   （见 index.html 的内联样式）。原来这里写 2600 → 菜单其实被备注浮窗**盖住了**：
   *   逻辑上"弹了"，肉眼上"没弹"。现在给到 100500，压过 modal(100001) / 发票浮层(100020) 等。
   */
  position: fixed; z-index: 100500; width: 260px; max-height: 248px; overflow-y: auto;
  background: #fff; border: 1px solid #e5e5e4; border-radius: 10px;
  box-shadow: 0 10px 26px rgba(0,0,0,0.16); padding: 4px;
}
.mention-item { display: flex; align-items: center; gap: 6px; padding: 7px 9px; border-radius: 7px; cursor: pointer; }
.mention-item.active { background: var(--accent-t10); }
.mention-name { font-size: 13px; color: #1F1E1B; }
.mention-item.active .mention-name { color: var(--accent); font-weight: 600; }
.mention-sub { font-size: 11.5px; color: #9A9A93; margin-left: auto; white-space: nowrap; }
.mention-me { font-size: 10px; color: #5b5a55; background: #F1EFE8; border-radius: 6px; padding: 0 5px; }
.mention-hint { padding: 5px 9px 4px; font-size: 11px; color: #9A9A93; border-top: 1px solid #F7F6F2; margin-top: 3px; }
.mention-empty { padding: 10px 9px; font-size: 12.5px; color: #8a8a82; }
/* ★ 批次 779（Randy）：「红框内的解释文字可以删掉」——备注弹窗那行 @ 说明已删，
   这两条样式随之作废（留着会是死代码，一起清掉）。 */
.add-menu-wrap { position: relative; }
.add-menu {
  position: absolute; top: calc(100% + 8px); right: 0;
  min-width: 148px; background: #fff; border: 1px solid #e5e5e4;
  border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,0.12);
  padding: 6px; z-index: 2000;
}
.add-menu-item {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 12px; border-radius: 7px; font-size: 13px; color: #312E2A;
  cursor: pointer; white-space: nowrap;
}
.add-menu-item:hover { background: #F3F2FE; color: var(--accent-2); }
.add-menu-ico { color: var(--accent-2); font-weight: 600; }
/* v20260908w：顶栏 AI 模型下拉选择器 */
.topbar-ai-wrap { position: relative; }
.topbar-ai-btn {
  display: flex; align-items: center; gap: 6px;
  padding: 6px 10px; border-radius: 8px;
  border: 1px solid rgba(255,255,255,0.45); background: rgba(255,255,255,0.14); color: #fff;
  font-size: 12px; line-height: 1; cursor: pointer; transition: all 0.15s;
}
.topbar-ai-btn:hover { background: rgba(255,255,255,0.24); }
.topbar-ai-dot { width: 6px; height: 6px; border-radius: 50%; background: #4ade80; flex-shrink: 0; }
.topbar-ai-dot.warn { background: #facc15; }
.topbar-ai-menu {
  position: absolute; top: calc(100% + 8px); right: 0;
  min-width: 170px; background: #fff; border: 1px solid #e5e5e4;
  border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,0.12);
  padding: 6px; z-index: 2000; display: none;
}
.topbar-ai-menu.show { display: block; }
.topbar-ai-item {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 12px; border-radius: 7px; font-size: 13px; color: #312E2A;
  cursor: pointer; white-space: nowrap;
}
.topbar-ai-item:hover { background: #F3F2FE; color: var(--accent-2); }
.topbar-ai-item.active { font-weight: 600; color: var(--accent-2); }
.topbar-ai-check { width: 14px; text-align: center; color: var(--accent-2); }
/* 顶栏用户区（反白） */
.topbar-user-name { color: #fff; font-size: 13px; }
.topbar #topbarUser .btn-sm, .topbar .btn-ghost {
  color: #fff; border: 1px solid rgba(255,255,255,0.55); background: transparent;
}
.topbar #topbarUser .btn-sm:hover, .topbar .btn-ghost:hover {
  background: rgba(255,255,255,0.16); color: #fff;
}
/* v20260901al：顶栏圆头像 + 下拉菜单（替换原来的「用户名 + 修改密码 + 退出」三件套） */
/**
 * 2026-10-10（Randy）：「右上角用户的头像处，鼠标移上去的时候会有一个白色的圈，把这个白圈删掉」。
 *   原来这一圈是 `outline: 2px solid rgba(255,255,255,.45)`，`:hover` 时 outline-color 变**纯白**，
 *   鼠标一放上去就多一个白环。现在**整圈拿掉**（含常态那圈半白的），悬停只留一点"变淡"的反馈，
 *   按下仍保留 `scale(0.96)` —— 有手感、但没有环。
 */
.topbar-avatar {
  width: 30px; height: 30px; border-radius: 50%; cursor: pointer; flex-shrink: 0;
  transition: opacity 0.15s, transform 0.15s;
}
.topbar-avatar:hover { opacity: 0.85; }
.topbar-avatar:active { transform: scale(0.96); }
/* v20260901at：顶栏圆头像 + 下拉菜单
   关键改动：position 改为 fixed（脱离 .app / .topbar 的 overflow:hidden 裁剪与 z-index 堆叠上下文）
   位置由 JS 用 getBoundingClientRect() 在 toggleUserMenu 时计算。
   z-index 100010 介于模态层 (1000) 与项目已有浮层 (inv-pop 100020) 之间，
   避免被任何 topbar 子元素或 .sidebar(z:10) 压住。*/
.topbar-user-menu {
  position: fixed; min-width: 220px; max-width: 280px;
  background: #fff; color: #2c2c2a;
  border: 1px solid #e5e5e4; border-radius: 10px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.06);
  padding: 6px 0; z-index: 100010;
  font-size: 13px;
}
.topbar-user-menu-header {
  padding: 10px 14px 8px; border-bottom: 1px solid #f0efea; margin-bottom: 4px;
}
.topbar-user-menu-name { font-weight: 600; color: #2c2c2a; }
.topbar-user-menu-email { font-size: 11px; color: #888780; margin-top: 2px; word-break: break-all; }
.topbar-user-menu-item {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px; cursor: pointer; color: #2c2c2a;
  user-select: none;
}
.topbar-user-menu-item:hover { background: #f5f5f4; }
.topbar-user-menu-item span { line-height: 1; }
.topbar-user-menu-item.danger { color: #A32D2D; }
.topbar-user-menu-item.danger:hover { background: #FCEBEB; }
.topbar-user-menu-sep { height: 1px; background: #f0efea; margin: 4px 0; }
/* 批次 410：菜单底部显示"这一屏实际加载的前端版本"（排查"改了没生效"用） */
.topbar-user-menu-build {
  padding: 4px 14px 6px; font-size: 11px; color: #9a9a92;
}
.topbar-user-menu-build b { color: #33322e; font-weight: 600; }
/**
 * ★ 批次 673（Randy）：「设置 · 总览」卡片头部标注系统版本号（后端发布 tag + 前端资源戳）。
 * 克制的小角标：灰底、字号比正文小一档，不抢"实时统计"那一行的视线。
 */
.set-ov-ver {
  margin-left: 10px; padding: 2px 9px; border-radius: 9px;
  background: #f1efe8; color: #6b6a64; font-size: 11.5px; font-weight: 600;
  white-space: nowrap; cursor: help;
}
.set-ov-ver:empty { display: none; }
/**
 * ★ 批次 678（Randy）：「简历导入完成」浮窗里，每一行都能点开对应候选人档案。
 * 行尾一个可点的小提示（灰字、鼠标移上去变主题绿），整行也可点（`.batch-item-openable`）。
 */
.batch-open {
  flex-shrink: 0; margin-left: 6px; padding: 1px 7px; border-radius: 8px;
  border: 1px solid #D3D1C7; color: #6b6a64; font-size: 10.5px; white-space: nowrap; cursor: pointer;
}
.batch-item-openable { cursor: pointer; }
.batch-item-openable:hover { background: #f6fbfb; }
.batch-item-openable:hover .batch-open { border-color: var(--accent); color: var(--accent); background: #eaf6f6; }
/* 顶栏搜索/地图按钮反白 */
.topbar .topbar-search-btn {
  /* ★ 批次 776（Randy）：「把外面的白框都去掉」——放大镜同款去框 */
  border: none; background: transparent; color: #fff;
}
.topbar .topbar-search-btn:hover { background: rgba(255,255,255,0.18); color: #fff; }

/* 顶栏功能按钮（手动录入/导入简历/新增客户/AI构建地图等）反白 */
.topbar-actions .btn-secondary,
.topbar-actions .btn-primary {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 5px 12px;
  border-radius: 8px;
  font-size: 12px;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.15s;
}
.topbar-actions .btn-secondary {
  color: #fff;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.65);
}
.topbar-actions .btn-secondary:hover {
  background: rgba(255,255,255,0.16);
  border-color: #fff;
}
.topbar-actions .btn-primary {
  color: var(--accent-2);
  background: #fff;
  border: 1px solid #fff;
}
.topbar-actions .btn-primary:hover {
  background: rgba(255,255,255,0.9);
}

/* 首页子页面顶部横向 Tab（参考设计图红框） */
.topbar-sub {
  background: #fff;
  border-bottom: 1px solid #e5e5e4;
  display: flex;
  align-items: center;
  padding: 0 20px;
  flex-shrink: 0;
}
/* WO-04b（DEC-02，2026-09-14）：无内容时整条折叠，腾出 42px 空白条。
   有内容（首页 .home-tabs 等）时才撑高 42px。 */
.topbar-sub:empty {
  display: none;
}
.topbar-sub:not(:empty) {
  min-height: 42px;
}
.home-tabs {
  display: flex;
  align-items: center;
  gap: 8px;
}
.home-tab {
  padding: 6px 14px;
  border-radius: 6px;
  font-size: 13px;
  color: #33322e;
  cursor: pointer;
  transition: all 0.15s;
  white-space: nowrap;
}
.home-tab:hover { background: #F3F2FE; color: var(--accent); }
.home-tab.active {
  background: linear-gradient(90deg, var(--accent-2) 0%, var(--accent-3) 100%);
  color: #fff;
  font-weight: 500;
}

/* ========== 左侧二级导航 ========== */
.sidebar {
  width: 180px;
  background: #fff;
  border-right: 1px solid #e5e5e4;
  display: flex;
  flex-direction: column;
  padding: 12px 0;
  flex-shrink: 0;
  z-index: 10;
  overflow-y: auto;
}
/* 拖拽分割条：默认 4px 透明条，hover/active 时显出紫色细线，cursor 为 col-resize */
.sidebar-resizer {
  width: 4px;
  flex-shrink: 0;
  cursor: col-resize;
  background: transparent;
  position: relative;
  z-index: 11;
  user-select: none;
  -webkit-user-select: none;
  touch-action: none;
  transition: background 0.12s;
}
.sidebar-resizer:hover,
.sidebar-resizer.dragging {
  background: var(--accent);
}
.sidebar-resizer::before {
  /* 拖拽时贴一个更大的命中热区，避免细条条难点击 */
  content: '';
  position: absolute;
  inset: 0 -3px 0 -3px;
}
/* 全局拖拽中：禁止文本选中 + 改光标 */
body.sidebar-resizing {
  cursor: col-resize;
  user-select: none;
  -webkit-user-select: none;
}
body.sidebar-resizing * { cursor: col-resize !important; }
.sidebar-group { padding: 0 12px 8px; }
.sidebar-group-title {
  font-size: 11px; font-weight: 600; color: #888780;
  text-transform: uppercase; letter-spacing: 0.04em;
  padding: 8px 12px 6px;
}
.sidebar-item {
  display: flex; align-items: center;
  padding: 8px 12px;
  margin: 2px 10px;
  border-radius: 6px;
  font-size: 13px;
  color: #33322e;
  cursor: pointer;
  transition: all 0.15s;
}
.sidebar-item:hover { background: #f5f5f4; color: #1a1a1a; }
.sidebar-item.active { background: #EDFDFE; color: var(--accent); font-weight: 500; }
.sidebar-divider { height: 1px; background: #e5e5e4; margin: 8px 12px; }
.nav-spacer { flex: 1; }

/* 搜索订阅项（人才一级目录下） */
.sub-item { justify-content: space-between; gap: 6px; align-items: center; }
.sub-item .sub-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidebar-del {
  flex-shrink: 0; margin-left: 4px; width: 16px; height: 16px; line-height: 14px;
  text-align: center; font-size: 14px; color: #C9C7BD; opacity: 0;
  transition: opacity .15s, color .15s; border-radius: 4px;
}
.sidebar-del:hover { color: #A32D2D; background: #E7857D10; }
.sub-item:hover .sidebar-del { opacity: 1; }
.sidebar-empty { font-size: 11px; color: #B4B2A9; padding: 4px 16px 8px; line-height: 1.5; }
/**
 * ★ 批次 495（Randy：「数字的背景色都删除，数字都用黑色正常字体标注」）：
 *   侧栏角标原来是"灰底白字的小胶囊"（当前项还是青底白字），一整列看过去全是色块。
 *   现在**去掉底色**、用普通黑字（当前项用品牌色，保证在浅蓝底上仍然清楚）。
 */
.sidebar-count { margin-left: auto; font-size: 12.5px; color: #3F3E39; background: none; border-radius: 0; padding: 0; min-width: 20px; text-align: right; font-variant-numeric: tabular-nums; }
.sidebar-item.active .sidebar-count { background: none; color: var(--accent); font-weight: 600; }

/* ========== 主区域 ========== */
.main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
.topbar-search {
  width: 200px;
  padding: 5px 12px;
  border-radius: 20px;
  border: 1px solid #e5e5e4;
  font-size: 12px;
  background: #f5f5f4;
  outline: none;
}
.topbar-search:focus { border-color: var(--accent-bright); background: #fff; }
.pill {
  padding: 3px 10px;
  border-radius: 20px;
  font-size: 12px;
  border: 1px solid #e5e5e4;
  cursor: pointer;
  color: #888780;
  transition: all 0.15s;
}
.pill:hover { border-color: var(--accent-bright); }
.pill.active { background: #EDFDFE; color: var(--accent); border-color: var(--accent-bright); }
.btn-primary {
  padding: 6px 14px;
  border-radius: 8px;
  background: var(--accent);
  color: #fff;
  border: none;
  font-size: 12px;
  font-weight: 500;
  transition: background 0.15s;
}
.btn-primary:hover { background: var(--accent-hover); }
.btn-primary:disabled, .btn-primary[disabled] {
  background: #75B3B7;
  color: #fff;
  cursor: not-allowed;
}
.btn-secondary {
  padding: 6px 14px;
  border-radius: 8px;
  background: transparent;
  color: #33322e;
  border: 1px solid #e5e5e4;
  font-size: 12px;
  transition: all 0.15s;
}
.btn-secondary:hover { border-color: var(--accent-bright); color: var(--accent); }

/* ========== 内容区域 ========== */
.content { flex: 1; overflow-y: auto; padding: 20px; display: flex; flex-direction: column; }
/* ★ 批次 713：首屏占位（纯静态，render() 第一次整体替换掉） */
.boot-shell{flex:1;display:flex;align-items:center;justify-content:center;min-height:60vh}
.boot-shell-inner{text-align:center;color:#33322e}
.boot-shell-logo{width:120px;height:auto;opacity:.9;margin-bottom:14px}
.boot-shell-title{font-size:15px;font-weight:600;color:#1f1e1c;margin-bottom:6px}
.boot-shell-sub{font-size:12px;color:#888780}
.boot-shell-bar{width:180px;height:4px;border-radius:99px;background:#f1efe8;overflow:hidden;margin:14px auto 0}
.boot-shell-bar span{display:block;width:40%;height:100%;border-radius:99px;background:var(--accent);animation:cpsBootBar 1.1s ease-in-out infinite}
@keyframes cpsBootBar{0%{margin-left:-40%}100%{margin-left:100%}}
.content-hidden { display: none; }
.col-main { display: flex; flex-direction: column; gap: 16px; max-width: 920px; }
.col-dual { display: flex; gap: 16px; align-items: flex-start; }
.col-side { width: 280px; display: flex; flex-direction: column; gap: 16px; flex-shrink: 0; }
.col-main-flex { flex: 1; display: flex; flex-direction: column; gap: 16px; min-width: 0; }

/* ========== 卡片 ========== */
/**
 * ★ 批次 486（Randy：「UI 设计美感提升一下，能不能不要那么多框框」）：
 *   卡片原来是"实线描边 + 12px 圆角"，一屏叠好几层框（卡片里还套小卡、再套 chip）。
 *   现在**去掉描边**，用极浅的阴影把卡片托起来（层级还在，但不再满眼是线）。
 *   注意：只改视觉，不动任何类名与结构 —— 所有断言/交互照旧。
 */
.card {
  background: #fff;
  border: none;
  border-radius: 14px;
  padding: 16px;
  box-shadow: 0 1px 2px rgba(24,32,38,.05), 0 8px 24px -18px rgba(24,32,38,.18);
}
.card-title {
  font-size: 12px;
  font-weight: 500;
  color: #888780;
  margin-bottom: 12px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.card-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 12px;
}

/* ========== 一键导入面板 ========== */
.import-panel {
  border: 1px solid var(--accent-bright);
  background: #FCFCFE;
}
.ai-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px;
  border-radius: 10px;
  background: #EAF3DE;
  color: #3B6D11;
  font-size: 11px;
  font-weight: 500;
}
.ai-badge-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: #639922;
}
.tabs {
  display: flex;
  border-bottom: 1px solid #e5e5e4;
  margin-bottom: 14px;
}
.tab {
  padding: 6px 14px;
  font-size: 12px;
  cursor: pointer;
  color: #888780;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition: all 0.15s;
}
.tab:hover { color: var(--accent); }
.tab.active { color: var(--accent); border-bottom-color: var(--accent); }

.drop-zone {
  border: 2px dashed #d3d1c7;
  border-radius: 12px;
  padding: 28px 20px;
  text-align: center;
  cursor: pointer;
  transition: all 0.15s;
}
.drop-zone:hover { background: #f5f5f4; border-color: var(--accent-bright); }
.drop-zone.drag-over { background: #EDFDFE; border-color: var(--accent-focus); }
.drop-icon {
  width: 40px; height: 40px;
  border-radius: 50%;
  background: #EDFDFE;
  display: flex; align-items: center; justify-content: center;
  margin: 0 auto 10px;
}
.drop-title { font-size: 13px; font-weight: 500; margin-bottom: 4px; }
.drop-sub { font-size: 12px; color: #888780; }
.method-row { display: flex; gap: 8px; margin-top: 14px; justify-content: center; flex-wrap: wrap; }
.method-btn {
  padding: 5px 12px;
  border-radius: 8px;
  border: 1px solid #e5e5e4;
  font-size: 12px;
  background: #fff;
  color: #888780;
  transition: all 0.15s;
}
.method-btn:hover { border-color: var(--accent-bright); color: var(--accent); }
.method-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }

textarea, input[type="text"], input[type="tel"], input[type="email"], select {
  width: 100%;
  padding: 8px 10px;
  border-radius: 8px;
  border: 1px solid #e5e5e4;
  font-size: 12px;
  outline: none;
  transition: border 0.15s;
}
textarea:focus, input:focus, select:focus { border-color: var(--accent-bright); }
textarea { resize: vertical; line-height: 1.6; }

/* ========== 解析结果 ========== */
.parse-result {
  background: #f5f5f4;
  border-radius: 10px;
  padding: 14px;
  margin-top: 12px;
}
.parse-field {
  display: flex;
  gap: 8px;
  margin-bottom: 6px;
  font-size: 12px;
  align-items: baseline;
}
.parse-key { color: #888780; width: 70px; flex-shrink: 0; text-align: right; }
.parse-val { font-weight: 500; flex: 1 1 auto; min-width: 0; }
/* 大段可编辑字段（如岗位核心要素）：标签在上、输入框占满整行右侧 */
.parse-field-block { margin-bottom: 10px; }
.parse-key-block { display: block; color: #888780; font-size: 12px; margin-bottom: 4px; }
.parse-textarea-block {
  width: 100%;
  min-height: 128px;
  box-sizing: border-box;
  font-family: inherit;
  font-size: 13px;
  line-height: 1.7;
  color: #2b2a27;
  padding: 8px 10px;
  border: 1px solid #d3d1c7;
  border-radius: 6px;
  resize: vertical;
  background: #fff;
}
.parse-loading {
  text-align: center;
  padding: 20px;
  color: var(--accent);
  font-size: 13px;
}
.parse-loading .spinner {
  display: inline-block;
  width: 20px; height: 20px;
  border: 2px solid #EDFDFE;
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
  margin-right: 8px;
  vertical-align: middle;
}
@keyframes spin { to { transform: rotate(360deg); } }
/* 全局 .spinner（用于内联预览等无 .parse-loading 包裹的场景） */
.spinner {
  display: inline-block;
  width: 20px; height: 20px;
  border: 2px solid #EDFDFE;
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
  margin-right: 8px;
  vertical-align: middle;
}
.spinner-mini {
  display: inline-block;
  width: 14px; height: 14px;
  border: 2px solid #EDFDFE;
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
  vertical-align: middle;
}

/* ========== 批量导入面板 ========== */
.batch-panel {
  background: #f5f5f4;
  border-radius: 10px;
  padding: 14px;
  margin-top: 12px;
}
.batch-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 10px;
}
.batch-title { font-size: 13px; font-weight: 500; }
.batch-counter { font-size: 11px; color: #888780; }
.batch-progress-bar {
  height: 4px;
  background: #E5E4DF;
  border-radius: 2px;
  margin-bottom: 12px;
  overflow: hidden;
}
.batch-progress-fill {
  height: 100%;
  background: var(--accent);
  border-radius: 2px;
  transition: width 0.3s ease;
}
.batch-list { display: flex; flex-direction: column; gap: 4px; }
.batch-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  background: white;
  border-radius: 6px;
  font-size: 12px;
}
.batch-status {
  width: 18px;
  height: 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.batch-filename {
  flex: 1;
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.batch-meta {
  font-size: 11px;
  color: #888780;
  white-space: nowrap;
  flex-shrink: 0;
  max-width: 160px;
  overflow: hidden;
  text-overflow: ellipsis;
}
.batch-summary {
  margin-top: 12px;
  padding: 10px 12px;
  background: white;
  border-radius: 8px;
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
}
.batch-summary-item {
  font-size: 12px;
  display: flex;
  align-items: center;
  gap: 6px;
  color: #55534E;
}
.batch-summary-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}

/* ========== 意向选择菜单 ========== */
.intention-picker {
  cursor: pointer;
  user-select: none;
  transition: transform 0.15s;
}
.intention-picker:hover {
  transform: translateY(-1px);
  box-shadow: 0 2px 6px rgba(0,0,0,0.1);
}
.intention-menu-popover {
  position: fixed;
  z-index: 10000;
  background: white;
  border: 1px solid #E5E4DF;
  border-radius: 10px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.12);
  padding: 4px;
  min-width: 140px;
  animation: intentionFadeIn 0.12s ease;
}
@keyframes intentionFadeIn {
  from { opacity: 0; transform: translateY(-4px); }
  to { opacity: 1; transform: translateY(0); }
}
.intention-menu-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  font-size: 13px;
  font-weight: 500;
  color: #55534E;
  border-radius: 7px;
  cursor: pointer;
  transition: background 0.12s;
}
.intention-menu-item:hover {
  background: var(--item-bg, #f5f5f4);
  color: var(--item-color, #55534E);
}
.intention-menu-item.active {
  background: var(--item-bg, #f5f5f4);
  color: var(--item-color, #55534E);
}
.intention-menu-check {
  width: 16px;
  font-size: 12px;
  text-align: center;
  color: var(--item-color, #888780);
}

/* ========== 工作流进度条 ========== */
.flow-row {
  display: flex;
  gap: 6px;
  overflow-x: auto;
  padding-bottom: 4px;
  margin-bottom: 14px;
}
.flow-step {
  flex: none;
  padding: 6px 12px;
  border-radius: 8px;
  border: 1px solid #e5e5e4;
  background: #fff;
  font-size: 12px;
  white-space: nowrap;
}
.flow-step.done { background: #EAF3DE; border-color: #97C459; color: #3B6D11; }
.flow-step.active { background: #EDFDFE; border-color: var(--accent-focus); color: var(--accent); font-weight: 500; }
.flow-step.pending { color: #B4B2A9; }
.flow-arrow { flex: none; display: flex; align-items: center; color: #d3d1c7; font-size: 14px; }

/* ========== 表格 ========== */
.table-wrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; font-size: 12px; }

/* 候选人列表：可拖拽列序 / 可调列宽 */
.cand-lib-table { table-layout: fixed; }
.cand-lib-table th { position: relative; user-select: none; cursor: grab; }
.cand-lib-table th[data-col="__tail"],
.cand-lib-table th[data-col="__extra"] { cursor: default; }
/* ★ 批次 383：通用列宽手柄。它用 absolute 定位在表头右缘 —— 所以表头必须是定位上下文。
   原来只有人才库那张表显式设了 `th{position:relative}`，其它表一律套用会导致手柄飘到别处；
   这里统一给所有表头补上（对布局无副作用）。 */
table thead th { position: relative; }
.col-resizer { position: absolute; right: 0; top: 0; width: 7px; height: 100%; cursor: col-resize; z-index: 2; }
.col-resizer:hover { background: rgba(var(--accent-rgb),0.28); }
.col-resizer:active { background: rgba(var(--accent-rgb),0.45); }
.col-drag-over { background: var(--accent-t12) !important; box-shadow: inset 3px 0 0 var(--accent); }

/* 项目团队角色：勾选成员以标签形式显示在搜索框内（token 输入） */
.team-token-box {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
  border: 1px solid #d3d1c7; border-radius: 6px;
  padding: 4px 6px; background: #fff; min-height: 34px; cursor: text;
}
.team-token-box:focus-within { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),.12); }
.team-token-box .teamRoleChips { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.team-token-box .teamRoleSearch {
  border: none !important; outline: none !important; box-shadow: none !important;
  flex: 1; min-width: 90px; padding: 2px 4px; font-size: 12px; background: transparent;
}

/* 项目（项目）列表：可拖拽列序 / 可调列宽，协同列默认最右 */
.job-lib-table { table-layout: fixed; }
.job-lib-table th { position: relative; user-select: none; cursor: grab; }
.job-status-tag { display:inline-block;vertical-align:middle;font-size:11px;line-height:1;padding:3px 8px;border-radius:10px;font-weight:600;white-space:nowrap; }
.job-status-active { background:#EAFAFB;color:var(--accent); }
.job-status-successful { background:#E6F5EE;color:#1D9E75; }
.job-status-paused { background:#FAEEDA;color:#854F0B; }
.job-status-cancelled { background:#EFEFEF;color:#888780; }
.job-status-failed { background:#FCEBEB;color:#A32D2D; }
/* 项目列表：状态标签与标题分离（修复叠加显示） */
.job-title-cell { display:flex; flex-direction:column; align-items:flex-start; gap:4px; }
.job-title-text { font-weight:500; line-height:1.3; }
/* 项目列表指标数字可点击跳转候选人列表 */
.pipeline-count { display:inline-block; min-width:18px; text-align:center; font-weight:600; color:var(--accent); cursor:pointer; padding:2px 6px; border-radius:6px; background:var(--accent-t0d); }
.pipeline-count:hover { background:var(--accent-t1a); text-decoration:underline; }
/**
 * 批次 588：项目列表「加入项目 / 简历推荐 / 客户面试 / offer」四列**一律可点**（含 0）。
 * 0 不抢眼（灰字 + 透明底），但鼠标移上去有反馈，点开弹窗会说明"这个阶段暂时没有候选人"。
 */
/**
 * ★ 批次 652（Randy：「项目流程中的数字都需要能穿透」）：
 *   0 值原来**没有底色**（灰裸数字），看着像"点不动"；现在也做成小胶囊（浅灰底），
 *   四个数字（加入项目 / 简历推荐 / 客户面试 / offer）长得一样 —— 都能点、点开都能穿透。
 */
.pipeline-count.is-zero { color:#8a8a82; background:#f2f1ed; font-weight:500; }
.pipeline-count.is-zero:hover { color:var(--accent); background:var(--accent-t1a); }
/* 候选人列表：项目指标筛选横幅 */
.filter-banner { display:flex; align-items:center; gap:10px; padding:8px 14px; margin:0 0 2px; background:#F4F2FB; border-bottom:none; border-radius:8px; font-size:12px; color:#1B474B; }
.filter-banner button { margin-left:auto; }
/**
 * 右上角全局搜索按钮
 * ★ 批次 711（Randy 2026-10-14，顶栏截图）：「把**放大镜的大小和前面的对齐**」——
 *   前面那个是「＋」新增按钮（`.topbar-add-btn`：26×26 / 圆角 7 / 图标 16px），
 *   而这里原来是 34×34 / 圆角 8 + 16px 的 SVG（SVG 占满整个 viewBox，看起来更大一圈）。
 *   现在按钮盒与圆角对齐到 26×26 / 7，图标收到 13px（与 16px 字号里的「＋」视觉同高）。
 */
/* ★ 批次 776：默认那条也去框（`.topbar .` 那条是顶栏专用的更具体规则，两处口径保持一致） */
.topbar-search-btn { width:26px; height:26px; border-radius:7px; padding:0; border:none; background:transparent; color:var(--accent); font-size:15px; cursor:pointer; display:inline-flex; align-items:center; justify-content:center; }
/* ★ 批次 778：与铃铛同为 15px（原来 13px → 三个图标里它最小，视觉上不齐） */
.topbar-search-btn svg { width:15px; height:15px; }
.topbar-search-btn:hover { background:#f4f2fb; }
/* 全局搜索结果 */
.gs-group { font-size:11px; color:#B4B2A9; padding:8px 10px 4px; }
.gs-item { padding:8px 10px; border-radius:6px; cursor:pointer; font-size:13px; color:#2A2A26; display:flex; align-items:center; gap:6px; }
.gs-item:hover { background:#f4f2fb; color:var(--accent); }
.gs-sub { font-size:11px; color:#9A9A92; }
/**
 * ★ 批次 631（Randy）：「快速搜索里搜名字时同时显示公司等更多信息，便于分辨同名的人」——
 *   结果行改成**两行**：第一行姓名/编号/手机，第二行「公司 · 职位 · 城市」。
 */
.gs-item--2l { flex-direction: column; align-items: stretch; gap: 2px; }
.gs-item--2l .gs-l2 { font-size: 11.5px; color: #888780; line-height: 1.4; }
.gs-item--2l:hover .gs-l2 { color: #33322e; }
/* 全局搜索弹窗：固定在右上角 */
#modalOverlay.gs-overlay-topright { align-items: flex-start; justify-content: flex-end; padding: 60px 16px 16px; }
#modalOverlay.gs-overlay-topright .modal { max-width: 440px; width: 100%; margin: 0; }
/**
 * ★ 批次 573（Randy 2026-10-09）：「在候选人页面点右上角放大镜，候选人页面会自动跳转到人才页面」
 *   全局搜索改成**子浮层**（#subModalOverlay）之后，同样要有"贴右上角"的定位 —— 否则它会默认居中，
 *   挡在候选人详情中间。样式与上面 #modalOverlay 那份一一对应。
 */
#subModalOverlay.gs-overlay-topright { align-items: flex-start; justify-content: flex-end; padding: 60px 16px 16px; }
#subModalOverlay.gs-overlay-topright .modal { max-width: 440px; width: 100%; margin: 0; }
/* 速览：姓名中英文 */
.glance-name-cn { font-weight:600; color:#1A1A18; }
.glance-name-en { font-size:12px; color:#33322e; margin-top:2px; }
.job-lib-table td { overflow: hidden; text-overflow: ellipsis; }
.job-lib-table th.col-resize-lock, .job-lib-table th[draggable="false"] { cursor: col-resize; }
/* 批次 393（Randy 2026-10-02）：「项目列表项目ID左侧加勾选，支持关闭和批量关闭」
   · 勾选列是系统列（表头/单元格都不带 col-resizer，也不进列配置）→ 不会被拖走或改宽；
   · 表头那个框 = 全选本页（_syncJobSelUi 负责 indeterminate 半选态）。 */
.job-sel-th, .job-sel-td { text-align:center; padding-left:4px; padding-right:4px; cursor:default; }
.job-sel-th input, .job-sel-td input { width:15px; height:15px; cursor:pointer; vertical-align:middle; margin:0; }
.job-lib-table tr.row-selected td { background:#F4F8FF; }
.job-sel-bar { display:flex; align-items:center; gap:10px; padding:8px 14px; background:#EDF6FF;
  border-top:1px solid #DCEBFA; border-bottom:1px solid #DCEBFA; font-size:12.5px; color:#2456C7; }
.job-sel-bar b { font-weight:600; }
.job-sel-bar .btn-sm { flex:0 0 auto; }
.cand-phone-reveal { color: var(--accent); cursor: pointer; text-decoration: underline dotted; font-size: 12px; }
.cand-phone-reveal:hover { color: #1B474B; }
.cand-phone { color: #33322e; font-size: 12px; cursor: pointer; white-space: nowrap; }
.cand-phone:hover { color: var(--accent); }
/* 2026-09-29 批次 301：手机号"查看"之后的复制小图标（列表页 / 详情页共用一套样式） */
.phone-copy { display:inline-block;margin-left:4px;color:var(--accent);cursor:pointer;font-size:12px;line-height:1;vertical-align:middle;opacity:.75;user-select:none }
.phone-copy:hover { opacity:1;color:#1B474B }
/* ★ 批次 636：复制图标改内联 SVG（替换字符 ⧉）—— 与文字基线对齐，颜色随父级 currentColor */
.copy-ico { vertical-align:-2px; display:inline-block; }
.phone-mini-copy { display:inline-flex; align-items:center; padding:0 2px; }
.phone-mini-copy .copy-ico { vertical-align:0; width:12px; height:12px; opacity:.8; }
.phone-mini-copy:hover .copy-ico { opacity:1; }
/* 2026-09-29 批次 304：归属数据里的「共享」页内小模块（已共享的人显示成名字胶囊 + ＋号） */
.client-brief-top { display:flex; gap:14px; align-items:flex-start; flex-wrap:wrap }
.client-info-col { flex:0 0 72%; max-width:72% }
.client-stat-col { flex:1 1 220px; min-width:210px }
.client-info-grid { display:grid; grid-template-columns:1fr 1fr; column-gap:28px; row-gap:2px }
.client-intro-full { width:100% }
/* 2026-09-29 批次 307：公司页基本信息逐项内联编辑（✎ + 就地控件） */
/**
 * 逐项编辑的 ✎（简介标签页 + 合同表格共用）
 * ★ 批次 374（Randy）：「编辑按钮**平时隐藏，鼠标移上去才出现**」。
 *   用 opacity 而不是 display：**不占位移、不引起行高抖动**，鼠标进入该格/该行才显形。
 *   （:focus 也显形，方便键盘 Tab 到它时不至于"看不见焦点"。）
 */
.ci-edit { margin-left:6px;color:#B4B2A9;cursor:pointer;font-size:12px;opacity:0;transition:opacity .12s }
.ci-edit:hover { color:var(--accent) }
.detail-info-row:hover .ci-edit,
tr:hover .ci-edit,
td:hover .ci-edit,
.ci-edit:focus { opacity: 1 }
/**
 * 逐项编辑的编辑器容器
 * ★ 批次 382（Randy：「单独编辑的框溢出了，基本上都有这个问题」）：
 *   原来控件用固定宽度（如 `min-width:130px` 的下拉）+ 行内按钮，**比表格列还宽**就溢出到隔壁列。
 *   现在：容器不撑破单元格（max-width:100%）、控件一律 `box-sizing:border-box` 且 `max-width:100%`；
 *   在**表格单元格里**（`.ci-editor-cell`）改成**上下堆叠**：控件占满一格，保存/取消换到下一行。
 */
.ci-editor { display:inline-flex;align-items:flex-start;gap:0;flex-wrap:wrap;max-width:100% }
.ci-editor input, .ci-editor select, .ci-editor textarea { max-width:100%;box-sizing:border-box }
.ci-editor-cell { display:flex;flex-direction:column;align-items:stretch;gap:4px;width:100%;min-width:0 }
.ci-editor-cell > input, .ci-editor-cell > select, .ci-editor-cell > textarea { width:100% !important;min-width:0 !important }
.ci-editor-cell > .ci-editor-btns { display:flex;gap:4px;flex-wrap:wrap }
@media (max-width: 900px) {
  .client-info-col, .client-stat-col { flex:1 1 100%; max-width:100% }
  .client-info-grid { grid-template-columns:1fr }
}
.share-chip { display:inline-flex;align-items:center;gap:4px;padding:1px 7px;border:1px solid var(--accent-t33);border-radius:10px;background:var(--accent-t0a);color:var(--accent);font-size:11.5px;white-space:nowrap }
.share-chip-x { cursor:pointer;color:#888780;font-size:11px;line-height:1 }
.share-chip-x:hover { color:#A32D2D }
.share-plus { display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 6px;border:1px solid var(--accent-t55);border-radius:8px;background:#fff;color:var(--accent);font-size:13px;line-height:1;cursor:pointer }
.share-plus:hover { background:var(--accent-t10) }
.share-picker { position:absolute;z-index:40;margin-top:6px;background:#fff;border:1px solid #e5e5e4;border-radius:10px;box-shadow:0 8px 20px #0000001f;padding:8px;min-width:230px;max-height:250px;overflow:auto }
.share-picker-row { display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:6px;cursor:pointer;font-size:12.5px }
.share-picker-row:hover { background:#faf9f6 }
th {
  text-align: left;
  padding: 6px 10px;
  border-bottom: 1px solid #e5e5e4;
  color: #888780;
  font-weight: 500;
  white-space: nowrap;
}
td { padding: 8px 10px; border-bottom: 1px solid #f1efe8; }
tr:hover td { background: #fafaf9; }
/* v20260829o：只有「真正绑定了点击」的行才显示小手。
   此前 `tr { cursor: pointer }` 全局生效，导致全系统所有表格行（仪表盘排名、业绩分析、
   KPI 报表、设置页各表格…）都显示成可点击，但绝大多数行并未绑定任何事件，
   表现为「看着能点、点了没反应」。改为按行自身的绑定状态来决定光标：
     - 行上有 onclick                → 小手（如候选人库、客户管理）
     - 行上有 data-href / .row-clickable → 小手（给未来用委托绑定的行预留）
     - 其余行                        → 默认光标，但保留 hover 高亮，不误导用户 */
tr { cursor: default; }
tr[onclick],
tr[data-href],
tr.row-clickable { cursor: pointer; }

/* ========== 标签 ========== */
.tag {
  display: inline-block;
  padding: 2px 7px;
  border-radius: 10px;
  font-size: 11px;
  margin: 1px;
  white-space: nowrap;
}
.tag-red { background: #FCEBEB; color: #A32D2D; }
.tag-amber { background: #FAEEDA; color: #854F0B; }
.tag-green { background: #EAF3DE; color: #3B6D11; }
.tag-blue { background: #E6F1FB; color: #185FA5; }
.tag-brand { background: #EDFDFE; color: var(--accent); }
.tag-gray { background: #F1EFE8; color: #33322e; }

/* ========== 匹配分数 ========== */
.score { font-size: 13px; font-weight: 600; }
.score-high { color: #3B6D11; }
.score-mid { color: #854F0B; }
.score-low { color: #A32D2D; }

/* ========== 星级评分 ========== */
.stars-display { display: inline-flex; align-items: center; }

/* ========== 关键要素编辑 ========== */
.ke-textarea { font-family: inherit; }
.ke-textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-t20); }

/* ========== 头像 ========== */
.avatar {
  width: 28px; height: 28px;
  border-radius: 50%;
  background: #E6F1FB;
  color: #185FA5;
  display: flex; align-items: center; justify-content: center;
  font-size: 11px;
  font-weight: 500;
  flex-shrink: 0;
}

/* ========== 待办提醒 ========== */
.notif-item {
  display: flex;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px solid #f1efe8;
}
.notif-item:last-child { border-bottom: none; }
.notif-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 5px; flex-shrink: 0; }
.notif-text { font-size: 12px; line-height: 1.5; flex: 1; }
.notif-time { font-size: 11px; color: #B4B2A9; flex-shrink: 0; }

/* ========== KPI ========== */
.kpi-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.kpi-card { background: #f5f5f4; border-radius: 8px; padding: 10px; }
.kpi-label { font-size: 11px; color: #888780; margin-bottom: 4px; }
.kpi-value { font-size: 22px; font-weight: 600; }
.progress-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.progress-bar { flex: 1; height: 5px; border-radius: 3px; background: #f1efe8; overflow: hidden; }
.progress-fill { height: 100%; border-radius: 3px; transition: width 0.3s; }

/* ========== 仪表盘（首页） ========== */
.dash { display: flex; flex-direction: column; gap: 16px; }
.dash-head { display: flex; align-items: flex-end; justify-content: space-between; flex-wrap: wrap; gap: 12px; }
.dash-title { font-size: 20px; font-weight: 600; color: #2c2c2a; }
.dash-subtitle { font-size: 12px; color: #888780; margin-top: 4px; }
.dash-period { display: inline-flex; background: #f5f5f4; border-radius: 8px; padding: 3px; gap: 2px; }
.dash-period-tab { font-size: 12px; color: #33322e; padding: 5px 14px; border-radius: 6px; cursor: pointer; transition: all 0.15s; }
.dash-period-tab:hover { color: #2c2c2a; }
.dash-period-tab.active { background: #fff; color: var(--accent); font-weight: 500; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }

.dash-overview { display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px; }
.dash-stat { background: #fff; border: 1px solid #e5e5e4; border-radius: 12px; padding: 16px; }
.dash-stat-label { font-size: 12px; color: #888780; }
.dash-stat-value { font-size: 30px; font-weight: 700; line-height: 1.1; margin: 6px 0 4px; }
.dash-stat-sub { font-size: 11px; color: #B4B2A9; }

/* 通用页面头部（发票聚合页等） */
.page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
.page-title { font-size: 20px; font-weight: 600; color: #2E2D2A; }
.page-sub { font-size: 12px; color: #888780; margin-top: 4px; }

/* 发票总览：时间区间选择条 + 单行指标 */
.inv-period-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; background: #f5f5f4; border: 1px solid #e5e5e4; border-radius: 10px; padding: 8px 12px; margin-bottom: 10px; }
.inv-period-label { font-size: 12px; color: #888780; }
.inv-period-bar .dash-period-tab { padding: 4px 12px; }
.inv-period-range { font-size: 11px; color: #B4B2A9; margin-left: auto; white-space: nowrap; }
/* v20260829f：未填开票日期的发票提示条 */
.inv-nodate-hint { display: flex; align-items: center; gap: 10px; background: #FFF8E6; border: 1px solid #F0DFB0; border-radius: 10px; padding: 7px 12px; margin: -4px 0 10px; font-size: 12px; color: #7A5B12; }
.inv-nodate-hint b { color: #BA7517; }
.inv-overview { display: flex; align-items: center; gap: 0; background: #fff; border: 1px solid #e5e5e4; border-radius: 10px; padding: 6px 4px; margin-bottom: 14px; }
.inv-ov-item { flex: 1; display: flex; align-items: baseline; justify-content: center; gap: 8px; padding: 4px 16px; white-space: nowrap; }
.inv-ov-label { font-size: 12px; color: #888780; }
.inv-ov-value { font-size: 18px; font-weight: 700; line-height: 1; }
.inv-ov-sep { width: 1px; align-self: stretch; background: #ececea; }

/* 发票列表表头：可点击搜索 */
.inv-th-search { cursor: pointer; user-select: none; white-space: nowrap; }
.inv-th-search:hover { color: var(--accent); background: #f5f5f4; }
.inv-th-ico { display: inline-block; margin-left: 4px; font-size: 11px; color: #B4B2A9; }
.inv-th-search:hover .inv-th-ico { color: var(--accent); }

/* 发票列表：时间列的排序按钮（2026-09-19 批次 30）—— 默认隐藏，鼠标移到表头才出现 */
.inv-th-sort {
  display: inline-block; margin-left: 4px; font-size: 11px; color: #B4B2A9;
  cursor: pointer; visibility: hidden; padding: 0 2px; border-radius: 4px;
}
th:hover .inv-th-sort { visibility: visible; }
.inv-th-sort:hover { color: var(--accent); background: #EDFDFE; }
.inv-th-sort.active { visibility: visible; color: var(--accent); font-weight: 700; }

/* 发票横向列表：16 列不换行，超宽横向滚动（v20260828h 起列宽由表头内联 width 控制，支持拖拽调宽） */
table.inv-table { min-width: 1834px; table-layout: fixed; }
/**
 * 批次 577（Randy 2026-10-09）：「发票的列表区域不要做灰色底，就做正常的白色底」
 *   原来列表卡片（`.detail-section`）自己没有底色 → 露出来的是页面灰底 `body{background:#f5f5f4}`，
 *   整片列表看着是灰的。这里给卡片刻意补上白底 + 描边（与客户/候选人详情里的内容卡同一套观感）。
 */
.inv-list-card { background: #fff; border: 1px solid #ECEAE2; border-radius: 10px; padding: 12px 14px; }
.inv-list-card .detail-section-title { margin-bottom: 10px; }
/**
 * ★ 批次 755（Randy：「挂牌页面候选人列表处底色不要有灰色，就是正常的白色」）：
 *   挂牌 / 悬赏这两个列表页的表格直接挂在 `.page-body` 下，没有自己的底色 →
 *   露出来的是页面灰底（`body{background:#f5f5f4}`），只有 1~2 行数据时下面一大片灰。
 *   这里给一个共用的**白底列表卡片**（与发票列表同一个口径），并让它**撑满剩余页面高度**
 *   （`.page-body-fill` 负责 flex 拉伸）——否则卡片只有表格那么高，下面还是灰的。
 */
.page-body-fill { flex: 1; display: flex; flex-direction: column; min-height: 0; }
.cand-list-card { flex: 1; min-height: 0; background: #fff; border: 1px solid #ECEAE2; border-radius: 10px; padding: 12px 14px; }

/**
 * ★ 批次 756（Randy）：「AI 搜索的入口放到项目的右上角，并附上一个蓝色机器人的卡通标识」
 * 位置在「最大化」左侧；蓝色是**入口专色**（不跟主题色走），一眼能认出这是 AI。
 */
.job-ai-entry { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; color: #1B3F9E; border-color: #C7D7FF; background: #F5F8FF; }
.job-ai-entry:hover { background: #E8F0FF; border-color: #2F6BFF; }
.job-ai-entry-ico { flex-shrink: 0; }
table.inv-table th, table.inv-table td { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
table.inv-table th { position: relative; }
table.inv-table td .inv-id { font-family: monospace; font-size: 12px; color: var(--accent); }
/* 项目ID 单元格（JOB-xxxx 等宽字体） */
table.inv-table td .inv-jobno { font-family: monospace; font-size: 12px; font-weight: 600; color: var(--accent); }
/**
 * ★ 批次 490（Randy：「客户名、项目名等单行显示不全就换行显示，也参考谷露，
 *   按照现在的行距两行显示同时不增加行高完全没有问题」）：
 *   原来整张表是 `white-space:nowrap + 省略号`，客户名/项目名一长就变成「博格华纳（中国）投资...」。
 *   谷露是**最多两行**显示。现在给这几列加 `.inv-wrap`：允许换行、最多两行、行高收紧
 *   （1.2 倍），所以两行刚好落在原来那一行的高度里，不撑高表格。
 */
/**
 * ★ 批次 492（事故修复 —— Randy：「你把发票修坏了」）：
 *   上一版**直接给 `<td>` 加了 `display:-webkit-box`** 做两行截断 —— 这是把表格单元格
 *   踢出了表格布局：列宽不再对齐、名字全跑到下面去、整张表塌掉（Randy 那张截图就是）。
 *   正确做法：**td 保持普通表格单元格**，把"最多两行"的截断放到里面一层 div 上。
 */
table.inv-table td.inv-wrap { white-space: normal; overflow: hidden; text-overflow: clip; line-height: 1.2; vertical-align: middle; }
table.inv-table td.inv-wrap > .inv-clamp2 {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  white-space: normal;
  word-break: break-word;
}
/**
 * ★ 批次 490：付款方式（全款/首款/尾款）按谷露的配色做成浅色小胶囊 ——
 *   全款=绿、首款=紫、尾款=灰（与谷露截图一致）。
 */
.inv-pay-pill { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 11.5px; line-height: 18px; }
.inv-pay-pill.is-full { background: #E6F4EA; color: #1E7E34; }
.inv-pay-pill.is-first { background: #EDE9FB; color: #5B4BC4; }
.inv-pay-pill.is-last { background: #F1F0EC; color: #6F6D66; }
/* 表头右缘列宽拖拽手柄 */
.inv-col-resize { position: absolute; right: 0; top: 0; bottom: 0; width: 7px; cursor: col-resize; background: transparent; }
/* v20260829g：发票列表里可点击的客户名 / 候选人（颜色由业务分类决定，此处只管交互） */
table.inv-table td .inv-link { cursor: pointer; border-bottom: 1px dashed transparent; }
table.inv-table td .inv-link:hover { border-bottom-color: currentColor; background: rgba(0, 0, 0, 0.04); border-radius: 3px; }
/* v20260829h：业绩分配列直接显示「顾问名: ¥ 金额」 */
.inv-alloc-line { font-size: 12px; color: #3F3E3A; padding: 1px 0; }
.inv-alloc-line:first-child { padding-top: 0; }
.inv-alloc-line:last-child { padding-bottom: 0; }
.inv-col-resize:hover { background: rgba(var(--accent-rgb), 0.25); }
body.inv-col-resizing { cursor: col-resize; user-select: none; }
body.inv-col-resizing * { cursor: col-resize !important; }
table.inv-table td .inv-edit { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 5px; background: #EFFCFD; color: var(--accent); font-size: 12px; cursor: pointer; margin-right: 6px; vertical-align: middle; }
table.inv-table td .inv-edit:hover { background: var(--accent); color: #fff; }
table.inv-table td .inv-menu { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 5px; color: #33322e; font-size: 13px; cursor: pointer; margin-right: 6px; vertical-align: middle; }
table.inv-table td .inv-menu:hover { background: #EFFCFD; color: var(--accent); }
.inv-row-menu { position: fixed; min-width: 160px; background: #fff; border: 1px solid #e5e5e4; border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,0.12); z-index: 99999; overflow: hidden; padding: 4px 0; }
.inv-row-menu .inv-mi { padding: 7px 14px; font-size: 12px; color: #2D2C29; cursor: pointer; white-space: nowrap; }
.inv-row-menu .inv-mi:hover { background: #F7F6FB; color: var(--accent); }
.inv-menu-sep { height: 1px; background: #f1efe8; margin: 4px 0; padding: 0 !important; cursor: default !important; }
.inv-menu-sep:hover { background: #f1efe8 !important; }
.inv-alloc-table th, .inv-alloc-table td { border-bottom: 1px solid #f1efe8; }
.inv-edit-body .contract-section { margin-bottom: 12px; }

/* 表头搜索浮层 */
.inv-pop { position: fixed; z-index: 100020; background: #fff; border: 1px solid #d8d6cc; border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,0.14); padding: 10px 12px; width: 220px; }
.inv-pop .form-input { width: 100%; }
.inv-pop-arrow { position: absolute; top: -6px; left: 14px; width: 10px; height: 10px; background: #fff; border-left: 1px solid #d8d6cc; border-top: 1px solid #d8d6cc; transform: rotate(45deg); }

/* 表头「发票状态」下拉弹层（v20260828h） */
.inv-status-pop { width: 190px; padding: 6px; }
.inv-status-opt { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-radius: 6px; cursor: pointer; font-size: 12px; color: #2D2C29; }
.inv-status-opt:hover { background: #F7F6FB; }
.inv-status-opt.active { background: #EFFCFD; color: var(--accent); font-weight: 500; }
.inv-status-txt { flex: 1; }

/* 发票顶部搜索栏（v20260828h） */
.inv-search-bar { display: flex; align-items: center; gap: 8px; background: #fff; border: 1px solid #e5e5e4; border-radius: 10px; padding: 8px 12px; margin-bottom: 12px; flex-wrap: nowrap; }
.inv-search-ico { color: #B4B2A9; font-size: 14px; }
.inv-search-input { flex: 1 1 auto; min-width: 120px; height: 32px; border: 1px solid #d8d6cc; border-radius: 8px; padding: 0 12px; font-size: 13px; color: #2D2C29; outline: none; background: #fff; }
.inv-search-input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.12); }
/**
 * ★ 批次 501（Randy 2026-10-07）：「把下面的搜索部分排版做成同一行就可以，节约页面空间」
 *   原来 `.inv-search-bar` 是 `flex-wrap: wrap` + 输入框 `min-width: 260px` →
 *   窗口稍窄就折成三行（搜索框一行、状态下拉一行、四个按钮一行）。
 *   现在：条本身**不换行**、输入框可伸缩（`flex:1 1 auto; min-width:120px`）、
 *   下拉框固定宽、按钮不压缩不换行 —— 一行放得下，纵向省出两行。
 */
.inv-search-select { flex: 0 0 auto; width: 150px; height: 32px; border: 1px solid #d8d6cc; border-radius: 8px; padding: 0 8px; font-size: 13px; color: #2D2C29; outline: none; background: #fff; cursor: pointer; }
.inv-search-select:focus { border-color: var(--accent); }
.inv-search-bar .btn-sm { flex: 0 0 auto; white-space: nowrap; }

/* 发票搜索框：多字段网格布局 */
.invoice-search-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px 14px; }
.invoice-search-grid .form-label { margin-bottom: 4px; }

/* 作废状态徽标 */
.tag-void { background: #ECECEC; color: #9A9A9A; text-decoration: line-through; }

/* 发票左侧订阅搜索：复选框筛选 */
.inv-filter-check { display: flex; align-items: center; gap: 8px; padding: 7px 12px; margin: 2px 8px; border-radius: 6px; cursor: pointer; font-size: 13px; color: #2c2c2a; transition: background 0.15s; }
.inv-filter-check:hover { background: #f5f5f4; }
.inv-filter-check.active { background: #EFFCFD; color: var(--accent); font-weight: 500; }
/* v20260829d：左侧订阅搜索去圆圈、去共享行，纯文字行 */
.inv-filter-check { display: flex; align-items: center; gap: 8px; padding: 7px 12px; margin: 2px 8px; border-radius: 6px; cursor: pointer; font-size: 13px; color: #2c2c2a; transition: background 0.15s; }
.inv-filter-check:hover { background: #f5f5f4; }
.inv-filter-check.active { background: #EFFCFD; color: var(--accent); font-weight: 500; }
.inv-filter-check .inv-check-label { flex: 1; }

/* v20260829a：新增/编辑发票弹窗重设计（分块表单 + 单选付款方式 + 表格化业绩分配） */
.inv-form-body { max-height: 70vh; overflow-y: auto; padding-right: 4px; }
.inv-form-section { border: 1px solid #ECEAE2; border-radius: 10px; padding: 14px 16px; margin-bottom: 14px; background: #fff; }
.inv-form-section-title { font-size: 14px; font-weight: 600; color: #2c2c2a; margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid #f0efe9; }
.form-label.required::after { content: '*'; color: #A32D2D; margin-left: 3px; }
.inv-currency-input { position: relative; display: flex; align-items: center; }
.inv-currency-input .inv-currency-symbol { position: absolute; left: 10px; color: #888780; font-size: 14px; font-weight: 500; }
.inv-currency-input .form-input { padding-left: 24px; }
/* 批次 177（Randy 真机："空白框里面字有重叠"）：¥ 是绝对定位的，输入框必须**无条件**留出左侧内边距 ——
   原来只对 `.form-input` 生效，入职弹窗那个金额框没带这个类，数字就压在 ¥ 上面了。 */
.inv-currency-input input { padding-left: 24px; }
.inv-display-total { min-height: 36px; display: flex; align-items: center; font-size: 16px; font-weight: 600; color: var(--accent); }
/* v20260901y：发票弹窗排版规整为两栏网格，单选/展示/长文本/表格整行占满 */
.inv-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 20px; }
.inv-grid > .form-group { margin-bottom: 0; min-width: 0; }
.inv-grid .form-group.full { grid-column: 1 / -1; }
.inv-grid .form-group > .form-label { font-size: 12px; color: #6f6e6a; margin-bottom: 6px; }
.inv-grid .form-input, .inv-grid select, .inv-grid textarea { width: 100%; box-sizing: border-box; }
.inv-form-section .inv-pay-method-group { flex-wrap: wrap; }
@media (max-width: 560px) {
  .inv-grid { grid-template-columns: 1fr; gap: 12px; }
  .inv-grid .form-group.full { grid-column: auto; }
}
.inv-pay-method { display: inline-flex; align-items: center; gap: 6px; padding: 6px 0; cursor: pointer; font-size: 13px; color: #33322e; user-select: none; }
.inv-pay-method-dot { width: 16px; height: 16px; border: 1.5px solid #d8d6cc; border-radius: 50%; position: relative; box-sizing: border-box; }
.inv-pay-method.active { color: var(--accent); font-weight: 500; }
.inv-pay-method.active .inv-pay-method-dot { border-color: var(--accent); }
.inv-pay-method-dot.on::after { content: ''; position: absolute; left: 3px; top: 3px; width: 8px; height: 8px; border-radius: 50%; background: var(--accent); }
.inv-alloc-table-wrap { overflow-x: auto; border: 1px solid #ECEAE2; border-radius: 8px; }
.inv-alloc-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.inv-alloc-table th { background: #FAF9F5; color: #33322e; font-weight: 500; text-align: left; padding: 10px 8px; border-bottom: 1px solid #ECEAE2; white-space: nowrap; }
.inv-alloc-table td { padding: 8px; border-bottom: 1px solid #f5f5f4; vertical-align: middle; }
.inv-alloc-table .form-input { min-width: 0; width: 100%; }
.inv-alloc-table .alloc-role-select, .inv-alloc-table .alloc-team-select { padding-right: 20px; }
.inv-ratio-cell { display: flex; align-items: center; gap: 4px; }
.inv-ratio-cell .form-input { width: 70px; text-align: right; }
.inv-ratio-cell span { color: #888780; font-size: 13px; }
.alloc-amount { display: inline-block; min-width: 80px; padding: 6px 8px; background: #f5f5f4; border-radius: 6px; font-size: 12px; color: #1D9E75; font-weight: 500; text-align: right; }
.inv-alloc-total { margin-top: 8px; font-size: 12px; text-align: right; }
.inv-form-actions { display: flex; gap: 10px; margin-top: 16px; }

/* 发票顶部筛选面板 */
.inv-filter-panel { background: #fff; border: 1px solid #e5e5e4; border-radius: 10px; padding: 12px 14px; margin-bottom: 12px; }
.inv-filter-row { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px 14px; }
.inv-filter-row .form-input { width: 100%; min-width: 0; }
.inv-filter-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 12px; padding-top: 12px; border-top: 1px solid #ececea; }
@media (max-width: 1200px) { .inv-filter-row { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 900px) { .inv-filter-row { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 680px) { .inv-filter-row { grid-template-columns: repeat(2, 1fr); } }

.dash-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; }

.dash-metrics { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
.dash-metric-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 5px; }
.dash-metric-name { font-size: 13px; color: #2c2c2a; font-weight: 500; }
.dash-metric-num { font-size: 12px; color: #888780; }
.dash-metric-num b { color: #2c2c2a; font-size: 13px; }

.dash-clients { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; }
.dash-client { display: flex; align-items: center; gap: 10px; }
.dash-client-rank { width: 22px; height: 22px; border-radius: 50%; background: #f1efe8; color: #888780; font-size: 12px; font-weight: 600; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.dash-client-body { flex: 1; min-width: 0; }
.dash-client-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 5px; }
.dash-client-name { font-size: 13px; font-weight: 500; cursor: pointer; }
.dash-client-name:hover { text-decoration: underline; }
.dash-client-tag { font-size: 10px; color: #B4B2A9; white-space: nowrap; }

/* 业绩排名表高亮当前用户 */
.dash-rank-me { background: #EDFDFE; }
.dash-rank-me td { font-weight: 500; }
.tag-me { background: var(--accent); color: #fff; font-size: 10px; padding: 1px 6px; border-radius: 6px; margin-left: 4px; }
.tag-ok { background: #E7F6EC; color: #3B6D11; font-size: 11px; padding: 2px 8px; border-radius: 6px; }

@media (max-width: 1100px) {
  .dash-overview { grid-template-columns: repeat(2, 1fr); }
  .dash-grid { grid-template-columns: 1fr; }
}

/* ========== AI 日志 ========== */
.ai-log-item {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  padding: 4px 0;
}
.ai-log-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.ai-log-dot.done { background: #639922; }
.ai-log-dot.running { background: #1D9E75; opacity: 0.4; animation: pulse 1.5s infinite; }
@keyframes pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }

/* ========== 按钮 ========== */
.btn-sm {
  font-size: 11px;
  padding: 3px 8px;
  border-radius: 6px;
  border: 1px solid #e5e5e4;
  background: transparent;
  color: #888780;
  transition: all 0.15s;
}
.btn-sm-ghost { border-style: dashed; color: #B4B2A9; }
.btn-sm-ghost:hover { color: #C0392B; border-color: #E7857D; }
.btn-sm:hover { border-color: var(--accent-bright); color: var(--accent); }
.btn-sm-accent {
  border-color: var(--accent-focus);
  color: var(--accent);
  background: #EDFDFE;
}
.btn-sm-accent:hover { background: var(--accent-light); }
.btn-sm-danger { border-color: #E3A9A9; color: #C0392B; background: #FCEDED; }
.btn-sm-danger:hover { background: #F6D5D5; border-color: #E7857D; }

/* ========== 模态框 ========== */
.modal-overlay {
  display: none;
  position: fixed;
  top: 0; left: 0; right: 0; bottom: 0;
  background: rgba(0,0,0,0.35);
  z-index: 1000;
  align-items: center;
  justify-content: center;
}
.modal-overlay.show { display: flex; }
.modal {
  background: #fff;
  border-radius: 16px;
  padding: 24px;
  max-width: 560px;
  width: 90%;
  max-height: 85vh;
  overflow-y: auto;
  transition: all 0.3s ease;
  /* v20260829m：为右上角固定关闭按钮提供定位基准 */
  position: relative;
}

/* 候选人详情：加宽 Modal + 左侧浏览列表（约 90% 屏幕） */
.modal-overlay.candidate-wide .modal {
  max-width: 1800px;
  width: 90%;
  height: 90vh;
  max-height: 90vh;
  padding: 0;
  overflow: hidden;
}
/**
 * ★ 批次 695（Randy 2026-10-13：「排版有点挤到边上，优化一下，类似的地方也都修掉」）：
 *   **表格类弹窗**专用尺寸 —— 借 `candidate-wide` 放表格会顶到边（它的 `padding: 0` 是给
 *   候选人详情页用的，详情页内部自己管留白）。这个类比它略窄、四周留 20-22px。
 *   首页业绩穿透 / KPI 穿透 / 项目流程穿透名单 / 业绩分析穿透 一律用它（`opts.tableWide`）。
 */
.modal-overlay.table-wide .modal {
  max-width: 1500px;
  width: 94%;
  max-height: 88vh;
  overflow: auto;
  padding: 20px 22px;
}
.modal-overlay.table-wide .modal th:first-child,
.modal-overlay.table-wide .modal td:first-child { padding-left: 4px; }
.modal-overlay.table-wide .modal th:last-child,
.modal-overlay.table-wide .modal td:last-child { padding-right: 4px; }
.cand-detail-layout {
  display: flex;
  height: 100%;
  position: relative;
}
/* 常规（候选人库）打开详情时不显示左侧列表，主区占满宽度 */
.cand-detail-no-sidebar .cand-detail-main { min-width: 0; }
.cand-detail-sidebar {
  width: 244px;
  flex-shrink: 0;
  border-right: 1px solid #ECEAE2;
  background: #FAF9F5;
  overflow-y: auto;
  padding: 14px 10px;
  scroll-behavior: smooth;
}
/* 最大化模式下隐藏左侧候选人列表，让详情区占满宽度 */
.cand-detail-full .cand-detail-sidebar { display: none; }
.cand-detail-right {
  flex: 0 0 auto;
  width: 35%;
  min-width: 300px;
  max-width: 560px;
  background: #FAF9F5;
  overflow-y: auto;
  /* v20260829m：右上角固定关闭按钮占 30px + 间距，右栏顶部留出让位，避免叉号压住内容 */
  padding: 46px 14px 18px;
}
/* v20260901n：最大化/全屏模式下无右上角关闭叉，右栏顶部无需额外留白，让「关联项目 & 流转进度」模块贴顶对齐 */
.cand-detail-full .cand-detail-right { padding-top: 14px; }
/* v20260829m：候选人详情关闭按钮固定在整个弹窗的右上角（原先在主区内，会随内容滚动消失） */
/* v20260829m：候选人详情关闭按钮固定在整个弹窗的右上角（原先在主区内，会随内容滚动消失）
   v20260829n 修复：必须写成「双类」选择器 .modal-close.cand-detail-close ——
   单类 .cand-detail-close（特异性 0-1-0）与后面的 .modal-close 同级，会因「后定义者胜出」
   被 .modal-close 的 position:sticky;float:right 覆盖；而父容器 .cand-detail-layout 是 flex，
   float 对 flex item 无效 → 叉号被排到第一个位置，视觉上跑到左上角。 */
.modal-close.cand-detail-close {
  position: absolute;
  top: 10px;
  right: 16px;
  float: none;
  margin-left: 0;
  z-index: 60;
}
.cand-detail-full .modal-close.cand-detail-close { top: 12px; right: 20px; }
/* 主区 / 右栏 之间的可拖拽分隔条（默认约 65% / 35%，拖拽后持久化） */
.cand-detail-resizer {
  flex: 0 0 7px;
  position: relative;
  cursor: col-resize;
  z-index: 6;
  background: transparent;
}
.cand-detail-resizer::after {
  content: '';
  position: absolute;
  top: 0; bottom: 0; left: 50%;
  transform: translateX(-50%);
  width: 2px;
  background: #E2E0D8;
  transition: background 0.12s, width 0.12s;
}
.cand-detail-resizer:hover::after, .cand-detail-resizer.dragging::after {
  background: var(--accent);
  width: 3px;
}
body.cand-resizing, body.cand-resizing * { user-select: none !important; cursor: col-resize !important; }
.cand-detail-right .detail-section { background: #fff; border: 1px solid #ECEAE2; border-radius: 10px; padding: 12px 14px; margin-bottom: 12px; }
.cand-detail-right .detail-section-title { font-size: 13px; }
.cand-detail-right .detail-section-title .cand-job-filter {
  width: 100%;
  min-width: 0;
  font-size: 12px;
  color: #33322e;
  text-transform: none;
  letter-spacing: normal;
  border: 1px solid #d3d1c7;
  border-radius: 6px;
  padding: 6px 26px 6px 12px;
  background: #fff url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%238a8a86' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat right 10px center;
  appearance: none;
  -webkit-appearance: none;
  cursor: pointer;
  outline: none;
  box-sizing: border-box;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.cand-detail-right .detail-section-title .cand-job-filter:hover { border-color: var(--accent-bright); }
.cand-detail-right .detail-section-title .cand-job-filter:focus { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),0.12); }
/**
 * v20260902b：下拉右侧「↗」—— 把当前选中项目跳到独立项目详情页。
 *
 * ★ 批次 727（Randy 2026-10-15：「这个新页面的入口显示需要修复」，截图上"新页面"三个字被
 *   挤成竖排、还溢出到卡片外面）：
 *   真因 —— 这条样式原来把按钮**写死成 30×30**（当时旁边永远有个下拉框，按钮里只有一个「↗」）。
 *   批次 719 之后「只关联 1 个项目」时按钮**也显示**，而它带的文案是「↗ 新页面」——
 *   5 个字符塞进 30px 的方框里，只能一个字一行地竖着排，于是看起来"坏了"。
 *   修法：宽度改成**按内容撑开**（`width:auto` + `min-width:30px` + `white-space:nowrap`），
 *   只有箭头时仍是原来的 30×30 小方钮，带文字时自然变成一个正常的小胶囊按钮。
 *   选择器同时**去掉 `.cand-detail-right` 前缀** —— 候选人详情还会以预览右栏/弹窗等形式出现，
 *   原来只认一种容器，换个容器就漏掉（按钮会退回浏览器默认样式）。
 */
.cand-job-open-new {
  flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  width: auto; min-width: 30px; height: 30px;
  padding: 0 9px;
  font-size: 13px; line-height: 1;
  white-space: nowrap;
  color: var(--accent);
  background: #fff;
  border: 1px solid #d3d1c7;
  border-radius: 6px;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s, color 0.15s;
}
.cand-job-open-new:hover {
  border-color: var(--accent-bright);
  background: #f4fbfc;
  color: #0f5e64;
}
.cand-job-open-new:active { background: #ecf7f8; }
/**
 * ★ 批次 732（Randy 2026-10-15）：「鼠标停留人才出现的人才预览，做到预览占页面的右侧 1/3 屏，
 *   并且可以上下滑动候选人页面」
 * ---------------------------------------------------------------------------
 * 原来是跟着姓名格浮在列表上的**小卡片**（326px）—— 信息挤、挡着行、一滚就收（等于没法一边看一边滑）。
 * 现在：右侧固定的 **1/3 屏面板**（宽度由 JS 按视口算，夹在 320~560px），满高、内部自己滚；
 *   面板驻留期间**不监听滚动**，所以候选人列表照常上下滑。
 */
.cand-peek-panel {
  position: fixed; top: 0; right: 0; height: 100vh; z-index: 10060;
  box-sizing: border-box; overflow-y: auto;
  background: #fff; border-left: 1px solid #E6E4DD; box-shadow: -10px 0 28px rgba(0,0,0,.10);
  padding: 14px 16px 18px;
  font-size: 13px; color: #2C2C2A; line-height: 1.55;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", sans-serif;
}
.cand-peek-hd { display: flex; align-items: center; justify-content: space-between; font-size: 12px; color: #888780; margin-bottom: 10px; }
.cand-peek-x { cursor: pointer; font-size: 14px; line-height: 1; color: #888780; padding: 0 2px; }
.cand-peek-x:hover { color: #A32D2D; }
.cand-detail-main {
  flex: 1;
  overflow-y: auto;
  padding: 24px 28px;
  min-width: 0;
}
.cand-nav-title {
  font-size: 12px;
  font-weight: 600;
  color: #888780;
  padding: 0 8px 10px;
}
.cand-nav-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  border-radius: 8px;
  cursor: pointer;
  transition: background 0.12s;
}
.cand-nav-item:hover { background: #F0EEE6; }
.cand-nav-item.active { background: #E5F8F9; }
.cand-nav-avatar {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--accent);
  color: #fff;
  font-size: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.cand-nav-info { flex: 1; min-width: 0; }
.cand-nav-name {
  font-size: 13px;
  font-weight: 500;
  color: #35342F;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cand-nav-item.active .cand-nav-name { color: var(--accent); }
.cand-nav-sub {
  font-size: 11px;
  color: #B4B2A9;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
@media (max-width: 900px) {
  .cand-detail-sidebar { display: none; }
  .cand-detail-right { display: none; }
  .modal-overlay.candidate-wide .modal { padding: 0; }
}

/* 项目详情：加宽 Modal（与候选人/客户对齐到约 90% 屏幕；
   因项目详情内容直接渲染在 .modal 内，需保留内边距与滚动） */
.modal-overlay.job-wide .modal {
  max-width: 1800px;
  width: 90%;
  height: 90vh;
  max-height: 90vh;
  padding: 24px;
  overflow-y: auto;
}

/* v20260904q：项目「编辑/新增」弹窗 —— 尺寸与「编辑候选人」弹窗（js/app.js L16923
   内联 style="max-width:860px;width:92%;max-height:70vh;overflow:auto"）拉齐。
   不要与 .job-wide（项目详情 1800px/90%/90vh）混用。 */
.modal-overlay.job-edit-wide .modal {
  max-width: 860px;
  width: 92%;
  max-height: 70vh;
  overflow-y: auto;
}

/* v20260904r：项目编辑/新增弹窗内的 .form-row 恢复横向并排。
   知识库模块在 L5066 把全局 .form-row 设为 column，污染了所有弹窗；
   此处用 .modal-overlay.job-edit-wide 作用域恢复，避免动 kb.js。 */
.modal-overlay.job-edit-wide .form-row { display: flex; flex-direction: row; gap: 12px; }
.modal-overlay.job-edit-wide .form-row > * { flex: 1; }

/* v20260904s：项目描述输入改为「左侧提示词 + 右侧输入框」两栏，
   提示词始终可见，不会因为用户输入而消失。 */
.modal-overlay.job-edit-wide .desc-prompt-layout { display: flex; gap: 14px; align-items: stretch; }
.modal-overlay.job-edit-wide .desc-prompt { flex: 0 0 180px; font-size: 12px; color: #6f6e6a; line-height: 1.8; padding-top: 4px; }
.modal-overlay.job-edit-wide .desc-prompt > div:not(:last-child) { margin-bottom: 6px; }
.modal-overlay.job-edit-wide .desc-input { flex: 1; min-width: 0; width: 100%; resize: vertical; }

/* 客户详情：与候选人/项目对齐到约 90% 屏幕，头部贴边、内容区内部滚动 */
.modal-overlay.client-wide .modal {
  max-width: 1800px;
  width: 90%;
  height: 90vh;
  max-height: 90vh;
  padding: 0;
  overflow: hidden;
}
.modal-overlay.client-wide .client-detail-full { height: 100%; }
.modal-overlay.maximized.job-wide .modal {
  max-width: 100vw;
  width: 100vw;
  max-height: 100%;
  height: 100%;
  border-radius: 0;
  padding: 24px 32px;
}

/* 客户详情最大化：铺满视口，头部贴边、内容区内部滚动（与候选人/项目对齐） */
.modal-overlay.maximized.client-wide .modal { padding: 0; }
.modal-overlay.maximized.client-wide .client-detail-full { height: calc(100vh - 52px); }

/* 最大化的 Modal：从顶栏下方开始，保留一级导航始终可见 */
.modal-overlay.maximized { top: 52px; align-items: stretch; }
.modal-overlay.maximized .modal {
  max-width: 100vw;
  width: 100vw;
  max-height: 100%;
  height: 100%;
  border-radius: 0;
  padding: 20px 28px;
}
.modal-overlay.maximized .modal #mappingContent {
  max-height: calc(100vh - 244px) !important;
}

/* 候选人详情全屏模式：最大化时铺满视口，三栏布局同时展示 */
.modal-overlay.maximized.candidate-wide .modal { padding: 0; }
.modal-overlay.maximized.candidate-wide .cand-detail-layout { height: calc(100vh - 52px); }
.modal-overlay.maximized.candidate-wide .cand-detail-right { width: 35%; }

/* 备注：沟通方式选择 chip */
.note-type-chip {
  display: inline-flex;
  align-items: center;
  padding: 6px 12px;  border-radius: 999px;
  border: 1px solid #E2E0D8;
  background: #fff;
  color: #33322e;
  font-size: 12px;
  cursor: pointer;
  user-select: none;
  transition: all 0.12s;
}
.note-type-chip:hover { border-color: var(--accent); color: var(--accent); }
.note-type-chip.active { background: var(--accent); border-color: var(--accent); color: #fff; }

/* 备注浮窗：透明遮罩 + 浮窗定位（默认贴右侧「流转进度」栏边，不阻挡左侧候选人主区滚动） */
.modal-overlay.transparent {
  background: transparent;
  pointer-events: none; /* 关键：让左/中候选人主区的鼠标滚动与点击不被遮罩拦截 */
  align-items: flex-start;
  justify-content: flex-end;
  padding: 0;
}
.modal-overlay.transparent .modal {
  pointer-events: auto; /* 浮窗自身可正常交互 */
  box-shadow: 0 12px 32px rgba(0,0,0,0.18);
  border-radius: 12px;
  margin: 0;
  /* 2026-09-16（Randy：备注浮窗显示不全）：70vh 在 900px 级屏幕上仍可能"顶部 55% + 70vh"超出视口，
     这里改成"视口高 - 120px"，配合 JS 的 _clampNoteModalToViewport() 保证整块浮窗（含保存按钮）始终看得见。 */
  max-height: calc(100vh - 120px);
  overflow-y: auto;
}
/* 备注浮窗：紧凑小弹窗，强制覆盖 candidate-wide/maximized 给 .modal 设置的 90vw/100vw */
.modal-overlay.transparent .modal.note-floating-modal {
  width: auto;
  height: auto;
  /**
   * ★ 批次 409（Randy）：参考谷露那张图 —— 输入框要宽、上面几行要矮（520→660px）。
   * ★ 批次 411（Randy）：「宽度可以再增加一些，上面的显示栏再减少一些行间距，留更多空间给备注栏」
   *   → 660→800px（小屏用 min() 兜底，别顶出屏幕）。
   * ★ 批次 412（Randy）：「默认的弹窗大小稍微减小 10%」→ 800→720px；
   *   另外支持**手动拖拽改大小**（见 js/app.js 的 _bindNoteModalResize）。
   * ★ 批次 413（Randy）：「默认弹窗大小再缩小 10%」→ 720→648px；
   *   「手动调整大小要支持**四周**均可以拖拽」→ 四条边 + 四个角共 8 个手柄（.note-rs）。
   * ★ 批次 414（Randy）：「默认弹窗的宽度再缩小 10%」→ 648→**583px**；「实际时间放在弹窗下方」→
   *   下方整行（.note-form-row-time），日期不再被三格并排挤得显示不全。
   */
  max-width: min(583px, calc(100vw - 32px));
  max-height: 78vh;
  padding: 20px 22px;
}
/**
 * 批次 412/413：拖拽缩放手柄 —— 四条边（n/s/w/e）+ 四个角（nw/ne/sw/se）。
 * 内缩 0~3px 放在弹窗边缘的留白里：既不会挡到正文/按钮，也不会被 overflow 裁掉。
 */
.note-rs { position: absolute; z-index: 3; }
.note-rs-n { top: 0; left: 12px; right: 12px; height: 6px; cursor: ns-resize; }
.note-rs-s { bottom: 0; left: 12px; right: 12px; height: 6px; cursor: ns-resize; }
.note-rs-w { left: 0; top: 12px; bottom: 12px; width: 6px; cursor: ew-resize; }
.note-rs-e { right: 0; top: 12px; bottom: 12px; width: 6px; cursor: ew-resize; }
.note-rs-nw { left: 0; top: 0; width: 14px; height: 14px; cursor: nwse-resize; }
.note-rs-ne { right: 0; top: 0; width: 14px; height: 14px; cursor: nesw-resize; }
.note-rs-sw { left: 0; bottom: 0; width: 14px; height: 14px; cursor: nesw-resize; }
.note-rs:hover { background: rgba(var(--accent-rgb), 0.10); }
/* 右下角那个做成看得见的斜纹手柄 */
.note-modal-resizer {
  position: absolute; right: 3px; bottom: 3px;
  width: 16px; height: 16px;
  cursor: nwse-resize;
  border-radius: 0 0 6px 0;
  background: repeating-linear-gradient(135deg, transparent 0 5px, #C0BEB5 5px 6px);
  -webkit-mask-image: linear-gradient(135deg, transparent 0 32%, #000 32%);
  mask-image: linear-gradient(135deg, transparent 0 32%, #000 32%);
  opacity: .85;
}
.note-modal-resizer:hover { opacity: 1; background: repeating-linear-gradient(135deg, transparent 0 5px, var(--accent) 5px 6px); }
.note-floating-modal {
  transition: box-shadow 0.15s;
}
.note-floating-modal .modal-title { margin-bottom: 8px; }   /* 批次 411：标题下边距 16→8 */
.note-floating-modal:hover { box-shadow: 0 16px 40px rgba(0,0,0,0.22); }
.note-drag-handle:active { cursor: grabbing !important; }

/* 备注编辑器：类型/结果并排，时间框占满 */
.note-form-row {
  display: flex;
  gap: 10px;   /* 批次 411：12→10，三格并排也留得下 */
  align-items: flex-start;
}
.note-form-row .note-form-field {
  flex: 1 1 0;
  min-width: 0;
}
.note-form-field .form-label {
  /* 批次 409：标签收紧（原来 12px 且带 6px 上边距）；批次 411 再收到 11px / 2px */
  font-size: 11px;
  color: #33322e;
  margin-bottom: 2px;
}
/* 批次 409/411：标题下面第一行不留额外空白 */
.note-form-row-top { margin-top: 0; }
/* 批次 414：实际时间单独占弹窗下方一整行（日期/小时/分钟都显示得全；CM 时这段 display:none） */
.note-form-row-time { margin-top: 6px; }
.note-form-row-time .qhp-date { flex: 1 1 auto; }   /* 整行时日期框自然撑开，不再被压窄 */
/* 批次 409 起：主输入区（沟通内容）—— 省下来的高度都给它（411 放大；412/413/414 各默认收 10%） */
.note-textarea-main {
  display: block;
  min-height: 175px;
  height: 31vh;
  max-height: 308px;
}
.note-form-field .form-input {
  width: 100%;
  height: 34px;   /* 批次 411：38→34，省下来的高度给输入区 */
  padding: 0 10px;
  border: 1px solid #D8D6CD;
  border-radius: 8px;
  font-size: 13px;
  color: #35342F;
  background: #fff;
  box-sizing: border-box;
}
.note-form-field .form-input:focus {
  outline: none;
  border-color: var(--accent);
}
.note-form-field input[type="datetime-local"].form-input {
  padding-right: 8px;
}

/* CM（客户拜访）多字段表单：参与者 chips（v20260828b） */
.cm-participant-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  margin: 0 6px 6px 0;
  border: 1px solid var(--accent);
  border-radius: 999px;
  background: rgba(var(--accent-rgb), 0.08);
  color: var(--accent);
  font-size: 12px;
  line-height: 1.4;
}
.cm-chip-x {
  cursor: pointer;
  font-size: 12px;
  color: #62A8AD;
  padding: 0 2px;
}
.cm-chip-x:hover {
  color: #D64545;
}

/* CM（客户拜访）表单 v20260828d：更多信息折叠区、关联项目下拉、参与者搜索下拉 */
.cm-more-info-wrap {
  margin-top: 14px;
}
.cm-more-info-toggle {
  background: transparent;
  border: none;
  padding: 0;
  font-size: 12px;
  color: var(--accent-2);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.cm-more-info-toggle:hover {
  color: var(--accent-3);
}

.cm-job-picker {
  position: relative;
}
.cm-job-display {
  width: 100%;
  min-height: 38px;
  padding: 0 10px;
  border: 1px solid #D8D6CD;
  border-radius: 8px;
  background: #fff;
  font-size: 13px;
  color: #35342F;
  display: flex;
  align-items: center;
  cursor: pointer;
  box-sizing: border-box;
}
.cm-job-display:hover {
  border-color: var(--accent);
}
.cm-job-dropdown {
  position: absolute;
  top: 42px;
  left: 0;
  right: 0;
  background: #fff;
  border: 1px solid #D8D6CD;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.12);
  z-index: 100050;
  padding: 6px;
}
.cm-job-search input,
.cm-participant-search input {
  width: 100%;
  height: 32px;
  padding: 0 8px;
  border: 1px solid #E4E2DA;
  border-radius: 6px;
  font-size: 12px;
}
.cm-job-list,
.cm-participant-list {
  max-height: 180px;
  overflow-y: auto;
  margin-top: 6px;
}
.cm-job-item,
.cm-participant-item {
  padding: 8px 10px;
  border-radius: 6px;
  cursor: pointer;
  font-size: 13px;
  color: #35342F;
  display: flex;
  align-items: center;
  gap: 6px;
}
.cm-job-item:hover,
.cm-participant-item:hover {
  background: #F5F5F4;
}
.cm-job-client {
  color: #888780;
  font-size: 11px;
}
.cm-job-empty,
.cm-participant-empty {
  padding: 10px;
  color: #888780;
  font-size: 12px;
  text-align: center;
}

.cm-participant-picker {
  position: relative;
}
.cm-participant-dropdown {
  position: absolute;
  top: 34px;
  left: 0;
  min-width: 220px;
  background: #fff;
  border: 1px solid #D8D6CD;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.12);
  z-index: 100050;
  padding: 6px;
}
.cm-participant-name {
  flex: 1;
}

.form-textarea {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid #D8D6CD;
  border-radius: 8px;
  padding: 10px 12px;
  font-size: 13px;
  font-family: inherit;
  color: #35342F;
  resize: vertical;
  line-height: 1.6;
}
.form-textarea:focus { outline: none; border-color: var(--accent); }

.mapping-toolbar-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px 10px;
  border: 1px solid #d3d1c7;
  border-radius: 6px;
  background: #fff;
  font-size: 12px;
  color: #33322e;
  cursor: pointer;
  transition: all 0.15s;
}
.mapping-toolbar-btn:hover {
  background: #f5f4f0;
  border-color: var(--accent);
  color: var(--accent);
}

/* ========== 工作流步骤条 ========== */
.workflow-stepper {
  display: flex;
  align-items: flex-start;
  padding: 16px 0 8px;
  flex-wrap: wrap;
  gap: 0;
}
.wf-step {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  min-width: 60px;
  position: relative;
  z-index: 1;
}
.wf-circle {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 2px solid #E5E5E4;
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.2s;
}
.wf-label {
  font-size: 11px;
  color: #B4B2A9;
  text-align: center;
  white-space: nowrap;
}
.wf-sla {
  font-size: 9px;
  opacity: 0.7;
  text-align: center;
}
.wf-line {
  flex: 1;
  height: 2px;
  background: #E5E5E4;
  margin: 14px 2px 0;
  min-width: 12px;
}
.wf-step:hover .wf-circle {
  transform: scale(1.1);
}
.wf-future:hover .wf-circle {
  border-color: var(--accent);
}
.wf-future:hover .wf-label {
  color: var(--accent);
}
.modal-title { font-size: 16px; font-weight: 500; margin-bottom: 16px; }

/* v20260829m：全站弹窗关闭按钮统一固定到「弹窗右上角」。
   原实现只用了 float:right —— 一旦弹窗内容滚动，叉号会随内容滚出视野；
   且个别弹窗（客户详情）把叉号写在了标题左侧。现统一改为：
   ① float:right 保证在内容行的最右侧；
   ② position:sticky; top:0 保证随滚动始终吸附在弹窗顶部右侧，不会滚走；
   ③ 白底圆形 + 阴影，避免压住内容时看不清。 */
.modal-close {
  float: right;
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  z-index: 30;
  width: 26px;
  height: 26px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #fff;
  color: #B4B2A9;
  font-size: 17px;
  line-height: 1;
  cursor: pointer;
  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.12);
  flex-shrink: 0;
  /* v20260829n：若叉号的父容器是 flex（float 对 flex item 无效，会把它排到最左），
     用 order + margin-left:auto 兜底，保证它仍然落在最右侧。
     非 flex 容器下这两条属性不生效，仍由上面的 float:right 负责靠右。 */
  order: 9999;
  margin-left: auto;
}
.modal-close:hover { color: #33322e; background: #f2f1ec; }
/* 全屏弹窗（候选人/项目/客户详情）的 overlay 顶部预留了顶栏高度（批次 490：64 → 52px），叉号相应下移 */
.modal-overlay.maximized .modal-close { top: 10px; }

/* v20260829m：弹窗头部统一 flex 两端对齐 —— 保证 .modal-header 里的 ✕/btn-icon 落在右上角 */
.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.modal-header .modal-title { margin-bottom: 0; }
/* 弹窗头部/独立 overlay 头部的 ✕ 按钮统一尺寸与配色，避免裸 button 样式不统一 */
.btn-icon {
  flex-shrink: 0;
  width: 30px;
  height: 30px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  background: transparent;
  border-radius: 50%;
  color: #B4B2A9;
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  padding: 0;
}
.btn-icon:hover { background: #f2f1ec; color: #33322e; }

/* v20260829j：取消「点击遮罩关闭」后的兜底关闭按钮。
   当某个弹窗内容里没有任何关闭入口时，由 App._ensureModalCloseEntry 自动注入，
   用 fixed 定位保证在全屏弹窗（候选人/项目/客户详情）里也不会被内容遮挡。 */
/* v20260829m：注入点改为 .modal 内部，用 absolute 相对「弹窗」右上角定位
   （原 fixed 是相对视口，对居中的小弹窗会跑到屏幕右上角，不符合预期）。 */
.modal-close.auto-modal-close {
  float: none;
  position: absolute;
  top: 12px;
  right: 14px;
  z-index: 100020;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
  background: #fff;
  color: #33322e;
  border-radius: 50%;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
}
.modal-close.auto-modal-close:hover { background: #f2f1ec; color: #26251f; }

/* ========== 表单 ========== */
.form-group { margin-bottom: 14px; }
.form-label { display: block; font-size: 12px; color: #888780; margin-bottom: 4px; }
.form-row { display: flex; gap: 12px; }
.form-row > * { flex: 1; }

/* ========== v20260908v：候选人/速览编辑页 —— 两列网格 + 合并出生年月美化 ========== */
.gg-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px 18px;
  margin: 6px 0;
}
.gg-field { min-width: 0; }
.gg-field > .form-input,
.gg-field > .form-textarea,
.gg-field > select { width: 100%; box-sizing: border-box; }
.gg-field.full { grid-column: 1 / -1; }
/* 原生月份选择器在 WebKit 下自带小箭头，统一边框/圆角即可，无需额外处理 */
.gg-field.full > input[type="month"] { max-width: 240px; }
.gg-section-label {
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  margin: 20px 0 8px;
  padding-left: 9px;
  border-left: 3px solid var(--accent-bright);
  line-height: 1.3;
}
.gg-hint { font-size: 11px; color: #B4B2A9; margin-top: 5px; }
.gg-footnote { font-size: 11px; color: #B4B2A9; margin-top: 12px; }
/* 窄屏下退回单列，避免拥挤 */
@media (max-width: 560px) {
  .gg-grid { grid-template-columns: 1fr; }
  .gg-field.full > input[type="month"] { max-width: 100%; }
}

/* ========== 候选人详情 ========== */
.detail-header {
  display: flex;
  align-items: flex-start;          /* v20260902aa：换行后顶部对齐，避免「来源渠道」被一行化挤压 */
  flex-wrap: wrap;                  /* v20260902aa：允许操作组在窄屏换到下一行，不再死抢同一行 */
  gap: 10px 14px;                   /* row-gap col-gap；行间 10px 防止换行后贴在一起 */
  margin-bottom: 16px;
}
.detail-avatar {
  width: 48px; height: 48px;
  border-radius: 50%;
  background: #EDFDFE;
  color: var(--accent);
  display: flex; align-items: center; justify-content: center;
  font-size: 18px;
  font-weight: 500;
  overflow: hidden;          /* v20260902ak：圆内图片裁切（照片/卡通/默认剪影） */
  flex-shrink: 0;
}
.detail-avatar img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.detail-name { font-size: 16px; font-weight: 500; }
.detail-sub { font-size: 13px; color: #888780; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.detail-section { margin-bottom: 18px; }
.cand-detail-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;                   /* v20260902aa：去掉 flex-shrink:0+margin-left:auto 组合，改用 flex 简写；
                                       整组宽度由内容决定，detail-header 换行时可整体下沉到第二行 */
  margin-left: auto;
  flex-wrap: wrap;
  min-width: 0;
  max-width: 100%;
  justify-content: flex-end;        /* 组内按钮组右对齐，避免换行后散到左边 */
}
.cand-detail-actions-grid {
  display: flex;                       /* v20260902aa：保持 flex+wrap，按钮在窄屏自然换行 */
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
  justify-content: flex-end;
  min-width: 0;
}
.cand-detail-actions-grid .btn-sm {
  width: auto;                         /* v20260902aa：按内容自适应；之前是 100% 撑满网格列 */
  min-width: 0;
  flex: 0 0 auto;                      /* v20260902aa：禁止按钮本身被压缩；长文本省略由父容器 ellipsis 负责 */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 4px 8px;
}
/* Primary CTA：⊕ 加入项目（窄长小长方形，置于工具条最右侧，高度撑满左侧两行栅格、上下对齐 — 候选人推荐到项目的核心入口） */
.btn-cand-primary-square {
  width: 58px;
  align-self: stretch;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 8px 6px;
  border: 1px solid var(--accent);
  border-radius: 10px;
  background: linear-gradient(135deg, var(--accent) 0%, #247C83 100%);
  color: #fff;
  cursor: pointer;
  transition: all 0.15s ease;
  box-shadow: 0 4px 10px rgba(var(--accent-rgb), 0.28);
  flex-shrink: 0;
}
.btn-cand-primary-square .icon {
  font-size: 20px;
  line-height: 1;
  font-weight: 500;
}
.btn-cand-primary-square .label {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.3px;
  line-height: 1.1;
  white-space: nowrap;
}
.btn-cand-primary-square:hover {
  background: linear-gradient(135deg, var(--accent-hover) 0%, var(--accent) 100%);
  border-color: var(--accent-hover);
  box-shadow: 0 6px 14px rgba(var(--accent-rgb), 0.4);
  transform: translateY(-2px);
}
.btn-cand-primary-square:active {
  transform: translateY(0);
  box-shadow: 0 2px 4px rgba(var(--accent-rgb), 0.3);
}
/* 危险操作：删除候选人（柔和浅红，不抢视觉，但仍可识别） */
.cand-detail-actions-grid .btn-sm.cand-danger {
  color: #C0392B;
  border-color: #E3A9A9;
  background: #FCEDED;
}
.cand-detail-actions-grid .btn-sm.cand-danger:hover {
  background: #F6D5D5;
  border-color: #E7857D;
}
/* v20260902aa：来源渠道文字（按钮内的 span）—— 关键修复：
   之前用 flex:0 1 auto + min-width:0，父按钮被父级 inline-flex 压缩时，span 会被压到 1 字符宽，
   而 white-space:nowrap + overflow:hidden 导致「公司数据库」被拆成「公/司/数/据/库」5 行。
   现在用 inline-block + 显式 max-width，按钮与文字都不再被压缩，文字超长时按 ellipsis 截断。 */
.cand-source-btn {
  flex-shrink: 0;                   /* 按钮不被 flex 父级压扁 */
  white-space: nowrap;              /* 按钮内文字永不换行 */
}
.cand-source-btn > .cand-source-text {
  display: inline-block;
  max-width: 140px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: bottom;
}
.detail-section-title {
  font-size: 12px;
  color: #888780;
  margin-bottom: 8px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

/* ========== 候选详情横向目录（标准简历 / 原始简历 / 推荐报告 / AI推荐报告 / 附件） ========== */
.cand-tab-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  padding: 4px;
  background: #f4f3ee;
  border: 1px solid #ecebe4;
  border-radius: 10px;
  margin-bottom: 12px;
}
.cand-tab {
  flex: 0 0 auto;
  padding: 6px 14px;
  font-size: 13px;
  font-weight: 500;
  color: #33322e;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 7px;
  cursor: pointer;
  white-space: nowrap;
  transition: background .15s, color .15s, border-color .15s;
}
.cand-tab:hover { background: #fff; color: #2b2a27; }
.cand-tab.active {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  box-shadow: 0 1px 3px rgba(var(--accent-rgb),.25);
}
#candTabPanel { margin-top: 0; }

/* ========== 候选人变更日志（横向目录“日志”tab） ========== */
.cand-log-list { display: flex; flex-direction: column; gap: 8px; }
.cand-log-item {
  padding: 10px 12px;
  border: 1px solid #f1efe8;
  border-left: 3px solid var(--accent);
  border-radius: 10px;
  background: #fafaf8;
}
.cand-log-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.cand-log-badge { font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
.cand-log-time { font-size: 11px; color: #888780; }
.cand-log-detail { font-size: 13px; color: #2b2a27; line-height: 1.5; word-break: break-all; }
.cand-log-who { font-size: 11px; color: #B4B2A9; margin-top: 4px; }

/* ========== 候选人速览卡（页面最上端） ========== */
/**
 * ★ 批次 486：速览大卡原来也是"描边 + 左侧色条 + 渐变底"三层视觉，现在只留一层极淡底，
 *   左侧色条改成标题前的一小段竖线（在 JS 里已按同一风格渲染），不再靠边框划区。
 */
.glance-card { background: #fbfbf9; border: none; border-left: none; box-shadow: 0 1px 2px rgba(43,42,39,.03); }
/**
 * ★ 批次 202（Randy）："速览这块排版优化一下，现在有些格子占空间太大、内容又少"
 * 三个改动：
 *   ① `align-items:start` —— 关键！原来格子是 stretch，**同一行里最高的那格（比如手机号两三个）会把整行撑高**，
 *      旁边的"意向城市 —"就变成一大块空白；改成 start 后，**每格只占自己内容的高度**；
 *   ② 内边距与字号收一档（padding 7→6、label 10→10 但下间距 5→3、value 行高 1.4→1.35），整块更紧凑；
 *   ③ 空值（—）不再撑高：`.glance-value.glance-empty` 行高压到 1.2。
 */
/**
 * ★ 批次 204（Randy："你刚说的 4 种我觉得都可以试试"）—— 一次性把 4 条都做了：
 *   ① 标签与值**同一行**（标签左、值右）→ 每格高度从"两行"变"一行"；
 *   ② 手机等长内容**横向排列不堆叠**（.glance-value 允许横向 wrap，见下）；
 *   ③ 空值格**不占位**：JS 里把 `—` 的项挑出来，不再渲染成一格（改为底部一行灰字"未填：…"，信息不丢）；
 *   ④ 列数**自适应**：宽屏自动 5~6 列（`auto-fit + minmax(168px,1fr)`），窄屏自动回落，不再死守 4 列。
 */
/**
 * ★ 批次 205（Randy 反馈"这也太乱了"）：**回退"标签与值同一行"这个改动**（短标签 + 长值会折成三四行，
 *   标签又被垂直居中 → 看起来参差不齐）。定稿方案 = 保留真正有用的三点：
 *   ① 标签在上、值在下（原来的整洁版式）；
 *   ② 格子按**自己内容**的高度（`align-items:start`，不再被同行最高格撑高）；
 *   ③ 值**最多两行**（超出省略号）→ 长公司名/城市列表不会把格子拉成四行；
 *   另：列宽加大到 200px（值少换行）、内边距与行高保持紧凑。
 */
/**
 * ★ 批次 206（Randy 口径）："短的字段放在一行、多几列；长的字段也放一行、少几列；整体要工整"。
 * 做法：
 *   ① **所有格子统一行高**（`grid-auto-rows:52px`）→ 不再有高矮不齐，整片对齐；
 *   ② **每格都是一行**：值单行显示，装不下就省略号（不再折成三四行，长公司名不会再撑高格子）；
 *   ③ **列宽变小 → 列数变多**：`minmax(126px,1fr)`，宽屏能排 8~9 列（短字段排得紧）；
 *   ④ **长字段跨两列**：`曾经所在城市 / 手机 / 邮箱 / 最近一家公司职位 / 毕业院校与专业 / 意向城市`
 *      这些给了"占两列"的类（见下面的 .glance-item-wide 口径），等于"少几列、能一行装下"。
 */
/**
 * ★ 批次 208（Randy 手动给的排布，**以他的话为准**）：
 *   第一行：姓名 · 出生年月 · 性别 · 所在城市 · 意向城市 · 家乡            → 6 格
 *   第二行：手机 · 微信 · 邮箱 · 曾经所在城市 · 毕业院校与专业              → 5 格
 *   第三行：行业标签 · 职能标签 · 最近一家公司职位 · 目前薪资 · 期望薪资      → 5 格
 * 实现（纯 CSS，不动 DOM 结构，避免改坏模板）：
 *   · 网格开 **30 列**（6 与 5 的最小公倍数）：第一行每格 `span 5`（6×5=30），后两行每格 `span 6`（5×6=30）→ 每行都刚好铺满、左右两端对齐；
 *   · 行内**换序**用 `order`（他要求第二行把"手机/微信/邮箱"提到前面、"曾经所在城市"放第四、"毕业院校与专业"放第五）；
 *   · 所有格子**统一行高 54px**、值一行 + 省略号 → 横竖都工整。
 */
.glance-grid { display: grid; grid-template-columns: repeat(30, minmax(0, 1fr)); grid-auto-rows: 54px; gap: 6px; margin-bottom: 8px; align-items: stretch; grid-auto-flow: row; }
/* 第一行 6 格：各占 5 列 */
.glance-grid > .glance-item:nth-child(-n+6) { grid-column: span 5; }
/* 第二、三行 5 格：各占 6 列 */
.glance-grid > .glance-item:nth-child(n+7) { grid-column: span 6; }
/* 行内按 Randy 的口述顺序摆位（DOM 不用动） */
.glance-grid > .glance-item:nth-child(8)  { order: 7 }   /* 手机 */
.glance-grid > .glance-item:nth-child(10) { order: 8 }   /* 微信 */
.glance-grid > .glance-item:nth-child(9)  { order: 9 }   /* 邮箱 */
.glance-grid > .glance-item:nth-child(7)  { order: 10 }  /* 曾经所在城市 */
.glance-grid > .glance-item:nth-child(14) { order: 11 }  /* 毕业院校与专业 */
.glance-grid > .glance-item:nth-child(11) { order: 12 }  /* 行业标签 */
.glance-grid > .glance-item:nth-child(12) { order: 13 }  /* 职能标签 */
.glance-grid > .glance-item:nth-child(13) { order: 14 }  /* 最近一家公司职位 */
.glance-grid > .glance-item:nth-child(15) { order: 15 }  /* 目前薪资 */
.glance-grid > .glance-item:nth-child(16) { order: 16 }  /* 期望薪资 */
/**
 * ★ 批次 486（Randy：「不要那么多框框」）：
 *   候选人速览原来是一格一个描边小方框（一屏十几个框），像电子表格。
 *   现在去掉描边、只留极浅的底色，悬停才浮起一点点 —— 信息层级靠留白和字重，不靠框。
 */
.glance-item { position: relative; background: #fafaf8; border: none; border-radius: 8px; padding: 6px 10px; min-height: 0; display: flex; flex-direction: column; align-items: stretch; justify-content: center; gap: 0; transition: background .15s, box-shadow .15s, transform .15s; overflow: hidden; }
.glance-item:hover { background: #f2f7f7; box-shadow: 0 2px 8px rgba(var(--accent-rgb),.07); }
/**
 * ⚠️ 批次 209（修 bug）：**删掉**批次 206 遗留的"按序号跨两列"规则（`.glance-name-item { span 2 }`
 *   与 `nth-child(7/8/9/13/14) { span 2 }`）。
 *   原因：批次 208 把网格改成 **30 列**（第一行每格 span 5、后两行 span 6），而 `span 2` 在 30 列里
 *   只有 1/15 宽 → 手机 / 邮箱 / 曾经所在城市 / 毕业院校与专业 / 最近一家公司职位 被挤成小竖条，
 *   页面变成"一塌糊涂"。列宽现在**只由批次 208 的 span 5 / span 6 决定**，不再有别的规则插手。
 */

/**
 * ★ 批次 207（Randy 给了参考图）：准备"两栏「标签 : 值」清单"的样式（参考图那种：无卡片边框、
 *   标签固定 92px 灰字、值紧跟其后、行高 40px）。模板重排成 .kv-sheet/.kv-row 后即可直接生效。
 */
.kv-sheet { display: grid; grid-template-columns: 1fr 1fr; gap: 2px 28px; }
.kv-col { display: flex; flex-direction: column; }
.kv-row { display: flex; align-items: center; gap: 10px; min-height: 40px; border-bottom: 1px dashed #f2f1ea; }
.kv-row:last-child { border-bottom: none }
.kv-k { flex: 0 0 92px; font-size: 12.5px; color: #9a9890 }
.kv-v { flex: 1 1 auto; min-width: 0; font-size: 13.5px; color: #2b2a27; font-weight: 600;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
.kv-v.kv-empty { color: #C9C7BE; font-weight: 400 }
.kv-row .glance-edit-btn { opacity: 0 }
.kv-row:hover .glance-edit-btn { opacity: 1 }
@media (max-width: 980px) { .kv-sheet { grid-template-columns: 1fr } }

/* ============================================================================
 * ★ 批次 211（Randy 手动给定的最终排布，**以此为准**）：
 *   左栏：姓名 · 出生年月 · 意向城市 · 手机 · 邮箱 · 行业标签 · 毕业院校与专业 · 目前薪资
 *   右栏：所在城市 · 性别 · 家乡 · 微信 · 曾经所在城市 · 职能标签 · 最近一家公司职位 · 期望薪资
 * 做法：网格改**两栏 + 纵向流**（`grid-auto-flow:column` + 8 行），每格变成"标签左 + 值右"的一行清单；
 *   行内顺序用 `order` 精确指定（不动模板、不动 DOM）：
 *     1 姓名, 2 出生年月, 5 意向城市, 8 手机, 9 邮箱, 11 行业标签, 14 毕业院校与专业, 15 目前薪资,
 *     4 所在城市, 3 性别, 6 家乡, 10 微信, 7 曾经所在城市, 12 职能标签, 13 最近一家公司职位, 16 期望薪资
 * `grid-column:auto !important` 用来**压掉**之前几版遗留的跨列规则，避免再出现"被挤成小竖条"。
 * ========================================================================== */
/* ★ 批次 213/214（Randy）："行高还可以略矮一些" → 36 → 32 → **30px**；
   "虚线可以不用，完全不用线" → 行间**不再画任何线**（原来的 dashed 底边去掉）。 */
.glance-grid { display: grid !important; grid-template-columns: 1fr 1fr !important; grid-template-rows: repeat(8, minmax(30px, auto)) !important;
  grid-auto-flow: column !important; gap: 0 30px !important; align-items: stretch !important; margin-bottom: 8px !important; }
.glance-grid > .glance-item { grid-column: auto !important; grid-row: auto !important; background: transparent !important; border: none !important;
  border-bottom: none !important; border-radius: 0 !important; box-shadow: none !important; padding: 1px 0 !important;
  display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: flex-start !important; gap: 10px !important; overflow: visible !important; }
.glance-grid > .glance-item:hover { border-color: #e3e1d6 !important; box-shadow: none !important }
/* ★ 批次 212（Randy）："字体太大了，和底下核心优势的字体大小拉齐" →
   清单字号与候选人详情正文（核心优势那一段）统一到 12 / 12.5px，行高也收一档。 */
/* 与"速览下面那段（核心优势 / 概览正文，`.quick-summary-text` = 12px）"同字号 */
.glance-grid > .glance-item .glance-label { flex: 0 0 76px !important; min-width: 76px !important; max-width: 76px !important; margin: 0 !important;
  font-size: 11.5px !important; color: #9a9890 !important; text-transform: none !important; letter-spacing: 0 !important; }
.glance-grid > .glance-item .glance-value { flex: 1 1 auto !important; min-width: 0 !important; font-size: 12px !important; font-weight: 600 !important;
  white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; }
.glance-grid > .glance-item .glance-edit-btn { opacity: 0 }
.glance-grid > .glance-item:hover .glance-edit-btn { opacity: 1 }
/* 左栏 8 行 */
.glance-grid > .glance-item:nth-child(1)  { order: 1 }   /* 姓名 */
.glance-grid > .glance-item:nth-child(2)  { order: 2 }   /* 出生年月 */
.glance-grid > .glance-item:nth-child(5)  { order: 3 }   /* 意向城市 */
.glance-grid > .glance-item:nth-child(8)  { order: 4 }   /* 手机 */
.glance-grid > .glance-item:nth-child(9)  { order: 5 }   /* 邮箱 */
.glance-grid > .glance-item:nth-child(11) { order: 6 }   /* 行业标签 */
.glance-grid > .glance-item:nth-child(14) { order: 7 }   /* 毕业院校与专业 */
.glance-grid > .glance-item:nth-child(15) { order: 8 }   /* 目前薪资 */
/* 右栏 8 行 */
.glance-grid > .glance-item:nth-child(4)  { order: 9 }   /* 所在城市 */
.glance-grid > .glance-item:nth-child(3)  { order: 10 }  /* 性别 */
.glance-grid > .glance-item:nth-child(6)  { order: 11 }  /* 家乡 */
.glance-grid > .glance-item:nth-child(10) { order: 12 }  /* 微信 */
.glance-grid > .glance-item:nth-child(7)  { order: 13 }  /* 曾经所在城市 */
.glance-grid > .glance-item:nth-child(12) { order: 14 }  /* 职能标签 */
.glance-grid > .glance-item:nth-child(13) { order: 15 }  /* 最近一家公司职位 */
.glance-grid > .glance-item:nth-child(16) { order: 16 }  /* 期望薪资 */
@media (max-width: 900px) {
  .glance-grid { grid-template-columns: 1fr !important; grid-template-rows: none !important; grid-auto-flow: row !important }
}
.glance-grid > .glance-item:nth-child(7),
.glance-grid > .glance-item:nth-child(8),
.glance-grid > .glance-item:nth-child(9),
.glance-grid > .glance-item:nth-child(13),
.glance-grid > .glance-item:nth-child(14) { grid-column: span 2 }
.glance-item-full { grid-column: 1 / -1; }
.glance-label { display: flex; align-items: center; justify-content: space-between; gap: 6px; font-size: 10px; color: #B4B2A9; margin-bottom: 2px; letter-spacing: .5px; text-transform: uppercase; }
.glance-item .glance-edit-btn { opacity: 0 }
.glance-item:hover .glance-edit-btn { opacity: 1 }
/* 值统一"一行 + 省略号"：装不下的长内容不再折行、不撑高格子（鼠标悬停可看全文见 title） */
.glance-value { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.glance-grid + .glance-missing { margin-top: -2px }
.glance-edit-btn { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; font-size: 11px; line-height: 1; color: #B4B2A9; cursor: pointer; border-radius: 4px; opacity: .5; transition: all .15s; flex-shrink: 0; }
.glance-item:hover .glance-edit-btn, .glance-edit-btn:hover { opacity: 1; color: var(--accent); background: var(--accent-t15); }
.glance-value { font-size: 13px; color: #2b2a27; font-weight: 600; line-height: 1.35; word-break: break-word; }
.glance-value.glance-accent { color: var(--accent); }
.glance-value.glance-empty { color: #B4B2A9; font-weight: 500; line-height: 1.2; }
/* ★ 批次 634（Randy 2026-10-11）：「填入的二级标签在页面只显示了一级标签，调整为需要完整显示」。
   行业/职能标签这两行**允许换行**（其余 glance 值仍保持"一行 + 省略号"，不撑高格子）——
   一级 + 二级一起显示时一行多半装不下，压成省略号等于又看不全了。 */
.glance-value.glance-tags { white-space: normal; overflow: visible; text-overflow: clip; }
/**
 * ★★ 批次 772（Randy 2026-10-16 截图：「这里多个文件夹放不下溢出了，可以把字号别加粗同时做自动换行显示」）：
 *   与批次 634 的"二级标签"同一个病：`.glance-value` 是全站默认的"一行 + 省略号"，
 *   而「文件夹」这一格天生可能有好几个夹子（生产上真有人同时在 6 个里）→ 直接被右边切掉。
 *   这里：① 允许换行（不再 nowrap/ellipsis）；② 夹子名不加粗（原来继承 `.glance-value` 的 600）；
 *   ③ 用 flex + 行间距排，去掉"、"分隔符（分隔符会跑到换行后的行首，很难看）。
 */
.glance-value.glance-folders { white-space: normal; overflow: visible; text-overflow: clip; font-weight: 400; }
.cand-folder-list { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 12px; min-width: 0; }
.cand-folder-list .cand-link { font-weight: 400; word-break: break-word; overflow-wrap: anywhere; }
.cand-folder-more { color: #8a8a82; font-weight: 400; white-space: nowrap; }
/* 二级标签的层级标记「└」：与编辑面板里的缩进同一套视觉，一眼能分出哪是一级哪是二级 */
.glance-tag-sub .glance-sub-mark { color: #B4B2A9; font-weight: 400; margin-right: 1px; }
.glance-overview { background: #fff; border: 1px solid #ecebe4; border-radius: 10px; padding: 10px 12px; }
/* v3.1.24：加 white-space:pre-wrap —— 猎聘「自我评价」是多段文本，缺这条会被 HTML 压成一行（与 .career-desc 同一类缺陷） */
.glance-overview-text { font-weight: 400; color: #33322e; font-size: 12px; line-height: 1.6; white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; }
@media (max-width: 720px) {
  .glance-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .glance-item-wide, .glance-item-full { grid-column: 1 / -1; }
}
.detail-info-row { display: flex; gap: 8px; margin-bottom: 6px; font-size: 13px; }
.detail-info-key { color: #888780; width: 80px; flex-shrink: 0; }

/* ========== 候选人职业经历（新布局：左 logo / 中 公司·项目·时间 / 右 标签） ========== */
.career-timeline { display: flex; flex-direction: column; }
/* 2026-09-15（Randy：工作经历排版优化）：职责区改为"自绘列表"——
   不再依赖简历原文里的项目符号（那些字符常无字形，显示成 □），改用 CSS 画圆点；
   段落间距收紧、行高统一，长职责读起来更紧凑。 */
.career-desc { margin-top: 10px; font-size: 12.5px; color: #33322e; line-height: 1.7; }
.career-desc-intro { white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; margin-bottom: 6px; }
.career-desc-intro:last-child { margin-bottom: 0; }
.career-desc-list { margin: 0; padding-left: 18px; list-style: disc outside; }
.career-desc-list > li { margin: 3px 0; line-height: 1.7; word-break: break-word; overflow-wrap: anywhere; }
.career-desc-list > li::marker { color: #B4B2A9; }
.career-item { padding: 14px 2px; border-bottom: 1px solid #ecebe4; }
.career-item:last-child { border-bottom: none; }
.career-item-current { background: linear-gradient(90deg, #1D9E750a, transparent 55%); border-radius: 8px; }
.career-row { display: flex; gap: 12px; align-items: flex-start; }
.career-logo-wrap {
  width: 42px; height: 42px; flex-shrink: 0; border-radius: 10px; overflow: hidden;
  position: relative; background: #f1efe8; border: 1px solid #e6e4db;
  display: flex; align-items: center; justify-content: center;
}
.career-logo-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; background: #fff; }
.career-logo-initials { font-weight: 700; font-size: 16px; color: var(--accent); line-height: 1; }
.career-main { flex: 1; min-width: 0; }
.career-company { font-weight: 600; font-size: 14px; color: #2b2a27; line-height: 1.4; }
.career-title { font-size: 12.5px; color: #33322e; margin-top: 2px; }
.career-period { font-size: 11px; color: #888780; margin-top: 3px; }
.career-tags { display: flex; flex-direction: column; gap: 6px; flex-shrink: 0; max-width: 44%; align-items: flex-end; }
.career-tag-block { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; }
.career-tag-label { font-size: 10px; color: #B4B2A9; letter-spacing: .5px; }
.career-tag-row { display: flex; flex-wrap: wrap; gap: 4px; justify-content: flex-end; max-width: 240px; }
.career-tag-empty { font-size: 11px; color: #C9C7BE; }
/* v20260914b：职责业绩导入时保留了原文换行/空行分段，这里必须 pre-wrap 才能显示出来
   （默认 white-space:normal 会把 \n 当普通空格 → 整段挤成一行，无法阅读） */
.career-desc { font-size: 12px; color: #33322e; margin-top: 8px; line-height: 1.6; padding-left: 54px; white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere; }
@media (max-width: 720px) {
  .career-row { flex-wrap: wrap; }
  .career-tags { max-width: 100%; align-items: flex-start; flex-direction: row; flex-wrap: wrap; }
  .career-tag-block { align-items: flex-start; }
  .career-tag-row { justify-content: flex-start; }
  .career-desc { padding-left: 0; }
}
.ke-input { font-size: 12px !important; padding: 4px 8px; border: 1px solid #d3d1c7; border-radius: 6px; background: white; color: #2C2A26; }
.ke-input:focus { border-color: var(--accent); outline: none; box-shadow: 0 0 0 2px var(--accent-t15); }

/* ========== 客户详情：全屏 + 横向标签页 ========== */
.client-detail-full {
  display: flex;
  flex-direction: column;
  height: 100vh;
  background: #fff;
}
.client-detail-header {
  flex-shrink: 0;
  border-bottom: 1px solid #ECEAE2;
  background: #FAF9F5;
  padding: 0 28px;
  /* v20260829m：关闭按钮固定在客户详情弹窗右上角（原先写在标题左侧） */
  position: relative;
}
.client-detail-title {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 0 10px;
}
.modal-close.client-detail-close {
  position: absolute;
  top: 12px;
  right: 24px;
  float: none;
  margin-left: 0;
  z-index: 20;
}
.client-detail-name {
  font-size: 18px;
  /* 批次 365（Randy）：「红框内字体均不需要加粗，调成和系统设定的字体拉齐就好」
     —— 系统里的姓名/标题统一用 500（人才库姓名就是 500），这里不再单独加粗。 */
  font-weight: 500;
  color: #2b2a27;
}
.client-tab-nav {
  display: flex;
  gap: 4px;
  overflow-x: auto;
  padding-bottom: 0;
}
.client-tab-item {
  flex-shrink: 0;
  padding: 9px 16px;
  font-size: 13px;
  color: #33322e;
  cursor: pointer;
  border-bottom: 2px solid transparent;
  white-space: nowrap;
  transition: color .12s, border-color .12s;
}
.client-tab-item:hover { color: #35342F; }
.client-tab-item.active {
  color: var(--accent);
  font-weight: 600;
  border-bottom-color: var(--accent);
}
.client-detail-body {
  flex: 1;
  overflow-y: auto;
  padding: 22px 28px 40px;
  max-width: 1100px;
  width: 100%;
  margin: 0 auto;
}
/* 客户简介：信息卡内边距，避免内容贴住卡片左右边缘 */
.client-brief .detail-section { padding: 14px 16px; }
.cf-val { cursor: pointer; border-radius: 5px; padding: 2px 5px; transition: background .12s; min-height: 20px; }
.cf-val:hover { background: #F0EEE6; }
.cf-val:hover::after { content: '✎'; margin-left: 5px; font-size: 11px; color: #B4B2A9; vertical-align: middle; }
.cf-input, .cf-textarea { width: 100%; box-sizing: border-box; border: 1px solid #C9C5B8; border-radius: 6px; padding: 6px 8px; font-size: 13px; font-family: inherit; color: #2b2a27; background: #fff; outline: none; }
.cf-input:focus, .cf-textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),0.12); }
.cf-textarea { min-height: 96px; resize: vertical; line-height: 1.6; }
.cf-actions { margin-top: 8px; display: flex; gap: 6px; }
.muted { color: #B4B2A9; }
.client-brief-cards {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-bottom: 16px;
}
@media (max-width: 760px) { .client-brief-cards { grid-template-columns: 1fr; } }

/* 客户子页：人才库风格通用表格（员工 / 联系人 / 项目），与候选人库列表视觉一致 */
.lib-table { table-layout: fixed; width: 100%; border-collapse: collapse; font-size: 12px; }
.lib-table th { position: relative; user-select: none; white-space: nowrap; text-align: left; padding: 7px 10px; border-bottom: 1px solid #e5e5e4; color: #888780; font-weight: 500; background: #fafaf8; }
.lib-table td { padding: 8px 10px; border-bottom: 1px solid #f1efe8; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; font-size: 12px; color: #2b2a27; }
.lib-table tbody tr { cursor: pointer; transition: background .12s; }
.lib-table tbody tr:hover { background: #faf9fd; }
.lib-table .col-avatar { width: 42px; }
.lib-table .col-narrow { width: 84px; }
.lib-table .col-mid { width: 120px; }
.lib-table .col-actions { width: 130px; text-align: right; }
.lib-table .lib-name { display: flex; align-items: center; gap: 8px; min-width: 0; }
.lib-table .lib-avatar { width: 26px; height: 26px; border-radius: 50%; background: var(--accent); color: #fff; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; flex-shrink: 0; }
.lib-table .lib-name-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; align-items: center; gap: 6px; }
.lib-table .lib-sub { color: #888780; font-size: 11px; margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lib-table .lib-actions { display: flex; gap: 4px; justify-content: flex-end; flex-wrap: wrap; }
.lib-table .lib-tag { display: inline-block; font-size: 10px; padding: 1px 6px; border-radius: 8px; background: var(--accent-t0d); color: var(--accent); white-space: nowrap; }
.lib-table .lib-tag-gray { background: #f1efe8; color: #888780; }
.lib-table .lib-tag-green { background: #E6F5EE; color: #1D9E75; }
.lib-table .lib-tag-amber { background: #FAEEDA; color: #854F0B; }

/* 合同表单：分段与人才库风格一致 */
.contract-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px; }
@media (max-width: 760px) { .contract-form-grid { grid-template-columns: 1fr; } }
.contract-section { border: 1px solid #e5e5e4; border-radius: 10px; padding: 12px 14px; margin-bottom: 12px; background: #fff; }
.contract-section-title { font-size: 13px; font-weight: 600; color: var(--accent); margin-bottom: 10px; display: flex; align-items: center; gap: 6px; }
.contract-form-label { font-size: 12px; color: #33322e; display: block; margin-bottom: 4px; }
.contract-switch { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #33322e; cursor: pointer; }
.contract-att-row { display: flex; gap: 6px; align-items: center; margin-bottom: 6px; }
.contract-radio input[type="radio"] { cursor: pointer; }
.contract-switch input[type="checkbox"] { display: none; }
.contract-switch .toggle-switch {
  width: 36px; height: 20px; background: #D9D8D3; border-radius: 999px; position: relative;
  transition: background 0.2s; flex-shrink: 0;
}
.contract-switch .toggle-switch::after {
  content: ''; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px;
  background: #fff; border-radius: 50%; box-shadow: 0 1px 2px rgba(0,0,0,0.15);
  transition: transform 0.2s;
}
.contract-switch input[type="checkbox"]:checked + .toggle-switch { background: var(--accent); }
.contract-switch input[type="checkbox"]:checked + .toggle-switch::after { transform: translateX(16px); }
/* 简介 tab 铺满全宽（去除 1100px 居中限制） */
.client-detail-body.full-width { max-width: none; margin: 0; }
.client-req-banner {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
  background: #E7857D0d; border: 1px solid #E7857D33; border-radius: 8px;
  padding: 10px 14px; margin-bottom: 16px; font-size: 13px; color: #33322e;
}
.client-req-tag {
  background: #E7857D; color: #fff; font-size: 11px; padding: 2px 8px; border-radius: 10px;
}
.cf-req-miss {
  color: #A32D2D; font-size: 11px; font-weight: 600; margin-left: 2px;
  background: #E7857D14; border: 1px solid #E7857D33; border-radius: 8px; padding: 0 5px;
}
.client-stat-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}
.client-stat {
  background: #fff;
  border: 1px solid #ECEAE2;
  border-radius: 10px;
  padding: 12px 10px;
  text-align: center;
}
.client-stat-val { font-size: 22px; font-weight: 700; color: var(--accent); }
.client-stat-label { font-size: 11px; color: #888780; margin-top: 2px; }
.client-stat.clickable { cursor: pointer; transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease; }
.client-stat.clickable:hover { border-color: var(--accent); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(var(--accent-rgb),.14); }
.client-stat.clickable:active { transform: translateY(0); }
.contact-card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
}
.contact-card {
  background: #fff;
  border: 1px solid #ECEAE2;
  border-radius: 10px;
  padding: 14px;
}
.contact-card-name { font-size: 14px; font-weight: 600; color: #2b2a27; }

/* 用户自动联想下拉（BD / KAM / 内联编辑共用） */
.ac-menu {
  position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 60;
  background: #fff; border: 1px solid #C0DDDF; border-radius: 8px;
  box-shadow: 0 8px 24px rgba(14,37,39,0.12); max-height: 240px; overflow-y: auto; padding: 4px;
}
.ac-item { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-radius: 6px; cursor: pointer; }
.ac-item:hover { background: #F1EFFB; }
.ac-name { font-size: 13px; font-weight: 500; color: #2b2a27; }
.ac-sub { font-size: 11px; color: #888780; margin-left: auto; }
.ac-hint { padding: 8px 10px; font-size: 12px; color: #B4B2A9; }

/* 客户子页：人才库列表风格（左右对齐、铺满全宽） */
.client-list { display: flex; flex-direction: column; gap: 8px; width: 100%; }
.client-list-item {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; background: #fff; border: 1px solid #ECEAE2; border-radius: 10px;
  width: 100%; box-sizing: border-box;
}
.client-list-item:hover { border-color: #C0DDDF; background: #faf9fd; }
.cli-avatar {
  width: 36px; height: 36px; border-radius: 50%; background: var(--accent); color: #fff;
  display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; flex-shrink: 0;
}
.cli-main { flex: 1; min-width: 0; }
.cli-name { font-size: 14px; font-weight: 500; color: #2b2a27; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.cli-sub { font-size: 12px; color: #888780; margin-top: 2px; line-height: 1.4; }
.cli-side { flex-shrink: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
/* 人员编号徽标：纯数字（候选人/联系人/员工共用一套连续编号），统一在姓名前显示 */
.person-code {
  display: inline-block;
  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
  font-size: 11px;
  line-height: 1;
  font-weight: 600;
  color: var(--accent);
  background: #F1EFFB;
  border: 1px solid #B1E9ED;
  border-radius: 5px;
  padding: 2px 5px;
  margin-right: 6px;
  vertical-align: middle;
  letter-spacing: .3px;
}
.contact-card-role { font-size: 12px; color: #888780; margin: 2px 0 6px; }
.contact-card-line { font-size: 12px; color: #33322e; margin-top: 2px; }
.attach-list { display: flex; flex-direction: column; gap: 10px; }
.attach-item {
  display: flex;
  align-items: center;
  gap: 12px;
  background: #fff;
  border: 1px solid #ECEAE2;
  border-radius: 10px;
  padding: 12px 14px;
}
.attach-icon {
  width: 42px; height: 42px;
  border-radius: 8px;
  background: #EAF8F9;
  color: var(--accent);
  font-size: 11px;
  font-weight: 700;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
.attach-info { flex: 1; min-width: 0; }
.attach-name { font-size: 13px; font-weight: 500; color: #2b2a27; }
.attach-meta { font-size: 11px; color: #888780; margin-top: 2px; }

/* ========== 网络渠道选择区 ========== */
.channel-select-region {
  background: #f7f6f3;
  border: 1px solid #ecebe4;
  border-radius: 10px;
  padding: 10px 12px;
  margin-bottom: 10px;
}
.channel-select-label { font-size: 12px; color: #33322e; font-weight: 500; margin-bottom: 8px; }
.channel-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.channel-chip {
  font-size: 12px;
  padding: 5px 12px;
  border-radius: 16px;
  border: 1px solid #d8d6cc;
  background: #fff;
  color: #6a6960;
  cursor: pointer;
  user-select: none;
  transition: all 0.15s;
  white-space: nowrap;
}
.channel-chip:hover { border-color: var(--accent); color: var(--accent); }
.channel-chip.active {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
  box-shadow: 0 1px 4px var(--accent-t40);
}
.channel-hint { font-size: 11px; color: #B4B2A9; margin-top: 8px; line-height: 1.5; }
.external-leads-wrap { font-size: 12px; }

/* ========== 匹配维度条 ========== */
.match-dim { margin-bottom: 8px; }
.match-dim-header { display: flex; justify-content: space-between; font-size: 12px; margin-bottom: 3px; }
.match-dim-bar { height: 6px; border-radius: 3px; background: #f1efe8; overflow: hidden; }
.match-dim-fill { height: 100%; border-radius: 3px; }

/* ========== 报告预览 ========== */
.report-preview {
  background: #f5f5f4;
  border-radius: 10px;
  padding: 16px;
  font-size: 13px;
  line-height: 1.7;
  white-space: pre-wrap;
  max-height: 400px;
  overflow-y: auto;
}
.report-preview h1 { font-size: 16px; font-weight: 600; margin-bottom: 8px; }
.report-preview h2 { font-size: 14px; font-weight: 500; margin: 12px 0 6px; }
.report-preview ul, .report-preview ol { padding-left: 20px; margin: 4px 0; }
.report-preview strong { font-weight: 600; }

/* ========== 空状态 ========== */
.empty-state {
  text-align: center;
  padding: 40px 20px;
  color: #B4B2A9;
  font-size: 13px;
}

/* ========== 候选人快速判断概览 ========== */
.quick-summary-box {
  background: linear-gradient(135deg, #EDFDFE 0%, #F5F4FE 100%);
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 12px;
  border-left: 3px solid var(--accent);
}
.quick-summary-text {
  font-size: 12px;
  color: var(--accent-hover);
  line-height: 1.6;
}
.quick-stats-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 8px;
  margin-bottom: 14px;
}
.quick-stat-card {
  background: #f5f5f4;
  border-radius: 8px;
  padding: 10px;
  text-align: center;
}
.quick-stat-label {
  font-size: 10px;
  color: #888780;
  margin-bottom: 4px;
  text-transform: uppercase;
  letter-spacing: 0.03em;
}
.quick-stat-value {
  font-size: 13px;
  font-weight: 600;
  color: #1a1a1a;
}
.quick-work-section {
  margin-top: 4px;
}
.quick-work-title {
  font-size: 11px;
  color: #888780;
  margin-bottom: 8px;
}
.quick-work-card {
  background: #f5f5f4;
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 8px;
  position: relative;
}
.quick-work-current {
  background: #EDFDFE;
  border: 1px solid var(--accent-bright);
}
.quick-work-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 4px;
}
.quick-work-company {
  font-size: 13px;
  font-weight: 600;
  color: #1a1a1a;
}
.quick-work-period {
  font-size: 11px;
  color: #888780;
  white-space: nowrap;
}
.quick-work-role {
  font-size: 12px;
  color: var(--accent);
  font-weight: 500;
  margin-bottom: 4px;
}
.quick-work-desc {
  font-size: 11px;
  color: #888780;
  line-height: 1.5;
}

/* ========== 沟通时间线（卡片式） ========== */
.timeline {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.timeline::before { display: none; }
.timeline-item {
  position: static;
  padding-bottom: 0;
}
.timeline-dot { display: none; }
.timeline-content {
  background: #fff;
  border: 1px solid #ECEAE2;
  border-radius: 10px;
  padding: 12px 14px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.03);
}
.comm-section-header {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  margin-bottom: 10px;
}
.timeline-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 10px;
  margin-bottom: 10px;
}
.comm-card-tags {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.comm-card-type {
  display: inline-flex;
  align-items: center;
  /**
   * ⚠️ 口径几经变化，按**最后一次**为准：
   *   · 批次 420（Randy）：「CC/MC 之类的标识整体缩小 20%」→ 9.6px（当时是他要的）；
   *   ★★ 批次 779（Randy 2026-10-16 截图）：「红框内动作说明的字体**还是改回和备注字体一样大**
   *      （之前特意改小的）」→ 这就是把 420 那次的缩小**改回来**。
   *   现在与备注正文（`.comm-card-text` 的 13px）**同字号**，图标随之回到 14×14。
   */
  gap: 4px;
  font-size: 13px;
  font-weight: 500;
  color: #fff;
  background: var(--accent);
  padding: 3px 9px;
  border-radius: 6px;
  white-space: nowrap;
}
.comm-card-type svg { width: 14px; height: 14px; }
.comm-card-result {
  font-size: 11px;
  font-weight: 500;
  padding: 2px 8px;
  border-radius: 12px;
  white-space: nowrap;
}
.comm-card-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
  font-size: 11px;
  color: #888780;
  white-space: nowrap;
}
.comm-card-author {
  color: #33322e;
  font-weight: 500;
}
/* ★ 批次 779：`.comm-card-edit`（"编辑"文字链）已被 `···` 菜单取代 —— 样式一并删掉，不留死代码。 */
/**
 * ★ 批次 779（Randy）：「所有的备注的这个『编辑』都改为 `...`，点击出现编辑入口，
 *   管理员会出现编辑和删除入口」——卡片右上角那个"编辑"文字链换成这个 `···` 按钮，
 * 点它弹菜单（编辑 / 管理员额外有删除）。样式与侧栏文件夹那颗 `...` 同一套观感。
 */
.comm-card-more {
  font-size: 13px; line-height: 18px; letter-spacing: 1px; font-weight: 600;
  color: #5b5a55; background: transparent; border: none;
  padding: 0 6px; margin-left: 2px; border-radius: 6px; cursor: pointer;
}
.comm-card-more:hover { background: #efede6; color: #1f1e1c; }
.comm-card-section {
  margin-top: 10px;
}
.comm-card-section-title {
  font-size: 11px;
  font-weight: 500;
  color: #888780;
  margin-bottom: 4px;
}
.comm-card-text {
  font-size: 13px;
  color: #312E2A;
  line-height: 1.6;
  white-space: pre-wrap;
}
.comm-card-tags-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid #f1efe8;
}


/* ========== 通知 ========== */
.toast {
  position: fixed;
  bottom: 24px;
  right: 24px;
  background: #2c2c2a;
  color: #fff;
  padding: 10px 16px;
  border-radius: 10px;
  font-size: 13px;
  z-index: 2000;
  opacity: 0;
  transform: translateY(10px);
  transition: all 0.25s;
}
.toast.show { opacity: 1; transform: translateY(0); }

/* ========== 手机号查看 ========== */
.phone-display {
  font-weight: 500;
  letter-spacing: 0.02em;
}
.phone-display.phone-revealed {
  color: var(--accent);
  font-weight: 600;
}
.phone-view-btn {
  font-size: 11px;
  padding: 2px 10px;
  border-radius: 6px;
  border: 1px solid var(--accent-bright);
  background: #EDFDFE;
  color: var(--accent);
  margin-left: 6px;
  transition: all 0.15s;
  font-weight: 500;
}
.phone-view-btn:hover {
  background: var(--accent-light);
  border-color: var(--accent-focus);
}
.phone-hide-btn {
  font-size: 11px;
  padding: 2px 10px;
  border-radius: 6px;
  border: 1px solid #e5e5e4;
  background: #f5f5f4;
  color: #888780;
  margin-left: 6px;
  transition: all 0.15s;
}
.phone-hide-btn:hover {
  background: #e5e5e4;
  color: #33322e;
}
.phone-view-count {
  font-size: 11px;
  color: #B4B2A9;
  margin-left: 8px;
}

/* ========== 客户管理 ========== */
.client-link {
  cursor: pointer;
  text-decoration: none;
  font-weight: 500;
  transition: opacity 0.15s;
}
.client-link:hover {
  opacity: 0.7;
  text-decoration: underline;
}

/* v20260829n：可点击的统计卡片（与纯展示卡片区分开，明确给出指针反馈） */
.stat-card-clickable {
  cursor: pointer;
}
.stat-card-clickable:hover .stat-label {
  color: var(--accent);
  text-decoration: underline;
}

/* v20260829n：人才地图节点可点击 */
.mp-node-link {
  cursor: pointer;
  border-bottom: 1px dashed currentColor;
  opacity: 0.95;
}
.mp-node-link:hover {
  opacity: 0.7;
  text-decoration: underline;
}

/* v20260908y：人才地图在线可编辑表格 */
/* v20260908z：人才地图新增「新增表格」入口（showCreateTableModal / createMappingTable） */
.mp-sheet-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
  flex-wrap: wrap;
}
.mp-saved-flag {
  font-size: 11px;
  color: #1D9E75;
  font-weight: 500;
}
.mp-sheet-hint {
  font-size: 10px;
  color: #B4B2A9;
  margin-left: auto;
}
.mp-sheet {
  border-collapse: collapse;
  width: 100%;
  table-layout: fixed;
}
.mp-sheet th {
  position: relative;
  background: #f6f5f1;
  border: 1px solid #e6e4dd;
  padding: 0;
  vertical-align: top;
}
.mp-sheet td {
  border: 1px solid #e6e4dd;
  padding: 0;
  vertical-align: middle;
}
.mp-hcell, .mp-cell {
  width: 100%;
  box-sizing: border-box;
  border: none;
  outline: none;
  background: transparent;
  font-size: 12px;
  color: #3a3a37;
  padding: 6px 8px;
  font-family: inherit;
}
.mp-hcell {
  font-weight: 600;
  color: var(--accent);
  background: transparent;
}
.mp-cell:focus, .mp-hcell:focus {
  background: var(--accent-t10);
  box-shadow: inset 0 0 0 2px var(--accent-t55);
}
.mp-cell-first {
  position: relative;
}
.mp-drill {
  position: absolute;
  left: 2px;
  top: 50%;
  transform: translateY(-50%);
  cursor: pointer;
  font-size: 11px;
  opacity: 0.5;
  z-index: 1;
}
.mp-drill:hover {
  opacity: 1;
}
.mp-cell-first .mp-cell {
  padding-left: 22px;
}
.mp-col-del {
  position: absolute;
  right: 2px;
  top: 2px;
  cursor: pointer;
  font-size: 10px;
  color: #c0564f;
  background: #fff;
  border-radius: 50%;
  width: 14px;
  height: 14px;
  line-height: 14px;
  text-align: center;
  opacity: 0;
  transition: opacity 0.12s;
}
.mp-sheet th:hover .mp-col-del {
  opacity: 0.85;
}
.mp-col-del:hover {
  opacity: 1;
  background: #E7857D;
  color: #fff;
}
.mp-row-del-cell {
  width: 24px;
  text-align: center;
}
.mp-row-del {
  cursor: pointer;
  font-size: 11px;
  color: #c0564f;
  opacity: 0.45;
}
.mp-row-del:hover {
  opacity: 1;
}

/* v20260829n：图表卡片右上角"口径说明"标签——明确不可点击（区别于 .dash-period-tab） */
.dash-period-label {
  padding: 3px 10px;
  border-radius: 6px;
  font-size: 11px;
  color: #888780;
  background: #f6f5f1;
  cursor: default;
  user-select: none;
}
.cand-link {
  cursor: pointer;
  text-decoration: none;
  color: #5E89EC;
  border-bottom: 1px dashed #5E89EC55;
  transition: opacity 0.15s, background 0.15s;
}
.cand-link:hover {
  opacity: 0.75;
  background: #5E89EC10;
}
/**
 * 批次 586（Randy 2026-10-09）：
 *   「在系统的任何页面显示用户名字的时候，都用默认的蓝色来显示」
 *   口径：**系统用户（顾问账号）的名字统一用"默认蓝" `#5E89EC`** —— 就是全站可点文字 `.cand-link` 的那个蓝。
 *   · 可点的名字继续用 `.cand-link`（同色 + 虚线，语义上加下划线）；
 *   · 只是展示、点不了的名字（如谷露那边离职顾问的拥有者）用 `.user-name`（同色、无虚线下划线）。
 *   ⚠️ 只管**系统用户**的名字：候选人姓名、客户联系人姓名、客户/项目名不套这个类。
 */
.user-name { color: #5E89EC; }
.comm-card-author { color: #5E89EC; }
/* 活跃度标签：点击按该活跃度筛选人才库 */
.cand-activity-tag {
  cursor: pointer;
  user-select: none;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 8px;
  border-radius: 10px;
  font-size: 11px;
  white-space: nowrap;
  transition: box-shadow 0.15s, transform 0.1s;
}
.cand-activity-tag:hover {
  box-shadow: 0 0 0 2px currentColor inset;
}
.cand-activity-tag.on {
  font-weight: 700;
  box-shadow: 0 0 0 2px currentColor inset;
}
/* 可复制字段（邮箱 / 微信 / 电话…）：点击一键复制 */
.copyable {
  cursor: pointer;
  border-bottom: 1px dashed #d3d1c7;
}
/**
 * ★ 批次 215（Randy）："红框处还有线" —— 那是**姓名值自带的"可复制"虚线下划线**（.copyable）。
 *   它原来是块级元素 → 虚线**拉满整格宽度**，看起来像一条分隔线（就是红框里那根）。
 *   修法：让可复制元素按内容宽度收缩（inline-block），**虚线只跟文字一样长**；
 *   同时把这些行的 hover 虚线色统一，别再像"表格线"。
 */
.glance-item .copyable { display: inline-block; max-width: 100%; }
.copyable:hover {
  border-bottom-color: var(--accent);
  color: var(--accent);
}

.notes-timeline {
  display: flex;
  flex-direction: column;
  gap: 0;
  padding-left: 4px;
}
.note-item {
  display: flex;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px solid #f1efe8;
}
.note-item:last-child {
  border-bottom: none;
}
.note-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--accent);
  margin-top: 5px;
  flex-shrink: 0;
}
.note-content {
  flex: 1;
  min-width: 0;
}
.note-header {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 3px;
}
.note-author {
  font-size: 12px;
  font-weight: 500;
  color: #33322e;
}
.note-time {
  font-size: 11px;
  color: #B4B2A9;
}
.note-delete {
  margin-left: auto;
  font-size: 12px;
  color: #B4B2A9;
  cursor: pointer;
  padding: 0 4px;
  border-radius: 3px;
  transition: all 0.15s;
}
.note-delete:hover {
  color: #A32D2D;
  background: #E7857D10;
}
.note-text {
  font-size: 13px;
  color: #3D3D3A;
  line-height: 1.5;
  word-break: break-word;
}

/* ========== 表单输入 ========== */
.form-input {
  padding: 8px 12px;
  border: 1px solid #E5E4DF;
  border-radius: 8px;
  font-size: 13px;
  font-family: inherit;
  color: #2D2C29;
  background: white;
  transition: border-color 0.15s, box-shadow 0.15s;
  outline: none;
}
.form-input:focus {
  border-color: var(--accent-bright);
  box-shadow: 0 0 0 3px #EDFDFE;
}
.form-input::placeholder {
  color: #B4B2A9;
}
select.form-input {
  cursor: pointer;
  appearance: auto;
}

/* ========== 紧凑型下拉多选组件（候选人编辑 · 行业标签）
   视觉与 select.form-input 完全一致：触发器即一个带 pill + ▾ 的输入框
   ========== */
.indcats-msd {
  position: relative;
  width: 100%;
}
.indcats-trigger {
  padding: 6px 12px;
  font-size: 13px;
  background: transparent;
  cursor: pointer;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px;
  min-height: 38px;
  user-select: none;
}
.indcats-trigger.is-open {
  background: #FAF9F5;
}
.indcats-pill {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: #EDFDFE;
  color: #2D2C29;
  border-radius: 6px;
  padding: 2px 4px 2px 8px;
  font-size: 12px;
  line-height: 1.4;
}
.indcats-pill-x {
  cursor: pointer;
  color: #888780;
  font-size: 14px;
  line-height: 1;
  padding: 0 4px;
  border-radius: 4px;
}
.indcats-pill-x:hover { color: #A32D2D; background: rgba(163,45,45,0.08); }
.indcats-placeholder { color: #B4B2A9; font-size: 13px; padding: 2px 0; }
.indcats-arrow {
  margin-left: auto;
  color: #888780;
  font-size: 11px;
  padding-left: 6px;
}
.indcats-panel {
  display: none;
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + 4px);
  background: white;
  border: 1px solid #E5E4DF;
  border-radius: 8px;
  box-shadow: 0 6px 20px rgba(0,0,0,0.08);
  max-height: 240px;
  overflow-y: auto;
  z-index: 50;
  padding: 4px 0;
}
.indcats-panel.is-open { display: block; }
.indcat-row {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 8px;
  cursor: pointer;
  font-size: 13px;
  color: #5a5a5a;
  user-select: none;
}
.indcat-row:hover { background: #FAF9F5; }
.indcat-row.is-parent {
  font-weight: 500;
  color: #2D2C29;
  background: #FAF9F5;
  border-top: 1px solid #ECEAE2;
  border-bottom: 1px solid #ECEAE2;
}
.indcat-row input[type="checkbox"] {
  margin: 0;
  cursor: pointer;
  flex-shrink: 0;
}
/* 触发器内打字筛选输入框（与 pill 同行，红框位置）
   v20260903k 修订说明：曾把这里改为白底+浅灰描边+6px圆角以试图修复"输入框看不见"。
   实测发现：全局 `input[type="text"]` 规则（特异性 0,1,1）压过 `.indcats-input`（0,1,0），
   所以原始的 background:transparent + border:none 实际**从未生效**——浏览器算出来的边框
   一直是 #e5e5E4 / 8px（来自全局规则）、背景继承自父容器白色弹窗。Puppeteer 截图 A/B 证明
   改前改后像素完全一致（hash 相同）。
   v20260906e：按注释方案把选择器提到 `.indcats-trigger .indcats-input`（特异性 0,2,0）压过全局 0,1,1；
   触发器内嵌 input 回归"无独立 border / 透明背景 / 小 padding"，整体像同一个带框输入框，
   不再像「触发器里又嵌一个输入框」。 */
.indcats-trigger .indcats-input {
  flex: 1;
  min-width: 90px;
  border: none;
  outline: none;
  background: transparent;
  font-size: 13px;
  color: #2D2C29;
  padding: 2px 4px;
  font-family: inherit;
}
.indcats-input::placeholder { color: #B4B2A9; }
.indcats-input:focus { outline: none; }
.indcats-empty {
  padding: 10px 14px;
  color: #B4B2A9;
  font-size: 12px;
  text-align: center;
}

/* ========== 客户分类标签 ========== */
.client-type-tag {
  display: inline-flex;
  align-items: center;
  padding: 2px 10px;
  border-radius: 12px;
  font-size: 11px;
  font-weight: 500;
  cursor: pointer;
  transition: opacity 0.15s;
  user-select: none;
}
.client-type-tag:hover {
  opacity: 0.8;
}

/* ========== AI公司画像按钮 ========== */
.ai-company-btn {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  transition: transform 0.15s;
}
.ai-company-btn:hover {
  transform: scale(1.05);
}

/* ========== 关闭项目结果选择 ========== */
.close-result-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.close-result-option {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px;
  border: 1px solid #e5e5e4;
  border-radius: 8px;
  cursor: pointer;
  transition: all 0.15s;
}
.close-result-option:hover {
  background: #faf9f7;
  border-color: #d4d2cc;
}
.close-result-radio {
  width: 18px;
  height: 18px;
  border: 2px solid #ccc;
  border-radius: 50%;
  flex-shrink: 0;
  transition: all 0.15s;
}
.close-result-radio.selected {
  border-color: var(--accent);
  background: var(--accent);
  box-shadow: inset 0 0 0 3px white;
}
.close-result-content {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.close-result-suboption {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 12px;
  border-radius: 6px;
  cursor: pointer;
  font-size: 13px;
  color: #5d5b53;
  transition: all 0.15s;
}
.close-result-suboption:hover {
  background: #faf9f7;
}
.close-result-radio-sm {
  width: 14px;
  height: 14px;
  border-width: 2px;
}
.close-result-radio-sm.selected {
  border-color: #E7857D;
  background: #E7857D;
  box-shadow: inset 0 0 0 2px white;
}

/* 列宽拖拽手柄 */
.col-resize-handle {
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  width: 5px;
  cursor: col-resize;
  user-select: none;
}
.col-resize-handle:hover,
.col-resize-handle.resizing {
  background: var(--accent-deep);
  opacity: 0.5;
}

/* 列头可拖拽重新排序 */
.th-dragable {
  cursor: grab;
  user-select: none;
}
.th-dragable.dragging {
  opacity: 0.5;
  cursor: grabbing;
}

/* 列顺序保存提示 */
.col-order-saved {
  position: fixed;
  top: 60px;
  right: 20px;
  background: #1D9E75;
  color: white;
  padding: 8px 16px;
  border-radius: 6px;
  font-size: 12px;
  z-index: 9999;
  display: none;
}

/* ====== 紧急度下拉修改 ====== */
.urgency-opt:hover {
  background: #f5f5f4;
}

/* ====== 客户可搜索下拉框 ====== */
.client-combobox {
  position: relative;
  width: 100%;
}
.client-combobox-input {
  width: 100%;
  padding: 8px 30px 8px 10px;
  border: 1px solid #DDDAD3;
  border-radius: 6px;
  font-size: 13px;
  background: #FFF;
  box-sizing: border-box;
  outline: none;
  transition: border-color 0.15s;
}
.client-combobox-input:focus {
  border-color: var(--accent);
}
.client-combobox-input::placeholder {
  color: #AAA7A0;
}
.client-combobox-arrow {
  position: absolute;
  right: 10px;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: none;
  color: #888780;
  font-size: 12px;
  transition: transform 0.15s;
}
.client-combobox.open .client-combobox-arrow {
  transform: translateY(-50%) rotate(180deg);
}
.client-combobox-dropdown {
  display: none;
  position: absolute;
  top: calc(100% + 2px);
  left: 0;
  right: 0;
  max-height: 220px;
  overflow-y: auto;
  background: #FFF;
  border: 1px solid #DDDAD3;
  border-radius: 6px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  z-index: 10000;
}
.client-combobox.open .client-combobox-dropdown {
  display: block;
}
.client-combobox-item {
  padding: 8px 12px;
  font-size: 13px;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 6px;
  transition: background 0.1s;
}
.client-combobox-item:hover,
.client-combobox-item.active {
  background: #F5F4FA;
}
.client-combobox-item .cci-type {
  font-size: 10px;
  padding: 1px 5px;
  border-radius: 3px;
  margin-left: auto;
}
.client-combobox-empty {
  padding: 12px;
  font-size: 12px;
  color: #888780;
  text-align: center;
}

/* ========== Mapping可见性选择 ========== */
.mapping-vis-radio {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  cursor: pointer;
  padding: 6px 12px;
  border: 1px solid #d3d1c7;
  border-radius: 8px;
  transition: all 0.15s;
}
.mapping-vis-radio.active {
  border-color: var(--accent);
  background: var(--accent-t08);
}
.mapping-vis-radio input[type="radio"] {
  accent-color: var(--accent);
  margin: 0;
}

/* ========== KPI 看板 ========== */
.kpi-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 16px;
  gap: 12px;
  flex-wrap: wrap;
}
.kpi-period-tabs {
  display: flex;
  gap: 2px;
  background: #f1efe8;
  border-radius: 8px;
  padding: 2px;
}
.kpi-period-tab {
  padding: 5px 14px;
  border-radius: 6px;
  font-size: 12px;
  color: #33322e;
  cursor: pointer;
  border: none;
  background: transparent;
  transition: all 0.15s;
}
.kpi-period-tab:hover {
  color: var(--accent);
}
.kpi-period-tab.active {
  background: #fff;
  color: var(--accent);
  font-weight: 600;
  box-shadow: 0 1px 3px rgba(0,0,0,0.08);
}
.kpi-view-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  color: #888780;
}
.kpi-view-radio {
  padding: 5px 12px;
  border: 1px solid #e5e5e4;
  border-radius: 6px;
  cursor: pointer;
  font-size: 11px;
  background: #fff;
  color: #33322e;
  transition: all 0.15s;
}
.kpi-view-radio.active {
  border-color: var(--accent);
  background: #EDFDFE;
  color: var(--accent);
}
.kpi-mode-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: 4px;
}
.kpi-summary-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 10px;
  margin-bottom: 16px;
}
.kpi-summary-card {
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 10px;
  padding: 14px;
  text-align: center;
  transition: box-shadow 0.2s;
}
.kpi-summary-card:hover {
  box-shadow: 0 2px 8px rgba(0,0,0,0.06);
}
.kpi-summary-icon {
  font-size: 20px;
  margin-bottom: 6px;
}
.kpi-summary-value {
  font-size: 26px;
  font-weight: 700;
  line-height: 1.1;
}
.kpi-summary-label {
  font-size: 11px;
  color: #888780;
  margin-top: 4px;
}
.kpi-summary-sub {
  font-size: 10px;
  color: #B4B2A9;
  margin-top: 2px;
}
.kpi-section-title {
  font-size: 13px;
  font-weight: 600;
  color: #3D3D3D;
  margin-bottom: 12px;
  display: flex;
  align-items: center;
  gap: 6px;
}
.kpi-section-title .icon {
  font-size: 15px;
}

/* 漏斗图 */
.kpi-funnel {
  display: flex;
  align-items: stretch;
  gap: 0;
  margin-bottom: 16px;
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 12px;
  overflow: hidden;
}
.kpi-funnel-stage {
  flex: 1;
  padding: 16px 8px;
  text-align: center;
  position: relative;
  border-right: 1px solid #f1efe8;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 100px;
}
.kpi-funnel-stage:last-child {
  border-right: none;
}
.kpi-funnel-stage-num {
  font-size: 28px;
  font-weight: 700;
}
.kpi-funnel-stage-label {
  font-size: 11px;
  color: #888780;
  margin-top: 4px;
}
.kpi-funnel-stage-rate {
  font-size: 10px;
  padding: 2px 6px;
  border-radius: 4px;
  margin-top: 4px;
  font-weight: 500;
}
.kpi-funnel-arrow {
  width: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #B4B2A9;
  font-size: 14px;
}

/* 双栏KPI */
.kpi-dual {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-bottom: 16px;
}
.kpi-card-section {
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 12px;
  padding: 16px;
}
.kpi-metric-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 0;
  border-bottom: 1px solid #f1efe8;
}
.kpi-metric-row:last-child {
  border-bottom: none;
}
.kpi-metric-label {
  font-size: 12px;
  color: #33322e;
}
.kpi-metric-value {
  font-size: 14px;
  font-weight: 600;
}
.kpi-metric-bar {
  flex: 1;
  max-width: 120px;
  height: 6px;
  border-radius: 3px;
  background: #f1efe8;
  overflow: hidden;
  margin-left: 12px;
}
.kpi-metric-bar-fill {
  height: 100%;
  border-radius: 3px;
  transition: width 0.5s ease;
}

/* 目标进度 */
.kpi-targets-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 8px;
}
.kpi-target-item {
  display: flex;
  align-items: center;
  gap: 10px;
}
.kpi-target-label {
  font-size: 11px;
  color: #33322e;
  width: 60px;
  flex-shrink: 0;
}
.kpi-target-bar-wrap {
  flex: 1;
  height: 20px;
  background: #f5f5f4;
  border-radius: 10px;
  overflow: hidden;
  position: relative;
}
.kpi-target-fill {
  height: 100%;
  border-radius: 10px;
  transition: width 0.5s ease;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding-right: 8px;
  font-size: 10px;
  font-weight: 600;
  color: #fff;
  min-width: 40px;
}
.kpi-target-text {
  font-size: 11px;
  color: #888780;
  width: 80px;
  flex-shrink: 0;
  text-align: right;
}

/* 顾问排名 */
.kpi-ranking-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.kpi-ranking-table th {
  text-align: left;
  padding: 8px 10px;
  border-bottom: 2px solid #e5e5e4;
  color: #888780;
  font-weight: 500;
  font-size: 11px;
}
.kpi-ranking-table td {
  padding: 10px;
  border-bottom: 1px solid #f1efe8;
}
.kpi-ranking-table tr:hover td {
  background: #fafaf9;
}
/* ===== KPI 报表 ===== */
.kpi-report-table th, .kpi-report-table td {
  text-align: center;
  white-space: nowrap;
}
.kpi-report-table th:first-child, .kpi-report-table td:first-child {
  text-align: left;
}
.kpi-report-total td {
  font-weight: 600;
  background: #f6f5f2;
}
/* ===== KPI 报表：订阅 + 主区 双栏布局 ===== */
.kpi-report-layout {
  display: flex;
  gap: 14px;
  align-items: flex-start;
}
.kpi-report-sidebar {
  flex: 0 0 220px;
  width: 220px;
  background: #fff;
  border: 1px solid #ece9e1;
  border-radius: 12px;
  padding: 14px 12px;
  position: sticky;
  top: 12px;
}
.kpi-sub-title {
  font-size: 13px;
  font-weight: 700;
  color: #3a382f;
  margin-bottom: 10px;
}
.kpi-sub-list { display: flex; flex-direction: column; gap: 6px; }
.kpi-sub-item {
  position: relative;
  padding: 8px 10px;
  border: 1px solid #ece9e1;
  border-radius: 9px;
  cursor: pointer;
  background: #fafaf8;
  transition: all .15s;
}
.kpi-sub-item:hover { border-color: #A7D4D7; background: #f4f2fb; }
.kpi-sub-item.active { border-color: var(--accent); background: #ECF9FA; }
.kpi-sub-name { font-size: 12.5px; font-weight: 600; color: #3a382f; padding-right: 18px; }
.kpi-sub-meta { font-size: 10.5px; color: #9c978a; margin-top: 2px; }
.kpi-sub-del {
  position: absolute; top: 6px; right: 6px;
  border: none; background: transparent; color: #b9b4a8;
  cursor: pointer; font-size: 12px; line-height: 1; padding: 2px 4px;
}
.kpi-sub-del:hover { color: #A32D2D; }
.kpi-sub-empty {
  font-size: 11.5px; color: #a8a399; line-height: 1.5;
  padding: 14px 10px; text-align: center; background: #fafaf8;
  border: 1px dashed #e3e0d8; border-radius: 9px;
}
.kpi-sub-save {
  width: 100%; margin-top: 10px;
  border: 1px dashed #6EC0C6; background: #f6f4fc; color: var(--accent);
  border-radius: 9px; padding: 8px; font-size: 12px; font-weight: 600; cursor: pointer;
}
.kpi-sub-save:hover { background: #EAFAFB; }
.kpi-sub-hint { font-size: 10.5px; color: #b4b2a9; margin-top: 8px; line-height: 1.5; }
.kpi-report-main { flex: 1; min-width: 0; }
.kpi-report-actions { display: flex; gap: 8px; margin-left: auto; flex-wrap: wrap; }
.kpi-custom-picker { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; }
.kpi-custom-picker .form-input { width: auto; padding: 5px 8px; }
/* 报表表头子行：目标/上限/权重 */
.kpi-th-subrow th {
  font-size: 10px; font-weight: 500; color: #9c978a;
  background: #f7f6f2; border-top: none; padding: 4px 8px;
}
.kpi-score.pass, .kpi-status.pass { color: #1D9E75; font-weight: 600; }
.kpi-score.fail, .kpi-status.fail { color: #A32D2D; font-weight: 600; }
.kpi-report-table td.kpi-score { font-size: 13px; }
/**
 * ★ 批次 660（Randy 2026-10-11，红框圈着「HRBP」：「为什么感觉底下有什么东西？」）
 * ---------------------------------------------------------------------------
 * 真因：**「用户当前团队」那一格里，团队名后面的「后台」药丸溢到了右边的职位格里**，
 *   正好压在 `HRBP` 底下（DOM 顺序：团队格输出在前、职位格在后 → 文字压住药丸，
 *   看上去就成了"字底下有东西"）。表头同样的毛病：`用户当前团队` + `职位` 挤成一团。
 *   根子在这张表是 `white-space:nowrap`、又没有任何 overflow 处理 —— 列一窄就往外溢。
 * 规矩：**任何表头/单元格都不许溢到邻列**；表头与团队格允许换行（宁可两行也别挤成一团）；
 *   其余单行文字用省略号。
 */
.kpi-report-table th, .kpi-report-table td { overflow: hidden; }
.kpi-report-table th { white-space: normal; overflow-wrap: anywhere; }
.kpi-report-table td { text-overflow: ellipsis; }
.kpi-report-table td.kpi-cell-team { white-space: normal; overflow-wrap: anywhere; color: #888780; font-size: 11px; }
.kpi-report-table td.kpi-cell-team .tag { white-space: nowrap; }
@media (max-width: 980px) {
  .kpi-report-layout { flex-direction: column; }
  .kpi-report-sidebar { position: static; width: 100%; flex-basis: auto; }
}

/* 近期动作记录 */
.act-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
.act-row {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 10px; border: 1px solid #efece4; border-radius: 8px;
  font-size: 12px; background: #fff;
}
.act-type {
  font-weight: 700; font-size: 11px; padding: 2px 7px; border-radius: 5px;
  background: #E9F6F7; color: var(--accent); min-width: 46px; text-align: center;
}
.act-NC { background: #EEF2FC; color: #5E89EC; }
.act-CC { background: #e9f7ee; color: #1D9E75; }
.act-CI { background: #fff3e0; color: #BA7517; }
.act-CS { background: #eaf0ff; color: #167278; }
.act-1CCIV { background: #fdeaf3; color: #C2255C; }
.act-MC { background: #e8f7f7; color: #0b7285; }
.act-CM { background: #ECFEFF; color: #176B71; }
.act-BD { background: #fbe9e7; color: #A32D2D; }
.act-name { font-weight: 600; min-width: 64px; }
.act-date { color: #888; min-width: 92px; }
.act-note { flex: 1; color: #555; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.btn-mini {
  border: 1px solid #e0ddd4; background: #fff; color: #a32d2d;
  border-radius: 6px; padding: 3px 9px; font-size: 11px; cursor: pointer;
}
.btn-mini:hover { background: #fbe9e7; }
.kpi-weekly-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  font-size: 11px;
  color: #888780;
  margin: 4px 0 10px;
  flex-wrap: wrap;
}
.kpi-weekly-hint {
  color: #5E89EC;
  font-weight: 500;
}
.kpi-weekly-wrap {
  border: 1px solid #e5e5e4;
  border-radius: 10px;
  overflow-x: auto;
  background: #fff;
}
.kpi-weekly-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
  min-width: 640px;
}
.kpi-weekly-table th {
  text-align: center;
  padding: 10px 8px;
  border-bottom: 2px solid #e5e5e4;
  color: #888780;
  font-weight: 500;
  font-size: 11px;
  background: #fafaf9;
  position: sticky;
  top: 0;
  white-space: nowrap;
}
.kpi-weekly-th-label { font-weight: 600; color: #3D3D3D; }
.kpi-weekly-th-sub { font-size: 10px; color: #B4B2A9; margin-top: 2px; }
.kpi-weekly-table td {
  padding: 9px 8px;
  text-align: center;
  border-bottom: 1px solid #f1efe8;
  color: #3D3D3D;
}
.kpi-weekly-metric-col {
  text-align: left !important;
  position: sticky;
  left: 0;
  background: #fff;
  z-index: 1;
  border-right: 1px solid #f1efe8;
  white-space: nowrap;
}
.kpi-weekly-total-col {
  text-align: center;
  background: #fafaf9;
  border-left: 2px solid #e5e5e4;
  font-weight: 700;
  color: #3D3D3D;
}
.kpi-weekly-cell { font-variant-numeric: tabular-nums; }
.kpi-weekly-rate { color: #3E5C9E; }
.kpi-weekly-table tr:hover td { background: #f7f6ff; }
.kpi-weekly-table tr:hover .kpi-weekly-metric-col { background: #f7f6ff; }
.kpi-rank-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  font-size: 11px;
  font-weight: 700;
  color: #fff;
}
.kpi-rank-1 { background: #FFB800; }
.kpi-rank-2 { background: #B4B2A9; }
.kpi-rank-3 { background: #C4956A; }
.kpi-rank-other { background: #e5e5e4; color: #33322e; }

/* KPI 设置 */
.kpi-settings-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  margin-top: 12px;
}
.kpi-setting-item {
  display: flex;
  align-items: center;
  gap: 8px;
}
.kpi-setting-item label {
  font-size: 12px;
  color: #33322e;
  flex-shrink: 0;
}
.kpi-setting-item input {
  width: 60px;
  padding: 4px 8px;
  border: 1px solid #d3d1c7;
  border-radius: 6px;
  font-size: 12px;
  text-align: center;
}
.kpi-setting-item input:focus {
  outline: none;
  border-color: var(--accent);
}

/* KPI 空状态 */
.kpi-empty {
  text-align: center;
  padding: 48px 24px;
  color: #B4B2A9;
}
.kpi-empty-icon {
  font-size: 48px;
  margin-bottom: 12px;
}

@media (max-width: 900px) {
  .kpi-summary-grid {
    grid-template-columns: repeat(3, 1fr);
  }
  .kpi-dual {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 640px) {
  .kpi-summary-grid {
    grid-template-columns: repeat(2, 1fr);
  }
  .kpi-funnel {
    flex-direction: column;
  }
  .kpi-funnel-stage {
    border-right: none;
    border-bottom: 1px solid #f1efe8;
    min-height: 60px;
  }
  .kpi-funnel-arrow {
    transform: rotate(90deg);
    width: 100%;
    height: 16px;
  }
}

/* ========== BD 市场开拓模块 ========== */
.bd-page { padding: 0; }
.bd-stats-row {
  display: flex; gap: 10px; margin-bottom: 12px; flex-wrap: wrap;
}
.bd-stat-card {
  flex: 1; min-width: 100px; background: #fff; border: 1px solid #efeee9;
  border-radius: 8px; padding: 10px 14px; text-align: center;
}
.bd-stat-num { font-size: 24px; font-weight: 700; color: #3D3D3D; }
.bd-stat-label { font-size: 11px; color: #888780; margin-top: 2px; }

.bd-expertise-bar {
  display: flex; align-items: center; gap: 10px; background: #fff;
  border: 1px solid #efeee9; border-radius: 8px; padding: 10px 14px; margin-bottom: 12px;
  flex-wrap: wrap;
}
.bd-expertise-label { font-size: 12px; font-weight: 600; color: #33322e; white-space: nowrap; }
.bd-expertise-tags { display: flex; gap: 4px; flex-wrap: wrap; flex: 1; }
.bd-exp-tag {
  font-size: 11px; padding: 2px 8px; border-radius: 10px;
  background: var(--accent-t10); color: var(--accent); border: 1px solid var(--accent-t20);
}

.bd-filter-bar {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 12px; gap: 8px;
}
.bd-filter-tabs { display: flex; gap: 4px; flex-wrap: wrap; }
.bd-filter-tab {
  font-size: 12px; padding: 4px 12px; border-radius: 16px;
  border: 1px solid #e5e5e4; background: #fff; color: #888780;
  cursor: pointer; transition: all 0.15s; white-space: nowrap;
}
.bd-filter-tab:hover { background: #f5f5f4; }
.bd-filter-tab.active { background: var(--accent); color: #fff; border-color: var(--accent); }
.bd-filter-count {
  font-size: 10px; margin-left: 2px; opacity: 0.7;
}

.bd-lead-list {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
  gap: 10px;
}
.bd-lead-card {
  background: #fff; border: 1px solid #efeee9; border-radius: 8px;
  padding: 12px 14px; cursor: pointer; transition: all 0.15s;
  display: flex; flex-direction: column; gap: 6px;
}
.bd-lead-card:hover {
  border-color: var(--accent-t40); box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.08);
  transform: translateY(-1px);
}
.bd-lead-header {
  display: flex; justify-content: space-between; align-items: flex-start; gap: 8px;
}
.bd-lead-company {
  font-size: 14px; font-weight: 600; color: #3D3D3D;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1;
}
.bd-lead-badges { display: flex; gap: 4px; flex-shrink: 0; }
.bd-badge {
  font-size: 10px; padding: 1px 6px; border-radius: 8px; font-weight: 500;
  white-space: nowrap;
}
.bd-lead-title {
  font-size: 13px; color: var(--accent); font-weight: 500;
}
.bd-lead-meta {
  display: flex; gap: 10px; flex-wrap: wrap; font-size: 11px; color: #888780;
}
.bd-lead-summary {
  font-size: 12px; color: #33322e; line-height: 1.4;
  overflow: hidden; text-overflow: ellipsis; display: -webkit-box;
  -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.bd-lead-footer {
  display: flex; gap: 10px; align-items: center; font-size: 10px; color: #B4B2A9;
  border-top: 1px solid #f8f7f4; padding-top: 6px;
}
.bd-lead-source { padding: 1px 6px; background: #f5f5f4; border-radius: 4px; }
.bd-lead-followups { color: var(--accent); }

.bd-empty {
  text-align: center; padding: 60px 20px;
}
.bd-empty-icon { font-size: 48px; margin-bottom: 8px; }

/* BD 擅长领域设置弹窗 */
.bd-exp-section { margin-bottom: 16px; }
.bd-exp-section-title {
  font-size: 12px; font-weight: 600; color: #33322e; margin-bottom: 8px;
}
.bd-exp-options { display: flex; flex-wrap: wrap; gap: 6px; }
.bd-exp-option {
  font-size: 12px; padding: 4px 10px; border-radius: 16px;
  border: 1px solid #e5e5e4; background: #fff; color: #888780;
  cursor: pointer; transition: all 0.15s;
}
.bd-exp-option:hover { border-color: var(--accent); color: var(--accent); }
.bd-exp-option.active {
  background: var(--accent); color: #fff; border-color: var(--accent);
}
.bd-exp-input {
  width: 100%; padding: 8px 12px; border: 1px solid #e5e5e4;
  border-radius: 6px; font-size: 13px;
}

/* BD 抓取加载 */
.bd-scraping-overlay {
  position: fixed; top: 0; left: 0; right: 0; bottom: 0;
  background: rgba(255, 255, 255, 0.8); z-index: 999;
  display: flex; align-items: center; justify-content: center;
}
.bd-scraping-box { text-align: center; }
.bd-scraping-spinner {
  width: 40px; height: 40px; border: 3px solid var(--accent-t20);
  border-top-color: var(--accent); border-radius: 50%;
  animation: bd-spin 0.8s linear infinite; margin: 0 auto;
}
@keyframes bd-spin { to { transform: rotate(360deg); } }

/* BD AI 智能搜索结果预览 */
.bd-search-profile {
  font-size: 12px; color: #33322e; background: #f4f2fe; border: 1px solid #DEF7F9;
  border-radius: 8px; padding: 8px 10px; margin-bottom: 4px; line-height: 1.5;
}
.bd-search-list {
  display: flex; flex-direction: column; gap: 6px; max-height: 52vh; overflow-y: auto;
  padding: 2px; margin-top: 4px;
}
.bd-search-card {
  display: flex; gap: 8px; align-items: flex-start; padding: 8px 10px;
  background: #fafaf8; border: 1px solid #eee; border-radius: 8px; cursor: pointer;
  transition: all .12s;
}
.bd-search-card:hover { background: #f5f4ff; border-color: #97E3E8; }
.bd-search-card.selected { background: #EEFDFE; border-color: var(--accent); }
.bd-search-check { width: 15px; height: 15px; margin-top: 3px; cursor: pointer; flex: 0 0 auto; accent-color: var(--accent); }
.bd-search-card-main { flex: 1; min-width: 0; }
.bd-search-card-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.bd-search-company { font-size: 13px; font-weight: 600; color: #3D3D3D; }
.bd-search-prio {
  font-size: 10px; padding: 1px 7px; border-radius: 10px; white-space: nowrap; font-weight: 600;
}
.bd-search-prio-high { background: #E7857D15; color: #A32D2D; }
.bd-search-prio-medium { background: #BA751715; color: #BA7517; }
.bd-search-prio-low { background: #88878015; color: #888780; }
.bd-search-title { font-size: 12px; color: var(--accent); font-weight: 500; margin: 2px 0; }
.bd-search-meta { display: flex; gap: 10px; flex-wrap: wrap; font-size: 11px; color: #888780; }
.bd-search-reason {
  font-size: 11px; color: #1D9E75; background: #1D9E7510; border-radius: 5px;
  padding: 3px 7px; margin-top: 5px; line-height: 1.4;
}

/**
 * BD 线索库（批次 165 / Randy）："抓取后将线索以类似知识库的页面排版"
 * 左列 = 线索列表（可滚动），右列 = 选中那条的详情。
 * 参考知识库详情页的两栏口径（.kb-detail-grid），保持"同一种排版语言"。
 */
.bd-kb-grid {
  display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: 16px; align-items: start;
}
@media (max-width: 1100px) { .bd-kb-grid { grid-template-columns: 1fr; } }
.bd-kb-panel {
  background: #fff; border: 1px solid #efece6; border-radius: 14px; padding: 14px 16px;
}
.bd-kb-panel-head {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding-bottom: 10px; border-bottom: 1px solid #f1efe9; margin-bottom: 10px; flex-wrap: wrap;
}
.bd-kb-panel-title { font-size: 12px; font-weight: 600; color: #3D3D3D; }
.bd-kb-scope { display: flex; gap: 4px; }
.bd-kb-scope-btn {
  font-size: 10.5px; padding: 2px 8px; border-radius: 999px; cursor: pointer;
  border: 1px solid #e8e6e0; background: #faf9f7; color: #33322e;
}
.bd-kb-scope-btn:hover { border-color: var(--accent); color: var(--accent); }
.bd-kb-scope-btn.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.bd-kb-list { display: flex; flex-direction: column; gap: 6px; max-height: 62vh; overflow-y: auto; }
.bd-kb-item {
  border: 1px solid #ecebe6; border-radius: 10px; padding: 9px 11px; cursor: pointer;
  background: #faf9f7; transition: border-color .15s, background .15s;
}
.bd-kb-item:hover { border-color: #97E3E8; background: #f5f4ff; }
.bd-kb-item.active { border-color: var(--accent); background: #EEFDFE; }
.bd-kb-item-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.bd-kb-item-company { font-size: 13px; font-weight: 600; color: #3D3D3D; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bd-kb-score { font-size: 10px; font-weight: 600; border-radius: 6px; padding: 1px 6px; flex: 0 0 auto; }
.bd-kb-item-title { font-size: 12px; color: var(--accent); margin-top: 2px; }
.bd-kb-item-meta { display: flex; gap: 8px; flex-wrap: wrap; font-size: 10.5px; color: #888780; margin-top: 4px; align-items: center; }
.bd-kb-tag { background: #f1efe8; border-radius: 6px; padding: 1px 6px; }
/* ★ 批次 685（Randy）：线索库卡片上直接给一个「✓ 跟进」——点了就收纳进 BD 跟进列表 */
.bd-kb-follow-btn {
  margin-left: auto;
  border: 1px solid #3B7DD8;
  background: #fff;
  color: #3B7DD8;
  border-radius: 6px;
  padding: 1px 8px;
  font-size: 10.5px;
  line-height: 16px;
  cursor: pointer;
}
.bd-kb-follow-btn:hover { background: #3B7DD8; color: #fff; }
/* ★ 批次 685（Randy）：「BD 跟进」列表里的备注直接编辑 + 一行一个动作按钮 */
.bd-note-cell {
  padding: 9px 10px;
  color: #33322e;
  outline: none;
  border-radius: 4px;
}
.bd-note-cell:hover { background: #FBF9F2; box-shadow: inset 0 0 0 1px #EFE9D8; }
.bd-note-cell:focus { background: #fff; box-shadow: inset 0 0 0 1px #3B7DD8; }
.bd-note-cell:empty:before { content: '点击写备注'; color: #C9C7BE; }
.bd-row-btn {
  border: 1px solid #D8D5CC;
  background: #fff;
  color: #33322e;
  border-radius: 6px;
  padding: 1px 8px;
  font-size: 11px;
  line-height: 18px;
  cursor: pointer;
  margin-right: 4px;
}
.bd-row-btn:hover { border-color: #B4B2A9; background: #F7F5EE; }
.bd-row-btn.ok { border-color: #3B7DD8; color: #3B7DD8; }
.bd-row-btn.ok:hover { background: #3B7DD8; color: #fff; }
.bd-row-btn.dev { border-color: #1D9E75; color: #1D9E75; }
.bd-row-btn.dev:hover { background: #1D9E75; color: #fff; }
.bd-row-btn.warn { border-color: #E3C9C9; color: #A32D2D; }
.bd-row-btn.warn:hover { background: #A32D2D; color: #fff; }
.bd-row-btn.back { border-color: #BA7517; color: #BA7517; }
.bd-row-btn.back:hover { background: #BA7517; color: #fff; }
/* ★ 批次 687（Randy）：业绩分析表上方的筛选维度 + 穿透用的明细表 */
.ana-filter-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  justify-content: flex-end;
  font-size: 13px;
  color: #3F3E39;
  margin: 0;
  padding: 0;
  background: none;
  border: none;
}
/**
 * ★ 批次 688（Randy：「参考谷露的如图来做」）：全局 `select { width: 100% }`（css 第 510 行）
 *   会把筛选栏里的下拉撑成整行、于是整排"塌"成竖排（我上一版就是这样）。这里按类覆盖回自动宽。
 */
select.ana-filter-sel { width: auto; padding: 2px 6px; border: none; background: transparent; font-size: 13px; color: #3F3E39; }
.ana-filter-sep { color: #D8D5CC; }
.ana-filter-sel:hover { color: var(--accent-ink); text-decoration: underline; }
.ana-filter-btn {
  border: 1px solid #E3E0D8;
  background: #fff;
  border-radius: 14px;
  padding: 3px 12px;
  font-size: 12.5px;
  color: #3F3E39;
  cursor: pointer;
}
.ana-filter-btn:hover { border-color: var(--accent-ink); color: var(--accent-ink); }
.ana-filter-count { font-size: 11.5px; color: #888780; }
.ana-filter-switch { display: flex; align-items: center; gap: 6px; margin-left: auto; cursor: pointer; font-size: 12.5px; }
/* ★ 批次 688：照谷露重排后的三段式页头（标题 + 用户/团队切换 + 一行筛选） */
.ana-top { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.ana-top-left { display: flex; flex-direction: column; }
.ana-top-left .dash-title { font-size: 18px; line-height: 1.2; }
.ana-top-left .dash-subtitle { font-size: 12px; }
.ana-top-mid { display: flex; align-items: center; }
.ana-top-right { margin-left: auto; }
.ana-tabs-row { display: flex; align-items: center; gap: 12px; border-bottom: 1px solid #f1efe8; margin-top: 10px; }
.ana-tabs-row .ana-tabs { border-bottom: none; margin: 0; flex: 1; }
.ana-icons { display: flex; gap: 6px; padding-bottom: 4px; }
.ana-icon-btn {
  width: 28px; height: 28px; border: 1px solid #E3E0D8; background: #fff; border-radius: 6px;
  color: #33322e; font-size: 13px; cursor: pointer; line-height: 1;
}
.ana-icon-btn:hover { border-color: var(--accent-ink); color: var(--accent-ink); }
    /* ★ 批次 698：带文字的导出按钮（CSV / Excel）——方框按钮只够放一个图标，这两个给它们宽度 */
    .ana-icon-btn--wide { width: auto; padding: 0 8px; font-size: 12px; white-space: nowrap; }
/* 可排序表头 */
.ana-sortable { cursor: pointer; user-select: none; white-space: nowrap; }
.ana-sortable:hover { color: var(--accent-ink); }
.ana-sort-caret { color: #B4B2A9; font-size: 10px; margin-left: 2px; }
.ana-sort-caret.on { color: var(--accent-ink); }
/* 团队行展开出来的成员行 */
.ana-member-row { background: #FBFBF7; }
.ana-member-row td:first-child { padding-left: 30px; }
    /* ★ 批次 702（Randy：「红框这个放在最后一行，然后字体用灰色」）：
       「离册顾问（无账号）」那一行 —— 它不属于任何团队，是"离册的人"的合计，用灰字降噪 */
    .ana-leaver-row td { color: #8C8C8C; }
    .ana-leaver-row td b { font-weight: 500; }
.ana-caret { cursor: pointer; color: #33322e; display: inline-block; width: 14px; }
.ana-fill-target { color: #3B7DD8; cursor: pointer; text-decoration: underline dotted; }
.ana-scope-hint { padding: 8px 12px; font-size: 12px; color: #33322e; background: #FBF9F2; border-bottom: 1px solid #f1efe8; }
.ana-switch {
  display: inline-block;
  width: 34px;
  height: 18px;
  border-radius: 10px;
  background: #E3E0D8;
  position: relative;
  transition: background .15s;
}
.ana-switch i {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #fff;
  transition: left .15s;
}
.ana-switch.on { background: #1D9E75; }
.ana-switch.on i { left: 18px; }
.ana-user-list { max-height: 52vh; overflow: auto; border: 1px solid #f1efe8; border-radius: 6px; }
.ana-user-row { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-bottom: 1px solid #f6f4ee; font-size: 13px; cursor: pointer; }
.ana-user-row:hover { background: #FBF9F2; }
.ana-user-name { flex: 1; color: var(--accent-ink); }
.ana-user-role { color: #888780; font-size: 11.5px; }
.ana-drill-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.ana-drill-table th { text-align: left; padding: 6px 8px; background: #FBF9F2; color: #33322e; font-weight: 500; white-space: nowrap; }
.ana-drill-table td { padding: 6px 8px; border-top: 1px solid #f1efe8; vertical-align: top; }
.ana-drill-table tfoot td { background: #FBF9F2; font-weight: 600; }
.bd-kb-empty { text-align: center; padding: 40px 10px; }
.bd-kb-detail-company { font-size: 16px; font-weight: 700; color: #2c2c2a; }
.bd-kb-detail-title { font-size: 13px; color: var(--accent); font-weight: 500; margin-top: 3px; }
.bd-kb-detail-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.bd-kb-score-lg {
  flex: 0 0 auto; font-size: 11px; font-weight: 600; color: var(--accent);
  background: var(--accent-t12); border-radius: 999px; padding: 3px 10px;
}
.bd-kb-detail-tags { display: flex; gap: 6px; flex-wrap: wrap; margin: 10px 0 12px; }
.bd-kb-reason {
  font-size: 12px; color: #1D9E75; background: #1D9E7510; border-radius: 8px;
  padding: 8px 10px; line-height: 1.6; margin-bottom: 12px;
}
.bd-kb-detail-actions {
  display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
  margin-top: 14px; padding-top: 12px; border-top: 1px solid #f1efe8;
}

/* BD 线索详情 */
.bd-detail-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px;
}
.bd-detail-item {
  display: flex; gap: 6px; font-size: 12px; padding: 4px 0;
}
.bd-detail-label { color: #B4B2A9; min-width: 50px; }
.bd-detail-value { color: #3D3D3D; font-weight: 500; }
.bd-detail-link { color: var(--accent); text-decoration: none; }
.bd-detail-link:hover { text-decoration: underline; }

.bd-detail-section {
  margin-bottom: 14px; padding: 10px 0; border-top: 1px solid #f8f7f4;
}
.bd-detail-section-title {
  font-size: 12px; font-weight: 600; color: #33322e; margin-bottom: 8px;
}
.bd-detail-text {
  font-size: 12px; color: #33322e; line-height: 1.5;
  background: #f9f8f5; padding: 8px 10px; border-radius: 6px;
}

/* BD 跟进时间线 */
.bd-timeline { display: flex; flex-direction: column; gap: 8px; }
.bd-timeline-item {
  display: flex; gap: 10px; padding: 6px 0;
}
.bd-timeline-date {
  font-size: 10px; color: #B4B2A9; min-width: 70px; padding-top: 1px;
}
.bd-timeline-content {
  flex: 1; font-size: 12px;
}
.bd-timeline-action { font-weight: 500; color: #3D3D3D; }
.bd-timeline-note { color: #888780; margin-top: 2px; }

.bd-follow-input {
  padding: 6px 10px; border: 1px solid #e5e5e4; border-radius: 6px;
  font-size: 12px; outline: none;
}
.bd-follow-input:focus { border-color: var(--accent); }

/* BD AI分析 */
.bd-analysis-box {
  background: #f9f8f5; border-radius: 8px; padding: 12px;
  display: flex; flex-direction: column; gap: 8px;
}
.bd-analysis-score {
  display: flex; align-items: baseline; gap: 6px;
  padding-bottom: 8px; border-bottom: 1px solid #efeee9;
}
.bd-analysis-item {
  display: flex; gap: 8px; font-size: 12px;
}
.bd-analysis-label {
  min-width: 70px; color: #B4B2A9; flex-shrink: 0;
}
.bd-analysis-item > span:last-child { color: #3D3D3D; flex: 1; }

/* BD 表单 */
.bd-form-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
}
.bd-form-item { display: flex; flex-direction: column; gap: 4px; }
.bd-form-item label { font-size: 11px; color: #888780; }
.bd-form-item input, .bd-form-item select, .bd-form-item textarea {
  padding: 6px 10px; border: 1px solid #e5e5e4; border-radius: 6px;
  font-size: 12px; outline: none;
}
.bd-form-item input:focus, .bd-form-item select:focus, .bd-form-item textarea:focus {
  border-color: var(--accent);
}

/* ===== BD Pipeline / Kanban View ===== */
.bd-view-bar {
  display: flex; align-items: center; gap: 12px; margin-bottom: 12px;
  flex-wrap: wrap;
}
.bd-view-tabs {
  display: flex; gap: 2px; background: #f5f5f4; border-radius: 8px; padding: 2px;
}
.bd-view-tab {
  padding: 6px 16px; font-size: 12px; font-weight: 500; color: #888780;
  border: none; background: none; border-radius: 6px; cursor: pointer;
  transition: all .15s;
}
.bd-view-tab:hover { color: #33322e; }
.bd-view-tab.active { background: #fff; color: #3D3D3D; box-shadow: 0 1px 2px rgba(0,0,0,.06); font-weight: 600; }

/* Pipeline (Kanban) */
.bd-pipeline {
  display: flex; gap: 10px; overflow-x: auto; padding-bottom: 8px;
  min-height: 400px;
}
.bd-pipeline-col {
  flex: 0 0 240px; display: flex; flex-direction: column; gap: 6px;
  background: #f9f9f8; border-radius: 10px; padding: 8px; min-height: 360px;
}
.bd-pipeline-col-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 4px 4px 8px; border-bottom: 1px solid #eee; margin-bottom: 4px;
}
.bd-pipeline-col-header .stage-label {
  font-size: 12px; font-weight: 600; color: #3D3D3D;
  display: flex; align-items: center; gap: 4px;
}
.bd-pipeline-col-header .stage-icon { font-size: 14px; }
.bd-pipeline-count {
  font-size: 11px; color: #888780; background: #fff; border-radius: 10px;
  padding: 1px 8px; font-weight: 600;
}
.bd-pipeline-cards {
  display: flex; flex-direction: column; gap: 6px; flex: 1;
}
.bd-pipeline-card {
  background: #fff; border: 1px solid #eee; border-radius: 8px;
  padding: 8px 10px; cursor: pointer; transition: all .15s;
  display: flex; flex-direction: column; gap: 4px;
}
.bd-pipeline-card:hover {
  border-color: #99D3D7; box-shadow: 0 2px 8px rgba(var(--accent-rgb),.1);
  transform: translateY(-1px);
}
.bd-card-company {
  font-size: 13px; font-weight: 600; color: #3D3D3D;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bd-card-title {
  font-size: 11px; color: #888780;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bd-card-meta {
  display: flex; gap: 6px; flex-wrap: wrap; font-size: 10px; color: #B4B2A9;
}
.bd-card-priority {
  font-size: 10px; font-weight: 600; padding: 1px 6px; border-radius: 4px;
}
.bd-card-priority.high { background: #fee2e2; color: #dc2626; }
.bd-card-priority.medium { background: #fef3c7; color: #d97706; }
.bd-card-priority.low { background: #e0f2fe; color: #0284c7; }
.bd-card-info {
  display: flex; gap: 8px; font-size: 10px; color: #B4B2A9;
}
.bd-card-info span { display: flex; align-items: center; gap: 2px; }
.bd-card-footer {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: 2px;
}
.bd-card-source {
  font-size: 10px; color: #888780; background: #f5f5f4;
  padding: 1px 6px; border-radius: 4px;
}
.bd-card-actions {
  display: flex; gap: 4px;
}
.bd-card-advance {
  font-size: 10px; padding: 2px 8px; border: 1px solid var(--accent);
  background: #fff; color: var(--accent); border-radius: 4px; cursor: pointer;
  transition: all .15s; white-space: nowrap;
}
.bd-card-advance:hover { background: var(--accent); color: #fff; }
.bd-card-advance:disabled { opacity: .4; cursor: not-allowed; }
.bd-pipeline-col-lost .bd-pipeline-card { opacity: 0.6; }

/* BD Lead List (updated) */
.bd-lead-body {
  padding: 0 12px 8px;
}
.bd-lead-date {
  font-size: 10px; color: #B4B2A9;
}

/* Stage Progress Bar (in detail modal) */
.bd-stage-progress {
  display: flex; align-items: center; gap: 0; margin: 16px 0;
  padding: 0 8px;
}
.bd-stage-dot {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  position: relative; z-index: 1; flex-shrink: 0;
}
.bd-stage-dot-icon {
  width: 28px; height: 28px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 600; transition: all .2s;
  background: #f5f5f4; color: #B4B2A9; border: 2px solid #e5e5e4;
}
.bd-stage-dot-icon.active {
  background: var(--accent); color: #fff; border-color: var(--accent);
}
.bd-stage-dot-icon.done {
  background: #22c55e; color: #fff; border-color: #22c55e;
}
.bd-stage-dot-icon.lost {
  background: #E7857D; color: #fff; border-color: #E7857D;
}
.bd-stage-dot-label {
  font-size: 10px; color: #888780; white-space: nowrap;
}
.bd-stage-dot.active .bd-stage-dot-label,
.bd-stage-dot.done .bd-stage-dot-label {
  color: #3D3D3D; font-weight: 600;
}
.bd-stage-line {
  flex: 1; height: 2px; background: #e5e5e4; min-width: 12px;
}
.bd-stage-line.done { background: #22c55e; }

/* KP Cards */
.bd-kp-card {
  background: #f9f9f8; border: 1px solid #eee; border-radius: 8px;
  padding: 8px 10px; display: flex; align-items: flex-start; gap: 8px;
  margin-bottom: 6px;
}
.bd-kp-header {
  flex: 1; display: flex; flex-direction: column; gap: 2px;
}
.bd-kp-name {
  font-size: 12px; font-weight: 600; color: #3D3D3D;
  display: flex; align-items: center; gap: 4px;
}
.bd-kp-info {
  font-size: 11px; color: #888780; display: flex; flex-wrap: wrap; gap: 6px;
}
.bd-kp-info span { display: flex; align-items: center; gap: 2px; }
.bd-kp-delete {
  background: none; border: none; color: #ccc; cursor: pointer;
  font-size: 14px; padding: 0 4px; transition: color .15s;
}
.bd-kp-delete:hover { color: #ef4444; }
.bd-kp-form {
  display: flex; flex-direction: column; gap: 6px;
  padding: 10px; background: #f9f9f8; border-radius: 8px; margin-top: 6px;
}
.bd-kp-form .kp-form-row {
  display: flex; gap: 6px; flex-wrap: wrap;
}
.bd-kp-form .kp-form-row input {
  flex: 1; min-width: 80px; padding: 5px 8px; font-size: 12px;
  border: 1px solid #e5e5e4; border-radius: 6px; outline: none;
}
.bd-kp-form .kp-form-row input:focus { border-color: var(--accent); }

/* ===== 系统内候选人 BD 入口 ===== */
.bd-entry-list { display: flex; flex-direction: column; gap: 6px; }
.bd-entry-card {
  background: #f9f9f8; border: 1px solid #eee; border-radius: 8px;
  padding: 8px 10px; display: flex; flex-direction: column; gap: 3px;
}
.bd-entry-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.bd-entry-name { font-size: 13px; font-weight: 600; color: #3D3D3D; }
.bd-entry-sub { font-size: 11px; color: #33322e; }
.bd-entry-match { font-size: 11px; color: var(--accent); }
.bd-entry-desc { font-size: 11px; color: #888780; }
.bd-entry-contact { font-size: 11px; color: #1D9E75; word-break: break-all; }
.bd-entry-actions { display: flex; gap: 6px; margin-top: 4px; flex-wrap: wrap; }

/* ===== 候选人人脉关系分析 ===== */
.rel-chip { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; padding: 3px 9px; border-radius: 14px; font-weight: 500; line-height: 1.4; }
.rel-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }

@media (max-width: 768px) {
  .bd-lead-list { grid-template-columns: 1fr; }
  .bd-detail-grid { grid-template-columns: 1fr; }
  .bd-form-grid { grid-template-columns: 1fr; }
  .bd-stats-row { flex-wrap: wrap; }
  .bd-stat-card { min-width: 80px; }
  .bd-pipeline-col { flex: 0 0 200px; }
  .bd-stage-progress { overflow-x: auto; padding-bottom: 4px; }
}

/* ===== 顾问关键动作表格（KPI 看板） ===== */
.kpi-actions-wrap {
  border: 1px solid #e5e5e4;
  border-radius: 10px;
  overflow: hidden;
  background: #fff;
}
.kpi-actions-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.kpi-actions-table th {
  text-align: center;
  padding: 10px 8px;
  border-bottom: 2px solid #e5e5e4;
  color: #888780;
  font-weight: 500;
  font-size: 11px;
  background: #fafaf9;
  white-space: nowrap;
}
.kpi-actions-table td {
  padding: 9px 8px;
  text-align: center;
  border-bottom: 1px solid #f1efe8;
  color: #3D3D3D;
  font-variant-numeric: tabular-nums;
}
.kpi-actions-metric {
  text-align: left !important;
  white-space: nowrap;
  border-right: 1px solid #f1efe8;
}
.kpi-actions-num { font-weight: 600; }
.kpi-actions-table tr:last-child td { border-bottom: none; }
.kpi-actions-table tr:hover td { background: #f7f6ff; }
.kpi-actions-table tr:hover .kpi-actions-metric { background: #f7f6ff; }

/* ===== 团队分组管理 ===== */
.team-card { border: 1px solid #E9F6F7; border-radius: 10px; background: #faf9ff; padding: 12px 14px; margin-bottom: 10px; }
.team-card-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.team-name { font-weight: 700; font-size: 14px; color: #225559; }
.team-leader { font-size: 12px; color: #666; }
.team-members { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.team-chip {
  display: inline-flex; align-items: center; gap: 4px;
  background: #EAFEFF; color: #225559;
  border-radius: 14px; padding: 3px 10px; font-size: 12px; font-weight: 500;
}

/* ===== 设置页：左侧菜单 + 右侧内容 ===== */
.settings-layout { display: flex; flex: 1; gap: 16px; min-height: 0; overflow: hidden; }
.settings-sidebar {
  width: 200px; flex-shrink: 0; background: #fff; border: 1px solid #e5e5e4; border-radius: 10px;
  padding: 10px; display: flex; flex-direction: column; gap: 4px; overflow-y: auto;
}
.settings-menu-item {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px; border-radius: 8px; cursor: pointer; font-size: 13px; color: #33322e;
  transition: all 0.15s;
}
.settings-menu-item:hover { background: #f5f5f4; color: #1a1a1a; }
.settings-menu-item.active { background: #EDFDFE; color: var(--accent); font-weight: 500; }
.settings-menu-icon { font-size: 15px; width: 20px; text-align: center; }
.settings-content { flex: 1; min-width: 0; display: flex; flex-direction: column; overflow-y: auto; }

/* 设置页横向标签 */
.settings-tabs {
  display: flex; gap: 4px; padding: 0 16px; border-bottom: 1px solid #e5e5e4;
  background: #fff; flex-shrink: 0;
}
.settings-tab {
  padding: 10px 18px; font-size: 13px; color: #33322e; cursor: pointer;
  border-bottom: 2px solid transparent; margin-bottom: -1px; transition: all 0.15s;
}
.settings-tab:hover { color: #1a1a1a; }
.settings-tab.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 500; }

/* 分类树工具栏与树体 */
.settings-tree-toolbar {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 16px; background: #fff; border-bottom: 1px solid #f1efe8; flex-shrink: 0; flex-wrap: wrap;
}
.settings-tree-hint { font-size: 12px; color: #888780; flex: 1; }
.settings-tree-actions { display: flex; align-items: center; gap: 8px; }
.settings-tree-body { flex: 1; overflow-y: auto; background: #fff; padding: 8px 0; }
.settings-tree-empty { color: #B4B2A9; font-size: 13px; padding: 20px 16px; }

/* 分类树节点 */
.settings-tree-node { }
.settings-tree-row {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 16px 6px 12px; min-height: 40px;
  border-bottom: 1px solid #f8f8f6; transition: background 0.1s;
}
.settings-tree-row:hover { background: #f9f9ff; }
.settings-tree-toggle {
  width: 18px; height: 18px; display: inline-flex; align-items: center; justify-content: center;
  font-size: 11px; color: #888780; cursor: pointer; border-radius: 4px; flex-shrink: 0;
}
.settings-tree-toggle:hover { background: #E9F6F7; color: var(--accent); }
.settings-tree-toggle.leaf { color: #c4c2bc; cursor: default; }
.settings-tree-drag {
  width: 16px; height: 18px; display: inline-flex; align-items: center; justify-content: center;
  font-size: 13px; color: #b8b5ad; cursor: grab; flex-shrink: 0; border-radius: 4px; user-select: none;
  touch-action: none;
}
.settings-tree-drag:hover { background: #f0eef8; color: var(--accent); }
.settings-tree-drag:active { cursor: grabbing; }
.settings-tree-row.drag-before { box-shadow: inset 0 2px 0 var(--accent); }
.settings-tree-row.drag-after { box-shadow: inset 0 -2px 0 var(--accent); }
.settings-tree-node.dragging > .settings-tree-row { opacity: 0.5; }
.settings-tree-input { width: 180px; flex-shrink: 0; padding: 5px 8px; font-size: 13px; }
.settings-tree-keys { flex: 1; min-width: 120px; padding: 5px 8px; font-size: 12px; color: #666; }
.settings-tree-btns { display: flex; gap: 6px; flex-shrink: 0; opacity: 0; transition: opacity 0.15s; }
.settings-tree-row:hover .settings-tree-btns { opacity: 1; }
.settings-tree-children { }



/* 候选人详情 · 系统留痕（审计流水） */
.audit-list { display: flex; flex-direction: column; gap: 10px; margin-top: 4px; }
.audit-item { display: flex; gap: 10px; align-items: flex-start; }
.audit-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); margin-top: 5px; flex-shrink: 0; }
.audit-body { flex: 1; min-width: 0; }
.audit-line { font-size: 12px; color: #2c2c2a; }
.audit-type { display: inline-block; font-size: 10px; font-weight: 600; color: var(--accent); background: var(--accent-t10); border-radius: 4px; padding: 1px 6px; margin-right: 6px; }
.audit-meta { font-size: 11px; color: #8a8a82; margin-top: 2px; }
.audit-actor { color: var(--accent); }

/* ===== KPI 报表 v20260811e：筛选栏 / 状态 chips / 列权重 ===== */
.kpi-filter-bar { display: flex; gap: 16px; flex-wrap: wrap; align-items: center; background: #faf9f6; border: 1px solid #ece9e2; border-radius: 10px; padding: 12px 14px; margin-top: 10px; }
.kpi-table-toolbar { display: flex; gap: 16px; flex-wrap: wrap; align-items: flex-end; margin-top: 12px; }
/**
 * ★ 批次 731（Randy 2026-10-15 参照谷露那张 KPI 页）：
 *   原来这里是 `flex-direction: column`（标签在上、控件在下）—— 于是"时间 / 时间类型"两格
 *   比左边的四个多选按钮**多出一行标签的高度**，同一行里高矮不一（Randy 截图里的红框就是这个）。
 *   现在统一成**一行**：标签在前、控件在后，整条筛选栏所有控件同高（34px）、同一水平线。
 */
.kpi-filter-item { display: flex; flex-direction: row; align-items: center; gap: 6px; }
.kpi-filter-label { font-size: 11px; color: #888780; font-weight: 500; white-space: nowrap; }
/* 高与字号都和多选按钮（.kpi-multi-trigger）对齐 —— 一行里不许高矮不一 */
.kpi-filter-select { min-width: 150px; height: 34px; padding: 0 8px; border: 1px solid #d9d5cc; border-radius: 6px; background: #fff; font-size: 13px; color: #2c2c2a; box-sizing: border-box; }
.kpi-status-group { display: flex; gap: 6px; }
.kpi-status-chip { padding: 6px 12px; border: 1px solid #d9d5cc; border-radius: 16px; background: #fff; color: #55534c; font-size: 12px; cursor: pointer; transition: all .15s; }
.kpi-status-chip:hover { border-color: var(--accent); color: var(--accent); }
.kpi-status-chip.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.kpi-col-weight { font-size: 9px; font-weight: 400; color: #b4b2a9; margin-top: 2px; }
/**
 * ★ 批次 536（Randy 2026-10-08）：「这一排列表用黑色字体，辅助的（比如升降序的箭头、权重说明）可以继续用灰色」
 *   全局 `th { color:#888780 }` 把 KPI 报表的**列名**也压成了灰；这里只把列名改回正常黑，
 *   箭头（`.kpi-sort-arrow` 内联色）与「权重 N」（`.kpi-col-weight`）**各有自己的灰色**，不受影响。
 */
.kpi-report-table thead th { font-size: 12px; vertical-align: bottom; color: #3F3E39; }
.kpi-report-table thead th .kpi-col-weight { color: #b4b2a9; }   /* 辅助信息继续灰（显式写一遍，防被上面那条继承覆盖） */

/* ===== KPI 报表 v20260811f：订阅分组 / 合格标签 / 目标行 / 筛选 chips ===== */
.kpi-sub-group { margin-bottom: 10px; }
.kpi-sub-group-title { font-size: 11px; font-weight: 700; color: #9c978a; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 6px; padding-left: 2px; }
.kpi-sub-builtin { background: #fff; }
.kpi-filter-chips { display: flex; gap: 6px; align-items: center; margin-top: 8px; flex-wrap: wrap; }
.kpi-filter-chip { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 12px; background: #e8f4f0; color: #085041; font-size: 11px; }
.kpi-filter-chip-hint { font-size: 11px; color: #888780; }
.kpi-chip-x { cursor: pointer; margin-left: 2px; font-weight: 700; color: #888780; font-style: normal; }
.kpi-chip-x:hover { color: #d0433c; }

/* —— KPI 多选筛选（点击触发器 → 搜索 + 勾选面板，OR 匹配） —— */
.kpi-multi { position: relative; display: inline-block; }
.kpi-multi-trigger { display: inline-flex; align-items: center; gap: 6px; padding: 6px 10px; min-height: 34px; box-sizing: border-box; border: 1px solid #dcd9d2; border-radius: 6px; background: #fff; color: #3a3936; font-size: 13px; cursor: pointer; transition: border-color .15s; }
.kpi-multi-trigger:hover { border-color: var(--accent); }
.kpi-multi.open .kpi-multi-trigger { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),.12); }
.kpi-multi-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 4px; background: var(--accent); color: #fff; border-radius: 8px; font-size: 10px; font-weight: 600; }
.kpi-multi-sum { color: #888780; font-size: 11px; }
.kpi-multi-arrow { color: #888780; font-size: 10px; transition: transform .15s; }
.kpi-multi.open .kpi-multi-arrow { transform: rotate(180deg); }
.kpi-multi-panel { position: absolute; top: calc(100% + 4px); left: 0; z-index: 60; width: 260px; background: #fff; border: 1px solid #e2dfd8; border-radius: 8px; box-shadow: 0 6px 24px rgba(30,28,24,.14); padding: 8px; }
.kpi-multi-search input { width: 100%; box-sizing: border-box; padding: 6px 10px; font-size: 12px; border: 1px solid #dcd9d2; border-radius: 6px; outline: none; background: #fff; color: #3a3936; }
.kpi-multi-search input:focus { border-color: var(--accent); }
.kpi-multi-list { max-height: 220px; overflow-y: auto; margin: 6px 0; }
.kpi-multi-item { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; cursor: pointer; font-size: 12px; color: #3a3936; }
.kpi-multi-item:hover { background: #f4f2ee; }
.kpi-multi-item.checked { color: var(--accent); font-weight: 500; }
.kpi-multi-item input[type="checkbox"] { accent-color: var(--accent); margin: 0; }
.kpi-multi-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kpi-multi-item-check { color: var(--accent); font-size: 12px; font-weight: 700; }
.kpi-multi-empty { padding: 12px; text-align: center; color: #aaa79f; font-size: 12px; }
.kpi-multi-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 6px; border-top: 1px solid #f0eee9; }
.kpi-multi-actions .btn-primary, .kpi-multi-actions .btn-secondary { padding: 4px 14px; font-size: 12px; }
.kpi-report-meta td { font-size: 10px; color: #9c978a; background: #f7f6f2; padding: 5px 8px; border-bottom: 1px solid #e5e5e4; }
.kpi-report-meta td:first-child { color: #A32D2D; font-weight: 600; }
.kpi-pass-tag { display: inline-block; margin-left: 6px; padding: 1px 5px; border-radius: 10px; font-size: 10px; font-weight: 600; }
.kpi-pass-tag.pass { background: #e8f4f0; color: #085041; }
.kpi-pass-tag.fail { background: #fbeaea; color: #A32D2D; }
/* KPI 数字穿透：可点击查看底层明细 */
.kpi-drill { cursor: pointer; display: inline-block; padding: 1px 5px; border-radius: 4px; transition: background .15s, color .15s; }
.kpi-drill:hover { background: var(--accent-t15); color: var(--accent); text-decoration: underline; }
/* KPI 穿透弹窗内：明细可点击穿透到具体对象 */
.kpi-entity-link { cursor: pointer; color: #2f6df0; font-weight: 600; border-bottom: 1px dashed #2f6df0; }
.kpi-entity-link:hover { color: #1a4fc0; background: #2f6df015; }
.kpi-entity-sub { font-size: 11px; color: #9c978a; margin-top: 2px; line-height: 1.35; }
.kpi-report-table td.kpi-score .kpi-drill { padding: 0 4px; }
.kpi-report-table th, .kpi-report-table td { min-width: 48px; }
.kpi-report-table th:nth-child(1), .kpi-report-table td:nth-child(1) { min-width: 100px; }
.kpi-report-table th:nth-child(2), .kpi-report-table td:nth-child(2) { min-width: 70px; }
.kpi-report-table th:nth-child(3), .kpi-report-table td:nth-child(3) { min-width: 90px; }

/* KPI 穿透弹窗宽表：与项目/项目详情弹窗等宽，内容可换行不截断，便于快速看清动作关键信息 */
table.kpi-table { width: 100%; border-collapse: collapse; font-size: 12.5px; color: #2b2b28; table-layout: auto; }
table.kpi-table th, table.kpi-table td { padding: 8px 10px; text-align: left; vertical-align: top; border-bottom: 1px solid #ececea; line-height: 1.4; }
table.kpi-table thead th { position: sticky; top: 0; background: #f4f3f7; color: var(--accent); font-weight: 700; white-space: nowrap; z-index: 2; border-bottom: 2px solid #B8DFE2; }
table.kpi-table tbody tr:hover { background: #f7f6fb; }
table.kpi-table td.kpi-c-time { white-space: nowrap; color: #6f6e68; font-variant-numeric: tabular-nums; }
table.kpi-table td.kpi-c-action { white-space: nowrap; color: #4a4a45; }
table.kpi-table td.kpi-c-min { white-space: nowrap; text-align: right; font-variant-numeric: tabular-nums; }
table.kpi-table td.kpi-c-note { color: #8a8780; font-size: 11.5px; min-width: 180px; }
table.kpi-table .kpi-entity-link { font-weight: 600; }
table.kpi-table .kpi-empty { text-align: center; color: #B4B2A9; padding: 18px; }

/* ===== 设置-用户管理二级目录子项 ===== */
.sidebar-subgroup-title { font-size: 11px; color: #a8a79f; padding: 10px 14px 4px; font-weight: 600; letter-spacing: 0.03em; }
.sidebar-subitem { padding-left: 30px; font-size: 12.5px; color: #33322e; }
.sidebar-subitem:hover { background: #f7f6fb; color: var(--accent); }
.sidebar-subitem.active { background: #EEFAFB; color: var(--accent); font-weight: 600; }

/* ===== 用户管理：表格与工具栏 ===== */
.admin-toolbar { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; flex-wrap: wrap; }
.admin-toolbar .form-input { max-width: 280px; }
.admin-count { font-size: 12px; color: #a8a79f; margin-left: 4px; }
.admin-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.admin-table th { text-align: left; padding: 9px 10px; border-bottom: 2px solid #e5e5e4; color: #888780; font-weight: 500; font-size: 11px; white-space: nowrap; }
.admin-table td { padding: 10px; border-bottom: 1px solid #f1efe8; vertical-align: middle; }
.admin-table tr:hover td { background: #fafaf9; }
.admin-table .row-actions { display: flex; gap: 6px; }
.admin-empty { color: #a8a79f; padding: 28px 0; text-align: center; font-size: 13px; }
.tag { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 11px; background: #EEFAFB; color: var(--accent); white-space: nowrap; }
.tag-green { background: #E6F4EA; color: #1E7E34; }
.tag-red { background: #FBE9E9; color: #A32D2D; }
.tag-gray { background: #f1f0ec; color: #888780; }
.tag-orange { background: #FDEFE0; color: #B5640B; }
.admin-muted { color: #a8a79f; }
.admin-multi-select { min-height: 90px; }

/* 用户快速设置齿轮按钮 */
.gear-btn {
  border: none; background: #f3f2ed; color: var(--accent); cursor: pointer;
  width: 30px; height: 30px; border-radius: 8px; font-size: 15px; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center; transition: background .15s;
}
.gear-btn:hover { background: #E3F5F6; }

/* 快速设置浮层菜单 */
.context-menu {
  background: #fff; border: 1px solid #e3e1d8; border-radius: 10px;
  box-shadow: 0 8px 28px rgba(40, 38, 30, 0.18); padding: 6px; min-width: 168px;
}
.context-menu .context-item {
  padding: 9px 12px; font-size: 13px; color: #2d2c28; cursor: pointer; border-radius: 7px;
  white-space: nowrap;
}
.context-menu .context-item:hover { background: #f5f4ef; }
.context-menu .context-item.danger { color: #A32D2D; }
.context-menu .context-item.danger:hover { background: #fbeaea; }

/* 人才文件夹（侧边栏 + 文件夹视图） */
.folder-item { display: flex; align-items: center; gap: 4px; }
.folder-name { flex: 1; min-width: 0; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; align-items: center; gap: 5px; }
.folder-name:hover { color: var(--accent); }
/**
 * ★ 批次 765（Randy：「人才文件夹右边的数字直接显示为数字就好，不要做阴影」）：
 *   那个"阴影"就是这里的灰底胶囊（`background:#f1efe8` + `border-radius:8px` + 左右内边距）。
 *   口径与批次 495 的侧栏角标**同一份**：「数字的背景色都删除，数字都用黑色正常字体标注」——
 *   所以去掉底色/圆角/内边距，字号与「订阅搜索」那一列的计数拉齐（12.5px / #3F3E39 / 等宽数字），
 *   一整列看过去就是**纯数字**，不再是一串灰药丸。
 */
.folder-count { font-size: 12.5px; color: #3F3E39; background: none; border-radius: 0; padding: 0; flex-shrink: 0; font-variant-numeric: tabular-nums; }
.folder-badge { font-size: 10px; padding: 1px 6px; border-radius: 8px; flex-shrink: 0; white-space: nowrap; }
.folder-badge.owner { color: var(--accent); background: var(--accent-t10); }
.folder-badge.editor { color: #085041; background: #08504110; }
.folder-badge.viewer { color: #B7791F; background: #B7791F14; }
.folder-gear { cursor: pointer; font-size: 13px; opacity: .55; flex-shrink: 0; }
.folder-gear:hover { opacity: 1; }
.folder-add { cursor: pointer; font-size: 15px; color: var(--accent); line-height: 1; font-weight: 700; }
.folder-add:hover { color: var(--accent-deep-2); }
.sidebar-subtitle { font-size: 11px; color: #B4B2A9; margin: 10px 0 4px; padding-left: 8px; }
.folder-cand-row { display: flex; align-items: center; gap: 12px; padding: 10px 8px; border-bottom: 1px solid #f1efe8; cursor: pointer; border-radius: 8px; }
.folder-cand-row:hover { background: #fafaf8; }
.folder-cand-main { flex: 1; min-width: 0; }
.folder-cand-name { font-size: 14px; font-weight: 500; }
.folder-cand-sub { font-size: 12px; color: #888780; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.folder-cand-remove { cursor: pointer; color: #B4B2A9; font-size: 18px; line-height: 1; flex-shrink: 0; padding: 0 6px; }
.folder-cand-remove:hover { color: #A32D2D; }
.folder-empty { color: #B4B2A9; font-size: 13px; padding: 18px 0; text-align: center; line-height: 1.6; }
.tf-swatch { width: 22px; height: 22px; border-radius: 50%; cursor: pointer; border: 2px solid transparent; box-shadow: 0 0 0 1px #e3e1d7 inset; }
.tf-swatch.active { border-color: #2d2c28; }

/* ===== 项目（项目）详情：头部信息行 + 横向 Tab ===== */
.job-info-row { display:flex;flex-wrap:wrap;gap:18px;align-items:center;margin-bottom:14px;padding:10px 12px;background:#fafaf8;border:1px solid #f1efe8;border-radius:10px }
.job-info-item { display:flex;align-items:center;gap:6px;font-size:13px }
.job-info-key { color:#B4B2A9;font-size:12px }
.job-info-val { color:#33322e;font-weight:500 }
/**
 * 项目团队 / 参与顾问的成员标签。
 * ★ 批次 737：这两个"人名列表"合并成一份后，颜色也要落到**系统用户名的统一口径**上 ——
 *   默认蓝 `#5E89EC`（语义色，不随个性化主题变），与 `.user-name` / `.cand-link` 一致；
 *   原来这里用 `var(--accent)`（主题青绿），人名在同一个页面里会出现两种颜色。
 */
.consultant-chip { display:inline-block;padding:2px 9px;margin:2px 3px 2px 0;border-radius:12px;background:#5E89EC14;color:#5E89EC;font-size:12px;font-weight:500 }
.job-tabs { display:flex;gap:4px;overflow-x:auto;padding-bottom:8px;margin-bottom:4px;border-bottom:1px solid #f1efe8 }
.job-tab { flex:0 0 auto;padding:8px 14px;font-size:13px;color:#33322e;background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;white-space:nowrap;border-radius:8px 8px 0 0 }
.job-tab:hover { background:#f6f5f1;color:var(--accent) }
.job-tab.active { color:var(--accent);font-weight:600;border-bottom-color:var(--accent);background:var(--accent-t08) }
.job-tab-panel { margin-top:6px }
.job-tab-panel[style*="display:none"] { display:none !important }

/* 岗位核心要素（手动填写 + AI 解析后的结构化展示） */
.core-elem-grid { display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:8px 18px;margin-top:2px }
.core-elem-row { display:flex;align-items:baseline;gap:6px;font-size:12px;padding:4px 0;border-bottom:1px dashed #f1efe8 }
.core-elem-key { color:#B4B2A9;flex:0 0 auto;min-width:56px }
.core-elem-val { color:#33322e;font-weight:500 }
.core-elem-label { font-size:12px;color:#B4B2A9;margin-bottom:4px;font-weight:500 }

/* 项目附件列表 */
.attach-list { display:flex;flex-direction:column;gap:8px }
.attach-item { display:flex;align-items:center;gap:8px;padding:8px 10px;background:#fff;border:1px solid #f1efe8;border-radius:8px }
.attach-icon { font-size:14px }
.attach-name { font-size:13px;color:var(--accent);text-decoration:none;font-weight:500 }
.attach-name:hover { text-decoration:underline }
.attach-meta { font-size:11px;color:#B4B2A9;margin-left:2px }
.attach-del { margin-left:auto;color:#B4B2A9;cursor:pointer;font-size:16px;line-height:1;padding:0 4px }
.attach-del:hover { color:#A32D2D }

/* ===== 项目 Mapping（候选人图谱，按公司/项目/进程/意向自动生成） ===== */
.map-ov { display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px }
.map-ov-chip { background:#faf9f5;border:1px solid #efece3;border-radius:10px;padding:8px 12px;display:flex;flex-direction:column;min-width:84px }
.map-ov-num { font-size:18px;font-weight:700;color:var(--accent-ink);line-height:1.1 }
.map-ov-lab { font-size:11px;color:#888780;margin-top:2px }
.map-dim { margin-bottom:16px }
.map-dim-title { font-size:13px;font-weight:600;color:#33322e;margin:0 0 8px;display:flex;align-items:center;gap:6px }
.map-dim-title .dim-line { flex:1;height:1px;background:#f1efe8 }
.map-group { background:#fff;border:1px solid #f1efe8;border-radius:10px;padding:8px 10px;margin-bottom:8px }
.map-group-head { font-size:13px;font-weight:600;color:var(--accent-ink);display:flex;align-items:center;gap:6px;margin-bottom:6px }
.map-group-head .map-count { background:var(--accent-t20);color:var(--accent);border-radius:10px;font-size:11px;padding:1px 8px;font-weight:600 }
.map-rows { display:flex;flex-direction:column;gap:4px }
.map-row { display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;cursor:pointer;transition:background .15s }
.map-row:hover { background:#f6f5f1 }
.map-name { font-size:13px;font-weight:500;color:var(--accent-ink) }
.map-sub { font-size:11px;color:#888780 }
.map-row .map-spacer { margin-left:auto }

/* ===== 角色化首页仪表盘（20260813j） ===== */
.dash-section-label { font-size: 12px; font-weight: 600; color: #33322e; margin: 18px 0 10px; display: flex; align-items: center; gap: 8px; }
.dash-section-label::before { content: ""; width: 3px; height: 13px; background: var(--accent); border-radius: 2px; }
.section-title { font-size: 15px; font-weight: 700; color: #2c2c2a; margin: 4px 0 2px; }
.tag-role { display: inline-block; background: #EDFDFE; color: var(--accent); font-size: 11px; padding: 2px 10px; border-radius: 10px; font-weight: 500; margin-right: 8px; }
.dash-team { margin-top: 10px; padding-top: 6px; }
.dash-team .dash-overview { grid-template-columns: repeat(5, 1fr); }
.dash-analysis { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; padding: 6px 2px; }
.dash-analysis-item { background: #fafaf8; border: 1px solid #f1efe8; border-radius: 10px; padding: 12px 14px; }
.dash-analysis-label { font-size: 12px; color: #888780; margin-bottom: 6px; }
.dash-analysis-value { font-size: 18px; font-weight: 700; color: var(--accent-ink); }
.dash-analysis-num { font-size: 12px; font-weight: 500; color: #BA7517; margin-left: 6px; }

/* 用户分析：内联于标题右侧，横向一行紧凑展示 */
.dash-analysis-inline { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dash-analysis-inline-head { font-size: 11px; font-weight: 600; color: #33322e; align-self: center; white-space: nowrap; }
.dash-analysis-inline .dash-analysis-item { padding: 6px 12px; min-width: 116px; }
.dash-analysis-inline .dash-analysis-item--last { min-width: 84px; }
.dash-analysis-inline .dash-analysis-label { font-size: 10.5px; margin-bottom: 3px; white-space: nowrap; }
.dash-analysis-inline .dash-analysis-value { font-size: 14px; white-space: nowrap; }
.dash-analysis-empty { font-size: 12px; color: #B4B2A9; align-self: center; }

/* 公司业绩排名：主页核心内容，左对齐、满宽、放大强调 */
.dash-rank-card {
  margin-top: 4px;
  border: 1px solid #B8E4E7;
  background: #fcfbff;
  box-shadow: 0 1px 4px rgba(var(--accent-rgb),0.07);
}
/**
 * ★ 批次 625（Randy）：「板面设计是**左边业绩排名、右边大单排名**，左右设计而不是上下排版」——
 *   两张榜并排：各占一半宽（flex:1 1 0），窄屏（<1100px）才折行，避免表格被压得看不清。
 */
.dash-rank-row { display: flex; gap: 12px; align-items: flex-start; }
.dash-rank-row > .dash-rank-card { flex: 1 1 0; min-width: 0; margin-top: 4px; margin-bottom: 0; }
@media (max-width: 1100px) {
  .dash-rank-row { flex-wrap: wrap; }
  .dash-rank-row > .dash-rank-card { flex: 1 1 420px; }
}
.dash-rank-card > .card-header {
  border-left: 4px solid var(--accent);
  padding: 14px 18px;
  margin-bottom: 6px;
}
.dash-rank-card .card-title {
  font-size: 16px;
  font-weight: 700;
  color: #2c2c2a;
  letter-spacing: 0;
  text-transform: none;
  margin-bottom: 0;
}
.dash-rank-card .table-wrap { padding: 0 8px 10px; }
.dash-rank-card table th,
.dash-rank-card table td { font-size: 13.5px; padding: 11px 12px; }
.dash-rank-card table th:first-child,
.dash-rank-card table td:first-child { width: 52px; padding-left: 16px; }
.dash-rank-card .dash-rank-no { font-size: 15px; }
/* 前三名奖牌底色（不与「我」高亮冲突：me 行仍走 .dash-rank-me） */
.dash-rank-card tr.dash-rank-1:not(.dash-rank-me) { background: #FFF8E6; }
.dash-rank-card tr.dash-rank-2:not(.dash-rank-me) { background: #F3F5F7; }
.dash-rank-card tr.dash-rank-3:not(.dash-rank-me) { background: #FBF0E7; }
.dash-rank-card tr.dash-rank-1:not(.dash-rank-me) td:first-child { box-shadow: inset 3px 0 0 #E0A73A; }
.dash-rank-card tr.dash-rank-2:not(.dash-rank-me) td:first-child { box-shadow: inset 3px 0 0 #B7BDC4; }
.dash-rank-card tr.dash-rank-3:not(.dash-rank-me) td:first-child { box-shadow: inset 3px 0 0 #C08A5E; }

/* ===== 协同（跨团队项目协作，20260814a） ===== */
/**
 * ★ 批次 651（Randy 2026-10-11，最终口径）：
 *   > 「让『请求协同中』这些**随着列宽拖动根据大小换行**」——
 *   所以这里**不再**强制 `white-space:nowrap`（那是我批次 649 为了塞下切分文字加的），
 *   按钮文字跟着列宽自然换行/收缩；切分备注已经从这一格删掉（见 `_collabBtnHtml`）。
 */
.collab-btn { display:inline-flex;align-items:center;gap:3px;margin-right:8px;padding:2px 9px;border:1px solid #d3d1c7;background:#fff;border-radius:12px;font-size:11px;color:#33322e;cursor:pointer;vertical-align:middle;transition:all .15s }
.collab-btn:hover { border-color:var(--accent);color:var(--accent) }
.collab-btn.active { background:var(--accent);border-color:var(--accent);color:#fff }
.collab-close-btn { border-color:#E3A9A9;color:#C0392B;background:#FCEDED }
.collab-close-btn:hover { border-color:#E7857D;color:#C0392B;background:#F6D5D5 }
.nav-badge { display:inline-block;min-width:16px;height:16px;line-height:16px;padding:0 4px;margin-left:3px;background:#E7857D;color:#fff;border-radius:9px;font-size:10px;text-align:center;vertical-align:middle }
.collab-grid { display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;padding:16px }
/* 批次 917（Randy）：协同项目方块恢复有色底，读/未读用不同底色区分 */
.collab-card {
  padding:14px 16px;border-radius:10px;background:linear-gradient(180deg,#F4FAFB 0%,#FBFDFD 70%);
  border:1px solid #D8EBEC;border-left:3px solid #9FD2D5;
  box-shadow:0 1px 4px rgba(8,144,152,.06);transition:box-shadow .15s,border-color .15s;
}
.collab-card:hover { border-color:#BFE3E6;box-shadow:0 3px 10px rgba(8,144,152,.10) }
.collab-card.collab-unread {
  background:linear-gradient(180deg,#FFF9EE 0%,#FFFDF9 70%);
  border-color:#F0DFC2;border-left-color:#E9A23B;
}
.collab-card-head { display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:nowrap }
.collab-tags-inline { display:flex;flex-wrap:wrap;gap:5px;align-items:center;min-width:0;flex:1 }
/* 批次 916：已读/加入支援横向并排，不再竖着挤成两行 */
.collab-head-actions { display:flex;align-items:center;gap:6px;flex:0 0 auto;flex-wrap:nowrap }
.collab-head-actions .btn-sm { white-space:nowrap }
/* 批次 916：NEW 加强，一眼能看到 */
.collab-new-strong {
  display:inline-flex;align-items:center;gap:3px;padding:1px 8px;border-radius:10px;
  background:#D8453A;color:#fff;font-size:10.5px;font-weight:700;letter-spacing:.4px;
  box-shadow:0 0 0 3px rgba(216,69,58,.14);animation:collabNewPulse 1.6s ease-in-out infinite;
}
@keyframes collabNewPulse {
  0%,100% { box-shadow:0 0 0 3px rgba(216,69,58,.14) }
  50% { box-shadow:0 0 0 5px rgba(216,69,58,.22) }
}
.tag-collab { background:#E8F0FE;color:#1A56DB }
/* v20260908x：协同状态四态配色——协同中=绿（已锁定/交付）；待确认=蓝（有人支援后等确认）；请求协同中·继续协同=红（仍招募/关注） */
.tag-collab-active { background:#EAF3DE;color:#3B6D11;border:1px solid #CDE6B0 }
.tag-collab-pending { background:#E8F0FE;color:#1A56DB;border:1px solid #B8D4F7 }
.tag-collab-request { background:#FCEBEB;color:#A32D2D;border:1px solid #F1C9C9 }
.tag-collab-continuing { background:#FCEBEB;color:#A32D2D;border:1px solid #F1C9C9 }
.collab-btn.active.is-active { background:#EAF3DE;border-color:#CDE6B0;color:#3B6D11 }
.collab-btn.active.is-pending { background:#E8F0FE;border-color:#B8D4F7;color:#1A56DB }
.collab-btn.active.is-request { background:#FCEBEB;border-color:#F1C9C9;color:#A32D2D }
.collab-btn.active.is-continuing { background:#FCEBEB;border-color:#F1C9C9;color:#A32D2D }
/* 批次 179 的 `.collab-ratio` 徽标 / 批次 650 的 `.collab-ratio-line` 小字都已按 Randy 的要求移除：
   协同列这一格现在只显示状态按钮（切分信息在「协同」模块的卡片上明牌展示）。 */
/* 批次 180：协同项目卡片上的「悬赏业绩切分」条（发布后在协同模块里明牌显示） */
.job-copy-link { display:inline-flex;align-items:center;justify-content:center;min-width:30px;padding:1px 7px;font-size:13px;line-height:1.6;vertical-align:middle }
/* 批次 182（Randy）：输入框右侧的固定单位（如「年」「万」），不占数据、只是显示 */
.input-unit-wrap { position:relative;display:block }
.input-unit-wrap input { padding-right:34px }
.input-unit { position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:12px;color:#888780;pointer-events:none;user-select:none }
/* 批次 188：候选人合并页面（三列对照：A / B / 预览合并效果） */
.cmp-warn { background:#FCEBEB;border:1px solid #F1C9C9;color:#A32D2D;border-radius:8px;padding:8px 12px;font-size:12px;margin-bottom:10px }
.cmp-wrap { max-height:62vh;overflow:auto;border:1px solid #ecebe3;border-radius:8px }
.cmp-table { width:100%;border-collapse:collapse;font-size:12px }
.cmp-table thead th { position:sticky;top:0;background:#faf9f5;text-align:left;padding:8px 10px;border-bottom:1px solid #ecebe3;font-weight:600;z-index:1 }
.cmp-table thead th small { display:block;color:#888780;font-weight:400;font-size:10px }
.cmp-table td, .cmp-table th.cmp-row-lab { padding:8px 10px;border-bottom:1px solid #f0efe8;vertical-align:top;font-weight:400 }
.cmp-row-lab { width:96px;color:#33322e;background:#fcfcf9;white-space:nowrap }
.cmp-item { display:flex;align-items:flex-start;gap:6px;margin:2px 0;cursor:pointer;line-height:1.5 }
.cmp-item input { margin-top:3px }
.cmp-empty { color:#B4B2A9 }
.cmp-prev { background:#f7fbf9 }
.cmp-pv-line { padding:1px 0 }
/**
 * 批次 582（Randy 2026-10-09）：
 *   ① 「两个候选人名字上面也把编号显示出来」—— 列头顶上那一行亮编号（同名档案全靠它区分）；
 *   ② 「底下勾选的经历和内容都支持多选」—— 能多选的行在行名旁标一个小标签，不再让人以为只能选一个。
 */
.cmp-head-code { display:block;color:var(--accent);font-weight:700;font-size:11px;margin-bottom:2px;letter-spacing:0.02em }
.cmp-multi-hint { display:inline-block;margin-left:6px;font-size:10px;font-weight:400;color:var(--accent);background:var(--accent-t12);border:1px solid var(--accent-t33);border-radius:8px;padding:0 5px;vertical-align:middle }
/* 批次 192：手机号旁的「＋」（一个人可以挂多个号码） */
.phone-add-btn { margin-left:6px;padding:0 7px;border:1px solid var(--accent-t55);background:#fff;color:var(--accent);border-radius:8px;font-size:12px;line-height:18px;cursor:pointer }
.phone-add-btn:hover { background:var(--accent-t0f) }
/* 批次 195：多手机号（主号 + 备用号，每号可设主/删除） */
.phone-list { display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center }
/* 批次 204：手机号**横向排**（不再竖着堆高整行）；号码多时自动换行 */
.glance-item .phone-list { flex-wrap:wrap }
/**
 * ★ 批次 486（Randy：「UI 设计美感提升一下，能不能不要那么多框框」＋截图里那个"套娃"电话格）：
 *   原来一个手机号是「外圈胶囊 + 里面再套一个"主号"小框」两层边框，列表里看着像一堆螺丝帽。
 *   现在把两层框都去掉：号码就是普通文字，"主号"只留一点点浅底色做提示；
 *   要操作（设主/删除）时才在悬停时浮出来 —— 视觉干净，功能一个没少。
 */
.phone-pill { display:inline-flex;align-items:center;gap:5px;padding:0;border:none;border-radius:0;background:transparent }
.phone-pill.is-main { border:none;background:transparent }
.phone-main-tag { font-size:10px;color:var(--accent);background:var(--accent-t14);border:none;border-radius:4px;padding:1px 5px;letter-spacing:.3px }
.phone-mini { border:none;background:transparent;color:var(--accent);font-size:11px;cursor:pointer;padding:0 2px }
.phone-mini.danger { color:#A32D2D }
/* 批次 196：首页顶栏「每天一句」正能量（同一天所有人同一句，跨天自动换） */
/* 批次 197/198（Randy）：金句要"居中"，但**不能**用绝对定位（容器只有内容宽 → 会压到左边目录上）。
   改成 flex 三件套：目录不缩 → 金句区吃满剩余宽度并居中 → 窄屏自动省略号，永不重叠。 */
.home-tabs { display:flex;align-items:center;gap:10px;width:100%;position:relative }
.home-tabs-left { display:flex;align-items:center;gap:10px;flex:0 0 auto }
.home-quote-wrap { flex:1 1 auto;display:flex;justify-content:center;min-width:0 }
/**
 * ★ 批次 198（修 bug）：居中方式定稿 ——
 *   容器（.home-tabs）现在**占满整行宽**，所以 `left:50%` 是**真正的整行正中**；
 *   `max-width: calc(50% - 200px)` 保证左边缘永远离中线 ≥200px（左侧目录一般 ~180px 宽）→ **不可能再压到目录上**；
 *   宽度不够时文字自动省略号，不会换行、不会溢出。
 *   （`.home-quote-wrap` 仍保留在 DOM 里做兜底：万一将来有人去掉绝对定位，flex 也能正常居中。）
 */
.home-quote { position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:6px;
  max-width:calc(50% - 186px);min-width:0;padding:3px 12px;border-radius:14px;
  background:linear-gradient(90deg,var(--accent-t12),var(--accent-t04));border:1px solid var(--accent-t1f);cursor:pointer;user-select:none }
.home-quote:hover { background:linear-gradient(90deg,var(--accent-t1c),var(--accent-t0a)) }
/* 批次 203：普通用户只读形态 —— 不显示手型、hover 也不变色（就是一句展示的话） */
.home-quote.readonly { cursor:default }
.home-quote.readonly:hover { background:linear-gradient(90deg,var(--accent-t12),var(--accent-t04)) }
.home-quote-mark { color:var(--accent);font-size:12px }
.home-quote-text { font-size:12.5px;color:#3d5a58;white-space:normal;overflow:visible;text-overflow:clip;min-width:0;line-height:1.3 }
.home-quote-from { font-size:11px;color:#8a9a99;white-space:nowrap }
/* 批次 200：金句旁两颗小按钮（↻ 下一句 / ✎ 编辑）—— 平时淡、hover 变清楚，不抢主体 */
.home-quote-btns { display:inline-flex;align-items:center;gap:4px;margin-left:2px }
.home-quote-btn { font-size:11px;color:var(--accent);border:1px solid var(--accent-t33);border-radius:6px;padding:0 5px;line-height:16px;
  white-space:nowrap;opacity:.6;cursor:pointer;transition:opacity .15s,background .15s }
.home-quote:hover .home-quote-btn { opacity:1 }
.home-quote-btn:hover { background:var(--accent-t14);opacity:1 }
.home-quote-btn.edit { border-color:#C08A2A55;color:#8A5A00 }
.home-quote-btn.edit:hover { background:#F3D9AE33 }
.collab-bonus-bar { margin-top:8px;padding:6px 10px;border-radius:8px;background:#FFF4E5;border:1px solid #F3D9AE;color:#8A5A00;font-size:12px;cursor:help }
.collab-bonus-bar b { color:#7A4E00 }
.collab-bonus-note { color:#A08050;font-size:11px }
/* 批次 913：协同卡片展示发起人的补充备注（替代旧的悬赏切分条） */
.collab-note-bar { margin-top:8px;padding:6px 10px;border-radius:8px;background:#F4F8FD;border:1px solid #D9E6F5;color:#35658f;font-size:12px;white-space:pre-wrap }
.collab-title { font-weight:600;font-size:15px;margin:8px 0 2px;cursor:pointer;color:#2c2c2a }
.collab-title:hover { color:#1A56DB }
/* ★ 批次 644（Randy）：「协同模块中，把评级放在职位名称的后面」——
   紧跟标题的小字（浅灰、不加粗，不抢标题），里面的评级字母本身仍是 A红/B绿/C黄 */
.collab-title-rating { font-size:11.5px;font-weight:400;color:#8a8a82;margin-left:8px;white-space:nowrap }
.collab-meta { font-size:12px;color:#888780 }
.collab-core { margin-top:8px;background:#faf9f5;border:1px solid #efece3;border-radius:8px;padding:8px 10px;max-height:104px;overflow:auto }
.collab-core-label { font-size:11px;color:#9b988e;margin-bottom:3px;font-weight:600 }
.collab-core { font-size:12px;line-height:1.65;color:#33322e;white-space:pre-wrap;word-break:break-word }
.collab-supporters { margin-top:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap }
.supporter-chip { padding:2px 10px;height:24px;border-radius:12px;background:var(--accent-t14);color:var(--accent);font-size:12px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;white-space:nowrap }
.supporter-label { font-size:12px;color:#33322e;margin-right:2px }
.supporter-count { font-size:12px;color:#33322e;margin-left:4px }

/* ===== 协同申请待处理（创建者视角，20260815j） ===== */
.collab-applicants { margin-top:10px;border-top:1px dashed #e5e5e4;padding-top:8px;display:flex;flex-direction:column;gap:6px }
.collab-applicants-head { font-size:11px;color:#C0392B;font-weight:600;margin-bottom:2px }
.collab-applicant-row { display:flex;align-items:center;justify-content:space-between;gap:8px;background:#FCEDED;border:1px solid #F1D4D4;border-radius:8px;padding:5px 8px }
.collab-applicant-name { font-size:12px;color:#7a2e2e;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis }
.collab-applicant-actions { display:flex;gap:5px;flex-shrink:0 }
.btn-xs { border:1px solid #d3d1c7;background:#fff;color:#33322e;font-size:11px;font-weight:600;border-radius:6px;padding:3px 9px;cursor:pointer;line-height:1.4 }
.btn-xs:hover { border-color:var(--accent-bright);color:var(--accent) }
.btn-xs-ok { border-color:#A8D5B5;color:#1E7E34;background:#EDF8F0 }
.btn-xs-ok:hover { background:#DCEFD8;color:#16632A }
.btn-xs-no { border-color:#E3A9A9;color:#C0392B;background:#FCEDED }
.btn-xs-no:hover { background:#F6D5D5;color:#9A2828 }

/* ===== 协同页左侧「相关项目推荐」模块（20260815j） ===== */
.collab-page { display:flex;gap:18px;align-items:flex-start }
.collab-reco-side { width:288px;flex-shrink:0;align-self:flex-start;position:sticky;top:18px;
  background:#fff;border:1px solid #ece9df;border-radius:14px;padding:16px;box-shadow:0 2px 10px rgba(60,55,45,.05) }
.collab-reco-head { font-size:14px;font-weight:700;color:#2c2c2a;display:flex;align-items:center;gap:6px }
.collab-reco-sub { font-size:11px;color:#9b988e;margin:4px 0 12px }
.collab-reco-list { display:flex;flex-direction:column;gap:10px;max-height:62vh;overflow:auto }
.reco-item { border:1px solid #efece3;border-radius:10px;padding:10px 11px;background:#faf9f5 }
.reco-title { font-weight:600;font-size:13px;color:#2c2c2a;cursor:pointer }
.reco-title:hover { color:#1A56DB }
.reco-meta { font-size:11px;color:#888780;margin-top:2px }
.reco-match { font-size:11px;color:#2E9E5B;margin-top:4px;font-weight:600 }
.collab-reco-empty { font-size:12px;color:#B4B2A9;padding:10px 2px }

/* ===== 协同页：左侧两个独立子模块（协同项目 / 推荐协同，20260816） ===== */
.collab-page-split { display:flex;gap:18px;align-items:flex-start;padding:16px }
.collab-leftnav { width:236px;flex-shrink:0;position:sticky;top:18px;align-self:flex-start }
.collab-main { flex:1;min-width:0 }
.collab-subnav { background:#fff;border:1px solid #ece9df;border-radius:14px;padding:10px;box-shadow:0 2px 10px rgba(60,55,45,.05);display:flex;flex-direction:column;gap:6px }
.collab-subnav-item { display:flex;gap:10px;align-items:flex-start;padding:11px 12px;border-radius:10px;cursor:pointer;transition:background .15s,border-color .15s;border:1px solid transparent }
.collab-subnav-item:hover { background:#f6f5f0 }
.collab-subnav-item.active { background:#ECFAFB;border-color:#A4E0E5 }
.collab-subnav-icon { font-size:18px;line-height:1.3;flex-shrink:0 }
.collab-subnav-label { font-weight:600;font-size:13px;color:#2c2c2a }
.collab-subnav-desc { font-size:11px;color:#9b988e;margin-top:2px;line-height:1.4 }
.collab-projects-card, .collab-reco-card { margin:0 }
.collab-reco-card .collab-grid { align-content:start }

/* ===== 项目详情页：项目名下方显示项目状态（20260816） ===== */
.job-detail-statusline { margin-top:7px;display:flex;gap:6px;flex-wrap:wrap;align-items:center }

/* ===== 评级分段控件（客户评级 / 项目评级，ABC 三档，20260814s） ===== */
.rating-seg { display:inline-flex;border:1px solid #d3d1c7;border-radius:8px;overflow:hidden;vertical-align:middle }
.rating-opt { appearance:none;border:0;background:#fff;color:#33322e;font-size:13px;font-weight:600;padding:6px 18px;cursor:pointer;transition:all .15s }
.rating-opt + .rating-opt { border-left:1px solid #e7e5dc }
.rating-opt:hover { background:#f3f2ee }
.rating-opt[data-v="A"] { color:#2E9E5B }
.rating-opt[data-v="B"] { color:#BA7517 }
.rating-opt[data-v="C"] { color:#8A8A82 }
.rating-opt.active { color:#fff }
.rating-opt.active[data-v="A"] { background:#2E9E5B }
.rating-opt.active[data-v="B"] { background:#BA7517 }
.rating-opt.active[data-v="C"] { background:#8A8A82 }
/**
 * 评级字母（A/B/C）
 * ★ 批次 642（Randy 2026-10-11）：「把 A 变成**红色（系统用的红色）**、B **绿色**，
 *   然后**不要做有底色的**，就写对应颜色的**字母**就好」。
 *   系统口径色：红 = #A32D2D（`.tag-red` / `.danger` / 必填星号 同一个红），
 *              绿 = #1D9E75（`.job-status-successful` / `.lib-tag-green` 同一个绿），
 *              C 用系统琥珀 #BA7517（与谷露那两列的颜色编码一致：A 红 / B 绿 / C 黄）。
 */
.rate-badge { display:inline-flex;align-items:center;font-size:12px;font-weight:700;padding:0;border-radius:0;margin-right:6px;background:none }
.rate-badge.rate-A { background:none;color:#A32D2D }
.rate-badge.rate-B { background:none;color:#1D9E75 }
.rate-badge.rate-C { background:none;color:#BA7517 }

/* ===== 设置页 · 系统概览（20260815c） ===== */
/**
 * ★ 批次 797（Randy 2026-10-17）：「把这个模块排版优化一下排成一行」
 *   原来 `repeat(auto-fit,minmax(180px,1fr))` 在常见宽度下只能放 5 张卡 → 第 6 张（账号总数）掉到第二行，
 *   看着像"多出来的一张"。现在**固定 6 列一行**（`minmax(0,1fr)` 让卡片等比收窄，不再换行）；
 *   窄屏按 3 列 / 2 列降级，手机上仍然能看。
 */
.overview-grid { display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;padding:16px }
/* 一行 6 张卡时每张更窄：图标与内边距收一档，数字不再被挤断 */
.overview-grid .stat-card { padding:12px 14px;gap:10px }
.overview-grid .stat-icon { width:40px;height:40px;font-size:19px;border-radius:10px }
.overview-grid .stat-num { font-size:17px }
.overview-grid .stat-label { font-size:11.5px }
/* ============================================================================
   ★ 批次 799（Randy 2026-10-17）：「这个页面的排版设计优化一下，感觉框太大或者说文字
     和框边距太大，还有那个叉做小一点」
   —— 手动录入候选人这个弹窗：输入框统一收成 34px 高（原来 40+，显得"框大、字小、空隙多"），
      标签与输入框间距 2px，行间距 9px，按钮区 14px；叉号在本弹窗再小一档（24px）。
      ⚠️ 只作用于这个弹窗（`.manual-cand-modal`），不动其它表单页。 */
.manual-cand-modal { max-width: 480px; }
.manual-cand-modal .modal-title { font-size: 16px; margin-bottom: 2px; }
.manual-cand-modal .ma-desc { padding: 0 0 8px; font-size: 11.5px; color: #888780; line-height: 1.6; }
.manual-cand-modal .form-label { font-size: 11.5px; margin-bottom: 2px; }
/**
 * ★ 批次 805（Randy）：「排版铺的更满一些，红框空白处太宽了」
 *   真因：`.form-input` 没有 width，`<input>` 是 inline-block → 只按默认宽度画，
 *   于是右边（和名字那一行）留出一大片空白。这里统一 100% 撑满，并把"名字 + 类型"并到一行。
 */
.manual-cand-modal .form-input {
  width: 100%; box-sizing: border-box;
  height: 34px; padding: 5px 9px; font-size: 13px;
}
.manual-cand-modal .ma-row { display: flex; gap: 10px; margin-top: 9px; width: 100%; flex-wrap: nowrap; }
.manual-cand-modal .ma-row > * { min-width: 0; }
.manual-cand-modal .ma-actions { display: flex; gap: 8px; margin-top: 14px; justify-content: flex-end; }
.manual-cand-modal .modal-close { width: 24px; height: 24px; font-size: 14px; box-shadow: 0 1px 4px rgba(0,0,0,.10); }
@media (max-width: 1400px) { .overview-grid { grid-template-columns:repeat(3,minmax(0,1fr)) } }
@media (max-width: 760px) { .overview-grid { grid-template-columns:repeat(2,minmax(0,1fr)) } }
.stat-card { display:flex;align-items:center;gap:14px;padding:16px;border:1px solid #ece9df;border-radius:12px;background:#fff;transition:box-shadow .15s,transform .15s }
.stat-card:hover { box-shadow:0 4px 14px rgba(60,55,45,.08);transform:translateY(-1px) }
.stat-icon { width:46px;height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0 }
.stat-body { min-width:0 }
/* ★ 批次 706（Randy 2026-10-13，系统概览截图）：「红框内字体调整到正常大小」——
   这几个统计数字原来是 26px/700，比整页（13px 基准、标题 16~18px）突兀得多；
   现在收到 18px/600（与页面里的数字标题同一档），并加 nowrap ——「91.69 MB」这种带空格的
   数值不再折成两行把卡片撑高。 */
.stat-num { font-size:18px;font-weight:600;line-height:1.25;letter-spacing:.2px;white-space:nowrap }
.stat-label { font-size:12px;color:#888780;margin-top:3px;white-space:nowrap }
.legend { display:flex;flex-direction:column;gap:9px;font-size:13px;color:#33322e }
.legend-item { display:flex;align-items:center;gap:8px }
/* ★ 批次 766（Randy：「设置概览页重新做」）：新增趋势的分档切换 + 活跃度动作类型的小标签。
   分档按钮照谷露那种"小圆角方块"的观感（与分页条同样的 12.5px 字号），当前档用品牌色描边。 */
.ov-gtab { display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:26px;padding:0 10px;
  border:1px solid #E0E0E0;border-radius:8px;background:#fff;font-size:12.5px;color:#3F3E39;cursor:pointer;user-select:none }
.ov-gtab:hover { border-color:var(--accent);color:var(--accent) }
.ov-gtab.active { border-color:var(--accent);color:#fff;background:var(--accent);font-weight:600 }
.ov-chip { display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;background:#F5F4EF;
  font-size:12.5px;color:#3F3E39 }
.ov-chip b { color:var(--accent) }
.ov-bar rect { transition:opacity .15s }
.ov-bar:hover rect { opacity:1 }
.legend-dot { width:10px;height:10px;border-radius:50%;display:inline-block;flex-shrink:0 }


/* ===== 全屏登录页（20260902bg 科技感重设计） ===== */
.login-screen {
  position: fixed;
  inset: 0;
  z-index: 99999;
  display: none;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
  background: #fff;
}
.login-screen.show { display: flex; }

/* ---- 左侧品牌区 ---- */
.login-left {
  flex: 1 1 46%;
  min-width: 400px;
  background:
    radial-gradient(1100px 620px at 12% -12%, rgba(45, 212, 230, 0.38) 0%, transparent 52%),
    radial-gradient(800px 500px at 100% 110%, rgba(6, 182, 212, 0.30) 0%, transparent 48%),
    linear-gradient(158deg, #0A6C72 0%, var(--accent-2) 46%, var(--accent-3) 100%);
  color: #fff;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding: 48px;
  position: relative;
  overflow: hidden;
}
/* 蓝图网格 */
.login-grid {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,0.055) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,0.055) 1px, transparent 1px);
  background-size: 46px 46px;
  -webkit-mask-image: radial-gradient(ellipse at center, #000 25%, transparent 76%);
  mask-image: radial-gradient(ellipse at center, #000 25%, transparent 76%);
  pointer-events: none;
}
/* 漂浮光斑 */
.login-orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(70px);
  pointer-events: none;
  opacity: 0.55;
}
.login-orb-a { width: 440px; height: 440px; top: -140px; right: -110px; background: rgba(45, 212, 230, 0.38); animation: loginOrb 16s ease-in-out infinite; }
.login-orb-b { width: 340px; height: 340px; bottom: -120px; left: -90px; background: rgba(255, 255, 255, 0.20); animation: loginOrb 22s ease-in-out infinite reverse; }
.login-orb-c { width: 230px; height: 230px; top: 42%; left: 16%; background: rgba(6, 182, 212, 0.32); animation: loginOrb 13s ease-in-out infinite; }
@keyframes loginOrb {
  0%, 100% { transform: translate(0, 0) scale(1); }
  50% { transform: translate(34px, -30px) scale(1.08); }
}
/* 斜向流光扫过 */
.login-scan {
  position: absolute;
  inset: 0;
  background: linear-gradient(115deg, transparent 34%, rgba(255,255,255,0.09) 48%, transparent 62%);
  background-size: 260% 260%;
  animation: loginScan 7s ease-in-out infinite;
  pointer-events: none;
}
@keyframes loginScan {
  0% { background-position: 110% 0; }
  100% { background-position: -110% 0; }
}
.login-left-content {
  position: relative;
  z-index: 1;
  max-width: 460px;
  text-align: center;
}
.login-left-logo { margin-bottom: 26px; }
.login-left-logo-img {
  height: 58px;
  width: auto;
  max-width: 250px;
  object-fit: contain;
  filter: drop-shadow(0 4px 14px rgba(0,0,0,0.18));
}
.login-left-title {
  font-size: 40px;
  font-weight: 800;
  margin-bottom: 12px;
  letter-spacing: 0.03em;
  text-shadow: 0 2px 12px rgba(0,0,0,0.16);
}
.login-left-subtitle {
  font-size: 16px;
  font-weight: 500;
  opacity: 0.96;
  margin-bottom: 4px;
  letter-spacing: 0.01em;
}
.login-left-sub2 {
  font-size: 13px;
  opacity: 0.72;
  letter-spacing: 0.06em;
  margin-bottom: 30px;
}
.login-left-badges {
  display: flex;
  justify-content: center;
  gap: 10px;
  flex-wrap: wrap;
}
.login-left-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 15px;
  border: 1px solid rgba(255,255,255,0.32);
  border-radius: 999px;
  font-size: 12.5px;
  letter-spacing: 0.02em;
  background: rgba(255,255,255,0.10);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: background .2s, border-color .2s;
}
.login-left-badge svg { flex: 0 0 auto; }
.login-left-badge:hover { background: rgba(255,255,255,0.18); border-color: rgba(255,255,255,0.5); }
/* 关键数据 */
.login-metrics {
  margin-top: 46px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 30px;
}
.login-metric { display: flex; flex-direction: column; align-items: center; gap: 5px; }
.login-metric-num {
  font-size: 27px;
  font-weight: 800;
  letter-spacing: 0.01em;
  font-variant-numeric: tabular-nums;
  /* v20260902bh：等宽字体（mono）—— 终端/代码风格的科技感 */
  font-family: ui-monospace, 'JetBrains Mono', 'SF Mono', 'Cascadia Mono', Menlo, Consolas, monospace;
}
.login-metric-label { font-size: 12px; opacity: 0.72; letter-spacing: 0.04em; }
.login-metric-divider { width: 1px; height: 38px; background: rgba(255,255,255,0.24); }

/* ---- 右侧表单区 ---- */
.login-right {
  flex: 1 1 54%;
  min-width: 460px;
  background: #fff;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  position: relative;
}
.login-right::before {
  content: '';
  position: absolute;
  inset: 0;
  background-image: radial-gradient(circle at 100% 0%, rgba(8,144,152,0.05) 0%, transparent 42%);
  pointer-events: none;
}
.login-right-top {
  padding: 22px 36px;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: 14px;
  position: relative;
  z-index: 1;
}
/* v20260902bh：系统状态心跳点 —— 科技感点缀 */
.login-status {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 12px;
  border-radius: 999px;
  background: rgba(15, 118, 110, 0.07);
  border: 1px solid rgba(15, 118, 110, 0.18);
  font-size: 12px;
  color: #0F766E;
  font-family: ui-monospace, 'JetBrains Mono', 'SF Mono', 'Cascadia Mono', Menlo, Consolas, monospace;
  letter-spacing: 0.02em;
}
.login-status-dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: #10b981;
  box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.6);
  animation: loginPulse 1.8s infinite;
}
@keyframes loginPulse {
  0%   { box-shadow: 0 0 0 0 rgba(16,185,129,0.55); }
  70%  { box-shadow: 0 0 0 8px rgba(16,185,129,0); }
  100% { box-shadow: 0 0 0 0 rgba(16,185,129,0); }
}
@media (prefers-reduced-motion: reduce) {
  .login-status-dot { animation: none; }
}
.login-lang {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 13px;
  color: #6b6f76;
  cursor: pointer;
  padding: 7px 12px;
  border-radius: 8px;
  transition: background .15s, color .15s;
}
.login-lang:hover { background: #f4f6f7; color: var(--accent-2); }
.login-lang-arrow { font-size: 9px; color: #9aa0a6; }
.login-form-wrap {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 0 96px 44px;
  max-width: 560px;
  margin: 0 auto;
  width: 100%;
  position: relative;
  z-index: 1;
}
.login-brand {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 34px;
}
.login-brand-img {
  height: 38px;
  width: auto;
  object-fit: contain;
}
.login-title {
  font-size: 28px;
  font-weight: 700;
  color: #1a1a1a;
  margin-bottom: 8px;
  letter-spacing: -0.01em;
}
.login-welcome {
  font-size: 14px;
  color: #9aa0a6;
  margin-bottom: 26px;
}
.login-error {
  color: #A32D2D;
  font-size: 13px;
  margin-bottom: 14px;
  padding: 10px 14px;
  background: rgba(163,45,45,0.07);
  border-radius: 10px;
  border: 1px solid rgba(163,45,45,0.16);
}
.login-form { display: flex; flex-direction: column; gap: 18px; }
.login-field { display: flex; flex-direction: column; gap: 7px; }
.login-field-label {
  font-size: 13px;
  font-weight: 600;
  color: #3b3d40;
  letter-spacing: 0.01em;
}
.login-input-wrap { position: relative; display: flex; align-items: center; }
.login-input-icon {
  position: absolute;
  left: 16px;
  color: #9aa0a6;
  display: flex;
  align-items: center;
  pointer-events: none;
  z-index: 2;
  transition: color .18s;
}
.login-screen .login-input {
  width: 100%;
  height: 52px;
  padding: 0 16px 0 52px;
  border: 1px solid #e1e5e9;
  border-radius: 12px;
  font-size: 14.5px;
  color: #1a1a1a;
  background: #fbfcfd;
  transition: border-color .18s, box-shadow .18s, background .18s;
  outline: none;
  box-sizing: border-box;
}
/* v20260902bh：text-security 仅作用于密码字段；
   之前写在通用 .login-input 上会把邮箱也强制成圆点（Bug 1 根因）。
   同时给密码字段让出 48px 右内边距，避免眼睛按钮压住文字（Bug 2 根因）。
   v20260903g：特异性提升 —— 加 .login-screen 前缀 (0,2,0)，压过 line416 全局
   input[type="text"] (0,1,1)。否则密码字段点眼睛切到 text 后会继承全局
   padding: 8px 10px，把 padding-left:52px 压回 10px，文字起点 x=10 直接
   撞在锁图标 (left:16, width:17) 上 → 显示态下图标与首字符完全重叠。 */
.login-screen .login-input[type="password"] {
  padding-right: 48px;
  -webkit-text-security: disc;
  text-security: disc;
}
.login-input:focus {
  border-color: var(--accent-2);
  background: #fff;
  box-shadow: 0 0 0 4px rgba(8,144,152,0.12);
}
.login-input:focus ~ .login-input-icon,
.login-input-wrap:focus-within .login-input-icon { color: var(--accent-2); }
.login-input::placeholder { color: #b6bac0; }
.login-eye {
  position: absolute;
  right: 12px;
  background: transparent;
  border: none;
  color: #9aa0a6;
  cursor: pointer;
  padding: 7px;
  line-height: 0;
  display: flex;
  align-items: center;
  border-radius: 8px;
  transition: color .15s, background .15s;
}
.login-eye:hover { color: var(--accent-2); background: rgba(8,144,152,0.08); }
.login-options {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 13px;
}
.login-remember {
  display: flex;
  align-items: center;
  gap: 8px;
  color: #6b6f76;
  cursor: pointer;
}
.login-remember input[type="checkbox"] {
  width: 16px; height: 16px;
  accent-color: var(--accent-2);
  cursor: pointer;
}
.login-forgot { color: var(--accent-2); font-size: 13px; font-weight: 500; }
.login-forgot:hover { text-decoration: underline; }
.login-submit {
  width: 100%;
  height: 52px;
  border: none;
  border-radius: 12px;
  background: linear-gradient(90deg, var(--accent-2) 0%, var(--accent-3) 100%);
  color: #fff;
  font-size: 15.5px;
  font-weight: 600;
  letter-spacing: 0.14em;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  transition: transform .1s, box-shadow .2s;
  box-shadow: 0 8px 20px rgba(8,144,152,0.26);
}
.login-submit::after {
  content: '';
  position: absolute;
  top: 0; left: -120%;
  width: 55%; height: 100%;
  background: linear-gradient(100deg, transparent, rgba(255,255,255,0.35), transparent);
  transition: left .6s;
}
.login-submit:hover { transform: translateY(-1px); box-shadow: 0 11px 28px rgba(8,144,152,0.34); }
.login-submit:hover::after { left: 130%; }
.login-submit:active { transform: translateY(0); }
/* 2026-09-30（批次 321）：每天登录一次的提示 —— 小而安静，只说规则，不抢登录按钮的视线 */
.login-daily-note {
  margin: 12px 0 0;
  font-size: 12px;
  color: #8a8f96;
  text-align: center;
  line-height: 1.6;
}
.login-demo-accounts {
  margin-top: 6px;
  font-size: 12px;
  color: #8a8f96;
  text-align: center;
  line-height: 1.85;
  padding: 12px;
  background: #f7f9fa;
  border: 1px solid #eef1f3;
  border-radius: 10px;
}
.login-demo-accounts b { color: #0B6C72; font-weight: 600; }
.login-footer {
  margin-top: 26px;
  text-align: center;
  font-size: 12px;
  color: #b6bac0;
  letter-spacing: 0.02em;
}

@media (max-width: 900px) {
  .login-left { flex-basis: 42%; min-width: 340px; padding: 36px 28px; }
  .login-form-wrap { padding: 0 56px 40px; }
}
@media (max-width: 820px) {
  .login-left { display: none; }
  .login-right { flex-basis: 100%; min-width: auto; }
  .login-form-wrap { padding: 0 32px 40px; }
}
@media (max-width: 420px) {
  .login-form-wrap { padding: 0 20px 32px; }
  .login-title { font-size: 24px; }
}


/* 流程事件列表（v20260828a）样式 */
.flow-event-list { font-size: 13px; }
.flow-event-row { transition: box-shadow .15s; }
.flow-event-row:hover { box-shadow: 0 1px 4px rgba(0,0,0,0.06); }
.flow-event-head:hover .flow-event-arrow { color: var(--accent); }

/* v20260831d：流程事件列表头部（一键展开 toggle） */
.flow-event-list-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.flow-event-list-title { font-size: 13px; color: #2c2c2a; font-weight: 600; }
.flow-event-list-sub { font-size: 11px; color: #B4B2A9; font-weight: 400; margin-left: 2px; }
.flow-event-toggle { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; }
.flow-event-toggle-label { font-size: 12px; color: #888780; }
.flow-event-toggle input[type="checkbox"] { position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0; }
.flow-event-toggle-track { position: relative; display: inline-block; width: 30px; height: 16px; background: #d9d7cf; border-radius: 8px; transition: background .2s; }
.flow-event-toggle-thumb { position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; background: #fff; border-radius: 50%; box-shadow: 0 1px 2px rgba(0,0,0,.15); transition: transform .2s; }
.flow-event-toggle input[type="checkbox"]:checked + .flow-event-toggle-track { background: var(--accent); }
.flow-event-toggle input[type="checkbox"]:checked + .flow-event-toggle-track .flow-event-toggle-thumb { transform: translateX(14px); }

/* v20260831d：流程事件展开区 pills 行 */
.flow-event-pills { display: flex; align-items: center; gap: 6px; margin: 8px 0 6px 0; flex-wrap: wrap; }
.flow-event-pills-spacer { flex: 1; }
.flow-pill { display: inline-flex; align-items: center; font-size: 11px; padding: 3px 10px; border-radius: 4px; cursor: pointer; border: 1px solid transparent; line-height: 1.4; transition: background .15s, border-color .15s, color .15s, opacity .15s; font-family: inherit; }
.flow-pill:focus { outline: none; }
.pill-primary { background: #5277D8; color: #fff; border-color: #5277D8; font-weight: 500; }
.pill-primary:hover { background: #4565C0; }
.pill-tag { background: #B4B2A91a; color: #888780; border-color: #B4B2A933; cursor: default; }
.pill-outline { background: #fff; color: #2c2c2a; border-color: #e5e5e4; }
.pill-outline:hover { border-color: #888780; }
.pill-feedback { background: #fff; color: var(--accent); border-color: var(--accent-t55); }
.pill-feedback:hover { background: var(--accent-t0a); }
.flow-event-chevron { cursor: pointer; font-size: 12px; color: #888780; padding: 0 4px; transition: color .15s; }
.flow-event-chevron:hover { color: var(--accent); }

/* v20260831d：流程事件展开区「+ 新增 xxx 反馈」行 */
.flow-event-feedback-add { display: flex; justify-content: space-between; align-items: center; padding: 8px 0 4px 0; margin-top: 8px; border-top: 1px dashed #e5e5e4; font-size: 12px; color: #888780; }
.flow-event-feedback-add-label { color: #2c2c2a; }
.flow-event-add-btn { background: transparent; color: #5E89EC; border: 1px solid #5E89EC; padding: 3px 10px; border-radius: 4px; font-size: 12px; cursor: pointer; font-family: inherit; transition: background .15s; }
.flow-event-add-btn:hover { background: #5E89EC10; }

/* v20260831g：流程事件 默认折叠态（参考图 2fc0347d）— 顶部紫色 pill + 用户名时间 */
.flow-event-summary {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 10px 0; margin: 4px 0 6px 0;
  border-bottom: 1px solid #f0efe9;
}
.flow-event-summary-pill {
  font-size: 12px; font-weight: 500;
  padding: 4px 12px; border-radius: 4px;
  display: inline-block;
}
.flow-event-summary-status {
  font-size: 10px; font-weight: 500;
  padding: 2px 8px; border-radius: 4px;
}
.flow-event-summary-meta {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 11px; color: #888780;
  margin-left: 4px;
}
.flow-event-summary-actor { display: inline-flex; align-items: center; gap: 4px; }
.flow-event-summary-time { color: #B4B2A9; }

/* v20260901f：去除「expanded 时隐藏 summary」规则 —— 用户反馈：点完「待反馈」后，
   summary 行不应消失，应该保留作为当前阶段的持久头部。
   重复信息已通过 v20260901d 解决（current 行 headHtml 为空 + meta 视觉隐藏）。 */

/* v20260901f：hover「待反馈」时，把右侧 meta（Randy Xu + 时间）临时隐藏，
   让菜单整齐浮现在原 meta 的位置，不再"覆盖"整个行内容 */
/* v20260901o：触发区域扩大到整个 summary 绿框区域 */
.flow-event-summary:hover .flow-event-summary-meta,
.flow-event-summary:focus-within .flow-event-summary-meta { visibility: hidden; }
.flow-event-collapse-handle,
.flow-event-expand-handle {
  text-align: center; padding: 10px 0 4px 0;
  font-size: 12px; color: #888780; cursor: pointer;
  user-select: none;
  transition: color .15s;
}
.flow-event-collapse-handle:hover,
.flow-event-expand-handle:hover { color: var(--accent); }
.flow-event-collapse-handle span,
.flow-event-expand-handle span { border-bottom: 1px dashed #d3d1c7; padding-bottom: 1px; }

/* ========== v20260829b：新版首页仪表盘 ========== */
.dash-hero { display: flex; gap: 16px; align-items: stretch; }
.dash-profile-card {
  width: 260px; flex-shrink: 0; background: linear-gradient(135deg, var(--accent-card-1) 0%, var(--accent-card-2) 100%);
  border-radius: 16px; padding: 16px 16px 14px; color: #fff; display: flex; flex-direction: column; gap: 9px;
  box-shadow: 0 8px 24px rgba(var(--accent-card-rgb),0.18);
}
/* v20260923k（批次 157）：整张卡压缩了一档（头像 72→60 / 内边距与间距收紧），避免比右侧模块高出一大截 */
.dash-profile-avatar { width: 60px; height: 60px; border-radius: 50%; overflow: hidden; background: rgba(255,255,255,0.2); margin: 0 auto 2px; }
.dash-profile-avatar img { width: 100%; height: 100%; object-fit: cover; }
.dash-profile-avatar .dash-avatar-placeholder { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 24px; font-weight: 600; }
.dash-profile-name { font-size: 17px; font-weight: 600; text-align: center; color: #fff; }
.dash-profile-meta { font-size: 12px; opacity: 0.9; text-align: center; }
.dash-profile-divider { height: 1px; background: rgba(255,255,255,0.2); margin: 2px 0; }
.dash-profile-row { display: flex; justify-content: space-between; font-size: 12px; gap: 8px; }
.dash-profile-label { opacity: 0.82; }
.dash-profile-value { font-weight: 500; text-align: right; }
.dash-profile-achievement { background: rgba(255,255,255,0.12); border-radius: 10px; padding: 8px 12px; margin-top: auto; }
.dash-profile-ach-label { font-size: 11px; opacity: 0.85; }
.dash-profile-ach-value { font-size: 20px; font-weight: 700; }
/**
 * ★ 批次 179（Randy）：
 *   ① "首页红框中罗列当年目标，目标完成率（回款/年目标）" → 目标格加了第二行说明（率 + 回款额 + 填目标的入口提示）
 *   ② "首页红框中部分居中显示" → 个人卡里的「🎯 擅长领域」标题与标签改为居中（头像/姓名/职位本来就是居中的，
 *      只有这一块原来左对齐，视觉上歪着）
 */
.dash-profile-ach-sub { font-size: 11px; opacity: 0.92; margin-top: 2px; line-height: 1.5; }
.dash-profile-ach-hint { opacity: 0.75; }
/* 批次 180（Randy："底下两行精简这么写：回款： / 回款完成率："）：极简两行，不再堆一句长解释 */
.dash-profile-ach-line { font-size: 12px; opacity: 0.95; margin-top: 1px; }
/* 批次 189（Randy）：目标那一块 = 一行"年目标"+ 下面 2×2 四格（回款/开票、回款目标%/开票目标%） */
.dash-profile-ach-grid { display:grid;grid-template-columns:1fr 1fr;gap:2px 8px;font-size:12px;opacity:0.95;margin-top:3px }
.dash-profile-ach-grid b { font-weight:700 }
.dash-profile-card .dash-profile-exp-label { text-align: center; }
.dash-profile-card .dash-profile-exp-tags { justify-content: center; }
/* v20260923g（批次 153）：个人资料卡的「擅长领域」——内容与「BD 线索」页顶部那条同源
   v20260923k（批次 157）：按 Randy 要求挪到「姓名/职位」下面（在入职信息之前），并压薄一档 */
.dash-profile-expertise { background: rgba(255,255,255,0.12); border-radius: 10px; padding: 7px 10px; cursor: pointer; }
.dash-profile-expertise:hover { background: rgba(255,255,255,0.2); }
.dash-profile-exp-label { font-size: 11px; opacity: 0.88; margin-bottom: 5px; }
.dash-profile-exp-tags { display: flex; flex-wrap: wrap; gap: 4px; }
.dash-exp-tag {
  font-size: 10.5px; padding: 1px 7px; border-radius: 9px;
  background: rgba(255,255,255,0.22); color: #fff; white-space: nowrap; cursor: pointer;
  border: 1px solid rgba(255,255,255,0.28);
}
.dash-exp-tag:hover { background: rgba(255,255,255,0.34); }
.dash-profile-exp-empty { font-size: 11px; opacity: 0.8; }
/* v20260923k（批次 157 / Randy）：右侧最后一行（团队业绩）撑满剩余高度 ——
   个人卡比右侧内容高时，原来会在右下留出一大块空白（Randy 截图红框）；
   现在这块交给 KPI 卡片长高吃掉，左右两块底边对齐。 */
.dash-overview-area > .dash-overview-row:last-child { flex: 1; align-items: stretch; }
.dash-overview-area > .dash-overview-row:last-child > .dash-overview-cell { display: flex; flex-direction: column; justify-content: center; }
/* v20260923i（批次 155）：「恭喜斩获新 offer」全员喜报窗口
   v20260924c（批次 162 / Randy）：改成**红色喜庆**风格（去掉"恭喜"标题，整体红金配色 + 彩带）。 */
.congrats-box {
  text-align: center; margin: -6px -4px -4px; border-radius: 14px;
  background:
    radial-gradient(circle at 12% 8%, rgba(255,255,255,0.22) 0 6px, transparent 7px),
    radial-gradient(circle at 88% 12%, rgba(255,255,255,0.18) 0 5px, transparent 6px),
    radial-gradient(circle at 8% 88%, rgba(255,255,255,0.16) 0 5px, transparent 6px),
    linear-gradient(160deg, #B4171B 0%, #D62828 46%, #E8492B 100%);
  padding: 22px 18px 18px;
  position: relative; overflow: hidden;
}
/* 左上 / 右上各一条彩带，喜庆一点但不喧哗 */
.congrats-ribbon { position: absolute; top: 10px; left: 14px; font-size: 20px; opacity: .92; }
.congrats-ribbon--r { position: absolute; top: 12px; right: 16px; font-size: 18px; opacity: .88; }
.congrats-emoji { font-size: 48px; line-height: 1.1; filter: drop-shadow(0 2px 6px rgba(0,0,0,.25)); }
.congrats-text {
  font-size: 19px; font-weight: 800; color: #FFE9A8; margin-top: 10px; line-height: 1.5;
  text-shadow: 0 1px 0 rgba(120,0,0,.45), 0 0 12px rgba(255,214,102,.35);
  letter-spacing: .3px;
}
.congrats-sub { font-size: 12.5px; color: rgba(255,255,255,.92); margin-top: 10px; }
.congrats-actions { display: flex; justify-content: center; margin-top: 16px; }
.congrats-btn {
  min-width: 116px; padding: 9px 18px; border: none; border-radius: 999px; cursor: pointer;
  background: linear-gradient(180deg, #FFD666 0%, #F0B429 100%); color: #7A1010;
  font-size: 14px; font-weight: 800; box-shadow: 0 4px 12px rgba(0,0,0,.22);
  /* 批次 172：文案改成「恭喜，一起加油」（7 个字），按钮按内容自适应、不折行 */
  white-space: nowrap; padding: 10px 26px;
}
.congrats-btn:hover { filter: brightness(1.04); }
/* 喜报用"无外壳"弹窗：整块就是那张红卡（去掉白底 + 内边距 + 阴影），关闭按钮改成半透明白 */
.modal.modal-bare { background: transparent !important; box-shadow: none !important; padding: 0 !important; border: none !important; }
/* 批次 172（Randy）：喜报弹窗整块是那张红卡 —— 不要内层滚动条（外面也没有 ✕，只能点卡上的按钮关） */
.modal.modal-bare { max-height: none; overflow: visible; }
.modal.modal-bare .modal-close {
  color: #fff !important; background: rgba(255,255,255,.24) !important; border-radius: 50%;
  width: 26px; height: 26px; line-height: 26px; text-align: center; right: 10px; top: 10px;
}
/* 喜报弹窗里不要白底标题条，整块就是那块红卡 */
#subModalContent > .modal-close + .congrats-box { margin-top: 0; }
/* v20260923i（批次 154）：BD 抓取弹窗的两个选项 + 卡片上的两个动作 + 两列看板 */
.bd-scrape-opt {
  display: flex; gap: 10px; align-items: flex-start; cursor: pointer;
  border: 1px solid #e5e5e4; border-radius: 10px; padding: 10px 12px; margin-bottom: 8px; background: #fff;
}
.bd-scrape-opt.active { border-color: var(--accent-t66); background: var(--accent-t0d); }
.bd-scrape-opt input { margin-top: 3px; width: 15px; height: 15px; accent-color: var(--accent); }
.bd-card-actions-2 { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
.bd-act-btn {
  flex: 1; min-width: 0; font-size: 11px; padding: 5px 8px; border-radius: 7px; cursor: pointer;
  border: 1px solid #d3d1c7; background: #fff; color: #33322e; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.bd-act-btn:hover { border-color: var(--accent); color: var(--accent); }
.bd-act-btn-primary { background: #3B7DD815; border-color: #3B7DD866; color: #2b62ad; font-weight: 600; }
.bd-act-done { flex: 1; min-width: 0; font-size: 11px; padding: 5px 8px; border-radius: 7px; background: #1D9E7515; color: #1D9E75; font-weight: 600; text-align: center; white-space: nowrap; }
.bd-pipeline-2col .bd-pipeline-col { max-width: 420px; }
.dash-overview-area { flex: 1; display: flex; flex-direction: column; }
.dash-section-title { font-size: 14px; font-weight: 600; color: #2c2c2a; margin-bottom: 10px; }
.dash-overview-groups { display: flex; gap: 12px; flex-wrap: wrap; }
.dash-overview-group { flex: 1; min-width: 280px; background: #fff; border: 1px solid #e5e5e4; border-radius: 12px; padding: 14px 16px; }
.dash-overview-head { font-size: 13px; font-weight: 600; color: #33322e; margin-bottom: 10px; }
.dash-overview-row { display: flex; gap: 10px; }
.dash-overview-cell { flex: 1; min-width: 0; border-radius: 8px; background: #fafaf8; padding: 12px; }
.dash-overview-cell--wide { padding: 14px; }
.dash-overview-num { font-size: 22px; font-weight: 700; line-height: 1.1; margin-bottom: 4px; }
.dash-overview-sub { font-size: 12px; color: #33322e; }
.dash-overview-desc { font-size: 11px; color: #B4B2A9; margin-top: 2px; }
.dash-chart-row { display: flex; gap: 16px; align-items: stretch; }
.dash-card { background: #fff; border: 1px solid #e5e5e4; border-radius: 12px; padding: 16px; display: flex; flex-direction: column; }
.dash-card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.dash-card-title { font-size: 14px; font-weight: 600; color: #2c2c2a; }
.dash-chart-body { flex: 1; display: flex; flex-direction: column; justify-content: center; min-height: 220px; }
.dash-chart-legend { display: flex; gap: 16px; justify-content: center; margin-top: 8px; font-size: 11px; color: #33322e; }
.dash-chart-legend i { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 4px; }

/* v20260906n：首页 KPI 趋势图「科技感」—— 深色面板 + 霓虹描边 + 面积渐变 + 入场动画 */
/* 线条：描边自绘（pathLength=100 + dashoffset 动画）；面积：渐显；数据点：淡入；光晕：轻微呼吸 */
.dash-line-path { stroke-dasharray: 100; stroke-dashoffset: 100; animation: dashDraw 1.2s ease forwards; }
@keyframes dashDraw { to { stroke-dashoffset: 0; } }
.dash-area { opacity: 0; animation: dashAreaIn 0.9s ease 0.25s forwards; }
@keyframes dashAreaIn { to { opacity: 1; } }
.dash-pt { opacity: 0; animation: dashPtIn 0.45s ease forwards; }
@keyframes dashPtIn { from { opacity: 0; } to { opacity: 1; } }
.dash-pt-halo { animation: dashHalo 2.4s ease-in-out infinite; }
@keyframes dashHalo { 0%, 100% { opacity: 0.18; } 50% { opacity: 0.36; } }
.dash-chart-legend--tech { gap: 14px; color: #46585a; }
.dash-chart-legend--tech i { box-shadow: 0 0 6px currentColor; }
@media (prefers-reduced-motion: reduce) {
  .dash-line-path { stroke-dashoffset: 0; animation: none; }
  .dash-area, .dash-pt, .dash-pt-halo { opacity: 1; animation: none; }
}
.dash-podium { display: flex; align-items: flex-end; justify-content: center; gap: 16px; padding: 14px 0 18px; }
.dash-podium-gold, .dash-podium-silver, .dash-podium-bronze { display: flex; flex-direction: column; align-items: center; text-align: center; width: 80px; }
.dash-podium-avatar { width: 46px; height: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 18px; font-weight: 600; color: #fff; margin-bottom: 8px; }
.dash-podium-gold .dash-podium-avatar { background: #F5A623; }
.dash-podium-silver .dash-podium-avatar { background: #9AA0A6; }
.dash-podium-bronze .dash-podium-avatar { background: #C78D6B; }
.dash-podium-name { font-size: 12px; font-weight: 500; color: #2c2c2a; }
.dash-podium-team { font-size: 11px; color: #888780; margin-bottom: 6px; }
.dash-podium-score { font-size: 18px; font-weight: 700; color: var(--accent); }
.dash-podium-rank { width: 32px; height: 20px; border-radius: 4px; background: #f5f5f4; font-size: 12px; font-weight: 600; color: #33322e; line-height: 20px; margin-top: 4px; }
.dash-podium-gold .dash-podium-rank { background: #FFF4D9; color: #BA7517; }
.dash-podium-silver .dash-podium-rank { background: #F3F5F7; color: #33322e; }
.dash-podium-bronze .dash-podium-rank { background: #FBF0E7; color: #B5793B; }
.dash-top-list { padding: 0 8px; }
.dash-top-row { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px solid #f0efe9; font-size: 12px; }
.dash-top-row:last-child { border-bottom: none; }
.dash-top-no { width: 22px; height: 22px; border-radius: 50%; background: #f5f5f4; text-align: center; line-height: 22px; font-size: 11px; font-weight: 600; color: #33322e; }
.dash-top-name { flex: 1; font-weight: 500; }
.dash-top-team { color: #888780; }
.dash-top-score { font-weight: 600; color: var(--accent); }

/* 业绩分析 */
.analytics-page { padding-bottom: 24px; }
.ana-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.ana-view-toggle { display: inline-flex; background: #fff; border: 1px solid #e5e5e4; border-radius: 8px; padding: 3px; }
.ana-view { font-size: 12px; color: #33322e; padding: 5px 16px; border-radius: 6px; cursor: pointer; }
.ana-view.active { background: #EFFCFD; color: var(--accent); font-weight: 500; }
.ana-tabs { display: flex; gap: 4px; border-bottom: 1px solid #e5e5e4; margin-bottom: 18px; }
.ana-tab { font-size: 13px; color: #33322e; padding: 8px 14px; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.ana-tab.active { color: var(--accent); border-color: var(--accent); font-weight: 500; }
.ana-table-card { background: #fff; border: 1px solid #e5e5e4; border-radius: 12px; overflow: hidden; }
.ana-table-card table { width: 100%; border-collapse: collapse; font-size: 12px; }
.ana-table-card th { background: #fafaf8; color: #33322e; font-weight: 500; text-align: right; padding: 10px 12px; border-bottom: 1px solid #e5e5e4; white-space: nowrap; }
.ana-table-card th:first-child { text-align: left; }
.ana-table-card td { padding: 10px 12px; text-align: right; border-bottom: 1px solid #f0efe9; }
.ana-table-card td:first-child { text-align: left; }
.ana-total-row { background: #f9f9f7; font-weight: 600; }
.ana-rate-bar { display: flex; align-items: center; gap: 8px; min-width: 120px; }
/**
 * 达成率进度条
 * ★ 批次 238（Randy："这个进度条换更明亮欢快的绿色"）—— 原来是品牌深青绿 var(--accent)（偏灰暗），
 *   换成明亮的成功绿 #22C55E（配浅色底更"欢快"，与右侧百分比的灰字对比也够）。
 */
.ana-rate-fill { height: 8px; border-radius: 4px; background: #22C55E; min-width: 0; }
.ana-rate-bar span { font-size: 11px; color: #33322e; white-space: nowrap; }
.ana-data-row { display: flex; gap: 16px; align-items: stretch; flex-wrap: wrap; }
.ana-donut-card, .ana-line-card { background: #fff; border: 1px solid #e5e5e4; border-radius: 12px; padding: 16px; }
.ana-donut-card { flex: 1; min-width: 220px; display: flex; flex-direction: column; align-items: center; }
.ana-donut-title { font-size: 13px; font-weight: 600; color: #2c2c2a; margin-bottom: 4px; }
.ana-donut-sub { font-size: 11px; color: #888780; margin-bottom: 8px; }
/* 批次 235：年度 / 季度的选择器（去年·前年·指定年份 / 上个季度·指定季度） */
.ana-pick-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 6px; margin-bottom: 6px; }
.ana-pick { height: 26px; font-size: 12px; color: #2c2c2a; background: #fff; border: 1px solid #e5e5e4; border-radius: 6px; padding: 0 6px; max-width: 168px; }
.ana-pick:focus { outline: none; border-color: #1D9E75; }
.ana-pick-num { width: 76px; text-align: center; }
/* 批次 236：团队成员「输入筛选 + 逐条勾选 + 已选胶囊」组件（替换原来的原生 multiple select） */
.te-mem-box { border: 1px solid #e5e5e4; border-radius: 8px; background: #fff; overflow: hidden; }
.te-mem-top { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-bottom: 1px solid #f0f0ee; }
.te-mem-search { flex: 1; height: 30px; border: none; outline: none; font-size: 12.5px; color: #2c2c2a; background: transparent; }
.te-mem-count { font-size: 11.5px; color: #888780; white-space: nowrap; }
.te-mem-list { max-height: 208px; overflow-y: auto; padding: 4px 0; }
.te-mem-row { display: flex; align-items: center; gap: 8px; padding: 6px 10px; cursor: pointer; font-size: 12.5px; color: #2c2c2a; }
.te-mem-row:hover { background: #f7f7f6; }
.te-mem-row input { width: 14px; height: 14px; accent-color: #1D9E75; cursor: pointer; flex: none; }
.te-mem-name { font-weight: 500; }
.te-mem-pos { font-size: 11.5px; color: #33322e; background: #f2f2f0; border-radius: 4px; padding: 1px 5px; }
.te-mem-mail { font-size: 11.5px; color: #888780; margin-left: auto; }
.te-mem-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 10px; border-top: 1px solid #f0f0ee; }
.te-mem-chip { font-size: 11.5px; color: #2c6e6e; background: #e9f4f2; border-radius: 999px; padding: 2px 8px; cursor: pointer; }
.te-mem-chip:hover { background: #d8ece9; }
.te-mem-empty { font-size: 11.5px; color: #B4B2A9; }
/* 批次 239：客户分析改成「竖向堆叠柱状图」（按 Randy 给的样张） */
.ana-bar-chart { position: relative; width: 100%; overflow: hidden; }
.ana-col { cursor: default; }
.ana-col .ana-col-hi { transition: fill .12s ease; }
.ana-col:hover .ana-col-hi { fill: rgba(111, 168, 245, .10); }
.ana-bar-tip {
  position: absolute; z-index: 6; min-width: 168px; pointer-events: none;
  background: #2c2c2a; color: #fff; border-radius: 8px; padding: 9px 11px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .18); font-size: 11.5px; line-height: 1.7;
}
.ana-bar-tip-name { font-weight: 600; margin-bottom: 4px; word-break: break-all; }
.ana-bar-tip-row { display: flex; align-items: center; gap: 6px; }
.ana-bar-tip-row i { width: 8px; height: 8px; border-radius: 2px; display: inline-block; }
.ana-bar-tip-row span { flex: 1; color: #e8e8e6; }
.ana-bar-tip-row b { font-variant-numeric: tabular-nums; }
.ana-bar-tip-total { display: flex; gap: 6px; margin-top: 4px; padding-top: 4px; border-top: 1px solid rgba(255, 255, 255, .22); }
.ana-bar-tip-total span { flex: 1; color: #e8e8e6; }
/* 批次 242：BD 线索「来源体检」的三种标注（已核验 / 来源有问题 / 未核验） */
.bd-src-ok { font-size: 11.5px; color: #1D9E75; font-weight: 500; }
.bd-src-bad { font-size: 11.5px; color: #A32D2D; }
.bd-src-none { font-size: 11.5px; color: #BA7517; }
.bd-src-hint { font-size: 10.5px; color: #B4B2A9; margin-left: 6px; }
.ana-donut-bottom { width: 100%; margin-top: 12px; }
.ana-donut-row { display: flex; align-items: center; gap: 8px; font-size: 12px; color: #33322e; margin-bottom: 6px; }
.ana-donut-dot { width: 8px; height: 8px; border-radius: 50%; }
.ana-line-card { flex: 1.5; min-width: 320px; display: flex; flex-direction: column; }
/* ★ 批次 692（Randy）：折线图的浮层定位容器 + 跟鼠标的浮层（与柱状图观感一致） */
.ana-line-chart { position: relative; }
.ana-chart-tip {
  position: absolute;
  pointer-events: none;
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 8px;
  padding: 6px 10px;
  font-size: 12px;
  line-height: 1.6;
  color: #2c2c2a;
  box-shadow: 0 4px 14px rgba(0, 0, 0, .08);
  z-index: 5;
  white-space: nowrap;
}
.ana-line-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.ana-line-head span { font-size: 13px; font-weight: 600; color: #2c2c2a; }
.ana-line-sub { font-size: 11px; color: #888780; font-weight: 400; }
.ana-bar-card { background: #fff; border: 1px solid #e5e5e4; border-radius: 12px; padding: 16px; }
.ana-bar-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.ana-bar-sub { font-size: 11px; color: #B4B2A9; }
.ana-bar-legend { display: flex; gap: 14px; font-size: 12px; color: #33322e; margin-bottom: 14px; }
.ana-bar-legend i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 4px; }
.ana-bar-row { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px solid #f0efe9; font-size: 12px; }
.ana-bar-row:last-child { border-bottom: none; }
.ana-bar-name { width: 160px; color: #2c2c2a; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ana-bar-track { flex: 1; height: 18px; background: #f5f5f4; border-radius: 4px; overflow: hidden; }
.ana-bar-stack { display: flex; height: 100%; }
.ana-bar-seg { height: 100%; }
.ana-bar-total { width: 90px; text-align: right; font-weight: 600; color: #2c2c2a; }
.ana-placeholder { padding: 40px; text-align: center; color: #888780; background: #fff; border: 1px dashed #e5e5e4; border-radius: 12px; }

@media (max-width: 1100px) {
  .dash-hero { flex-direction: column; }
  .dash-profile-card { width: 100%; }
  .dash-chart-row { flex-direction: column; }
  .dash-overview-row { flex-wrap: wrap; }
}

/* ===== 知识库 KB ===== */
.kb-page { padding: 22px 26px; }
.kb-head { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 18px; gap: 16px; }
.kb-title { font-size: 20px; font-weight: 700; color: #2c2c2a; }
.kb-sub { font-size: 12px; color: #8a8a86; margin-top: 4px; }
.kb-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.kb-hint { font-size: 12px; color: #9a9a96; }
.kb-empty { padding: 60px 20px; text-align: center; color: #9a9a96; background: #fff; border: 1px dashed #e7e7e5; border-radius: 14px; font-size: 13px; }
.kb-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; }
.kb-card { background: #fff; border: 1px solid #efece6; border-radius: 14px; padding: 16px; display: flex; flex-direction: column; gap: 10px; box-shadow: 0 1px 3px rgba(0,0,0,.03); }
.kb-card:hover { border-color: #B0DFE2; box-shadow: 0 4px 14px rgba(var(--accent-rgb),.08); }
.kb-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.kb-card-title { font-size: 15px; font-weight: 600; color: #2c2c2a; }
.kb-card-summary { font-size: 12.5px; color: #33322e; line-height: 1.6; max-height: 80px; overflow: hidden; }
.kb-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.kb-tag { font-size: 11px; background: #EEFAFB; color: var(--accent); padding: 3px 9px; border-radius: 20px; cursor: pointer; }
.kb-tag:hover { background: #B9EAEE; }
.kb-entities { font-size: 11px; color: #8a8a86; }
.kb-entity { display: inline-block; background: #f5f5f4; color: #33322e; padding: 2px 8px; border-radius: 6px; margin: 0 4px 4px 0; }
.kb-badge.shared { font-size: 10px; background: #e6f6ec; color: #1f9d57; padding: 2px 8px; border-radius: 10px; }
.kb-owner { font-size: 11px; color: #9a9a96; }
.kb-card-foot { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.kb-res-preview { font-size: 12.5px; color: #33322e; line-height: 1.6; }
.kb-res-preview b { color: #2c2c2a; }
.kb-loading { font-size: 12px; color: var(--accent); padding: 8px 0; }
.kb-tip { font-size: 12px; color: #8a8a86; margin: 0 0 10px; line-height: 1.6; }
.kb-textarea { width: 100%; min-height: 120px; border: 1px solid #e3e1dc; border-radius: 10px; padding: 10px 12px; font-size: 13px; resize: vertical; font-family: inherit; }
.kb-input { width: 100%; border: 1px solid #e3e1dc; border-radius: 10px; padding: 8px 12px; font-size: 13px; }
.form-row { display: flex; flex-direction: column; gap: 5px; margin-bottom: 12px; }
.form-row label { font-size: 12px; color: #6f6e6a; }
.kb-draft { margin-top: 14px; }
.kb-draft-card { background: #faf9f7; border: 1px solid #ecebe6; border-radius: 12px; padding: 14px; }
.kb-draft-row { font-size: 12.5px; color: #33322e; margin-bottom: 6px; }
.kb-draft-row b { color: #2c2c2a; display: inline-block; width: 64px; }
.kb-draft-actions { display: flex; gap: 8px; margin-top: 10px; }
.kb-cand-list { display: flex; flex-direction: column; gap: 10px; max-height: 60vh; overflow: auto; }
.kb-cand-row { border: 1px solid #efece6; border-radius: 10px; padding: 10px 12px; cursor: pointer; }
.kb-cand-row:hover { background: #f7f6fb; border-color: #B0DFE2; }
.kb-cand-name { font-weight: 600; color: #2c2c2a; font-size: 13.5px; }
.kb-cand-meta { font-size: 11.5px; color: #8a8a86; margin: 2px 0; }
.kb-cand-score { font-size: 11px; color: var(--accent); font-weight: 600; }
.kb-cand-reason { font-size: 11.5px; color: #33322e; margin-top: 2px; }
.btn-sm.danger { color: #c0392b; border-color: #f0c4bd; background: #fff; }
.btn-sm.danger:hover { background: #fdf0ee; }
.kb-btn-danger { color: #c0392b; border-color: #f0c4bd; background: #fff; }
.kb-btn-danger:hover { background: #fdf0ee; }

/* ===== 知识库 v20260904q 重做版：列表 / 详情 / 对话 ===== */
.kb-card-meta { font-size: 11.5px; color: #8a8a86; }
.kb-empty-state { padding: 60px 24px; text-align: center; background: #fff; border: 1px dashed #e7e7e5; border-radius: 14px; }
.kb-empty-icon { font-size: 40px; margin-bottom: 10px; }
.kb-empty-title { font-size: 16px; font-weight: 600; color: #2c2c2a; margin-bottom: 6px; }
.kb-empty-hint { font-size: 12.5px; color: #8a8a86; line-height: 1.7; max-width: 520px; margin: 0 auto 18px; }
.kb-empty-mini { padding: 24px 14px; text-align: center; color: #9a9a96; background: #faf9f7; border: 1px dashed #ecebe6; border-radius: 10px; font-size: 12.5px; line-height: 1.7; }

.kb-detail-page { padding: 18px 26px 26px; }
.kb-detail-head { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
.kb-name-input { flex: 1; min-width: 220px; max-width: 480px; border: 1px solid transparent; background: transparent; font-size: 18px; font-weight: 600; color: #2c2c2a; padding: 6px 10px; border-radius: 8px; transition: border-color .15s, background .15s; }
.kb-name-input:hover { border-color: #e5e5e4; background: #fff; }
.kb-name-input:focus { border-color: #B0DFE2; background: #fff; outline: none; box-shadow: 0 0 0 3px rgba(var(--accent-rgb),.08); }
.kb-detail-meta { font-size: 11.5px; color: #8a8a86; flex: 0 0 auto; }

.kb-detail-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: 18px; align-items: start; }
@media (max-width: 1100px) { .kb-detail-grid { grid-template-columns: 1fr; } }
.kb-docs-panel, .kb-chat-panel { background: #fff; border: 1px solid #efece6; border-radius: 14px; padding: 14px; display: flex; flex-direction: column; gap: 12px; min-height: 480px; }
.kb-panel-title { font-size: 13px; font-weight: 600; color: #2c2c2a; padding-bottom: 8px; border-bottom: 1px solid #f1efe9; }

.kb-doc-list { display: flex; flex-direction: column; gap: 8px; max-height: 56vh; overflow-y: auto; }
.kb-doc-item { background: #faf9f7; border: 1px solid #ecebe6; border-radius: 10px; padding: 10px 12px; }
.kb-doc-row { display: flex; align-items: center; gap: 8px; }
.kb-doc-icon { font-size: 14px; }
.kb-doc-name { flex: 1; font-size: 13px; font-weight: 600; color: #2c2c2a; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-doc-meta { font-size: 11px; color: #9a9a96; flex: 0 0 auto; }
.kb-doc-x { color: #b4b2a9; cursor: pointer; font-size: 14px; padding: 0 4px; line-height: 1; }
.kb-doc-x:hover { color: #c0392b; }
.kb-doc-preview { font-size: 11.5px; color: #33322e; margin-top: 6px; line-height: 1.6; max-height: 60px; overflow: hidden; }
.kb-doc-thumb { max-width: 100%; max-height: 160px; border-radius: 8px; margin-top: 6px; display: block; }

.kb-doc-actions { display: flex; gap: 8px; flex-wrap: wrap; padding-top: 8px; border-top: 1px solid #f1efe9; }
.kb-file-btn { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; padding: 6px 12px; background: var(--accent); color: #fff; border-radius: 8px; cursor: pointer; border: none; }
.kb-file-btn:hover { background: #0f5a60; }

.kb-chat-scroll { display: flex; flex-direction: column; gap: 12px; max-height: 56vh; overflow-y: auto; padding: 4px 2px; }
.kb-chat-list { display: flex; flex-direction: column; gap: 12px; }
.kb-msg { display: flex; flex-direction: column; gap: 4px; max-width: 92%; }
.kb-msg-user { align-self: flex-end; }
.kb-msg-ai { align-self: flex-start; }
.kb-msg-label { font-size: 10.5px; color: #9a9a96; }
.kb-msg-user .kb-msg-label { text-align: right; }
.kb-msg-bubble { padding: 9px 13px; border-radius: 12px; font-size: 13px; line-height: 1.65; white-space: pre-wrap; word-break: break-word; }
.kb-msg-user .kb-msg-bubble { background: var(--accent); color: #fff; border-bottom-right-radius: 4px; }
.kb-msg-ai .kb-msg-bubble { background: #f5f5f4; color: #2c2c2a; border-bottom-left-radius: 4px; }
.kb-msg-pending { color: #8a8a86; font-style: italic; }
.kb-msg-error { color: #c0392b; }
/* 批次 167：回答是"回退到另一家供应商"给出的时，在气泡下方如实标注一行 */
.kb-msg-note {
  font-size: 10.5px; color: #BA7517; background: #BA75170F; border: 1px solid #BA751733;
  border-radius: 6px; padding: 3px 8px; margin-top: 4px; line-height: 1.5;
}
.kb-msg-imgs { display: flex; flex-wrap: wrap; gap: 6px; margin: 2px 0 4px; }
.kb-msg-user .kb-msg-imgs { justify-content: flex-end; }
.kb-msg-img { max-width: 180px; max-height: 180px; border-radius: 8px; border: 1px solid #e5e5e4; }
.kb-msg-sources { display: flex; flex-wrap: wrap; gap: 4px; font-size: 10.5px; color: #8a8a86; }
.kb-source-chip { background: #EEFAFB; color: var(--accent); padding: 2px 7px; border-radius: 10px; cursor: help; }
.kb-source-chip:hover { background: #B9EAEE; }

.kb-pending-bar { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px 0 0; border-top: 1px solid #f1efe9; }
.kb-pending-chip { display: inline-flex; align-items: center; gap: 6px; background: #fff7e6; border: 1px solid #f5d089; border-radius: 18px; padding: 3px 4px 3px 4px; font-size: 11.5px; color: #8a5a00; }
.kb-pending-chip img { width: 28px; height: 28px; border-radius: 14px; object-fit: cover; }
.kb-pending-chip span:not(.kb-pending-x) { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-pending-x { cursor: pointer; padding: 0 6px; color: #b4811e; font-size: 14px; line-height: 1; }
.kb-pending-x:hover { color: #c0392b; }

.kb-chat-input-wrap { display: flex; flex-direction: column; gap: 8px; padding-top: 8px; border-top: 1px solid #f1efe9; }
.kb-chat-input { width: 100%; min-height: 64px; max-height: 200px; border: 1px solid #e3e1dc; border-radius: 10px; padding: 8px 10px; font-size: 13px; resize: vertical; font-family: inherit; line-height: 1.55; }
.kb-chat-input:focus { border-color: #B0DFE2; outline: none; box-shadow: 0 0 0 3px rgba(var(--accent-rgb),.08); }
.kb-chat-input-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.kb-chat-hint { font-size: 11px; color: #9a9a96; }

/* ===== 知识库 v20260904t 共享 / 共建 ===== */
.kb-group { margin-bottom: 22px; }
.kb-group:last-child { margin-bottom: 0; }
.kb-group-title { font-size: 13px; font-weight: 600; color: #2c2c2a; margin-bottom: 10px; display: flex; align-items: center; gap: 8px; }
.kb-group-count { font-size: 11px; background: #EEFAFB; color: var(--accent); padding: 1px 8px; border-radius: 10px; font-weight: 500; }
.kb-card-badges { display: flex; gap: 4px; align-items: center; }
.kb-badge { display: inline-block; font-size: 10.5px; padding: 2px 8px; border-radius: 10px; white-space: nowrap; }
.kb-badge-shared { background: #E8F1FF; color: #1a5fb4; }
.kb-badge-self { background: #EEFAFB; color: var(--accent); }
.kb-badge-owner { background: #f5f5f4; color: #6f6e6a; }
.kb-readonly-hint { font-size: 11px; color: #9a9a96; padding: 4px 0; }
.kb-name-static { flex: 1; min-width: 220px; max-width: 480px; font-size: 18px; font-weight: 600; color: #2c2c2a; padding: 6px 10px; }
.kb-detail-badges { display: flex; gap: 6px; align-items: center; flex: 0 0 auto; }

/* 共享设置弹窗 */
.kb-share-section-title { font-size: 12px; font-weight: 600; color: #6f6e6a; margin: 12px 0 8px; display: flex; align-items: center; gap: 6px; }
.kb-share-list { display: flex; flex-direction: column; gap: 6px; max-height: 180px; overflow-y: auto; border: 1px solid #f1efe9; border-radius: 10px; padding: 6px; }
.kb-share-row { display: flex; align-items: center; gap: 10px; padding: 6px 8px; border-radius: 8px; background: #fff; }
.kb-share-row:hover { background: #faf9f7; }
.kb-share-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--accent); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; flex-shrink: 0; }
.kb-share-name { flex: 1; min-width: 0; }
.kb-share-name-main { font-size: 13px; font-weight: 500; color: #2c2c2a; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-share-name-sub { font-size: 11px; color: #8a8a86; margin-top: 1px; }
.kb-share-remove { width: 24px; height: 24px; border: 1px solid #f0c4bd; color: #c0392b; background: #fff; border-radius: 50%; cursor: pointer; font-size: 14px; line-height: 1; padding: 0; }
.kb-share-remove:hover { background: #fdf0ee; }
.kb-share-empty { padding: 14px; text-align: center; color: #9a9a96; font-size: 12px; background: #faf9f7; border-radius: 8px; }
.kb-share-candidate-list { display: flex; flex-direction: column; gap: 4px; max-height: 220px; overflow-y: auto; border: 1px solid #f1efe9; border-radius: 10px; padding: 6px; margin-top: 8px; }
.kb-share-candidate { display: flex; align-items: center; gap: 10px; padding: 6px 8px; border-radius: 8px; background: #fff; transition: background .12s; }
.kb-share-candidate:hover { background: #faf9f7; }
.kb-share-candidate-info { flex: 1; min-width: 0; }
.kb-share-add { font-size: 11.5px; padding: 4px 10px; flex-shrink: 0; }

/* ===== 首页 KPI Top榜（参考图：领奖台 + 时间/动作下拉 + 头像 + 全屏） ===== */
.dash-top-card { padding: 0; overflow: hidden; }
.dash-top-card > .dash-chart-body { justify-content: flex-start; min-height: auto; }   /* v20260906kg：顶对齐，去掉 ~38px 顶部空白（原 dash-chart-body 默认 justify-content:center 把 header 推到中线）*/
.dash-top-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 14px 12px 16px; border-bottom: 1px solid #f1efe9; }
.dash-top-title-wrap { display: flex; align-items: center; gap: 6px; }
.dash-top-help { width: 16px; height: 16px; border-radius: 50%; border: 1px solid #d3d1c7; color: #9a9a96; font-size: 11px; line-height: 15px; text-align: center; cursor: help; transition: border-color .12s, color .12s; }
.dash-top-help:hover { border-color: var(--accent); color: var(--accent); }
.dash-top-header-right { display: flex; align-items: center; gap: 8px; }
.dash-top-filters { display: flex; align-items: center; gap: 8px; }
.dash-top-select { appearance: none; -webkit-appearance: none; background: #fff url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%238a8a86' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat right 8px center; border: 1px solid #e5e5e4; border-radius: 8px; padding: 5px 22px 5px 10px; font-size: 12px; color: #33322e; cursor: pointer; outline: none; min-width: 72px; }
.dash-top-select:hover { border-color: #d3d1c7; }
.dash-top-select:focus { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),.1); }
.dash-top-expand { color: #888780; font-size: 15px; cursor: pointer; padding: 4px; border-radius: 4px; transition: color .12s, background .12s; }
.dash-top-expand:hover { color: var(--accent); background: #f5f5f4; }

.dash-top-podium { display: flex; align-items: flex-end; justify-content: center; gap: 10px; padding: 18px 16px 0; min-height: 190px; position: relative; }
.dash-top-stand { position: relative; display: flex; flex-direction: column; align-items: center; width: 96px; padding-top: 12px; }
.dash-top-stand::before { content: ''; position: absolute; bottom: 0; left: 0; right: 0; z-index: 0; border-radius: 6px 6px 0 0; clip-path: polygon(0 0, 100% 0, 88% 100%, 12% 100%); }
.dash-top-stand-gold { height: 170px; }
.dash-top-stand-gold::before { height: 90px; background: linear-gradient(180deg, #FFE7A8 0%, #F5C542 100%); }
.dash-top-stand-silver { height: 150px; }
.dash-top-stand-silver::before { height: 70px; background: linear-gradient(180deg, #E8EAED 0%, #C4C8CE 100%); }
.dash-top-stand-bronze { height: 140px; }
.dash-top-stand-bronze::before { height: 60px; background: linear-gradient(180deg, #F5D0B5 0%, #D9A37A 100%); }

.dash-top-avatar-wrap { position: relative; z-index: 1; margin-bottom: 6px; }
.dash-top-avatar-wrap .avatar { box-shadow: 0 2px 8px rgba(0,0,0,.12); border: 2px solid #fff; background: #E6F1FB; color: #185FA5; font-weight: 600; }
.dash-top-avatar-wrap .avatar-photo { background: #fff; }
.dash-top-crown { position: absolute; top: -16px; left: 50%; transform: translateX(-50%); font-size: 18px; z-index: 2; filter: drop-shadow(0 1px 2px rgba(0,0,0,.15)); }
.dash-top-name-tag { position: relative; z-index: 1; background: #fff; border: 1px solid #e5e5e4; border-radius: 14px; padding: 3px 10px; font-size: 12px; font-weight: 500; color: #2c2c2a; max-width: 110px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 4px; box-shadow: 0 1px 3px rgba(0,0,0,.06); }
.dash-top-count { position: relative; z-index: 1; font-size: 22px; font-weight: 700; color: #2c2c2a; line-height: 1; margin-bottom: 4px; }
.dash-top-rank { position: absolute; bottom: 4px; left: 50%; transform: translateX(-50%); z-index: 1; font-size: 28px; font-weight: 700; color: rgba(255,255,255,.92); text-shadow: 0 1px 3px rgba(0,0,0,.12); line-height: 1; }

.dash-top-confetti { position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; overflow: hidden; }
.dash-top-confetti-dot { position: absolute; width: 5px; height: 5px; border-radius: 50%; opacity: .55; }
.dash-top-confetti-dot.c1 { background: #F5C542; top: 18px; left: 18%; animation: dashTopConfetti 2.2s ease-in-out infinite; }
.dash-top-confetti-dot.c2 { background: var(--accent); top: 34px; left: 78%; animation: dashTopConfetti 2.6s ease-in-out .4s infinite; }
.dash-top-confetti-dot.c3 { background: #E7857D; top: 56px; left: 12%; animation: dashTopConfetti 2s ease-in-out .8s infinite; }
.dash-top-confetti-dot.c4 { background: #2D9CDB; top: 42px; left: 86%; animation: dashTopConfetti 2.4s ease-in-out .2s infinite; }
.dash-top-confetti-dot.c5 { background: #F5C542; top: 70px; left: 68%; animation: dashTopConfetti 2.8s ease-in-out .6s infinite; }
.dash-top-confetti-dot.c6 { background: #1D9E75; top: 26px; left: 30%; animation: dashTopConfetti 2.1s ease-in-out 1s infinite; }
@keyframes dashTopConfetti { 0%,100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-6px) rotate(20deg); } }

.dash-top-list { padding: 10px 14px 14px; }
.dash-top-row { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px solid #f0efe9; font-size: 12.5px; }
.dash-top-row:last-child { border-bottom: none; }
.dash-top-row .avatar { width: 28px; height: 28px; font-size: 10px; border: 1px solid #f0efe9; }
.dash-top-no { width: 22px; height: 22px; border-radius: 50%; background: #f5f5f4; text-align: center; line-height: 22px; font-size: 11px; font-weight: 600; color: #33322e; flex-shrink: 0; }
.dash-top-name { flex: 1; font-weight: 500; color: #2c2c2a; }
.dash-top-team-inline { color: #888780; font-size: 11px; margin-left: 5px; }
.dash-top-team { color: #888780; font-size: 11.5px; }
.dash-top-score { font-weight: 700; color: var(--accent); font-size: 14px; }

.dash-top-empty { padding: 16px 20px; text-align: center; color: #9a9a96; font-size: 13px; }
.dash-top-empty-icon { font-size: 24px; margin-bottom: 4px; }
.dash-top-empty-sub { font-size: 11px; color: #b4b2a9; margin-top: 4px; }

/* 旧的 podium 样式保留兼容，但首页已改用 dash-top-* */
.dash-podium { display: flex; align-items: flex-end; justify-content: center; gap: 16px; padding: 14px 0 18px; }

/* ========== 候选人-项目流程卡片（v20260831 参考图改造） ========== */
.cand-job-card { border: 1px solid #e5e5e4; border-radius: 12px; padding: 14px; background: #fff; margin-bottom: 10px; }
.cand-job-card.is-highlight { background: #f7f7ff; border-color: var(--accent); }
/**
 * ★ 批次 759（Randy 2026-10-15 第二次提「这里面做了两层框，把里面那层拿掉」，截图=候选人详情的项目卡片）
 * ---------------------------------------------------------------------------
 * 真凶不是里面的流程事件行（那一层批次 752 已改成朴素行），而是**卡片自己**：
 *   候选人详情右栏的每个区块本来就是一张白卡片（`.cand-detail-right .detail-section`：
 *   白底 + 1px 边框 + 10px 圆角），而项目卡片 `.cand-job-card` 又画了一层
 *   边框 + 12px 圆角 + 白底 → 屏幕上就是"框中框"。
 * 所以这里把右栏里的项目卡片**去框**：透明底、无边框、无圆角；
 *   多项目之间只留一条细分隔线；"当前项目"的高亮不再靠边框，改成左侧一条强调线。
 * 注：`.cand-job-card` 只用在候选人详情右栏（`_candJobsSection`），这里再用
 *   `.cand-detail-right` 限定一次，将来别处复用时不会被这条规则误伤。
 */
.cand-detail-right .cand-job-card { border: 0; border-radius: 0; background: transparent; padding: 0; }
.cand-detail-right .cand-job-card + .cand-job-card { margin-top: 14px; padding-top: 14px; border-top: 1px solid #f1efe8; }
.cand-detail-right .cand-job-card.is-highlight { background: transparent; border-color: transparent; box-shadow: inset 3px 0 0 0 var(--accent); padding-left: 12px; }

/**
 * ★ 批次 764（Randy 2026-10-15）：「文件夹旁边这个齿轮删除，鼠标移到文件夹的时候，
 *   文件夹旁边显示的人员的数字变成...，点击...可以进行编辑和删除动作」
 *   · 平时：显示人数（`.folder-count`）；
 *   · 悬停：人数换成 `...`（`.folder-more`），点它出「重命名 / 共享设置 / 删除（或移出我的列表）」；
 *   · 不再各画一个 ⚙️ / × —— 少了两个图标位，也不怕误点。
 */
.folder-item .folder-more { display: none; flex: 0 0 auto; margin-left: 6px; padding: 0 6px; border-radius: 6px; cursor: pointer; color: #5b5a55; font-weight: 600; letter-spacing: 1px; line-height: 18px; }
.folder-item:hover .folder-count { display: none; }
.folder-item:hover .folder-more { display: inline-flex; align-items: center; }
.folder-item .folder-more:hover { background: #e9e7e0; color: #1f1e1c; }
.cand-job-card-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 12px; }
.cand-job-card-title { font-weight: 600; font-size: 14px; color: var(--accent); cursor: pointer; }
.cand-job-card-meta { font-size: 11px; color: #888780; margin-top: 2px; }
.cand-job-card-score { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

/* v20260831m（参考图 ffd88b6b）：5 节点 stepper 改为一条水平直线
   全部节点在同一水平线上，用 flex space-between 均匀分布，背景一条 track，
   已完成的进度用蓝色前景 track 覆盖，容器宽度自适应，永不错位 */
.cand-job-stepper-wrap { position: relative; display: flex; align-items: center; padding: 0 22px; }
.cand-job-stepper-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background: transparent; border: none;
  color: #B4B2A9; font-size: 22px; line-height: 1;
  padding: 6px; cursor: pointer; font-family: inherit;
  border-radius: 4px;
  transition: color .15s, background .15s;
  z-index: 5;
}
.cand-job-stepper-nav[data-dir="prev"] { left: 0; }
.cand-job-stepper-nav[data-dir="next"] { right: 0; }
.cand-job-stepper-nav:hover { color: #5E89EC; background: #F5F5F4; }
.cand-job-stepper-nav:active { color: #5E89EC; }

.cand-job-stepper-flat {
  position: relative;
  flex: 1;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 28px 0 40px;
  min-width: 280px;
}
/* 背景 track（浅灰）铺满整行 */
.cand-job-stepper-track-bg {
  position: absolute;
  left: 16px;
  right: 16px;
  top: 50%;
  transform: translateY(-50%);
  height: 3px;
  background: #e5e4df;
  border-radius: 2px;
  z-index: 1;
}
/* 已完成 track（蓝色），宽度由 JS 根据 curIdx 计算 */
.cand-job-stepper-track {
  position: absolute;
  left: 16px;
  top: 50%;
  transform: translateY(-50%);
  height: 3px;
  background: #5E89EC;
  border-radius: 2px;
  z-index: 2;
  transition: width .3s ease;
}
.cand-job-stepper-flat .cand-job-step {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  z-index: 3;
}
.cand-job-stepper-flat .cand-job-step-dot {
  width: 32px; height: 32px; border-radius: 50%;
  background: #fff; border: 2px solid #d3d1c7;
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; font-weight: 600; color: #888780;
  box-shadow: 0 1px 3px rgba(0,0,0,0.08);
  flex-shrink: 0;
}
/* v20260901ax：节点配色改由 --step-color 下传，各阶段不同色 */
.cand-job-stepper-flat .cand-job-step.done .cand-job-step-dot { background: var(--step-color, #5E89EC); border-color: var(--step-color, #5E89EC); color: #fff; }
.cand-job-stepper-flat .cand-job-step.current .cand-job-step-dot {
  background: var(--step-color, #5277D8); border-color: var(--step-color, #5277D8); color: #fff;
  box-shadow: 0 0 0 4px var(--step-ring, rgba(82,119,216,.18)), 0 2px 6px rgba(0,0,0,.14);
}
/* 未到达节点：用阶段色描边，微弱但可辨，保持「未完成」的视觉轻量 */
.cand-job-stepper-flat .cand-job-step:not(.done):not(.current):not(.rejected) .cand-job-step-dot {
  border-color: var(--step-color, #d3d1c7);
  color: var(--step-color, #888780);
}
.cand-job-stepper-flat .cand-job-step.rejected .cand-job-step-dot { background: #fff; border-color: #E7857D; color: #C53030; }
.cand-job-stepper-flat .cand-job-step.clickable { cursor: pointer; }
.cand-job-stepper-flat .cand-job-step-label {
  position: absolute;
  top: 40px;
  font-size: 12px;
  color: #33322e;
  white-space: nowrap;
  text-align: center;
}
.cand-job-stepper-flat .cand-job-step.current .cand-job-step-label { color: var(--step-color, #5277D8); font-weight: 600; }
.cand-job-stepper-flat .cand-job-step.done .cand-job-step-label { color: var(--step-color, #5E89EC); font-weight: 500; }
.cand-job-stepper-flat .cand-job-step.clickable:hover .cand-job-step-dot { box-shadow: 0 0 0 5px var(--step-ring, rgba(94,137,236,.22)), 0 2px 6px rgba(0,0,0,.16); }
.cand-job-stepper-flat .cand-job-step.clickable:active .cand-job-step-dot { transform: scale(0.95); }

/* 大操作按钮 */
.cand-job-actions { display: flex; gap: 10px; margin-bottom: 10px; }
.cand-job-actions .btn-action { flex: 1; height: 40px; border-radius: 8px; font-size: 14px; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: none; cursor: pointer; }
.cand-job-actions .btn-recommend { background: #5277D8; color: #fff; }
.cand-job-actions .btn-recommend:hover { background: #4565C0; }
.cand-job-actions .btn-reject { background: #fff; color: #C53030; border: 1px solid #E7857D; }
.cand-job-actions .btn-reject:hover { background: #fff5f5; }

/* v20260831c：简历推荐阶段门控——主按钮变灰 disabled（反馈通过后才高亮可点） */
.cand-job-actions .btn-action-locked,
.cand-job-actions .btn-action-locked:hover { background: #F5F5F4 !important; color: #B4B2A9 !important; cursor: not-allowed; opacity: 1; box-shadow: none; }
.cand-job-step.clickable:hover .cand-job-step-dot { box-shadow: 0 0 0 4px rgba(94,137,236,.22); }
.cand-job-step.clickable:active .cand-job-step-dot { transform: scale(0.95); }
.cand-job-step.clickable:hover .cand-job-step-label { color: var(--step-color, #5E89EC); }

/* v20260831c：候选人淘汰下拉菜单（参考图 7 选项 + 1 分隔线） */
.reject-menu { background: #fff; border: 1px solid #ECEAE2; border-radius: 8px; box-shadow: 0 6px 20px rgba(0,0,0,0.12); padding: 4px 0; min-width: 140px; z-index: 1100; }
.reject-menu-item { padding: 8px 14px; font-size: 13px; color: #26251f; cursor: pointer; white-space: nowrap; transition: background 0.15s; }
.reject-menu-item:hover { background: #FAF9F5; color: var(--accent); }
.reject-menu-divider { height: 1px; background: #ECEAE2; margin: 4px 0; padding: 0; }

/* 工具栏 */
.cand-job-toolbar { display: flex; align-items: center; justify-content: space-between; border: 1px solid #f0efe9; border-radius: 8px; padding: 6px 10px; margin-bottom: 12px; }
.cand-job-toolbar-left { display: flex; align-items: center; gap: 4px; }
.cand-job-toolbar-right { display: flex; align-items: center; gap: 4px; }
.cand-job-tool { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 6px; cursor: pointer; color: #33322e; font-size: 16px; }
.cand-job-tool:hover { background: #f5f5f4; }
.cand-job-tool-text { font-size: 13px; padding: 0 8px; gap: 6px; width: auto; white-space: nowrap; }
.cand-job-tool-divider { width: 1px; height: 18px; background: #e5e5e4; margin: 0 2px; }

/* 流程事件 */
.cand-flow-events { border-top: 1px solid #f0efe9; padding-top: 10px; }
.cand-flow-events-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.cand-flow-events-title { font-size: 14px; font-weight: 600; color: #2c2c2a; }
.cand-flow-events-toggle { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #888780; cursor: pointer; }
.cand-flow-event { border: 1px solid #f0efe9; border-radius: 8px; padding: 10px 12px; margin-bottom: 8px; background: #fafaf8; }
.cand-flow-event-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; cursor: pointer; }
.cand-flow-event-left { display: flex; align-items: center; gap: 10px; }
.cand-flow-event-tag { padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 500; color: #fff; }
.cand-flow-event-title { font-size: 13px; font-weight: 500; color: #2c2c2a; }
.cand-flow-event-right { display: flex; align-items: center; gap: 8px; font-size: 12px; color: #888780; }
.cand-flow-event-body { padding-top: 10px; margin-top: 8px; border-top: 1px dashed #e5e5e4; }
.cand-flow-event-row { display: flex; gap: 8px; font-size: 12px; margin-bottom: 6px; }
.cand-flow-event-key { color: #888780; width: 70px; flex-shrink: 0; }
.cand-flow-event-val { color: #2c2c2a; flex: 1; }

/* 推荐报告弹窗（两栏） */
.recommend-modal { display: flex; gap: 20px; }
.recommend-modal-left { flex: 1; min-width: 0; }
.recommend-modal-right { width: 280px; flex-shrink: 0; background: #fafaf8; border-radius: 10px; padding: 14px; }
.recommend-modal-right-title { font-size: 14px; font-weight: 600; color: #2c2c2a; margin-bottom: 14px; }
.recommend-modal-field { margin-bottom: 14px; }
.recommend-modal-field label { display: block; font-size: 12px; color: #33322e; margin-bottom: 4px; }
.recommend-modal-field label .required { color: #C53030; margin-left: 2px; }
.recommend-modal-field input,
.recommend-modal-field select { width: 100%; padding: 8px 10px; border: 1px solid #d3d1c7; border-radius: 6px; font-size: 13px; background: #fff; }
.recommend-modal-field input[type="file"] { padding: 6px; }
.recommend-modal-upload {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 92px;
  padding: 22px 18px;
  border: 1.5px dashed #c9c6bc;
  border-radius: 8px;
  background: #fafaf7;
  text-align: center;
  color: #33322e;
  font-size: 13px;
  line-height: 1.6;
  cursor: pointer;
  transition: background .15s, border-color .15s, box-shadow .15s;
}
.recommend-modal-upload:hover { background: #f3f2ec; border-color: #A9A69C; }
.recommend-modal-upload.drag-over {
  background: #e8f3ef;
  border-color: var(--accent);
  color: var(--accent);
  box-shadow: inset 0 0 0 2px var(--accent-t14);
}
.recommend-modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }
.recommend-modal-check { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #33322e; margin-top: 10px; }

/* ===== v20260831o：反馈弹窗「状态 + 内容」 ===== */
.fb-modal-ctx {
  margin-bottom: 14px; padding: 10px 12px;
  background: #f5f5f4; border-radius: 8px; font-size: 13px; color: #33322e;
}
/* 双类选择器覆盖上面 .recommend-modal-field label 的 display:block（单类会被更靠后的规则无声覆盖） */
.recommend-modal-field .fb-status-opt { display: inline-flex; margin-bottom: 0; }
.fb-status-group { display: flex; gap: 8px; }
.fb-status-opt {
  flex: 1; align-items: center; justify-content: center; gap: 6px;
  font-size: 13px; font-weight: 500;
  padding: 9px 0; border: 1px solid #d3d1c7; border-radius: 6px;
  background: #fff; color: #33322e; cursor: pointer;
  transition: border-color .15s, color .15s, background .15s;
  user-select: none;
}
.fb-status-opt:hover { border-color: #b4b2a9; }
.fb-status-opt input[type="radio"] { width: auto; margin: 0; padding: 0; accent-color: currentColor; }
.fb-modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }

/* ===== v20260831o：流程事件行「待反馈」可点击状态按钮 ===== */
.flow-event-status-btn {
  display: inline-flex; align-items: center; gap: 2px;
  font-size: 10px; font-weight: 500; line-height: 1;
  padding: 3px 7px; border: 1px solid; border-radius: 4px;
  background: #fff; cursor: pointer; white-space: nowrap;
  transition: filter .15s;
}
.flow-event-status-btn:hover { filter: brightness(0.96); }
.flow-event-summary .flow-event-status-btn { font-size: 11px; padding: 4px 9px; }

/* v20260901o：鼠标在整个 summary 行（绿框区域）悬停时浮现 编辑/反馈 动作菜单 */
.flow-event-status-wrap { position: relative; display: inline-flex; }
.flow-event-summary:hover .flow-event-hover-actions,
.flow-event-summary:focus-within .flow-event-hover-actions { display: inline-flex !important; }
.flow-event-hover-actions {
  display: none;
  position: absolute;
  left: 100%;
  top: 50%;
  transform: translateY(-50%);
  margin-left: 4px;
  z-index: 20;
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 4px;
  box-shadow: 0 2px 6px rgba(0,0,0,.08);
  padding: 4px;
  gap: 4px;
  white-space: nowrap;
}
.flow-event-hover-btn {
  display: inline-flex;
  align-items: center;
  font-size: 11px;
  font-weight: 500;
  line-height: 1;
  padding: 4px 10px;
  border: 1px solid #d9d7cf;
  border-radius: 4px;
  background: #fff;
  color: #2c2c2a;
  cursor: pointer;
  white-space: nowrap;
  transition: background .15s, border-color .15s;
}
.flow-event-hover-btn:hover { background: #f5f5f4; border-color: #b4b2a9; }

/* v20260901c：展开态顶部用户/时间行 */
.flow-event-body-actor { margin: 0; }
.flow-event-body-actor .avatar { flex-shrink: 0; }
.flow-event-body-actor .avatar-photo { padding: 0; background: transparent; border: 1px solid #e5e5e4; }

/* v20260901g：默认折叠态 summary 行 头像/用户/时间 */
.flow-event-summary-meta { display: inline-flex; align-items: center; gap: 6px; }
.flow-event-summary-meta .avatar { flex-shrink: 0; }
.flow-event-summary-meta .avatar-photo { padding: 0; background: transparent; border: 1px solid #e5e5e4; }

/* v20260901g：事件 head 行（折叠态）头像 */
.flow-event-head .avatar { flex-shrink: 0; }
.flow-event-head .avatar-photo { padding: 0; background: transparent; border: 1px solid #e5e5e4; }

/* ========== v20260901h：客户面试弹窗两栏 ========== */
.iv-modal-ctx { margin-bottom: 12px; padding: 10px; background: #f5f5f4; border-radius: 8px; font-size: 13px; color: #2c2c2a; }
.iv-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 14px; }
.iv-field-full { grid-column: 1 / -1; }
.iv-field .form-label .required { color: #C53030; margin-left: 2px; }
.iv-method-group { display: flex; gap: 8px; }
.iv-method-opt {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 7px 12px; border: 1px solid #d3d1c7; border-radius: 6px;
  font-size: 13px; color: #33322e; cursor: pointer; user-select: none;
  transition: all .15s;
}
.iv-method-opt:hover { border-color: #b4b2a9; }
.iv-method-opt input[type="radio"] { width: auto; margin: 0; padding: 0; accent-color: var(--accent); }
.iv-final-toggle {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 12px; border: 1px solid #d3d1c7; border-radius: 6px;
  font-size: 13px; color: #33322e; cursor: pointer; user-select: none;
  transition: all .15s;
}
.iv-final-toggle:hover { border-color: #b4b2a9; }
.iv-final-toggle input[type="checkbox"] { width: auto; margin: 0; padding: 0; accent-color: var(--accent); }
.iv-modal-actions { display: flex; gap: 8px; margin-top: 16px; }

@media (max-width: 720px) { .iv-grid { grid-template-columns: 1fr; } }

/* ========== v20260901i：流程事件卡片 UI 规整（绿框）+ 每行右侧记录（红框） ========== */
/* 统一事件行：去色块方块，左侧仅文字 + 状态 pill，右侧 记录条目 */
.flow-event-label-text {
  font-size: 13px; color: #2c2c2a; font-weight: 500;
  padding: 4px 0;
}
.flow-event-status-pill {
  display: inline-flex; align-items: center; gap: 2px;
  font-size: 11px; font-weight: 500; line-height: 1;
  padding: 4px 10px; border-radius: 12px;
  border: 1px solid transparent;
  white-space: nowrap;
}
.flow-event-status-pill--clickable {
  cursor: pointer;
  transition: filter .15s;
  font-family: inherit;
}
.flow-event-status-pill--clickable:hover { filter: brightness(0.96); }

.flow-event-summary-spacer { flex: 1; }

/* head 行右侧：v20260901k 照图重构 —— 折叠态显示「头像+短时间」胶囊，展开态隐藏（改为 head-actions 编辑/取消） */
.flow-event-head { gap: 8px; }
.flow-event-actor-pill {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 8px; border-radius: 14px;
  background: transparent; border: 1px solid transparent;
  cursor: pointer; white-space: nowrap;
  transition: background .15s;
}
.flow-event-actor-pill:hover { background: #f5f5f4; }
.flow-event-actor-pill[data-expand-state="expanded"] { display: none; }
.flow-event-actor-pill .avatar { flex-shrink: 0; }
.flow-event-actor-pill .avatar-photo { padding: 0; background: transparent; border: 1px solid #e5e5e4; }
.flow-event-actor-dot {
  width: 20px; height: 20px; border-radius: 50%;
  background: #e5e5e4; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 10px; color: #888780;
}
.flow-event-actor-time { font-size: 11px; color: #888780; font-variant-numeric: tabular-nums; }

/* 展开态 head 状态 pill 右侧「编辑/取消」文字按钮（v20260901k 图2） */
.flow-event-head-actions {
  display: inline-flex; align-items: center; gap: 4px;
  white-space: nowrap;
}
.flow-event-head-actions[data-expand-state="collapsed"] { display: none; }
.flow-event-head-action-btn {
  background: transparent; color: #5E89EC; border: none;
  padding: 2px 6px; border-radius: 4px; font-size: 12px;
  cursor: pointer; font-family: inherit; flex-shrink: 0;
  transition: background .15s;
}
.flow-event-head-action-btn:hover { background: #5E89EC14; }
.flow-event-head-action-btn--danger { color: #C53030; }
.flow-event-head-action-btn--danger:hover { background: #E7857D14; }

/* 展开态 body「客户面试反馈」区块（v20260901k 图2：标题 + 记录行 + 字段） */
.flow-event-feedback-block {
  margin-top: 10px; padding: 8px 10px;
  background: #FAFAF5; border-left: 3px solid var(--accent); border-radius: 4px;
}
.flow-event-feedback-title { font-size: 11px; color: #888780; margin-bottom: 6px; }
.flow-event-feedback-record {
  display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
}
.flow-event-feedback-record .avatar { flex-shrink: 0; }
.flow-event-feedback-record-name { font-size: 12px; color: #2c2c2a; font-weight: 500; }
.flow-event-feedback-record-time { font-size: 11px; color: #888780; font-variant-numeric: tabular-nums; }
.flow-event-feedback-edit-btn {
  margin-left: auto; background: transparent; color: #5E89EC; border: none;
  padding: 2px 6px; border-radius: 4px; font-size: 11px;
  cursor: pointer; font-family: inherit; flex-shrink: 0;
  transition: background .15s;
}
.flow-event-feedback-edit-btn:hover { background: #5E89EC14; }
.flow-event-feedback-fields { font-size: 12px; }

/* 展开态 body：单栏（v20260901j 删除右侧绿框） */
.flow-event-body { padding: 0 10px 10px 10px; border-top: 1px solid #e5e5e4; }
.flow-event-body--no-border { border-top: none; }
.flow-event-body-left { min-width: 0; }

/* 移动端：胶囊收窄 */
@media (max-width: 720px) {
  .flow-event-actor-time { font-size: 10px; }
  .flow-event-head-action-btn { padding: 2px 4px; font-size: 11px; }
}

/* ========== Offer 方案弹窗（v20260901m 参考图 7849d206） ========== */
.offer-form { padding: 4px 2px; }
.offer-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.offer-form .form-label { font-size: 12px; color: #5a5a5a; margin-bottom: 6px; display: block; }
.offer-form .form-required { color: #A32D2D; }
.offer-form input[type="date"], .offer-form input[type="number"], .offer-form textarea, .offer-form select {
  width: 100%; padding: 8px 10px; border: 1px solid #d3d1c7; border-radius: 6px; font-size: 13px; background: #fff;
}
.offer-form input[type="date"]:focus, .offer-form input[type="number"]:focus, .offer-form textarea:focus, .offer-form select:focus {
  outline: none; border-color: var(--accent-2); box-shadow: 0 0 0 2px var(--accent-t14);
}
.offer-kpi-user-wrap { position: relative; margin-top: 14px; }
.offer-kpi-user-trigger {
  display: flex; align-items: center; gap: 8px; width: 50%; padding: 7px 10px; border: 1px solid #d3d1c7; border-radius: 6px;
  background: #fff; font-size: 13px; cursor: pointer; text-align: left;
}
.offer-kpi-user-trigger .avatar { flex-shrink: 0; }
.offer-kpi-user-name { flex: 1; color: #1a1a1a; }
.offer-kpi-user-arrow { color: #888780; font-size: 11px; }
.offer-kpi-user-dropdown {
  position: absolute; left: 0; top: calc(100% + 4px); width: 50%; max-height: 260px; overflow-y: auto;
  background: #fff; border: 1px solid #d3d1c7; border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,0.10); z-index: 10;
}
.offer-kpi-option { display: flex; align-items: center; gap: 8px; padding: 8px 10px; cursor: pointer; font-size: 13px; }
.offer-kpi-option:hover, .offer-kpi-option.selected { background: #f5f5f4; }
.offer-section-head { display: flex; justify-content: space-between; align-items: center; margin: 22px 0 10px; }
.offer-section-title { font-size: 14px; font-weight: 600; color: #1a1a1a; }
.offer-add-row { font-size: 13px; color: #5E89EC; background: none; border: none; cursor: pointer; }
.offer-add-row:hover { color: #4565C0; }
.offer-items-table-wrap { border: 1px solid #e5e5e4; border-radius: 8px; overflow: hidden; }
.offer-items-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.offer-items-table thead { background: #f5f5f4; }
.offer-items-table th { padding: 10px 12px; text-align: left; font-weight: 500; color: #5a5a5a; border-bottom: 1px solid #e5e5e4; }
.offer-items-table td { padding: 8px 12px; border-bottom: 1px solid #f1efe8; vertical-align: middle; }
.offer-items-table tr:last-child td { border-bottom: none; }
.offer-item-type { min-width: 110px; }
.offer-item-money { display: flex; align-items: center; gap: 6px; border: 1px solid #d3d1c7; border-radius: 6px; padding: 0 8px; background: #fff; }
.offer-item-money span { color: #888780; font-size: 13px; }
.offer-item-money input { border: none; padding: 8px 0; background: transparent; flex: 1; min-width: 80px; }
.offer-item-money input:focus { outline: none; box-shadow: none; }
.offer-item-monthly, .offer-item-quantity { padding: 8px 10px; border: 1px solid #d3d1c7; border-radius: 6px; }
.offer-item-actions { width: 36px; text-align: right; }
.offer-item-del { width: 22px; height: 22px; border-radius: 4px; border: none; background: transparent; color: #888780; font-size: 16px; line-height: 1; cursor: pointer; }
.offer-item-del:hover { background: #f5f5f4; color: #A32D2D; }
.offer-total { text-align: right; margin: 10px 4px 6px; font-size: 13px; color: #A32D2D; }
.offer-total span { font-weight: 600; }
.offer-form-actions { display: flex; justify-content: flex-end; margin-top: 18px; }
.offer-form-actions .btn-primary { min-width: 80px; }
@media (max-width: 720px) {
  .offer-form-grid { grid-template-columns: 1fr; }
  .offer-kpi-user-trigger, .offer-kpi-user-dropdown { width: 100%; }
}



/* ===== 任务中心（v20260901ad） ===== */
.task-page { display: flex; flex-direction: column; gap: 14px; }
.task-stats-row { display: flex; gap: 12px; }
.task-stat-card {
  flex: 1; min-width: 110px; background: #fff; border: 1px solid #efeee9;
  border-radius: 8px; padding: 12px 14px; text-align: center; cursor: pointer;
  transition: border-color .15s, box-shadow .15s;
}
.task-stat-card:hover { border-color: #d3d1c7; }
.task-stat-card.active { border-color: var(--accent-bright); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),.10); }
.task-stat-num { font-size: 26px; font-weight: 700; line-height: 1.1; }
.task-stat-label { font-size: 11px; color: #888780; margin-top: 3px; }

.task-toolbar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.task-scope { display: flex; gap: 2px; background: #f5f5f4; border-radius: 8px; padding: 2px; }
.task-scope-btn {
  padding: 6px 14px; font-size: 12px; color: #888780; border: none; background: none;
  border-radius: 6px; cursor: pointer;
}
.task-scope-btn:hover { color: #33322e; }
.task-scope-btn.active { background: #fff; color: var(--accent); font-weight: 600; box-shadow: 0 1px 2px rgba(0,0,0,.06); }
.task-scope-num {
  display: inline-block; min-width: 16px; margin-left: 4px; padding: 0 4px;
  font-size: 10px; line-height: 15px; text-align: center; color: #fff;
  background: #BA7517; border-radius: 8px;
}
.task-scope-btn.active .task-scope-num { background: var(--accent); }
.task-tag-me {
  display: inline-block; margin-left: 5px; padding: 0 5px;
  font-size: 10px; line-height: 15px; color: var(--accent);
  background: #EDFAFB; border: 1px solid #A5E5E9; border-radius: 3px;
}
.task-filter-tabs { display: flex; gap: 4px; }
.task-filter-tab {
  padding: 6px 12px; font-size: 12px; color: #33322e; background: #fff;
  border: 1px solid #e5e5e4; border-radius: 6px; cursor: pointer;
}
.task-filter-tab:hover { border-color: var(--accent-bright); color: var(--accent); }
.task-filter-tab.active { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 500; }
.task-toolbar-right { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.task-search {
  width: 260px; padding: 7px 10px; font-size: 12px; color: #2c2c2a;
  border: 1px solid #d3d1c7; border-radius: 6px; background: #fff;
}
.task-search:focus { outline: none; border-color: var(--accent-bright); }
.task-search-clear {
  margin-left: -26px; margin-right: 6px; color: #B4B2A9; cursor: pointer;
  font-size: 15px; line-height: 1; position: relative; z-index: 1;
}
.task-search-clear:hover { color: #A32D2D; }

table.task-table { background: #fff; border: 1px solid #efeee9; border-radius: 8px; overflow: hidden; }
table.task-table th {
  text-align: left; padding: 9px 10px; font-size: 11px; font-weight: 600; color: #888780;
  background: #FAFAF8; border-bottom: 1px solid #efeee9; white-space: nowrap;
}
table.task-table td {
  padding: 9px 10px; font-size: 12px; color: #3D3D3D;
  border-bottom: 1px solid #f5f4f0; vertical-align: middle;
}
table.task-table tbody tr:hover td { background: #FAFAF8; }
.task-row-done td { color: #B4B2A9; }
.task-row-done .task-msg { text-decoration: line-through; }
.task-priority { font-size: 11px; font-weight: 600; white-space: nowrap; }
.task-type { font-size: 11px; color: #33322e; white-space: nowrap; }
.task-msg { line-height: 1.5; }
.task-link { color: var(--accent); cursor: pointer; }
.task-link:hover { text-decoration: underline; }
.task-client { color: #B4B2A9; font-size: 11px; margin-left: 6px; }
.task-del {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 5px; color: #B4B2A9; font-size: 15px;
  line-height: 1; cursor: pointer;
}
.task-del:hover { background: #FCEBEB; color: #A32D2D; }
.task-empty { text-align: center; padding: 40px 16px; color: #B4B2A9; font-size: 12px; }

/* 新建任务弹窗 */
.task-input {
  width: 100%; padding: 8px 10px; font-size: 13px; color: #2c2c2a;
  border: 1px solid #d3d1c7; border-radius: 6px; background: #fff;
}
.task-input:focus { outline: none; border-color: var(--accent-bright); }
.task-textarea {
  width: 100%; min-height: 72px; padding: 8px 10px; font-size: 13px; color: #2c2c2a;
  border: 1px solid #d3d1c7; border-radius: 6px; background: #fff; resize: vertical;
  font-family: inherit; line-height: 1.5;
}
.task-textarea:focus { outline: none; border-color: var(--accent-bright); }
.task-hint {
  font-size: 11px; color: #888780; line-height: 1.6;
  background: #FAFAF8; border-radius: 6px; padding: 8px 10px; margin-top: 4px;
}
@media (max-width: 900px) {
  .task-stats-row { flex-wrap: wrap; }
  .task-toolbar-right { margin-left: 0; width: 100%; }
  .task-search { flex: 1; width: auto; }
}
/* 候选人详情：右上角「新页面」按钮（非全屏弹窗态显示，全屏/新页面态隐藏，避免与 ✕/最大化态冲突） */
.cand-detail-newpage {
  position: absolute;
  top: 10px;
  right: 50px;
  z-index: 60;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  height: 30px;
  padding: 0 12px;
  border: 1px solid #e5e5e4;
  border-radius: 16px;
  background: #fff;
  color: #33322e;
  font-size: 13px;
  cursor: pointer;
  box-shadow: 0 1px 5px rgba(0,0,0,.12);
  white-space: nowrap;
}
.cand-detail-newpage:hover { background: #f2f1ec; color: #26251f; }

/* ===========================================================================
   对话式 AI 人才搜索 Agent 页面（2026-09-17，REQ-034 / 批次 15）
   布局：顶部标题条 + 中间（左对话 / 右画像） + 底部输入区，整页占满可视高度
   =========================================================================== */
.ai-agent-page { display: flex; flex-direction: column; height: calc(100vh - 132px); min-height: 520px; }
.ai-agent-head { display: flex; align-items: center; gap: 10px; padding: 0 4px 10px; flex-wrap: wrap; }
.ai-agent-title { display: flex; align-items: center; gap: 8px; font-size: 15px; font-weight: 600; color: var(--accent-ink); }
.ai-agent-sub { font-size: 12px; font-weight: 400; color: #888780; }
.ai-agent-badge { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; padding: 1px 5px; border-radius: 4px; background: var(--accent-t14); color: var(--accent); }
.ai-agent-head-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.ai-agent-stat { font-size: 11px; color: var(--accent); background: var(--accent-t10); border-radius: 10px; padding: 3px 9px; }
.ai-agent-stat-dim { color: #B4B2A9; background: #f5f5f4; }
/* 「来自项目」上下文条（从项目的 AI搜索 进来时显示） */
.ai-agent-jobchip { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; background: #fff; border: 1px solid #e3e1d8; border-radius: 14px; padding: 3px 10px; }
.ai-agent-jobchip-label { color: #888780; }
.ai-agent-jobchip-hint { color: #B4B2A9; font-size: 11px; }
.ai-agent-body { flex: 1; min-height: 0; display: flex; gap: 12px; }
.ai-agent-chat { flex: 1; min-width: 0; overflow-y: auto; background: #fafaf8; border: 1px solid #ecebe3; border-radius: 10px; padding: 16px; }
.ai-agent-side { width: 300px; flex-shrink: 0; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; }
.ai-agent-side-card { background: #fff; border: 1px solid #ecebe3; border-radius: 10px; padding: 12px; }
.ai-agent-side-title { font-size: 13px; font-weight: 600; color: var(--accent-ink); margin-bottom: 8px; }
.ai-agent-side-hint { font-size: 11px; color: #888780; line-height: 1.5; margin-top: 6px; }
.ai-agent-p-row { display: flex; gap: 8px; padding: 3px 0; font-size: 12px; line-height: 1.5; }
.ai-agent-p-label { width: 40px; flex-shrink: 0; color: #888780; }
.ai-agent-p-val { flex: 1; min-width: 0; color: #1a1a1a; word-break: break-all; }
.ai-agent-ext-btns { display: flex; flex-wrap: wrap; gap: 6px; }
.ai-agent-row { display: flex; gap: 8px; margin-bottom: 14px; align-items: flex-start; }
.ai-agent-row-me { justify-content: flex-end; }
.ai-agent-avatar { width: 30px; height: 30px; border-radius: 50%; background: var(--accent-t14); display: flex; align-items: center; justify-content: center; font-size: 15px; flex-shrink: 0; }
.ai-agent-bubble { max-width: 78%; padding: 10px 12px; border-radius: 10px; font-size: 13px; line-height: 1.65; white-space: normal; }
.ai-agent-bubble-bot { background: #fff; border: 1px solid #ecebe3; color: #26251f; border-top-left-radius: 2px; }
.ai-agent-bubble-me { background: var(--accent); color: #fff; border-top-right-radius: 2px; }
.ai-agent-tip { margin-top: 6px; font-size: 11px; color: #B4B2A9; }
/**
 * ★ 批次 756（Randy）：AI 搜索「精读岗位核心要素 → 3~5 条要点 → 等顾问确认」的确认条。
 * 贴在对白最下方（不是钉在某条气泡上）：顾问中途补条件会多一轮对话，按钮还在他眼前。
 */
.ai-agent-confirm {
  margin: 10px 0 0 42px; padding: 10px 12px;
  border: 1px solid #C7D7FF; background: #F5F8FF; border-radius: 10px;
}
.ai-agent-confirm-text { font-size: 12px; color: #33477A; line-height: 1.6; }
.ai-agent-confirm-btns { margin-top: 8px; display: flex; gap: 8px; flex-wrap: wrap; }
.ai-agent-notice { margin-top: 8px; font-size: 12px; color: #BA7517; background: #BA75170d; border: 1px solid #BA751733; border-radius: 6px; padding: 6px 8px; }
.ai-agent-questions { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; }
.ai-agent-q { font-size: 12px; color: var(--accent); background: var(--accent-t0d); border-radius: 6px; padding: 5px 8px; cursor: pointer; }
.ai-agent-q:hover { background: var(--accent-t1a); }
.ai-agent-typing { color: #888780; }
.ai-agent-dots i { display: inline-block; width: 4px; height: 4px; margin-left: 3px; border-radius: 50%; background: #B4B2A9; animation: aiAgentDot 1s infinite; }
.ai-agent-dots i:nth-child(2) { animation-delay: .15s; }
.ai-agent-dots i:nth-child(3) { animation-delay: .3s; }
@keyframes aiAgentDot { 0%, 60%, 100% { opacity: .3 } 30% { opacity: 1 } }
.ai-agent-cands { margin-top: 10px; display: flex; flex-direction: column; gap: 8px; }
.ai-agent-cand { border: 1px solid #e5e5e4; border-radius: 8px; padding: 8px 10px; background: #fff; cursor: pointer; transition: border-color .15s, box-shadow .15s; }
.ai-agent-cand:hover { border-color: var(--accent); box-shadow: 0 2px 8px rgba(var(--accent-rgb),.12); }
.ai-agent-cand-top { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.ai-agent-cand-name { font-size: 13px; font-weight: 600; color: var(--accent-ink); }
.ai-agent-cand-score { font-size: 11px; font-weight: 600; padding: 1px 6px; border-radius: 8px; }
.ai-agent-cand-line { font-size: 12px; color: #3D3D3D; margin-top: 3px; }
.ai-agent-cand-meta { font-size: 11px; color: #888780; margin-top: 2px; }
.ai-agent-cand-reason { font-size: 11px; color: var(--accent); margin-top: 3px; }
.ai-agent-cand-open { font-size: 11px; color: #B4B2A9; margin-top: 4px; text-align: right; }
.ai-agent-examples { display: flex; flex-direction: column; gap: 6px; padding: 4px 2px 10px; }
.ai-agent-example { font-size: 12px; color: var(--accent); background: #fff; border: 1px dashed var(--accent-t33); border-radius: 8px; padding: 7px 10px; cursor: pointer; }
.ai-agent-example:hover { background: var(--accent-t0d); }
.ai-agent-input { display: flex; gap: 10px; align-items: flex-end; padding-top: 10px; }
.ai-agent-input textarea { flex: 1; min-height: 46px; max-height: 120px; resize: vertical; padding: 10px 12px; border: 1px solid #d3d1c7; border-radius: 10px; font-size: 13px; line-height: 1.5; outline: none; font-family: inherit; }
.ai-agent-input textarea:focus { border-color: var(--accent); }
.ai-agent-input-btns { display: flex; flex-direction: column; gap: 6px; }

/* 人才列表：列内搜索（🔍）与列排序图标（2026-09-17，批次 16） */
.cand-lib-table th { position: relative; }
.cand-col-tools { display: inline-flex; align-items: center; gap: 2px; margin-left: 4px; opacity: 0; transition: opacity .12s; vertical-align: middle; }
.cand-lib-table th:hover .cand-col-tools, .cand-col-tools.on { opacity: 1; }
/* 批次 354：客户页「项目」列表的表头也用同一套 hover 搜索图标（它用的是 job-lib-table） */
.job-lib-table th:hover .cand-col-tools, .job-lib-table .cand-col-tools.on { opacity: 1; }
/**
 * ★ 批次 657（Randy）：「这个升降序的上下箭头，做的小一些，还有鼠标移过去才出现」。
 *   项目列表每一列表头原来都挂着一个默认字号的 ⇅，把表头挤得很乱。
 *   现在：小号（9px）+ 平时透明，**鼠标移到这个表头才出现**；正在生效的那一列（↑/↓）恒亮，一眼看得出排序还在。
 */
.job-sort-ind { display: inline-block; margin-left: 3px; font-size: 9px; line-height: 1; color: #B4B2A9; opacity: 0; transition: opacity .12s; vertical-align: 1px; }
.job-lib-table th:hover .job-sort-ind { opacity: 1; }
.job-sort-ind.is-on { opacity: 1; color: var(--accent); font-weight: 700; }
/**
 * ★ 批次 662（Randy）：「项目列表中状态和项目参与者增加**修改入口**」——
 *   这两格里的就地编辑铅笔：**平时淡、鼠标移到这一格才亮**，避免每行都挂着一个显眼图标。
 */
.job-cell-edit { flex-shrink: 0; cursor: pointer; font-size: 11px; line-height: 1; color: #B4B2A9; opacity: .45; transition: opacity .12s, color .12s; padding: 1px 2px; border-radius: 4px; }
.job-cell-edit:hover { opacity: 1; color: var(--accent); background: var(--accent-t14); }
/**
 * ★ 批次 663（Randy：「项目参与者我们这么来显示表达」）：
 *   参与者格写成 **`主要顾问：Daniel Wang, BD：Randy Xu`** 这种一行串起来的样式 ——
 *   所以：整格允许换行（列窄了就折行），但**绝不在姓名/角色中间断字**（避免出现 "B / D：…" 那种断法），
 *   折行只发生在逗号之后；角色名深色加粗、跟一个全角冒号，人名仍沿用列表里的蓝色链接（点一下按人筛项目）。
 */
.job-cell-team { white-space: normal; word-break: keep-all; overflow-wrap: anywhere; line-height: 1.6; }
.job-team-group { word-break: keep-all; }
/* ★ 批次 704（Randy 2026-10-13，截图圈着项目参与者那一列）：
   「BD，顾问等，**不需要加粗**，和列表名一样的字体就好」→ 角色标签去掉 font-weight:600（恢复正常字重）。 */
.job-team-role { color: #3a382f; font-weight: 400; }
.job-team-name { white-space: nowrap; }
.job-team-sep { color: #B4B2A9; }
/* 批次 358：客户页头部的公司 logo（公网抓取）+ 谷露公司编号小标签 */
.client-detail-logo { height: 22px; width: auto; max-width: 88px; object-fit: contain; margin-right: 8px; vertical-align: middle; border-radius: 3px; }
.client-detail-gid { font-size: 11px; color: #8a8a82; margin-left: 6px; font-weight: 400; }
.cand-col-tool { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 4px; font-size: 11px; line-height: 1; cursor: pointer; color: #888780; background: #f5f5f4; }
.cand-col-tool:hover { background: var(--accent-t18); color: var(--accent); }
.cand-col-tool.on { background: var(--accent-t1f); color: var(--accent); font-weight: 700; }
.cand-col-tool-x { background: transparent; color: #A32D2D; }
.cand-col-filter-input { display: block; width: 100%; margin-top: 4px; padding: 2px 5px; font-size: 11px; font-weight: 400; border: 1px solid var(--accent); border-radius: 4px; outline: none; background: #fff; }
/* 更多菜单中的危险项（删除）：保留红色，不套用默认 add-menu-item 的紫色 hover */
.add-menu-item.add-menu-danger { color: #A32D2D; }
.add-menu-item.add-menu-danger:hover { background: #fbeeee; color: #A32D2D; }

/* ========== 15 分钟档位时间选择器（v20260902ad） ==========
   原生 datetime-local 分钟面板固定 0–59；自建 picker 改为
   隐藏 datetime-local（保留 id 作数据载体）+ 可见 [日期][小时][:][分钟 00/15/30/45]。 */
.qhp-wrap {
  display: flex;
  align-items: center;
  gap: 6px;
  width: 100%;
  min-width: 0;
}
.qhp-wrap .qhp-hidden {
  position: absolute;
  opacity: 0;
  pointer-events: none;
  width: 1px;
  height: 1px;
  left: -9999px;
  border: 0;
  padding: 0;
  margin: 0;
}
.qhp-wrap .qhp-date {
  flex: 1 1 58%;
  min-width: 0;
  width: auto;
  height: 34px;
  padding: 4px 8px;
}
.qhp-wrap .qhp-hour,
.qhp-wrap .qhp-min {
  flex: 0 0 64px;
  width: 64px;
  min-width: 0;
  height: 34px;
  padding: 4px 6px;
  text-align: center;
}
.qhp-colon {
  flex: 0 0 auto;
  color: #8A877E;
  font-weight: 600;
  font-size: 13px;
  line-height: 34px;
}
/* iv-modal（客户面试弹窗）两栏布局下保持紧凑 */
.iv-field .qhp-wrap { width: 100%; }
/* note-floating-modal：行内字段 100% 宽 */
.note-form-field .qhp-wrap { width: 100%; }
/* flow-event-edit-modal：常规表单行 */
.flow-event-edit-modal .qhp-wrap { max-width: 420px; }
@media (max-width: 480px) {
  .qhp-wrap .qhp-hour,
  .qhp-wrap .qhp-min { flex-basis: 56px; width: 56px; }
}

/* v20260902ba：首页 KPI 趋势图——周期下拉菜单 + 右上角图标 + 钻取表格行 hover */
.dash-trend-period-dd {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 10px;
  border: 1px solid #e5e5e4;
  border-radius: 6px;
  font-size: 12px;
  color: #2c2c2a;
  background: #fff;
  cursor: pointer;
  user-select: none;
  margin-right: 6px;
}
.dash-trend-period-dd:hover { border-color: var(--accent); color: var(--accent); }
.dash-trend-period-arrow { font-size: 9px; color: #888780; line-height: 1; }
.dash-trend-period-menu {
  display: none;
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  min-width: 96px;
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 6px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.08);
  z-index: 1000;
  padding: 4px 0;
}
.dash-trend-period-opt {
  padding: 6px 14px;
  font-size: 12px;
  color: #2c2c2a;
  cursor: pointer;
  white-space: nowrap;
}
.dash-trend-period-opt:hover { background: #f5f5f4; }
.dash-trend-period-opt.active { color: var(--accent); font-weight: 600; background: #f5f5f4; }

/* ★ 批次 612c（Randy）：首页「时间维度」选择器 —— 5 行 × 3 列档位 + 快捷档 + 财年开关 + 日期范围 */
.dash-section-title--row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
/**
 * ⚠️ 字重必须**显式**写 400：这个下拉挂在 `.dash-section-title`（600 粗体）里面，
 *    不写就会被继承成粗体 —— 整块选择器（触发器 / 15 个档位 / 财年 / 回显）都会发胖。
 *    2026-10-10 Randy 看图后明确要求「这里字体不用加粗」。
 */
.dash-range-dd {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 10px;
  border: 1px solid #e5e5e4;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 400;
  color: #2c2c2a;
  background: #fff;
  cursor: pointer;
  user-select: none;
}
.dash-range-dd:hover { border-color: var(--accent); color: var(--accent); }
.dash-range-arrow { font-size: 9px; color: #888780; line-height: 1; }
.dash-range-menu {
  display: none;
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  min-width: 372px;
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 8px;
  box-shadow: 0 6px 18px rgba(0,0,0,0.10);
  z-index: 1000;
  padding: 8px 10px;
}
.dash-range-row { display: flex; gap: 4px; margin-bottom: 2px; }
.dash-range-cell {
  flex: 1;
  text-align: center;
  padding: 6px 4px;
  font-size: 12px;
  font-weight: 400;
  color: #2c2c2a;
  border-radius: 6px;
  cursor: pointer;
  white-space: nowrap;
}
.dash-range-cell:hover { background: #f5f5f4; }
/* 选中态只靠"浅底 + 主题色"表达，不再加粗（Randy：字体不用加粗） */
.dash-range-cell.active { color: var(--accent); background: #eef6f5; }
.dash-range-row--quick .dash-range-cell { font-size: 11.5px; padding: 5px 2px; }
.dash-range-sep { height: 1px; background: #ececea; margin: 6px 0; }
.dash-range-fiscal { display: flex; align-items: center; justify-content: space-between; padding: 2px 6px; font-size: 12px; font-weight: 400; color: #33322e; }
.dash-range-switch {
  min-width: 34px;
  text-align: center;
  padding: 2px 8px;
  border-radius: 999px;
  border: 1px solid #e5e5e4;
  color: #888780;
  font-size: 11.5px;
  font-weight: 400;
  cursor: pointer;
}
.dash-range-switch.on { border-color: var(--accent); color: #fff; background: var(--accent); }
.dash-range-custom { display: flex; align-items: center; gap: 6px; padding: 4px 6px; }
.dash-range-date {
  flex: 1;
  min-width: 0;
  font-size: 12px;
  font-weight: 400;
  padding: 3px 6px;
  border: 1px solid #e5e5e4;
  border-radius: 6px;
  color: #2c2c2a;
  background: #fff;
}
.dash-range-tilde { color: #888780; }
.dash-range-clear { cursor: pointer; color: #888780; font-size: 12px; padding: 0 4px; }
.dash-range-clear:hover { color: #E64545; }
.dash-range-echo { font-size: 11.5px; font-weight: 400; color: #888780; padding: 4px 6px 2px; }
.dash-range-echo-inline { font-size: 11.5px; font-weight: 400; color: #888780; margin-right: 6px; white-space: nowrap; }

/* ★ 批次 616（Randy）：首页 KPI 趋势图「按团队看」下拉（**仅管理员**）——
   外观沿用原来那个只读的「全公司」小标签（灰底圆角），但现在是可点的。
   ⚠️ 团队名可能很长（如 "Automotive & Industrial Team"），所以菜单给 max-width + 省略号。 */
.dash-team-dd {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-left: 8px;
  font-size: 11px;
  font-weight: 400;
  color: #33322e;
  background: #F4F3EF;
  border: 1px solid #ECEAE5;
  border-radius: 999px;
  padding: 1px 8px;
  cursor: pointer;
  user-select: none;
}
.dash-team-dd:hover { border-color: var(--accent); color: var(--accent); }
.dash-team-arrow { font-size: 9px; color: #888780; line-height: 1; }
.dash-team-menu {
  display: none;
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  min-width: 168px;
  max-width: 260px;
  max-height: 320px;
  overflow: auto;
  background: #fff;
  border: 1px solid #e5e5e4;
  border-radius: 8px;
  box-shadow: 0 6px 18px rgba(0,0,0,0.10);
  z-index: 1000;
  padding: 4px 0;
}
.dash-team-opt { padding: 6px 12px; font-size: 12px; font-weight: 400; color: #2c2c2a; cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dash-team-opt:hover { background: #f5f5f4; }
.dash-team-opt.active { color: var(--accent); background: #eef6f5; }
.dash-team-sep { height: 1px; background: #ececea; margin: 4px 0; }
.dash-trend-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 6px;
  font-size: 14px;
  color: #888780;
  cursor: pointer;
  user-select: none;
}
.dash-trend-icon:hover { background: #f5f5f4; color: var(--accent); }
/* 钻取弹窗表格行 hover 高亮 */
.dash-drilldown-table tbody tr:hover { background: #f8f7f4; }

/* ===== v20260904j：项目页「搜索订阅」5 类目筛选 =====
   类目按钮行 + 展开面板 + 「输入筛选」行（已选 pills / 内联输入框 / ▾ / 面板）。
   视觉与人才库筛选组件（.cand-filter-select 系列）保持一致。 */
.job-search-bar { display:flex; flex-direction:column; gap:8px; width:100%; }
.job-cat-row { display:flex; gap:6px; flex-wrap:wrap; align-items:center; position:relative; }
.job-cat-chip {
  display:inline-flex; align-items:center; gap:4px; cursor:pointer; user-select:none;
  padding:5px 10px; border-radius:14px; font-size:12px; white-space:nowrap;
  border:1px solid #e3e1d7; background:#fff; color:#33322e;
}
.job-cat-chip:hover { border-color:var(--accent); color:var(--accent); }
.job-cat-chip.has-sel { border-color:var(--accent); background:var(--accent-t0f); color:var(--accent); font-weight:600; }
.job-cat-chip.is-open { border-color:var(--accent); box-shadow:0 0 0 2px var(--accent-t1a); }
.job-cat-chip b { font-size:10px; background:var(--accent); color:#fff; border-radius:8px; padding:0 5px; font-weight:600; }
.job-cat-arrow { font-size:9px; color:#888780; }
.job-cat-clear { font-size:12px; color:#A32D2D; cursor:pointer; padding:5px 6px; }
.job-cat-clear:hover { text-decoration:underline; }
.job-sub-btn { font-size:12px; margin-left:auto; }
.job-cat-panel { display:flex; flex-direction:column; align-items:flex-start; gap:6px; padding:8px 10px; background:#fafaf8; border:1px solid #f1efe8; border-radius:8px; }
.job-cat-summary { font-size:11px; color:#888780; }
/* 「输入筛选」行：规范① 已选 pills + 内联输入框 + ▾ 同一行 */
/* 规范②：白底 + 浅灰描边 + 无占位文字 */
.job-f-inline input {
  box-sizing:border-box; flex:1 1 auto; min-width:72px; height:100%; padding:0 8px;
  background:#fff; border:1px solid #d3d1c7; border-radius:6px; outline:none;
  font-size:12px; color:#33322e;
}
/* 规范⑥：面板 8px 圆角 + #E5E4DF 描边 */
.job-f-item {
  display:flex; align-items:center; gap:6px; padding:6px 12px; font-size:12px;
  cursor:pointer; color:#33322e; white-space:nowrap;
}
.job-f-label { flex:1; }
.job-f-count { color:#B4B2A9; font-size:11px; }
.job-f-empty { display:none; padding:6px 12px; font-size:12px; color:#a8a69e; white-space:nowrap; }
/* v20260904k：面板锚在类目正下方（覆盖在表格上），对齐参考图（飞书多维表格式） */
.job-cat-wrap { position:relative; display:inline-flex; }
.job-cat-panel {
  position:absolute; top:calc(100% + 6px); left:0; z-index:80;
  width:264px; display:flex; flex-direction:column; gap:8px;
  padding:10px; background:#fff; border:1px solid #E5E4DF; border-radius:8px;
  box-shadow:0 6px 20px rgba(0,0,0,0.10); text-align:left;
}
.job-cat-chip { position:relative; z-index:81; }
.job-cat-chip.is-open { background:var(--accent); color:#fff; border-color:var(--accent); }
.job-cat-chip.is-open .job-cat-arrow { color:#fff; }
.job-f-op {
  width:100%; box-sizing:border-box; padding:6px 8px; font-size:12px; color:#33322e;
  border:1px solid #d3d1c7; border-radius:6px; background:#fff; outline:none; cursor:pointer;
}
.job-f-search input {
  width:100%; box-sizing:border-box; padding:6px 8px 6px 24px; font-size:12px;
  border:1px solid #d3d1c7; border-radius:6px; background:#fff; outline:none; color:#33322e;
}
.job-f-search { position:relative; }
.job-f-search::before {
  content:''; position:absolute; left:8px; top:50%; transform:translateY(-50%);
  width:11px; height:11px; border:1.5px solid #B4B2A9; border-radius:50%;
}
.job-f-search::after {
  content:''; position:absolute; left:17px; top:calc(50% + 4px);
  width:5px; height:1.5px; background:#B4B2A9; transform:rotate(45deg);
}
.job-f-list { max-height:216px; overflow-y:auto; display:flex; flex-direction:column; }
.job-f-item {
  display:flex; align-items:center; gap:8px; padding:6px 6px; font-size:12px;
  cursor:pointer; color:#33322e; white-space:nowrap; border-radius:6px;
}
/* 参考图2/3 的方形勾选框 */
.job-f-box {
  flex:0 0 auto; width:14px; height:14px; box-sizing:border-box;
  border:1px solid #d3d1c7; border-radius:3px; background:#fff;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:10px; line-height:1; color:#fff;
}
.job-f-box.on { background:var(--accent); border-color:var(--accent); }
.job-f-label { flex:1; overflow:hidden; text-overflow:ellipsis; }
.job-f-count { flex:0 0 auto; color:#B4B2A9; font-size:11px; }
.job-f-empty { display:none; padding:8px 6px; font-size:12px; color:#a8a69e; }
.job-f-val {
  width:100%; box-sizing:border-box; padding:7px 9px; font-size:12px;
  border:1px solid #d3d1c7; border-radius:6px; background:#fff; outline:none; color:#33322e;
}
.job-f-val:focus, .job-f-search input:focus { border-color:var(--accent); }
.job-f-actions { display:flex; justify-content:flex-end; }
.job-f-apply { padding:5px 18px; font-size:12px; border:1px solid #d3d1c7; background:#fff; color:#33322e; border-radius:6px; cursor:pointer; }
.job-f-apply:hover { border-color:var(--accent); color:var(--accent); }
.job-f-hint { font-size:11px; color:#B4B2A9; }

/* v20260906hk：搜索筛选面板 = 上方两列区（.lp-two-col，宽度由 JS 同步到右边缘对齐「自定义」）
   + 下方 chip 行（.lp-row-full，保持全宽）。旧写法把 chip 行也放进 grid，导致约束列宽时 chip 行被一起压窄。 */
.lp-filters { display: block; }
.lp-filters > * { min-width: 0; }
.lp-two-col {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0 12px;
  align-items: stretch;
  justify-content: start;   /* 列宽被 JS 固定后整体靠左，右侧留白 */
}
.lp-two-col > .lp-row-left { grid-column: 1; min-width: 0; }
.lp-two-col > .lp-row-right { grid-column: 2; min-width: 0; }
.lp-two-col > * { min-width: 0; }
/* v20260906ke · KB 共享权限徽标 + 详情头 + 只读标签 */
.kb-perm-badge {
  display: inline-block;
  padding: 2px 8px;
  font-size: 11.5px;
  font-weight: 500;
  border-radius: 999px;
  margin-left: 6px;
  vertical-align: middle;
  letter-spacing: 0.2px;
  white-space: nowrap;
}
.kb-perm-owner {
  background: #f4ebe0;
  color: #8b5a2b;
  border: 1px solid #e0cfa8;
}
.kb-perm-admin {
  background: #e3f2f2;
  color: var(--accent-2);
  border: 1px solid #b8dedd;
}
.kb-perm-feed {
  background: #e6f4ec;
  color: #166d3b;
  border: 1px solid #b6e1c5;
}
.kb-perm-read {
  background: #f4f5f7;
  color: #64635d;
  border: 1px solid #dcdee2;
}
.kb-card-readonly {
  display: inline-block;
  padding: 4px 10px;
  font-size: 12px;
  color: #8a8a86;
  background: #faf9f7;
  border: 1px dashed #d8d6cf;
  border-radius: 6px;
}
.kb-detail-head {
  flex-wrap: wrap;
  gap: 12px;
}
.kb-detail-head-tags {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
}
.kb-detail-head-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
  margin-left: auto;
}
.kb-perm-label {
  display: inline-block;
  padding: 2px 8px;
  font-size: 11px;
  color: #8b5a2b;
  background: #f4ebe0;
  border-radius: 999px;
}
.kb-doc-actions-readonly {
  font-size: 12.5px;
  color: #8a8a86;
  background: #faf9f7;
  border: 1px dashed #d8d6cf;
  padding: 8px 12px;
  border-radius: 8px;
  margin-top: 10px;
}

/* KB 共享管理弹层 */
.kb-share-section {
  margin-bottom: 14px;
}
.kb-share-section-title {
  font-size: 12px;
  font-weight: 600;
  color: #6f6e6a;
  margin: 0 0 8px 0;
  display: flex;
  align-items: center;
  gap: 6px;
}
.kb-share-row {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 0.5fr;
  align-items: center;
  gap: 10px;
  padding: 6px 8px;
  border-radius: 8px;
  background: #fff;
}
.kb-share-row:hover { background: #faf9f7; }
.kb-share-row-head {
  background: transparent;
  color: #6f6e6a;
  font-size: 11.5px;
  font-weight: 600;
  border-bottom: 1px solid #f1efe9;
}
.kb-share-row-owner {
  background: #faf6ec;
  border: 1px solid #efe4cd;
}
.kb-share-perm {
  width: 100%;
  font-size: 12px;
  padding: 4px 6px;
}
.kb-share-add {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;             /* v20260906kf：允许换行，避免 select 把 input 挤 0 宽 */
}
.kb-share-add > div:first-child {
  flex: 1 1 220px;             /* v20260906kf：basis 220px 让 input 一定有空间；grow 抢占剩余空间 */
  min-width: 0;
  position: relative;
}
.kb-share-add > select {
  flex: 0 1 220px;             /* v20260906kf：select 可收缩，最大 220px（中文长文不撑爆 row） */
  min-width: 140px;
}
.kb-share-add > button {
  flex: 0 0 auto;              /* v20260906kf：button 保持内容尺寸、不被 shrink */
  white-space: nowrap;
}
.kb-share-hint {
  font-size: 12px;
  color: #8a8a86;
  margin-top: 8px;
  line-height: 1.5;
}
.kb-share-suggest {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  max-height: 220px;
  overflow-y: auto;
  background: #fff;
  border: 1px solid #e6e3dc;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.08);
  z-index: 60;
  margin-top: 4px;
}
.kb-share-suggest-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  cursor: pointer;
  border-bottom: 1px solid #f5f3ec;
}
.kb-share-suggest-item:last-child { border-bottom: none; }
.kb-share-suggest-item:hover { background: #faf6ec; }
.kb-share-suggest-name { font-size: 13px; font-weight: 500; }
.kb-share-suggest-team { font-size: 11.5px; color: #8a8a86; }
.kb-share-suggest-empty {
  padding: 14px;
  text-align: center;
  color: #9a9a96;
  font-size: 12px;
}

/* ===== BBS 内部论坛（v20260909bbs）===== */
.bbs-page { padding: 4px 0 24px; }
.bbs-head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 16px; margin-bottom: 16px;
}
.bbs-title { font-size: 20px; font-weight: 600; color: #1f2328; letter-spacing: 0.2px; }
.bbs-sub { margin-top: 4px; font-size: 12.5px; color: #8a8a86; }
.bbs-actions { flex: 0 0 auto; }

.bbs-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 12px;
}
.bbs-cats { display: flex; gap: 6px; flex-wrap: wrap; }
.bbs-tab {
  padding: 6px 14px; font-size: 13px; border: 1px solid #e2e0d8;
  background: #fff; color: #5c5c58; border-radius: 999px; cursor: pointer;
  transition: all .15s;
}
.bbs-tab:hover { border-color: var(--accent); color: var(--accent); }
.bbs-tab.active {
  background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 500;
}
.bbs-tools { display: flex; gap: 8px; align-items: center; }
.bbs-search {
  width: 230px; padding: 7px 11px; font-size: 13px;
  border: 1px solid #dcd9d0; border-radius: 6px; background: #fff; color: #1f2328;
  box-sizing: border-box;
}
.bbs-search:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.10); }
.bbs-sort {
  padding: 7px 10px; font-size: 13px; border: 1px solid #dcd9d0;
  border-radius: 6px; background: #fff; color: #1f2328; cursor: pointer;
}

.bbs-board {
  border: 1px solid #e6e3dc; border-radius: 8px; background: #fff; overflow: hidden;
}
.bbs-board-head {
  display: grid; grid-template-columns: 1fr 150px 130px 110px;
  gap: 12px; padding: 10px 16px; background: #faf8f2;
  font-size: 12px; color: #8a8a86; border-bottom: 1px solid #e6e3dc;
}
.bbs-row {
  display: grid; grid-template-columns: 1fr 150px 130px 110px;
  gap: 12px; align-items: center; padding: 12px 16px;
  border-bottom: 1px solid #f1efe8; cursor: pointer; transition: background .12s;
}
.bbs-row:last-child { border-bottom: none; }
.bbs-row:hover { background: #faf9f5; }
.bbs-row-pinned { background: #fdfaf0; }
.bbs-row-pinned:hover { background: #fbf6e8; }
.bbs-row-main { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.bbs-row-title {
  font-size: 14px; font-weight: 500; color: #1f2328;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bbs-row-preview {
  font-size: 12px; color: #9a9a96;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bbs-row-author {
  display: flex; align-items: center; gap: 6px;
  font-size: 12.5px; color: #6a6a66; overflow: hidden;
}
.bbs-row-stat { display: flex; gap: 10px; font-size: 12px; color: #9a9a96; }
.bbs-row-last { font-size: 12px; color: #9a9a96; text-align: right; }
.bbs-foot { margin-top: 10px; font-size: 12px; color: #9a9a96; }

.bbs-avatar {
  display: inline-block; flex: 0 0 auto; border-radius: 50%;
  background: linear-gradient(135deg, var(--accent), #0f8a91);
  color: #fff; text-align: center; font-weight: 600; overflow: hidden;
}

.bbs-cat {
  display: inline-block; padding: 1px 8px; border-radius: 4px;
  font-size: 11.5px; font-weight: 500; margin-right: 6px; vertical-align: middle;
}
.bbs-cat-announce { background: #fdecea; color: #c0392b; }
.bbs-cat-discuss { background: #e8f2f2; color: var(--accent); }
.bbs-cat-qa { background: #fdf3e3; color: #b26b0f; }
.bbs-cat-share { background: #eaf2f8; color: #35658f; }
.bbs-flag {
  display: inline-block; padding: 1px 7px; border-radius: 4px;
  font-size: 11.5px; margin-right: 6px; vertical-align: middle;
}
.bbs-flag-pin { background: #fdecea; color: #c0392b; }
.bbs-flag-lock { background: #eceae4; color: #7a7a76; }

.bbs-empty { padding: 60px 20px; text-align: center; }
.bbs-empty-icon { font-size: 40px; opacity: .5; }
.bbs-empty-title { margin-top: 10px; font-size: 15px; font-weight: 500; color: #4a4a46; }
.bbs-empty-hint { margin-top: 6px; font-size: 12.5px; color: #9a9a96; }

.bbs-crumb { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: #8a8a86; }
.bbs-back {
  background: none; border: none; color: var(--accent); font-size: 13px; cursor: pointer; padding: 0;
}
.bbs-back:hover { text-decoration: underline; }
.bbs-crumb-sep { color: #cfccc4; }
.bbs-post {
  border: 1px solid #e6e3dc; border-radius: 8px; background: #fff; padding: 20px 22px;
}
.bbs-post-head { display: flex; flex-direction: column; gap: 8px; }
.bbs-post-title { margin: 0; font-size: 19px; font-weight: 600; color: #1f2328; line-height: 1.4; }
.bbs-post-tags { display: flex; align-items: center; flex-wrap: wrap; }
.bbs-post-author {
  display: flex; align-items: center; gap: 10px; margin: 14px 0;
  padding-bottom: 14px; border-bottom: 1px solid #f1efe8;
}
.bbs-post-name { font-size: 13.5px; font-weight: 500; color: #1f2328; }
.bbs-post-time { font-size: 12px; color: #9a9a96; margin-top: 2px; }
.bbs-post-content {
  font-size: 14px; line-height: 1.8; color: #2f3338;
  white-space: pre-wrap; word-break: break-word; padding: 6px 0 16px;
}
.bbs-post-foot {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  padding-top: 14px; border-top: 1px solid #f1efe8;
}
.bbs-post-stat { font-size: 12.5px; color: #9a9a96; }
.bbs-post-ops { margin-left: auto; display: flex; gap: 8px; }

.bbs-like {
  padding: 5px 14px; font-size: 13px; border-radius: 999px; cursor: pointer;
  border: 1px solid #dcd9d0; background: #fff; color: #6a6a66; transition: all .15s;
}
.bbs-like:hover { border-color: var(--accent); color: var(--accent); }
.bbs-like.active { background: #e8f2f2; border-color: var(--accent); color: var(--accent); font-weight: 500; }

.bbs-mini {
  padding: 3px 9px; font-size: 12px; border-radius: 4px; cursor: pointer;
  border: 1px solid #e2e0d8; background: #fff; color: #6a6a66;
}
.bbs-mini:hover { border-color: var(--accent); color: var(--accent); }
.bbs-mini.active { background: #e8f2f2; border-color: var(--accent); color: var(--accent); }
.bbs-mini.danger { color: #b4453a; }
.bbs-mini.danger:hover { border-color: #E7857D; background: #fdf2f1; }

.bbs-replies { margin-top: 18px; }
.bbs-replies-title { font-size: 14px; font-weight: 600; color: #1f2328; margin-bottom: 10px; }
.bbs-reply {
  display: flex; gap: 12px; padding: 14px 16px; margin-bottom: 10px;
  border: 1px solid #e6e3dc; border-radius: 8px; background: #fff;
}
.bbs-reply-side { flex: 0 0 auto; text-align: center; width: 60px; }
.bbs-reply-name { margin-top: 5px; font-size: 12px; color: #6a6a66; word-break: break-all; }
.bbs-reply-body { flex: 1; min-width: 0; }
.bbs-reply-meta { display: flex; align-items: center; gap: 10px; font-size: 12px; color: #9a9a96; margin-bottom: 6px; }
.bbs-reply-content { font-size: 13.5px; line-height: 1.75; color: #2f3338; white-space: pre-wrap; word-break: break-word; }
.bbs-quote {
  margin-bottom: 6px; padding: 6px 10px; border-left: 3px solid #ddd9cf;
  background: #faf9f5; font-size: 12.5px; color: #8a8a86; border-radius: 0 4px 4px 0;
}
.bbs-empty-inline { padding: 20px; text-align: center; font-size: 13px; color: #9a9a96; }

.bbs-editor {
  margin-top: 14px; padding: 16px 18px;
  border: 1px solid #e6e3dc; border-radius: 8px; background: #fff;
}
.bbs-editor-title { font-size: 13.5px; font-weight: 600; color: #1f2328; margin-bottom: 10px; }
.bbs-editor-foot { display: flex; justify-content: flex-end; margin-top: 10px; }
.bbs-replyto {
  margin-bottom: 8px; font-size: 12.5px; color: var(--accent);
  display: flex; align-items: center; gap: 8px;
}
.bbs-textarea {
  width: 100%; padding: 10px 12px; font-size: 13.5px; line-height: 1.7;
  border: 1px solid #dcd9d0; border-radius: 6px; resize: vertical;
  font-family: inherit; color: #1f2328; background: #fff; box-sizing: border-box;
}
.bbs-textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.10); }
.bbs-input {
  width: 100%; padding: 8px 11px; font-size: 13.5px;
  border: 1px solid #dcd9d0; border-radius: 6px; color: #1f2328;
  background: #fff; box-sizing: border-box;
}
.bbs-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.10); }
.bbs-select {
  width: 100%; padding: 8px 11px; font-size: 13.5px;
  border: 1px solid #dcd9d0; border-radius: 6px; color: #1f2328;
  background: #fff; box-sizing: border-box; cursor: pointer;
}
.bbs-locked {
  margin-top: 14px; padding: 14px; text-align: center; font-size: 13px; color: #8a8a86;
  border: 1px dashed #ddd9cf; border-radius: 8px; background: #faf9f5;
}

.bbs-modal { padding: 26px 30px; box-sizing: border-box; }
.bbs-modal-title { margin: 0 0 18px; font-size: 18px; font-weight: 600; color: #1f2328; }
.bbs-field { margin-bottom: 16px; }
.bbs-field label {
  display: block; margin-bottom: 6px; font-size: 12.5px; font-weight: 500; color: #5c5c58;
}
.bbs-modal-foot { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; padding-top: 14px; border-top: 1px solid #f1efe8; }

/* ===== 候选人详情「归属数据」区（v20260910att，5 字段版本）=====
   固定在 candTabPanel 之外、所有 tab 通用，详情页最底端 */
.cand-attribution {
  margin: 20px 0 4px;
  padding: 14px 18px 12px;
  background: #fafaf8;
  border: 1px solid #ece9df;
  border-radius: 10px;
}
.cand-attribution-head {
  display: flex; align-items: center; gap: 6px;
  font-size: 13.5px; font-weight: 600; color: #1f2328;
  padding-bottom: 10px; margin-bottom: 10px;
  border-bottom: 1px solid #ece9df;
}
.cand-attribution-head-icon { color: var(--accent); font-size: 14px; }
.cand-attribution-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 6px 24px;
}
.cand-attribution-item {
  display: flex; align-items: center; gap: 10px;
  padding: 5px 0; min-width: 0;
}
.cand-attribution-label {
  color: #8a8a86; font-size: 12.5px; flex: 0 0 70px;
}
.cand-attribution-value {
  color: #1f2328; font-size: 12.5px; font-weight: 500;
  flex: 1; min-width: 0; word-break: break-all;
}
.cand-attribution-value .tag { margin-right: 4px; vertical-align: middle; }
/* 批次 170：归属数据最下面那行「🔄 重新编码」（仅管理员可见） */
.cand-attribution-foot {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 10px; padding-top: 10px; border-top: 1px dashed #e6e4dd;
}
.cand-attribution-foot-tip { font-size: 10.5px; color: #B4B2A9; }
/* 在右栏（窄）下变单列 */
@media (max-width: 900px) {
  .cand-attribution-grid { grid-template-columns: 1fr; gap: 4px; }
}

/* ============================================================
   REQ-002 人才地图 · 思维导图编辑器（2026-09-14）
   ============================================================ */
/* —— 全屏专注模式：打开一张导图时占满整屏，去掉弹窗边距/圆角/标题栏 —— */
.modal-overlay.mm-focus { padding: 0; align-items: stretch; }
.modal-overlay.mm-focus .modal {
  width: 100vw; height: 100vh; max-width: none; max-height: none;
  border-radius: 0; padding: 0; display: flex; flex-direction: column; overflow: hidden;
}
.modal-overlay.mm-focus .modal-title,
.modal-overlay.mm-focus .modal-header,
.modal-overlay.mm-focus .modal-close { display: none !important; }
/* 全屏专注模式：把旧弹窗残留的摘要行 / 元信息行 / 工具条行全部收掉，
   只保留「顶栏 + 画布 + 浮动工具条」，让画布真正吃满屏幕 */
.modal-overlay.mm-focus #modalContent > div:not(.mm-focus-head):not(.mm-focus-body) { display: none !important; }
.mm-focus-head {
  flex: none; height: 46px; display: flex; align-items: center; gap: 10px;
  padding: 0 14px; border-bottom: 1px solid #ececeb; background: #fff;
}
.mm-focus-head .mm-hbtn {
  border: none; background: transparent; cursor: pointer; font-size: 15px; color: #33322e;
  padding: 5px 8px; border-radius: 6px; line-height: 1;
}
.mm-focus-head .mm-hbtn:hover { background: #f2f6f6; color: var(--accent); }
.mm-focus-head .mm-map-title {
  font-size: 14px; font-weight: 600; color: #2F2D2A; padding: 4px 8px; border-radius: 6px;
  outline: none; min-width: 60px; max-width: 46vw; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.mm-focus-head .mm-map-title:focus { background: #f2f6f6; box-shadow: 0 0 0 1px #cfdedd inset; }
.mm-focus-head .mm-hspacer { flex: 1; }
.mm-focus-body { position: relative; flex: 1; overflow: hidden; }
.mm-float-tools {
  position: absolute; left: 12px; top: 12px; z-index: 6; display: flex; align-items: center; gap: 2px;
  background: #fff; border: 1px solid #ececeb; border-radius: 10px; padding: 4px 6px;
  box-shadow: 0 2px 10px rgba(0,0,0,.07);
}
.mm-float-tools .mm-hbtn { border: none; background: transparent; cursor: pointer; font-size: 14px; color: #33322e; padding: 4px 7px; border-radius: 6px; line-height: 1; }
.mm-float-tools .mm-hbtn:hover { background: #f2f6f6; color: var(--accent); }
.mm-float-tools .mm-hbtn:disabled { opacity: .35; cursor: not-allowed; }
.mm-watermark {
  position: absolute; inset: 0; z-index: 1; pointer-events: none; overflow: hidden;
  /* 全屏平铺（Randy 2026-09-15）：背景瓦片由 JS 生成（含姓名+日期），这里只负责重复铺满 */
  background-repeat: repeat;
  background-position: 0 0;
  /* 拖拽节点时鼠标会划过水印文字，浏览器默认会把它当成"文本选择"高亮成蓝底（Randy 2026-09-15 反馈）。
     水印只是背景装饰，禁止选中即可根治。 */
  user-select: none; -webkit-user-select: none;
}
/* 画布本身也禁止选中：拖拽/双击空白时不会再出现蓝色文本选区 */
.mm-canvas-box, .mm-stage { user-select: none; -webkit-user-select: none; }

.mm-wrap { position: relative; outline: none; }
.mm-toolbar { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; padding: 6px 2px 10px; border-bottom: 1px solid #f1efe8; margin-bottom: 8px; }
.mm-toolbar .mm-tbtn { font-size: 12px; padding: 4px 10px; border: 1px solid #e5e5e4; background: #fff; border-radius: 6px; cursor: pointer; color: #33322e; }
.mm-toolbar .mm-tbtn:hover { border-color: var(--accent-bright); color: var(--accent); }
.mm-toolbar .mm-tbtn:disabled { opacity: .45; cursor: not-allowed; }
.mm-toolbar .mm-tbtn.mm-primary { background: var(--accent); border-color: var(--accent); color: #fff; }
.mm-canvas-box { position: absolute; inset: 0; overflow: hidden; background: #fdfdfc; cursor: grab; }
.mm-canvas-box.mm-panning { cursor: grabbing; }
.mm-stage { position: absolute; left: 0; top: 0; transform-origin: 0 0; }
/* ============================================================================
   公司页 Mapping「页内画布」（2026-09-29 批次 314 / Randy）
   ----------------------------------------------------------------------------
   Randy 原话："公司页面下点击 mapping，不是要满屏显示，而是在下面显示，编辑的时候才满屏。"
   根因：页内那格原来直接复用编辑器的 .mm-canvas-box（position:absolute; inset:0），
        而它**必须有定位祖先**（编辑器里是 .mm-focus-body）。页内容器没 position →
        画布按最近的定位祖先（.modal）铺开（实测 594×430 @(33,35)，与弹窗同宽同位），
        把公司页的头部/标签栏/选择器整片盖住 —— 看着就是"点一下就满屏"。
   修法：① 页内容器 .cmp-map-preview 明确 position:relative（双保险）；
        ② 页内画布改用自带基准的 .cmp-map-canvas（relative + 固定高度），不再用绝对定位类。
   ============================================================================ */
.cmp-map-preview { position: relative; }
.cmp-map-canvas { position: relative; inset: auto; height: 430px; overflow: hidden; background: #fdfdfc; cursor: grab; border: 1px solid #ECECEA; border-radius: 8px; user-select: none; -webkit-user-select: none; }
.cmp-map-canvas.mm-panning { cursor: grabbing; }
/* ============================================================================
   全系统水印层（2026-09-29 批次 315 / Randy）
   ----------------------------------------------------------------------------
   Randy 原话："在整个系统所有页面打上水印：顾问姓名 时间 CPS Consulting，
   要求：淡到不影响系统使用和查看，但要有水印保护系统信息安全，参考效果如图"
   做法：固定铺满视口的一层装饰层
        · pointer-events:none —— **永远不吃点击**，不影响任何操作；
        · 背景 = 一张 SVG 瓦片（姓名 + 日期 + CPS CONSULTING，-28° 斜排）平铺，
          由 app.js `applyGlobalWatermark()` 按当前登录人生成（很淡，不影响阅读）；
        · z-index 压在所有弹窗/浮层之上（.modal-overlay=1000）——候选人详情、
          简历、Mapping、报表这些敏感页同样带水印，截图外泄可追溯；
        · 打印 / 另存为 PDF 也保留。
   ============================================================================ */
.cps-watermark {
  position: fixed; inset: 0; z-index: 2147483000; pointer-events: none;
  display: none; background-repeat: repeat; background-position: 0 0;
  user-select: none; -webkit-user-select: none;
}
.cps-watermark.show { display: block; }
@media print { .cps-watermark.show { display: block; } }
/* 节点样式对齐参考图：根节点=实色方块；一二级=浅蓝药丸；叶子=极浅底 */
/* 2026-09-15（Randy：字小一点，看起来更协调）：字号 13→12、内边距与圆角同步收小 */
.mm-node { position: absolute; box-sizing: border-box; padding: 6px 10px; background: #F1F6FD; border: 1px solid #D8E4F5; border-radius: 6px; font-size: 12.5px; color: #2D2C29; cursor: pointer; user-select: none; display: flex; align-items: center; gap: 6px; transition: border-color .12s, box-shadow .12s; }
.mm-node:hover { border-color: #9DB8DE; }
.mm-node.mm-sel { border-color: #3B7DE0; box-shadow: 0 0 0 2px rgba(59,125,224,.18); }
.mm-node.mm-dragging { opacity: .5; }
.mm-node.mm-drop { border-color: #BA7517; box-shadow: 0 0 0 2px rgba(186,117,23,.25); }
.mm-node { overflow: hidden; }   /* 框宽自适应后，超长文字按框裁掉，不撑破布局 */
.mm-node .mm-label {
  flex: 1; min-width: 0; overflow: hidden; line-height: 17px; word-break: break-word;
  /* 按框宽折行，最多 3 行（行数与 JS 里算的高度同源） */
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
}
.mm-node .mm-sub { font-size: 10px; color: #8a8880; margin-top: 1px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 悬停小按钮改为绝对定位：不占文字宽度（否则框宽算不准、文字会溢出），
   平时 opacity:0，鼠标移到节点或选中才出现。 */
.mm-node .mm-mini { position: absolute; right: 5px; top: 50%; transform: translateY(-50%); font-size: 11px; color: #B4B2A9; padding: 0 2px; background: inherit; border-radius: 4px; }
/* 简约版（Randy 参考图）：折叠标记 / 打开详情入口平时隐藏，鼠标移到节点上才出现，
   既保持画面干净，又不丢功能（探针与用例仍按 DOM 断言）。 */
.mm-node .mm-mini { opacity: 0; transition: opacity .12s; }
.mm-node:hover .mm-mini, .mm-node.mm-sel .mm-mini { opacity: 1; }
.mm-node .mm-mini:hover { color: var(--accent); }
.mm-node.mm-root { background: #3B7DE0; border-color: #3B7DE0; color: #fff; font-weight: 600; font-size: 12.5px; border-radius: 7px; }
.mm-node.mm-root .mm-mini { color: rgba(255,255,255,.85); }
.mm-node.mm-candidate { border-style: solid; }
.mm-node.mm-depth1 { background: #EEF4FC; border-color: #DCE7F7; }
.mm-node.mm-leaf { background: #F8FBFF; border-color: #E7EFFA; }
.mm-empty-tip { position: absolute; left: 50%; top: 42%; transform: translate(-50%,-50%); color: #B4B2A9; font-size: 13px; text-align: center; }

/* REQ-002（2026-09-15）：右键菜单 —— XMind 里"右键就地出菜单"，不用绕到工具栏 */
.mm-ctx-menu {
  /* z-index 要压过弹窗层（.modal-overlay=1000）与项目既有浮层（inv-pop=100020），
     否则右键菜单会被画布"吃掉"——探针实测：菜单在 DOM 里存在但点不到。 */
  position: fixed; z-index: 100030; min-width: 196px; padding: 5px;
  background: #fff; border: 1px solid #E5E4DF; border-radius: 9px;
  box-shadow: 0 10px 28px rgba(0,0,0,.14); font-size: 12.5px; color: #3C3B37;
  user-select: none;
}
.mm-ctx-item {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  padding: 6px 9px; border-radius: 6px; cursor: pointer; white-space: nowrap;
}
.mm-ctx-item:hover { background: #F2F6F6; color: var(--accent); }
.mm-ctx-item .mm-ctx-hint { font-size: 10.5px; color: #B4B2A9; }
.mm-ctx-item.mm-ctx-off { color: #C9C7BF; cursor: not-allowed; }
.mm-ctx-item.mm-ctx-off:hover { background: transparent; color: #C9C7BF; }

/* REQ-002（2026-09-15）：节点备注抽屉（右侧） */
.mm-note-panel {
  position: absolute; right: 0; top: 0; bottom: 0; width: 320px; z-index: 8;
  display: flex; flex-direction: column; gap: 8px; padding: 12px 12px 10px;
  background: #fff; border-left: 1px solid #ECEBE6; box-shadow: -6px 0 20px rgba(0,0,0,.06);
}
.mm-note-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12.5px; color: #33322e; }
.mm-note-head b { font-weight: 600; color: #2C2C2A; }
.mm-note-close { cursor: pointer; color: #B4B2A9; padding: 0 2px; }
.mm-note-close:hover { color: var(--accent); }
.mm-note-panel textarea {
  flex: 1; min-height: 120px; resize: none; padding: 9px 10px; font-size: 12.5px; line-height: 1.6;
  border: 1px solid #D8E4F5; border-radius: 8px; outline: none; background: #FBFCFE; color: #2C2C2A;
  font-family: inherit;
}
.mm-note-panel textarea:focus { border-color: var(--accent); background: #fff; }
.mm-note-panel textarea:disabled { background: #F7F6F1; color: #9A9890; }
.mm-note-foot { display: flex; align-items: center; gap: 8px; }
.mm-note-save { background: var(--accent) !important; color: #fff !important; padding: 5px 14px !important; border-radius: 7px !important; }
.mm-note-save:disabled { background: #C9C7BF !important; }
.mm-note-tip { font-size: 10.5px; color: #B4B2A9; }

/* REQ-002 第 4/8 项：撤销重做按钮 + 搜索定位 */
.mm-focus-head .mm-search {
  width: 132px; padding: 4px 9px; font-size: 12px; border: 1px solid #E5E4DF; border-radius: 7px;
  outline: none; background: #fff; color: #2C2C2A;
}
.mm-focus-head .mm-search:focus { border-color: var(--accent); width: 168px; }
.mm-focus-head .mm-search-count { font-size: 11px; color: #B4B2A9; min-width: 26px; }
.mm-node.mm-hit { box-shadow: 0 0 0 3px rgba(186,117,23,.38); border-color: #BA7517; }

/* REQ-002 协同共享（2026-09-15）：最后修改信息 / 申请编辑按钮 / 共享设置弹窗 */
.mm-focus-head .mm-lastedit { font-size: 11px; color: #B4B2A9; }
.mm-focus-head .mm-hbtn.mm-hbtn-accent { background: var(--accent); color: #fff; padding: 4px 10px; }
.mm-focus-head .mm-hbtn.mm-hbtn-accent:hover { background: #0f5c61; color: #fff; }

/* AI 对话修正面板（2026-09-15 修复）：作为画布层内的浮动面板渲染，
   不再受全屏专注模式"隐藏非顶栏/画布直系子元素"规则影响，点 ✨ 真的能开。 */
.mm-ai-panel {
  position: absolute; right: 16px; bottom: 16px; width: 360px; max-height: 56vh; overflow: auto; z-index: 7;
  background: #fff; border: 1px solid #ececeb; border-radius: 10px; padding: 10px 12px;
  box-shadow: 0 6px 20px rgba(0,0,0,.12); text-align: left;
}
.mm-ai-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12.5px; color: #33322e; font-weight: 500; }
.mm-ai-history { margin-top: 8px; display: flex; gap: 8px; flex-wrap: wrap; font-size: 10px; color: #B4B2A9; }
.mm-focus-head .mm-hbtn.mm-hbtn-on { background: #e6f2f2; color: var(--accent); }
.mm-share-list { display: flex; flex-direction: column; gap: 8px; }
.mm-share-opt {
  display: flex; align-items: center; gap: 10px; padding: 11px 14px; cursor: pointer;
  border: 2px solid #e5e5e4; border-radius: 9px; background: #fff; transition: border-color .15s, background .15s;
}
.mm-share-opt:hover { border-color: #9DB8DE; }
.mm-share-opt.active { border-color: var(--accent); background: var(--accent-t08); }
.mm-share-opt b { display: block; font-size: 13px; color: #2C2C2A; }
.mm-share-opt.active b { color: var(--accent); }
.mm-share-icon { font-size: 16px; }
.mm-share-desc { display: block; font-size: 11px; color: #888780; margin-top: 2px; }
/* 指定人员共享（2026-09-15）：选人 + 只读/可编辑 */
.mm-share-block { margin-top: 14px; border-top: 1px solid #f1efe8; padding-top: 12px; }
.mm-share-block-title { font-size: 12px; color: #33322e; font-weight: 500; margin-bottom: 8px; }
.mm-share-rows { display: flex; flex-direction: column; gap: 6px; max-height: 190px; overflow: auto; }
.mm-share-row { display: flex; align-items: center; gap: 10px; padding: 7px 10px; background: #FAFAF7; border: 1px solid #ECEBE6; border-radius: 8px; font-size: 12.5px; }
.mm-share-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #2C2C2A; }
.mm-share-perm { display: inline-flex; align-items: center; gap: 4px; color: #33322e; white-space: nowrap; cursor: pointer; }
.mm-share-del { color: #B4B2A9; cursor: pointer; padding: 0 2px; }
.mm-share-del:hover { color: #A32D2D; }
.mm-share-empty { font-size: 12px; color: #B4B2A9; }
.mm-share-add { display: flex; gap: 8px; margin-top: 9px; }
.mm-share-add select { flex: 1; padding: 6px 8px; font-size: 12.5px; border: 1px solid #d3d1c7; border-radius: 7px; outline: none; background: #fff; font-family: inherit; }

/* ========== 挂牌页「公告牌」（挂牌规则 · 管理员维护）2026-09-18 批次 24 ========== */
.mpc-notice {
  display: flex; align-items: center; gap: 8px;
  padding: 5px 10px; margin: 0 12px;
  background: #EDFDFE; border: 1px solid rgba(var(--accent-rgb),0.22); border-radius: 8px;
  max-height: 46px; overflow: hidden; cursor: pointer; min-width: 0;
}
.mpc-notice:hover { background: #E3F8FA; }
.mpc-notice-icon { flex-shrink: 0; font-size: 13px; }
.mpc-notice-label {
  flex-shrink: 0; font-size: 11px; font-weight: 600; color: var(--accent);
  background: rgba(var(--accent-rgb),0.10); border-radius: 6px; padding: 1px 6px;
}
.mpc-notice-text {
  flex: 1; min-width: 0; font-size: 12px; color: #1F4E52; line-height: 1.5;
  white-space: pre-wrap; overflow: hidden;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.mpc-notice-empty {
  background: #F7F6F3; border-color: #E5E5E4; color: #8A8880; cursor: default;
  font-size: 12px; justify-content: center;
}
.mpc-notice-empty .btn-sm { padding: 2px 8px; }

/* ========== 知识库共享：勾选式选择器（2026-09-18 批次 27） ========== */
.kb-picker { display: flex; flex-direction: column; gap: 8px; }
.kb-picker-search { width: 100%; }
.kb-picker-quick { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.kb-picker-quick-label { font-size: 11.5px; color: #888780; }
.kb-quick-btn {
  font-size: 11.5px; padding: 3px 9px; border-radius: 999px;
  border: 1px solid #d3d1c7; background: #fff; color: #3a3a36; cursor: pointer;
}
.kb-quick-btn:hover { border-color: var(--accent); color: var(--accent); }
.kb-quick-all { border-color: var(--accent-t55); color: var(--accent); background: #EDFDFE; }
.kb-quick-clear { color: #888780; border-style: dashed; }
.kb-picker-list {
  max-height: 240px; overflow-y: auto;
  border: 1px solid #e5e5e4; border-radius: 8px; background: #fff;
}
.kb-picker-item {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 10px; cursor: pointer; font-size: 13px;
  border-bottom: 1px solid #f5f3ef;
}
.kb-picker-item:last-child { border-bottom: none; }
.kb-picker-item:hover { background: #F7FBFC; }
.kb-picker-item input[type="checkbox"] { width: auto; margin: 0; flex-shrink: 0; }
.kb-picker-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-picker-team { font-size: 11px; color: #888780; flex-shrink: 0; }
.kb-picker-empty { padding: 12px; font-size: 12px; color: #B4B2A9; text-align: center; }
.kb-picker-foot { display: flex; gap: 8px; align-items: center; }
.kb-picker-foot select { flex: 0 0 auto; width: auto; min-width: 200px; }
.kb-picker-foot .btn-primary { margin-left: auto; }

/* ========== 勾对 · 商机互助（v20260919hookups，批次 57） ==========
   一个模块的样式都收在这一个块里：页头 / 工具条 / 卡片 / 举手记录 / 表单弹窗。
   配色沿用系统品牌青绿 var(--accent-2)，卡片沿用系统白底＋细边框的观感。 */
.hk-page { padding: 18px 20px 28px; max-width: 1180px; }
.hk-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
.hk-title { font-size: 20px; font-weight: 600; color: #1f2328; letter-spacing: .2px; }
.hk-sub { margin-top: 4px; font-size: 12.5px; color: #8a8a86; }
.hk-head-actions { flex: 0 0 auto; }

.hk-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.hk-tabs { display: flex; gap: 6px; flex-wrap: wrap; }
.hk-tab {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 14px; font-size: 13px; border: 1px solid #e2e0d8;
  background: #fff; color: #5c5c58; border-radius: 999px; cursor: pointer; transition: all .15s;
}
.hk-tab:hover { border-color: var(--accent-2); color: var(--accent-2); }
.hk-tab.active { background: var(--accent-2); border-color: var(--accent-2); color: #fff; font-weight: 500; }
.hk-tab-n {
  display: inline-block; min-width: 18px; padding: 0 5px; border-radius: 9px;
  background: rgba(0,0,0,.06); font-size: 11px; line-height: 16px; text-align: center;
}
.hk-tab.active .hk-tab-n { background: rgba(255,255,255,.24); }
.hk-search {
  width: 260px; padding: 7px 11px; font-size: 13px;
  border: 1px solid #dcd9d0; border-radius: 6px; background: #fff; color: #1f2328;
}
.hk-search:focus { outline: none; border-color: var(--accent-2); box-shadow: 0 0 0 3px rgba(8,144,152,.10); }

.hk-list { display: flex; flex-direction: column; gap: 10px; }
.hk-card {
  border: 1px solid #e6e3dc; border-radius: 8px; background: #fff;
  padding: 12px 14px; cursor: pointer; transition: border-color .15s, box-shadow .15s;
}
.hk-card:hover { border-color: #cfe0e1; box-shadow: 0 1px 6px rgba(8,144,152,.07); }
.hk-card.open { border-color: var(--accent-2); box-shadow: 0 2px 10px rgba(8,144,152,.10); cursor: default; }
/* 「未读」商机：左侧一条暖色竖条 + 标题前的 NEW 标（与顶部角标同一口径：按人未读，点已读即消失） */
.hk-card.new { border-left: 3px solid #E9A23B; }
.hk-new {
  display: inline-block; margin-right: 6px; padding: 1px 7px; border-radius: 4px;
  background: #FDF3E2; color: #B26B0F; font-size: 11px; font-weight: 600; vertical-align: 1px;
}
.hk-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.hk-card-title-wrap { min-width: 0; }
.hk-card-title { font-size: 14.5px; font-weight: 600; color: #1f2328; overflow: hidden; text-overflow: ellipsis; }
.hk-card-meta { margin-top: 3px; font-size: 12.5px; color: #6a6a66; }
.hk-card-badges { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; flex-wrap: wrap; justify-content: flex-end; }
.hk-status { display: inline-block; padding: 1px 8px; border-radius: 4px; font-size: 11.5px; font-weight: 500; }
.hk-status-open { background: #e6f4f5; color: var(--accent-2); }
.hk-status-matched { background: #eaf7ec; color: #2f8f43; }
.hk-status-closed { background: #f0efec; color: #8a8a86; }
.hk-tag { display: inline-block; padding: 1px 8px; border-radius: 4px; font-size: 11.5px; background: #f3f1eb; color: #6a6a66; }
.hk-tag-src { background: #eef4fb; color: #35658f; }

.hk-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 8px; }
.hk-card-author { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: #6a6a66; }
.hk-dot { color: #c9c6bd; }
.hk-card-stat { font-size: 12.5px; color: #8a8a86; }
.hk-mine-flag { color: var(--accent-2); }
.hk-avatar {
  display: inline-block; flex: 0 0 auto; border-radius: 50%;
  background: linear-gradient(135deg, var(--accent-2), #0aa6ae); color: #fff;
  text-align: center; font-weight: 600;
}

.hk-card-detail { margin-top: 12px; border-top: 1px dashed #e6e3dc; padding-top: 12px; cursor: default; }
.hk-block { margin-bottom: 12px; }
.hk-block-title { font-size: 12px; color: #8a8a86; margin-bottom: 4px; }
.hk-block-body { font-size: 13px; color: #1f2328; white-space: pre-wrap; line-height: 1.6; }
.hk-empty-inline { font-size: 12.5px; color: #b4b2a9; }
.hk-card-ops { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 10px; }

.hk-raise {
  display: flex; gap: 10px; padding: 8px 10px; border-radius: 6px;
  background: #faf9f5; margin-bottom: 6px;
}
.hk-raise.picked { background: #eaf7ec; }
.hk-raise-body { min-width: 0; flex: 1; }
.hk-raise-head { display: flex; align-items: center; gap: 6px; font-size: 12.5px; }
.hk-raise-name { font-weight: 500; color: #1f2328; }
.hk-raise-mine { font-size: 11px; color: var(--accent-2); background: #e6f4f5; border-radius: 3px; padding: 0 5px; }
.hk-raise-picked { font-size: 11px; color: #2f8f43; background: #dff2e3; border-radius: 3px; padding: 0 5px; }
.hk-raise-time { color: #9a9a96; font-size: 12px; }
.hk-raise-note { margin-top: 3px; font-size: 13px; color: #1f2328; white-space: pre-wrap; }
.hk-raise-ops { margin-top: 6px; display: flex; gap: 8px; flex-wrap: wrap; }

.hk-mini {
  padding: 3px 10px; font-size: 12px; border: 1px solid #dcd9d0; background: #fff;
  color: #5c5c58; border-radius: 5px; cursor: pointer;
}
.hk-mini:hover { border-color: var(--accent-2); color: var(--accent-2); }
.hk-mini.active { border-color: #2f8f43; color: #2f8f43; background: #eaf7ec; }
.hk-mini.danger:hover { border-color: #E7857D; color: #c0392b; }
.hk-read-btn { border-color: var(--accent-2); color: var(--accent-2); background: #f2fbfb; }
.hk-btn {
  padding: 6px 14px; font-size: 13px; border-radius: 6px; border: 1px solid var(--accent-2);
  background: var(--accent-2); color: #fff; cursor: pointer;
}
.hk-btn:hover { background: #0aa6ae; }
.hk-btn.ghost { background: #fff; color: var(--accent-2); }
.hk-btn.ghost:hover { background: #f2fbfc; }

.hk-empty {
  padding: 40px 20px; text-align: center; font-size: 13px; color: #b4b2a9;
  border: 1px dashed #e6e3dc; border-radius: 8px; background: #fff;
}
.hk-foot { margin-top: 10px; font-size: 12px; color: #9a9a96; }

.hk-modal .hk-modal-title { font-size: 16px; font-weight: 600; color: #1f2328; }
.hk-modal .hk-modal-sub { margin: 4px 0 12px; font-size: 12.5px; color: #8a8a86; }
.hk-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.hk-grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
.hk-field { margin-bottom: 10px; }
.hk-field label { display: block; font-size: 12.5px; color: #6a6a66; margin-bottom: 4px; }
.hk-req { color: #c0392b; }
.hk-modal .hk-input, .hk-modal .hk-select, .hk-modal .hk-textarea {
  width: 100%; padding: 7px 10px; font-size: 13px; color: #1f2328;
  border: 1px solid #dcd9d0; border-radius: 6px; background: #fff;
}
.hk-modal .hk-textarea { resize: vertical; line-height: 1.6; }
/* 发布商机就一个空白框 → 给它大一点（批次 58） */
.hk-modal .hk-textarea-lg { min-height: 190px; font-size: 13.5px; line-height: 1.7; }
.hk-modal .hk-input:focus, .hk-modal .hk-select:focus, .hk-modal .hk-textarea:focus {
  outline: none; border-color: var(--accent-2); box-shadow: 0 0 0 3px rgba(8,144,152,.10);
}
.hk-modal-foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 6px; }

/* 批次 170：知识沉淀里图片的「AI 读图」状态行（已读 / 读图中 / 没读出来 → 给重识别按钮） */
.kb-doc-ai { font-size: 10.5px; color: #1D9E75; margin-top: 5px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.kb-doc-ai-pending { color: #BA7517; }
.kb-doc-ai-miss { color: #BA7517; }
.client-col-sort { display: inline-flex; align-items: center; gap: 3px; cursor: pointer; user-select: none; }
.client-col-sort:hover { color: var(--accent); }
.client-col-sort.on { color: var(--accent); font-weight: 600; }
.client-col-arrow { font-size: 10px; opacity: .75; }
/* 批次 173：收费「计算逻辑与公式」面板（入职弹窗 + 编辑发票弹窗共用同一套） */
.fee-formula {
  background: #F7FBFA; border: 1px solid #D8EAE7; border-radius: 8px;
  padding: 8px 10px; margin-top: 4px; font-size: 11.5px; color: #33322e; line-height: 1.9;
}
.fee-formula-title { font-weight: 600; color: var(--accent); margin-bottom: 2px; }
.fee-formula-line { white-space: normal; }
.fee-formula-line b { color: #0F5C61; }
.fee-formula-calc { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.fee-formula-rate {
  width: 62px; padding: 2px 6px; border: 1px solid #d3d1c7; border-radius: 6px;
  font-size: 11.5px; text-align: center;
}
.fee-formula-src { color: #888780; }
/* 批次 176：左侧知识库列表的「置顶」小图钉（平时半透明可见、hover 更亮、已置顶常亮） */
.kb-pin { margin-left: 4px; font-size: 10px; opacity: .32; filter: grayscale(1); cursor: pointer; transition: opacity .15s, filter .15s; }
.sidebar-item:hover .kb-pin { opacity: .85; filter: none; }
.kb-pin.on { opacity: 1; filter: none; }
.kb-pin:hover { opacity: 1; filter: none; }
